diff --git a/cfg/atari-cassette.cfg b/cfg/atari-cassette.cfg index e69abfb4e..1099bf91c 100644 --- a/cfg/atari-cassette.cfg +++ b/cfg/atari-cassette.cfg @@ -1,41 +1,27 @@ FEATURES { - STARTADDRESS: default = $1000; + STARTADDRESS: default = $0700; } SYMBOLS { -_cas_init: type = import; - __STACKSIZE__: type = weak, value = $0800; # 2k stack + __STACKSIZE__: type = weak, value = $0800; # 2k stack + __RESERVED_MEMORY__: type = weak, value = $0000; __STARTADDRESS__: type = export, value = %S; - __RESERVED_MEMORY__: type = weak, value = $0000; + _cas_hdr: type = import; } MEMORY { ZP: file = "", define = yes, start = $0082, size = $007E; - -# file header, just $FFFF -# HEADER: file = "", start = $0000, size = $0002; - -# CASHDR: file = %O, start = $3FD, size = 128, fill = yes; -# CASHDR: file = %O, start = $0, size = 6; -# "main program" load chunk -# MAINHDR: file = "", start = $0000, size = $0004; RAM: file = %O, define = yes, start = %S, size = $BC20 - __STACKSIZE__ - __RESERVED_MEMORY__ - %S; -# TRAILER: file = "", start = $0000, size = $0006; } SEGMENTS { -# EXEHDR: load = HEADER, type = ro; -# MAINHDR: load = MAINHDR, type = ro; -# CASHDR: load = CASHDR, type = ro; - CASHDR: load = RAM, type = ro; - CASINIT: load = RAM, 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 = RAM, type = ro; - DATA: load = RAM, type = rw; - BSS: load = RAM, type = bss, define = yes; - ZEROPAGE: load = ZP, type = zp; - EXTZP: load = ZP, type = zp, optional = yes; -# AUTOSTRT: load = TRAILER, type = ro; + CASHDR: load = RAM, type = ro; + STARTUP: load = RAM, type = ro, define = yes, optional = 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 = RAM, type = ro, optional = yes; + DATA: load = RAM, type = rw, optional = yes; + BSS: load = RAM, type = bss, define = yes, optional = yes; + ZEROPAGE: load = ZP, type = zp, optional = yes; + EXTZP: load = ZP, type = zp, optional = yes; } FEATURES { CONDES: type = constructor, diff --git a/libsrc/atari/cashdr.s b/libsrc/atari/cashdr.s index 8d3d0868a..99aefe68f 100644 --- a/libsrc/atari/cashdr.s +++ b/libsrc/atari/cashdr.s @@ -1,40 +1,37 @@ ; ; Cassette boot file header ; -; Christian Groessler, chris@groessler.org, 2013 +; Christian Groessler, chris@groessler.org, 2014 ; +;DEBUG = 1 + .ifndef __ATARIXL__ - .include "atari.inc" + .include "atari.inc" - .import __BSS_RUN__, __STARTADDRESS__, start - .export _cas_init + .import __BSS_RUN__, __STARTADDRESS__, _cas_init + .export _cas_hdr + +.assert ((__BSS_RUN__ - __STARTADDRESS__ + 127) / 128) < $101, error, "File to big to load from cassette" + + +; for a description of the cassette header, see De Re Atari, appendix C .segment "CASHDR" - .byte 0 ; ignored - .byte <((__BSS_RUN__ - __STARTADDRESS__ + 127 + 6) / 128) - .word __STARTADDRESS__ - .word _cas_init +_cas_hdr: + .byte 0 ; ignored + .byte <((__BSS_RUN__ - __STARTADDRESS__ + 127) / 128) ; # of 128-byte records to read + .word __STARTADDRESS__ ; load address + .word _cas_init ; init address -.segment "CASINIT" +.ifdef DEBUG + lda #33 + ldy #80 + sta (SAVMSC),y +.endif + clc + rts - lda #33 - ldy #80 - sta (SAVMSC),y - clc - rts - -_cas_init: - lda #34 - ldy #81 - sta (SAVMSC),y - - lda #start - sta DOSVEC+1 - rts - -.endif ; .ifdef __ATARIXL__ +.endif ; .ifdef __ATARIXL__ diff --git a/libsrc/atari/casinit.s b/libsrc/atari/casinit.s new file mode 100644 index 000000000..c91989aad --- /dev/null +++ b/libsrc/atari/casinit.s @@ -0,0 +1,31 @@ +; +; Cassette boot file init routine +; +; Christian Groessler, chris@groessler.org, 2014 +; + +;DEBUG = 1 + +.ifndef __ATARIXL__ + + .include "atari.inc" + + .import start + .export _cas_init + +.segment "INIT" + +_cas_init: +.ifdef DEBUG + lda #34 + ldy #81 + sta (SAVMSC),y +.endif + + lda #start + sta DOSVEC+1 + rts + +.endif ; .ifdef __ATARIXL__