]> git.sur5r.net Git - cc65/commitdiff
Adds test code for the Atari (xex) linker file format. 762/head
authorDaniel Serpell <daniel.serpell@gmail.com>
Sun, 2 Dec 2018 03:41:36 +0000 (00:41 -0300)
committerDaniel Serpell <daniel.serpell@gmail.com>
Sun, 3 Feb 2019 21:23:11 +0000 (18:23 -0300)
testcode/lib/atari/asm-xex.s [new file with mode: 0644]
testcode/lib/atari/multi-xex.cfg [new file with mode: 0644]
testcode/lib/atari/multi-xex.s [new file with mode: 0644]

diff --git a/testcode/lib/atari/asm-xex.s b/testcode/lib/atari/asm-xex.s
new file mode 100644 (file)
index 0000000..d2a8d03
--- /dev/null
@@ -0,0 +1,51 @@
+; Sample using ATARI file format, by "atari-xex.cfg" linker configuration.
+;
+; This is a very simple example, shows a message to the screen, waits and
+; returns to DOS.
+;
+; Compile with:
+;    cl65 -tatari -Catari-xex.cfg asm-xex.s -o prog.xex
+
+        .include        "atari.inc"
+
+; Default RUNAD is "start", export that:
+        .export         start
+
+
+; Write string to screen
+.proc   puts
+        sta     ICBAL
+        stx     ICBAH
+        lda     #PUTREC
+        sta     ICCOM
+        ldx     #$FF
+        stx     ICBLL
+        inx
+        stx     ICBLH
+        jsr     CIOV
+        rts
+.endproc
+
+
+; Write a message and exit
+
+.proc   start
+        lda     #<msg
+        ldx     #>msg
+        jsr     puts
+
+
+        ; Delay before returning to DOS
+        lda     #0
+        tax
+loop:
+        inx
+        cpx     #$FF
+        adc     #0
+        bcc     loop
+
+        rts
+.endproc
+
+msg:    .byte   "Hello world", ATEOL
+
diff --git a/testcode/lib/atari/multi-xex.cfg b/testcode/lib/atari/multi-xex.cfg
new file mode 100644 (file)
index 0000000..18dfff8
--- /dev/null
@@ -0,0 +1,31 @@
+FEATURES {
+    STARTADDRESS: default = $2E00;
+}
+MEMORY {
+    ZP:      file = "", define = yes, start = $0082, size = $007E;
+    # First memory segment in file, load over COLOR registers:
+    COLOR:   file = %O, start = $2C4, size = 5;
+    # Second memory segment, load at page 6:
+    PAGE6:   file = %O, start = $600, size = 256;
+    # Third memory segment in file, load over SDLST register:
+    SDLST:   file = %O, start = $230, size = 2;
+    # Main segment, load at "STARTADDRESS"
+    MAIN:    file = %O, start = %S,   size = $BC20 - %S;
+}
+FILES {
+    %O: format = atari;
+}
+FORMATS {
+    atari: runad = start;
+}
+SEGMENTS {
+    ZEROPAGE: load = ZP,      type = zp,  optional = yes;
+    # Place segments in memory areas:
+    COLOR:    load = COLOR,   type = rw;
+    PAGE6:    load = PAGE6,   type = rw;
+    SDLST:    load = SDLST,   type = rw;
+    CODE:     load = MAIN,    type = rw;
+    RODATA:   load = MAIN,    type = ro   optional = yes;
+    DATA:     load = MAIN,    type = rw   optional = yes;
+    BSS:      load = MAIN,    type = bss, optional = yes, define = yes;
+}
diff --git a/testcode/lib/atari/multi-xex.s b/testcode/lib/atari/multi-xex.s
new file mode 100644 (file)
index 0000000..7957ddf
--- /dev/null
@@ -0,0 +1,63 @@
+; Multiple segment ATARI file format sample, using custom linker script.
+;
+; This sample defines a custom display-list screen with no code, writing all
+; memory areas directly.
+;
+; See the linker script (multi-xex.cfg) for the definition of memory areas and
+; segments.
+;
+; Compile with:
+;    cl65 -tatari -Cmulti-xex.cfg multi-xex.s -o prog.xex
+
+        .include        "atari.inc"
+
+        .macpack        atari
+
+; Default RUNAD is "start", export that:
+        .export         start
+
+
+; We load color values directly into registers
+        .segment        "COLOR"
+
+        .byte           $16     ; COLOR0
+        .byte           $46     ; COLOR1
+        .byte           $00     ; COLOR2
+        .byte           $6A     ; COLOR3
+        .byte           $82     ; COLOR4
+
+; We load our display list over page 6
+        .segment        "PAGE6"
+
+display_list:
+        .byte   DL_BLK8
+        .byte   DL_BLK8
+        .byte   DL_BLK8
+        .byte   DL_BLK8
+        .byte   DL_BLK8
+        .byte   DL_BLK8
+        .byte   DL_CHR20x8x2 | DL_LMS
+        .word   screen_memory
+        .byte   DL_CHR40x8x1
+        .byte   DL_JVB
+        .word   display_list
+
+screen_memory:
+        ; first text line: 20 bytes
+        scrcode   "    HeLlO wOrLd!    "
+        ; second text line, 40 bytes
+        .byte    0, 0, 0, 0, 0, 0, 0, 0,70,71,70,71,70,71,70,71,70,71,70,71
+        .byte   70,71,70,71,70,71,70,71,70,71,70,71, 0, 0, 0, 0, 0, 0, 0, 0
+
+; We write directly to the display list pointer
+        .segment        "SDLST"
+        .word   display_list
+
+; And we load our main program
+        .code
+
+.proc   start
+        ; Jump forever
+        jmp     start
+.endproc
+