diff options
| -rw-r--r-- | Makefile | 33 | ||||
| -rw-r--r-- | bank2.s | 6 | ||||
| -rw-r--r-- | bank3.s | 2 | ||||
| -rw-r--r-- | bank7.s | 10 | ||||
| -rw-r--r-- | cartbank3.cfg | 66 | ||||
| -rw-r--r-- | taipan.c | 7 | 
6 files changed, 100 insertions, 24 deletions
| @@ -305,11 +305,16 @@ mkcart: mkcart.c  # the "tail -c+2" stuff removes the first byte, so we end up with  # a romable_taimain.raw that's ready to be copied to $0400 and run  # via "JSR $0400". -romable_taimain.raw: $(TAIMAIN_C_SRC) $(TAIMAIN_ASM_SRC) $(TAIMAIN_HDRS) -	rm -f taimain.xex -	$(MAKE) FONT_ADDR=0x9c00 TAIMAIN_ADDR=0x3ff EXTRACFLAGS="-Wl -D__AUTOSTART__=1 -Wl -D__EXEHDR__=1 -DCART_TARGET=1 --asm-define CART_TARGET=1" taimain.xex -	tail -c+2 taimain.xex > romable_taimain.raw -	rm -f taimain.xex +#romable_taimain.raw: $(TAIMAIN_C_SRC) $(TAIMAIN_ASM_SRC) $(TAIMAIN_HDRS) +#	rm -f taimain.xex +#	$(MAKE) FONT_ADDR=0x9c00 TAIMAIN_ADDR=0x3ff EXTRACFLAGS="-Wl -D__AUTOSTART__=1 -Wl -D__EXEHDR__=1 -DCART_TARGET=1 --asm-define CART_TARGET=1" taimain.xex +#	tail -c+2 taimain.xex > romable_taimain.raw +#	rm -f taimain.xex + +romable_taimain.raw: $(TAIMAIN_C_SRC) $(TAIMAIN_ASM_SRC) $(TAIMAIN_HDRS) $(BIGNUM_SRC) $(BIGNUM_HDRS) +	cl65 --config cartbank3.cfg -m taipan.map -t atari -T -I. -L. -DFONT_ADDR=0x9c00 --start-addr 0x3ff -Wl -D__STACKSIZE__=0x200 -O -Wl -D__SYSTEM_CHECK__=1 -Wl -D__AUTOSTART__=1 -Wl -D__EXEHDR__=1  -DCART_TARGET=1 --asm-define CART_TARGET=1 -DBIGNUM=BIGFLOAT -o romable_taimain.raw.in $(TAIMAIN_C_SRC) $(TAIMAIN_ASM_SRC) $(BIGNUM_SRC) +	tail -c+2 romable_taimain.raw.in > romable_taimain.raw +	rm -f romable_taimain.raw.in  # 256 bytes of $ff filler, for the last page of each code bank. Wasting  # this little bit of space simplifies the copying code in bank7.s (no @@ -323,18 +328,16 @@ fill256:  blankbank:  	$(PERL) -Mbytes -e 'print chr(0xff) x 8192' > blankbank -splitrom.raw.0: splitrom.raw.3 - -splitrom.raw.1: splitrom.raw.3 +splitrom.raw.0: splitrom.raw.2 -splitrom.raw.2: splitrom.raw.3 +splitrom.raw.1: splitrom.raw.2  # split romable_taimain.raw into bank-sized chunks. if we end up -# with 4 chunks, the cart won't work correctly, so stop the build here +# with 3 chunks, the cart won't work correctly, so stop the build here  # in that case. -splitrom.raw.3: romable_taimain.raw +splitrom.raw.2: romable_taimain.raw  	split -b 7936 -a 1 -d romable_taimain.raw splitrom.raw. -	[ -e splitrom.raw.4 ] && echo "*** romable_taimain.raw too big" && rm -f splitrom.raw.* && exit 1 || exit 0 +	[ -e splitrom.raw.3 ] && echo "*** romable_taimain.raw too big" && rm -f splitrom.raw.* && exit 1 || exit 0  bank0: splitrom.raw.0 fill256  	cat splitrom.raw.0 fill256 > bank0 @@ -343,13 +346,13 @@ bank1: splitrom.raw.1 fill256  	cat splitrom.raw.1 fill256 > bank1  bank2: splitrom.raw.2 fill256 -	cat splitrom.raw.2 fill256 > bank2 +	cl65 -l bank2.lst -m bank2.map -t none -o bank2 bank2.s -bank3: splitrom.raw.3 bank3.s taifont +bank3: rodata.8000 bank3.s taifont romable_taimain.raw  	cl65 -l bank3.lst -m bank3.map -t none -o bank3 bank3.s  bank7: bank7.s titledata.dat ver.dat help.dat newtitle.s -	cl65 --asm-define BANK3SIZE=`$(PERL) -e 'print -s "splitrom.raw.3"'` -l bank7.lst -m bank7.map -t none -o bank7 bank7.s +	cl65 --asm-define BANK2SIZE=`$(PERL) -e 'print -s "splitrom.raw.2"'` -l bank7.lst -m bank7.map -t none -o bank7 bank7.s  # raw ROM, for burning to EPROM/flash.  taipan.rom: bank0 bank1 bank2 bank3 bank7 blankbank @@ -0,0 +1,6 @@ + +start = $8000 +end = $9fff + .org start + .incbin "splitrom.raw.2" + .res end-*+1, $ff @@ -5,7 +5,7 @@  font = $9c00   .org $8000 - .incbin "splitrom.raw.3" + .incbin "rodata.8000"   .if * > font    .fatal "bank7 code too large" @@ -103,13 +103,15 @@ cartstart:   jsr copy_31_pages   lda #2    ; bank 2...   sta CCNTL ; ...select it - jsr copy_31_pages + ldx #(>BANK2SIZE)+1 ; BANK2SIZE defined on the command line + jsr copy_x_pages + + ; bank 3 contains RODATA and some code, that runs from ROM rather than + ; being copied to RAM.   lda #3    ; bank 3...   sta CCNTL ; ...select it - ldx #(>BANK3SIZE)+1 ; BANK3SIZE defined on the command line - jsr copy_x_pages - .out .sprintf("BANK3SIZE %x (%x pages)", BANK3SIZE, (>BANK3SIZE)+1) + .out .sprintf("BANK2SIZE $%x (%d pages)", BANK2SIZE, (>BANK2SIZE)+1)   ; leave bank 3 enabled, as it has our custom font in it diff --git a/cartbank3.cfg b/cartbank3.cfg new file mode 100644 index 0000000..e50d755 --- /dev/null +++ b/cartbank3.cfg @@ -0,0 +1,66 @@ +# TODO: get rid of some of the chunks like HEADER SYSCHKHDR etc. +# right now I'm killing them with -Wl options to cl65. + +FEATURES { +    STARTADDRESS: default = $2000; +} +SYMBOLS { +    __EXEHDR__:          type = import; +    __SYSTEM_CHECK__:    type = import;  # force inclusion of "system check" load chunk +    __AUTOSTART__:       type = import;  # force inclusion of autostart "trailer" +    __STACKSIZE__:       type = weak, value = $0800; # 2k stack +    __STARTADDRESS__:    type = export, value = %S; +    __RESERVED_MEMORY__: type = weak, value = $0000; +} +MEMORY { +    ZP:            file = "", define = yes, start = $0082, size = $007E; + +# file header, just $FFFF +    HEADER:        file = %O,               start = $0000, size = $0002; + +# "system check" load chunk +    SYSCHKHDR:     file = %O,               start = $0000, size = $0004; +    SYSCHKCHNK:    file = %O,               start = $2E00, size = $0300; +    SYSCHKTRL:     file = %O,               start = $0000, size = $0006; + +# "main program" load chunk +    MAINHDR:       file = %O,               start = $0000, size = $0004; +    RAM:           file = %O, define = yes, start = %S,    size = $BC20 - __STACKSIZE__ - __RESERVED_MEMORY__ - %S; +    TRAILER:       file = %O,               start = $0000, size = $0006; + +# read-only data goes in a cart bank +    HIGHDATA:      file = "rodata.8000"     start = $8000, size = $2000; +} +SEGMENTS { +    EXEHDR:    load = HEADER,     type = ro; +    SYSCHKHDR: load = SYSCHKHDR,  type = ro,                optional = yes; +    SYSCHK:    load = SYSCHKCHNK, type = rw,  define = yes, optional = yes; +    SYSCHKTRL: load = SYSCHKTRL,  type = ro,                optional = yes; +    MAINHDR:   load = MAINHDR,    type = ro; +    STARTUP:   load = RAM,        type = ro,  define = yes; +    LOWCODE:   load = RAM,        type = ro,  define = yes, optional = yes; +    INIT:      load = RAM,        type = ro,                optional = yes; +    CODE:      load = RAM,        type = ro,  define = yes; +    RODATA:    load = HIGHDATA,        type = ro; +    DATA:      load = RAM,        type = rw; +    INITBSS:   load = RAM,        type = bss,               optional = yes; +    BSS:       load = RAM,        type = bss, define = yes; +    ZEROPAGE:  load = ZP,         type = zp; +    EXTZP:     load = ZP,         type = zp,                optional = yes; +    AUTOSTRT:  load = TRAILER,    type = ro; +} +FEATURES { +    CONDES: type    = constructor, +            label   = __CONSTRUCTOR_TABLE__, +            count   = __CONSTRUCTOR_COUNT__, +            segment = INIT; +    CONDES: type    = destructor, +            label   = __DESTRUCTOR_TABLE__, +            count   = __DESTRUCTOR_COUNT__, +            segment = RODATA; +    CONDES: type    = interruptor, +            label   = __INTERRUPTOR_TABLE__, +            count   = __INTERRUPTOR_COUNT__, +            segment = RODATA, +            import  = __CALLIRQ__; +} @@ -1,10 +1,9 @@  // TODO: replace conio with coffio  #include <conio.h> -#include <time.h> -#include <stdlib.h> -#include <peekpoke.h> -#include <stdint.h> +#include <stdlib.h> /* rand() srand() exit() */ +#include <stdint.h> /* UINT32_MAX */ +#include <peekpoke.h> /* PEEK() PEEKW() POKE() POKEW() */  #include "sounds.h" | 
