diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | Makefile | 6 | ||||
| -rw-r--r-- | procsizes.pl | 24 | ||||
| -rw-r--r-- | taipan.c | 199 | ||||
| -rw-r--r-- | timed_getch.s | 27 | 
5 files changed, 137 insertions, 120 deletions
| @@ -1,3 +1,4 @@ +procsizes  msg.inc  messages.c  msg.out @@ -253,7 +253,7 @@ taimain.xex: $(TAIMAIN_C_SRC) $(TAIMAIN_ASM_SRC) $(TAIMAIN_HDRS) $(BIGNUM_SRC) $  # taipan.c. This rule not used as part of the main build, it's only for  # debugging.  taipan.lst: taipan.c -	$(CC) -m taipan.map $(CFLAGS) -c -o /dev/null -l taipan.lst -T taipan.c +	$(CC) -m taipan.map $(CFLAGS) $(BIGNUM_CFLAGS) -c -o /dev/null -l taipan.lst -T taipan.c  # Another such rule for sounds.c:  sounds.lst: sounds.c sounds.h @@ -400,6 +400,10 @@ push:  size: clean all  	$(PERL) size.pl $(TAIMAIN_ADDR) $(STACK_SIZE) +procsizes: clean all taipan.lst +	$(PERL) procsizes.pl > procsizes +	cat procsizes +  # Cruft. Was used for testing the enemy ship animation.  lorchatest: lorchatest.c draw_lorcha.s taifont.xex  	$(CC) -t atari -O -T -o lorchatest1.xex lorchatest.c draw_lorcha.s diff --git a/procsizes.pl b/procsizes.pl new file mode 100644 index 0000000..287cf46 --- /dev/null +++ b/procsizes.pl @@ -0,0 +1,24 @@ +#!/usr/bin/perl -w + +open IN, "<taipan.lst" or die $!; + +while(<IN>) { +	(/^([0-9A-F]{6})/) && (eval "\$addr = 0x$1"); +	if(/\.proc\s+_(\w+)/) { +		$proc = $1; +		$start{$proc} = $addr; +	} elsif(/\.endproc/) { +		$end{$proc} = $addr - 1; +		$proc = ""; +	} +} + +for(sort keys %start) { +	$len{$_} = $end{$_} - $start{$_} + 1; +} + +for(sort { $len{$a} <=> $len{$b} } keys %len) { +	printf "% 32s % d\n", $_, $len{$_}; +	$total += $len{$_}; +} +printf "% 32s % d\n", "Total:", $total; @@ -221,6 +221,10 @@ void backspace() {  /* get an inventory item, return its index into items[].  	if allow_all is true, allows '*', which is used for  	'throw cargo' in sea_battle. */ +extern unsigned char get_item(unsigned char allow_all); + +/* +	rewritten in asm, in timed_getch.s, here's the original:  unsigned char get_item(unsigned char allow_all) {  	for(;;) {  		switch(lcgetc()) { @@ -233,6 +237,26 @@ unsigned char get_item(unsigned char allow_all) {  		}  	}  } +*/ + +/* sound-and-getch functions cost 6 bytes each, but save 3 bytes +	every time they replace 2 function calls. Total saving works +	out to 56 bytes, so worth doing. + */ +void good_joss_timed_getch() { +	good_joss_sound(); +	timed_getch(); +} + +void bad_joss_timed_getch() { +	bad_joss_sound(); +	timed_getch(); +} + +void under_attack_timed_getch() { +	under_attack_sound(); +	timed_getch(); +}  #ifdef CART_TARGET  # pragma code-name (pop) @@ -692,8 +716,7 @@ void overload(void) {     // cputs("Your ship is overloaded");  	print_msg(M_overloaded);  	cprint_taipan_bangbang(); -	good_joss_sound(); -   timed_getch(); +	good_joss_timed_getch();     return;  } @@ -1472,8 +1495,7 @@ char sea_battle(char id, int num_ships) {  		// cputs("We got 'em all");  		print_msg(M_we_got_em_all);  		cprint_taipan_bang(); -		bad_joss_sound(); -		timed_getch(); +		bad_joss_timed_getch();  		return 1;  	} else { @@ -2138,8 +2160,7 @@ void you_have_only(void) {  #endif -void transfer(void) -{ +void transfer(void) {     int i, in_use;     unsigned long amount = 0; @@ -2150,18 +2171,13 @@ void transfer(void)  		print_msg(M_you_have_no_cargo);  		cprint_taipan_period();  		crlf(); -		good_joss_sound(); - -      timed_getch(); +		good_joss_timed_getch();        return;     } -   for (i = 0; i < 4; i++) -   { -      if (hold_[i] > 0) -      { -         for (;;) -         { +   for(i = 0; i < 4; i++) { +      if(hold_[i] > 0) { +         for (;;) {  				compradores_report();  				how_much();  				// cputs(item[i]); @@ -2171,35 +2187,30 @@ void transfer(void)  				cprint_taipan_prompt();              amount = get_num(); -            if (amount == UINT32_MAX) -            { +            if(amount == UINT32_MAX)                 amount = hold_[i]; -            } -            if (amount <= hold_[i]) -            { + +            if(amount <= hold_[i]) {                 // in_use = hkw_[0] + hkw_[1] + hkw_[2] + hkw_[3];  					in_use = warehouse_in_use(); -               if ((in_use + amount) <= 10000) -               { +               if((in_use + amount) <= 10000) {                    hold_[i] -= amount;                    hkw_[i] += amount;                    hold += amount;                    break; -               } else if (in_use == 10000) { +               } else if(in_use == 10000) {                    gotoxy(0, 21);                    // cputs("Your warehouse is full");  						print_msg(M_whouse_full);  						cprint_taipan_bang(); -						good_joss_sound(); +						good_joss_timed_getch();                 } else {                    gotoxy(0, 21);                    // cputs("Your warehouse will only hold an\nadditional ");  						print_msg(M_whouse_only_hold);  						cprintuint(10000 - in_use);  						cprint_taipan_bang(); -						good_joss_sound(); - -                  timed_getch(); +						good_joss_timed_getch();                 }              } else {  					clear_msg_window(); @@ -2209,18 +2220,14 @@ void transfer(void)  					cprintulong(hold_[i]);                 // cputs(", Taipan.\n");  					cprint_taipan_period(); -					good_joss_sound(); - -               timed_getch(); +					good_joss_timed_getch();              }           }           port_stats();        } -      if (hkw_[i] > 0) -      { -         for (;;) -         { +      if(hkw_[i] > 0) { +         for(;;) {  				compradores_report();  				how_much();  				// cputs(item[i]); @@ -2230,12 +2237,10 @@ void transfer(void)  				cprint_taipan_prompt();              amount = get_num(); -            if (amount == UINT32_MAX) -            { +            if(amount == UINT32_MAX)                 amount = hkw_[i]; -            } -            if (amount <= hkw_[i]) -            { + +            if(amount <= hkw_[i]) {                 hold_[i] += amount;                 hkw_[i] -= amount;                 hold -= amount; @@ -2249,8 +2254,7 @@ void transfer(void)  					cprint_taipan_period();  					// cputs("\n");  					crlf(); - -               timed_getch(); +               good_joss_timed_getch();              }           }           port_stats(); @@ -2290,21 +2294,18 @@ void quit(void)  			"7) Batavia ? ");  			*/ -   for (;;) -   { +   for (;;) {        gotoxy(12, 21);        clrtobot();        choice = numgetc() - '0'; -      if (choice == port) -      { +      if(choice == port) {           // cputs("\n\nYou're already here");  			print_msg(M_already_here);  			cprint_taipan_period(); -			good_joss_sound(); -         timed_getch(); -      } else if ((choice >= 1) && (choice <= 7)) { +			good_joss_timed_getch(); +      } else if((choice >= 1) && (choice <= 7)) {           port = choice;           break;        } @@ -2333,16 +2334,13 @@ void quit(void)  		print_msg(M_approaching);  		cprint_taipan_bang();  		crlf(); -		under_attack_sound(); - -      timed_getch(); +		under_attack_timed_getch();        result = sea_battle(GENERIC, num_ships);  		gotoxy(0,23); /* to avoid disappearing U in "In use" */     } -   if (result == 2) -   { +   if(result == 2) {        port_stats();  		at_sea(); @@ -2354,8 +2352,7 @@ void quit(void)        timed_getch();     } -   if (((result == 0) && (randi()%(4 + (8 * li))) == 0) || (result == 2)) -   { +   if(((result == 0) && (randi()%(4 + (8 * li))) == 0) || (result == 2)) {  		clear_msg_window();  		// cprint_li_yuen();        // cputs("'s pirates"); @@ -2363,17 +2360,12 @@ void quit(void)  		cprint_taipan_bangbang();  		crlf();  		crlf(); -		bad_joss_sound(); +		bad_joss_timed_getch(); -      timed_getch(); - -      if (li > 0) -      { +      if(li > 0) {           // cputs("Good joss!! They let us be!!\n");  			print_msg(M_they_let_us_be); -			bad_joss_sound(); - -         timed_getch(); +			bad_joss_timed_getch();           // return; // original code, results in prices not changing.  			result = 0; @@ -2386,8 +2378,7 @@ void quit(void)           // cputs(" ships of Li Yuen's pirate\nfleet");  			print_msg(M_ships_of_fleet);  			cprint_taipan_bangbang(); -			under_attack_sound(); -         timed_getch(); +			under_attack_timed_getch();  			/* WTF, the original code reads:  				sea_battle(LI_YUEN, num_ships); @@ -2399,39 +2390,34 @@ void quit(void)        }     } -   if (result > 0) -   { +   if(result > 0) {        port_stats();  		at_sea();  		captains_report(); -      if (result == 1) -      { +      if(result == 1) {           // cputs("We captured some booty.\n"  					// "It's worth ");  			print_msg(M_captured_some_booty);  			cprintfancy(booty);  			cprint_bang();           cash += booty; -			good_joss_sound(); +			good_joss_timed_getch();        } else if (result == 3) {           // cputs("We made it!");  			print_msg(M_we_made_it); -			good_joss_sound(); +			good_joss_timed_getch();        } else {           // cputs("The buggers got us");  			print_msg(M_buggers_got_us);  			cprint_taipan_bangbang();           // cputs("!\nIt's all over, now!!!");  			print_msg(M_all_over_now); - -         timed_getch(); +			under_attack_timed_getch();           final_stats();           return;        } - -      timed_getch();     }     if(one_chance_in(10)) { @@ -2441,8 +2427,7 @@ void quit(void)  		cprint_taipan_bangbang();  		crlf();  		crlf(); -		bad_joss_sound(); -      timed_getch(); +		bad_joss_timed_getch();        if(one_chance_in(30)) {           // cputs("   I think we're going down!!\n\n"); @@ -2468,8 +2453,7 @@ void quit(void)  				print_msg(M_were_going_down);  				cprint_taipan_bangbang();  				crlf(); -				under_attack_sound(); -            timed_getch(); +				under_attack_timed_getch();              final_stats();           } @@ -2477,8 +2461,7 @@ void quit(void)        // cputs("    We made it!!\n\n");  		print_msg(M_storm_we_made_it); -		bad_joss_sound(); -      timed_getch(); +		bad_joss_timed_getch();        if(one_chance_in(3)) {           int orig = port; @@ -2662,9 +2645,7 @@ void you_only_have(unsigned char in_bank) {  	// cputs(in_bank ? "the bank" : "cash");  	print_msg(in_bank ? M_the_bank : M_cash);  	cputs(".\n"); -	good_joss_sound(); - -	timed_getch(); +	good_joss_timed_getch();  }  #else  void you_only_have(unsigned char in_bank) { @@ -2678,15 +2659,12 @@ void you_only_have(unsigned char in_bank) {  	cputs("\nin ");  	cputs(in_bank ? "the bank" : "cash");  	cputs(".\n"); -	good_joss_sound(); - -	timed_getch(); +	good_joss_timed_getch();  }  #endif -void elder_brother_wu(void) -{ -   int  choice = 0; +void elder_brother_wu(void) { +   int choice = 0;     unsigned long wu = 0; @@ -2740,9 +2718,7 @@ void elder_brother_wu(void)  					compradores_report();  					// cputs("Very well, Taipan, the game is over!\n");  					print_msg(M_game_is_over); -					under_attack_sound(); - -					timed_getch(); +					under_attack_timed_getch();  					final_stats();  				} else { @@ -2753,9 +2729,7 @@ void elder_brother_wu(void)  					compradores_report();  					// cputs("Very well, Taipan. Good joss!!\n");  					print_msg(M_very_well_good_joss); -					bad_joss_sound(); - -					timed_getch(); +					bad_joss_timed_getch();  					return;  				} @@ -2819,8 +2793,7 @@ void elder_brother_wu(void)  				// cputs("\n\nHe won't loan you so much");  				print_msg(M_wont_loan);  				cprint_taipan_bang(); -				good_joss_sound(); -				timed_getch(); +				good_joss_timed_getch();  			}  		}  		port_stats(); @@ -2833,14 +2806,14 @@ void elder_brother_wu(void)     }     if((debt > 20000) && (cash > 0) && (one_chance_in(5))) { -      int num = randi()%3 + 1; +      unsigned char num = randi()%3 + 1;        cash = 0;        port_stats();  		compradores_report();  		cprint_bad_joss(); -		cprintuint(num); +		cprintuchar(num);  		/*  		cputs(" of your bodyguards have been killed\n"  				"by cutthroats and you have been robbed\n" @@ -2849,9 +2822,7 @@ void elder_brother_wu(void)  		print_msg(M_bodyguards_killed);  		cprint_taipan_bangbang();  		crlf(); -		under_attack_sound(); - -      timed_getch(); +		under_attack_timed_getch();     }     return; @@ -2886,9 +2857,7 @@ void good_prices(void) {  	cprintulong(price[i]);  	// cputs("!!\n");  	print_msg(M_bang_bang_nl); -	good_joss_sound(); - -   timed_getch(); +	good_joss_timed_getch();  }  int port_choices(void) { @@ -3228,8 +3197,7 @@ void too_much_cash(void) {  	cprint_taipan_bang();  	// cputs("\nYour ship would sink under the weight\nof your riches.\n");  	print_msg(M_ship_would_sink); -	bad_joss_sound(); -	timed_getch(); +	bad_joss_timed_getch();  }  #ifdef CART_TARGET  # pragma code-name (pop) @@ -3407,8 +3375,7 @@ int main(void) {  			cprint_taipan_comma();  			// cputs("you have been assassinated!");  			print_msg(M_assassinated_1); -			under_attack_sound(); -			timed_getch(); +			under_attack_timed_getch();  			compradores_report();  			// cputs("As the masked figure plunges the blade\n"  					// "into your heart, he says:\n"); @@ -3545,8 +3512,7 @@ int main(void) {  					"to see you in Hong Kong, posthaste!\n");  					*/  			print_msg(M_has_sent_lieutenant); -			bad_joss_sound(); -         timed_getch(); +			bad_joss_timed_getch();        }        if(one_chance_in(9)) @@ -3569,14 +3535,11 @@ int main(void) {  			print_msg(M_in_cash);  			cprint_taipan_bangbang();  			crlf(); -			under_attack_sound(); - -         timed_getch(); +			under_attack_timed_getch();        } -      for (;;) -      { -         while (choice != 'q') { +      for(;;) { +         while(choice != 'q') {              switch (choice = port_choices()) {                 case 'b':                    buy(); diff --git a/timed_getch.s b/timed_getch.s index 40a2722..eaf7ab3 100644 --- a/timed_getch.s +++ b/timed_getch.s @@ -1,6 +1,6 @@   .export _timed_getch, _set_jiffy_timer, _agetc, _numgetc - .export  _yngetc, _lcgetc, _jsleep + .export  _yngetc, _lcgetc, _jsleep, _get_item   .import _cgetc, _cblank, putchar, _rand   .include "atari.inc" @@ -166,3 +166,28 @@ _yngetc:   beq _yngetc ; no default, get another keypress   rts         ; else return the default +; extern unsigned char get_item(unsigned char allow_all); +_get_item: + sta FR0 ; stash arg +@getkey: + jsr _lcgetc ; switch(lcgetc()) { + ldx #0 + cmp #'o' + beq @gi_done ; case 'o': return 0; + inx + cmp #'s' + beq @gi_done ; case 's': return 1; + inx + cmp #'a' + beq @gi_done ; case 'a': return 2; + inx + cmp #'g' + beq @gi_done ; case 'g': return 3; + ldy FR0 + beq @getkey ; if allow_all is false, get another key + inx + cmp #'*'    ; case '*': return 4; + bne @getkey ; if none of the above, get another key +@gi_done: + txa + rts | 
