diff options
author | B. Watson <yalhcru@gmail.com> | 2021-05-19 16:19:35 -0400 |
---|---|---|
committer | B. Watson <yalhcru@gmail.com> | 2021-05-19 16:19:35 -0400 |
commit | c89875818d478c4a579a2f5af4e64fa35c7f78b6 (patch) | |
tree | e564b00f43db5a3d6da5877d0098df82df880598 | |
parent | e2ea1b0c217a9714b6b5d231b202b5fd1eefa2c9 (diff) | |
download | taipan-c89875818d478c4a579a2f5af4e64fa35c7f78b6.tar.gz |
"Play again?" default to Y; save 5 bytes, now 8839
-rw-r--r-- | console.s | 43 | ||||
-rw-r--r-- | taipan.c | 12 |
2 files changed, 51 insertions, 4 deletions
@@ -350,8 +350,51 @@ _set_orders: rts @returnx: stx _orders +done1: rts +; extern void __fastcall__ print_score_msg(long *scoreptr) + +; asm replacement for this C code: + +; /* score is a *signed* long. */ +; if(score < 0) +; print_msg(M_stay_on_shore); +; 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: +;; sta FR0 +;; stx FR0+1 +;; ldy #3 +;; lda (FR0),y ; look at MSB of score +;; bpl @notneg ; is it negative? +;; lda #<_M_stay_on_shore ; if so, print this message +;; ldx #>_M_stay_on_shore +;;@pm: +;; jmp _print_msg +;;@notneg: ; else... +;; bne done1 ; if MSB non-zero, score is at least 2^24+1, no message +;; dey +;; lda (FR0),y +;; dey +;; ora (FR0),y +;; bne done1 ; if either of these is non-zero, score is >= 256, no message +;; dey +;; lda (FR0),y ; here, the top 3 bytes are zero, so check the LSB. +;; cmp #100 ; 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) + + .rodata orders_tbl: .byte "frt" @@ -1958,11 +1958,13 @@ void retire(void) { final_stats(); } +// This didn't work out (revisit someday?) +// extern void __fastcall__ print_score_msg(long *scoreptr); + void final_stats(void) { int years = year - 1860, - time = get_time(), - choice; + time = get_time(); #ifdef BIGNUM long score; @@ -2054,6 +2056,9 @@ void final_stats(void) // 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); + // cputs("Your Rating:\n"); gotox0y(11); print_msg(M_your_rating); @@ -2121,9 +2126,8 @@ void final_stats(void) gotox0y22(); // cputs("Play again? "); print_msg(M_play_again); - choice = yngetc(0); - if(choice == 'y') { + if(yngetc('y') == 'y') { init_game(); return; } |