From 6ed92fecc6eebcde1f8e855f76fa6a0d6afa749c Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Wed, 20 Jan 2016 06:02:46 -0500 Subject: fix and simplify cprintfancy, allow Delete key and K/M for 1000/1M when entering numbers --- bigfloat.s | 18 ++++--- rand.s | 44 ++++++++++++++-- taipan.c | 164 +++++++++++++++++++++++++++++++++++++++------------------- timed_getch.s | 10 +++- 4 files changed, 171 insertions(+), 65 deletions(-) diff --git a/bigfloat.s b/bigfloat.s index 1ee2dc9..529de1a 100644 --- a/bigfloat.s +++ b/bigfloat.s @@ -228,11 +228,15 @@ _ulong_to_big: ; high value needs to be multiplied by 65536 - lda #BIG_64K - sta FLPTR+1 - jsr FLD1P + ldx #BIG_64K + jsr FLD1R + + ;lda #BIG_64K + ;sta FLPTR+1 + ;jsr FLD1P ; old version: ; lda #= 100000000L) { /* 100 million and up: |1000 Million| |100 Million | */ - if(center) revers(1); - cputs(ultoa(num / 1000000L, fancy_buf, 10)); + cprintulong(num / 1000000L); } else if (num >= 10000000L) { /* 10 million to 99 million: | 10 Million | |10.1 Million|*/ tmp = (num % 1000000L) / 100000L; - if(center && !tmp) cputc(' '); - if(center) revers(1); - cputs(ultoa(num / 1000000L, fancy_buf, 10)); + cprintulong(num / 1000000L); if(tmp) { cputc('.'); - cputs(ultoa(tmp, fancy_buf, 10)); + cprintulong(tmp); } } else if (num >= 1000000L) { /* 1 million to 9 million: @@ -563,12 +601,11 @@ void cprintfancy_ctr(unsigned long num, unsigned char center) { |1.10 Million| // always has 0, never 1.1 |1.23 Million| */ tmp = (num % 1000000L) / 10000L; - if(center && !tmp) cputc(' '); - if(center) revers(1); - cputs(ultoa(num / 1000000L, fancy_buf, 10)); + cprintulong(num / 1000000L); if(tmp) { cputc('.'); - cputs(ultoa(tmp, fancy_buf, 10)); + if(tmp < 10L) cputc('0'); + cprintulong(tmp); } } else { /* 0 to 999999: @@ -578,26 +615,14 @@ void cprintfancy_ctr(unsigned long num, unsigned char center) { | 999 | | 99 | | 9 | */ - mil = 0; - if(center) { - cputs(" "); - /* - cputc(' '); - cputc(' '); - cputc(' '); - */ - tmp = 0; - for(tmp = 100L; tmp < 1000000L; tmp *= 100L) - if(num < tmp) cputc(' '); - } - if(center) revers(1); - cputs(ultoa(num, fancy_buf, 10)); + cprintulong(num); + return; } - if(mil) cputs(" Million"); - revers(0); + cputs(" Million"); } +#endif /* void fancy_numbers(unsigned long num, char *fancy) { @@ -1242,7 +1267,6 @@ int sea_battle(int id, int num_ships) { /* TODO: rewrite in asm. Maybe. */ long get_num(void) { - static char number[20]; unsigned char count = 0; char input; @@ -1250,21 +1274,35 @@ long get_num(void) { cblank(1); while((input = numgetc()) != '\n') { + if(count >= 10) continue; if(input == BKSP) { if(!count) continue; backspace(); - number[count] = '\0'; + num_buf[count] = '\0'; count--; } else if(input == 'a') { if(!count) return -1; + } else if(input == 'k' || input == 'm') { + char i; + for(i = 0; i < (input == 'k' ? 3 : 6); i++) { + cputc('0'); + num_buf[count++] = '0'; + if(count >= 10) break; + } + } else if(input == DEL) { + while(count) { + backspace(); + count--; + } + POKEW(1024, count); } else { cputc(input); - number[count++] = input; + num_buf[count++] = input; } } cursor(0); - number[count] = '\0'; - return strtol(number, (char **)NULL, 10); + num_buf[count] = '\0'; + return strtol(num_buf, (char **)NULL, 10); } /* TODO: rewrite in asm */ @@ -1302,8 +1340,8 @@ void cash_or_guns(void) } else { #ifdef TIMEWARP year = 1869; - // cash = 1000000000L; - cash = 4294000000L; + cash = 1000000000L; + // cash = 4294000000L; // cash = 3500000L; #ifdef BIGNUM big_copy(bank, big1M); @@ -1489,7 +1527,7 @@ void port_stats(void) // gotox(34 - strlen(fancy_num) / 2); clrtoeol(); // revers(1); - cprintfancy_ctr(debt, 1); + cprintfancy_centered(debt); // cputs(fancy_num); // revers(0); @@ -2210,6 +2248,21 @@ void li_yuen_extortion(void) { // amount = ((cash / i) * ((float) randi() / RAND_MAX)) + j; amount = randclamp((cash >> (i - 1))) + j; + + /* + clear_msg_window(); + cputs("DEBUG li_yuen_extortion()\r\n"); + cputs("amount time i j\r\n"); + cprintulong(amount); + cputc(' '); + cprintulong(time); + cputc(' '); + cprintulong(i); + cputc(' '); + cprintulong(j); + agetc(); + */ + if(!amount) return; /* asking for 0 is dumb */ compradores_report(); @@ -2961,6 +3014,13 @@ int main(void) { port_stats(); + /* + clear_msg_window(); + cputs("li "); + cprintulong(li); + agetc(); + */ + if(wu_assassin) { wu_assassin = 0; compradores_report(); diff --git a/timed_getch.s b/timed_getch.s index f52f50c..ba3b0a9 100644 --- a/timed_getch.s +++ b/timed_getch.s @@ -53,6 +53,8 @@ _agetc: ; special cases cmp #$9b ; enter key, return as-is beq ok + cmp #$9c ; delete key, return as-is + beq ok cmp #$7e ; backspace beq ok @@ -92,10 +94,16 @@ _numgetc: jsr _agetc cmp #$9b beq ok - cmp #$7e + cmp #$7e ; backspace beq ok cmp #$61 ; allow 'a' for "all" beq ok + cmp #$6b ; allow 'k' for 1000 + beq ok + cmp #$6d ; allow 'm' for 1 million + beq ok + cmp #$9c ; shift-del + beq ok cmp #'0' bcc _numgetc cmp #'9'+1 -- cgit v1.2.3