From 057884ffa921eb2b19b152a1623da4d318d17e12 Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Thu, 2 Jan 2014 19:28:22 +0100 Subject: [PATCH] Atari: initial support to create cassette bootable programs -- unfinished --- cfg/atari-cassette.cfg | 53 ++++++++++++++++++++++++++++++++++++++++++ libsrc/atari/cashdr.s | 40 +++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 cfg/atari-cassette.cfg create mode 100644 libsrc/atari/cashdr.s diff --git a/cfg/atari-cassette.cfg b/cfg/atari-cassette.cfg new file mode 100644 index 000000000..ba640a54e --- /dev/null +++ b/cfg/atari-cassette.cfg @@ -0,0 +1,53 @@ +FEATURES { + STARTADDRESS: default = $1000; +} +SYMBOLS { +_cas_init: type = import; + __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 = "", 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; + 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; +} +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__; +} diff --git a/libsrc/atari/cashdr.s b/libsrc/atari/cashdr.s new file mode 100644 index 000000000..8d3d0868a --- /dev/null +++ b/libsrc/atari/cashdr.s @@ -0,0 +1,40 @@ +; +; Cassette boot file header +; +; Christian Groessler, chris@groessler.org, 2013 +; + +.ifndef __ATARIXL__ + + .include "atari.inc" + + .import __BSS_RUN__, __STARTADDRESS__, start + .export _cas_init + +.segment "CASHDR" + + .byte 0 ; ignored + .byte <((__BSS_RUN__ - __STARTADDRESS__ + 127 + 6) / 128) + .word __STARTADDRESS__ + .word _cas_init + +.segment "CASINIT" + + 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__ -- 2.39.5