diff options
-rw-r--r-- | console.s | 34 | ||||
-rw-r--r-- | taipan.c | 13 |
2 files changed, 34 insertions, 13 deletions
@@ -353,7 +353,7 @@ _set_orders: done1: rts -; extern void __fastcall__ print_score_msg(long *scoreptr) +; extern void __fastcall__ print_score_msg(long score) ; asm replacement for this C code: @@ -363,13 +363,31 @@ done1: ; else if(score < 100) ; print_msg(M_land_based_job); -; This turns out to actually waste 3 bytes: my code is the same -; length as what cc65 generates, plus 3 bytes for the jsr to this -; function. Ugh. - -;; .import _M_stay_on_shore, _M_land_based_job -;; .export _print_score_msg -;;_print_score_msg: + .import _M_stay_on_shore, _M_land_based_job + .export _print_score_msg +_print_score_msg: + sta FR0 + lda sreg+1 ; is MSB sign bit set? + bpl @notneg + lda #<_M_stay_on_shore ; if so, print this message + ldx #>_M_stay_on_shore +@pm: + jmp _print_msg +@notneg: ; else MSB is positive. Is it non-zero? + bne done1 ; if non-zero, score is at least 2^24+1, no message + txa ; check bits 8-15... + ora sreg ; ...and 16-23 + bne done1 ; if either middle byte is non-zero, score>=256, no message + lda FR0 ; here, the top 3 bytes are zero, so check the LSB. + cmp #99 ; is it < 100? + bcs done1 ; if not, no message. or, + lda #<_M_land_based_job ; if so, print this message + ldx #>_M_land_based_job + bne @pm ; branch always (since message is not in zero page) + +;; +;; +;; ;; sta FR0 ;; stx FR0+1 ;; ldy #3 @@ -1961,8 +1961,7 @@ void retire(void) { final_stats(); } -// This didn't work out (revisit someday?) -// extern void __fastcall__ print_score_msg(long *scoreptr); +extern void __fastcall__ print_score_msg(long score); long score_lim[] = { 50000L, @@ -1990,7 +1989,7 @@ const char const *score_desc[] = { void final_stats(void) { char i, unrated = 1; - int years = year - 1860; + int years = year - 1860; #ifdef BIGNUM long score; @@ -2074,6 +2073,7 @@ void final_stats(void) { crlf(); rvs_off(); + /* 8969 bytes with this stuff: if(score < 0) // cputs("The crew has requested that you stay on\n" // "shore for their safety!!\n\n"); @@ -2081,9 +2081,12 @@ void final_stats(void) { else if(score < 100) // cputs("Have you considered a land based job?\n\n\n"); print_msg(M_land_based_job); + */ - // Tried to optimize the above stanza, failed to beat the compiler: - // print_score_msg(&score); + /* Optimized the above stanza, only saved 5 bytes (8874). + Compiled code is 45 bytes. Replacing with a function call costs + 3 bytes, so the asm function has to be <42 bytes (it is). */ + print_score_msg(score); // cputs("Your Rating:\n"); gotox0y(11); |