]> git.sur5r.net Git - cc65/commitdiff
Atari: initial support to create cassette bootable programs -- unfinished
authorChristian Groessler <chris@groessler.org>
Thu, 2 Jan 2014 18:28:22 +0000 (19:28 +0100)
committerChristian Groessler <chris@groessler.org>
Thu, 2 Jan 2014 18:28:22 +0000 (19:28 +0100)
cfg/atari-cassette.cfg [new file with mode: 0644]
libsrc/atari/cashdr.s [new file with mode: 0644]

diff --git a/cfg/atari-cassette.cfg b/cfg/atari-cassette.cfg
new file mode 100644 (file)
index 0000000..ba640a5
--- /dev/null
@@ -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 (file)
index 0000000..8d3d086
--- /dev/null
@@ -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
+       lda     #>start
+       sta     DOSVEC+1
+       rts
+
+.endif ; .ifdef __ATARIXL__