From 77b300682a6fbfccdc3fc23b0a4bd17226e652ec Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 2 Apr 2022 09:39:46 +0300 Subject: [PATCH 01/63] Add basic conio buffer --- asminc/atari7800.inc | 5 +++++ cfg/atari7800.cfg | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/asminc/atari7800.inc b/asminc/atari7800.inc index a7625aa8a..5b725c1c3 100644 --- a/asminc/atari7800.inc +++ b/asminc/atari7800.inc @@ -6,3 +6,8 @@ .include "atari7800_tia.inc" .include "atari7800_riot.inc" .include "atari7800_maria.inc" + +; constants for the conio implementation +charsperline = 20 +screenrows = 28 + diff --git a/cfg/atari7800.cfg b/cfg/atari7800.cfg index 4d20ab0d9..835d0b18f 100644 --- a/cfg/atari7800.cfg +++ b/cfg/atari7800.cfg @@ -10,7 +10,7 @@ SYMBOLS { __ENCRYPT_BOTTOM__: value = $ff7a, type = export; __ENCRYPT_SIZE__: value = $80, type = export; __MEMORY_TOP__: value = __ENCRYPT_BOTTOM__, type = export; - __INIT_SIZE__: value = 121, type = export; + __INIT_SIZE__: value = 139, type = export; __MEMORY_INIT__: value = __MEMORY_TOP__ - __INIT_SIZE__, type = export; __MEMORY_BOTTOM__: value = $10000 - __CARTSIZE__, type = weak; __FREE_ROM_SIZE__: value = __MEMORY_INIT__ - __MEMORY_BOTTOM__, type = export; From c31c7d278214c93a364185412b3054a45df3e7fe Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 2 Apr 2022 09:39:55 +0300 Subject: [PATCH 02/63] Add basic conio buffer --- libsrc/atari7800/clrscr.s | 31 +++++ libsrc/atari7800/conio.s | 230 ++++++++++++++++++++++++++++++++ libsrc/atari7800/font160.s | 259 +++++++++++++++++++++++++++++++++++++ 3 files changed, 520 insertions(+) create mode 100644 libsrc/atari7800/clrscr.s create mode 100644 libsrc/atari7800/conio.s create mode 100644 libsrc/atari7800/font160.s diff --git a/libsrc/atari7800/clrscr.s b/libsrc/atari7800/clrscr.s new file mode 100644 index 000000000..8d695b706 --- /dev/null +++ b/libsrc/atari7800/clrscr.s @@ -0,0 +1,31 @@ + + .include "atari7800.inc" + + .export _clrscr + + .import CURS_X + .import CURS_Y + .import _screen + .import pushax, __bzero + + .code + + .proc _clrscr + + lda #0 + sta CURS_X + sta CURS_Y + lda #<(_screen) + ldx #>(_screen) + jsr pushax + ldx #>(charsperline * screenrows) + lda #<(charsperline * screenrows) + jmp __bzero + + .endproc + +;------------------------------------------------------------------------------- +; force the init constructor to be imported + + .import initconio +conio_init = initconio diff --git a/libsrc/atari7800/conio.s b/libsrc/atari7800/conio.s new file mode 100644 index 000000000..f50b70cfe --- /dev/null +++ b/libsrc/atari7800/conio.s @@ -0,0 +1,230 @@ +; +; 2022-04-02, Karri Kaksonen +; +; The Atari 7800 has only 4k of RAM. So for a generic conio implementation +; the best alternative is to use indirect tile mapping with a character +; frame buffer +; + + .constructor initconio + .include "atari7800.inc" + .import _font160 + .import _get_tv + .import _clrscr + .export _screen + .export _zones + .export _dll + .export _initconio + .export CURS_X, CURS_Y + + .bss +_screen: + .res charsperline * screenrows + + .data +CURS_X: + .byte 0 +CURS_Y: + .byte 0 + +;---------------------------------------------------------------------------- +; Macros used to generate lists + +.macro DLLentry offset, addr + .byte offset + .byte >addr + .byte addr + .byte hpos +.endmacro + +.macro XHeader addr, flags, palwidth, hpos + .byte addr + .byte palwidth + .byte hpos +.endmacro + +.macro TextZone row + ; Text + .byte <(_screen + row * charsperline) + .byte $60 + .byte >(_screen + row * charsperline) + .byte 12 + .byte 0 + ; Cursor + .byte 127 + .byte 0 + .byte >_font160 + .byte 0 +.endmacro + +;----------------------------------------------------------------------------- +; The Atari 7800 has only 4k of RAM. So for a generic conio implementation +; the best alternative is to use indirect tile mapping with a character +; frame buffer + .data + +_zones: +zone0: TextZone 0 +nh: NullHeader 0, 0 +zone1: TextZone 1 + NullHeader 0, 0 +zone2: TextZone 2 + NullHeader 0, 0 +zone3: TextZone 3 + NullHeader 0, 0 +zone4: TextZone 4 + NullHeader 0, 0 +zone5: TextZone 5 + NullHeader 0, 0 +zone6: TextZone 6 + NullHeader 0, 0 +zone7: TextZone 7 + NullHeader 0, 0 +zone8: TextZone 8 + NullHeader 0, 0 +zone9: TextZone 9 + NullHeader 0, 0 +zone10: TextZone 10 + NullHeader 0, 0 +zone11: TextZone 11 + NullHeader 0, 0 +zone12: TextZone 12 + NullHeader 0, 0 +zone13: TextZone 13 + NullHeader 0, 0 +zone14: TextZone 14 + NullHeader 0, 0 +zone15: TextZone 15 + NullHeader 0, 0 +zone16: TextZone 16 + NullHeader 0, 0 +zone17: TextZone 17 + NullHeader 0, 0 +zone18: TextZone 18 + NullHeader 0, 0 +zone19: TextZone 19 + NullHeader 0, 0 +zone20: TextZone 20 + NullHeader 0, 0 +zone21: TextZone 21 + NullHeader 0, 0 +zone22: TextZone 22 + NullHeader 0, 0 +zone23: TextZone 23 + NullHeader 0, 0 +zone24: TextZone 24 + NullHeader 0, 0 +zone25: TextZone 25 + NullHeader 0, 0 +zone26: TextZone 26 + NullHeader 0, 0 +zone27: TextZone 27 + NullHeader 0, 0 + +_dll: +PALscanlines: ; 25 lines + DLLentry 15, nh + DLLentry 8, nh + +Topscanlines: ; 9 lines + DLLentry 8, nh + +Displaylines: + DLLentry $80+7, zone0 ; NMI interrupt from end of prev zone + DLLentry 7, zone1 + DLLentry 7, zone2 + DLLentry 7, zone3 + DLLentry 7, zone4 + DLLentry 7, zone5 + DLLentry 7, zone6 + DLLentry 7, zone7 + DLLentry 7, zone8 + DLLentry 7, zone9 + DLLentry 7, zone10 + DLLentry 7, zone11 + DLLentry 7, zone12 + DLLentry 7, zone13 + DLLentry 7, zone14 + DLLentry 7, zone15 + DLLentry 7, zone16 + DLLentry 7, zone17 + DLLentry 7, zone18 + DLLentry 7, zone19 + DLLentry 7, zone20 + DLLentry 7, zone21 + DLLentry 7, zone22 + DLLentry 7, zone23 + DLLentry 7, zone24 + DLLentry 7, zone25 + DLLentry 7, zone26 + DLLentry 7, zone27 + +Bottomscanlines: + DLLentry $80+15, nh ; NMI interrupt at end of display + DLLentry 9, nh + DLLentry 15, nh + DLLentry 8, nh + +;----------------------------------------------------------------------------- +; Set up the screen to 320a mode +; + .segment "ONCE" + +CTRL_MODE160 .set 0 +CTRL_MODEAC .set 3 +CTRL_KANGOFF .set 0 +CTRL_BCBLACK .set 0 +CTRL_CHAR1B .set 0 +CTRL_CHAR2B .set $10 +CTRL_DMAON .set $40 +CTRL_CKOFF .set 0 + +_initconio: +initconio: + jsr _get_tv + bne pal + lda #Topscanlines + sta DPPH + jmp vblankon +pal: lda #PALscanlines + sta DPPH + jsr _clrscr +vblankon: + lda MSTAT + bmi vblankon +vblankoff: + lda MSTAT + bpl vblankoff + lda #>_font160 + sta CHBASE + lda #(CTRL_MODE160 | CTRL_KANGOFF | CTRL_BCBLACK | CTRL_CHAR2B | CTRL_DMAON | CTRL_CKOFF) + sta CTRL + lda #$00 ; Black background + sta BKGRND + lda #$33 ; Red + sta P0C1 + lda #$c8 ; Green + sta P0C2 + lda #$78 ; Blue + sta P0C3 + lda #$0f ; Cursor gray + sta P1C1 + rts + diff --git a/libsrc/atari7800/font160.s b/libsrc/atari7800/font160.s new file mode 100644 index 000000000..9dbeda92c --- /dev/null +++ b/libsrc/atari7800/font160.s @@ -0,0 +1,259 @@ + .export _font160 + .rodata +_font160: + .byte $0, $0, $0, $0, $41, $41, $14, $0 + .byte $0, $0, $0, $0, $1, $40, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $82, $82, $28, $0, $0, $0, $0, $0 + .byte $2, $80, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $c3, $c3, $3c, $0 + .byte $0, $0, $0, $0, $3, $c0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $0, $0 + .byte $0, $0, $0, $0, $0, $0, $15, $15 + .byte $0, $0, $5, $0, $11, $44, $5, $0 + .byte $0, $0, $5, $0, $1, $40, $15, $50 + .byte $55, $50, $55, $50, $15, $40, $1, $54 + .byte $15, $40, $15, $40, $5, $0, $15, $40 + .byte $15, $0, $50, $50, $55, $50, $5, $50 + .byte $55, $40, $55, $54, $55, $0, $5, $54 + .byte $50, $50, $15, $40, $15, $40, $54, $14 + .byte $55, $54, $50, $14, $50, $14, $5, $40 + .byte $55, $0, $1, $50, $54, $14, $15, $40 + .byte $15, $40, $55, $50, $5, $0, $50, $14 + .byte $50, $14, $15, $40, $55, $54, $a, $0 + .byte $22, $88, $a, $0, $0, $0, $a, $0 + .byte $2, $80, $2a, $a0, $aa, $a0, $aa, $a0 + .byte $2a, $80, $2, $a8, $2a, $80, $2a, $80 + .byte $a, $0, $2a, $80, $2a, $0, $a0, $a0 + .byte $aa, $a0, $a, $a0, $aa, $80, $aa, $a8 + .byte $aa, $0, $a, $a8, $a0, $a0, $2a, $80 + .byte $2a, $80, $a8, $28, $aa, $a8, $a0, $28 + .byte $a0, $28, $a, $80, $aa, $0, $2, $a0 + .byte $a8, $28, $2a, $80, $2a, $80, $aa, $a0 + .byte $a, $0, $a0, $28, $a0, $28, $2a, $80 + .byte $aa, $a8, $f, $0, $33, $cc, $f, $0 + .byte $0, $0, $f, $0, $3, $c0, $3f, $f0 + .byte $ff, $f0, $ff, $f0, $3f, $c0, $3, $fc + .byte $3f, $c0, $3f, $c0, $f, $0, $3f, $c0 + .byte $3f, $0, $f0, $f0, $ff, $f0, $f, $f0 + .byte $ff, $c0, $ff, $fc, $ff, $0, $f, $fc + .byte $f0, $f0, $3f, $c0, $3f, $c0, $fc, $3c + .byte $ff, $fc, $f0, $3c, $f0, $3c, $f, $c0 + .byte $ff, $0, $3, $f0, $fc, $3c, $3f, $c0 + .byte $3f, $c0, $ff, $f0, $f, $0, $f0, $3c + .byte $f0, $3c, $3f, $c0, $ff, $fc, $0, $0 + .byte $0, $0, $0, $0, $5, $50, $5, $0 + .byte $0, $0, $5, $0, $1, $40, $54, $14 + .byte $5, $0, $50, $50, $50, $50, $0, $50 + .byte $50, $50, $50, $50, $5, $0, $50, $50 + .byte $1, $40, $50, $50, $14, $14, $14, $14 + .byte $14, $50, $14, $4, $14, $0, $14, $14 + .byte $50, $50, $5, $0, $50, $50, $14, $14 + .byte $14, $14, $50, $14, $50, $14, $14, $50 + .byte $14, $0, $15, $40, $14, $14, $50, $50 + .byte $5, $0, $50, $50, $15, $40, $54, $54 + .byte $14, $50, $5, $0, $14, $14, $0, $0 + .byte $a, $a0, $a, $0, $0, $0, $a, $0 + .byte $2, $80, $a8, $28, $a, $0, $a0, $a0 + .byte $a0, $a0, $0, $a0, $a0, $a0, $a0, $a0 + .byte $a, $0, $a0, $a0, $2, $80, $a0, $a0 + .byte $28, $28, $28, $28, $28, $a0, $28, $8 + .byte $28, $0, $28, $28, $a0, $a0, $a, $0 + .byte $a0, $a0, $28, $28, $28, $28, $a0, $28 + .byte $a0, $28, $28, $a0, $28, $0, $2a, $80 + .byte $28, $28, $a0, $a0, $a, $0, $a0, $a0 + .byte $2a, $80, $a8, $a8, $28, $a0, $a, $0 + .byte $28, $28, $0, $0, $f, $f0, $f, $0 + .byte $0, $0, $f, $0, $3, $c0, $fc, $3c + .byte $f, $0, $f0, $f0, $f0, $f0, $0, $f0 + .byte $f0, $f0, $f0, $f0, $f, $0, $f0, $f0 + .byte $3, $c0, $f0, $f0, $3c, $3c, $3c, $3c + .byte $3c, $f0, $3c, $c, $3c, $0, $3c, $3c + .byte $f0, $f0, $f, $0, $f0, $f0, $3c, $3c + .byte $3c, $3c, $f0, $3c, $f0, $3c, $3c, $f0 + .byte $3c, $0, $3f, $c0, $3c, $3c, $f0, $f0 + .byte $f, $0, $f0, $f0, $3f, $c0, $fc, $fc + .byte $3c, $f0, $f, $0, $3c, $3c, $0, $0 + .byte $0, $0, $5, $0, $54, $15, $0, $0 + .byte $55, $55, $0, $0, $1, $40, $55, $14 + .byte $5, $0, $14, $0, $0, $50, $55, $54 + .byte $0, $50, $50, $50, $5, $0, $50, $50 + .byte $0, $50, $55, $50, $14, $14, $50, $0 + .byte $14, $14, $14, $40, $14, $40, $50, $54 + .byte $50, $50, $5, $0, $50, $50, $14, $50 + .byte $14, $4, $51, $14, $50, $54, $50, $14 + .byte $14, $0, $51, $50, $14, $50, $1, $50 + .byte $5, $0, $50, $50, $50, $50, $55, $54 + .byte $5, $40, $5, $0, $5, $4, $a, $0 + .byte $a8, $2a, $0, $0, $aa, $aa, $0, $0 + .byte $2, $80, $aa, $28, $a, $0, $28, $0 + .byte $0, $a0, $aa, $a8, $0, $a0, $a0, $a0 + .byte $a, $0, $a0, $a0, $0, $a0, $aa, $a0 + .byte $28, $28, $a0, $0, $28, $28, $28, $80 + .byte $28, $80, $a0, $a8, $a0, $a0, $a, $0 + .byte $a0, $a0, $28, $a0, $28, $8, $a2, $28 + .byte $a0, $a8, $a0, $28, $28, $0, $a2, $a0 + .byte $28, $a0, $2, $a0, $a, $0, $a0, $a0 + .byte $a0, $a0, $aa, $a8, $a, $80, $a, $0 + .byte $a, $8, $f, $0, $fc, $3f, $0, $0 + .byte $ff, $ff, $0, $0, $3, $c0, $ff, $3c + .byte $f, $0, $3c, $0, $0, $f0, $ff, $fc + .byte $0, $f0, $f0, $f0, $f, $0, $f0, $f0 + .byte $0, $f0, $ff, $f0, $3c, $3c, $f0, $0 + .byte $3c, $3c, $3c, $c0, $3c, $c0, $f0, $fc + .byte $f0, $f0, $f, $0, $f0, $f0, $3c, $f0 + .byte $3c, $c, $f3, $3c, $f0, $fc, $f0, $3c + .byte $3c, $0, $f3, $f0, $3c, $f0, $3, $f0 + .byte $f, $0, $f0, $f0, $f0, $f0, $ff, $fc + .byte $f, $c0, $f, $0, $f, $c, $0, $0 + .byte $0, $0, $5, $0, $54, $15, $0, $0 + .byte $55, $55, $0, $0, $1, $40, $51, $54 + .byte $5, $0, $5, $40, $5, $40, $50, $50 + .byte $0, $50, $55, $40, $1, $40, $15, $40 + .byte $15, $50, $50, $50, $15, $50, $50, $0 + .byte $14, $14, $15, $40, $15, $40, $50, $0 + .byte $55, $50, $5, $0, $0, $50, $15, $40 + .byte $14, $0, $55, $54, $51, $54, $50, $14 + .byte $15, $50, $50, $50, $15, $50, $15, $0 + .byte $5, $0, $50, $50, $50, $50, $51, $14 + .byte $5, $40, $15, $40, $1, $40, $a, $0 + .byte $a8, $2a, $0, $0, $aa, $aa, $0, $0 + .byte $2, $80, $a2, $a8, $a, $0, $a, $80 + .byte $a, $80, $a0, $a0, $0, $a0, $aa, $80 + .byte $2, $80, $2a, $80, $2a, $a0, $a0, $a0 + .byte $2a, $a0, $a0, $0, $28, $28, $2a, $80 + .byte $2a, $80, $a0, $0, $aa, $a0, $a, $0 + .byte $0, $a0, $2a, $80, $28, $0, $aa, $a8 + .byte $a2, $a8, $a0, $28, $2a, $a0, $a0, $a0 + .byte $2a, $a0, $2a, $0, $a, $0, $a0, $a0 + .byte $a0, $a0, $a2, $28, $a, $80, $2a, $80 + .byte $2, $80, $f, $0, $fc, $3f, $0, $0 + .byte $ff, $ff, $0, $0, $3, $c0, $f3, $fc + .byte $f, $0, $f, $c0, $f, $c0, $f0, $f0 + .byte $0, $f0, $ff, $c0, $3, $c0, $3f, $c0 + .byte $3f, $f0, $f0, $f0, $3f, $f0, $f0, $0 + .byte $3c, $3c, $3f, $c0, $3f, $c0, $f0, $0 + .byte $ff, $f0, $f, $0, $0, $f0, $3f, $c0 + .byte $3c, $0, $ff, $fc, $f3, $fc, $f0, $3c + .byte $3f, $f0, $f0, $f0, $3f, $f0, $3f, $0 + .byte $f, $0, $f0, $f0, $f0, $f0, $f3, $3c + .byte $f, $c0, $3f, $c0, $3, $c0, $0, $0 + .byte $0, $0, $15, $40, $5, $50, $0, $0 + .byte $0, $0, $0, $0, $1, $40, $50, $54 + .byte $5, $0, $0, $50, $0, $50, $14, $50 + .byte $55, $40, $50, $0, $0, $50, $50, $50 + .byte $50, $50, $50, $50, $14, $14, $50, $0 + .byte $14, $14, $14, $40, $14, $40, $50, $0 + .byte $50, $50, $5, $0, $0, $50, $14, $50 + .byte $14, $0, $55, $54, $55, $14, $50, $14 + .byte $14, $14, $50, $50, $14, $14, $54, $0 + .byte $5, $0, $50, $50, $50, $50, $50, $14 + .byte $14, $50, $50, $50, $40, $50, $2a, $80 + .byte $a, $a0, $0, $0, $0, $0, $0, $0 + .byte $2, $80, $a0, $a8, $a, $0, $0, $a0 + .byte $0, $a0, $28, $a0, $aa, $80, $a0, $0 + .byte $0, $a0, $a0, $a0, $a0, $a0, $a0, $a0 + .byte $28, $28, $a0, $0, $28, $28, $28, $80 + .byte $28, $80, $a0, $0, $a0, $a0, $a, $0 + .byte $0, $a0, $28, $a0, $28, $0, $aa, $a8 + .byte $aa, $28, $a0, $28, $28, $28, $a0, $a0 + .byte $28, $28, $a8, $0, $a, $0, $a0, $a0 + .byte $a0, $a0, $a0, $28, $28, $a0, $a0, $a0 + .byte $80, $a0, $3f, $c0, $f, $f0, $0, $0 + .byte $0, $0, $0, $0, $3, $c0, $f0, $fc + .byte $f, $0, $0, $f0, $0, $f0, $3c, $f0 + .byte $ff, $c0, $f0, $0, $0, $f0, $f0, $f0 + .byte $f0, $f0, $f0, $f0, $3c, $3c, $f0, $0 + .byte $3c, $3c, $3c, $c0, $3c, $c0, $f0, $0 + .byte $f0, $f0, $f, $0, $0, $f0, $3c, $f0 + .byte $3c, $0, $ff, $fc, $ff, $3c, $f0, $3c + .byte $3c, $3c, $f0, $f0, $3c, $3c, $fc, $0 + .byte $f, $0, $f0, $f0, $f0, $f0, $f0, $3c + .byte $3c, $f0, $f0, $f0, $c0, $f0, $0, $0 + .byte $0, $0, $15, $40, $11, $44, $0, $0 + .byte $0, $0, $0, $0, $1, $40, $50, $14 + .byte $15, $0, $50, $50, $50, $50, $5, $50 + .byte $50, $0, $14, $0, $50, $50, $50, $50 + .byte $50, $50, $15, $40, $14, $14, $14, $14 + .byte $14, $50, $14, $4, $14, $4, $14, $14 + .byte $50, $50, $5, $0, $0, $50, $14, $14 + .byte $14, $0, $54, $54, $54, $14, $14, $50 + .byte $14, $14, $50, $50, $14, $14, $50, $50 + .byte $45, $10, $50, $50, $50, $50, $50, $14 + .byte $50, $14, $50, $50, $50, $14, $2a, $80 + .byte $22, $88, $0, $0, $0, $0, $0, $0 + .byte $2, $80, $a0, $28, $2a, $0, $a0, $a0 + .byte $a0, $a0, $a, $a0, $a0, $0, $28, $0 + .byte $a0, $a0, $a0, $a0, $a0, $a0, $2a, $80 + .byte $28, $28, $28, $28, $28, $a0, $28, $8 + .byte $28, $8, $28, $28, $a0, $a0, $a, $0 + .byte $0, $a0, $28, $28, $28, $0, $a8, $a8 + .byte $a8, $28, $28, $a0, $28, $28, $a0, $a0 + .byte $28, $28, $a0, $a0, $8a, $20, $a0, $a0 + .byte $a0, $a0, $a0, $28, $a0, $28, $a0, $a0 + .byte $a0, $28, $3f, $c0, $33, $cc, $0, $0 + .byte $0, $0, $0, $0, $3, $c0, $f0, $3c + .byte $3f, $0, $f0, $f0, $f0, $f0, $f, $f0 + .byte $f0, $0, $3c, $0, $f0, $f0, $f0, $f0 + .byte $f0, $f0, $3f, $c0, $3c, $3c, $3c, $3c + .byte $3c, $f0, $3c, $c, $3c, $c, $3c, $3c + .byte $f0, $f0, $f, $0, $0, $f0, $3c, $3c + .byte $3c, $0, $fc, $fc, $fc, $3c, $3c, $f0 + .byte $3c, $3c, $f0, $f0, $3c, $3c, $f0, $f0 + .byte $cf, $30, $f0, $f0, $f0, $f0, $f0, $3c + .byte $f0, $3c, $f0, $f0, $f0, $3c, $0, $0 + .byte $0, $0, $5, $0, $41, $41, $0, $0 + .byte $0, $0, $0, $0, $1, $40, $15, $50 + .byte $5, $0, $15, $40, $15, $40, $1, $50 + .byte $55, $50, $5, $40, $55, $50, $15, $40 + .byte $15, $40, $5, $0, $55, $50, $5, $50 + .byte $55, $40, $55, $54, $55, $54, $5, $50 + .byte $50, $50, $15, $40, $1, $54, $54, $14 + .byte $55, $0, $50, $14, $50, $14, $5, $40 + .byte $55, $50, $15, $40, $55, $50, $15, $40 + .byte $55, $50, $50, $50, $50, $50, $50, $14 + .byte $50, $14, $50, $50, $55, $54, $a, $0 + .byte $82, $82, $0, $0, $0, $0, $0, $0 + .byte $2, $80, $2a, $a0, $a, $0, $2a, $80 + .byte $2a, $80, $2, $a0, $aa, $a0, $a, $80 + .byte $aa, $a0, $2a, $80, $2a, $80, $a, $0 + .byte $aa, $a0, $a, $a0, $aa, $80, $aa, $a8 + .byte $aa, $a8, $a, $a0, $a0, $a0, $2a, $80 + .byte $2, $a8, $a8, $28, $aa, $0, $a0, $28 + .byte $a0, $28, $a, $80, $aa, $a0, $2a, $80 + .byte $aa, $a0, $2a, $80, $aa, $a0, $a0, $a0 + .byte $a0, $a0, $a0, $28, $a0, $28, $a0, $a0 + .byte $aa, $a8, $f, $0, $c3, $c3, $0, $0 + .byte $0, $0, $0, $0, $3, $c0, $3f, $f0 + .byte $f, $0, $3f, $c0, $3f, $c0, $3, $f0 + .byte $ff, $f0, $f, $c0, $ff, $f0, $3f, $c0 + .byte $3f, $c0, $f, $0, $ff, $f0, $f, $f0 + .byte $ff, $c0, $ff, $fc, $ff, $fc, $f, $f0 + .byte $f0, $f0, $3f, $c0, $3, $fc, $fc, $3c + .byte $ff, $0, $f0, $3c, $f0, $3c, $f, $c0 + .byte $ff, $f0, $3f, $c0, $ff, $f0, $3f, $c0 + .byte $ff, $f0, $f0, $f0, $f0, $f0, $f0, $3c + .byte $f0, $3c, $f0, $f0, $ff, $fc, $0, $0 From f8b53e91faba4156f3669fe9f8f03e63157f416e Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 2 Apr 2022 10:04:53 +0300 Subject: [PATCH 03/63] Add the font160.png --- libsrc/atari7800/font160.png | Bin 0 -> 2990 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 libsrc/atari7800/font160.png diff --git a/libsrc/atari7800/font160.png b/libsrc/atari7800/font160.png new file mode 100644 index 0000000000000000000000000000000000000000..7a0fa1eba62bd3a1fb784b512db586aed1abe1b5 GIT binary patch literal 2990 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 literal 0 HcmV?d00001 From 3a21734c68e900c93347f2875fbfe4af80d942a2 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 2 Apr 2022 10:51:45 +0300 Subject: [PATCH 04/63] Fix cursor character --- libsrc/atari7800/conio.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsrc/atari7800/conio.s b/libsrc/atari7800/conio.s index f50b70cfe..3f19ae02e 100644 --- a/libsrc/atari7800/conio.s +++ b/libsrc/atari7800/conio.s @@ -64,7 +64,7 @@ CURS_Y: .byte 12 .byte 0 ; Cursor - .byte 127 + .byte 254 .byte 0 .byte >_font160 .byte 0 From 2388d022aab466464839f5466ebb90fd180e2c2d Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 2 Apr 2022 11:47:37 +0300 Subject: [PATCH 05/63] Add the build tools for the font --- libsrc/atari7800/buildfont160.py | 30 ++++++++++++++++++++++++++++ libsrc/atari7800/font160.data | Bin 0 -> 8192 bytes libsrc/atari7800/font160flipped.png | Bin 0 -> 2957 bytes 3 files changed, 30 insertions(+) create mode 100644 libsrc/atari7800/buildfont160.py create mode 100644 libsrc/atari7800/font160.data create mode 100644 libsrc/atari7800/font160flipped.png diff --git a/libsrc/atari7800/buildfont160.py b/libsrc/atari7800/buildfont160.py new file mode 100644 index 000000000..bb944e335 --- /dev/null +++ b/libsrc/atari7800/buildfont160.py @@ -0,0 +1,30 @@ +blen = 0 + +def gb(val): + b = val[0] << 6 + b = b + (val[1] << 4) + b = b + (val[2] << 2) + b = b + val[3] + return '$' + hex(b)[2:4] + +def printline(f, val): + f.write(" .byte " + + gb(val[0:4]) + ', ' + + gb(val[4:8]) + ', ' + + gb(val[8:12]) + ', ' + + gb(val[12:16]) + ', ' + + gb(val[16:20]) + ', ' + + gb(val[20:24]) + ', ' + + gb(val[24:28]) + ', ' + + gb(val[28:32]) + '\n') + +fname='font160' +with open(fname + '.data', 'rb') as f: + data = f.read() +fname= fname + '.s' +with open(fname, 'w') as f: + f.write(" .export _font160\n") + f.write(' .rodata\n') + f.write("_font160:\n") + for i in range(0, int(len(data)/32)): + printline(f, data[i * 32:i * 32 + 32]) diff --git a/libsrc/atari7800/font160.data b/libsrc/atari7800/font160.data new file mode 100644 index 0000000000000000000000000000000000000000..79d2d83c3591585b230651e7c8142a130755a331 GIT binary patch literal 8192 zcmeHJ3v%5s2y~MB-?{7$ke@p30iuZoEXyLl5uQBHxxSv~3lH}*l?eIY^`F1M_w#(? z;eM|{{&)T7FYxm`KX|y`Ymon4|M&&IyoTnn=Hz3--(%jf9M*${HI{%xCxKYe=q6^h zx*a+$08OWn=g@-sOf_NkVO1qqMXT24s@^IntK|~D%$(N^r6XGJOE>SAej58?a`G|Z z?=kOK&NmiVrzL=fN@X7#U6m0R8Lnv4z_G=u7YCs-uXyr=Sms6M)*A z8XL79^GFD0#pt;|Osz_KtU39Z@b{Q^EawLctkV)eL#48hjjqawiwsw^Y2esmRq~S8 zXNvr#r_)o6eAQ7z-BZwq#0fy{O^uCOk9i~nvtsnzAEp*4e_6ipb)io}#~vZiiFp9` zgW4U(7dko9n%hna%EI-Q@)ig!iH_sg!ayVT@GDg@QzV!-K(}ii*sL&D44+elP_5w7Ltxc!+Pd&wfqbHhlt?&1;dIL@+7sE<=0%lXif=s3>ep%x*x?dz~i?c4xe0>={k z7BR7TsfVOiuJ8L2cT9(O+#c%S?&pS)zUD{q9-)g+k;v1Q@#|)QnOb}ElPnu77C`$t zEJK3M4bbi2xD54bzImyKzfLY`+#hDO+!B8aMU7QfB zlO*vFm4J1PZB&AbKn-o+ark%LDrP=>T1cf~_Z$6rKhr3dbD%J{m@|ec;lg#tN?bPg ze+^Smu|QCj$`nrru!4>6E>6I3g;V|>yDMUECXWpm|GOMEHb8eI)EQ+e0Ooer9&)$hp-h*Gc4}x z^lFPO5%}74w#kviHhRm{0ZPMlUSN9ohRl#A#W3+&ua(BC^lLN_Na`_ka-N5agm8>CpjRnCg05Dh@gs>qtSct3d~l zXUC)`vH53L*3UWY4c{^V{0WdvQ@|hnagOu2!!e&?KuIif6sUOi%nK)K;ETt5t~tPn zyX8Z>B#|@!bUvOXPlqIw3O1OE;bw{IT&>q zj!o|V$8QOM1JN7i$>5#?&=MoBDw*KhntmmK=dP!%L^Pb3R!OiJS@EeR~-SsohZEH1+#JblK=q`64I7X?Bsm{(YvrhCIa&etf#c}-Nm^!?W{bo z_XEJ(mE#Gkk~cXMhFkr&WuoRgbyYsNDhUAYMByDTSk0O>e9oFe)p34ZDT69j8g&cw dVIr_O;fi)S5BOUzvE^7FAAz|Gk3fmn`U9J)83h0U literal 0 HcmV?d00001 diff --git a/libsrc/atari7800/font160flipped.png b/libsrc/atari7800/font160flipped.png new file mode 100644 index 0000000000000000000000000000000000000000..a99a13657addb8e2c0ae3797643869ebea4a87ef GIT binary patch literal 2957 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 D!48YU literal 0 HcmV?d00001 From c44557665cdf529c9d31901a0082f1d71d89b95f Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 2 Apr 2022 11:48:05 +0300 Subject: [PATCH 06/63] Change blue to white --- libsrc/atari7800/conio.s | 4 +--- libsrc/atari7800/font160.png | Bin 2990 -> 2978 bytes 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/libsrc/atari7800/conio.s b/libsrc/atari7800/conio.s index 3f19ae02e..4955f2406 100644 --- a/libsrc/atari7800/conio.s +++ b/libsrc/atari7800/conio.s @@ -222,9 +222,7 @@ vblankoff: sta P0C1 lda #$c8 ; Green sta P0C2 - lda #$78 ; Blue + lda #$0f ; White sta P0C3 - lda #$0f ; Cursor gray - sta P1C1 rts diff --git a/libsrc/atari7800/font160.png b/libsrc/atari7800/font160.png index 7a0fa1eba62bd3a1fb784b512db586aed1abe1b5..6ad5fdeaf5deb684c3ddf6efff10e7941d3bc7d5 100644 GIT binary patch delta 2955 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 Date: Sat, 2 Apr 2022 12:09:15 +0300 Subject: [PATCH 07/63] Change blue to white --- libsrc/atari7800/font160.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsrc/atari7800/font160.s b/libsrc/atari7800/font160.s index 9dbeda92c..62db40fdd 100644 --- a/libsrc/atari7800/font160.s +++ b/libsrc/atari7800/font160.s @@ -32,7 +32,7 @@ _font160: .byte $0, $0, $0, $0, $0, $0, $0, $0 .byte $0, $0, $0, $0, $0, $0, $0, $0 .byte $0, $0, $0, $0, $0, $0, $0, $0 - .byte $0, $0, $0, $0, $0, $0, $15, $15 + .byte $0, $0, $0, $0, $0, $0, $55, $55 .byte $0, $0, $5, $0, $11, $44, $5, $0 .byte $0, $0, $5, $0, $1, $40, $15, $50 .byte $55, $50, $55, $50, $15, $40, $1, $54 From 2e33185dcb66fc89ba81451a0b5e0a02dea49b83 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 2 Apr 2022 13:01:05 +0300 Subject: [PATCH 08/63] Remove clrscr from init --- libsrc/atari7800/conio.s | 2 -- 1 file changed, 2 deletions(-) diff --git a/libsrc/atari7800/conio.s b/libsrc/atari7800/conio.s index 4955f2406..2b9062342 100644 --- a/libsrc/atari7800/conio.s +++ b/libsrc/atari7800/conio.s @@ -10,7 +10,6 @@ .include "atari7800.inc" .import _font160 .import _get_tv - .import _clrscr .export _screen .export _zones .export _dll @@ -205,7 +204,6 @@ pal: lda #PALscanlines sta DPPH - jsr _clrscr vblankon: lda MSTAT bmi vblankon From 5040a4b2a10b9c8c3dd3da9d7ac9dce7930e0faa Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 2 Apr 2022 21:28:34 +0300 Subject: [PATCH 09/63] Use question mark instead of exclamation mark --- libsrc/atari7800/font160.data | Bin 8192 -> 8192 bytes libsrc/atari7800/font160.png | Bin 2978 -> 2983 bytes libsrc/atari7800/font160.s | 24 ++++++++++++------------ libsrc/atari7800/font160flipped.png | Bin 2957 -> 2979 bytes 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libsrc/atari7800/font160.data b/libsrc/atari7800/font160.data index 79d2d83c3591585b230651e7c8142a130755a331..08ac1dbe430a08ec7275fe59b0b7b666bff489c7 100644 GIT binary patch delta 131 zcmZp0XmHrTCBV$U$hetTz?YGkfr)8ztRRTN%)EK6Pz>W_0~y}UVj|9rtPBhw$v9DO zFcT=fPArO%jggT7q?u2`i;<0q38F+2$Yy3{02#4PDw>gn5ePQ(%J?v{Fag2lSXm&8 M83;D7l?!GB0Lu3jQ~&?~ delta 133 zcmZp0XmHrTB`}#sgmbg7fIA~I6BEPcSV3P#W@cuF&1;2X7+D#CfMGMAh&LlE6A&%^iM*%+WIB)ouZs1ivK8>&Vsnvn&lhG8?Wj1Q0nwm}xe0$U*$%m@JA CP!%Qs diff --git a/libsrc/atari7800/font160.png b/libsrc/atari7800/font160.png index 6ad5fdeaf5deb684c3ddf6efff10e7941d3bc7d5..b7d36b3e64cecce132f337e7bfe5b206cb1941bb 100644 GIT binary patch delta 2845 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 delta 2841 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 diff --git a/libsrc/atari7800/font160.s b/libsrc/atari7800/font160.s index 62db40fdd..279fa1d9a 100644 --- a/libsrc/atari7800/font160.s +++ b/libsrc/atari7800/font160.s @@ -129,7 +129,7 @@ _font160: .byte $3c, $0, $f3, $f0, $3c, $f0, $3, $f0 .byte $f, $0, $f0, $f0, $f0, $f0, $ff, $fc .byte $f, $c0, $f, $0, $f, $c, $0, $0 - .byte $0, $0, $5, $0, $54, $15, $0, $0 + .byte $0, $0, $1, $40, $54, $15, $0, $0 .byte $55, $55, $0, $0, $1, $40, $51, $54 .byte $5, $0, $5, $40, $5, $40, $50, $50 .byte $0, $50, $55, $40, $1, $40, $15, $40 @@ -139,7 +139,7 @@ _font160: .byte $14, $0, $55, $54, $51, $54, $50, $14 .byte $15, $50, $50, $50, $15, $50, $15, $0 .byte $5, $0, $50, $50, $50, $50, $51, $14 - .byte $5, $40, $15, $40, $1, $40, $a, $0 + .byte $5, $40, $15, $40, $1, $40, $2, $80 .byte $a8, $2a, $0, $0, $aa, $aa, $0, $0 .byte $2, $80, $a2, $a8, $a, $0, $a, $80 .byte $a, $80, $a0, $a0, $0, $a0, $aa, $80 @@ -150,7 +150,7 @@ _font160: .byte $a2, $a8, $a0, $28, $2a, $a0, $a0, $a0 .byte $2a, $a0, $2a, $0, $a, $0, $a0, $a0 .byte $a0, $a0, $a2, $28, $a, $80, $2a, $80 - .byte $2, $80, $f, $0, $fc, $3f, $0, $0 + .byte $2, $80, $3, $c0, $fc, $3f, $0, $0 .byte $ff, $ff, $0, $0, $3, $c0, $f3, $fc .byte $f, $0, $f, $c0, $f, $c0, $f0, $f0 .byte $0, $f0, $ff, $c0, $3, $c0, $3f, $c0 @@ -161,7 +161,7 @@ _font160: .byte $3f, $f0, $f0, $f0, $3f, $f0, $3f, $0 .byte $f, $0, $f0, $f0, $f0, $f0, $f3, $3c .byte $f, $c0, $3f, $c0, $3, $c0, $0, $0 - .byte $0, $0, $15, $40, $5, $50, $0, $0 + .byte $0, $0, $0, $50, $5, $50, $0, $0 .byte $0, $0, $0, $0, $1, $40, $50, $54 .byte $5, $0, $0, $50, $0, $50, $14, $50 .byte $55, $40, $50, $0, $0, $50, $50, $50 @@ -171,7 +171,7 @@ _font160: .byte $14, $0, $55, $54, $55, $14, $50, $14 .byte $14, $14, $50, $50, $14, $14, $54, $0 .byte $5, $0, $50, $50, $50, $50, $50, $14 - .byte $14, $50, $50, $50, $40, $50, $2a, $80 + .byte $14, $50, $50, $50, $40, $50, $0, $a0 .byte $a, $a0, $0, $0, $0, $0, $0, $0 .byte $2, $80, $a0, $a8, $a, $0, $0, $a0 .byte $0, $a0, $28, $a0, $aa, $80, $a0, $0 @@ -182,7 +182,7 @@ _font160: .byte $aa, $28, $a0, $28, $28, $28, $a0, $a0 .byte $28, $28, $a8, $0, $a, $0, $a0, $a0 .byte $a0, $a0, $a0, $28, $28, $a0, $a0, $a0 - .byte $80, $a0, $3f, $c0, $f, $f0, $0, $0 + .byte $80, $a0, $0, $f0, $f, $f0, $0, $0 .byte $0, $0, $0, $0, $3, $c0, $f0, $fc .byte $f, $0, $0, $f0, $0, $f0, $3c, $f0 .byte $ff, $c0, $f0, $0, $0, $f0, $f0, $f0 @@ -193,7 +193,7 @@ _font160: .byte $3c, $3c, $f0, $f0, $3c, $3c, $fc, $0 .byte $f, $0, $f0, $f0, $f0, $f0, $f0, $3c .byte $3c, $f0, $f0, $f0, $c0, $f0, $0, $0 - .byte $0, $0, $15, $40, $11, $44, $0, $0 + .byte $0, $0, $50, $50, $11, $44, $0, $0 .byte $0, $0, $0, $0, $1, $40, $50, $14 .byte $15, $0, $50, $50, $50, $50, $5, $50 .byte $50, $0, $14, $0, $50, $50, $50, $50 @@ -203,7 +203,7 @@ _font160: .byte $14, $0, $54, $54, $54, $14, $14, $50 .byte $14, $14, $50, $50, $14, $14, $50, $50 .byte $45, $10, $50, $50, $50, $50, $50, $14 - .byte $50, $14, $50, $50, $50, $14, $2a, $80 + .byte $50, $14, $50, $50, $50, $14, $a0, $a0 .byte $22, $88, $0, $0, $0, $0, $0, $0 .byte $2, $80, $a0, $28, $2a, $0, $a0, $a0 .byte $a0, $a0, $a, $a0, $a0, $0, $28, $0 @@ -214,7 +214,7 @@ _font160: .byte $a8, $28, $28, $a0, $28, $28, $a0, $a0 .byte $28, $28, $a0, $a0, $8a, $20, $a0, $a0 .byte $a0, $a0, $a0, $28, $a0, $28, $a0, $a0 - .byte $a0, $28, $3f, $c0, $33, $cc, $0, $0 + .byte $a0, $28, $f0, $f0, $33, $cc, $0, $0 .byte $0, $0, $0, $0, $3, $c0, $f0, $3c .byte $3f, $0, $f0, $f0, $f0, $f0, $f, $f0 .byte $f0, $0, $3c, $0, $f0, $f0, $f0, $f0 @@ -225,7 +225,7 @@ _font160: .byte $3c, $3c, $f0, $f0, $3c, $3c, $f0, $f0 .byte $cf, $30, $f0, $f0, $f0, $f0, $f0, $3c .byte $f0, $3c, $f0, $f0, $f0, $3c, $0, $0 - .byte $0, $0, $5, $0, $41, $41, $0, $0 + .byte $0, $0, $15, $40, $41, $41, $0, $0 .byte $0, $0, $0, $0, $1, $40, $15, $50 .byte $5, $0, $15, $40, $15, $40, $1, $50 .byte $55, $50, $5, $40, $55, $50, $15, $40 @@ -235,7 +235,7 @@ _font160: .byte $55, $0, $50, $14, $50, $14, $5, $40 .byte $55, $50, $15, $40, $55, $50, $15, $40 .byte $55, $50, $50, $50, $50, $50, $50, $14 - .byte $50, $14, $50, $50, $55, $54, $a, $0 + .byte $50, $14, $50, $50, $55, $54, $2a, $80 .byte $82, $82, $0, $0, $0, $0, $0, $0 .byte $2, $80, $2a, $a0, $a, $0, $2a, $80 .byte $2a, $80, $2, $a0, $aa, $a0, $a, $80 @@ -246,7 +246,7 @@ _font160: .byte $a0, $28, $a, $80, $aa, $a0, $2a, $80 .byte $aa, $a0, $2a, $80, $aa, $a0, $a0, $a0 .byte $a0, $a0, $a0, $28, $a0, $28, $a0, $a0 - .byte $aa, $a8, $f, $0, $c3, $c3, $0, $0 + .byte $aa, $a8, $3f, $c0, $c3, $c3, $0, $0 .byte $0, $0, $0, $0, $3, $c0, $3f, $f0 .byte $f, $0, $3f, $c0, $3f, $c0, $3, $f0 .byte $ff, $f0, $f, $c0, $ff, $f0, $3f, $c0 diff --git a/libsrc/atari7800/font160flipped.png b/libsrc/atari7800/font160flipped.png index a99a13657addb8e2c0ae3797643869ebea4a87ef..289f29c47c163c9dd364467d5a4f1d3202433d5f 100644 GIT binary patch delta 2908 zcmV-i3#0Un7o!)DB!BdJR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}tygW9?5Yj? z&nmJ6Bq1a%2Lzmx9c1|_+}(5Mek6JCoV2HHH^v~UN+qW3fBo~6f8ax1xHL8I(R;zpnZ2_=NKQ&i9~CMD_K%d~aw5l$K&5VctSg zpR>Orko#pBxVGoa=tmN`XYqmy$!DzqR1=97#b8R!*Ttiv}Iq&owC#V&lz*D|50uZ7#;aDVL{q4?1jMY>9)j zB&iU46;=I$B2 zKnR^TZ~6fIIo|ZwZ^D99!Js}cI~F+Vd<`*`erQV`o(26B*S8lGTkin?5$09|LjneB zhv2DGHD)6Mjt+tbB4=ql!2qf9LXg}8)$;-TF1TVPehHx|z9!4Hs{&-rd|id<2KU12uYBctniB zWniL#u?G4Nv`n5d+tk^oO`kDGLO$72v!|tJ}L^F;Lhxu^#&3?gw*!iMOKumw4m<#ay}6{Xdv1pze3x z{=nM0buJ&qURiiCt%B@3G}?(`DK~k~Q+Jwg7~k1=HO7>V+Pie@idykhK3E?Z9Nh=c zM1P;z&b9+L>r}k0Q}HTYOUh~eqyy)W-KV41I(>xT8!=G;_EK&}t8RcxsP{70!XidF zNJ1=SRht9SdDjr5GZyjiHQKHqiR&4*_F#Z0X46)JKZD3J0zacjq;2Q{4l6nYE5E@s zxS}nwd1nQqfOeg{3%jWgdeRudRdF__b$>!ib4SJM8#+z&&4o9)i*IB~ zU7Tm9vrE+*@KDgBY1CuL7GDdYkF~et40BOP0}5VPb$@bBHZlf3!7-AgDHYu+pnn_T ztT@Dg^yt#y6I9cnmgZQT1H|gUBxGjD@fd;fB^x+0I6bQ@D6iXP1JPzXXFy7MtZSRw z7xkPf6^cjEjD(b|vDt1*`ts=5cJ#I_S3z}4&_T}vC5Oe)4VyTZFM`ODujm3=ONa`+ zkkKMY|JiQ75i)p4S9mr+QSnY`1AkjBKiLOF*1BVPQhlbtJJOJR7+HCC-QEUL30ZtF z4k{=*m(@np71(4^Zj)v{TAfHSU1RB!H!8rXWGFU*`jjv;&T)N zJX?^fSjLb=Iqov>1Qln)JU|_-p@3NimJFofEEV z&X6A7=vX6mP9PW+9i@dH`a@(pja5FSx; zW+Z0nbE#Akp5yBtKEB??c$W9MKSz&}HyPj)iD#LAZdk+{#8aD=&Uv3W!b*}td`>)S z&;^Mfxh}i>#<}RQz%wI8COuCaAr^}rEO#&~87lE4aa2(?$``UOE1b7DtCbpS-IKpC zoYz*CxlVHs2`pj>DTt6!Lm3rVh|#K%Vj@lZaS#81<4=)GCRZ7Z91EyIh2;3b|KNAG zW?^D~+)WC{fvy+Z{ul;=yFjyU+uz5w-8=#O&%l+|_E#Ig^e5@{wiZ1Cdbfd#>$WEE z0hc>K|C25mk|X(P3WWmjen#Jv1Nv@((3;y@Yagc%K!&xD5F8c6%qFq`00WsxL_t(Y$E}q? zisU#DMZ=k8C`^H;LEaC&5?&4T)?gL%?3Ezj$JDCnQ;1v%pTbbvhPjF$w*t@qk}|6f zP%@U~kTCvF@k1hLudj*^X^ebXdwbLQd0M~joA2*aexCQQ`r@*nYvtR|Ha{CP*ag>M z8aJ4K!L)*2EF!I4%;FYlowb~CYH?Os)tW^b>l9;HC5&O@I{E&q!#6ts82yH8Tu)(K z$F±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 From b3d28dd517c93f8c6f923e6addad10874fa8a20a Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 2 Apr 2022 22:49:28 +0300 Subject: [PATCH 10/63] Change order to make decoding easier --- libsrc/atari7800/font160.data | Bin 8192 -> 8192 bytes libsrc/atari7800/font160.png | Bin 2983 -> 2973 bytes libsrc/atari7800/font160.s | 66 ++++++++++++++-------------- libsrc/atari7800/font160flipped.png | Bin 2979 -> 2956 bytes 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/libsrc/atari7800/font160.data b/libsrc/atari7800/font160.data index 08ac1dbe430a08ec7275fe59b0b7b666bff489c7..dfbf65b63f56b90ca4a3837ce4e7e3309ecc4bce 100644 GIT binary patch delta 470 zcmY+AO-chn5QY0qC+24+GMdheMiWV75)c$j$V!x1o;*KHnnJ@}bAPa@(;Ery>tb({p<6ugH!M_! z!jqj13;RHq)$ delta 588 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 delta 2899 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 From 6017671fd9dc937d26146036bffe795feaa00ed5 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 4 Apr 2022 10:50:38 +0300 Subject: [PATCH 11/63] Don't set cursor in clrscr --- libsrc/atari7800/clrscr.s | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/libsrc/atari7800/clrscr.s b/libsrc/atari7800/clrscr.s index 8d695b706..4d3873499 100644 --- a/libsrc/atari7800/clrscr.s +++ b/libsrc/atari7800/clrscr.s @@ -3,18 +3,13 @@ .export _clrscr - .import CURS_X - .import CURS_Y .import _screen - .import pushax, __bzero + .import pusha0,pushax, __bzero .code .proc _clrscr - lda #0 - sta CURS_X - sta CURS_Y lda #<(_screen) ldx #>(_screen) jsr pushax From 0e6b490c8b4c6938a667d91d215fd68cd4057393 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 4 Apr 2022 10:51:13 +0300 Subject: [PATCH 12/63] Remove cursor from conio init --- libsrc/atari7800/conio.s | 7 ------- 1 file changed, 7 deletions(-) diff --git a/libsrc/atari7800/conio.s b/libsrc/atari7800/conio.s index 2b9062342..5852c1103 100644 --- a/libsrc/atari7800/conio.s +++ b/libsrc/atari7800/conio.s @@ -14,18 +14,11 @@ .export _zones .export _dll .export _initconio - .export CURS_X, CURS_Y .bss _screen: .res charsperline * screenrows - .data -CURS_X: - .byte 0 -CURS_Y: - .byte 0 - ;---------------------------------------------------------------------------- ; Macros used to generate lists From 04a13cf9491d5753c72a2dafe5adb2f8d056fde4 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 4 Apr 2022 10:51:43 +0300 Subject: [PATCH 13/63] Add cursor processing --- libsrc/atari7800/setcursor.s | 169 +++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 libsrc/atari7800/setcursor.s diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s new file mode 100644 index 000000000..9f8765656 --- /dev/null +++ b/libsrc/atari7800/setcursor.s @@ -0,0 +1,169 @@ +; +; 2022-04-03, Karri Kaksonen +; +; setcursor (unsigned char on); +; +; The Atari 7800 does not have a hw cursor. +; This module emulates a cursor to be used with the conio +; implementation. +; +; The actual cursor display is included in the conio dll +; but every scanline has the element silenced by default +; at the end of every zone. +; +; The way the cursor works is to silence it before the cursor +; position changes and enable it afterwards. +; +; In order to get some performance we have a pointer to the +; cursor header structure. This structure is always at the +; end of the zone. So the pointer changes when CURS_Y changes. +; +; There is so many dependencies that it makes sense to +; deal with all CURS_X, CURS_Y stuff in this file and +; definitely not allow direct access to the variables. +; + + .export _cursor_visible + .export _cursorzone + .export _gotoxy, _gotox, _gotoy, wherex, wherey + .constructor init_cursor + + .importzp ptr1, sp + .import _zones + .import pusha, incsp1, pusha0, pushax, popax, tosumula0, incax5 + .include "atari7800.inc" + + .macpack generic + + .data +CURS_X: + .byte 0 +CURS_Y: + .byte 0 +_cursor_visible: + .byte 1 + + .bss +_cursorzone: + .res 2 + + .code + +;----------------------------------------------------------------------------- +; Calculate cursorzone address +; You also need to set the cursorzone to point to the correct cursor Header +; at the end of line CURS_Y. +; Offset to cursor zone 5. To next line offset 11 +; cursorzone points to _zones + CURS_Y * 11 + 5 +; A = CURS_Y +calccursorzone: + jsr pusha0 + lda #11 + jsr tosumula0 + jsr incax5 + clc + adc #<_zones + sta _cursorzone ; calculate new cursorzone + sta ptr1 + txa + adc #>_zones + sta _cursorzone+1 + sta ptr1+1 + rts + +;----------------------------------------------------------------------------- +; Set cursor to Y position. +; You also need to set the cursorzone to point to the correct cursor Header +; at the end of line CURS_Y. +; Offset to cursor zone 5. To next line offset 11 +; cursorzone points to _zones + CURS_Y * 11 + 5 +; +; cursorzone[1] = 0 when not CURS_Y, 30 if CURS_Y +; +; Disable cursor +; cursorzone[1] = 0 +; +; Enable cursor +; if showcursor cursorzone[1] = 30 +; +_gotoy: pha + lda CURS_Y + jsr calccursorzone + ldy #1 + lda #0 + sta (ptr1),y ; disable cursor + pla + sta CURS_Y + jsr calccursorzone + lda _cursor_visible + beq L2 + lda #30 ; enable cursor +L2: ldy #1 + sta (ptr1),y + rts + +;----------------------------------------------------------------------------- +; Set cursor to X position. +; You also need to set the hpos offset to the correct value on this line +; cursorzone[3] = 8 * CURS_X +; +_gotox: tay + lda _cursorzone + ldx _cursorzone+1 + sta ptr1 + stx ptr1+1 + tya + ldy #3 + clc + rol + rol + rol + sta (ptr1),y + rts + +;----------------------------------------------------------------------------- +; Set cursor to desired position (X,Y) +; + .proc _gotoxy + + jsr _gotoy + jsr popax + jsr _gotox + rts + .endproc + +;----------------------------------------------------------------------------- +; Get cursor X position +; + .proc wherex + + lda CURS_X + jsr pusha0 + rts + .endproc + +;----------------------------------------------------------------------------- +; Get cursor Y position +; + .proc wherey + + lda CURS_Y + jsr pusha0 + rts + .endproc + +;----------------------------------------------------------------------------- +; Initialize cursorzone at startup +; Offset to cursor zone 5. +; +; .segment "ONCE" +init_cursor: + lda #0 + jsr calccursorzone + rts + +;----------------------------------------------------------------------------- +; force the init constructor to be imported + + .import initconio +conio_init = initconio From 37456219eb211d672702ebbd0872f1017dd22dc4 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 4 Apr 2022 10:52:04 +0300 Subject: [PATCH 14/63] Add space to config --- cfg/atari7800.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cfg/atari7800.cfg b/cfg/atari7800.cfg index 835d0b18f..72922e52e 100644 --- a/cfg/atari7800.cfg +++ b/cfg/atari7800.cfg @@ -10,7 +10,7 @@ SYMBOLS { __ENCRYPT_BOTTOM__: value = $ff7a, type = export; __ENCRYPT_SIZE__: value = $80, type = export; __MEMORY_TOP__: value = __ENCRYPT_BOTTOM__, type = export; - __INIT_SIZE__: value = 139, type = export; + __INIT_SIZE__: value = 139+9, type = export; __MEMORY_INIT__: value = __MEMORY_TOP__ - __INIT_SIZE__, type = export; __MEMORY_BOTTOM__: value = $10000 - __CARTSIZE__, type = weak; __FREE_ROM_SIZE__: value = __MEMORY_INIT__ - __MEMORY_BOTTOM__, type = export; From c7cb201070140c4f8a33b0cf06128b32d44f0c7c Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 4 Apr 2022 15:17:26 +0300 Subject: [PATCH 15/63] Remove export --- libsrc/atari7800/conio.s | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/libsrc/atari7800/conio.s b/libsrc/atari7800/conio.s index 5852c1103..777de004b 100644 --- a/libsrc/atari7800/conio.s +++ b/libsrc/atari7800/conio.s @@ -13,7 +13,6 @@ .export _screen .export _zones .export _dll - .export _initconio .bss _screen: @@ -184,8 +183,11 @@ CTRL_CHAR2B .set $10 CTRL_DMAON .set $40 CTRL_CKOFF .set 0 -_initconio: -initconio: +;----------------------------------------------------------------------------- +; Initialize the conio display lists and zones +; + .proc initconio + jsr _get_tv bne pal lda # Date: Mon, 4 Apr 2022 15:18:13 +0300 Subject: [PATCH 16/63] Add setcursor method --- libsrc/atari7800/setcursor.s | 42 ++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index 9f8765656..37ead5ca6 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -23,9 +23,9 @@ ; definitely not allow direct access to the variables. ; - .export _cursor_visible - .export _cursorzone + .export _setcursor .export _gotoxy, _gotox, _gotoy, wherex, wherey + .export CURS_X, CURS_Y .constructor init_cursor .importzp ptr1, sp @@ -36,6 +36,10 @@ .macpack generic .data +;----------------------------------------------------------------------------- +; The variables used by cursor functions +; + CURS_X: .byte 0 CURS_Y: @@ -49,6 +53,18 @@ _cursorzone: .code +;----------------------------------------------------------------------------- +; Enable/disable cursor +; + .proc _setcursor + + ldx _cursor_visible + sta _cursor_visible + txa + rts + + .endproc + ;----------------------------------------------------------------------------- ; Calculate cursorzone address ; You also need to set the cursorzone to point to the correct cursor Header @@ -56,7 +72,8 @@ _cursorzone: ; Offset to cursor zone 5. To next line offset 11 ; cursorzone points to _zones + CURS_Y * 11 + 5 ; A = CURS_Y -calccursorzone: + .proc calccursorzone + jsr pusha0 lda #11 jsr tosumula0 @@ -71,6 +88,8 @@ calccursorzone: sta ptr1+1 rts + .endproc + ;----------------------------------------------------------------------------- ; Set cursor to Y position. ; You also need to set the cursorzone to point to the correct cursor Header @@ -86,7 +105,9 @@ calccursorzone: ; Enable cursor ; if showcursor cursorzone[1] = 30 ; -_gotoy: pha + .proc _gotoy + + pha lda CURS_Y jsr calccursorzone ldy #1 @@ -96,18 +117,23 @@ _gotoy: pha sta CURS_Y jsr calccursorzone lda _cursor_visible - beq L2 + beq @L1 lda #30 ; enable cursor -L2: ldy #1 +@L1: ldy #1 sta (ptr1),y rts + .endproc + ;----------------------------------------------------------------------------- ; Set cursor to X position. ; You also need to set the hpos offset to the correct value on this line ; cursorzone[3] = 8 * CURS_X ; -_gotox: tay + .proc _gotox + + sta CURS_X + tay lda _cursorzone ldx _cursorzone+1 sta ptr1 @@ -121,6 +147,8 @@ _gotox: tay sta (ptr1),y rts + .endproc + ;----------------------------------------------------------------------------- ; Set cursor to desired position (X,Y) ; From 90fc16ff1c811ab7b0e6193195d6d8fc35eea1c3 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 4 Apr 2022 15:18:40 +0300 Subject: [PATCH 17/63] Add cputc method --- libsrc/atari7800/cputc.s | 144 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 libsrc/atari7800/cputc.s diff --git a/libsrc/atari7800/cputc.s b/libsrc/atari7800/cputc.s new file mode 100644 index 000000000..5f4346868 --- /dev/null +++ b/libsrc/atari7800/cputc.s @@ -0,0 +1,144 @@ +; +; Mark Keates, Christian Groessler, Piotr Fusik, Karri Kaksonen +; +; void cputcxy (unsigned char x, unsigned char y, char c); +; void cputc (char c); +; + + .export _cputc + .export _textcolor + .import _gotoxy, _gotox, _gotoy, tosaddax, tosumula0, pusha0 + .import pushax + .import _screen + .importzp ptr1 + .import CURS_X, CURS_Y + + .include "atari7800.inc" + + .data +;----------------------------------------------------------------------------- +; Holder of the text colour offset +; 0 = red, 42 = green, 82 = white +; +txtcolor: + .byte 0 + + .code + +;----------------------------------------------------------------------------- +; Change the text colour +; +; Logical colour names are +; 0 = red +; 1 = green +; 2 = white +; +; The routine will also return the previous textcolor +; + .proc _textcolor + + beq @L2 + sec + sbc #1 + beq @L1 + lda #82 + jmp @L2 +@L1: lda #42 +@L2: ldy txtcolor + sta txtcolor + tya + bne @L3 + rts +@L3: sec + sbc #42 + bne @L4 + lda #1 + rts +@L4: lda #2 + rts + .endproc + +;----------------------------------------------------------------------------- +; Put a character on screen +; +; The code will handle newlines that wrap to start of screen +; + .proc _cputc + + cmp #$0A ; LF + beq @L3 + cmp #$20 ; ' ' + beq @L1 + + jsr @L5 +@L1: + lda CURS_X + cmp #(charsperline-1) + bne @L2 + jmp @L3 +@L2: + clc + adc #1 + jmp _gotox + +@L3: + lda #0 + jsr _gotox + lda CURS_Y + cmp #(screenrows-1) + bne @L4 + lda #0 + jmp _gotoy +@L4: + clc + adc #1 + jmp _gotoy + +@L5: + cmp #$3F ; '?' + bne @L6 + lda #$01 + jmp @L10 +@L6: + cmp #$7C ; '|' + bne @L7 + lda #$05 + jmp @L10 +@L7: + cmp #$41 ; >= 'A' + bcc @L8 + and #$5F + sec + sbc #($41 - 16) + jmp @L10 +@L8: + sec + sbc #($2A) +@L10: + sec + adc txtcolor + asl + pha + + lda CURS_Y + jsr pusha0 + lda #charsperline + jsr tosumula0 + clc + adc CURS_X + bcc @L11 + inx +@L11: jsr pushax + lda #<(_screen) + ldx #>(_screen) + jsr tosaddax + sta ptr1 + stx ptr1+1 + + pla + ldy #0 + sta (ptr1),y + rts + + .endproc + From 6b16b9919254f857c60f0f199deb307ea729db12 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Tue, 5 Apr 2022 10:35:59 +0300 Subject: [PATCH 18/63] Fix conflicts with some conio routines --- include/atari7800.h | 2 ++ libsrc/atari7800/cputc.s | 8 ++++---- libsrc/atari7800/setcursor.s | 21 ++++++++++++--------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/include/atari7800.h b/include/atari7800.h index 4fdaacfcc..3cbeedb8b 100644 --- a/include/atari7800.h +++ b/include/atari7800.h @@ -52,6 +52,8 @@ /* No support for dynamically loadable drivers */ #define DYN_DRV 0 +extern unsigned char get_tv(void); /* get TV system */ + #include <_tia.h> #define TIA (*(struct __tia*)0x0000) diff --git a/libsrc/atari7800/cputc.s b/libsrc/atari7800/cputc.s index 5f4346868..3cf8e9de1 100644 --- a/libsrc/atari7800/cputc.s +++ b/libsrc/atari7800/cputc.s @@ -10,7 +10,7 @@ .import _gotoxy, _gotox, _gotoy, tosaddax, tosumula0, pusha0 .import pushax .import _screen - .importzp ptr1 + .importzp ptr3 .import CURS_X, CURS_Y .include "atari7800.inc" @@ -132,12 +132,12 @@ txtcolor: lda #<(_screen) ldx #>(_screen) jsr tosaddax - sta ptr1 - stx ptr1+1 + sta ptr3 + stx ptr3+1 pla ldy #0 - sta (ptr1),y + sta (ptr3),y rts .endproc diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index 37ead5ca6..b283fdff0 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -24,11 +24,11 @@ ; .export _setcursor - .export _gotoxy, _gotox, _gotoy, wherex, wherey + .export gotoxy, _gotoxy, _gotox, _gotoy, wherex, wherey .export CURS_X, CURS_Y .constructor init_cursor - .importzp ptr1, sp + .importzp ptr3, sp .import _zones .import pusha, incsp1, pusha0, pushax, popax, tosumula0, incax5 .include "atari7800.inc" @@ -81,11 +81,11 @@ _cursorzone: clc adc #<_zones sta _cursorzone ; calculate new cursorzone - sta ptr1 + sta ptr3 txa adc #>_zones sta _cursorzone+1 - sta ptr1+1 + sta ptr3+1 rts .endproc @@ -112,7 +112,7 @@ _cursorzone: jsr calccursorzone ldy #1 lda #0 - sta (ptr1),y ; disable cursor + sta (ptr3),y ; disable cursor pla sta CURS_Y jsr calccursorzone @@ -120,7 +120,7 @@ _cursorzone: beq @L1 lda #30 ; enable cursor @L1: ldy #1 - sta (ptr1),y + sta (ptr3),y rts .endproc @@ -136,15 +136,15 @@ _cursorzone: tay lda _cursorzone ldx _cursorzone+1 - sta ptr1 - stx ptr1+1 + sta ptr3 + stx ptr3+1 tya ldy #3 clc rol rol rol - sta (ptr1),y + sta (ptr3),y rts .endproc @@ -160,6 +160,9 @@ _cursorzone: rts .endproc + .proc gotoxy + jmp _gotoxy + .endproc ;----------------------------------------------------------------------------- ; Get cursor X position ; From 97fd42063b1dd0aea71fd5416061c92b64d1a95d Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Tue, 5 Apr 2022 10:42:58 +0300 Subject: [PATCH 19/63] Align font to 256 bytes --- libsrc/atari7800/buildfont160.py | 1 + libsrc/atari7800/font160.s | 1 + 2 files changed, 2 insertions(+) diff --git a/libsrc/atari7800/buildfont160.py b/libsrc/atari7800/buildfont160.py index bb944e335..30ee02695 100644 --- a/libsrc/atari7800/buildfont160.py +++ b/libsrc/atari7800/buildfont160.py @@ -25,6 +25,7 @@ fname= fname + '.s' with open(fname, 'w') as f: f.write(" .export _font160\n") f.write(' .rodata\n') + f.write(' .align 256\n') f.write("_font160:\n") for i in range(0, int(len(data)/32)): printline(f, data[i * 32:i * 32 + 32]) diff --git a/libsrc/atari7800/font160.s b/libsrc/atari7800/font160.s index e9c2e46d8..e5ebbede2 100644 --- a/libsrc/atari7800/font160.s +++ b/libsrc/atari7800/font160.s @@ -1,5 +1,6 @@ .export _font160 .rodata + .align 256 _font160: .byte $0, $0, $41, $41, $0, $0, $14, $0 .byte $0, $0, $0, $0, $1, $40, $0, $0 From d5dcea65b77c5f3598bf07d86a420afe431a5d4c Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Tue, 5 Apr 2022 11:13:18 +0300 Subject: [PATCH 20/63] Allocate own zp pointer for conio implementation --- libsrc/atari7800/extzp.inc | 11 +++++++++++ libsrc/atari7800/extzp.s | 11 +++++++++++ 2 files changed, 22 insertions(+) create mode 100644 libsrc/atari7800/extzp.inc create mode 100644 libsrc/atari7800/extzp.s diff --git a/libsrc/atari7800/extzp.inc b/libsrc/atari7800/extzp.inc new file mode 100644 index 000000000..7b24ce0d9 --- /dev/null +++ b/libsrc/atari7800/extzp.inc @@ -0,0 +1,11 @@ +; +; extzp.inc for the Atari 7800 +; +; Karri Kaksonen, 2022-04-05 +; +; Assembler include file that imports the runtime zero page locations used +; by the atari7800 runtime, ready for usage in asm code. +; + + .global ptr7800: zp + diff --git a/libsrc/atari7800/extzp.s b/libsrc/atari7800/extzp.s new file mode 100644 index 000000000..384731941 --- /dev/null +++ b/libsrc/atari7800/extzp.s @@ -0,0 +1,11 @@ +; +; Karri Kaksonen, 2022-04-05 +; +; zeropage locations for exclusive use by the library +; + + .include "extzp.inc" + + .segment "EXTZP" : zeropage + +ptr7800: .res 2 From 9caf7cefd8327082ed1eda1c1421b040e0e278ee Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Tue, 5 Apr 2022 11:13:38 +0300 Subject: [PATCH 21/63] Allocate own zp pointer for conio implementation --- cfg/atari7800.cfg | 1 + libsrc/atari7800/cputc.s | 8 ++++---- libsrc/atari7800/setcursor.s | 17 +++++++++-------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/cfg/atari7800.cfg b/cfg/atari7800.cfg index 72922e52e..04216f3bd 100644 --- a/cfg/atari7800.cfg +++ b/cfg/atari7800.cfg @@ -39,6 +39,7 @@ MEMORY { SEGMENTS { ZEROPAGE: load = ZP, type = zp; + EXTZP: load = ZP, type = zp; EXEHDR: load = HEADER, type = ro, optional = yes; STARTUP: load = ROMS, type = ro, define = yes; ONCE: load = ROMS, type = ro, define = yes; diff --git a/libsrc/atari7800/cputc.s b/libsrc/atari7800/cputc.s index 3cf8e9de1..f7614e528 100644 --- a/libsrc/atari7800/cputc.s +++ b/libsrc/atari7800/cputc.s @@ -10,10 +10,10 @@ .import _gotoxy, _gotox, _gotoy, tosaddax, tosumula0, pusha0 .import pushax .import _screen - .importzp ptr3 .import CURS_X, CURS_Y .include "atari7800.inc" + .include "extzp.inc" .data ;----------------------------------------------------------------------------- @@ -132,12 +132,12 @@ txtcolor: lda #<(_screen) ldx #>(_screen) jsr tosaddax - sta ptr3 - stx ptr3+1 + sta ptr7800 + stx ptr7800+1 pla ldy #0 - sta (ptr3),y + sta (ptr7800),y rts .endproc diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index b283fdff0..4400798c3 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -28,10 +28,11 @@ .export CURS_X, CURS_Y .constructor init_cursor - .importzp ptr3, sp + .importzp sp .import _zones .import pusha, incsp1, pusha0, pushax, popax, tosumula0, incax5 .include "atari7800.inc" + .include "extzp.inc" .macpack generic @@ -81,11 +82,11 @@ _cursorzone: clc adc #<_zones sta _cursorzone ; calculate new cursorzone - sta ptr3 + sta ptr7800 txa adc #>_zones sta _cursorzone+1 - sta ptr3+1 + sta ptr7800+1 rts .endproc @@ -112,7 +113,7 @@ _cursorzone: jsr calccursorzone ldy #1 lda #0 - sta (ptr3),y ; disable cursor + sta (ptr7800),y ; disable cursor pla sta CURS_Y jsr calccursorzone @@ -120,7 +121,7 @@ _cursorzone: beq @L1 lda #30 ; enable cursor @L1: ldy #1 - sta (ptr3),y + sta (ptr7800),y rts .endproc @@ -136,15 +137,15 @@ _cursorzone: tay lda _cursorzone ldx _cursorzone+1 - sta ptr3 - stx ptr3+1 + sta ptr7800 + stx ptr7800+1 tya ldy #3 clc rol rol rol - sta (ptr3),y + sta (ptr7800),y rts .endproc From b6e18e14d54f602538befe077359bead3d324957 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Wed, 6 Apr 2022 13:27:47 +0300 Subject: [PATCH 22/63] Add local multiply routine --- libsrc/atari7800/cputc.s | 128 ++++++++++++++++++++++--------------- libsrc/atari7800/extzp.inc | 2 + libsrc/atari7800/extzp.s | 2 + 3 files changed, 82 insertions(+), 50 deletions(-) diff --git a/libsrc/atari7800/cputc.s b/libsrc/atari7800/cputc.s index f7614e528..18904adfb 100644 --- a/libsrc/atari7800/cputc.s +++ b/libsrc/atari7800/cputc.s @@ -7,7 +7,7 @@ .export _cputc .export _textcolor - .import _gotoxy, _gotox, _gotoy, tosaddax, tosumula0, pusha0 + .import _gotoxy, _gotox, _gotoy, tosaddax, pusha0 .import pushax .import _screen .import CURS_X, CURS_Y @@ -18,13 +18,39 @@ .data ;----------------------------------------------------------------------------- ; Holder of the text colour offset -; 0 = red, 42 = green, 82 = white +; 0 = red, 42 = green, 84 = white ; txtcolor: .byte 0 .code +;--------------------------------------------------------------------------- +; 8x16 routine + +umula0: + ldy #8 ; Number of bits + lda #0 + lsr ptr7800 ; Get first bit into carry +@L0: bcc @L1 + + clc + adc ptrtmp + tax + lda ptrtmp+1 ; hi byte of left op + adc ptr7800+1 + sta ptr7800+1 + txa + +@L1: ror ptr7800+1 + ror a + ror ptr7800 + dey + bne @L0 + tax + lda ptr7800 ; Load the result + rts + ;----------------------------------------------------------------------------- ; Change the text colour ; @@ -41,21 +67,21 @@ txtcolor: sec sbc #1 beq @L1 - lda #82 + lda #84 jmp @L2 @L1: lda #42 @L2: ldy txtcolor - sta txtcolor + sta txtcolor ; Store new textcolor tya bne @L3 - rts + rts ; Old colour was 0 @L3: sec sbc #42 bne @L4 lda #1 - rts + rts ; Old colour was 1 @L4: lda #2 - rts + rts ; Old colour was 2 .endproc ;----------------------------------------------------------------------------- @@ -66,79 +92,81 @@ txtcolor: .proc _cputc cmp #$0A ; LF - beq @L3 - cmp #$20 ; ' ' - beq @L1 - - jsr @L5 -@L1: - lda CURS_X - cmp #(charsperline-1) - bne @L2 - jmp @L3 -@L2: - clc - adc #1 - jmp _gotox - -@L3: - lda #0 + bne @L4 +@L1: lda #0 ; newline jsr _gotox lda CURS_Y cmp #(screenrows-1) - bne @L4 + bne @L2 lda #0 - jmp _gotoy -@L4: - clc + beq @L3 +@L2: clc adc #1 - jmp _gotoy +@L3: jmp _gotoy +@L4: + cmp #$20 ; ' ' + bne @L5 + lda #$00 + jmp @L10 @L5: cmp #$3F ; '?' bne @L6 - lda #$01 - jmp @L10 + lda #$02 + jmp @L9 @L6: cmp #$7C ; '|' bne @L7 - lda #$05 - jmp @L10 + lda #$06 + jmp @L9 @L7: cmp #$41 ; >= 'A' bcc @L8 - and #$5F + and #$5F ; make upper case sec - sbc #($41 - 16) - jmp @L10 + sbc #($41 - 17) + jmp @L9 @L8: - sec - sbc #($2A) -@L10: - sec + sec ; >= '*' + sbc #($2A - 1) +@L9: + clc adc txtcolor +@L10: asl pha - lda CURS_Y - jsr pusha0 + lda #0 + sta ptr7800+1 + sta ptrtmp+1 + lda CURS_Y ; Find position on screen buffer + sta ptr7800 lda #charsperline - jsr tosumula0 + sta ptrtmp + jsr umula0 clc adc CURS_X bcc @L11 inx -@L11: jsr pushax - lda #<(_screen) - ldx #>(_screen) - jsr tosaddax +@L11: adc #<(_screen) sta ptr7800 - stx ptr7800+1 + bcc @L12 + inx +@L12: clc + txa + adc #>(_screen) + sta ptr7800+1 - pla + pla ; Print character on screen ldy #0 sta (ptr7800),y - rts + + lda CURS_X ; Increment cursor + cmp #(charsperline-1) + beq @L1 + clc + adc #1 + jmp _gotox .endproc diff --git a/libsrc/atari7800/extzp.inc b/libsrc/atari7800/extzp.inc index 7b24ce0d9..ac1dd7e41 100644 --- a/libsrc/atari7800/extzp.inc +++ b/libsrc/atari7800/extzp.inc @@ -8,4 +8,6 @@ ; .global ptr7800: zp + .global ptrtmp: zp + .global cursorzone: zp diff --git a/libsrc/atari7800/extzp.s b/libsrc/atari7800/extzp.s index 384731941..376674268 100644 --- a/libsrc/atari7800/extzp.s +++ b/libsrc/atari7800/extzp.s @@ -9,3 +9,5 @@ .segment "EXTZP" : zeropage ptr7800: .res 2 +ptrtmp: .res 2 +cursorzone: .res 2 From 3f8c29d303ebf2b59b26759cdf3b883fe94713a8 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Wed, 6 Apr 2022 14:08:03 +0300 Subject: [PATCH 23/63] Use local multiply for cursorzone calculations --- libsrc/atari7800/cputc.s | 2 +- libsrc/atari7800/setcursor.s | 68 ++++++++++++++++++++++++------------ 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/libsrc/atari7800/cputc.s b/libsrc/atari7800/cputc.s index 18904adfb..773227c8a 100644 --- a/libsrc/atari7800/cputc.s +++ b/libsrc/atari7800/cputc.s @@ -7,7 +7,7 @@ .export _cputc .export _textcolor - .import _gotoxy, _gotox, _gotoy, tosaddax, pusha0 + .import _gotoxy, _gotox, _gotoy, pusha0 .import pushax .import _screen .import CURS_X, CURS_Y diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index 4400798c3..dda92f060 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -30,7 +30,7 @@ .importzp sp .import _zones - .import pusha, incsp1, pusha0, pushax, popax, tosumula0, incax5 + .import pusha, incsp1, pusha0, pushax, popax .include "atari7800.inc" .include "extzp.inc" @@ -48,12 +48,34 @@ CURS_Y: _cursor_visible: .byte 1 - .bss -_cursorzone: - .res 2 - .code +;--------------------------------------------------------------------------- +; 8x16 routine + +umula0: + ldy #8 ; Number of bits + lda #0 + lsr ptr7800 ; Get first bit into carry +@L0: bcc @L1 + + clc + adc ptrtmp + tax + lda ptrtmp+1 ; hi byte of left op + adc ptr7800+1 + sta ptr7800+1 + txa + +@L1: ror ptr7800+1 + ror a + ror ptr7800 + dey + bne @L0 + tax + lda ptr7800 ; Load the result + rts + ;----------------------------------------------------------------------------- ; Enable/disable cursor ; @@ -75,18 +97,23 @@ _cursorzone: ; A = CURS_Y .proc calccursorzone - jsr pusha0 - lda #11 - jsr tosumula0 - jsr incax5 - clc - adc #<_zones - sta _cursorzone ; calculate new cursorzone sta ptr7800 + lda #11 + sta ptrtmp + lda #0 + sta ptr7800+1 + sta ptrtmp+1 + jsr umula0 + clc + adc #5 + bcc @L1 + inx +@L1: clc + adc #<_zones + sta cursorzone ; calculate new cursorzone txa adc #>_zones - sta _cursorzone+1 - sta ptr7800+1 + sta cursorzone+1 rts .endproc @@ -113,7 +140,7 @@ _cursorzone: jsr calccursorzone ldy #1 lda #0 - sta (ptr7800),y ; disable cursor + sta (cursorzone),y ; disable cursor pla sta CURS_Y jsr calccursorzone @@ -121,7 +148,7 @@ _cursorzone: beq @L1 lda #30 ; enable cursor @L1: ldy #1 - sta (ptr7800),y + sta (cursorzone),y rts .endproc @@ -134,18 +161,12 @@ _cursorzone: .proc _gotox sta CURS_X - tay - lda _cursorzone - ldx _cursorzone+1 - sta ptr7800 - stx ptr7800+1 - tya ldy #3 clc rol rol rol - sta (ptr7800),y + sta (cursorzone),y rts .endproc @@ -162,6 +183,7 @@ _cursorzone: .endproc .proc gotoxy + jsr popax jmp _gotoxy .endproc ;----------------------------------------------------------------------------- From 6b5c858b2069345532f64f3214721429ac91b2d9 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Thu, 7 Apr 2022 07:22:19 +0300 Subject: [PATCH 24/63] Cleanup --- libsrc/atari7800/clrscr.s | 23 ++++++++++++++++++----- libsrc/atari7800/cputc.s | 4 ++-- libsrc/atari7800/setcursor.s | 8 +++----- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/libsrc/atari7800/clrscr.s b/libsrc/atari7800/clrscr.s index 4d3873499..36af7cce2 100644 --- a/libsrc/atari7800/clrscr.s +++ b/libsrc/atari7800/clrscr.s @@ -4,7 +4,8 @@ .export _clrscr .import _screen - .import pusha0,pushax, __bzero + .import pusha0,pushax + .include "extzp.inc" .code @@ -12,10 +13,22 @@ lda #<(_screen) ldx #>(_screen) - jsr pushax - ldx #>(charsperline * screenrows) - lda #<(charsperline * screenrows) - jmp __bzero + sta ptr7800 + stx ptr7800+1 + ldx #screenrows +@L1: ldy #charsperline + lda #0 +@L2: sta (ptr7800),y + dey + bne @L2 + lda ptr7800 + clc + adc #charsperline + bcc @L3 + inc ptr7800+1 +@L3: dex + bne @L1 + rts .endproc diff --git a/libsrc/atari7800/cputc.s b/libsrc/atari7800/cputc.s index 773227c8a..d954921ff 100644 --- a/libsrc/atari7800/cputc.s +++ b/libsrc/atari7800/cputc.s @@ -152,8 +152,8 @@ umula0: sta ptr7800 bcc @L12 inx -@L12: clc - txa +@L12: txa + clc adc #>(_screen) sta ptr7800+1 diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index dda92f060..81a89144b 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -24,7 +24,7 @@ ; .export _setcursor - .export gotoxy, _gotoxy, _gotox, _gotoy, wherex, wherey + .export gotoxy, _gotoxy, _gotox, _gotoy, _wherex, _wherey .export CURS_X, CURS_Y .constructor init_cursor @@ -189,20 +189,18 @@ umula0: ;----------------------------------------------------------------------------- ; Get cursor X position ; - .proc wherex + .proc _wherex lda CURS_X - jsr pusha0 rts .endproc ;----------------------------------------------------------------------------- ; Get cursor Y position ; - .proc wherey + .proc _wherey lda CURS_Y - jsr pusha0 rts .endproc From 2fb0f6b47d33ca5f5a659a4928041b988a0ce292 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Thu, 7 Apr 2022 07:46:28 +0300 Subject: [PATCH 25/63] Fix screen index bug --- libsrc/atari7800/cputc.s | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libsrc/atari7800/cputc.s b/libsrc/atari7800/cputc.s index d954921ff..8aeb8b9c4 100644 --- a/libsrc/atari7800/cputc.s +++ b/libsrc/atari7800/cputc.s @@ -38,6 +38,7 @@ umula0: adc ptrtmp tax lda ptrtmp+1 ; hi byte of left op + clc adc ptr7800+1 sta ptr7800+1 txa @@ -148,7 +149,8 @@ umula0: adc CURS_X bcc @L11 inx -@L11: adc #<(_screen) +@L11: clc + adc #<(_screen) sta ptr7800 bcc @L12 inx From 7ba7c6f69ac854177f52ab261a1325206b0caf95 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Thu, 7 Apr 2022 08:17:36 +0300 Subject: [PATCH 26/63] Add blinking cursor --- cfg/atari7800.cfg | 2 +- libsrc/atari7800/setcursor.s | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/cfg/atari7800.cfg b/cfg/atari7800.cfg index 04216f3bd..160d1e58e 100644 --- a/cfg/atari7800.cfg +++ b/cfg/atari7800.cfg @@ -10,7 +10,7 @@ SYMBOLS { __ENCRYPT_BOTTOM__: value = $ff7a, type = export; __ENCRYPT_SIZE__: value = $80, type = export; __MEMORY_TOP__: value = __ENCRYPT_BOTTOM__, type = export; - __INIT_SIZE__: value = 139+9, type = export; + __INIT_SIZE__: value = 154, type = export; __MEMORY_INIT__: value = __MEMORY_TOP__ - __INIT_SIZE__, type = export; __MEMORY_BOTTOM__: value = $10000 - __CARTSIZE__, type = weak; __FREE_ROM_SIZE__: value = __MEMORY_INIT__ - __MEMORY_BOTTOM__, type = export; diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index 81a89144b..0b49fe097 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -27,6 +27,7 @@ .export gotoxy, _gotoxy, _gotox, _gotoy, _wherex, _wherey .export CURS_X, CURS_Y .constructor init_cursor + .interruptor blink_cursor .importzp sp .import _zones @@ -47,6 +48,8 @@ CURS_Y: .byte 0 _cursor_visible: .byte 1 +blink_time: + .byte 140 .code @@ -208,7 +211,26 @@ umula0: ; Initialize cursorzone at startup ; Offset to cursor zone 5. ; -; .segment "ONCE" + .proc blink_cursor + inc blink_time + bne @L3 + lda #140 + sta blink_time + ldy #0 + lda (cursorzone),y + bne @L1 + lda #254 + bne @L2 +@L1: lda #0 +@L2: sta (cursorzone),y +@L3: rts + .endproc + +;----------------------------------------------------------------------------- +; Initialize cursorzone at startup +; Offset to cursor zone 5. +; + .segment "ONCE" init_cursor: lda #0 jsr calccursorzone From a05f5137793889dbb4c35e31e996f4ec608dbbf0 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 9 Apr 2022 07:37:07 +0300 Subject: [PATCH 27/63] Remove duplicate code --- libsrc/atari7800/setcursor.s | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index 0b49fe097..69cd5f126 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -23,7 +23,6 @@ ; definitely not allow direct access to the variables. ; - .export _setcursor .export gotoxy, _gotoxy, _gotox, _gotoy, _wherex, _wherey .export CURS_X, CURS_Y .constructor init_cursor @@ -31,6 +30,7 @@ .importzp sp .import _zones + .import cursor .import pusha, incsp1, pusha0, pushax, popax .include "atari7800.inc" .include "extzp.inc" @@ -46,8 +46,6 @@ CURS_X: .byte 0 CURS_Y: .byte 0 -_cursor_visible: - .byte 1 blink_time: .byte 140 @@ -79,18 +77,6 @@ umula0: lda ptr7800 ; Load the result rts -;----------------------------------------------------------------------------- -; Enable/disable cursor -; - .proc _setcursor - - ldx _cursor_visible - sta _cursor_visible - txa - rts - - .endproc - ;----------------------------------------------------------------------------- ; Calculate cursorzone address ; You also need to set the cursorzone to point to the correct cursor Header @@ -147,7 +133,7 @@ umula0: pla sta CURS_Y jsr calccursorzone - lda _cursor_visible + lda cursor beq @L1 lda #30 ; enable cursor @L1: ldy #1 From d287a0afa101ca21e44a200b565725d8710c7b34 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sun, 10 Apr 2022 14:43:18 +0300 Subject: [PATCH 28/63] Change order of gotox gotoy for correct x after newline --- libsrc/atari7800/cputc.s | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libsrc/atari7800/cputc.s b/libsrc/atari7800/cputc.s index 8aeb8b9c4..e1af2765c 100644 --- a/libsrc/atari7800/cputc.s +++ b/libsrc/atari7800/cputc.s @@ -94,16 +94,16 @@ umula0: cmp #$0A ; LF bne @L4 -@L1: lda #0 ; newline - jsr _gotox - lda CURS_Y +@L1: lda CURS_Y ; newline cmp #(screenrows-1) bne @L2 lda #0 beq @L3 @L2: clc adc #1 -@L3: jmp _gotoy +@L3: jsr _gotoy + lda #0 + jmp _gotox @L4: cmp #$20 ; ' ' From 18e27d61625a545f5d0ac6dac4a8470f15257809 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sun, 10 Apr 2022 19:35:29 +0300 Subject: [PATCH 29/63] Change attributes on gotoxy --- libsrc/atari7800/setcursor.s | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index 69cd5f126..34c7562ab 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -31,7 +31,7 @@ .importzp sp .import _zones .import cursor - .import pusha, incsp1, pusha0, pushax, popax + .import pusha, incsp1, pusha0, pushax, popa .include "atari7800.inc" .include "extzp.inc" @@ -166,13 +166,13 @@ umula0: .proc _gotoxy jsr _gotoy - jsr popax + jsr popa jsr _gotox rts .endproc .proc gotoxy - jsr popax + jsr popa jmp _gotoxy .endproc ;----------------------------------------------------------------------------- From 5c648d545d16619c8a40e057716dfb534104ed24 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Thu, 14 Apr 2022 21:52:57 +0300 Subject: [PATCH 30/63] Import conio automatically --- libsrc/atari7800/cputc.s | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libsrc/atari7800/cputc.s b/libsrc/atari7800/cputc.s index e1af2765c..607940332 100644 --- a/libsrc/atari7800/cputc.s +++ b/libsrc/atari7800/cputc.s @@ -172,3 +172,8 @@ umula0: .endproc +;------------------------------------------------------------------------------- +; force the init constructor to be imported + + .import initconio +conio_init = initconio From 81e804ed7f27a8aa23a5db55b0ed1a6eda37360b Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 16 Apr 2022 19:15:06 +0300 Subject: [PATCH 31/63] Split files --- libsrc/atari7800/buildfont160.py | 31 ---------------------------- libsrc/atari7800/font160.png | Bin 2973 -> 0 bytes libsrc/atari7800/font160flipped.png | Bin 2956 -> 0 bytes libsrc/atari7800/wherex.s | 18 ++++++++++++++++ libsrc/atari7800/wherey.s | 19 +++++++++++++++++ 5 files changed, 37 insertions(+), 31 deletions(-) delete mode 100644 libsrc/atari7800/buildfont160.py delete mode 100644 libsrc/atari7800/font160.png delete mode 100644 libsrc/atari7800/font160flipped.png create mode 100644 libsrc/atari7800/wherex.s create mode 100644 libsrc/atari7800/wherey.s diff --git a/libsrc/atari7800/buildfont160.py b/libsrc/atari7800/buildfont160.py deleted file mode 100644 index 30ee02695..000000000 --- a/libsrc/atari7800/buildfont160.py +++ /dev/null @@ -1,31 +0,0 @@ -blen = 0 - -def gb(val): - b = val[0] << 6 - b = b + (val[1] << 4) - b = b + (val[2] << 2) - b = b + val[3] - return '$' + hex(b)[2:4] - -def printline(f, val): - f.write(" .byte " + - gb(val[0:4]) + ', ' + - gb(val[4:8]) + ', ' + - gb(val[8:12]) + ', ' + - gb(val[12:16]) + ', ' + - gb(val[16:20]) + ', ' + - gb(val[20:24]) + ', ' + - gb(val[24:28]) + ', ' + - gb(val[28:32]) + '\n') - -fname='font160' -with open(fname + '.data', 'rb') as f: - data = f.read() -fname= fname + '.s' -with open(fname, 'w') as f: - f.write(" .export _font160\n") - f.write(' .rodata\n') - f.write(' .align 256\n') - f.write("_font160:\n") - for i in range(0, int(len(data)/32)): - printline(f, data[i * 32:i * 32 + 32]) diff --git a/libsrc/atari7800/font160.png b/libsrc/atari7800/font160.png deleted file mode 100644 index 845d91482459f72af2263f7dba0c4c2844fecef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2973 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 AuK)l5 diff --git a/libsrc/atari7800/font160flipped.png b/libsrc/atari7800/font160flipped.png deleted file mode 100644 index ae237c74bc660ca30a72977999a37b3b54e2e726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2956 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 Date: Sat, 16 Apr 2022 19:15:19 +0300 Subject: [PATCH 32/63] Split files --- libsrc/atari7800/cputc.s | 186 +++++++++++++++++------------------ libsrc/atari7800/setcursor.s | 181 +++++++++++++++------------------- libsrc/atari7800/wherex.s | 11 ++- 3 files changed, 181 insertions(+), 197 deletions(-) diff --git a/libsrc/atari7800/cputc.s b/libsrc/atari7800/cputc.s index 607940332..7266190ee 100644 --- a/libsrc/atari7800/cputc.s +++ b/libsrc/atari7800/cputc.s @@ -6,31 +6,31 @@ ; .export _cputc - .export _textcolor - .import _gotoxy, _gotox, _gotoy, pusha0 - .import pushax - .import _screen - .import CURS_X, CURS_Y + .export _textcolor + .import _gotoxy, gotox, gotoy, pusha0 + .import pushax + .import _screen + .import CURS_X, CURS_Y .include "atari7800.inc" .include "extzp.inc" - .data + .data ;----------------------------------------------------------------------------- ; Holder of the text colour offset ; 0 = red, 42 = green, 84 = white ; txtcolor: - .byte 0 + .byte 0 - .code + .code ;--------------------------------------------------------------------------- ; 8x16 routine umula0: ldy #8 ; Number of bits - lda #0 + lda #0 lsr ptr7800 ; Get first bit into carry @L0: bcc @L1 @@ -38,7 +38,7 @@ umula0: adc ptrtmp tax lda ptrtmp+1 ; hi byte of left op - clc + clc adc ptr7800+1 sta ptr7800+1 txa @@ -64,25 +64,25 @@ umula0: ; .proc _textcolor - beq @L2 - sec - sbc #1 - beq @L1 - lda #84 - jmp @L2 -@L1: lda #42 -@L2: ldy txtcolor - sta txtcolor ; Store new textcolor - tya - bne @L3 - rts ; Old colour was 0 -@L3: sec - sbc #42 - bne @L4 - lda #1 - rts ; Old colour was 1 -@L4: lda #2 - rts ; Old colour was 2 + beq @L2 + sec + sbc #1 + beq @L1 + lda #84 + jmp @L2 +@L1: lda #42 +@L2: ldy txtcolor + sta txtcolor ; Store new textcolor + tya + bne @L3 + rts ; Old colour was 0 +@L3: sec + sbc #42 + bne @L4 + lda #1 + rts ; Old colour was 1 +@L4: lda #2 + rts ; Old colour was 2 .endproc ;----------------------------------------------------------------------------- @@ -92,83 +92,83 @@ umula0: ; .proc _cputc - cmp #$0A ; LF + cmp #$0A ; LF bne @L4 -@L1: lda CURS_Y ; newline - cmp #(screenrows-1) +@L1: lda CURS_Y ; newline + cmp #(screenrows-1) bne @L2 - lda #0 - beq @L3 -@L2: clc - adc #1 -@L3: jsr _gotoy - lda #0 - jmp _gotox + lda #0 + beq @L3 +@L2: clc + adc #1 +@L3: jsr gotoy + lda #0 + jmp gotox @L4: - cmp #$20 ; ' ' - bne @L5 - lda #$00 - jmp @L10 + cmp #$20 ; ' ' + bne @L5 + lda #$00 + jmp @L10 @L5: - cmp #$3F ; '?' - bne @L6 - lda #$02 - jmp @L9 + cmp #$3F ; '?' + bne @L6 + lda #$02 + jmp @L9 @L6: - cmp #$7C ; '|' - bne @L7 - lda #$06 - jmp @L9 + cmp #$7C ; '|' + bne @L7 + lda #$06 + jmp @L9 @L7: - cmp #$41 ; >= 'A' - bcc @L8 - and #$5F ; make upper case - sec - sbc #($41 - 17) - jmp @L9 + cmp #$41 ; >= 'A' + bcc @L8 + and #$5F ; make upper case + sec + sbc #($41 - 17) + jmp @L9 @L8: - sec ; >= '*' - sbc #($2A - 1) + sec ; >= '*' + sbc #($2A - 1) @L9: - clc - adc txtcolor + clc + adc txtcolor @L10: - asl - pha + asl + pha - lda #0 - sta ptr7800+1 - sta ptrtmp+1 - lda CURS_Y ; Find position on screen buffer - sta ptr7800 - lda #charsperline - sta ptrtmp - jsr umula0 - clc - adc CURS_X - bcc @L11 - inx -@L11: clc - adc #<(_screen) - sta ptr7800 - bcc @L12 - inx -@L12: txa - clc - adc #>(_screen) - sta ptr7800+1 + lda #0 + sta ptr7800+1 + sta ptrtmp+1 + lda CURS_Y ; Find position on screen buffer + sta ptr7800 + lda #charsperline + sta ptrtmp + jsr umula0 + clc + adc CURS_X + bcc @L11 + inx +@L11: clc + adc #<(_screen) + sta ptr7800 + bcc @L12 + inx +@L12: txa + clc + adc #>(_screen) + sta ptr7800+1 - pla ; Print character on screen - ldy #0 - sta (ptr7800),y + pla ; Print character on screen + ldy #0 + sta (ptr7800),y - lda CURS_X ; Increment cursor - cmp #(charsperline-1) - beq @L1 - clc - adc #1 - jmp _gotox + lda CURS_X ; Increment cursor + cmp #(charsperline-1) + beq @L1 + clc + adc #1 + jmp gotox .endproc diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index 34c7562ab..30151820a 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -23,40 +23,40 @@ ; definitely not allow direct access to the variables. ; - .export gotoxy, _gotoxy, _gotox, _gotoy, _wherex, _wherey - .export CURS_X, CURS_Y + .export gotoxy, _gotoxy, gotox, gotoy + .export CURS_X, CURS_Y .constructor init_cursor .interruptor blink_cursor - .importzp sp - .import _zones - .import cursor - .import pusha, incsp1, pusha0, pushax, popa + .importzp sp + .import _zones + .import cursor + .import pusha, incsp1, pusha0, pushax, popa .include "atari7800.inc" .include "extzp.inc" .macpack generic - .data + .data ;----------------------------------------------------------------------------- ; The variables used by cursor functions ; CURS_X: - .byte 0 + .byte 0 CURS_Y: - .byte 0 + .byte 0 blink_time: - .byte 140 + .byte 140 - .code + .code ;--------------------------------------------------------------------------- ; 8x16 routine umula0: ldy #8 ; Number of bits - lda #0 + lda #0 lsr ptr7800 ; Get first bit into carry @L0: bcc @L1 @@ -86,24 +86,24 @@ umula0: ; A = CURS_Y .proc calccursorzone - sta ptr7800 - lda #11 - sta ptrtmp - lda #0 - sta ptr7800+1 - sta ptrtmp+1 - jsr umula0 - clc - adc #5 - bcc @L1 - inx -@L1: clc - adc #<_zones - sta cursorzone ; calculate new cursorzone - txa - adc #>_zones - sta cursorzone+1 - rts + sta ptr7800 + lda #11 + sta ptrtmp + lda #0 + sta ptr7800+1 + sta ptrtmp+1 + jsr umula0 + clc + adc #5 + bcc @L1 + inx +@L1: clc + adc #<_zones + sta cursorzone ; calculate new cursorzone + txa + adc #>_zones + sta cursorzone+1 + rts .endproc @@ -122,23 +122,23 @@ umula0: ; Enable cursor ; if showcursor cursorzone[1] = 30 ; - .proc _gotoy + .proc gotoy - pha - lda CURS_Y - jsr calccursorzone - ldy #1 - lda #0 - sta (cursorzone),y ; disable cursor - pla - sta CURS_Y - jsr calccursorzone - lda cursor - beq @L1 - lda #30 ; enable cursor -@L1: ldy #1 - sta (cursorzone),y - rts + pha + lda CURS_Y + jsr calccursorzone + ldy #1 + lda #0 + sta (cursorzone),y ; disable cursor + pla + sta CURS_Y + jsr calccursorzone + lda cursor + beq @L1 + lda #30 ; enable cursor +@L1: ldy #1 + sta (cursorzone),y + rts .endproc @@ -147,70 +147,53 @@ umula0: ; You also need to set the hpos offset to the correct value on this line ; cursorzone[3] = 8 * CURS_X ; - .proc _gotox + .proc gotox - sta CURS_X - ldy #3 - clc - rol - rol - rol - sta (cursorzone),y - rts + sta CURS_X + ldy #3 + clc + rol + rol + rol + sta (cursorzone),y + rts .endproc ;----------------------------------------------------------------------------- ; Set cursor to desired position (X,Y) ; - .proc _gotoxy + .proc _gotoxy - jsr _gotoy - jsr popa - jsr _gotox - rts - .endproc + jsr gotoy + jsr popa + jsr gotox + rts + .endproc - .proc gotoxy - jsr popa - jmp _gotoxy - .endproc -;----------------------------------------------------------------------------- -; Get cursor X position -; - .proc _wherex - - lda CURS_X - rts - .endproc - -;----------------------------------------------------------------------------- -; Get cursor Y position -; - .proc _wherey - - lda CURS_Y - rts - .endproc + .proc gotoxy + jsr popa + jmp _gotoxy + .endproc ;----------------------------------------------------------------------------- ; Initialize cursorzone at startup ; Offset to cursor zone 5. ; - .proc blink_cursor - inc blink_time - bne @L3 - lda #140 - sta blink_time - ldy #0 - lda (cursorzone),y - bne @L1 - lda #254 - bne @L2 -@L1: lda #0 -@L2: sta (cursorzone),y -@L3: rts - .endproc + .proc blink_cursor + inc blink_time + bne @L3 + lda #140 + sta blink_time + ldy #0 + lda (cursorzone),y + bne @L1 + lda #254 + bne @L2 +@L1: lda #0 +@L2: sta (cursorzone),y +@L3: rts + .endproc ;----------------------------------------------------------------------------- ; Initialize cursorzone at startup @@ -218,9 +201,9 @@ umula0: ; .segment "ONCE" init_cursor: - lda #0 - jsr calccursorzone - rts + lda #0 + jsr calccursorzone + rts ;----------------------------------------------------------------------------- ; force the init constructor to be imported diff --git a/libsrc/atari7800/wherex.s b/libsrc/atari7800/wherex.s index 3215302ac..f90105c46 100644 --- a/libsrc/atari7800/wherex.s +++ b/libsrc/atari7800/wherex.s @@ -5,14 +5,15 @@ ; .export _wherex - .import CURS_X + .import CURS_X ;----------------------------------------------------------------------------- ; Get cursor X position ; - .proc _wherex + .proc _wherex - lda CURS_X - rts - .endproc + ldx #0 + lda CURS_X + rts + .endproc From 422d245cab2dc16f10b58a5cbc66b60b80237644 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 16 Apr 2022 21:13:51 +0300 Subject: [PATCH 33/63] Split files --- libsrc/atari7800/clrscr.s | 48 ++++++++++++++--------------- libsrc/atari7800/cputc.s | 44 ++------------------------- libsrc/atari7800/setcursor.s | 27 +---------------- libsrc/atari7800/textcolor.s | 58 ++++++++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+), 92 deletions(-) create mode 100644 libsrc/atari7800/textcolor.s diff --git a/libsrc/atari7800/clrscr.s b/libsrc/atari7800/clrscr.s index 36af7cce2..b5b3a1ebf 100644 --- a/libsrc/atari7800/clrscr.s +++ b/libsrc/atari7800/clrscr.s @@ -3,34 +3,34 @@ .export _clrscr - .import _screen - .import pusha0,pushax - .include "extzp.inc" + .import _screen + .import pusha0,pushax + .include "extzp.inc" - .code + .code - .proc _clrscr + .proc _clrscr - lda #<(_screen) - ldx #>(_screen) - sta ptr7800 - stx ptr7800+1 - ldx #screenrows -@L1: ldy #charsperline - lda #0 -@L2: sta (ptr7800),y - dey - bne @L2 - lda ptr7800 - clc - adc #charsperline - bcc @L3 - inc ptr7800+1 -@L3: dex - bne @L1 - rts + lda #<(_screen) + ldx #>(_screen) + sta ptr7800 + stx ptr7800+1 + ldx #screenrows +@L1: ldy #charsperline + lda #0 +@L2: sta (ptr7800),y + dey + bne @L2 + lda ptr7800 + clc + adc #charsperline + bcc @L3 + inc ptr7800+1 +@L3: dex + bne @L1 + rts - .endproc + .endproc ;------------------------------------------------------------------------------- ; force the init constructor to be imported diff --git a/libsrc/atari7800/cputc.s b/libsrc/atari7800/cputc.s index 7266190ee..4d2b8dbf6 100644 --- a/libsrc/atari7800/cputc.s +++ b/libsrc/atari7800/cputc.s @@ -6,23 +6,16 @@ ; .export _cputc - .export _textcolor + .export umula0 .import _gotoxy, gotox, gotoy, pusha0 .import pushax .import _screen .import CURS_X, CURS_Y + .import txtcolor .include "atari7800.inc" .include "extzp.inc" - .data -;----------------------------------------------------------------------------- -; Holder of the text colour offset -; 0 = red, 42 = green, 84 = white -; -txtcolor: - .byte 0 - .code ;--------------------------------------------------------------------------- @@ -52,39 +45,6 @@ umula0: lda ptr7800 ; Load the result rts -;----------------------------------------------------------------------------- -; Change the text colour -; -; Logical colour names are -; 0 = red -; 1 = green -; 2 = white -; -; The routine will also return the previous textcolor -; - .proc _textcolor - - beq @L2 - sec - sbc #1 - beq @L1 - lda #84 - jmp @L2 -@L1: lda #42 -@L2: ldy txtcolor - sta txtcolor ; Store new textcolor - tya - bne @L3 - rts ; Old colour was 0 -@L3: sec - sbc #42 - bne @L4 - lda #1 - rts ; Old colour was 1 -@L4: lda #2 - rts ; Old colour was 2 - .endproc - ;----------------------------------------------------------------------------- ; Put a character on screen ; diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index 30151820a..caaa9c1d5 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -32,6 +32,7 @@ .import _zones .import cursor .import pusha, incsp1, pusha0, pushax, popa + .import umula0 .include "atari7800.inc" .include "extzp.inc" @@ -51,32 +52,6 @@ blink_time: .code -;--------------------------------------------------------------------------- -; 8x16 routine - -umula0: - ldy #8 ; Number of bits - lda #0 - lsr ptr7800 ; Get first bit into carry -@L0: bcc @L1 - - clc - adc ptrtmp - tax - lda ptrtmp+1 ; hi byte of left op - adc ptr7800+1 - sta ptr7800+1 - txa - -@L1: ror ptr7800+1 - ror a - ror ptr7800 - dey - bne @L0 - tax - lda ptr7800 ; Load the result - rts - ;----------------------------------------------------------------------------- ; Calculate cursorzone address ; You also need to set the cursorzone to point to the correct cursor Header diff --git a/libsrc/atari7800/textcolor.s b/libsrc/atari7800/textcolor.s new file mode 100644 index 000000000..6ccbcf491 --- /dev/null +++ b/libsrc/atari7800/textcolor.s @@ -0,0 +1,58 @@ +; +; Karri Kaksonen, 2022-04-16 +; +; + + .export _textcolor + .export txtcolor + + .include "atari7800.inc" + + .data +;----------------------------------------------------------------------------- +; Holder of the text colour offset +; 0 = red, 42 = green, 84 = white +; +txtcolor: + .byte 0 + + .code + +;----------------------------------------------------------------------------- +; Change the text colour +; +; Logical colour names are +; 0 = red +; 1 = green +; 2 = white +; +; The routine will also return the previous textcolor +; + .proc _textcolor + + beq @L2 + sec + sbc #1 + beq @L1 + lda #84 + jmp @L2 +@L1: lda #42 +@L2: ldy txtcolor + sta txtcolor ; Store new textcolor + tya + bne @L3 + rts ; Old colour was 0 +@L3: sec + sbc #42 + bne @L4 + lda #1 + rts ; Old colour was 1 +@L4: lda #2 + rts ; Old colour was 2 + .endproc + +;------------------------------------------------------------------------------- +; force the init constructor to be imported + + .import initconio +conio_init = initconio From ce4d1e0e54c010ef58b634120bf40cad7ae37e8b Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 16 Apr 2022 21:21:27 +0300 Subject: [PATCH 34/63] Remove obsolete file and fix tabs --- asminc/atari7800.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asminc/atari7800.inc b/asminc/atari7800.inc index 5b725c1c3..93e990870 100644 --- a/asminc/atari7800.inc +++ b/asminc/atari7800.inc @@ -8,6 +8,6 @@ .include "atari7800_maria.inc" ; constants for the conio implementation -charsperline = 20 -screenrows = 28 +charsperline = 20 +screenrows = 28 From ecd1040e070e7dff3e4ce21b12f805b8c4abad09 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 16 Apr 2022 21:21:35 +0300 Subject: [PATCH 35/63] Remove obsolete file and fix tabs --- libsrc/atari7800/font160.data | Bin 8192 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 libsrc/atari7800/font160.data diff --git a/libsrc/atari7800/font160.data b/libsrc/atari7800/font160.data deleted file mode 100644 index dfbf65b63f56b90ca4a3837ce4e7e3309ecc4bce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeHI3zpk32uybGf9En^;lxP~(CV!P48sWL3Gd^f^?W>@cpNHfaB;xB}R!U!ODg{C^Vt_3Fz%G5?tCjCX7pjpaPCz`j}nDme+n zis&$%c&ySo8E}y5yBvvRee%SrYr+JIn6Ek=4L*xdVBIlTF0tT5$VV4p0Kv>f>V-Fz zKbU{ae8xK#)mV+?{9pmSS^_BuLFE>xkwX=!hu%c=dAbhLX%S@8>MRM{F%(5OE1X(( zZe6I&0xcVz32UihKrnMhkEe)EpT?}SQ+B$I(wlGM>UVJsnR0I$lK)!2ZCNI+F zrM?#(+FY8#M9A-ihh-q)njJ-9zG8=Y;Smm(atUlp!1sxPj~(BXw?3LMfo0|=7mV-a z`Q16@39Nq4oKHsmY+mYn(J78iQ`qptOn6wz)9k1!m9LoavzteQ?cxL&TO8jf20qp~ zL1(9jZ9Tzak*klF^!%ml%qAv2wD0pz4Q-Gi86jRrFaw;zd@x$k+`y#`)~a81f?bT*XYTSE zFp_|CDdO(28DsCDslmLQGSKp5fKQwp_*3r$eaMA47HPzX_I>`Tp-p9|WiPVTwru#c zI4K8S+lWRRCXJ{YoDO}Ld+U+G!dPG_GGv^0U0a5w1XZcbV`Ao+mZ&Q4Q%p{dMZusx zK2!y1hQ&QQz1d=itukYHo#yCBHdrCHuL%3~;Ty7(^OkOq9l}2gGr_?)7nw=lb6s)K z&zQsub6Lrq0_vQQXHnFN@>gs*bp#xMtpbHfNM7{tIIJ#%0{>)>E?<4s;UFJplrlJH zJ^hI6zF0XMFZ-FmL9}qmu@a9xV-kFKmyE*pz5$SuZ0?fo*a9m|>N)gIMKafbk7hTa7i4g1(5$x(D z#GxF8Qp;{4fDT-jJay3qiLmyLzA-YvVutn6Wq+$quSM19imJ$dKO#P!k~yA-UN#Tb zV7TL77Soyo4NADF3&EU(q3s!Z^8-XHF|6mT|NkMVGveup92l!C-VYyVGk}|a*zrOzCt-zzXZ)^~azkJdDi+yu*8l%I{nke` zEX1)UrUYSZe&U{(r@4XBlBP|NTH01*U~=Qp?d{?{*9>S-!nzE=1m+M<4qV~)Hp%iA z*>l$a|66N!&Dz;w#moFF(HtB>htHU&x!b?@YMD!KIJZmx8hek6zdO9%-8?A0|DFX* zK`=_NV9m*%8H}3fw}hUB$yZR`Il~7~%G*goz7I7RA6}_;68mRK$;Bc7FE%v2Cf%$-95XY0C9Isg|8rUSiX42aToLl*bpqg{>!`uFF43$oJW`+uwC5_0JO8 z#Ue;e`S|S+a9lF8Uw%yw8t%JiHDl?}go!c}RAWI(-mU5HiK**Zm@Wn7AtdA-XO(}F zgF#0R3H198f!=g^y3dGQEQ;XAZXA8=m2sTA%PYNeFTV2N;qGe!U=pUD0N^IbcD!K9 zSO;+VY)T>FNyO$raLGqPjnZRee!FCxmc<8o*MEw^d3^x5cI70PiJH61E3MXUcjdvu zUDpJ_BuqU4z)g_tc)^sh4&d_HltRLjh|PiEl8=PirN_wpcF8y`ix2Xy{}hAs`T%h4 z%1JO+eC{%@v|78}l?M-ZUlRb6F!clgH$k@J1yja4fXio73JFglHV1-BJ`!q|9wYPH YCF8U#KFGWNQw+}Q1HiQ_7eO`i2mhTJ6#xJL From 702045cce1ba9842b0fc80375784d01e7181b6fa Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 16 Apr 2022 21:22:44 +0300 Subject: [PATCH 36/63] Fix tabs --- libsrc/atari7800/conio.s | 316 +++++++++++++++++++-------------------- 1 file changed, 158 insertions(+), 158 deletions(-) diff --git a/libsrc/atari7800/conio.s b/libsrc/atari7800/conio.s index 777de004b..ad1c4a976 100644 --- a/libsrc/atari7800/conio.s +++ b/libsrc/atari7800/conio.s @@ -8,11 +8,11 @@ .constructor initconio .include "atari7800.inc" - .import _font160 - .import _get_tv - .export _screen - .export _zones - .export _dll + .import _font160 + .import _get_tv + .export _screen + .export _zones + .export _dll .bss _screen: @@ -22,43 +22,43 @@ _screen: ; Macros used to generate lists .macro DLLentry offset, addr - .byte offset - .byte >addr - .byte addr + .byte addr - .byte hpos + .byte addr + .byte hpos .endmacro .macro XHeader addr, flags, palwidth, hpos - .byte addr - .byte palwidth - .byte hpos + .byte addr + .byte palwidth + .byte hpos .endmacro .macro TextZone row - ; Text - .byte <(_screen + row * charsperline) - .byte $60 - .byte >(_screen + row * charsperline) - .byte 12 - .byte 0 - ; Cursor - .byte 254 - .byte 0 - .byte >_font160 - .byte 0 + ; Text + .byte <(_screen + row * charsperline) + .byte $60 + .byte >(_screen + row * charsperline) + .byte 12 + .byte 0 + ; Cursor + .byte 254 + .byte 0 + .byte >_font160 + .byte 0 .endmacro ;----------------------------------------------------------------------------- @@ -68,155 +68,155 @@ _screen: .data _zones: -zone0: TextZone 0 -nh: NullHeader 0, 0 -zone1: TextZone 1 - NullHeader 0, 0 -zone2: TextZone 2 - NullHeader 0, 0 -zone3: TextZone 3 - NullHeader 0, 0 -zone4: TextZone 4 - NullHeader 0, 0 -zone5: TextZone 5 - NullHeader 0, 0 -zone6: TextZone 6 - NullHeader 0, 0 -zone7: TextZone 7 - NullHeader 0, 0 -zone8: TextZone 8 - NullHeader 0, 0 -zone9: TextZone 9 - NullHeader 0, 0 -zone10: TextZone 10 - NullHeader 0, 0 -zone11: TextZone 11 - NullHeader 0, 0 -zone12: TextZone 12 - NullHeader 0, 0 -zone13: TextZone 13 - NullHeader 0, 0 -zone14: TextZone 14 - NullHeader 0, 0 -zone15: TextZone 15 - NullHeader 0, 0 -zone16: TextZone 16 - NullHeader 0, 0 -zone17: TextZone 17 - NullHeader 0, 0 -zone18: TextZone 18 - NullHeader 0, 0 -zone19: TextZone 19 - NullHeader 0, 0 -zone20: TextZone 20 - NullHeader 0, 0 -zone21: TextZone 21 - NullHeader 0, 0 -zone22: TextZone 22 - NullHeader 0, 0 -zone23: TextZone 23 - NullHeader 0, 0 -zone24: TextZone 24 - NullHeader 0, 0 -zone25: TextZone 25 - NullHeader 0, 0 -zone26: TextZone 26 - NullHeader 0, 0 -zone27: TextZone 27 - NullHeader 0, 0 +zone0: TextZone 0 +nh: NullHeader 0, 0 +zone1: TextZone 1 + NullHeader 0, 0 +zone2: TextZone 2 + NullHeader 0, 0 +zone3: TextZone 3 + NullHeader 0, 0 +zone4: TextZone 4 + NullHeader 0, 0 +zone5: TextZone 5 + NullHeader 0, 0 +zone6: TextZone 6 + NullHeader 0, 0 +zone7: TextZone 7 + NullHeader 0, 0 +zone8: TextZone 8 + NullHeader 0, 0 +zone9: TextZone 9 + NullHeader 0, 0 +zone10: TextZone 10 + NullHeader 0, 0 +zone11: TextZone 11 + NullHeader 0, 0 +zone12: TextZone 12 + NullHeader 0, 0 +zone13: TextZone 13 + NullHeader 0, 0 +zone14: TextZone 14 + NullHeader 0, 0 +zone15: TextZone 15 + NullHeader 0, 0 +zone16: TextZone 16 + NullHeader 0, 0 +zone17: TextZone 17 + NullHeader 0, 0 +zone18: TextZone 18 + NullHeader 0, 0 +zone19: TextZone 19 + NullHeader 0, 0 +zone20: TextZone 20 + NullHeader 0, 0 +zone21: TextZone 21 + NullHeader 0, 0 +zone22: TextZone 22 + NullHeader 0, 0 +zone23: TextZone 23 + NullHeader 0, 0 +zone24: TextZone 24 + NullHeader 0, 0 +zone25: TextZone 25 + NullHeader 0, 0 +zone26: TextZone 26 + NullHeader 0, 0 +zone27: TextZone 27 + NullHeader 0, 0 _dll: -PALscanlines: ; 25 lines - DLLentry 15, nh - DLLentry 8, nh +PALscanlines: ; 25 lines + DLLentry 15, nh + DLLentry 8, nh -Topscanlines: ; 9 lines - DLLentry 8, nh +Topscanlines: ; 9 lines + DLLentry 8, nh Displaylines: - DLLentry $80+7, zone0 ; NMI interrupt from end of prev zone - DLLentry 7, zone1 - DLLentry 7, zone2 - DLLentry 7, zone3 - DLLentry 7, zone4 - DLLentry 7, zone5 - DLLentry 7, zone6 - DLLentry 7, zone7 - DLLentry 7, zone8 - DLLentry 7, zone9 - DLLentry 7, zone10 - DLLentry 7, zone11 - DLLentry 7, zone12 - DLLentry 7, zone13 - DLLentry 7, zone14 - DLLentry 7, zone15 - DLLentry 7, zone16 - DLLentry 7, zone17 - DLLentry 7, zone18 - DLLentry 7, zone19 - DLLentry 7, zone20 - DLLentry 7, zone21 - DLLentry 7, zone22 - DLLentry 7, zone23 - DLLentry 7, zone24 - DLLentry 7, zone25 - DLLentry 7, zone26 - DLLentry 7, zone27 + DLLentry $80+7, zone0 ; NMI interrupt from end of prev zone + DLLentry 7, zone1 + DLLentry 7, zone2 + DLLentry 7, zone3 + DLLentry 7, zone4 + DLLentry 7, zone5 + DLLentry 7, zone6 + DLLentry 7, zone7 + DLLentry 7, zone8 + DLLentry 7, zone9 + DLLentry 7, zone10 + DLLentry 7, zone11 + DLLentry 7, zone12 + DLLentry 7, zone13 + DLLentry 7, zone14 + DLLentry 7, zone15 + DLLentry 7, zone16 + DLLentry 7, zone17 + DLLentry 7, zone18 + DLLentry 7, zone19 + DLLentry 7, zone20 + DLLentry 7, zone21 + DLLentry 7, zone22 + DLLentry 7, zone23 + DLLentry 7, zone24 + DLLentry 7, zone25 + DLLentry 7, zone26 + DLLentry 7, zone27 Bottomscanlines: - DLLentry $80+15, nh ; NMI interrupt at end of display - DLLentry 9, nh - DLLentry 15, nh - DLLentry 8, nh + DLLentry $80+15, nh ; NMI interrupt at end of display + DLLentry 9, nh + DLLentry 15, nh + DLLentry 8, nh ;----------------------------------------------------------------------------- ; Set up the screen to 320a mode ; .segment "ONCE" -CTRL_MODE160 .set 0 -CTRL_MODEAC .set 3 -CTRL_KANGOFF .set 0 -CTRL_BCBLACK .set 0 -CTRL_CHAR1B .set 0 -CTRL_CHAR2B .set $10 -CTRL_DMAON .set $40 -CTRL_CKOFF .set 0 +CTRL_MODE160 .set 0 +CTRL_MODEAC .set 3 +CTRL_KANGOFF .set 0 +CTRL_BCBLACK .set 0 +CTRL_CHAR1B .set 0 +CTRL_CHAR2B .set $10 +CTRL_DMAON .set $40 +CTRL_CKOFF .set 0 ;----------------------------------------------------------------------------- ; Initialize the conio display lists and zones ; .proc initconio - jsr _get_tv - bne pal - lda #Topscanlines - sta DPPH - jmp vblankon -pal: lda #PALscanlines - sta DPPH + jsr _get_tv + bne pal + lda #Topscanlines + sta DPPH + jmp vblankon +pal: lda #PALscanlines + sta DPPH vblankon: - lda MSTAT - bmi vblankon + lda MSTAT + bmi vblankon vblankoff: - lda MSTAT - bpl vblankoff - lda #>_font160 - sta CHBASE - lda #(CTRL_MODE160 | CTRL_KANGOFF | CTRL_BCBLACK | CTRL_CHAR2B | CTRL_DMAON | CTRL_CKOFF) - sta CTRL - lda #$00 ; Black background - sta BKGRND - lda #$33 ; Red - sta P0C1 - lda #$c8 ; Green - sta P0C2 - lda #$0f ; White - sta P0C3 + lda MSTAT + bpl vblankoff + lda #>_font160 + sta CHBASE + lda #(CTRL_MODE160 | CTRL_KANGOFF | CTRL_BCBLACK | CTRL_CHAR2B | CTRL_DMAON | CTRL_CKOFF) + sta CTRL + lda #$00 ; Black background + sta BKGRND + lda #$33 ; Red + sta P0C1 + lda #$c8 ; Green + sta P0C2 + lda #$0f ; White + sta P0C3 rts .endproc From 1585a0532a876474f8caa89618e20104971d38c5 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 16 Apr 2022 21:32:22 +0300 Subject: [PATCH 37/63] Add x=0 to textcolor --- libsrc/atari7800/textcolor.s | 1 + 1 file changed, 1 insertion(+) diff --git a/libsrc/atari7800/textcolor.s b/libsrc/atari7800/textcolor.s index 6ccbcf491..be98ed340 100644 --- a/libsrc/atari7800/textcolor.s +++ b/libsrc/atari7800/textcolor.s @@ -39,6 +39,7 @@ txtcolor: @L1: lda #42 @L2: ldy txtcolor sta txtcolor ; Store new textcolor + ldx #0 tya bne @L3 rts ; Old colour was 0 From 1486886e13366a470b54f1573756683371fc8505 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 16 Apr 2022 21:48:57 +0300 Subject: [PATCH 38/63] Add info --- libsrc/atari7800/font160.s | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/libsrc/atari7800/font160.s b/libsrc/atari7800/font160.s index e5ebbede2..00b62c36a 100644 --- a/libsrc/atari7800/font160.s +++ b/libsrc/atari7800/font160.s @@ -1,3 +1,21 @@ +; The internal font structure for Atari7800 needs a full set of 128 +; characters. Each character is 16 x 8 bits. +; The font consists of 8 rows of data: +: row7 +; row6 +; row5 +; row4 +; row3 +; row2 +; row1 +; row0 +; Each row is 256 bytes long +; As we have 2 bits per pixel we need 2 bytes to represent +; one character. So we can fit 128 characters in this font +; When you later use the font you must address the characters as +; 0, 2, 4, 6, ... 254 +; Odd indices cannot be used. + .export _font160 .rodata .align 256 From 9fecf0b2cc70f08743120b396478f0b45ed58abb Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 16 Apr 2022 21:54:52 +0300 Subject: [PATCH 39/63] Add info --- libsrc/atari7800/font160.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsrc/atari7800/font160.s b/libsrc/atari7800/font160.s index 00b62c36a..69c5774ab 100644 --- a/libsrc/atari7800/font160.s +++ b/libsrc/atari7800/font160.s @@ -1,7 +1,7 @@ ; The internal font structure for Atari7800 needs a full set of 128 ; characters. Each character is 16 x 8 bits. ; The font consists of 8 rows of data: -: row7 +; row7 ; row6 ; row5 ; row4 From 4fc12701102b5b331e7252ea213ace05d0144b53 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 18 Apr 2022 11:59:06 +0300 Subject: [PATCH 40/63] Add mono conio files --- libsrc/atari7800/extra/mono.s | 28 + libsrc/atari7800/mono_clrscr.s | 39 + libsrc/atari7800/mono_conio.s | 227 ++++ libsrc/atari7800/mono_cputc.s | 102 ++ libsrc/atari7800/mono_font.s | 2052 +++++++++++++++++++++++++++++ libsrc/atari7800/mono_setcursor.s | 208 +++ 6 files changed, 2656 insertions(+) create mode 100644 libsrc/atari7800/extra/mono.s create mode 100644 libsrc/atari7800/mono_clrscr.s create mode 100644 libsrc/atari7800/mono_conio.s create mode 100644 libsrc/atari7800/mono_cputc.s create mode 100644 libsrc/atari7800/mono_font.s create mode 100644 libsrc/atari7800/mono_setcursor.s diff --git a/libsrc/atari7800/extra/mono.s b/libsrc/atari7800/extra/mono.s new file mode 100644 index 000000000..5d99fc02a --- /dev/null +++ b/libsrc/atari7800/extra/mono.s @@ -0,0 +1,28 @@ +; +; Groepaz/Hitmen, 19.10.2015 +; +; import/overload stubs for the monochrome conio implementation +; + + ; mono_conio.s + .import _mono_screen + .export _screen := _mono_screen + + ; mono_clrscr.s + .import _mono_clrscr + .export _clrscr := _mono_clrscr + + ; mono_cputc.s + .import _mono_cputc + .export _cputc := _mono_cputc + + ; mono_font.s + .import _mono_font + .export _font := _mono_font + + ; mono_setcursor.s + .import mono_gotoxy + .export gotoxy := mono_gotoxy + .import _mono_gotoxy + .export _gotoxy := _mono_gotoxy + diff --git a/libsrc/atari7800/mono_clrscr.s b/libsrc/atari7800/mono_clrscr.s new file mode 100644 index 000000000..e6137d684 --- /dev/null +++ b/libsrc/atari7800/mono_clrscr.s @@ -0,0 +1,39 @@ + + .include "atari7800.inc" + + .export _mono_clrscr + + .import _screen + .import pusha0,pushax + .include "extzp.inc" + + .code + + .proc _mono_clrscr + + lda #<_screen + ldx #>_screen + sta ptr7800 + stx ptr7800+1 + ldx #screenrows +@L1: ldy #mono_charsperline + lda #0 +@L2: sta (ptr7800),y + dey + bne @L2 + lda ptr7800 + clc + adc #mono_charsperline + bcc @L3 + inc ptr7800+1 +@L3: dex + bne @L1 + rts + + .endproc + +;------------------------------------------------------------------------------- +; force the init constructor to be imported + + .import mono_initconio +conio_init = mono_initconio diff --git a/libsrc/atari7800/mono_conio.s b/libsrc/atari7800/mono_conio.s new file mode 100644 index 000000000..51ecc93b8 --- /dev/null +++ b/libsrc/atari7800/mono_conio.s @@ -0,0 +1,227 @@ +; +; 2022-04-02, Karri Kaksonen +; +; The Atari 7800 has only 4k of RAM. So for a generic conio implementation +; the best alternative is to use indirect tile mapping with a character +; frame buffer +; + + .constructor mono_initconio + .include "atari7800.inc" + .include "extzp.inc" + .import _mono_font + .import _get_tv + .export _mono_screen + .export _mono_zones + .export _mono_dll + + .bss +_mono_screen: + .res mono_charsperline * screenrows + +;---------------------------------------------------------------------------- +; Macros used to generate lists + +.macro DLLentry offset, addr + .byte offset + .byte >addr + .byte addr + .byte hpos +.endmacro + +.macro XHeader addr, flags, palwidth, hpos + .byte addr + .byte palwidth + .byte hpos +.endmacro + +.macro TextZone row + ; Text + .byte <(_mono_screen + 2 * row * charsperline) + .byte $60 + .byte >(_mono_screen + 2 * row * charsperline) + .byte 12 + .byte 0 + .byte <(_mono_screen + 2 * row * charsperline + charsperline) + .byte $60 + .byte >(_mono_screen + 2 * row * charsperline + charsperline) + .byte 12 + .byte 80 + ; Cursor + .byte 95 + .byte 0 + .byte >_mono_font + .byte 0 +.endmacro + +;----------------------------------------------------------------------------- +; The Atari 7800 has only 4k of RAM. So for a generic conio implementation +; the best alternative is to use indirect tile mapping with a character +; frame buffer + .data + +_mono_zones: +zone0: TextZone 0 +nh: NullHeader 0, 0 +zone1: TextZone 1 + NullHeader 0, 0 +zone2: TextZone 2 + NullHeader 0, 0 +zone3: TextZone 3 + NullHeader 0, 0 +zone4: TextZone 4 + NullHeader 0, 0 +zone5: TextZone 5 + NullHeader 0, 0 +zone6: TextZone 6 + NullHeader 0, 0 +zone7: TextZone 7 + NullHeader 0, 0 +zone8: TextZone 8 + NullHeader 0, 0 +zone9: TextZone 9 + NullHeader 0, 0 +zone10: TextZone 10 + NullHeader 0, 0 +zone11: TextZone 11 + NullHeader 0, 0 +zone12: TextZone 12 + NullHeader 0, 0 +zone13: TextZone 13 + NullHeader 0, 0 +zone14: TextZone 14 + NullHeader 0, 0 +zone15: TextZone 15 + NullHeader 0, 0 +zone16: TextZone 16 + NullHeader 0, 0 +zone17: TextZone 17 + NullHeader 0, 0 +zone18: TextZone 18 + NullHeader 0, 0 +zone19: TextZone 19 + NullHeader 0, 0 +zone20: TextZone 20 + NullHeader 0, 0 +zone21: TextZone 21 + NullHeader 0, 0 +zone22: TextZone 22 + NullHeader 0, 0 +zone23: TextZone 23 + NullHeader 0, 0 +zone24: TextZone 24 + NullHeader 0, 0 +zone25: TextZone 25 + NullHeader 0, 0 +zone26: TextZone 26 + NullHeader 0, 0 +zone27: TextZone 27 + NullHeader 0, 0 + +_mono_dll: +PALscanlines: ; 25 lines + DLLentry 15, nh + DLLentry 8, nh + +Topscanlines: ; 9 lines + DLLentry 8, nh + +Displaylines: + DLLentry $80+7, zone0 ; NMI interrupt from end of prev zone + DLLentry 7, zone1 + DLLentry 7, zone2 + DLLentry 7, zone3 + DLLentry 7, zone4 + DLLentry 7, zone5 + DLLentry 7, zone6 + DLLentry 7, zone7 + DLLentry 7, zone8 + DLLentry 7, zone9 + DLLentry 7, zone10 + DLLentry 7, zone11 + DLLentry 7, zone12 + DLLentry 7, zone13 + DLLentry 7, zone14 + DLLentry 7, zone15 + DLLentry 7, zone16 + DLLentry 7, zone17 + DLLentry 7, zone18 + DLLentry 7, zone19 + DLLentry 7, zone20 + DLLentry 7, zone21 + DLLentry 7, zone22 + DLLentry 7, zone23 + DLLentry 7, zone24 + DLLentry 7, zone25 + DLLentry 7, zone26 + DLLentry 7, zone27 + +Bottomscanlines: + DLLentry $80+15, nh ; NMI interrupt at end of display + DLLentry 9, nh + DLLentry 15, nh + DLLentry 8, nh + +;----------------------------------------------------------------------------- +; Set up the screen to 320a mode +; + .segment "ONCE" + +CTRL_MODE160 .set 0 +CTRL_MODEAC .set 3 +CTRL_KANGOFF .set 0 +CTRL_BCBLACK .set 0 +CTRL_CHAR1B .set 0 +CTRL_CHAR2B .set $10 +CTRL_DMAON .set $40 +CTRL_CKOFF .set 0 + +;----------------------------------------------------------------------------- +; Initialize the conio display lists and zones +; + .proc mono_initconio + + jsr _get_tv + bne pal + lda #Topscanlines + sta DPPH + jmp vblankon +pal: lda #PALscanlines + sta DPPH +vblankon: + lda MSTAT + bmi vblankon +vblankoff: + lda MSTAT + bpl vblankoff + lda #>_mono_font + sta CHBASE + lda #(CTRL_MODEAC | CTRL_KANGOFF | CTRL_BCBLACK | CTRL_CHAR1B | CTRL_DMAON | CTRL_CKOFF) + sta CTRL + lda #$00 ; Black background + sta BKGRND + sta CURS_X + sta CURS_Y + lda #$0f ; White + sta P0C1 + rts + + .endproc + diff --git a/libsrc/atari7800/mono_cputc.s b/libsrc/atari7800/mono_cputc.s new file mode 100644 index 000000000..5735749ea --- /dev/null +++ b/libsrc/atari7800/mono_cputc.s @@ -0,0 +1,102 @@ +; +; Mark Keates, Christian Groessler, Piotr Fusik, Karri Kaksonen +; +; void cputcxy (unsigned char x, unsigned char y, char c); +; void cputc (char c); +; + + .export _mono_cputc + .import _mono_gotoxy, _mono_gotox, _mono_gotoy, pusha0 + .import pushax + .import _mono_screen + + .include "atari7800.inc" + .include "extzp.inc" + + .code + +;--------------------------------------------------------------------------- +; 8x16 routine + +umula0: + ldy #8 ; Number of bits + lda #0 + lsr ptr7800 ; Get first bit into carry +@L0: bcc @L1 + + clc + adc ptrtmp + tax + lda ptrtmp+1 ; hi byte of left op + clc + adc ptr7800+1 + sta ptr7800+1 + txa + +@L1: ror ptr7800+1 + ror a + ror ptr7800 + dey + bne @L0 + tax + lda ptr7800 ; Load the result + rts + +;----------------------------------------------------------------------------- +; Put a character on screen +; +; The code will handle newlines that wrap to start of screen +; + .proc _mono_cputc + + cmp #$0A ; LF + bne @L4 +@L1: lda #0 ; newline + jsr _mono_gotox + lda CURS_Y + cmp #(screenrows-1) + bne @L2 + lda #0 + beq @L3 +@L2: clc + adc #1 +@L3: jmp _mono_gotoy + +@L4: + pha + + lda #0 + sta ptr7800+1 + sta ptrtmp+1 + lda CURS_Y ; Find position on screen buffer + sta ptr7800 + lda #mono_charsperline + sta ptrtmp + jsr umula0 + clc + adc CURS_X + bcc @L11 + inx +@L11: clc + adc #<(_mono_screen) + sta ptr7800 + bcc @L12 + inx +@L12: txa + clc + adc #>(_mono_screen) + sta ptr7800+1 + + pla ; Print character on screen + ldy #0 + sta (ptr7800),y + + lda CURS_X ; Increment cursor + cmp #(mono_charsperline-1) + beq @L1 + clc + adc #1 + jmp _mono_gotox + + .endproc + diff --git a/libsrc/atari7800/mono_font.s b/libsrc/atari7800/mono_font.s new file mode 100644 index 000000000..3c828544a --- /dev/null +++ b/libsrc/atari7800/mono_font.s @@ -0,0 +1,2052 @@ + .export _mono_font + .segment "RODATA" + .align 256 +_mono_font: + .byte $00 + .byte $7e + .byte $7e + .byte $00 + .byte $00 + .byte $7c + .byte $7c + .byte $00 + .byte $ff + .byte $00 + .byte $ff + .byte $78 + .byte $18 + .byte $e0 + .byte $c0 + .byte $99 + .byte $00 + .byte $00 + .byte $18 + .byte $00 + .byte $00 + .byte $78 + .byte $00 + .byte $ff + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $60 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $60 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $ff + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $f8 + .byte $00 + .byte $00 + .byte $78 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $f0 + .byte $1e + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $f8 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $78 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $38 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $f8 + .byte $00 + .byte $00 + .byte $18 + .byte $00 + .byte $30 + .byte $c7 + .byte $70 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $0f + .byte $03 + .byte $00 + .byte $00 + .byte $00 + .byte $88 + .byte $aa + .byte $ee + .byte $18 + .byte $18 + .byte $18 + .byte $36 + .byte $36 + .byte $18 + .byte $36 + .byte $36 + .byte $36 + .byte $00 + .byte $00 + .byte $00 + .byte $18 + .byte $00 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $00 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $18 + .byte $36 + .byte $36 + .byte $18 + .byte $00 + .byte $18 + .byte $ff + .byte $ff + .byte $f0 + .byte $0f + .byte $00 + .byte $00 + .byte $c0 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $c0 + .byte $00 + .byte $fc + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $c0 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $18 + .byte $70 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $1c + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $81 + .byte $ff + .byte $10 + .byte $10 + .byte $38 + .byte $38 + .byte $00 + .byte $ff + .byte $3c + .byte $c3 + .byte $cc + .byte $7e + .byte $f0 + .byte $e6 + .byte $5a + .byte $80 + .byte $02 + .byte $3c + .byte $66 + .byte $1b + .byte $cc + .byte $7e + .byte $18 + .byte $18 + .byte $18 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $30 + .byte $00 + .byte $6c + .byte $30 + .byte $c6 + .byte $76 + .byte $00 + .byte $18 + .byte $60 + .byte $00 + .byte $00 + .byte $30 + .byte $00 + .byte $30 + .byte $80 + .byte $7c + .byte $fc + .byte $fc + .byte $78 + .byte $1e + .byte $78 + .byte $78 + .byte $30 + .byte $78 + .byte $70 + .byte $30 + .byte $30 + .byte $18 + .byte $00 + .byte $60 + .byte $30 + .byte $78 + .byte $cc + .byte $fc + .byte $3c + .byte $f8 + .byte $fe + .byte $f0 + .byte $3e + .byte $cc + .byte $78 + .byte $78 + .byte $e6 + .byte $fe + .byte $c6 + .byte $c6 + .byte $38 + .byte $f0 + .byte $1c + .byte $e6 + .byte $78 + .byte $78 + .byte $fc + .byte $30 + .byte $c6 + .byte $c6 + .byte $78 + .byte $fe + .byte $78 + .byte $02 + .byte $78 + .byte $00 + .byte $00 + .byte $00 + .byte $76 + .byte $dc + .byte $78 + .byte $76 + .byte $78 + .byte $f0 + .byte $0c + .byte $e6 + .byte $78 + .byte $cc + .byte $e6 + .byte $78 + .byte $c6 + .byte $cc + .byte $78 + .byte $60 + .byte $0c + .byte $f0 + .byte $f8 + .byte $18 + .byte $76 + .byte $30 + .byte $6c + .byte $c6 + .byte $0c + .byte $fc + .byte $1c + .byte $18 + .byte $e0 + .byte $00 + .byte $fe + .byte $0c + .byte $7e + .byte $78 + .byte $3f + .byte $7e + .byte $7e + .byte $7e + .byte $0c + .byte $3c + .byte $78 + .byte $78 + .byte $78 + .byte $3c + .byte $78 + .byte $c6 + .byte $cc + .byte $fc + .byte $7f + .byte $ce + .byte $78 + .byte $78 + .byte $78 + .byte $7e + .byte $7e + .byte $0c + .byte $18 + .byte $78 + .byte $18 + .byte $fc + .byte $30 + .byte $c6 + .byte $d8 + .byte $7e + .byte $78 + .byte $78 + .byte $7e + .byte $cc + .byte $cc + .byte $00 + .byte $00 + .byte $78 + .byte $00 + .byte $00 + .byte $cc + .byte $cf + .byte $18 + .byte $00 + .byte $00 + .byte $22 + .byte $55 + .byte $db + .byte $18 + .byte $18 + .byte $18 + .byte $36 + .byte $36 + .byte $18 + .byte $36 + .byte $36 + .byte $36 + .byte $00 + .byte $00 + .byte $00 + .byte $18 + .byte $00 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $00 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $18 + .byte $36 + .byte $36 + .byte $18 + .byte $00 + .byte $18 + .byte $ff + .byte $ff + .byte $f0 + .byte $0f + .byte $00 + .byte $76 + .byte $c0 + .byte $c0 + .byte $6c + .byte $fc + .byte $70 + .byte $60 + .byte $18 + .byte $30 + .byte $38 + .byte $ee + .byte $78 + .byte $00 + .byte $60 + .byte $38 + .byte $cc + .byte $00 + .byte $fc + .byte $fc + .byte $fc + .byte $18 + .byte $d8 + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $3c + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $99 + .byte $e7 + .byte $38 + .byte $38 + .byte $7c + .byte $7c + .byte $18 + .byte $e7 + .byte $66 + .byte $99 + .byte $cc + .byte $18 + .byte $70 + .byte $67 + .byte $3c + .byte $e0 + .byte $0e + .byte $7e + .byte $00 + .byte $1b + .byte $38 + .byte $7e + .byte $3c + .byte $18 + .byte $3c + .byte $18 + .byte $30 + .byte $fe + .byte $24 + .byte $ff + .byte $18 + .byte $00 + .byte $00 + .byte $00 + .byte $6c + .byte $f8 + .byte $66 + .byte $cc + .byte $00 + .byte $30 + .byte $30 + .byte $66 + .byte $30 + .byte $30 + .byte $00 + .byte $30 + .byte $c0 + .byte $e6 + .byte $30 + .byte $cc + .byte $cc + .byte $0c + .byte $cc + .byte $cc + .byte $30 + .byte $cc + .byte $18 + .byte $30 + .byte $30 + .byte $30 + .byte $fc + .byte $30 + .byte $00 + .byte $c0 + .byte $cc + .byte $66 + .byte $66 + .byte $6c + .byte $62 + .byte $60 + .byte $66 + .byte $cc + .byte $30 + .byte $cc + .byte $66 + .byte $66 + .byte $c6 + .byte $c6 + .byte $6c + .byte $60 + .byte $78 + .byte $66 + .byte $cc + .byte $30 + .byte $cc + .byte $78 + .byte $ee + .byte $6c + .byte $30 + .byte $66 + .byte $60 + .byte $06 + .byte $18 + .byte $00 + .byte $00 + .byte $00 + .byte $cc + .byte $66 + .byte $cc + .byte $cc + .byte $c0 + .byte $60 + .byte $7c + .byte $66 + .byte $30 + .byte $cc + .byte $6c + .byte $30 + .byte $d6 + .byte $cc + .byte $cc + .byte $7c + .byte $7c + .byte $60 + .byte $0c + .byte $34 + .byte $cc + .byte $78 + .byte $fe + .byte $6c + .byte $7c + .byte $64 + .byte $30 + .byte $18 + .byte $30 + .byte $00 + .byte $c6 + .byte $18 + .byte $cc + .byte $c0 + .byte $66 + .byte $cc + .byte $cc + .byte $cc + .byte $78 + .byte $60 + .byte $c0 + .byte $c0 + .byte $30 + .byte $18 + .byte $30 + .byte $c6 + .byte $fc + .byte $60 + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $7c + .byte $3c + .byte $cc + .byte $7e + .byte $e6 + .byte $fc + .byte $cf + .byte $18 + .byte $cc + .byte $30 + .byte $cc + .byte $cc + .byte $cc + .byte $dc + .byte $7e + .byte $7c + .byte $cc + .byte $c0 + .byte $0c + .byte $66 + .byte $6f + .byte $18 + .byte $33 + .byte $cc + .byte $88 + .byte $aa + .byte $77 + .byte $18 + .byte $18 + .byte $18 + .byte $36 + .byte $36 + .byte $18 + .byte $36 + .byte $36 + .byte $36 + .byte $00 + .byte $00 + .byte $00 + .byte $18 + .byte $00 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $00 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $18 + .byte $36 + .byte $36 + .byte $18 + .byte $00 + .byte $18 + .byte $ff + .byte $ff + .byte $f0 + .byte $0f + .byte $00 + .byte $dc + .byte $f8 + .byte $c0 + .byte $6c + .byte $cc + .byte $d8 + .byte $7c + .byte $18 + .byte $78 + .byte $6c + .byte $6c + .byte $cc + .byte $7e + .byte $7e + .byte $60 + .byte $cc + .byte $fc + .byte $00 + .byte $00 + .byte $00 + .byte $18 + .byte $d8 + .byte $30 + .byte $dc + .byte $00 + .byte $00 + .byte $00 + .byte $6c + .byte $00 + .byte $00 + .byte $3c + .byte $00 + .byte $00 + .byte $bd + .byte $c3 + .byte $7c + .byte $7c + .byte $fe + .byte $fe + .byte $3c + .byte $c3 + .byte $42 + .byte $bd + .byte $cc + .byte $3c + .byte $30 + .byte $63 + .byte $e7 + .byte $f8 + .byte $3e + .byte $18 + .byte $66 + .byte $1b + .byte $6c + .byte $7e + .byte $7e + .byte $18 + .byte $7e + .byte $0c + .byte $60 + .byte $c0 + .byte $66 + .byte $ff + .byte $3c + .byte $00 + .byte $30 + .byte $00 + .byte $fe + .byte $0c + .byte $30 + .byte $dc + .byte $00 + .byte $60 + .byte $18 + .byte $3c + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $60 + .byte $f6 + .byte $30 + .byte $60 + .byte $0c + .byte $fe + .byte $0c + .byte $cc + .byte $30 + .byte $cc + .byte $0c + .byte $00 + .byte $00 + .byte $60 + .byte $00 + .byte $18 + .byte $30 + .byte $de + .byte $fc + .byte $66 + .byte $c0 + .byte $66 + .byte $68 + .byte $68 + .byte $ce + .byte $cc + .byte $30 + .byte $cc + .byte $6c + .byte $62 + .byte $d6 + .byte $ce + .byte $c6 + .byte $60 + .byte $dc + .byte $6c + .byte $1c + .byte $30 + .byte $cc + .byte $cc + .byte $fe + .byte $38 + .byte $30 + .byte $32 + .byte $60 + .byte $0c + .byte $18 + .byte $00 + .byte $00 + .byte $00 + .byte $7c + .byte $66 + .byte $c0 + .byte $cc + .byte $fc + .byte $60 + .byte $cc + .byte $66 + .byte $30 + .byte $0c + .byte $78 + .byte $30 + .byte $fe + .byte $cc + .byte $cc + .byte $66 + .byte $cc + .byte $66 + .byte $78 + .byte $30 + .byte $cc + .byte $cc + .byte $fe + .byte $38 + .byte $cc + .byte $30 + .byte $30 + .byte $18 + .byte $30 + .byte $00 + .byte $c6 + .byte $78 + .byte $cc + .byte $fc + .byte $3e + .byte $7c + .byte $7c + .byte $7c + .byte $c0 + .byte $7e + .byte $fc + .byte $fc + .byte $30 + .byte $18 + .byte $30 + .byte $fe + .byte $cc + .byte $78 + .byte $7f + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $66 + .byte $cc + .byte $c0 + .byte $60 + .byte $30 + .byte $c6 + .byte $18 + .byte $7c + .byte $30 + .byte $cc + .byte $cc + .byte $cc + .byte $fc + .byte $00 + .byte $00 + .byte $c0 + .byte $c0 + .byte $0c + .byte $33 + .byte $37 + .byte $18 + .byte $66 + .byte $66 + .byte $22 + .byte $55 + .byte $db + .byte $18 + .byte $f8 + .byte $f8 + .byte $f6 + .byte $fe + .byte $f8 + .byte $f6 + .byte $36 + .byte $f6 + .byte $fe + .byte $fe + .byte $f8 + .byte $f8 + .byte $1f + .byte $ff + .byte $ff + .byte $1f + .byte $ff + .byte $ff + .byte $1f + .byte $37 + .byte $3f + .byte $37 + .byte $ff + .byte $f7 + .byte $37 + .byte $ff + .byte $f7 + .byte $ff + .byte $ff + .byte $ff + .byte $ff + .byte $3f + .byte $1f + .byte $1f + .byte $3f + .byte $ff + .byte $ff + .byte $f8 + .byte $1f + .byte $ff + .byte $ff + .byte $f0 + .byte $0f + .byte $00 + .byte $c8 + .byte $cc + .byte $c0 + .byte $6c + .byte $60 + .byte $d8 + .byte $66 + .byte $18 + .byte $cc + .byte $c6 + .byte $6c + .byte $cc + .byte $db + .byte $db + .byte $c0 + .byte $cc + .byte $00 + .byte $30 + .byte $60 + .byte $18 + .byte $18 + .byte $18 + .byte $00 + .byte $76 + .byte $00 + .byte $18 + .byte $18 + .byte $ec + .byte $6c + .byte $78 + .byte $3c + .byte $00 + .byte $00 + .byte $81 + .byte $ff + .byte $fe + .byte $fe + .byte $fe + .byte $7c + .byte $3c + .byte $c3 + .byte $42 + .byte $bd + .byte $7d + .byte $66 + .byte $30 + .byte $63 + .byte $e7 + .byte $fe + .byte $fe + .byte $18 + .byte $66 + .byte $7b + .byte $6c + .byte $00 + .byte $18 + .byte $18 + .byte $18 + .byte $fe + .byte $fe + .byte $c0 + .byte $ff + .byte $7e + .byte $7e + .byte $00 + .byte $30 + .byte $00 + .byte $6c + .byte $78 + .byte $18 + .byte $76 + .byte $00 + .byte $60 + .byte $18 + .byte $ff + .byte $fc + .byte $00 + .byte $fc + .byte $00 + .byte $30 + .byte $de + .byte $30 + .byte $38 + .byte $38 + .byte $cc + .byte $0c + .byte $f8 + .byte $18 + .byte $78 + .byte $7c + .byte $00 + .byte $00 + .byte $c0 + .byte $00 + .byte $0c + .byte $18 + .byte $de + .byte $cc + .byte $7c + .byte $c0 + .byte $66 + .byte $78 + .byte $78 + .byte $c0 + .byte $fc + .byte $30 + .byte $0c + .byte $78 + .byte $60 + .byte $fe + .byte $de + .byte $c6 + .byte $7c + .byte $cc + .byte $7c + .byte $70 + .byte $30 + .byte $cc + .byte $cc + .byte $d6 + .byte $38 + .byte $78 + .byte $18 + .byte $60 + .byte $18 + .byte $18 + .byte $c6 + .byte $00 + .byte $00 + .byte $0c + .byte $7c + .byte $cc + .byte $7c + .byte $cc + .byte $f0 + .byte $cc + .byte $76 + .byte $30 + .byte $0c + .byte $6c + .byte $30 + .byte $fe + .byte $cc + .byte $cc + .byte $66 + .byte $cc + .byte $76 + .byte $c0 + .byte $30 + .byte $cc + .byte $cc + .byte $d6 + .byte $6c + .byte $cc + .byte $98 + .byte $e0 + .byte $00 + .byte $1c + .byte $00 + .byte $6c + .byte $cc + .byte $cc + .byte $cc + .byte $06 + .byte $0c + .byte $0c + .byte $0c + .byte $c0 + .byte $66 + .byte $cc + .byte $cc + .byte $30 + .byte $18 + .byte $30 + .byte $c6 + .byte $78 + .byte $60 + .byte $0c + .byte $fe + .byte $78 + .byte $78 + .byte $78 + .byte $cc + .byte $cc + .byte $cc + .byte $66 + .byte $cc + .byte $c0 + .byte $f0 + .byte $fc + .byte $fa + .byte $3c + .byte $0c + .byte $30 + .byte $78 + .byte $cc + .byte $f8 + .byte $ec + .byte $3e + .byte $38 + .byte $60 + .byte $fc + .byte $fc + .byte $de + .byte $db + .byte $18 + .byte $cc + .byte $33 + .byte $88 + .byte $aa + .byte $ee + .byte $18 + .byte $18 + .byte $18 + .byte $36 + .byte $00 + .byte $18 + .byte $06 + .byte $36 + .byte $06 + .byte $06 + .byte $36 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $36 + .byte $30 + .byte $30 + .byte $00 + .byte $00 + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $36 + .byte $00 + .byte $00 + .byte $36 + .byte $18 + .byte $18 + .byte $00 + .byte $36 + .byte $18 + .byte $18 + .byte $00 + .byte $ff + .byte $00 + .byte $f0 + .byte $0f + .byte $ff + .byte $dc + .byte $f8 + .byte $c0 + .byte $6c + .byte $30 + .byte $d8 + .byte $66 + .byte $18 + .byte $cc + .byte $fe + .byte $c6 + .byte $7c + .byte $db + .byte $db + .byte $f8 + .byte $cc + .byte $fc + .byte $30 + .byte $30 + .byte $30 + .byte $18 + .byte $18 + .byte $fc + .byte $00 + .byte $38 + .byte $18 + .byte $00 + .byte $0c + .byte $6c + .byte $60 + .byte $3c + .byte $00 + .byte $00 + .byte $a5 + .byte $db + .byte $fe + .byte $7c + .byte $38 + .byte $38 + .byte $18 + .byte $e7 + .byte $66 + .byte $99 + .byte $0f + .byte $66 + .byte $3f + .byte $7f + .byte $3c + .byte $f8 + .byte $3e + .byte $7e + .byte $66 + .byte $db + .byte $38 + .byte $00 + .byte $7e + .byte $7e + .byte $18 + .byte $0c + .byte $60 + .byte $c0 + .byte $66 + .byte $3c + .byte $ff + .byte $00 + .byte $78 + .byte $6c + .byte $fe + .byte $c0 + .byte $cc + .byte $38 + .byte $c0 + .byte $60 + .byte $18 + .byte $3c + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $18 + .byte $ce + .byte $30 + .byte $0c + .byte $0c + .byte $6c + .byte $f8 + .byte $c0 + .byte $0c + .byte $cc + .byte $cc + .byte $30 + .byte $30 + .byte $60 + .byte $fc + .byte $18 + .byte $0c + .byte $de + .byte $cc + .byte $66 + .byte $c0 + .byte $66 + .byte $68 + .byte $68 + .byte $c0 + .byte $cc + .byte $30 + .byte $0c + .byte $6c + .byte $60 + .byte $fe + .byte $f6 + .byte $c6 + .byte $66 + .byte $cc + .byte $66 + .byte $e0 + .byte $30 + .byte $cc + .byte $cc + .byte $c6 + .byte $6c + .byte $cc + .byte $8c + .byte $60 + .byte $30 + .byte $18 + .byte $6c + .byte $00 + .byte $18 + .byte $78 + .byte $60 + .byte $78 + .byte $0c + .byte $78 + .byte $60 + .byte $76 + .byte $6c + .byte $70 + .byte $0c + .byte $66 + .byte $30 + .byte $cc + .byte $f8 + .byte $78 + .byte $dc + .byte $76 + .byte $dc + .byte $7c + .byte $7c + .byte $cc + .byte $cc + .byte $c6 + .byte $c6 + .byte $cc + .byte $fc + .byte $30 + .byte $18 + .byte $30 + .byte $00 + .byte $38 + .byte $c0 + .byte $00 + .byte $78 + .byte $3c + .byte $78 + .byte $78 + .byte $78 + .byte $78 + .byte $3c + .byte $78 + .byte $78 + .byte $70 + .byte $38 + .byte $70 + .byte $6c + .byte $00 + .byte $fc + .byte $7f + .byte $cc + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $3c + .byte $cc + .byte $7e + .byte $64 + .byte $78 + .byte $cc + .byte $18 + .byte $78 + .byte $70 + .byte $00 + .byte $00 + .byte $00 + .byte $cc + .byte $6c + .byte $6c + .byte $30 + .byte $00 + .byte $00 + .byte $cc + .byte $cc + .byte $00 + .byte $66 + .byte $66 + .byte $22 + .byte $55 + .byte $db + .byte $18 + .byte $18 + .byte $f8 + .byte $36 + .byte $00 + .byte $f8 + .byte $f6 + .byte $36 + .byte $fe + .byte $f6 + .byte $36 + .byte $f8 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $00 + .byte $18 + .byte $1f + .byte $36 + .byte $37 + .byte $3f + .byte $f7 + .byte $ff + .byte $37 + .byte $ff + .byte $f7 + .byte $ff + .byte $36 + .byte $ff + .byte $00 + .byte $36 + .byte $1f + .byte $1f + .byte $00 + .byte $36 + .byte $ff + .byte $18 + .byte $00 + .byte $ff + .byte $00 + .byte $f0 + .byte $0f + .byte $ff + .byte $76 + .byte $cc + .byte $cc + .byte $6c + .byte $60 + .byte $7e + .byte $66 + .byte $dc + .byte $78 + .byte $c6 + .byte $c6 + .byte $18 + .byte $7e + .byte $7e + .byte $c0 + .byte $cc + .byte $00 + .byte $fc + .byte $18 + .byte $60 + .byte $1b + .byte $18 + .byte $00 + .byte $dc + .byte $6c + .byte $00 + .byte $00 + .byte $0c + .byte $6c + .byte $30 + .byte $3c + .byte $00 + .byte $00 + .byte $81 + .byte $ff + .byte $fe + .byte $38 + .byte $7c + .byte $10 + .byte $00 + .byte $ff + .byte $3c + .byte $c3 + .byte $07 + .byte $66 + .byte $33 + .byte $63 + .byte $5a + .byte $e0 + .byte $0e + .byte $3c + .byte $66 + .byte $db + .byte $63 + .byte $00 + .byte $3c + .byte $3c + .byte $18 + .byte $18 + .byte $30 + .byte $00 + .byte $24 + .byte $18 + .byte $ff + .byte $00 + .byte $78 + .byte $6c + .byte $6c + .byte $7c + .byte $c6 + .byte $6c + .byte $60 + .byte $30 + .byte $30 + .byte $66 + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $0c + .byte $c6 + .byte $70 + .byte $cc + .byte $cc + .byte $3c + .byte $c0 + .byte $60 + .byte $cc + .byte $cc + .byte $cc + .byte $30 + .byte $30 + .byte $30 + .byte $00 + .byte $30 + .byte $cc + .byte $c6 + .byte $78 + .byte $66 + .byte $66 + .byte $6c + .byte $62 + .byte $62 + .byte $66 + .byte $cc + .byte $30 + .byte $0c + .byte $66 + .byte $60 + .byte $ee + .byte $e6 + .byte $6c + .byte $66 + .byte $cc + .byte $66 + .byte $cc + .byte $b4 + .byte $cc + .byte $cc + .byte $c6 + .byte $c6 + .byte $cc + .byte $c6 + .byte $60 + .byte $60 + .byte $18 + .byte $38 + .byte $00 + .byte $30 + .byte $00 + .byte $60 + .byte $00 + .byte $0c + .byte $00 + .byte $6c + .byte $00 + .byte $60 + .byte $00 + .byte $00 + .byte $60 + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $30 + .byte $18 + .byte $30 + .byte $dc + .byte $10 + .byte $cc + .byte $cc + .byte $00 + .byte $c3 + .byte $00 + .byte $00 + .byte $30 + .byte $00 + .byte $c3 + .byte $00 + .byte $00 + .byte $00 + .byte $c6 + .byte $00 + .byte $38 + .byte $30 + .byte $00 + .byte $00 + .byte $6c + .byte $cc + .byte $cc + .byte $e0 + .byte $cc + .byte $e0 + .byte $cc + .byte $18 + .byte $00 + .byte $18 + .byte $6c + .byte $cc + .byte $cc + .byte $1b + .byte $00 + .byte $00 + .byte $1c + .byte $1c + .byte $f8 + .byte $00 + .byte $6c + .byte $6c + .byte $00 + .byte $00 + .byte $00 + .byte $c6 + .byte $c6 + .byte $18 + .byte $33 + .byte $cc + .byte $88 + .byte $aa + .byte $77 + .byte $18 + .byte $18 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $36 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $36 + .byte $18 + .byte $00 + .byte $00 + .byte $36 + .byte $18 + .byte $18 + .byte $00 + .byte $ff + .byte $00 + .byte $f0 + .byte $0f + .byte $ff + .byte $00 + .byte $78 + .byte $fc + .byte $fe + .byte $cc + .byte $00 + .byte $66 + .byte $76 + .byte $30 + .byte $6c + .byte $6c + .byte $30 + .byte $00 + .byte $0c + .byte $60 + .byte $cc + .byte $fc + .byte $30 + .byte $30 + .byte $30 + .byte $1b + .byte $18 + .byte $30 + .byte $76 + .byte $6c + .byte $00 + .byte $00 + .byte $0c + .byte $6c + .byte $18 + .byte $00 + .byte $00 + .byte $00 + .byte $7e + .byte $7e + .byte $6c + .byte $10 + .byte $38 + .byte $10 + .byte $00 + .byte $ff + .byte $00 + .byte $ff + .byte $0f + .byte $3c + .byte $3f + .byte $7f + .byte $99 + .byte $80 + .byte $02 + .byte $18 + .byte $66 + .byte $7f + .byte $3e + .byte $00 + .byte $18 + .byte $18 + .byte $18 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $30 + .byte $6c + .byte $6c + .byte $30 + .byte $00 + .byte $38 + .byte $60 + .byte $18 + .byte $60 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $06 + .byte $7c + .byte $30 + .byte $78 + .byte $78 + .byte $1c + .byte $fc + .byte $38 + .byte $fc + .byte $78 + .byte $78 + .byte $00 + .byte $00 + .byte $18 + .byte $00 + .byte $60 + .byte $78 + .byte $7c + .byte $30 + .byte $fc + .byte $3c + .byte $f8 + .byte $fe + .byte $fe + .byte $3c + .byte $cc + .byte $78 + .byte $1e + .byte $e6 + .byte $f0 + .byte $c6 + .byte $c6 + .byte $38 + .byte $fc + .byte $78 + .byte $fc + .byte $78 + .byte $fc + .byte $cc + .byte $cc + .byte $c6 + .byte $c6 + .byte $cc + .byte $fe + .byte $78 + .byte $c0 + .byte $78 + .byte $10 + .byte $00 + .byte $30 + .byte $00 + .byte $e0 + .byte $00 + .byte $1c + .byte $00 + .byte $38 + .byte $00 + .byte $e0 + .byte $30 + .byte $0c + .byte $e0 + .byte $70 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $10 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $1c + .byte $18 + .byte $e0 + .byte $76 + .byte $00 + .byte $78 + .byte $00 + .byte $1c + .byte $7e + .byte $cc + .byte $e0 + .byte $30 + .byte $00 + .byte $7e + .byte $cc + .byte $e0 + .byte $cc + .byte $7c + .byte $e0 + .byte $c6 + .byte $30 + .byte $1c + .byte $00 + .byte $3e + .byte $78 + .byte $00 + .byte $00 + .byte $78 + .byte $00 + .byte $00 + .byte $c3 + .byte $cc + .byte $18 + .byte $38 + .byte $cc + .byte $f8 + .byte $0e + .byte $1c + .byte $38 + .byte $00 + .byte $00 + .byte $00 + .byte $fc + .byte $3c + .byte $38 + .byte $30 + .byte $00 + .byte $00 + .byte $c3 + .byte $c3 + .byte $18 + .byte $00 + .byte $00 + .byte $22 + .byte $55 + .byte $db + .byte $18 + .byte $18 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $36 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $36 + .byte $18 + .byte $00 + .byte $00 + .byte $36 + .byte $18 + .byte $18 + .byte $00 + .byte $ff + .byte $00 + .byte $f0 + .byte $0f + .byte $ff + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $fc + .byte $00 + .byte $00 + .byte $00 + .byte $fc + .byte $38 + .byte $38 + .byte $1c + .byte $00 + .byte $06 + .byte $38 + .byte $78 + .byte $00 + .byte $30 + .byte $60 + .byte $18 + .byte $0e + .byte $18 + .byte $30 + .byte $00 + .byte $38 + .byte $00 + .byte $00 + .byte $0f + .byte $78 + .byte $70 + .byte $00 + .byte $00 diff --git a/libsrc/atari7800/mono_setcursor.s b/libsrc/atari7800/mono_setcursor.s new file mode 100644 index 000000000..c75ff16f3 --- /dev/null +++ b/libsrc/atari7800/mono_setcursor.s @@ -0,0 +1,208 @@ +; +; 2022-04-03, Karri Kaksonen +; +; setcursor (unsigned char on); +; +; The Atari 7800 does not have a hw cursor. +; This module emulates a cursor to be used with the conio +; implementation. +; +; The actual cursor display is included in the conio dll +; but every scanline has the element silenced by default +; at the end of every zone. +; +; The way the cursor works is to silence it before the cursor +; position changes and enable it afterwards. +; +; In order to get some performance we have a pointer to the +; cursor header structure. This structure is always at the +; end of the zone. So the pointer changes when CURS_Y changes. +; +; There is so many dependencies that it makes sense to +; deal with all CURS_X, CURS_Y stuff in this file and +; definitely not allow direct access to the variables. +; + + .export mono_gotoxy, _mono_gotoxy, _mono_gotox, _mono_gotoy + .constructor mono_init_cursor + .interruptor mono_blink_cursor + + .importzp sp + .import _mono_zones + .import cursor + .import pusha, incsp1, pusha0, pushax, popa + .include "atari7800.inc" + .include "extzp.inc" + + .macpack generic + + .data +;----------------------------------------------------------------------------- +; The variables used by cursor functions +; + +blink_time: + .byte 140 + + .code + +;--------------------------------------------------------------------------- +; 8x16 routine + +umula0: + ldy #8 ; Number of bits + lda #0 + lsr ptr7800 ; Get first bit into carry +@L0: bcc @L1 + + clc + adc ptrtmp + tax + lda ptrtmp+1 ; hi byte of left op + adc ptr7800+1 + sta ptr7800+1 + txa + +@L1: ror ptr7800+1 + ror a + ror ptr7800 + dey + bne @L0 + tax + lda ptr7800 ; Load the result + rts + +;----------------------------------------------------------------------------- +; Calculate cursorzone address +; You also need to set the cursorzone to point to the correct cursor Header +; at the end of line CURS_Y. +; Offset to cursor zone 5. To next line offset 11 +; cursorzone points to _mono_zones + CURS_Y * 16 + 10 +; A = CURS_Y + .proc calccursorzone + + sta ptr7800 + lda #16 + sta ptrtmp + lda #0 + sta ptr7800+1 + sta ptrtmp+1 + jsr umula0 + clc + adc #10 + bcc @L1 + inx +@L1: clc + adc #<_mono_zones + sta cursorzone ; calculate new cursorzone + txa + clc + adc #>_mono_zones + sta cursorzone+1 + rts + + .endproc + +;----------------------------------------------------------------------------- +; Set cursor to Y position. +; You also need to set the cursorzone to point to the correct cursor Header +; at the end of line CURS_Y. +; Offset to cursor zone 5. To next line offset 11 +; cursorzone points to _mono_zones + CURS_Y * 11 + 5 +; +; cursorzone[1] = 0 when not CURS_Y, 31 if CURS_Y +; +; Disable cursor +; cursorzone[1] = 0 +; +; Enable cursor +; if showcursor cursorzone[1] = 31 +; + .proc _mono_gotoy + + pha + lda CURS_Y + jsr calccursorzone + ldy #1 + lda #0 + sta (cursorzone),y ; disable cursor + pla + sta CURS_Y + jsr calccursorzone + lda cursor + beq @L1 + lda #31 ; enable cursor +@L1: ldy #1 + sta (cursorzone),y + rts + + .endproc + +;----------------------------------------------------------------------------- +; Set cursor to X position. +; You also need to set the hpos offset to the correct value on this line +; cursorzone[3] = 4 * CURS_X? +; + .proc _mono_gotox + + sta CURS_X + ldy #3 + clc + rol + rol + sta (cursorzone),y + rts + + .endproc + +;----------------------------------------------------------------------------- +; Set cursor to desired position (X,Y) +; + .proc _mono_gotoxy + + jsr _mono_gotoy + jsr popa + jsr _mono_gotox + rts + .endproc + + .proc mono_gotoxy + jsr popa + jmp _mono_gotoxy + .endproc + +;----------------------------------------------------------------------------- +; Initialize cursorzone at startup +; Offset to cursor zone 5. +; + .proc mono_blink_cursor + inc blink_time + bne @L3 + lda #140 + sta blink_time + ldy #0 + lda (cursorzone),y + cmp #32 + bne @L1 + lda #95 + bne @L2 +@L1: lda #32 +@L2: sta (cursorzone),y +@L3: rts + .endproc + +;----------------------------------------------------------------------------- +; Initialize cursorzone at startup +; Offset to cursor zone 5. +; + .segment "ONCE" +mono_init_cursor: + lda #0 + jsr calccursorzone + rts + +;----------------------------------------------------------------------------- +; force the init constructor to be imported + + .import mono_initconio +conio_init = mono_initconio From 45c4f7d46f7aad9a4d8e0edc2e5c23c81d51ce45 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 18 Apr 2022 11:59:54 +0300 Subject: [PATCH 41/63] Add mono conio files --- asminc/atari7800.inc | 1 + cfg/atari7800.cfg | 2 +- libsrc/atari7800/clrscr.s | 4 ++-- libsrc/atari7800/conio.s | 9 ++++++--- libsrc/atari7800/cputc.s | 1 - libsrc/atari7800/extzp.inc | 2 ++ libsrc/atari7800/extzp.s | 2 ++ libsrc/atari7800/font160.s | 4 ++-- libsrc/atari7800/setcursor.s | 5 ----- libsrc/atari7800/textcolor.s | 6 ------ libsrc/atari7800/wherex.s | 2 +- libsrc/atari7800/wherey.s | 2 +- 12 files changed, 18 insertions(+), 22 deletions(-) diff --git a/asminc/atari7800.inc b/asminc/atari7800.inc index 93e990870..0f109ba64 100644 --- a/asminc/atari7800.inc +++ b/asminc/atari7800.inc @@ -8,6 +8,7 @@ .include "atari7800_maria.inc" ; constants for the conio implementation +mono_charsperline = 40 charsperline = 20 screenrows = 28 diff --git a/cfg/atari7800.cfg b/cfg/atari7800.cfg index 160d1e58e..1eed534f3 100644 --- a/cfg/atari7800.cfg +++ b/cfg/atari7800.cfg @@ -10,7 +10,7 @@ SYMBOLS { __ENCRYPT_BOTTOM__: value = $ff7a, type = export; __ENCRYPT_SIZE__: value = $80, type = export; __MEMORY_TOP__: value = __ENCRYPT_BOTTOM__, type = export; - __INIT_SIZE__: value = 154, type = export; + __INIT_SIZE__: value = 156, type = export; __MEMORY_INIT__: value = __MEMORY_TOP__ - __INIT_SIZE__, type = export; __MEMORY_BOTTOM__: value = $10000 - __CARTSIZE__, type = weak; __FREE_ROM_SIZE__: value = __MEMORY_INIT__ - __MEMORY_BOTTOM__, type = export; diff --git a/libsrc/atari7800/clrscr.s b/libsrc/atari7800/clrscr.s index b5b3a1ebf..9d063fad6 100644 --- a/libsrc/atari7800/clrscr.s +++ b/libsrc/atari7800/clrscr.s @@ -11,8 +11,8 @@ .proc _clrscr - lda #<(_screen) - ldx #>(_screen) + lda #<_screen + ldx #>_screen sta ptr7800 stx ptr7800+1 ldx #screenrows diff --git a/libsrc/atari7800/conio.s b/libsrc/atari7800/conio.s index ad1c4a976..5b60f39fe 100644 --- a/libsrc/atari7800/conio.s +++ b/libsrc/atari7800/conio.s @@ -8,7 +8,8 @@ .constructor initconio .include "atari7800.inc" - .import _font160 + .include "extzp.inc" + .import _font .import _get_tv .export _screen .export _zones @@ -57,7 +58,7 @@ _screen: ; Cursor .byte 254 .byte 0 - .byte >_font160 + .byte >_font .byte 0 .endmacro @@ -205,12 +206,14 @@ vblankon: vblankoff: lda MSTAT bpl vblankoff - lda #>_font160 + lda #>_font sta CHBASE lda #(CTRL_MODE160 | CTRL_KANGOFF | CTRL_BCBLACK | CTRL_CHAR2B | CTRL_DMAON | CTRL_CKOFF) sta CTRL lda #$00 ; Black background sta BKGRND + sta CURS_X + sta CURS_Y lda #$33 ; Red sta P0C1 lda #$c8 ; Green diff --git a/libsrc/atari7800/cputc.s b/libsrc/atari7800/cputc.s index 4d2b8dbf6..fb95277d2 100644 --- a/libsrc/atari7800/cputc.s +++ b/libsrc/atari7800/cputc.s @@ -10,7 +10,6 @@ .import _gotoxy, gotox, gotoy, pusha0 .import pushax .import _screen - .import CURS_X, CURS_Y .import txtcolor .include "atari7800.inc" diff --git a/libsrc/atari7800/extzp.inc b/libsrc/atari7800/extzp.inc index ac1dd7e41..5990b5c86 100644 --- a/libsrc/atari7800/extzp.inc +++ b/libsrc/atari7800/extzp.inc @@ -10,4 +10,6 @@ .global ptr7800: zp .global ptrtmp: zp .global cursorzone: zp + .global CURS_X: zp + .global CURS_Y: zp diff --git a/libsrc/atari7800/extzp.s b/libsrc/atari7800/extzp.s index 376674268..a79ede01a 100644 --- a/libsrc/atari7800/extzp.s +++ b/libsrc/atari7800/extzp.s @@ -11,3 +11,5 @@ ptr7800: .res 2 ptrtmp: .res 2 cursorzone: .res 2 +CURS_X: .res 1 +CURS_Y: .res 1 diff --git a/libsrc/atari7800/font160.s b/libsrc/atari7800/font160.s index 69c5774ab..07be43c4d 100644 --- a/libsrc/atari7800/font160.s +++ b/libsrc/atari7800/font160.s @@ -16,10 +16,10 @@ ; 0, 2, 4, 6, ... 254 ; Odd indices cannot be used. - .export _font160 + .export _font .rodata .align 256 -_font160: +_font: .byte $0, $0, $41, $41, $0, $0, $14, $0 .byte $0, $0, $0, $0, $1, $40, $0, $0 .byte $0, $0, $0, $0, $0, $0, $0, $0 diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index caaa9c1d5..99e051cff 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -24,7 +24,6 @@ ; .export gotoxy, _gotoxy, gotox, gotoy - .export CURS_X, CURS_Y .constructor init_cursor .interruptor blink_cursor @@ -43,10 +42,6 @@ ; The variables used by cursor functions ; -CURS_X: - .byte 0 -CURS_Y: - .byte 0 blink_time: .byte 140 diff --git a/libsrc/atari7800/textcolor.s b/libsrc/atari7800/textcolor.s index be98ed340..1f8efced5 100644 --- a/libsrc/atari7800/textcolor.s +++ b/libsrc/atari7800/textcolor.s @@ -51,9 +51,3 @@ txtcolor: @L4: lda #2 rts ; Old colour was 2 .endproc - -;------------------------------------------------------------------------------- -; force the init constructor to be imported - - .import initconio -conio_init = initconio diff --git a/libsrc/atari7800/wherex.s b/libsrc/atari7800/wherex.s index f90105c46..4926f1479 100644 --- a/libsrc/atari7800/wherex.s +++ b/libsrc/atari7800/wherex.s @@ -5,7 +5,7 @@ ; .export _wherex - .import CURS_X + .include "extzp.inc" ;----------------------------------------------------------------------------- ; Get cursor X position diff --git a/libsrc/atari7800/wherey.s b/libsrc/atari7800/wherey.s index 2223f29ac..f105975c0 100644 --- a/libsrc/atari7800/wherey.s +++ b/libsrc/atari7800/wherey.s @@ -5,7 +5,7 @@ ; .export _wherey - .import CURS_Y + .include "extzp.inc" ;----------------------------------------------------------------------------- ; Get cursor Y position From dbd39c63a9368f38d570911e08f14c8964ea1bd1 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 18 Apr 2022 12:05:36 +0300 Subject: [PATCH 42/63] Fix tabs --- libsrc/atari7800/mono_clrscr.s | 48 +- libsrc/atari7800/mono_conio.s | 322 +-- libsrc/atari7800/mono_cputc.s | 92 +- libsrc/atari7800/mono_font.s | 4102 ++++++++++++++--------------- libsrc/atari7800/mono_setcursor.s | 154 +- 5 files changed, 2359 insertions(+), 2359 deletions(-) diff --git a/libsrc/atari7800/mono_clrscr.s b/libsrc/atari7800/mono_clrscr.s index e6137d684..cdf12bf4d 100644 --- a/libsrc/atari7800/mono_clrscr.s +++ b/libsrc/atari7800/mono_clrscr.s @@ -3,34 +3,34 @@ .export _mono_clrscr - .import _screen - .import pusha0,pushax - .include "extzp.inc" + .import _screen + .import pusha0,pushax + .include "extzp.inc" - .code + .code - .proc _mono_clrscr + .proc _mono_clrscr - lda #<_screen - ldx #>_screen - sta ptr7800 - stx ptr7800+1 - ldx #screenrows -@L1: ldy #mono_charsperline - lda #0 -@L2: sta (ptr7800),y - dey - bne @L2 - lda ptr7800 - clc - adc #mono_charsperline - bcc @L3 - inc ptr7800+1 -@L3: dex - bne @L1 - rts + lda #<_screen + ldx #>_screen + sta ptr7800 + stx ptr7800+1 + ldx #screenrows +@L1: ldy #mono_charsperline + lda #0 +@L2: sta (ptr7800),y + dey + bne @L2 + lda ptr7800 + clc + adc #mono_charsperline + bcc @L3 + inc ptr7800+1 +@L3: dex + bne @L1 + rts - .endproc + .endproc ;------------------------------------------------------------------------------- ; force the init constructor to be imported diff --git a/libsrc/atari7800/mono_conio.s b/libsrc/atari7800/mono_conio.s index 51ecc93b8..cd79af128 100644 --- a/libsrc/atari7800/mono_conio.s +++ b/libsrc/atari7800/mono_conio.s @@ -9,11 +9,11 @@ .constructor mono_initconio .include "atari7800.inc" .include "extzp.inc" - .import _mono_font - .import _get_tv - .export _mono_screen - .export _mono_zones - .export _mono_dll + .import _mono_font + .import _get_tv + .export _mono_screen + .export _mono_zones + .export _mono_dll .bss _mono_screen: @@ -23,48 +23,48 @@ _mono_screen: ; Macros used to generate lists .macro DLLentry offset, addr - .byte offset - .byte >addr - .byte addr + .byte addr - .byte hpos + .byte addr + .byte hpos .endmacro .macro XHeader addr, flags, palwidth, hpos - .byte addr - .byte palwidth - .byte hpos + .byte addr + .byte palwidth + .byte hpos .endmacro .macro TextZone row - ; Text - .byte <(_mono_screen + 2 * row * charsperline) - .byte $60 - .byte >(_mono_screen + 2 * row * charsperline) - .byte 12 - .byte 0 - .byte <(_mono_screen + 2 * row * charsperline + charsperline) - .byte $60 - .byte >(_mono_screen + 2 * row * charsperline + charsperline) - .byte 12 - .byte 80 - ; Cursor - .byte 95 - .byte 0 - .byte >_mono_font - .byte 0 + ; Text + .byte <(_mono_screen + 2 * row * charsperline) + .byte $60 + .byte >(_mono_screen + 2 * row * charsperline) + .byte 12 + .byte 0 + .byte <(_mono_screen + 2 * row * charsperline + charsperline) + .byte $60 + .byte >(_mono_screen + 2 * row * charsperline + charsperline) + .byte 12 + .byte 80 + ; Cursor + .byte 95 + .byte 0 + .byte >_mono_font + .byte 0 .endmacro ;----------------------------------------------------------------------------- @@ -74,153 +74,153 @@ _mono_screen: .data _mono_zones: -zone0: TextZone 0 -nh: NullHeader 0, 0 -zone1: TextZone 1 - NullHeader 0, 0 -zone2: TextZone 2 - NullHeader 0, 0 -zone3: TextZone 3 - NullHeader 0, 0 -zone4: TextZone 4 - NullHeader 0, 0 -zone5: TextZone 5 - NullHeader 0, 0 -zone6: TextZone 6 - NullHeader 0, 0 -zone7: TextZone 7 - NullHeader 0, 0 -zone8: TextZone 8 - NullHeader 0, 0 -zone9: TextZone 9 - NullHeader 0, 0 -zone10: TextZone 10 - NullHeader 0, 0 -zone11: TextZone 11 - NullHeader 0, 0 -zone12: TextZone 12 - NullHeader 0, 0 -zone13: TextZone 13 - NullHeader 0, 0 -zone14: TextZone 14 - NullHeader 0, 0 -zone15: TextZone 15 - NullHeader 0, 0 -zone16: TextZone 16 - NullHeader 0, 0 -zone17: TextZone 17 - NullHeader 0, 0 -zone18: TextZone 18 - NullHeader 0, 0 -zone19: TextZone 19 - NullHeader 0, 0 -zone20: TextZone 20 - NullHeader 0, 0 -zone21: TextZone 21 - NullHeader 0, 0 -zone22: TextZone 22 - NullHeader 0, 0 -zone23: TextZone 23 - NullHeader 0, 0 -zone24: TextZone 24 - NullHeader 0, 0 -zone25: TextZone 25 - NullHeader 0, 0 -zone26: TextZone 26 - NullHeader 0, 0 -zone27: TextZone 27 - NullHeader 0, 0 +zone0: TextZone 0 +nh: NullHeader 0, 0 +zone1: TextZone 1 + NullHeader 0, 0 +zone2: TextZone 2 + NullHeader 0, 0 +zone3: TextZone 3 + NullHeader 0, 0 +zone4: TextZone 4 + NullHeader 0, 0 +zone5: TextZone 5 + NullHeader 0, 0 +zone6: TextZone 6 + NullHeader 0, 0 +zone7: TextZone 7 + NullHeader 0, 0 +zone8: TextZone 8 + NullHeader 0, 0 +zone9: TextZone 9 + NullHeader 0, 0 +zone10: TextZone 10 + NullHeader 0, 0 +zone11: TextZone 11 + NullHeader 0, 0 +zone12: TextZone 12 + NullHeader 0, 0 +zone13: TextZone 13 + NullHeader 0, 0 +zone14: TextZone 14 + NullHeader 0, 0 +zone15: TextZone 15 + NullHeader 0, 0 +zone16: TextZone 16 + NullHeader 0, 0 +zone17: TextZone 17 + NullHeader 0, 0 +zone18: TextZone 18 + NullHeader 0, 0 +zone19: TextZone 19 + NullHeader 0, 0 +zone20: TextZone 20 + NullHeader 0, 0 +zone21: TextZone 21 + NullHeader 0, 0 +zone22: TextZone 22 + NullHeader 0, 0 +zone23: TextZone 23 + NullHeader 0, 0 +zone24: TextZone 24 + NullHeader 0, 0 +zone25: TextZone 25 + NullHeader 0, 0 +zone26: TextZone 26 + NullHeader 0, 0 +zone27: TextZone 27 + NullHeader 0, 0 _mono_dll: -PALscanlines: ; 25 lines - DLLentry 15, nh - DLLentry 8, nh +PALscanlines: ; 25 lines + DLLentry 15, nh + DLLentry 8, nh -Topscanlines: ; 9 lines - DLLentry 8, nh +Topscanlines: ; 9 lines + DLLentry 8, nh Displaylines: - DLLentry $80+7, zone0 ; NMI interrupt from end of prev zone - DLLentry 7, zone1 - DLLentry 7, zone2 - DLLentry 7, zone3 - DLLentry 7, zone4 - DLLentry 7, zone5 - DLLentry 7, zone6 - DLLentry 7, zone7 - DLLentry 7, zone8 - DLLentry 7, zone9 - DLLentry 7, zone10 - DLLentry 7, zone11 - DLLentry 7, zone12 - DLLentry 7, zone13 - DLLentry 7, zone14 - DLLentry 7, zone15 - DLLentry 7, zone16 - DLLentry 7, zone17 - DLLentry 7, zone18 - DLLentry 7, zone19 - DLLentry 7, zone20 - DLLentry 7, zone21 - DLLentry 7, zone22 - DLLentry 7, zone23 - DLLentry 7, zone24 - DLLentry 7, zone25 - DLLentry 7, zone26 - DLLentry 7, zone27 + DLLentry $80+7, zone0 ; NMI interrupt from end of prev zone + DLLentry 7, zone1 + DLLentry 7, zone2 + DLLentry 7, zone3 + DLLentry 7, zone4 + DLLentry 7, zone5 + DLLentry 7, zone6 + DLLentry 7, zone7 + DLLentry 7, zone8 + DLLentry 7, zone9 + DLLentry 7, zone10 + DLLentry 7, zone11 + DLLentry 7, zone12 + DLLentry 7, zone13 + DLLentry 7, zone14 + DLLentry 7, zone15 + DLLentry 7, zone16 + DLLentry 7, zone17 + DLLentry 7, zone18 + DLLentry 7, zone19 + DLLentry 7, zone20 + DLLentry 7, zone21 + DLLentry 7, zone22 + DLLentry 7, zone23 + DLLentry 7, zone24 + DLLentry 7, zone25 + DLLentry 7, zone26 + DLLentry 7, zone27 Bottomscanlines: - DLLentry $80+15, nh ; NMI interrupt at end of display - DLLentry 9, nh - DLLentry 15, nh - DLLentry 8, nh + DLLentry $80+15, nh ; NMI interrupt at end of display + DLLentry 9, nh + DLLentry 15, nh + DLLentry 8, nh ;----------------------------------------------------------------------------- ; Set up the screen to 320a mode ; .segment "ONCE" -CTRL_MODE160 .set 0 -CTRL_MODEAC .set 3 -CTRL_KANGOFF .set 0 -CTRL_BCBLACK .set 0 -CTRL_CHAR1B .set 0 -CTRL_CHAR2B .set $10 -CTRL_DMAON .set $40 -CTRL_CKOFF .set 0 +CTRL_MODE160 .set 0 +CTRL_MODEAC .set 3 +CTRL_KANGOFF .set 0 +CTRL_BCBLACK .set 0 +CTRL_CHAR1B .set 0 +CTRL_CHAR2B .set $10 +CTRL_DMAON .set $40 +CTRL_CKOFF .set 0 ;----------------------------------------------------------------------------- ; Initialize the conio display lists and zones ; .proc mono_initconio - jsr _get_tv - bne pal - lda #Topscanlines - sta DPPH - jmp vblankon -pal: lda #PALscanlines - sta DPPH + jsr _get_tv + bne pal + lda #Topscanlines + sta DPPH + jmp vblankon +pal: lda #PALscanlines + sta DPPH vblankon: - lda MSTAT - bmi vblankon + lda MSTAT + bmi vblankon vblankoff: - lda MSTAT - bpl vblankoff - lda #>_mono_font - sta CHBASE - lda #(CTRL_MODEAC | CTRL_KANGOFF | CTRL_BCBLACK | CTRL_CHAR1B | CTRL_DMAON | CTRL_CKOFF) - sta CTRL - lda #$00 ; Black background - sta BKGRND - sta CURS_X - sta CURS_Y - lda #$0f ; White - sta P0C1 + lda MSTAT + bpl vblankoff + lda #>_mono_font + sta CHBASE + lda #(CTRL_MODEAC | CTRL_KANGOFF | CTRL_BCBLACK | CTRL_CHAR1B | CTRL_DMAON | CTRL_CKOFF) + sta CTRL + lda #$00 ; Black background + sta BKGRND + sta CURS_X + sta CURS_Y + lda #$0f ; White + sta P0C1 rts .endproc diff --git a/libsrc/atari7800/mono_cputc.s b/libsrc/atari7800/mono_cputc.s index 5735749ea..4a7e5638c 100644 --- a/libsrc/atari7800/mono_cputc.s +++ b/libsrc/atari7800/mono_cputc.s @@ -7,20 +7,20 @@ .export _mono_cputc .import _mono_gotoxy, _mono_gotox, _mono_gotoy, pusha0 - .import pushax - .import _mono_screen + .import pushax + .import _mono_screen .include "atari7800.inc" .include "extzp.inc" - .code + .code ;--------------------------------------------------------------------------- ; 8x16 routine umula0: ldy #8 ; Number of bits - lda #0 + lda #0 lsr ptr7800 ; Get first bit into carry @L0: bcc @L1 @@ -28,7 +28,7 @@ umula0: adc ptrtmp tax lda ptrtmp+1 ; hi byte of left op - clc + clc adc ptr7800+1 sta ptr7800+1 txa @@ -49,54 +49,54 @@ umula0: ; .proc _mono_cputc - cmp #$0A ; LF + cmp #$0A ; LF bne @L4 -@L1: lda #0 ; newline - jsr _mono_gotox - lda CURS_Y - cmp #(screenrows-1) +@L1: lda #0 ; newline + jsr _mono_gotox + lda CURS_Y + cmp #(screenrows-1) bne @L2 - lda #0 - beq @L3 -@L2: clc - adc #1 -@L3: jmp _mono_gotoy + lda #0 + beq @L3 +@L2: clc + adc #1 +@L3: jmp _mono_gotoy @L4: - pha + pha - lda #0 - sta ptr7800+1 - sta ptrtmp+1 - lda CURS_Y ; Find position on screen buffer - sta ptr7800 - lda #mono_charsperline - sta ptrtmp - jsr umula0 - clc - adc CURS_X - bcc @L11 - inx -@L11: clc - adc #<(_mono_screen) - sta ptr7800 - bcc @L12 - inx -@L12: txa - clc - adc #>(_mono_screen) - sta ptr7800+1 + lda #0 + sta ptr7800+1 + sta ptrtmp+1 + lda CURS_Y ; Find position on screen buffer + sta ptr7800 + lda #mono_charsperline + sta ptrtmp + jsr umula0 + clc + adc CURS_X + bcc @L11 + inx +@L11: clc + adc #<(_mono_screen) + sta ptr7800 + bcc @L12 + inx +@L12: txa + clc + adc #>(_mono_screen) + sta ptr7800+1 - pla ; Print character on screen - ldy #0 - sta (ptr7800),y + pla ; Print character on screen + ldy #0 + sta (ptr7800),y - lda CURS_X ; Increment cursor - cmp #(mono_charsperline-1) - beq @L1 - clc - adc #1 - jmp _mono_gotox + lda CURS_X ; Increment cursor + cmp #(mono_charsperline-1) + beq @L1 + clc + adc #1 + jmp _mono_gotox .endproc diff --git a/libsrc/atari7800/mono_font.s b/libsrc/atari7800/mono_font.s index 3c828544a..d07266989 100644 --- a/libsrc/atari7800/mono_font.s +++ b/libsrc/atari7800/mono_font.s @@ -1,2052 +1,2052 @@ - .export _mono_font - .segment "RODATA" - .align 256 + .export _mono_font + .segment "RODATA" + .align 256 _mono_font: - .byte $00 - .byte $7e - .byte $7e - .byte $00 - .byte $00 - .byte $7c - .byte $7c - .byte $00 - .byte $ff - .byte $00 - .byte $ff - .byte $78 - .byte $18 - .byte $e0 - .byte $c0 - .byte $99 - .byte $00 - .byte $00 - .byte $18 - .byte $00 - .byte $00 - .byte $78 - .byte $00 - .byte $ff - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $60 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $60 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $ff - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $f8 - .byte $00 - .byte $00 - .byte $78 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $f0 - .byte $1e - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $f8 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $78 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $38 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $f8 - .byte $00 - .byte $00 - .byte $18 - .byte $00 - .byte $30 - .byte $c7 - .byte $70 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $0f - .byte $03 - .byte $00 - .byte $00 - .byte $00 - .byte $88 - .byte $aa - .byte $ee - .byte $18 - .byte $18 - .byte $18 - .byte $36 - .byte $36 - .byte $18 - .byte $36 - .byte $36 - .byte $36 - .byte $00 - .byte $00 - .byte $00 - .byte $18 - .byte $00 - .byte $00 - .byte $18 - .byte $18 - .byte $00 - .byte $18 - .byte $18 - .byte $36 - .byte $00 - .byte $36 - .byte $00 - .byte $36 - .byte $36 - .byte $00 - .byte $36 - .byte $00 - .byte $00 - .byte $18 - .byte $36 - .byte $00 - .byte $00 - .byte $18 - .byte $36 - .byte $36 - .byte $18 - .byte $00 - .byte $18 - .byte $ff - .byte $ff - .byte $f0 - .byte $0f - .byte $00 - .byte $00 - .byte $c0 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $c0 - .byte $00 - .byte $fc - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $c0 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $18 - .byte $70 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $1c - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $81 - .byte $ff - .byte $10 - .byte $10 - .byte $38 - .byte $38 - .byte $00 - .byte $ff - .byte $3c - .byte $c3 - .byte $cc - .byte $7e - .byte $f0 - .byte $e6 - .byte $5a - .byte $80 - .byte $02 - .byte $3c - .byte $66 - .byte $1b - .byte $cc - .byte $7e - .byte $18 - .byte $18 - .byte $18 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $30 - .byte $00 - .byte $6c - .byte $30 - .byte $c6 - .byte $76 - .byte $00 - .byte $18 - .byte $60 - .byte $00 - .byte $00 - .byte $30 - .byte $00 - .byte $30 - .byte $80 - .byte $7c - .byte $fc - .byte $fc - .byte $78 - .byte $1e - .byte $78 - .byte $78 - .byte $30 - .byte $78 - .byte $70 - .byte $30 - .byte $30 - .byte $18 - .byte $00 - .byte $60 - .byte $30 - .byte $78 - .byte $cc - .byte $fc - .byte $3c - .byte $f8 - .byte $fe - .byte $f0 - .byte $3e - .byte $cc - .byte $78 - .byte $78 - .byte $e6 - .byte $fe - .byte $c6 - .byte $c6 - .byte $38 - .byte $f0 - .byte $1c - .byte $e6 - .byte $78 - .byte $78 - .byte $fc - .byte $30 - .byte $c6 - .byte $c6 - .byte $78 - .byte $fe - .byte $78 - .byte $02 - .byte $78 - .byte $00 - .byte $00 - .byte $00 - .byte $76 - .byte $dc - .byte $78 - .byte $76 - .byte $78 - .byte $f0 - .byte $0c - .byte $e6 - .byte $78 - .byte $cc - .byte $e6 - .byte $78 - .byte $c6 - .byte $cc - .byte $78 - .byte $60 - .byte $0c - .byte $f0 - .byte $f8 - .byte $18 - .byte $76 - .byte $30 - .byte $6c - .byte $c6 - .byte $0c - .byte $fc - .byte $1c - .byte $18 - .byte $e0 - .byte $00 - .byte $fe - .byte $0c - .byte $7e - .byte $78 - .byte $3f - .byte $7e - .byte $7e - .byte $7e - .byte $0c - .byte $3c - .byte $78 - .byte $78 - .byte $78 - .byte $3c - .byte $78 - .byte $c6 - .byte $cc - .byte $fc - .byte $7f - .byte $ce - .byte $78 - .byte $78 - .byte $78 - .byte $7e - .byte $7e - .byte $0c - .byte $18 - .byte $78 - .byte $18 - .byte $fc - .byte $30 - .byte $c6 - .byte $d8 - .byte $7e - .byte $78 - .byte $78 - .byte $7e - .byte $cc - .byte $cc - .byte $00 - .byte $00 - .byte $78 - .byte $00 - .byte $00 - .byte $cc - .byte $cf - .byte $18 - .byte $00 - .byte $00 - .byte $22 - .byte $55 - .byte $db - .byte $18 - .byte $18 - .byte $18 - .byte $36 - .byte $36 - .byte $18 - .byte $36 - .byte $36 - .byte $36 - .byte $00 - .byte $00 - .byte $00 - .byte $18 - .byte $00 - .byte $00 - .byte $18 - .byte $18 - .byte $00 - .byte $18 - .byte $18 - .byte $36 - .byte $00 - .byte $36 - .byte $00 - .byte $36 - .byte $36 - .byte $00 - .byte $36 - .byte $00 - .byte $00 - .byte $18 - .byte $36 - .byte $00 - .byte $00 - .byte $18 - .byte $36 - .byte $36 - .byte $18 - .byte $00 - .byte $18 - .byte $ff - .byte $ff - .byte $f0 - .byte $0f - .byte $00 - .byte $76 - .byte $c0 - .byte $c0 - .byte $6c - .byte $fc - .byte $70 - .byte $60 - .byte $18 - .byte $30 - .byte $38 - .byte $ee - .byte $78 - .byte $00 - .byte $60 - .byte $38 - .byte $cc - .byte $00 - .byte $fc - .byte $fc - .byte $fc - .byte $18 - .byte $d8 - .byte $30 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $3c - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $99 - .byte $e7 - .byte $38 - .byte $38 - .byte $7c - .byte $7c - .byte $18 - .byte $e7 - .byte $66 - .byte $99 - .byte $cc - .byte $18 - .byte $70 - .byte $67 - .byte $3c - .byte $e0 - .byte $0e - .byte $7e - .byte $00 - .byte $1b - .byte $38 - .byte $7e - .byte $3c - .byte $18 - .byte $3c - .byte $18 - .byte $30 - .byte $fe - .byte $24 - .byte $ff - .byte $18 - .byte $00 - .byte $00 - .byte $00 - .byte $6c - .byte $f8 - .byte $66 - .byte $cc - .byte $00 - .byte $30 - .byte $30 - .byte $66 - .byte $30 - .byte $30 - .byte $00 - .byte $30 - .byte $c0 - .byte $e6 - .byte $30 - .byte $cc - .byte $cc - .byte $0c - .byte $cc - .byte $cc - .byte $30 - .byte $cc - .byte $18 - .byte $30 - .byte $30 - .byte $30 - .byte $fc - .byte $30 - .byte $00 - .byte $c0 - .byte $cc - .byte $66 - .byte $66 - .byte $6c - .byte $62 - .byte $60 - .byte $66 - .byte $cc - .byte $30 - .byte $cc - .byte $66 - .byte $66 - .byte $c6 - .byte $c6 - .byte $6c - .byte $60 - .byte $78 - .byte $66 - .byte $cc - .byte $30 - .byte $cc - .byte $78 - .byte $ee - .byte $6c - .byte $30 - .byte $66 - .byte $60 - .byte $06 - .byte $18 - .byte $00 - .byte $00 - .byte $00 - .byte $cc - .byte $66 - .byte $cc - .byte $cc - .byte $c0 - .byte $60 - .byte $7c - .byte $66 - .byte $30 - .byte $cc - .byte $6c - .byte $30 - .byte $d6 - .byte $cc - .byte $cc - .byte $7c - .byte $7c - .byte $60 - .byte $0c - .byte $34 - .byte $cc - .byte $78 - .byte $fe - .byte $6c - .byte $7c - .byte $64 - .byte $30 - .byte $18 - .byte $30 - .byte $00 - .byte $c6 - .byte $18 - .byte $cc - .byte $c0 - .byte $66 - .byte $cc - .byte $cc - .byte $cc - .byte $78 - .byte $60 - .byte $c0 - .byte $c0 - .byte $30 - .byte $18 - .byte $30 - .byte $c6 - .byte $fc - .byte $60 - .byte $cc - .byte $cc - .byte $cc - .byte $cc - .byte $cc - .byte $cc - .byte $cc - .byte $7c - .byte $3c - .byte $cc - .byte $7e - .byte $e6 - .byte $fc - .byte $cf - .byte $18 - .byte $cc - .byte $30 - .byte $cc - .byte $cc - .byte $cc - .byte $dc - .byte $7e - .byte $7c - .byte $cc - .byte $c0 - .byte $0c - .byte $66 - .byte $6f - .byte $18 - .byte $33 - .byte $cc - .byte $88 - .byte $aa - .byte $77 - .byte $18 - .byte $18 - .byte $18 - .byte $36 - .byte $36 - .byte $18 - .byte $36 - .byte $36 - .byte $36 - .byte $00 - .byte $00 - .byte $00 - .byte $18 - .byte $00 - .byte $00 - .byte $18 - .byte $18 - .byte $00 - .byte $18 - .byte $18 - .byte $36 - .byte $00 - .byte $36 - .byte $00 - .byte $36 - .byte $36 - .byte $00 - .byte $36 - .byte $00 - .byte $00 - .byte $18 - .byte $36 - .byte $00 - .byte $00 - .byte $18 - .byte $36 - .byte $36 - .byte $18 - .byte $00 - .byte $18 - .byte $ff - .byte $ff - .byte $f0 - .byte $0f - .byte $00 - .byte $dc - .byte $f8 - .byte $c0 - .byte $6c - .byte $cc - .byte $d8 - .byte $7c - .byte $18 - .byte $78 - .byte $6c - .byte $6c - .byte $cc - .byte $7e - .byte $7e - .byte $60 - .byte $cc - .byte $fc - .byte $00 - .byte $00 - .byte $00 - .byte $18 - .byte $d8 - .byte $30 - .byte $dc - .byte $00 - .byte $00 - .byte $00 - .byte $6c - .byte $00 - .byte $00 - .byte $3c - .byte $00 - .byte $00 - .byte $bd - .byte $c3 - .byte $7c - .byte $7c - .byte $fe - .byte $fe - .byte $3c - .byte $c3 - .byte $42 - .byte $bd - .byte $cc - .byte $3c - .byte $30 - .byte $63 - .byte $e7 - .byte $f8 - .byte $3e - .byte $18 - .byte $66 - .byte $1b - .byte $6c - .byte $7e - .byte $7e - .byte $18 - .byte $7e - .byte $0c - .byte $60 - .byte $c0 - .byte $66 - .byte $ff - .byte $3c - .byte $00 - .byte $30 - .byte $00 - .byte $fe - .byte $0c - .byte $30 - .byte $dc - .byte $00 - .byte $60 - .byte $18 - .byte $3c - .byte $30 - .byte $00 - .byte $00 - .byte $00 - .byte $60 - .byte $f6 - .byte $30 - .byte $60 - .byte $0c - .byte $fe - .byte $0c - .byte $cc - .byte $30 - .byte $cc - .byte $0c - .byte $00 - .byte $00 - .byte $60 - .byte $00 - .byte $18 - .byte $30 - .byte $de - .byte $fc - .byte $66 - .byte $c0 - .byte $66 - .byte $68 - .byte $68 - .byte $ce - .byte $cc - .byte $30 - .byte $cc - .byte $6c - .byte $62 - .byte $d6 - .byte $ce - .byte $c6 - .byte $60 - .byte $dc - .byte $6c - .byte $1c - .byte $30 - .byte $cc - .byte $cc - .byte $fe - .byte $38 - .byte $30 - .byte $32 - .byte $60 - .byte $0c - .byte $18 - .byte $00 - .byte $00 - .byte $00 - .byte $7c - .byte $66 - .byte $c0 - .byte $cc - .byte $fc - .byte $60 - .byte $cc - .byte $66 - .byte $30 - .byte $0c - .byte $78 - .byte $30 - .byte $fe - .byte $cc - .byte $cc - .byte $66 - .byte $cc - .byte $66 - .byte $78 - .byte $30 - .byte $cc - .byte $cc - .byte $fe - .byte $38 - .byte $cc - .byte $30 - .byte $30 - .byte $18 - .byte $30 - .byte $00 - .byte $c6 - .byte $78 - .byte $cc - .byte $fc - .byte $3e - .byte $7c - .byte $7c - .byte $7c - .byte $c0 - .byte $7e - .byte $fc - .byte $fc - .byte $30 - .byte $18 - .byte $30 - .byte $fe - .byte $cc - .byte $78 - .byte $7f - .byte $cc - .byte $cc - .byte $cc - .byte $cc - .byte $cc - .byte $cc - .byte $cc - .byte $66 - .byte $cc - .byte $c0 - .byte $60 - .byte $30 - .byte $c6 - .byte $18 - .byte $7c - .byte $30 - .byte $cc - .byte $cc - .byte $cc - .byte $fc - .byte $00 - .byte $00 - .byte $c0 - .byte $c0 - .byte $0c - .byte $33 - .byte $37 - .byte $18 - .byte $66 - .byte $66 - .byte $22 - .byte $55 - .byte $db - .byte $18 - .byte $f8 - .byte $f8 - .byte $f6 - .byte $fe - .byte $f8 - .byte $f6 - .byte $36 - .byte $f6 - .byte $fe - .byte $fe - .byte $f8 - .byte $f8 - .byte $1f - .byte $ff - .byte $ff - .byte $1f - .byte $ff - .byte $ff - .byte $1f - .byte $37 - .byte $3f - .byte $37 - .byte $ff - .byte $f7 - .byte $37 - .byte $ff - .byte $f7 - .byte $ff - .byte $ff - .byte $ff - .byte $ff - .byte $3f - .byte $1f - .byte $1f - .byte $3f - .byte $ff - .byte $ff - .byte $f8 - .byte $1f - .byte $ff - .byte $ff - .byte $f0 - .byte $0f - .byte $00 - .byte $c8 - .byte $cc - .byte $c0 - .byte $6c - .byte $60 - .byte $d8 - .byte $66 - .byte $18 - .byte $cc - .byte $c6 - .byte $6c - .byte $cc - .byte $db - .byte $db - .byte $c0 - .byte $cc - .byte $00 - .byte $30 - .byte $60 - .byte $18 - .byte $18 - .byte $18 - .byte $00 - .byte $76 - .byte $00 - .byte $18 - .byte $18 - .byte $ec - .byte $6c - .byte $78 - .byte $3c - .byte $00 - .byte $00 - .byte $81 - .byte $ff - .byte $fe - .byte $fe - .byte $fe - .byte $7c - .byte $3c - .byte $c3 - .byte $42 - .byte $bd - .byte $7d - .byte $66 - .byte $30 - .byte $63 - .byte $e7 - .byte $fe - .byte $fe - .byte $18 - .byte $66 - .byte $7b - .byte $6c - .byte $00 - .byte $18 - .byte $18 - .byte $18 - .byte $fe - .byte $fe - .byte $c0 - .byte $ff - .byte $7e - .byte $7e - .byte $00 - .byte $30 - .byte $00 - .byte $6c - .byte $78 - .byte $18 - .byte $76 - .byte $00 - .byte $60 - .byte $18 - .byte $ff - .byte $fc - .byte $00 - .byte $fc - .byte $00 - .byte $30 - .byte $de - .byte $30 - .byte $38 - .byte $38 - .byte $cc - .byte $0c - .byte $f8 - .byte $18 - .byte $78 - .byte $7c - .byte $00 - .byte $00 - .byte $c0 - .byte $00 - .byte $0c - .byte $18 - .byte $de - .byte $cc - .byte $7c - .byte $c0 - .byte $66 - .byte $78 - .byte $78 - .byte $c0 - .byte $fc - .byte $30 - .byte $0c - .byte $78 - .byte $60 - .byte $fe - .byte $de - .byte $c6 - .byte $7c - .byte $cc - .byte $7c - .byte $70 - .byte $30 - .byte $cc - .byte $cc - .byte $d6 - .byte $38 - .byte $78 - .byte $18 - .byte $60 - .byte $18 - .byte $18 - .byte $c6 - .byte $00 - .byte $00 - .byte $0c - .byte $7c - .byte $cc - .byte $7c - .byte $cc - .byte $f0 - .byte $cc - .byte $76 - .byte $30 - .byte $0c - .byte $6c - .byte $30 - .byte $fe - .byte $cc - .byte $cc - .byte $66 - .byte $cc - .byte $76 - .byte $c0 - .byte $30 - .byte $cc - .byte $cc - .byte $d6 - .byte $6c - .byte $cc - .byte $98 - .byte $e0 - .byte $00 - .byte $1c - .byte $00 - .byte $6c - .byte $cc - .byte $cc - .byte $cc - .byte $06 - .byte $0c - .byte $0c - .byte $0c - .byte $c0 - .byte $66 - .byte $cc - .byte $cc - .byte $30 - .byte $18 - .byte $30 - .byte $c6 - .byte $78 - .byte $60 - .byte $0c - .byte $fe - .byte $78 - .byte $78 - .byte $78 - .byte $cc - .byte $cc - .byte $cc - .byte $66 - .byte $cc - .byte $c0 - .byte $f0 - .byte $fc - .byte $fa - .byte $3c - .byte $0c - .byte $30 - .byte $78 - .byte $cc - .byte $f8 - .byte $ec - .byte $3e - .byte $38 - .byte $60 - .byte $fc - .byte $fc - .byte $de - .byte $db - .byte $18 - .byte $cc - .byte $33 - .byte $88 - .byte $aa - .byte $ee - .byte $18 - .byte $18 - .byte $18 - .byte $36 - .byte $00 - .byte $18 - .byte $06 - .byte $36 - .byte $06 - .byte $06 - .byte $36 - .byte $18 - .byte $00 - .byte $18 - .byte $18 - .byte $00 - .byte $18 - .byte $00 - .byte $18 - .byte $18 - .byte $36 - .byte $30 - .byte $30 - .byte $00 - .byte $00 - .byte $30 - .byte $00 - .byte $00 - .byte $00 - .byte $36 - .byte $00 - .byte $00 - .byte $36 - .byte $18 - .byte $18 - .byte $00 - .byte $36 - .byte $18 - .byte $18 - .byte $00 - .byte $ff - .byte $00 - .byte $f0 - .byte $0f - .byte $ff - .byte $dc - .byte $f8 - .byte $c0 - .byte $6c - .byte $30 - .byte $d8 - .byte $66 - .byte $18 - .byte $cc - .byte $fe - .byte $c6 - .byte $7c - .byte $db - .byte $db - .byte $f8 - .byte $cc - .byte $fc - .byte $30 - .byte $30 - .byte $30 - .byte $18 - .byte $18 - .byte $fc - .byte $00 - .byte $38 - .byte $18 - .byte $00 - .byte $0c - .byte $6c - .byte $60 - .byte $3c - .byte $00 - .byte $00 - .byte $a5 - .byte $db - .byte $fe - .byte $7c - .byte $38 - .byte $38 - .byte $18 - .byte $e7 - .byte $66 - .byte $99 - .byte $0f - .byte $66 - .byte $3f - .byte $7f - .byte $3c - .byte $f8 - .byte $3e - .byte $7e - .byte $66 - .byte $db - .byte $38 - .byte $00 - .byte $7e - .byte $7e - .byte $18 - .byte $0c - .byte $60 - .byte $c0 - .byte $66 - .byte $3c - .byte $ff - .byte $00 - .byte $78 - .byte $6c - .byte $fe - .byte $c0 - .byte $cc - .byte $38 - .byte $c0 - .byte $60 - .byte $18 - .byte $3c - .byte $30 - .byte $00 - .byte $00 - .byte $00 - .byte $18 - .byte $ce - .byte $30 - .byte $0c - .byte $0c - .byte $6c - .byte $f8 - .byte $c0 - .byte $0c - .byte $cc - .byte $cc - .byte $30 - .byte $30 - .byte $60 - .byte $fc - .byte $18 - .byte $0c - .byte $de - .byte $cc - .byte $66 - .byte $c0 - .byte $66 - .byte $68 - .byte $68 - .byte $c0 - .byte $cc - .byte $30 - .byte $0c - .byte $6c - .byte $60 - .byte $fe - .byte $f6 - .byte $c6 - .byte $66 - .byte $cc - .byte $66 - .byte $e0 - .byte $30 - .byte $cc - .byte $cc - .byte $c6 - .byte $6c - .byte $cc - .byte $8c - .byte $60 - .byte $30 - .byte $18 - .byte $6c - .byte $00 - .byte $18 - .byte $78 - .byte $60 - .byte $78 - .byte $0c - .byte $78 - .byte $60 - .byte $76 - .byte $6c - .byte $70 - .byte $0c - .byte $66 - .byte $30 - .byte $cc - .byte $f8 - .byte $78 - .byte $dc - .byte $76 - .byte $dc - .byte $7c - .byte $7c - .byte $cc - .byte $cc - .byte $c6 - .byte $c6 - .byte $cc - .byte $fc - .byte $30 - .byte $18 - .byte $30 - .byte $00 - .byte $38 - .byte $c0 - .byte $00 - .byte $78 - .byte $3c - .byte $78 - .byte $78 - .byte $78 - .byte $78 - .byte $3c - .byte $78 - .byte $78 - .byte $70 - .byte $38 - .byte $70 - .byte $6c - .byte $00 - .byte $fc - .byte $7f - .byte $cc - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $3c - .byte $cc - .byte $7e - .byte $64 - .byte $78 - .byte $cc - .byte $18 - .byte $78 - .byte $70 - .byte $00 - .byte $00 - .byte $00 - .byte $cc - .byte $6c - .byte $6c - .byte $30 - .byte $00 - .byte $00 - .byte $cc - .byte $cc - .byte $00 - .byte $66 - .byte $66 - .byte $22 - .byte $55 - .byte $db - .byte $18 - .byte $18 - .byte $f8 - .byte $36 - .byte $00 - .byte $f8 - .byte $f6 - .byte $36 - .byte $fe - .byte $f6 - .byte $36 - .byte $f8 - .byte $00 - .byte $18 - .byte $18 - .byte $00 - .byte $18 - .byte $00 - .byte $18 - .byte $1f - .byte $36 - .byte $37 - .byte $3f - .byte $f7 - .byte $ff - .byte $37 - .byte $ff - .byte $f7 - .byte $ff - .byte $36 - .byte $ff - .byte $00 - .byte $36 - .byte $1f - .byte $1f - .byte $00 - .byte $36 - .byte $ff - .byte $18 - .byte $00 - .byte $ff - .byte $00 - .byte $f0 - .byte $0f - .byte $ff - .byte $76 - .byte $cc - .byte $cc - .byte $6c - .byte $60 - .byte $7e - .byte $66 - .byte $dc - .byte $78 - .byte $c6 - .byte $c6 - .byte $18 - .byte $7e - .byte $7e - .byte $c0 - .byte $cc - .byte $00 - .byte $fc - .byte $18 - .byte $60 - .byte $1b - .byte $18 - .byte $00 - .byte $dc - .byte $6c - .byte $00 - .byte $00 - .byte $0c - .byte $6c - .byte $30 - .byte $3c - .byte $00 - .byte $00 - .byte $81 - .byte $ff - .byte $fe - .byte $38 - .byte $7c - .byte $10 - .byte $00 - .byte $ff - .byte $3c - .byte $c3 - .byte $07 - .byte $66 - .byte $33 - .byte $63 - .byte $5a - .byte $e0 - .byte $0e - .byte $3c - .byte $66 - .byte $db - .byte $63 - .byte $00 - .byte $3c - .byte $3c - .byte $18 - .byte $18 - .byte $30 - .byte $00 - .byte $24 - .byte $18 - .byte $ff - .byte $00 - .byte $78 - .byte $6c - .byte $6c - .byte $7c - .byte $c6 - .byte $6c - .byte $60 - .byte $30 - .byte $30 - .byte $66 - .byte $30 - .byte $00 - .byte $00 - .byte $00 - .byte $0c - .byte $c6 - .byte $70 - .byte $cc - .byte $cc - .byte $3c - .byte $c0 - .byte $60 - .byte $cc - .byte $cc - .byte $cc - .byte $30 - .byte $30 - .byte $30 - .byte $00 - .byte $30 - .byte $cc - .byte $c6 - .byte $78 - .byte $66 - .byte $66 - .byte $6c - .byte $62 - .byte $62 - .byte $66 - .byte $cc - .byte $30 - .byte $0c - .byte $66 - .byte $60 - .byte $ee - .byte $e6 - .byte $6c - .byte $66 - .byte $cc - .byte $66 - .byte $cc - .byte $b4 - .byte $cc - .byte $cc - .byte $c6 - .byte $c6 - .byte $cc - .byte $c6 - .byte $60 - .byte $60 - .byte $18 - .byte $38 - .byte $00 - .byte $30 - .byte $00 - .byte $60 - .byte $00 - .byte $0c - .byte $00 - .byte $6c - .byte $00 - .byte $60 - .byte $00 - .byte $00 - .byte $60 - .byte $30 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $30 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $30 - .byte $18 - .byte $30 - .byte $dc - .byte $10 - .byte $cc - .byte $cc - .byte $00 - .byte $c3 - .byte $00 - .byte $00 - .byte $30 - .byte $00 - .byte $c3 - .byte $00 - .byte $00 - .byte $00 - .byte $c6 - .byte $00 - .byte $38 - .byte $30 - .byte $00 - .byte $00 - .byte $6c - .byte $cc - .byte $cc - .byte $e0 - .byte $cc - .byte $e0 - .byte $cc - .byte $18 - .byte $00 - .byte $18 - .byte $6c - .byte $cc - .byte $cc - .byte $1b - .byte $00 - .byte $00 - .byte $1c - .byte $1c - .byte $f8 - .byte $00 - .byte $6c - .byte $6c - .byte $00 - .byte $00 - .byte $00 - .byte $c6 - .byte $c6 - .byte $18 - .byte $33 - .byte $cc - .byte $88 - .byte $aa - .byte $77 - .byte $18 - .byte $18 - .byte $18 - .byte $36 - .byte $00 - .byte $00 - .byte $36 - .byte $36 - .byte $00 - .byte $36 - .byte $36 - .byte $18 - .byte $00 - .byte $18 - .byte $18 - .byte $00 - .byte $18 - .byte $00 - .byte $18 - .byte $18 - .byte $36 - .byte $36 - .byte $00 - .byte $36 - .byte $00 - .byte $36 - .byte $00 - .byte $36 - .byte $18 - .byte $36 - .byte $00 - .byte $00 - .byte $36 - .byte $18 - .byte $00 - .byte $00 - .byte $36 - .byte $18 - .byte $18 - .byte $00 - .byte $ff - .byte $00 - .byte $f0 - .byte $0f - .byte $ff - .byte $00 - .byte $78 - .byte $fc - .byte $fe - .byte $cc - .byte $00 - .byte $66 - .byte $76 - .byte $30 - .byte $6c - .byte $6c - .byte $30 - .byte $00 - .byte $0c - .byte $60 - .byte $cc - .byte $fc - .byte $30 - .byte $30 - .byte $30 - .byte $1b - .byte $18 - .byte $30 - .byte $76 - .byte $6c - .byte $00 - .byte $00 - .byte $0c - .byte $6c - .byte $18 - .byte $00 - .byte $00 - .byte $00 - .byte $7e - .byte $7e - .byte $6c - .byte $10 - .byte $38 - .byte $10 - .byte $00 - .byte $ff - .byte $00 - .byte $ff - .byte $0f - .byte $3c - .byte $3f - .byte $7f - .byte $99 - .byte $80 - .byte $02 - .byte $18 - .byte $66 - .byte $7f - .byte $3e - .byte $00 - .byte $18 - .byte $18 - .byte $18 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $30 - .byte $6c - .byte $6c - .byte $30 - .byte $00 - .byte $38 - .byte $60 - .byte $18 - .byte $60 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $06 - .byte $7c - .byte $30 - .byte $78 - .byte $78 - .byte $1c - .byte $fc - .byte $38 - .byte $fc - .byte $78 - .byte $78 - .byte $00 - .byte $00 - .byte $18 - .byte $00 - .byte $60 - .byte $78 - .byte $7c - .byte $30 - .byte $fc - .byte $3c - .byte $f8 - .byte $fe - .byte $fe - .byte $3c - .byte $cc - .byte $78 - .byte $1e - .byte $e6 - .byte $f0 - .byte $c6 - .byte $c6 - .byte $38 - .byte $fc - .byte $78 - .byte $fc - .byte $78 - .byte $fc - .byte $cc - .byte $cc - .byte $c6 - .byte $c6 - .byte $cc - .byte $fe - .byte $78 - .byte $c0 - .byte $78 - .byte $10 - .byte $00 - .byte $30 - .byte $00 - .byte $e0 - .byte $00 - .byte $1c - .byte $00 - .byte $38 - .byte $00 - .byte $e0 - .byte $30 - .byte $0c - .byte $e0 - .byte $70 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $10 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $1c - .byte $18 - .byte $e0 - .byte $76 - .byte $00 - .byte $78 - .byte $00 - .byte $1c - .byte $7e - .byte $cc - .byte $e0 - .byte $30 - .byte $00 - .byte $7e - .byte $cc - .byte $e0 - .byte $cc - .byte $7c - .byte $e0 - .byte $c6 - .byte $30 - .byte $1c - .byte $00 - .byte $3e - .byte $78 - .byte $00 - .byte $00 - .byte $78 - .byte $00 - .byte $00 - .byte $c3 - .byte $cc - .byte $18 - .byte $38 - .byte $cc - .byte $f8 - .byte $0e - .byte $1c - .byte $38 - .byte $00 - .byte $00 - .byte $00 - .byte $fc - .byte $3c - .byte $38 - .byte $30 - .byte $00 - .byte $00 - .byte $c3 - .byte $c3 - .byte $18 - .byte $00 - .byte $00 - .byte $22 - .byte $55 - .byte $db - .byte $18 - .byte $18 - .byte $18 - .byte $36 - .byte $00 - .byte $00 - .byte $36 - .byte $36 - .byte $00 - .byte $36 - .byte $36 - .byte $18 - .byte $00 - .byte $18 - .byte $18 - .byte $00 - .byte $18 - .byte $00 - .byte $18 - .byte $18 - .byte $36 - .byte $36 - .byte $00 - .byte $36 - .byte $00 - .byte $36 - .byte $00 - .byte $36 - .byte $18 - .byte $36 - .byte $00 - .byte $00 - .byte $36 - .byte $18 - .byte $00 - .byte $00 - .byte $36 - .byte $18 - .byte $18 - .byte $00 - .byte $ff - .byte $00 - .byte $f0 - .byte $0f - .byte $ff - .byte $00 - .byte $00 - .byte $00 - .byte $00 - .byte $fc - .byte $00 - .byte $00 - .byte $00 - .byte $fc - .byte $38 - .byte $38 - .byte $1c - .byte $00 - .byte $06 - .byte $38 - .byte $78 - .byte $00 - .byte $30 - .byte $60 - .byte $18 - .byte $0e - .byte $18 - .byte $30 - .byte $00 - .byte $38 - .byte $00 - .byte $00 - .byte $0f - .byte $78 - .byte $70 - .byte $00 - .byte $00 + .byte $00 + .byte $7e + .byte $7e + .byte $00 + .byte $00 + .byte $7c + .byte $7c + .byte $00 + .byte $ff + .byte $00 + .byte $ff + .byte $78 + .byte $18 + .byte $e0 + .byte $c0 + .byte $99 + .byte $00 + .byte $00 + .byte $18 + .byte $00 + .byte $00 + .byte $78 + .byte $00 + .byte $ff + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $60 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $60 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $ff + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $f8 + .byte $00 + .byte $00 + .byte $78 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $f0 + .byte $1e + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $f8 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $78 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $38 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $f8 + .byte $00 + .byte $00 + .byte $18 + .byte $00 + .byte $30 + .byte $c7 + .byte $70 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $0f + .byte $03 + .byte $00 + .byte $00 + .byte $00 + .byte $88 + .byte $aa + .byte $ee + .byte $18 + .byte $18 + .byte $18 + .byte $36 + .byte $36 + .byte $18 + .byte $36 + .byte $36 + .byte $36 + .byte $00 + .byte $00 + .byte $00 + .byte $18 + .byte $00 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $00 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $18 + .byte $36 + .byte $36 + .byte $18 + .byte $00 + .byte $18 + .byte $ff + .byte $ff + .byte $f0 + .byte $0f + .byte $00 + .byte $00 + .byte $c0 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $c0 + .byte $00 + .byte $fc + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $c0 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $18 + .byte $70 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $1c + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $81 + .byte $ff + .byte $10 + .byte $10 + .byte $38 + .byte $38 + .byte $00 + .byte $ff + .byte $3c + .byte $c3 + .byte $cc + .byte $7e + .byte $f0 + .byte $e6 + .byte $5a + .byte $80 + .byte $02 + .byte $3c + .byte $66 + .byte $1b + .byte $cc + .byte $7e + .byte $18 + .byte $18 + .byte $18 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $30 + .byte $00 + .byte $6c + .byte $30 + .byte $c6 + .byte $76 + .byte $00 + .byte $18 + .byte $60 + .byte $00 + .byte $00 + .byte $30 + .byte $00 + .byte $30 + .byte $80 + .byte $7c + .byte $fc + .byte $fc + .byte $78 + .byte $1e + .byte $78 + .byte $78 + .byte $30 + .byte $78 + .byte $70 + .byte $30 + .byte $30 + .byte $18 + .byte $00 + .byte $60 + .byte $30 + .byte $78 + .byte $cc + .byte $fc + .byte $3c + .byte $f8 + .byte $fe + .byte $f0 + .byte $3e + .byte $cc + .byte $78 + .byte $78 + .byte $e6 + .byte $fe + .byte $c6 + .byte $c6 + .byte $38 + .byte $f0 + .byte $1c + .byte $e6 + .byte $78 + .byte $78 + .byte $fc + .byte $30 + .byte $c6 + .byte $c6 + .byte $78 + .byte $fe + .byte $78 + .byte $02 + .byte $78 + .byte $00 + .byte $00 + .byte $00 + .byte $76 + .byte $dc + .byte $78 + .byte $76 + .byte $78 + .byte $f0 + .byte $0c + .byte $e6 + .byte $78 + .byte $cc + .byte $e6 + .byte $78 + .byte $c6 + .byte $cc + .byte $78 + .byte $60 + .byte $0c + .byte $f0 + .byte $f8 + .byte $18 + .byte $76 + .byte $30 + .byte $6c + .byte $c6 + .byte $0c + .byte $fc + .byte $1c + .byte $18 + .byte $e0 + .byte $00 + .byte $fe + .byte $0c + .byte $7e + .byte $78 + .byte $3f + .byte $7e + .byte $7e + .byte $7e + .byte $0c + .byte $3c + .byte $78 + .byte $78 + .byte $78 + .byte $3c + .byte $78 + .byte $c6 + .byte $cc + .byte $fc + .byte $7f + .byte $ce + .byte $78 + .byte $78 + .byte $78 + .byte $7e + .byte $7e + .byte $0c + .byte $18 + .byte $78 + .byte $18 + .byte $fc + .byte $30 + .byte $c6 + .byte $d8 + .byte $7e + .byte $78 + .byte $78 + .byte $7e + .byte $cc + .byte $cc + .byte $00 + .byte $00 + .byte $78 + .byte $00 + .byte $00 + .byte $cc + .byte $cf + .byte $18 + .byte $00 + .byte $00 + .byte $22 + .byte $55 + .byte $db + .byte $18 + .byte $18 + .byte $18 + .byte $36 + .byte $36 + .byte $18 + .byte $36 + .byte $36 + .byte $36 + .byte $00 + .byte $00 + .byte $00 + .byte $18 + .byte $00 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $00 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $18 + .byte $36 + .byte $36 + .byte $18 + .byte $00 + .byte $18 + .byte $ff + .byte $ff + .byte $f0 + .byte $0f + .byte $00 + .byte $76 + .byte $c0 + .byte $c0 + .byte $6c + .byte $fc + .byte $70 + .byte $60 + .byte $18 + .byte $30 + .byte $38 + .byte $ee + .byte $78 + .byte $00 + .byte $60 + .byte $38 + .byte $cc + .byte $00 + .byte $fc + .byte $fc + .byte $fc + .byte $18 + .byte $d8 + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $3c + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $99 + .byte $e7 + .byte $38 + .byte $38 + .byte $7c + .byte $7c + .byte $18 + .byte $e7 + .byte $66 + .byte $99 + .byte $cc + .byte $18 + .byte $70 + .byte $67 + .byte $3c + .byte $e0 + .byte $0e + .byte $7e + .byte $00 + .byte $1b + .byte $38 + .byte $7e + .byte $3c + .byte $18 + .byte $3c + .byte $18 + .byte $30 + .byte $fe + .byte $24 + .byte $ff + .byte $18 + .byte $00 + .byte $00 + .byte $00 + .byte $6c + .byte $f8 + .byte $66 + .byte $cc + .byte $00 + .byte $30 + .byte $30 + .byte $66 + .byte $30 + .byte $30 + .byte $00 + .byte $30 + .byte $c0 + .byte $e6 + .byte $30 + .byte $cc + .byte $cc + .byte $0c + .byte $cc + .byte $cc + .byte $30 + .byte $cc + .byte $18 + .byte $30 + .byte $30 + .byte $30 + .byte $fc + .byte $30 + .byte $00 + .byte $c0 + .byte $cc + .byte $66 + .byte $66 + .byte $6c + .byte $62 + .byte $60 + .byte $66 + .byte $cc + .byte $30 + .byte $cc + .byte $66 + .byte $66 + .byte $c6 + .byte $c6 + .byte $6c + .byte $60 + .byte $78 + .byte $66 + .byte $cc + .byte $30 + .byte $cc + .byte $78 + .byte $ee + .byte $6c + .byte $30 + .byte $66 + .byte $60 + .byte $06 + .byte $18 + .byte $00 + .byte $00 + .byte $00 + .byte $cc + .byte $66 + .byte $cc + .byte $cc + .byte $c0 + .byte $60 + .byte $7c + .byte $66 + .byte $30 + .byte $cc + .byte $6c + .byte $30 + .byte $d6 + .byte $cc + .byte $cc + .byte $7c + .byte $7c + .byte $60 + .byte $0c + .byte $34 + .byte $cc + .byte $78 + .byte $fe + .byte $6c + .byte $7c + .byte $64 + .byte $30 + .byte $18 + .byte $30 + .byte $00 + .byte $c6 + .byte $18 + .byte $cc + .byte $c0 + .byte $66 + .byte $cc + .byte $cc + .byte $cc + .byte $78 + .byte $60 + .byte $c0 + .byte $c0 + .byte $30 + .byte $18 + .byte $30 + .byte $c6 + .byte $fc + .byte $60 + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $7c + .byte $3c + .byte $cc + .byte $7e + .byte $e6 + .byte $fc + .byte $cf + .byte $18 + .byte $cc + .byte $30 + .byte $cc + .byte $cc + .byte $cc + .byte $dc + .byte $7e + .byte $7c + .byte $cc + .byte $c0 + .byte $0c + .byte $66 + .byte $6f + .byte $18 + .byte $33 + .byte $cc + .byte $88 + .byte $aa + .byte $77 + .byte $18 + .byte $18 + .byte $18 + .byte $36 + .byte $36 + .byte $18 + .byte $36 + .byte $36 + .byte $36 + .byte $00 + .byte $00 + .byte $00 + .byte $18 + .byte $00 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $00 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $18 + .byte $36 + .byte $36 + .byte $18 + .byte $00 + .byte $18 + .byte $ff + .byte $ff + .byte $f0 + .byte $0f + .byte $00 + .byte $dc + .byte $f8 + .byte $c0 + .byte $6c + .byte $cc + .byte $d8 + .byte $7c + .byte $18 + .byte $78 + .byte $6c + .byte $6c + .byte $cc + .byte $7e + .byte $7e + .byte $60 + .byte $cc + .byte $fc + .byte $00 + .byte $00 + .byte $00 + .byte $18 + .byte $d8 + .byte $30 + .byte $dc + .byte $00 + .byte $00 + .byte $00 + .byte $6c + .byte $00 + .byte $00 + .byte $3c + .byte $00 + .byte $00 + .byte $bd + .byte $c3 + .byte $7c + .byte $7c + .byte $fe + .byte $fe + .byte $3c + .byte $c3 + .byte $42 + .byte $bd + .byte $cc + .byte $3c + .byte $30 + .byte $63 + .byte $e7 + .byte $f8 + .byte $3e + .byte $18 + .byte $66 + .byte $1b + .byte $6c + .byte $7e + .byte $7e + .byte $18 + .byte $7e + .byte $0c + .byte $60 + .byte $c0 + .byte $66 + .byte $ff + .byte $3c + .byte $00 + .byte $30 + .byte $00 + .byte $fe + .byte $0c + .byte $30 + .byte $dc + .byte $00 + .byte $60 + .byte $18 + .byte $3c + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $60 + .byte $f6 + .byte $30 + .byte $60 + .byte $0c + .byte $fe + .byte $0c + .byte $cc + .byte $30 + .byte $cc + .byte $0c + .byte $00 + .byte $00 + .byte $60 + .byte $00 + .byte $18 + .byte $30 + .byte $de + .byte $fc + .byte $66 + .byte $c0 + .byte $66 + .byte $68 + .byte $68 + .byte $ce + .byte $cc + .byte $30 + .byte $cc + .byte $6c + .byte $62 + .byte $d6 + .byte $ce + .byte $c6 + .byte $60 + .byte $dc + .byte $6c + .byte $1c + .byte $30 + .byte $cc + .byte $cc + .byte $fe + .byte $38 + .byte $30 + .byte $32 + .byte $60 + .byte $0c + .byte $18 + .byte $00 + .byte $00 + .byte $00 + .byte $7c + .byte $66 + .byte $c0 + .byte $cc + .byte $fc + .byte $60 + .byte $cc + .byte $66 + .byte $30 + .byte $0c + .byte $78 + .byte $30 + .byte $fe + .byte $cc + .byte $cc + .byte $66 + .byte $cc + .byte $66 + .byte $78 + .byte $30 + .byte $cc + .byte $cc + .byte $fe + .byte $38 + .byte $cc + .byte $30 + .byte $30 + .byte $18 + .byte $30 + .byte $00 + .byte $c6 + .byte $78 + .byte $cc + .byte $fc + .byte $3e + .byte $7c + .byte $7c + .byte $7c + .byte $c0 + .byte $7e + .byte $fc + .byte $fc + .byte $30 + .byte $18 + .byte $30 + .byte $fe + .byte $cc + .byte $78 + .byte $7f + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $cc + .byte $66 + .byte $cc + .byte $c0 + .byte $60 + .byte $30 + .byte $c6 + .byte $18 + .byte $7c + .byte $30 + .byte $cc + .byte $cc + .byte $cc + .byte $fc + .byte $00 + .byte $00 + .byte $c0 + .byte $c0 + .byte $0c + .byte $33 + .byte $37 + .byte $18 + .byte $66 + .byte $66 + .byte $22 + .byte $55 + .byte $db + .byte $18 + .byte $f8 + .byte $f8 + .byte $f6 + .byte $fe + .byte $f8 + .byte $f6 + .byte $36 + .byte $f6 + .byte $fe + .byte $fe + .byte $f8 + .byte $f8 + .byte $1f + .byte $ff + .byte $ff + .byte $1f + .byte $ff + .byte $ff + .byte $1f + .byte $37 + .byte $3f + .byte $37 + .byte $ff + .byte $f7 + .byte $37 + .byte $ff + .byte $f7 + .byte $ff + .byte $ff + .byte $ff + .byte $ff + .byte $3f + .byte $1f + .byte $1f + .byte $3f + .byte $ff + .byte $ff + .byte $f8 + .byte $1f + .byte $ff + .byte $ff + .byte $f0 + .byte $0f + .byte $00 + .byte $c8 + .byte $cc + .byte $c0 + .byte $6c + .byte $60 + .byte $d8 + .byte $66 + .byte $18 + .byte $cc + .byte $c6 + .byte $6c + .byte $cc + .byte $db + .byte $db + .byte $c0 + .byte $cc + .byte $00 + .byte $30 + .byte $60 + .byte $18 + .byte $18 + .byte $18 + .byte $00 + .byte $76 + .byte $00 + .byte $18 + .byte $18 + .byte $ec + .byte $6c + .byte $78 + .byte $3c + .byte $00 + .byte $00 + .byte $81 + .byte $ff + .byte $fe + .byte $fe + .byte $fe + .byte $7c + .byte $3c + .byte $c3 + .byte $42 + .byte $bd + .byte $7d + .byte $66 + .byte $30 + .byte $63 + .byte $e7 + .byte $fe + .byte $fe + .byte $18 + .byte $66 + .byte $7b + .byte $6c + .byte $00 + .byte $18 + .byte $18 + .byte $18 + .byte $fe + .byte $fe + .byte $c0 + .byte $ff + .byte $7e + .byte $7e + .byte $00 + .byte $30 + .byte $00 + .byte $6c + .byte $78 + .byte $18 + .byte $76 + .byte $00 + .byte $60 + .byte $18 + .byte $ff + .byte $fc + .byte $00 + .byte $fc + .byte $00 + .byte $30 + .byte $de + .byte $30 + .byte $38 + .byte $38 + .byte $cc + .byte $0c + .byte $f8 + .byte $18 + .byte $78 + .byte $7c + .byte $00 + .byte $00 + .byte $c0 + .byte $00 + .byte $0c + .byte $18 + .byte $de + .byte $cc + .byte $7c + .byte $c0 + .byte $66 + .byte $78 + .byte $78 + .byte $c0 + .byte $fc + .byte $30 + .byte $0c + .byte $78 + .byte $60 + .byte $fe + .byte $de + .byte $c6 + .byte $7c + .byte $cc + .byte $7c + .byte $70 + .byte $30 + .byte $cc + .byte $cc + .byte $d6 + .byte $38 + .byte $78 + .byte $18 + .byte $60 + .byte $18 + .byte $18 + .byte $c6 + .byte $00 + .byte $00 + .byte $0c + .byte $7c + .byte $cc + .byte $7c + .byte $cc + .byte $f0 + .byte $cc + .byte $76 + .byte $30 + .byte $0c + .byte $6c + .byte $30 + .byte $fe + .byte $cc + .byte $cc + .byte $66 + .byte $cc + .byte $76 + .byte $c0 + .byte $30 + .byte $cc + .byte $cc + .byte $d6 + .byte $6c + .byte $cc + .byte $98 + .byte $e0 + .byte $00 + .byte $1c + .byte $00 + .byte $6c + .byte $cc + .byte $cc + .byte $cc + .byte $06 + .byte $0c + .byte $0c + .byte $0c + .byte $c0 + .byte $66 + .byte $cc + .byte $cc + .byte $30 + .byte $18 + .byte $30 + .byte $c6 + .byte $78 + .byte $60 + .byte $0c + .byte $fe + .byte $78 + .byte $78 + .byte $78 + .byte $cc + .byte $cc + .byte $cc + .byte $66 + .byte $cc + .byte $c0 + .byte $f0 + .byte $fc + .byte $fa + .byte $3c + .byte $0c + .byte $30 + .byte $78 + .byte $cc + .byte $f8 + .byte $ec + .byte $3e + .byte $38 + .byte $60 + .byte $fc + .byte $fc + .byte $de + .byte $db + .byte $18 + .byte $cc + .byte $33 + .byte $88 + .byte $aa + .byte $ee + .byte $18 + .byte $18 + .byte $18 + .byte $36 + .byte $00 + .byte $18 + .byte $06 + .byte $36 + .byte $06 + .byte $06 + .byte $36 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $36 + .byte $30 + .byte $30 + .byte $00 + .byte $00 + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $36 + .byte $00 + .byte $00 + .byte $36 + .byte $18 + .byte $18 + .byte $00 + .byte $36 + .byte $18 + .byte $18 + .byte $00 + .byte $ff + .byte $00 + .byte $f0 + .byte $0f + .byte $ff + .byte $dc + .byte $f8 + .byte $c0 + .byte $6c + .byte $30 + .byte $d8 + .byte $66 + .byte $18 + .byte $cc + .byte $fe + .byte $c6 + .byte $7c + .byte $db + .byte $db + .byte $f8 + .byte $cc + .byte $fc + .byte $30 + .byte $30 + .byte $30 + .byte $18 + .byte $18 + .byte $fc + .byte $00 + .byte $38 + .byte $18 + .byte $00 + .byte $0c + .byte $6c + .byte $60 + .byte $3c + .byte $00 + .byte $00 + .byte $a5 + .byte $db + .byte $fe + .byte $7c + .byte $38 + .byte $38 + .byte $18 + .byte $e7 + .byte $66 + .byte $99 + .byte $0f + .byte $66 + .byte $3f + .byte $7f + .byte $3c + .byte $f8 + .byte $3e + .byte $7e + .byte $66 + .byte $db + .byte $38 + .byte $00 + .byte $7e + .byte $7e + .byte $18 + .byte $0c + .byte $60 + .byte $c0 + .byte $66 + .byte $3c + .byte $ff + .byte $00 + .byte $78 + .byte $6c + .byte $fe + .byte $c0 + .byte $cc + .byte $38 + .byte $c0 + .byte $60 + .byte $18 + .byte $3c + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $18 + .byte $ce + .byte $30 + .byte $0c + .byte $0c + .byte $6c + .byte $f8 + .byte $c0 + .byte $0c + .byte $cc + .byte $cc + .byte $30 + .byte $30 + .byte $60 + .byte $fc + .byte $18 + .byte $0c + .byte $de + .byte $cc + .byte $66 + .byte $c0 + .byte $66 + .byte $68 + .byte $68 + .byte $c0 + .byte $cc + .byte $30 + .byte $0c + .byte $6c + .byte $60 + .byte $fe + .byte $f6 + .byte $c6 + .byte $66 + .byte $cc + .byte $66 + .byte $e0 + .byte $30 + .byte $cc + .byte $cc + .byte $c6 + .byte $6c + .byte $cc + .byte $8c + .byte $60 + .byte $30 + .byte $18 + .byte $6c + .byte $00 + .byte $18 + .byte $78 + .byte $60 + .byte $78 + .byte $0c + .byte $78 + .byte $60 + .byte $76 + .byte $6c + .byte $70 + .byte $0c + .byte $66 + .byte $30 + .byte $cc + .byte $f8 + .byte $78 + .byte $dc + .byte $76 + .byte $dc + .byte $7c + .byte $7c + .byte $cc + .byte $cc + .byte $c6 + .byte $c6 + .byte $cc + .byte $fc + .byte $30 + .byte $18 + .byte $30 + .byte $00 + .byte $38 + .byte $c0 + .byte $00 + .byte $78 + .byte $3c + .byte $78 + .byte $78 + .byte $78 + .byte $78 + .byte $3c + .byte $78 + .byte $78 + .byte $70 + .byte $38 + .byte $70 + .byte $6c + .byte $00 + .byte $fc + .byte $7f + .byte $cc + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $3c + .byte $cc + .byte $7e + .byte $64 + .byte $78 + .byte $cc + .byte $18 + .byte $78 + .byte $70 + .byte $00 + .byte $00 + .byte $00 + .byte $cc + .byte $6c + .byte $6c + .byte $30 + .byte $00 + .byte $00 + .byte $cc + .byte $cc + .byte $00 + .byte $66 + .byte $66 + .byte $22 + .byte $55 + .byte $db + .byte $18 + .byte $18 + .byte $f8 + .byte $36 + .byte $00 + .byte $f8 + .byte $f6 + .byte $36 + .byte $fe + .byte $f6 + .byte $36 + .byte $f8 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $00 + .byte $18 + .byte $1f + .byte $36 + .byte $37 + .byte $3f + .byte $f7 + .byte $ff + .byte $37 + .byte $ff + .byte $f7 + .byte $ff + .byte $36 + .byte $ff + .byte $00 + .byte $36 + .byte $1f + .byte $1f + .byte $00 + .byte $36 + .byte $ff + .byte $18 + .byte $00 + .byte $ff + .byte $00 + .byte $f0 + .byte $0f + .byte $ff + .byte $76 + .byte $cc + .byte $cc + .byte $6c + .byte $60 + .byte $7e + .byte $66 + .byte $dc + .byte $78 + .byte $c6 + .byte $c6 + .byte $18 + .byte $7e + .byte $7e + .byte $c0 + .byte $cc + .byte $00 + .byte $fc + .byte $18 + .byte $60 + .byte $1b + .byte $18 + .byte $00 + .byte $dc + .byte $6c + .byte $00 + .byte $00 + .byte $0c + .byte $6c + .byte $30 + .byte $3c + .byte $00 + .byte $00 + .byte $81 + .byte $ff + .byte $fe + .byte $38 + .byte $7c + .byte $10 + .byte $00 + .byte $ff + .byte $3c + .byte $c3 + .byte $07 + .byte $66 + .byte $33 + .byte $63 + .byte $5a + .byte $e0 + .byte $0e + .byte $3c + .byte $66 + .byte $db + .byte $63 + .byte $00 + .byte $3c + .byte $3c + .byte $18 + .byte $18 + .byte $30 + .byte $00 + .byte $24 + .byte $18 + .byte $ff + .byte $00 + .byte $78 + .byte $6c + .byte $6c + .byte $7c + .byte $c6 + .byte $6c + .byte $60 + .byte $30 + .byte $30 + .byte $66 + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $0c + .byte $c6 + .byte $70 + .byte $cc + .byte $cc + .byte $3c + .byte $c0 + .byte $60 + .byte $cc + .byte $cc + .byte $cc + .byte $30 + .byte $30 + .byte $30 + .byte $00 + .byte $30 + .byte $cc + .byte $c6 + .byte $78 + .byte $66 + .byte $66 + .byte $6c + .byte $62 + .byte $62 + .byte $66 + .byte $cc + .byte $30 + .byte $0c + .byte $66 + .byte $60 + .byte $ee + .byte $e6 + .byte $6c + .byte $66 + .byte $cc + .byte $66 + .byte $cc + .byte $b4 + .byte $cc + .byte $cc + .byte $c6 + .byte $c6 + .byte $cc + .byte $c6 + .byte $60 + .byte $60 + .byte $18 + .byte $38 + .byte $00 + .byte $30 + .byte $00 + .byte $60 + .byte $00 + .byte $0c + .byte $00 + .byte $6c + .byte $00 + .byte $60 + .byte $00 + .byte $00 + .byte $60 + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $30 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $30 + .byte $18 + .byte $30 + .byte $dc + .byte $10 + .byte $cc + .byte $cc + .byte $00 + .byte $c3 + .byte $00 + .byte $00 + .byte $30 + .byte $00 + .byte $c3 + .byte $00 + .byte $00 + .byte $00 + .byte $c6 + .byte $00 + .byte $38 + .byte $30 + .byte $00 + .byte $00 + .byte $6c + .byte $cc + .byte $cc + .byte $e0 + .byte $cc + .byte $e0 + .byte $cc + .byte $18 + .byte $00 + .byte $18 + .byte $6c + .byte $cc + .byte $cc + .byte $1b + .byte $00 + .byte $00 + .byte $1c + .byte $1c + .byte $f8 + .byte $00 + .byte $6c + .byte $6c + .byte $00 + .byte $00 + .byte $00 + .byte $c6 + .byte $c6 + .byte $18 + .byte $33 + .byte $cc + .byte $88 + .byte $aa + .byte $77 + .byte $18 + .byte $18 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $36 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $36 + .byte $18 + .byte $00 + .byte $00 + .byte $36 + .byte $18 + .byte $18 + .byte $00 + .byte $ff + .byte $00 + .byte $f0 + .byte $0f + .byte $ff + .byte $00 + .byte $78 + .byte $fc + .byte $fe + .byte $cc + .byte $00 + .byte $66 + .byte $76 + .byte $30 + .byte $6c + .byte $6c + .byte $30 + .byte $00 + .byte $0c + .byte $60 + .byte $cc + .byte $fc + .byte $30 + .byte $30 + .byte $30 + .byte $1b + .byte $18 + .byte $30 + .byte $76 + .byte $6c + .byte $00 + .byte $00 + .byte $0c + .byte $6c + .byte $18 + .byte $00 + .byte $00 + .byte $00 + .byte $7e + .byte $7e + .byte $6c + .byte $10 + .byte $38 + .byte $10 + .byte $00 + .byte $ff + .byte $00 + .byte $ff + .byte $0f + .byte $3c + .byte $3f + .byte $7f + .byte $99 + .byte $80 + .byte $02 + .byte $18 + .byte $66 + .byte $7f + .byte $3e + .byte $00 + .byte $18 + .byte $18 + .byte $18 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $30 + .byte $6c + .byte $6c + .byte $30 + .byte $00 + .byte $38 + .byte $60 + .byte $18 + .byte $60 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $06 + .byte $7c + .byte $30 + .byte $78 + .byte $78 + .byte $1c + .byte $fc + .byte $38 + .byte $fc + .byte $78 + .byte $78 + .byte $00 + .byte $00 + .byte $18 + .byte $00 + .byte $60 + .byte $78 + .byte $7c + .byte $30 + .byte $fc + .byte $3c + .byte $f8 + .byte $fe + .byte $fe + .byte $3c + .byte $cc + .byte $78 + .byte $1e + .byte $e6 + .byte $f0 + .byte $c6 + .byte $c6 + .byte $38 + .byte $fc + .byte $78 + .byte $fc + .byte $78 + .byte $fc + .byte $cc + .byte $cc + .byte $c6 + .byte $c6 + .byte $cc + .byte $fe + .byte $78 + .byte $c0 + .byte $78 + .byte $10 + .byte $00 + .byte $30 + .byte $00 + .byte $e0 + .byte $00 + .byte $1c + .byte $00 + .byte $38 + .byte $00 + .byte $e0 + .byte $30 + .byte $0c + .byte $e0 + .byte $70 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $10 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $1c + .byte $18 + .byte $e0 + .byte $76 + .byte $00 + .byte $78 + .byte $00 + .byte $1c + .byte $7e + .byte $cc + .byte $e0 + .byte $30 + .byte $00 + .byte $7e + .byte $cc + .byte $e0 + .byte $cc + .byte $7c + .byte $e0 + .byte $c6 + .byte $30 + .byte $1c + .byte $00 + .byte $3e + .byte $78 + .byte $00 + .byte $00 + .byte $78 + .byte $00 + .byte $00 + .byte $c3 + .byte $cc + .byte $18 + .byte $38 + .byte $cc + .byte $f8 + .byte $0e + .byte $1c + .byte $38 + .byte $00 + .byte $00 + .byte $00 + .byte $fc + .byte $3c + .byte $38 + .byte $30 + .byte $00 + .byte $00 + .byte $c3 + .byte $c3 + .byte $18 + .byte $00 + .byte $00 + .byte $22 + .byte $55 + .byte $db + .byte $18 + .byte $18 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $36 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $00 + .byte $18 + .byte $00 + .byte $18 + .byte $18 + .byte $36 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $00 + .byte $36 + .byte $18 + .byte $36 + .byte $00 + .byte $00 + .byte $36 + .byte $18 + .byte $00 + .byte $00 + .byte $36 + .byte $18 + .byte $18 + .byte $00 + .byte $ff + .byte $00 + .byte $f0 + .byte $0f + .byte $ff + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $fc + .byte $00 + .byte $00 + .byte $00 + .byte $fc + .byte $38 + .byte $38 + .byte $1c + .byte $00 + .byte $06 + .byte $38 + .byte $78 + .byte $00 + .byte $30 + .byte $60 + .byte $18 + .byte $0e + .byte $18 + .byte $30 + .byte $00 + .byte $38 + .byte $00 + .byte $00 + .byte $0f + .byte $78 + .byte $70 + .byte $00 + .byte $00 diff --git a/libsrc/atari7800/mono_setcursor.s b/libsrc/atari7800/mono_setcursor.s index c75ff16f3..060f45cde 100644 --- a/libsrc/atari7800/mono_setcursor.s +++ b/libsrc/atari7800/mono_setcursor.s @@ -27,31 +27,31 @@ .constructor mono_init_cursor .interruptor mono_blink_cursor - .importzp sp - .import _mono_zones - .import cursor - .import pusha, incsp1, pusha0, pushax, popa + .importzp sp + .import _mono_zones + .import cursor + .import pusha, incsp1, pusha0, pushax, popa .include "atari7800.inc" .include "extzp.inc" .macpack generic - .data + .data ;----------------------------------------------------------------------------- ; The variables used by cursor functions ; blink_time: - .byte 140 + .byte 140 - .code + .code ;--------------------------------------------------------------------------- ; 8x16 routine umula0: ldy #8 ; Number of bits - lda #0 + lda #0 lsr ptr7800 ; Get first bit into carry @L0: bcc @L1 @@ -81,25 +81,25 @@ umula0: ; A = CURS_Y .proc calccursorzone - sta ptr7800 - lda #16 - sta ptrtmp - lda #0 - sta ptr7800+1 - sta ptrtmp+1 - jsr umula0 - clc - adc #10 - bcc @L1 - inx -@L1: clc - adc #<_mono_zones - sta cursorzone ; calculate new cursorzone - txa - clc - adc #>_mono_zones - sta cursorzone+1 - rts + sta ptr7800 + lda #16 + sta ptrtmp + lda #0 + sta ptr7800+1 + sta ptrtmp+1 + jsr umula0 + clc + adc #10 + bcc @L1 + inx +@L1: clc + adc #<_mono_zones + sta cursorzone ; calculate new cursorzone + txa + clc + adc #>_mono_zones + sta cursorzone+1 + rts .endproc @@ -120,21 +120,21 @@ umula0: ; .proc _mono_gotoy - pha - lda CURS_Y - jsr calccursorzone - ldy #1 - lda #0 - sta (cursorzone),y ; disable cursor - pla - sta CURS_Y - jsr calccursorzone - lda cursor - beq @L1 - lda #31 ; enable cursor -@L1: ldy #1 - sta (cursorzone),y - rts + pha + lda CURS_Y + jsr calccursorzone + ldy #1 + lda #0 + sta (cursorzone),y ; disable cursor + pla + sta CURS_Y + jsr calccursorzone + lda cursor + beq @L1 + lda #31 ; enable cursor +@L1: ldy #1 + sta (cursorzone),y + rts .endproc @@ -145,51 +145,51 @@ umula0: ; .proc _mono_gotox - sta CURS_X - ldy #3 - clc - rol - rol - sta (cursorzone),y - rts + sta CURS_X + ldy #3 + clc + rol + rol + sta (cursorzone),y + rts .endproc ;----------------------------------------------------------------------------- ; Set cursor to desired position (X,Y) ; - .proc _mono_gotoxy + .proc _mono_gotoxy - jsr _mono_gotoy - jsr popa - jsr _mono_gotox - rts - .endproc + jsr _mono_gotoy + jsr popa + jsr _mono_gotox + rts + .endproc - .proc mono_gotoxy - jsr popa - jmp _mono_gotoxy - .endproc + .proc mono_gotoxy + jsr popa + jmp _mono_gotoxy + .endproc ;----------------------------------------------------------------------------- ; Initialize cursorzone at startup ; Offset to cursor zone 5. ; - .proc mono_blink_cursor - inc blink_time - bne @L3 - lda #140 - sta blink_time - ldy #0 - lda (cursorzone),y - cmp #32 - bne @L1 - lda #95 - bne @L2 -@L1: lda #32 -@L2: sta (cursorzone),y -@L3: rts - .endproc + .proc mono_blink_cursor + inc blink_time + bne @L3 + lda #140 + sta blink_time + ldy #0 + lda (cursorzone),y + cmp #32 + bne @L1 + lda #95 + bne @L2 +@L1: lda #32 +@L2: sta (cursorzone),y +@L3: rts + .endproc ;----------------------------------------------------------------------------- ; Initialize cursorzone at startup @@ -197,9 +197,9 @@ umula0: ; .segment "ONCE" mono_init_cursor: - lda #0 - jsr calccursorzone - rts + lda #0 + jsr calccursorzone + rts ;----------------------------------------------------------------------------- ; force the init constructor to be imported From b195c10a4ccf7b4cfb7182974c28488bab80937c Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 18 Apr 2022 12:09:19 +0300 Subject: [PATCH 43/63] Fix tabs --- libsrc/atari7800/clrscr.s | 4 ++-- libsrc/atari7800/conio.s | 4 ++-- libsrc/atari7800/extzp.s | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libsrc/atari7800/clrscr.s b/libsrc/atari7800/clrscr.s index 9d063fad6..7ce690af4 100644 --- a/libsrc/atari7800/clrscr.s +++ b/libsrc/atari7800/clrscr.s @@ -11,8 +11,8 @@ .proc _clrscr - lda #<_screen - ldx #>_screen + lda #<_screen + ldx #>_screen sta ptr7800 stx ptr7800+1 ldx #screenrows diff --git a/libsrc/atari7800/conio.s b/libsrc/atari7800/conio.s index 5b60f39fe..1240c2e5d 100644 --- a/libsrc/atari7800/conio.s +++ b/libsrc/atari7800/conio.s @@ -212,8 +212,8 @@ vblankoff: sta CTRL lda #$00 ; Black background sta BKGRND - sta CURS_X - sta CURS_Y + sta CURS_X + sta CURS_Y lda #$33 ; Red sta P0C1 lda #$c8 ; Green diff --git a/libsrc/atari7800/extzp.s b/libsrc/atari7800/extzp.s index a79ede01a..8e8b73459 100644 --- a/libsrc/atari7800/extzp.s +++ b/libsrc/atari7800/extzp.s @@ -11,5 +11,5 @@ ptr7800: .res 2 ptrtmp: .res 2 cursorzone: .res 2 -CURS_X: .res 1 -CURS_Y: .res 1 +CURS_X: .res 1 +CURS_Y: .res 1 From 53337f81712ef8088d00817621e4cba476834b0e Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 18 Apr 2022 12:12:30 +0300 Subject: [PATCH 44/63] Fix wrong screen in --- libsrc/atari7800/mono_clrscr.s | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libsrc/atari7800/mono_clrscr.s b/libsrc/atari7800/mono_clrscr.s index cdf12bf4d..c4ab34369 100644 --- a/libsrc/atari7800/mono_clrscr.s +++ b/libsrc/atari7800/mono_clrscr.s @@ -3,7 +3,7 @@ .export _mono_clrscr - .import _screen + .import _momo_screen .import pusha0,pushax .include "extzp.inc" @@ -11,8 +11,8 @@ .proc _mono_clrscr - lda #<_screen - ldx #>_screen + lda #<_momo_screen + ldx #>_momo_screen sta ptr7800 stx ptr7800+1 ldx #screenrows From 20ce50e8dbf4908dc9788ad9b5b217629e51df23 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 18 Apr 2022 12:21:12 +0300 Subject: [PATCH 45/63] Use consisten line lenght values --- libsrc/atari7800/mono_conio.s | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libsrc/atari7800/mono_conio.s b/libsrc/atari7800/mono_conio.s index cd79af128..c51d7ff59 100644 --- a/libsrc/atari7800/mono_conio.s +++ b/libsrc/atari7800/mono_conio.s @@ -50,14 +50,14 @@ _mono_screen: .macro TextZone row ; Text - .byte <(_mono_screen + 2 * row * charsperline) + .byte <(_mono_screen + row * mono_charsperline) .byte $60 - .byte >(_mono_screen + 2 * row * charsperline) + .byte >(_mono_screen + row * mono_charsperline) .byte 12 .byte 0 - .byte <(_mono_screen + 2 * row * charsperline + charsperline) + .byte <(_mono_screen + row * mono_charsperline + 20) .byte $60 - .byte >(_mono_screen + 2 * row * charsperline + charsperline) + .byte >(_mono_screen + row * mono_charsperline + 20) .byte 12 .byte 80 ; Cursor From 33f12acbc95cfe08ba696e2615b4c0813eb46f57 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 18 Apr 2022 12:26:21 +0300 Subject: [PATCH 46/63] Fix typo --- libsrc/atari7800/mono_clrscr.s | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libsrc/atari7800/mono_clrscr.s b/libsrc/atari7800/mono_clrscr.s index c4ab34369..a700aadc1 100644 --- a/libsrc/atari7800/mono_clrscr.s +++ b/libsrc/atari7800/mono_clrscr.s @@ -3,7 +3,7 @@ .export _mono_clrscr - .import _momo_screen + .import _mono_screen .import pusha0,pushax .include "extzp.inc" @@ -11,8 +11,8 @@ .proc _mono_clrscr - lda #<_momo_screen - ldx #>_momo_screen + lda #<_mono_screen + ldx #>_mono_screen sta ptr7800 stx ptr7800+1 ldx #screenrows From 6671a92a8edbdadfa904923c98c665431ea199db Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Mon, 18 Apr 2022 13:49:29 +0300 Subject: [PATCH 47/63] Not sharing umula0 and fix cursor bug --- libsrc/atari7800/cputc.s | 3 +-- libsrc/atari7800/mono_cputc.s | 8 ++++---- libsrc/atari7800/mono_setcursor.s | 11 +++++------ libsrc/atari7800/setcursor.s | 28 +++++++++++++++++++++++++++- 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/libsrc/atari7800/cputc.s b/libsrc/atari7800/cputc.s index fb95277d2..9ec84bfe5 100644 --- a/libsrc/atari7800/cputc.s +++ b/libsrc/atari7800/cputc.s @@ -6,8 +6,7 @@ ; .export _cputc - .export umula0 - .import _gotoxy, gotox, gotoy, pusha0 + .import gotox, gotoy, pusha0 .import pushax .import _screen .import txtcolor diff --git a/libsrc/atari7800/mono_cputc.s b/libsrc/atari7800/mono_cputc.s index 4a7e5638c..aa6787e05 100644 --- a/libsrc/atari7800/mono_cputc.s +++ b/libsrc/atari7800/mono_cputc.s @@ -6,7 +6,7 @@ ; .export _mono_cputc - .import _mono_gotoxy, _mono_gotox, _mono_gotoy, pusha0 + .import mono_gotox, mono_gotoy, pusha0 .import pushax .import _mono_screen @@ -52,7 +52,7 @@ umula0: cmp #$0A ; LF bne @L4 @L1: lda #0 ; newline - jsr _mono_gotox + jsr mono_gotox lda CURS_Y cmp #(screenrows-1) bne @L2 @@ -60,7 +60,7 @@ umula0: beq @L3 @L2: clc adc #1 -@L3: jmp _mono_gotoy +@L3: jmp mono_gotoy @L4: pha @@ -96,7 +96,7 @@ umula0: beq @L1 clc adc #1 - jmp _mono_gotox + jmp mono_gotox .endproc diff --git a/libsrc/atari7800/mono_setcursor.s b/libsrc/atari7800/mono_setcursor.s index 060f45cde..fa02b1744 100644 --- a/libsrc/atari7800/mono_setcursor.s +++ b/libsrc/atari7800/mono_setcursor.s @@ -23,7 +23,7 @@ ; definitely not allow direct access to the variables. ; - .export mono_gotoxy, _mono_gotoxy, _mono_gotox, _mono_gotoy + .export mono_gotoxy, _mono_gotoxy, mono_gotox, mono_gotoy .constructor mono_init_cursor .interruptor mono_blink_cursor @@ -96,7 +96,6 @@ umula0: adc #<_mono_zones sta cursorzone ; calculate new cursorzone txa - clc adc #>_mono_zones sta cursorzone+1 rts @@ -118,7 +117,7 @@ umula0: ; Enable cursor ; if showcursor cursorzone[1] = 31 ; - .proc _mono_gotoy + .proc mono_gotoy pha lda CURS_Y @@ -143,7 +142,7 @@ umula0: ; You also need to set the hpos offset to the correct value on this line ; cursorzone[3] = 4 * CURS_X? ; - .proc _mono_gotox + .proc mono_gotox sta CURS_X ldy #3 @@ -160,9 +159,9 @@ umula0: ; .proc _mono_gotoxy - jsr _mono_gotoy + jsr mono_gotoy jsr popa - jsr _mono_gotox + jsr mono_gotox rts .endproc diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index 99e051cff..d94eb8094 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -31,7 +31,6 @@ .import _zones .import cursor .import pusha, incsp1, pusha0, pushax, popa - .import umula0 .include "atari7800.inc" .include "extzp.inc" @@ -47,6 +46,33 @@ blink_time: .code +;--------------------------------------------------------------------------- +; 8x16 routine + +umula0: + ldy #8 ; Number of bits + lda #0 + lsr ptr7800 ; Get first bit into carry +@L0: bcc @L1 + + clc + adc ptrtmp + tax + lda ptrtmp+1 ; hi byte of left op + clc + adc ptr7800+1 + sta ptr7800+1 + txa + +@L1: ror ptr7800+1 + ror a + ror ptr7800 + dey + bne @L0 + tax + lda ptr7800 ; Load the result + rts + ;----------------------------------------------------------------------------- ; Calculate cursorzone address ; You also need to set the cursorzone to point to the correct cursor Header From 47366cbbf6df00d73c154bd9360e70937d03a703 Mon Sep 17 00:00:00 2001 From: Bob Andrews Date: Mon, 18 Apr 2022 17:49:12 +0200 Subject: [PATCH 48/63] use jmp instead of jsr/rts --- libsrc/atari7800/mono_setcursor.s | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libsrc/atari7800/mono_setcursor.s b/libsrc/atari7800/mono_setcursor.s index fa02b1744..42f9bf466 100644 --- a/libsrc/atari7800/mono_setcursor.s +++ b/libsrc/atari7800/mono_setcursor.s @@ -161,8 +161,8 @@ umula0: jsr mono_gotoy jsr popa - jsr mono_gotox - rts + jmp mono_gotox + .endproc .proc mono_gotoxy @@ -197,8 +197,8 @@ umula0: .segment "ONCE" mono_init_cursor: lda #0 - jsr calccursorzone - rts + jmp calccursorzone + ;----------------------------------------------------------------------------- ; force the init constructor to be imported From 6a9eeeb5b0b295faf2f1369cacb642bbc4f3f83c Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Tue, 19 Apr 2022 10:31:51 +0300 Subject: [PATCH 49/63] Rename font --- libsrc/atari7800/{font160.s => conio_font.s} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename libsrc/atari7800/{font160.s => conio_font.s} (100%) diff --git a/libsrc/atari7800/font160.s b/libsrc/atari7800/conio_font.s similarity index 100% rename from libsrc/atari7800/font160.s rename to libsrc/atari7800/conio_font.s From 890a181ae506a3ca4d1fc138e56d793c102d880e Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Tue, 19 Apr 2022 10:32:22 +0300 Subject: [PATCH 50/63] Add color setup --- libsrc/atari7800/mono_conio.s | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libsrc/atari7800/mono_conio.s b/libsrc/atari7800/mono_conio.s index c51d7ff59..63849aea7 100644 --- a/libsrc/atari7800/mono_conio.s +++ b/libsrc/atari7800/mono_conio.s @@ -219,8 +219,12 @@ vblankoff: sta BKGRND sta CURS_X sta CURS_Y - lda #$0f ; White + lda #$33 ; Red sta P0C1 + lda #$c8 ; Green + sta P0C2 + lda #$0f ; White + sta P0C3 rts .endproc From eed8cec726b6e80ef7701a25c2611fba49181391 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Tue, 19 Apr 2022 10:33:58 +0300 Subject: [PATCH 51/63] Add documentation --- libsrc/atari7800/mono_font.s | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/libsrc/atari7800/mono_font.s b/libsrc/atari7800/mono_font.s index d07266989..74307ccfb 100644 --- a/libsrc/atari7800/mono_font.s +++ b/libsrc/atari7800/mono_font.s @@ -1,3 +1,16 @@ +; The internal font structure for Atari7800 needs a full set of 256 +; characters. Each character is 8 x 8 bits. +; The font consists of 8 rows of data: +; row7 +; row6 +; row5 +; row4 +; row3 +; row2 +; row1 +; row0 +; Each row is 256 bytes long + .export _mono_font .segment "RODATA" .align 256 From 26787ba3800f87a889ab937fb081203f7c8d71ed Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Tue, 19 Apr 2022 20:01:47 +0300 Subject: [PATCH 52/63] Fix race condition --- libsrc/atari7800/clrscr.s | 22 +++++----------------- libsrc/atari7800/conio.s | 6 +++--- libsrc/atari7800/conio_font.s | 4 ++-- libsrc/atari7800/mono_clrscr.s | 22 +++++----------------- libsrc/atari7800/mono_setcursor.s | 10 ++++++++-- libsrc/atari7800/setcursor.s | 7 ++++++- 6 files changed, 29 insertions(+), 42 deletions(-) diff --git a/libsrc/atari7800/clrscr.s b/libsrc/atari7800/clrscr.s index 7ce690af4..f9d4938b0 100644 --- a/libsrc/atari7800/clrscr.s +++ b/libsrc/atari7800/clrscr.s @@ -4,7 +4,7 @@ .export _clrscr .import _screen - .import pusha0,pushax + .import pushax, __bzero .include "extzp.inc" .code @@ -13,22 +13,10 @@ lda #<_screen ldx #>_screen - sta ptr7800 - stx ptr7800+1 - ldx #screenrows -@L1: ldy #charsperline - lda #0 -@L2: sta (ptr7800),y - dey - bne @L2 - lda ptr7800 - clc - adc #charsperline - bcc @L3 - inc ptr7800+1 -@L3: dex - bne @L1 - rts + jsr pushax + ldx #>(charsperline * screenrows) + lda #<(charsperline * screenrows) + jmp __bzero .endproc diff --git a/libsrc/atari7800/conio.s b/libsrc/atari7800/conio.s index 1240c2e5d..92cc7d8b1 100644 --- a/libsrc/atari7800/conio.s +++ b/libsrc/atari7800/conio.s @@ -9,7 +9,7 @@ .constructor initconio .include "atari7800.inc" .include "extzp.inc" - .import _font + .import _conio_font .import _get_tv .export _screen .export _zones @@ -58,7 +58,7 @@ _screen: ; Cursor .byte 254 .byte 0 - .byte >_font + .byte >_conio_font .byte 0 .endmacro @@ -206,7 +206,7 @@ vblankon: vblankoff: lda MSTAT bpl vblankoff - lda #>_font + lda #>_conio_font sta CHBASE lda #(CTRL_MODE160 | CTRL_KANGOFF | CTRL_BCBLACK | CTRL_CHAR2B | CTRL_DMAON | CTRL_CKOFF) sta CTRL diff --git a/libsrc/atari7800/conio_font.s b/libsrc/atari7800/conio_font.s index 07be43c4d..829e3e2ce 100644 --- a/libsrc/atari7800/conio_font.s +++ b/libsrc/atari7800/conio_font.s @@ -16,10 +16,10 @@ ; 0, 2, 4, 6, ... 254 ; Odd indices cannot be used. - .export _font + .export _conio_font .rodata .align 256 -_font: +_conio_font: .byte $0, $0, $41, $41, $0, $0, $14, $0 .byte $0, $0, $0, $0, $1, $40, $0, $0 .byte $0, $0, $0, $0, $0, $0, $0, $0 diff --git a/libsrc/atari7800/mono_clrscr.s b/libsrc/atari7800/mono_clrscr.s index a700aadc1..19f1fdfd6 100644 --- a/libsrc/atari7800/mono_clrscr.s +++ b/libsrc/atari7800/mono_clrscr.s @@ -4,7 +4,7 @@ .export _mono_clrscr .import _mono_screen - .import pusha0,pushax + .import pushax, __bzero .include "extzp.inc" .code @@ -13,22 +13,10 @@ lda #<_mono_screen ldx #>_mono_screen - sta ptr7800 - stx ptr7800+1 - ldx #screenrows -@L1: ldy #mono_charsperline - lda #0 -@L2: sta (ptr7800),y - dey - bne @L2 - lda ptr7800 - clc - adc #mono_charsperline - bcc @L3 - inc ptr7800+1 -@L3: dex - bne @L1 - rts + jsr pushax + ldx #>(mono_charsperline * screenrows) + lda #<(mono_charsperline * screenrows) + jmp __bzero .endproc diff --git a/libsrc/atari7800/mono_setcursor.s b/libsrc/atari7800/mono_setcursor.s index 42f9bf466..06d1f10d8 100644 --- a/libsrc/atari7800/mono_setcursor.s +++ b/libsrc/atari7800/mono_setcursor.s @@ -42,7 +42,7 @@ ; blink_time: - .byte 140 + .byte 255 .code @@ -175,6 +175,9 @@ umula0: ; Offset to cursor zone 5. ; .proc mono_blink_cursor + lda blink_time + cmp #255 + beq @L3 inc blink_time bne @L3 lda #140 @@ -197,7 +200,10 @@ umula0: .segment "ONCE" mono_init_cursor: lda #0 - jmp calccursorzone + jsr calccursorzone + lda #0 + sta blink_time + rts ;----------------------------------------------------------------------------- diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index d94eb8094..9ccc20ab6 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -42,7 +42,7 @@ ; blink_time: - .byte 140 + .byte 255 .code @@ -177,6 +177,9 @@ umula0: ; Offset to cursor zone 5. ; .proc blink_cursor + lda blink_time + cmp #255 + beq @L3 inc blink_time bne @L3 lda #140 @@ -199,6 +202,8 @@ umula0: init_cursor: lda #0 jsr calccursorzone + lda #0 + sta blink_time rts ;----------------------------------------------------------------------------- From fc244f6b955180c8e62cf1f2c444e4d11ed3af9c Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Tue, 19 Apr 2022 21:31:16 +0300 Subject: [PATCH 53/63] Too much time in irq fix --- libsrc/atari7800/mono_setcursor.s | 5 +---- libsrc/atari7800/setcursor.s | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/libsrc/atari7800/mono_setcursor.s b/libsrc/atari7800/mono_setcursor.s index 06d1f10d8..7253d4a40 100644 --- a/libsrc/atari7800/mono_setcursor.s +++ b/libsrc/atari7800/mono_setcursor.s @@ -42,7 +42,7 @@ ; blink_time: - .byte 255 + .byte 140 .code @@ -175,9 +175,6 @@ umula0: ; Offset to cursor zone 5. ; .proc mono_blink_cursor - lda blink_time - cmp #255 - beq @L3 inc blink_time bne @L3 lda #140 diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index 9ccc20ab6..a475d0416 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -42,7 +42,7 @@ ; blink_time: - .byte 255 + .byte 140 .code @@ -177,9 +177,6 @@ umula0: ; Offset to cursor zone 5. ; .proc blink_cursor - lda blink_time - cmp #255 - beq @L3 inc blink_time bne @L3 lda #140 From 451acb3423d503fc37995cc2cb79bb259138863b Mon Sep 17 00:00:00 2001 From: Bob Andrews Date: Wed, 20 Apr 2022 14:28:34 +0200 Subject: [PATCH 54/63] Update Contributing.md --- Contributing.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Contributing.md b/Contributing.md index 6258ce523..8528997df 100644 --- a/Contributing.md +++ b/Contributing.md @@ -68,6 +68,7 @@ color := $0787 ## Assembly Sources * Op-code mnemonics must have lower-case letters. The names of instruction macroes may have upper-case letters. +* Op-codes must use their official and commonly used mnemonics, ie bcc and bcs and not bgt and blt * Hexadecimal number constants should be used except where decimal or binary numbers make much more sense in that constant's context. * Hexadecimal letters should be upper-case. * When you set two registers or two memory locations to an immediate 16-bit zero, you should use the expressions ```#<$0000``` and ```#>$0000``` (they make it obvious where you are putting the lower and upper bytes). From c6decc7bb84adcdd272c252721ab6f207baf297e Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Thu, 21 Apr 2022 21:54:33 +0300 Subject: [PATCH 55/63] Move cursor IRQ processing to when the screen is being drawn --- libsrc/atari7800/mono_setcursor.s | 4 ++++ libsrc/atari7800/setcursor.s | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/libsrc/atari7800/mono_setcursor.s b/libsrc/atari7800/mono_setcursor.s index 7253d4a40..52a5a997a 100644 --- a/libsrc/atari7800/mono_setcursor.s +++ b/libsrc/atari7800/mono_setcursor.s @@ -28,6 +28,7 @@ .interruptor mono_blink_cursor .importzp sp + .import _zonecounter .import _mono_zones .import cursor .import pusha, incsp1, pusha0, pushax, popa @@ -175,6 +176,9 @@ umula0: ; Offset to cursor zone 5. ; .proc mono_blink_cursor + lda _zonecounter + and #01 + beq @L3 inc blink_time bne @L3 lda #140 diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index a475d0416..c0bf1252b 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -28,6 +28,7 @@ .interruptor blink_cursor .importzp sp + .import _zonecounter .import _zones .import cursor .import pusha, incsp1, pusha0, pushax, popa @@ -177,6 +178,9 @@ umula0: ; Offset to cursor zone 5. ; .proc blink_cursor + lda _zonecounter + and #01 + beq @L3 inc blink_time bne @L3 lda #140 From f4260ed7bcce782d7d6f4eb39d12ee9a58e5f002 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Fri, 22 Apr 2022 06:51:35 +0300 Subject: [PATCH 56/63] Speed up the cursor a bit --- libsrc/atari7800/mono_setcursor.s | 4 ++-- libsrc/atari7800/setcursor.s | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libsrc/atari7800/mono_setcursor.s b/libsrc/atari7800/mono_setcursor.s index 52a5a997a..02e0308f6 100644 --- a/libsrc/atari7800/mono_setcursor.s +++ b/libsrc/atari7800/mono_setcursor.s @@ -43,7 +43,7 @@ ; blink_time: - .byte 140 + .byte 200 .code @@ -181,7 +181,7 @@ umula0: beq @L3 inc blink_time bne @L3 - lda #140 + lda #200 sta blink_time ldy #0 lda (cursorzone),y diff --git a/libsrc/atari7800/setcursor.s b/libsrc/atari7800/setcursor.s index c0bf1252b..f438de24f 100644 --- a/libsrc/atari7800/setcursor.s +++ b/libsrc/atari7800/setcursor.s @@ -43,7 +43,7 @@ ; blink_time: - .byte 140 + .byte 200 .code @@ -183,7 +183,7 @@ umula0: beq @L3 inc blink_time bne @L3 - lda #140 + lda #200 sta blink_time ldy #0 lda (cursorzone),y From d8482fbd5773d3260f4f95f8da94297e8152c1cf Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 25 Apr 2022 14:58:38 +0000 Subject: [PATCH 57/63] build: allow the user to specify make V=1 for verbose build it's often required to see the full commandline when things go wrong. the standard way for Makefile-only based buildsystems and autoconf is to pass V=1 to make. --- src/Makefile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index c8028204b..c37af1d32 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,6 +2,12 @@ ifneq ($(shell echo),) CMD_EXE = 1 endif +ifneq ($(V),1) + Q=@ +else + Q= +endif + PROGS = ar65 \ ca65 \ cc65 \ @@ -147,7 +153,7 @@ endef # PROG_template ../wrk/%.o: %.c @echo $< - @$(CC) -c $(CFLAGS) -o $@ $< + $(Q)$(CC) -c $(CFLAGS) -o $@ $< ../bin: @$(call MKDIR,$@) From bf1ef6157c65fc56db9cf24cab813f384a9dd2e6 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 25 Apr 2022 16:52:46 +0000 Subject: [PATCH 58/63] build: properly quote strings passed as cpp macros until now, the strings intended to be hardcoded into the binary, such as directory names and build id, were passed unquoted, which means they're interpreted by the preprocessor as C tokens, rather than strings, which can result in all sorts of "interesting" behaviour such as interpreting paths starting with // as C++-style comment. this was then worked around using a stringize macro which turned the tokens into a string (if they happened to be in a compatible format). adresses #1726 --- src/Makefile | 6 +++--- src/ca65/incpath.c | 2 +- src/cc65/incpath.c | 2 +- src/cl65/main.c | 2 +- src/common/version.c | 2 +- src/ld65/filepath.c | 6 +++--- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Makefile b/src/Makefile index c37af1d32..75b92394e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -68,9 +68,9 @@ $(info BUILD_ID: $(BUILD_ID)) CFLAGS += -MMD -MP -O3 -I common \ -Wall -Wextra -Wno-char-subscripts $(USER_CFLAGS) \ - -DCA65_INC="$(CA65_INC)" -DCC65_INC="$(CC65_INC)" -DCL65_TGT="$(CL65_TGT)" \ - -DLD65_LIB="$(LD65_LIB)" -DLD65_OBJ="$(LD65_OBJ)" -DLD65_CFG="$(LD65_CFG)" \ - -DBUILD_ID="$(BUILD_ID)" + -DCA65_INC="\"$(CA65_INC)\"" -DCC65_INC="\"$(CC65_INC)\"" -DCL65_TGT="\"$(CL65_TGT)\"" \ + -DLD65_LIB="\"$(LD65_LIB)\"" -DLD65_OBJ="\"$(LD65_OBJ)\"" -DLD65_CFG="\"$(LD65_CFG)\"" \ + -DBUILD_ID="\"$(BUILD_ID)\"" LDLIBS += -lm diff --git a/src/ca65/incpath.c b/src/ca65/incpath.c index ff21b175d..42e54b2da 100644 --- a/src/ca65/incpath.c +++ b/src/ca65/incpath.c @@ -76,7 +76,7 @@ void FinishIncludePaths (void) /* Add some compiled-in search paths if defined at compile time. */ #if defined(CA65_INC) && !defined(_WIN32) - AddSearchPath (IncSearchPath, STRINGIZE (CA65_INC)); + AddSearchPath (IncSearchPath, CA65_INC); #endif /* Add paths relative to the parent directory of the Windows binary. */ diff --git a/src/cc65/incpath.c b/src/cc65/incpath.c index ab164d5ca..d32614cf9 100644 --- a/src/cc65/incpath.c +++ b/src/cc65/incpath.c @@ -77,7 +77,7 @@ void FinishIncludePaths (void) /* Add some compiled-in search paths if defined at compile time. */ #if defined(CC65_INC) && !defined(_WIN32) - AddSearchPath (SysIncSearchPath, STRINGIZE (CC65_INC)); + AddSearchPath (SysIncSearchPath, CC65_INC); #endif /* Add paths relative to the parent directory of the Windows binary. */ diff --git a/src/cl65/main.c b/src/cl65/main.c index e032baee4..701355904 100644 --- a/src/cl65/main.c +++ b/src/cl65/main.c @@ -1216,7 +1216,7 @@ static void OptPrintTargetPath (const char* Opt attribute ((unused)), SearchPaths* TargetPaths = NewSearchPath (); AddSubSearchPathFromEnv (TargetPaths, "CC65_HOME", "target"); #if defined(CL65_TGT) && !defined(_WIN32) - AddSearchPath (TargetPaths, STRINGIZE (CL65_TGT)); + AddSearchPath (TargetPaths, CL65_TGT); #endif AddSubSearchPathFromWinBin (TargetPaths, "target"); diff --git a/src/common/version.c b/src/common/version.c index 992be45ee..2f19f0466 100644 --- a/src/common/version.c +++ b/src/common/version.c @@ -62,7 +62,7 @@ const char* GetVersionAsString (void) { static char Buf[60]; #if defined(BUILD_ID) - xsnprintf (Buf, sizeof (Buf), "%u.%u - %s", VER_MAJOR, VER_MINOR, STRINGIZE (BUILD_ID)); + xsnprintf (Buf, sizeof (Buf), "%u.%u - %s", VER_MAJOR, VER_MINOR, BUILD_ID); #else xsnprintf (Buf, sizeof (Buf), "%u.%u", VER_MAJOR, VER_MINOR); #endif diff --git a/src/ld65/filepath.c b/src/ld65/filepath.c index 17cd451de..f722ad34b 100644 --- a/src/ld65/filepath.c +++ b/src/ld65/filepath.c @@ -89,13 +89,13 @@ void InitSearchPaths (void) /* Add some compiled-in search paths if defined at compile time. */ #if defined(LD65_LIB) && !defined(_WIN32) - AddSearchPath (LibDefaultPath, STRINGIZE (LD65_LIB)); + AddSearchPath (LibDefaultPath, LD65_LIB); #endif #if defined(LD65_OBJ) && !defined(_WIN32) - AddSearchPath (ObjDefaultPath, STRINGIZE (LD65_OBJ)); + AddSearchPath (ObjDefaultPath, LD65_OBJ); #endif #if defined(LD65_CFG) && !defined(_WIN32) - AddSearchPath (CfgDefaultPath, STRINGIZE (LD65_CFG)); + AddSearchPath (CfgDefaultPath, LD65_CFG); #endif /* Add paths relative to the parent directory of the Windows binary. */ From 13081e0989e8076b2441a3e6d7512f9739777587 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 25 Apr 2022 17:12:09 +0000 Subject: [PATCH 59/63] remove orphaned STRINGIZE macro --- src/common/searchpath.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/common/searchpath.h b/src/common/searchpath.h index 974886a67..f078c0799 100644 --- a/src/common/searchpath.h +++ b/src/common/searchpath.h @@ -48,10 +48,6 @@ -/* Convert argument to C string */ -#define _STRINGIZE(arg) #arg -#define STRINGIZE(arg) _STRINGIZE(arg) - /* A search path is a pointer to the list */ typedef struct Collection SearchPaths; From e9597e872101604e382468235cdba69a1ab8bf6b Mon Sep 17 00:00:00 2001 From: jede Date: Tue, 26 Apr 2022 00:40:16 +0200 Subject: [PATCH 60/63] cgetc export data now --- libsrc/telestrat/cgetc.s | 34 ++++++++++++++++++++++++---------- libsrc/telestrat/kbhit.s | 20 ++++++++++++++++---- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/libsrc/telestrat/cgetc.s b/libsrc/telestrat/cgetc.s index cad8814af..e77ed794b 100644 --- a/libsrc/telestrat/cgetc.s +++ b/libsrc/telestrat/cgetc.s @@ -5,24 +5,38 @@ .import cursor + .export store_char + .include "telestrat.inc" .proc _cgetc - ; this routine could be quicker if we wrote in page 2 variables, - ; but it's better to use telemon routine in that case, because telemon can manage 4 I/O - ldx cursor ; if cursor equal to 0, then switch off cursor + ; This routine could be quicker if we wrote in page 2 variables, + ; But it's better to use telemon routine in that case, because telemon can manage 4 I/O + ldx cursor ; If cursor equal to 0, then switch off cursor beq switchoff_cursor ldx #$00 ; x is the first screen - BRK_TELEMON(XCSSCR) ; display cursor - jmp loop ; could be replaced by a bne/beq but 'jmp' is cleaner than a bne/beq which could expect some matters + BRK_TELEMON(XCSSCR) ; Display cursor + jmp start ; Could be replaced by a bne/beq but 'jmp' is cleaner than a bne/beq which could expect some matters switchoff_cursor: - ; at this step X is equal to $00, X must be set, because it's the id of the screen (telestrat can handle 4 virtuals screen) - BRK_TELEMON(XCOSCR) ; switch off cursor + ; At this step X is equal to $00, X must be set, because it's the id of the screen (telestrat can handle 4 virtuals screen) + BRK_TELEMON(XCOSCR) ; Switch off cursor -loop: - BRK_TELEMON XRD0 ; waits until key is pressed - bcs loop + +start: + lda store_char ; Does kbhit store a value in store_char ? + bne @out ; Yes, we returns A and we reset store_char +@wait_key: + BRK_TELEMON XRD0 ; Waits until key is pressed + bcs @wait_key + ldx #$00 + rts +@out: + ldx #$00 + stx store_char rts .endproc +.data +store_char: + .byte 0 diff --git a/libsrc/telestrat/kbhit.s b/libsrc/telestrat/kbhit.s index 54e4bf4d8..da2c8b587 100644 --- a/libsrc/telestrat/kbhit.s +++ b/libsrc/telestrat/kbhit.s @@ -6,12 +6,24 @@ .export _kbhit + .import store_char + .include "telestrat.inc" _kbhit: - BRK_TELEMON XRD0 + lda store_char ; Check if a key has been detected previously + beq @call_telemon ; No, calls Telemon routine + lda #$01 ; There is a key pressed previously, return 1 ldx #$00 - txa - rol - eor #$01 + rts +@call_telemon: + BRK_TELEMON XRD0 + + ldx #$00 + bcs @no_char_action + sta store_char + lda #$01 + rts +@no_char_action: + tax rts From 1281032f33125c541ff5aac0906fd97a390890b7 Mon Sep 17 00:00:00 2001 From: jede Date: Tue, 26 Apr 2022 10:23:38 +0200 Subject: [PATCH 61/63] FIX space --- libsrc/telestrat/kbhit.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsrc/telestrat/kbhit.s b/libsrc/telestrat/kbhit.s index da2c8b587..9af696e24 100644 --- a/libsrc/telestrat/kbhit.s +++ b/libsrc/telestrat/kbhit.s @@ -11,7 +11,7 @@ .include "telestrat.inc" _kbhit: - lda store_char ; Check if a key has been detected previously + lda store_char ; Check if a key has been detected previously beq @call_telemon ; No, calls Telemon routine lda #$01 ; There is a key pressed previously, return 1 ldx #$00 From 4474ed2668444238cf06207cb13a06711d11855f Mon Sep 17 00:00:00 2001 From: jede Date: Tue, 26 Apr 2022 11:10:07 +0200 Subject: [PATCH 62/63] fix space --- libsrc/telestrat/kbhit.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsrc/telestrat/kbhit.s b/libsrc/telestrat/kbhit.s index 9af696e24..aea345036 100644 --- a/libsrc/telestrat/kbhit.s +++ b/libsrc/telestrat/kbhit.s @@ -16,7 +16,7 @@ _kbhit: lda #$01 ; There is a key pressed previously, return 1 ldx #$00 rts -@call_telemon: +@call_telemon: BRK_TELEMON XRD0 ldx #$00 From 4bfd57153f4b9733bec6684d2a25af60cb277df5 Mon Sep 17 00:00:00 2001 From: jede Date: Tue, 26 Apr 2022 14:14:27 +0200 Subject: [PATCH 63/63] fix bss --- libsrc/telestrat/cgetc.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsrc/telestrat/cgetc.s b/libsrc/telestrat/cgetc.s index e77ed794b..b76c62ee0 100644 --- a/libsrc/telestrat/cgetc.s +++ b/libsrc/telestrat/cgetc.s @@ -37,6 +37,6 @@ start: stx store_char rts .endproc -.data +.bss store_char: .byte 0