diff options
| -rw-r--r-- | checkmem.s | 76 | ||||
| -rw-r--r-- | console.s | 64 | ||||
| -rw-r--r-- | messages.pl | 4 | ||||
| -rw-r--r-- | taipan.c | 122 | 
4 files changed, 154 insertions, 112 deletions
| @@ -1,18 +1,12 @@  ; Memcheck needs to do this: -;1. If RAMTOP is >=$C0, go to step 6. -;2. Attempt to disable BASIC. -;3. Write some data to $A000, read it back (do twice with 2 different values) -;4. If we couldn't read back what we wrote, that means there really is a -;   cartridge plugged in. Go to step 8. -;5. Set RAMTOP to $C0. -;6. Do a GRAPHICS 0. -;7. Exit via RTS, so the rest of the game will load. -;8. Do a GRAPHICS 0. -;9. Print a "remove cartridge" message -;10. Wait for a keypress -;11. Exit to DOS (without loading the rest of the file) +;1. Do a GRAPHICS 0 +;2. If RAMTOP >=$A0, go to step 6 +;3. Print "need 40K message" +;4. Wait for a keypress +;5. Exit to DOS (without loading the rest of the file) +;6. Exit via RTS, so the rest of the game will load.  ;At no point do we look at RAMSIZ, since it can't be trusted under SDX. @@ -22,6 +16,7 @@  ; cl65 -o checkmem.xex -t none checkmem.s   .include "atari.inc" + .macpack atari  start = $0600 ; use page 6 for now @@ -32,55 +27,26 @@ start = $0600 ; use page 6 for now   .org start -; message is "Need 48K, remove cartridge" in screen codes.  msg: - .byte $2e, $65, $65, $64, $00, $14, $18, $2b - .byte $0c, $00, $72, $65, $6d, $6f, $76, $65 - .byte $00, $63, $61, $72, $74, $72, $69, $64 - .byte $67, $65 + scrcode "Need at least 40K"  msglen = * - msg - 1  S: .byte "S:",0  init: -;1. If RAMTOP is >=$C0, go to step 6. - lda RAMTOP - cmp #$c0 - bcs ramtop_ok - -;2. Attempt to disable BASIC. -; set bit 1 of PORTB. No effect on 400/800/1200XL. Don't -; touch any other bits in PORTB! - lda PORTB - ora #$02 - sta PORTB - -;3. Write some data to $A000, read it back (do twice with 2 different values) -;4. If we couldn't read back what we wrote, that means there really is a -;   cartridge plugged in. Go to step 8. - lda #$AA - sta $A000 - cmp $A000 - bne rom_present - lsr - sta $A000 - cmp $A000 - bne rom_present - -;5. Set RAMTOP to $C0. - lda #$c0 - sta RAMTOP - -;6. Do a GRAPHICS 0. -;7. Exit via RTS, so the rest of the game will load. -ramtop_ok: - jmp gr_0 - -;8. Do a GRAPHICS 0. -rom_present: +;1. Do a GRAPHICS 0   jsr gr_0 -;9. Print a "remove cartridge" message +;2. If RAMTOP is >=$A0, go to step 5. + lda RAMTOP + cmp #$a0 + bcc memerr + +;5. Exit via RTS, so the rest of the game will load. + rts + +;3. Print a "need 40K" message +memerr:   lda #<msg   sta FR0   lda #>msg @@ -93,7 +59,7 @@ msgloop:   dey   bpl msgloop -;10. Wait for a keypress +;4. Wait for a keypress   sty CH ; y == $ff at this point, clear keyboard   ; ...wait for a keystroke...  wait4key: @@ -101,7 +67,7 @@ wait4key:   beq wait4key   sty CH ; clear the key so DOS menu won't see it. -;11. Exit to DOS (without loading the rest of the file) +;5. Exit to DOS (without loading the rest of the file)   jmp (DOSVEC)  gr_0: @@ -1,7 +1,7 @@   .include "atari.inc" - .export _clrtobot, _clrtoeol, _clr_screen, _clrtoline, _cspaces, _cblank, _backspace, _cprint_pipe, _cprint_bang, _cspace, _cputc_s, _comma_space, _cprint_colon_space, _cprint_question_space, _cprint_period, _cprint_taipan_prompt, _crlf + .export _clrtobot, _clrtoeol, _clr_screen, _clrtoline, _cspaces, _cblank, _backspace, _cprint_pipe, _cprint_bang, _cspace, _cputc_s, _comma_space, _cprint_colon_space, _cprint_question_space, _cprint_period, _cprint_taipan_prompt, _crlf, _plus_or_space, _gotox0y, _cputc0, _set_orders   .export _rvs_on, _rvs_off   .import mul40        ; from cc65's runtime @@ -10,7 +10,7 @@   .import bump_destptr ; these two are   .importzp destptr    ; from draw_lorcha.s   .importzp sreg - .import _cprintulong, _cputc, _cprint_taipan + .import _cprintulong, _cputc, _cprint_taipan, _timed_getch, _orders   .ifdef CART_TARGET    .segment "HIGHCODE" @@ -195,6 +195,9 @@ _comma_space:  _cspace:   lda #' '   .byte $2c +_cputc0: + lda #'0' + .byte $2c  _cprint_pipe:   lda #'|'   .byte $2c @@ -210,3 +213,60 @@ _cprint_bang:  _crlf:   lda #$9b   jmp _cputc + +; extern void plus_or_space(unsigned char b); +_plus_or_space: + tax + beq @spc + lda #'+' + 128 ; inverse plus + .byte $2c +@spc: + lda #' ' + ldx #39 + stx COLCRS + lda #15 + stx ROWCRS + jmp _cputc + +; extern void gotox0y(char y); + _gotox0y: + sta ROWCRS + lda #0 + sta COLCRS + rts + +; extern void set_orders(void); +;_set_orders: +; jsr _timed_getch +; ldx _orders +; cmp #'f' +; bne @notf +; ldx #1 +;@notf: +; cmp #'r' +; bne @notr +; ldx #2 +;@notr: +; cmp #'t' +; bne @nott +; ldx #3 +;@nott: +; stx _orders +; rts + +; extern void set_orders(void); +_set_orders: + jsr _timed_getch + ldx #3 +@solp: + cmp orders_tbl-1,x + beq @returnx + dex + bne @solp + rts +@returnx: + stx _orders + rts + + .rodata +orders_tbl: .byte "frt" diff --git a/messages.pl b/messages.pl index 3067eb1..5c7638f 100644 --- a/messages.pl +++ b/messages.pl @@ -113,7 +113,7 @@ silk "Silk"  arms "Arms"  gen_cargo "General Cargo"  ellipsis "..." -at_sea "At sea" +at_sea " At sea "  hong_kong "Hong Kong"  shanghai "Shanghai"  nagasaki "Nagasaki" @@ -250,6 +250,8 @@ bank_transfer "Visit bank, Transfer\r\ncargo, "  quit_traging "Quit trading"  or_retire ", or Retire"  what_will_you_name_firm " What will you name your" +what "What " +me_to "me to "  spc_you_can_spc " You can "  spc_shall " shall"  spc_afford "  afford " @@ -117,6 +117,10 @@ extern void clrtoeol(void);  /* print 'count' spaces: */  extern void __fastcall__ cspaces(unsigned char count); +/* same as gotoxy(0, y). replacing all the gotoxy(0, foo) with +	this saves 208 bytes! */ +extern void __fastcall__ gotox0y(char y); +  /* each prints one specific character */  extern void crlf(void);  extern void cspace(void); @@ -124,6 +128,7 @@ extern void cputc_s(void);  extern void cprint_bang(void);  extern void cprint_pipe(void);  extern void cprint_period(void); +extern void cputc0(void);  /* each print 2 characters */  extern void comma_space(void); @@ -647,7 +652,7 @@ void cprintfancy_big(bignump b) {  	if(rightdigits) {  		// cputc('.');  		cprint_period(); -		if(leading0) cputc('0'); +		if(leading0) cputc0();  		// cprintulong((unsigned long)rightdigits);  		cprintuchar(rightdigits);  	} @@ -678,20 +683,20 @@ void cprintulong(unsigned long ul) {  void at_sea(void) {  	gotoxy(30, 6); -	cspace(); +	// cspace();  	rvs_on();  	// cputs(location[0]);  	print_msg(M_at_sea);  	rvs_off(); -	cspaces(3); +	cspaces(2);  }  /* this bit of code was duplicated a *bunch* of times,  	making it a function makes the binary 2K smaller. */  void prepare_report(void) { -   gotoxy(0, 16); +   gotox0y(16);     clrtobot();  } @@ -708,7 +713,7 @@ void captains_report(void) {  }  void clear_msg_window(void) { -   gotoxy(0, 18); +   gotox0y(18);     clrtobot();  } @@ -724,11 +729,11 @@ void overload(void) {  unsigned int gunamt(void) {  	return randi()%(1000 * (get_time() + 5) / 6);  } +  #ifdef CART_TARGET  # pragma code-name (pop)  #endif -  void new_ship(void) {     unsigned long amount; @@ -890,7 +895,7 @@ void cprintfancy(unsigned long num) {  		if(tmp) {  			// cputc('.');  			cprint_period(); -			if(tmp < 10L) cputc('0'); +			if(tmp < 10L) cputc0();  			cprintulong(tmp);  		}     } else { @@ -919,6 +924,7 @@ void justify_int(unsigned int num) {  	if(num <   10) cspace();  	cprintuint(num);  } +  void update_guns() {  	rvs_on();  	gotoxy(31, 1); @@ -928,7 +934,7 @@ void update_guns() {  }  void fight_stats(int ships, int orders) { -   gotoxy(0, 0); +   gotox0y(0);  	justify_int(ships);  	// cputs(" ship"); @@ -959,13 +965,18 @@ void fight_stats(int ships, int orders) {  /* print an inverse video plus if there are offscreen ships,  	or clear it to a space if not. */ +extern void plus_or_space(unsigned char b); +/*  void plus_or_space(unsigned char b) {  	gotoxy(39, 15);  	cputc(b ? 0xab : ' ');  	// hide_cursor();  } +*/  char orders = 0; +extern void set_orders(void); +/*  void set_orders(void) {  	switch(timed_getch()) {  		case 'f': orders = 1; break; @@ -974,6 +985,7 @@ void set_orders(void) {  		default: break;  	}  } +*/  #ifdef CART_TARGET  # pragma code-name (pop) @@ -1042,7 +1054,7 @@ char sea_battle(char id, int num_ships) {  		 */  		// flushinp(); -		gotoxy(0, 3); +		gotox0y(3);  		clrtoeol();  		// cputs("Current seaworthiness: "); @@ -1051,7 +1063,7 @@ char sea_battle(char id, int num_ships) {  		cputs(" (");  		cprintuchar(status);  		cputs("%)"); -		gotoxy(0, 4); +		gotox0y(4);  		for(i = 0; i <= 9; i++) {  			if (num_ships > num_on_screen) { @@ -1066,7 +1078,7 @@ char sea_battle(char id, int num_ships) {  		plus_or_space(num_ships > num_on_screen); -		gotoxy(0, 16); +		gotox0y(16);  		// cputs("\n");  		crlf(); @@ -1075,7 +1087,7 @@ char sea_battle(char id, int num_ships) {  		if(orders == 0) {  			set_orders();  			if(!orders) { -				gotoxy(0, 3); +				gotox0y(3);  				clrtoeol();  				cprint_taipan_comma();  				// cputs("what shall we do??\n(Fight, Run, Throw cargo)"); @@ -1084,9 +1096,9 @@ char sea_battle(char id, int num_ships) {  				while(!orders) set_orders(); -				gotoxy(0, 3); +				gotox0y(3);  				clrtoeol(); -				gotoxy(0, 4); +				gotox0y(4);  				clrtoeol();  			}  		} @@ -1098,14 +1110,14 @@ char sea_battle(char id, int num_ships) {  			ok = 3;  			ik = 1; -			gotoxy(0, 3); +			gotox0y(3);  			clrtoeol();  			// cputs("Aye, we'll fight 'em");  			print_msg(M_aye_fight);  			cprint_taipan_period();  			set_orders(); -			gotoxy(0, 3); +			gotox0y(3);  			clrtoeol();  			// cputs("We're firing on 'em");  			print_msg(M_were_firing); @@ -1134,7 +1146,7 @@ char sea_battle(char id, int num_ships) {  				plus_or_space(num_ships > num_on_screen); -				gotoxy(0, 16); +				gotox0y(16);  				crlf();  				do { @@ -1172,7 +1184,7 @@ char sea_battle(char id, int num_ships) {  					jsleep(10);  				}  			} -			gotoxy(0, 3); +			gotox0y(3);  			clrtoeol();  			if(sk > 0) {  				// cputs("Sunk "); @@ -1197,7 +1209,7 @@ char sea_battle(char id, int num_ships) {  				num_ships -= ran;  				fight_stats(num_ships, orders); -				gotoxy(0, 3); +				gotox0y(3);  				clrtoeol();  				cprintuint(ran);  				// cputs(" ran away"); @@ -1220,12 +1232,12 @@ char sea_battle(char id, int num_ships) {  					}  				} -				gotoxy(0, 16); +				gotox0y(16);  				set_orders();  			}  		} else if ((orders == 1) && (guns == 0)) { -			gotoxy(0, 3); +			gotox0y(3);  			clrtoeol();  			// cputs("We have no guns");  			print_msg(M_we_have_no_guns); @@ -1236,7 +1248,7 @@ char sea_battle(char id, int num_ships) {  			amount = 0;  			total = 0; -			gotoxy(0, 3); +			gotox0y(3);  			// cputs("You have the following on board");  			print_msg(M_you_have_on_board);  			cprint_taipan_colon(); @@ -1265,7 +1277,7 @@ char sea_battle(char id, int num_ships) {  			cprint_colon_space();  			cprintulong(hold_[3]); -			gotoxy(0, 6); +			gotox0y(6);  			clrtoeol();  			// cputs("What shall I throw overboard");  			print_msg(M_what_shall_i_throw); @@ -1274,7 +1286,7 @@ char sea_battle(char id, int num_ships) {  			choice = get_item(1);  			if(choice < 4) { -				gotoxy(0, 6); +				gotox0y(6);  				clrtoeol();  				// cputs("How much");  				print_msg(M_how_much); @@ -1290,15 +1302,15 @@ char sea_battle(char id, int num_ships) {  				total = hold_[0] + hold_[1] + hold_[2] + hold_[3];  			} -			gotoxy(0, 4); +			gotox0y(4);  			clrtoeol(); -			gotoxy(0, 5); +			gotox0y(5);  			clrtoeol(); -			gotoxy(0, 6); +			gotox0y(6);  			clrtoeol();  			if(total > 0) { -				gotoxy(0, 3); +				gotox0y(3);  				clrtoeol();  				// cputs("Let's hope we lose 'em");  				print_msg(M_hope_we_lose_em); @@ -1319,7 +1331,7 @@ char sea_battle(char id, int num_ships) {  				set_orders();  			} else { -				gotoxy(0, 3); +				gotox0y(3);  				clrtoeol();  				// cputs("There's nothing there");  				print_msg(M_nothing_there); @@ -1332,7 +1344,7 @@ char sea_battle(char id, int num_ships) {  		if((orders == 2) || (orders == 3)) {  			if(orders == 2) { -				gotoxy(0, 3); +				gotox0y(3);  				clrtoeol();  				// cputs("Aye, we'll run");  				print_msg(M_aye_run); @@ -1342,7 +1354,7 @@ char sea_battle(char id, int num_ships) {  			ok += ik++;  			if(randi()%ok > randi()%num_ships) { -				gotoxy(0, 3); +				gotox0y(3);  				clrtoeol();  				// cputs("We got away from 'em");  				print_msg(M_we_got_away); @@ -1351,7 +1363,7 @@ char sea_battle(char id, int num_ships) {  				set_orders();  				num_ships = 0;  			} else { -				gotoxy(0, 3); +				gotox0y(3);  				clrtoeol();  				// cputs("Couldn't lose 'em.");  				print_msg(M_couldnt_lose_em); @@ -1363,7 +1375,7 @@ char sea_battle(char id, int num_ships) {  					num_ships -= lost;  					fight_stats(num_ships, orders); -					gotoxy(0, 3); +					gotox0y(3);  					clrtoeol();  					// cputs("But we escaped from ");  					print_msg(M_but_we_escaped); @@ -1384,7 +1396,7 @@ char sea_battle(char id, int num_ships) {  						plus_or_space(num_ships > num_on_screen);  					} -					gotoxy(0, 16); +					gotox0y(16);  					set_orders();  				} @@ -1392,7 +1404,7 @@ char sea_battle(char id, int num_ships) {  		}  		if(num_ships > 0) { -			gotoxy(0, 3); +			gotox0y(3);  			clrtoeol();  			// cputs("They're firing on us");  			print_msg(M_theyre_firing); @@ -1404,7 +1416,7 @@ char sea_battle(char id, int num_ships) {  			fight_stats(num_ships, orders);  			plus_or_space(num_ships > num_on_screen); -			gotoxy(0, 3); +			gotox0y(3);  			clrtoeol();  			// cputs("We've been hit");  			print_msg(M_weve_been_hit); @@ -1426,7 +1438,7 @@ char sea_battle(char id, int num_ships) {  				guns--;  				hold += 10;  				fight_stats(num_ships, orders); -				gotoxy(0, 3); +				gotox0y(3);  				clrtoeol();  				// cputs("The buggers hit a gun");  				print_msg(M_buggers_hit_gun); @@ -1469,7 +1481,7 @@ char sea_battle(char id, int num_ships) {  			if(damage == capacity) return 4;  #ifdef DAMAGE_TEST -			gotoxy(0, 23); +			gotox0y(23);  			clrtoeol();  			cprintulong(ed);  			cspace(); @@ -1491,7 +1503,7 @@ char sea_battle(char id, int num_ships) {  	if(orders == 1) {  		fight_stats(num_ships, orders); -		gotoxy(0, 3); +		gotox0y(3);  		clrtoeol();  		// cputs("We got 'em all");  		print_msg(M_we_got_em_all); @@ -2085,7 +2097,7 @@ void final_stats(void)  	chline(31);  	cputc(3); // lower right corner -	gotoxy(0, 22); +	gotox0y(22);  	// cputs("Play again? ");  	print_msg(M_play_again);  	choice = yngetc(0); @@ -2166,7 +2178,7 @@ void transfer(void) {     unsigned long amount = 0;  	if(have_no_cargo()) { -      gotoxy(0, 22); +      gotox0y(22);        clrtobot();        // cputs("You have no cargo");  		print_msg(M_you_have_no_cargo); @@ -2200,13 +2212,13 @@ void transfer(void) {                    hold += amount;                    break;                 } else if(in_use == 10000) { -                  gotoxy(0, 21); +                  gotox0y(21);                    // cputs("Your warehouse is full");  						print_msg(M_whouse_full);  						cprint_taipan_bang();  						good_joss_timed_getch();                 } else { -                  gotoxy(0, 21); +                  gotox0y(21);                    // cputs("Your warehouse will only hold an\nadditional ");  						print_msg(M_whouse_only_hold);  						cprintuint(10000 - in_use); @@ -2215,7 +2227,7 @@ void transfer(void) {                 }              } else {  					clear_msg_window(); -               // gotoxy(0, 18); +               // gotox0y(18);                 // clrtobot();  					you_have_only();  					cprintulong(hold_[i]); @@ -2248,7 +2260,7 @@ void transfer(void) {                 break;              } else {  					clear_msg_window(); -               // gotoxy(0, 18); +               // gotox0y(18);                 // clrtobot();  					you_have_only();  					cprintuint(hkw_[i]); @@ -2338,7 +2350,7 @@ void quit(void)  		under_attack_timed_getch();        result = sea_battle(GENERIC, num_ships); -		gotoxy(0,23); /* to avoid disappearing U in "In use" */ +		// gotoxy(0,23); /* to avoid disappearing U in "In use" */     }     if(result == 2) { @@ -2651,7 +2663,7 @@ void you_only_have(unsigned char in_bank) {  #else  void you_only_have(unsigned char in_bank) {  	clear_msg_window(); -	// gotoxy(0, 18); +	// gotox0y(18);  	// clrtobot();  	cprint_taipan_comma(); @@ -2903,7 +2915,7 @@ int port_choices(void) {  	cprintulong(price[3]);  	*/ -	gotoxy(0, 22); +	gotox0y(22);  	clrtobot();  #ifdef BIGNUM @@ -3072,11 +3084,13 @@ void name_firm(void) {  # pragma code-name (push, "HIGHCODE")  #endif  char what_do_you_wish_me_to(char buy_or_sell) { -	gotoxy(0, 22); +	gotox0y(22);  	clrtobot(); -	cputs("What "); +	// cputs("What "); +	print_msg(M_what);  	do_you_wish(); -	cputs("me to "); +	// cputs("me to "); +	print_msg(M_me_to);  	cputs(buy_or_sell ? "buy" : "sell");  	cprint_taipan_prompt();  	return get_item(0); @@ -3100,7 +3114,7 @@ void buy(void) {        // cputs(" You can ");  		print_msg(M_spc_you_can_spc);  		rvs_off(); -      gotoxy(0, 22); +      gotox0y(22);  		how_much();        // cputs(item[choice]);  		print_msg(item[choice]); @@ -3123,7 +3137,7 @@ void buy(void) {  		cprintulong(afford);  		rvs_off(); -      gotoxy(0, 23); +      gotox0y(23);        // cputs("I buy, ");  		print_msg(M_i_buy);  		cprint_taipan_colon(); @@ -3151,7 +3165,7 @@ void sell(void) {  	choice = what_do_you_wish_me_to(0);     for (;;) { -      gotoxy(0, 22); +      gotox0y(22);        clrtobot();  		how_much(); | 
