mirror of
https://github.com/cc65/cc65.git
synced 2025-01-02 09:34:22 +00:00
Merge pull request #71 from groessler/something_to_pull2
Support to create cartridges for the Atari.
This commit is contained in:
commit
8304852521
44
cfg/atari-cart.cfg
Normal file
44
cfg/atari-cart.cfg
Normal file
@ -0,0 +1,44 @@
|
||||
FEATURES {
|
||||
STARTADDRESS: default = $2000;
|
||||
}
|
||||
SYMBOLS {
|
||||
__CARTSIZE__: type = weak, value = $2000; # possible values: $2000 and $4000
|
||||
__CART_HEADER__: type = import;
|
||||
__STACKSIZE__: type = weak, value = $0800; # 2k stack
|
||||
__STARTADDRESS__: type = export, value = %S;
|
||||
__RESERVED_MEMORY__: type = export, value = $0000;
|
||||
__CARTFLAGS__: type = weak, value = $01; # see documentation for other possible values
|
||||
}
|
||||
MEMORY {
|
||||
ZP: file = "", define = yes, start = $0082, size = $007E;
|
||||
RAM: file = "", define = yes, start = %S, size = __CARTSIZE__;
|
||||
ROM: file = %O, define = yes, start = $C000 - __CARTSIZE__, size = __CARTSIZE__ - 6, fill = yes, fillval = $FF;
|
||||
CARTID: file = %O, start = $BFFA, size = $0006;
|
||||
}
|
||||
SEGMENTS {
|
||||
STARTUP: load = ROM, type = ro, define = yes, optional = yes;
|
||||
LOWCODE: load = ROM, type = ro, define = yes, optional = yes;
|
||||
INIT: load = ROM, type = ro, optional = yes;
|
||||
CODE: load = ROM, type = ro, define = yes;
|
||||
RODATA: load = ROM, type = ro, optional = yes;
|
||||
DATA: load = ROM, run = RAM, type = rw, define = yes, optional = yes;
|
||||
BSS: load = RAM, type = bss, define = yes, optional = yes;
|
||||
CARTHDR: load = CARTID, type = ro;
|
||||
ZEROPAGE: load = ZP, type = zp;
|
||||
EXTZP: load = ZP, type = zp, optional = yes;
|
||||
}
|
||||
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__;
|
||||
}
|
22
libsrc/atari/carthdr.s
Normal file
22
libsrc/atari/carthdr.s
Normal file
@ -0,0 +1,22 @@
|
||||
; Cartridge "header"
|
||||
; (In fact, it's at the end of the cartridge, so more a "trailer".)
|
||||
;
|
||||
; Christian Groessler, 06-Jan-2014
|
||||
|
||||
.ifndef __ATARIXL__
|
||||
|
||||
.import __CARTSIZE__, __CARTFLAGS__, cartinit, cartstart
|
||||
.export __CART_HEADER__: absolute = 1
|
||||
|
||||
.include "atari.inc"
|
||||
|
||||
.segment "CARTHDR"
|
||||
|
||||
.word cartstart ; start routine
|
||||
.byte 0 ; must be zero
|
||||
.byte <__CARTFLAGS__
|
||||
.word cartinit ; init routine
|
||||
|
||||
.assert (__CARTSIZE__ = $2000 || __CARTSIZE__ = $4000), error, "Cartridge size must either be $2000 or $4000"
|
||||
|
||||
.endif ; .ifndef __ATARIXL__
|
11
libsrc/atari/cartinit.s
Normal file
11
libsrc/atari/cartinit.s
Normal file
@ -0,0 +1,11 @@
|
||||
; Cartridge init routine
|
||||
;
|
||||
; Christian Groessler, 06-Jan-2014
|
||||
|
||||
.ifndef __ATARIXL__
|
||||
|
||||
.export cartinit
|
||||
|
||||
cartinit: rts
|
||||
|
||||
.endif ; .ifndef __ATARIXL__
|
21
libsrc/atari/cartstart.s
Normal file
21
libsrc/atari/cartstart.s
Normal file
@ -0,0 +1,21 @@
|
||||
; Cartridge start routine
|
||||
;
|
||||
; Christian Groessler, 06-Jan-2014
|
||||
|
||||
.ifndef __ATARIXL__
|
||||
|
||||
.export cartstart
|
||||
|
||||
.import start, copydata
|
||||
.importzp ptr1, ptr2, tmp1, tmp2
|
||||
|
||||
.include "atari.inc"
|
||||
|
||||
; start routine of cartridge
|
||||
; copy data segment to RAM and chain to entry point of crt0.s
|
||||
|
||||
cartstart: jsr copydata
|
||||
jsr start ; run program
|
||||
jmp (DOSVEC) ; return to DOS
|
||||
|
||||
.endif ; .ifndef __ATARIXL__
|
Loading…
Reference in New Issue
Block a user