From 77b300682a6fbfccdc3fc23b0a4bd17226e652ec Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 2 Apr 2022 09:39:46 +0300 Subject: [PATCH 01/55] 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/55] 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/55] 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 zcmV;f3sLlmP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvk}M|-{O1%t0$M=mI3Q4jZ{XuQsqUFKZ}Ar4 zuBoLd8l=or!j$vJ?^%Ashgu&+n~mAAPre*Iqt<#Ap)S z<@MF(>rNBx?b{DNy3_i;y^Qx89`AuZW_}MScV@=J{u(6O`PEMP9>~w@q5H6}p)P*i z3swED?mSjPcN{4K)>>@!RPtzAwOW*KUnL(enIWm;6D(5nOHs};_qJ^uliFu?=y3c z%=5}_Y6qhIt*8fV`WOZs7a*7CXB~&(YEcDFl&wN1xGjBpyCJaUo{eN+k zzkB&#j*=M{B6dWAyap#+`37ya_}!>8Pgxh9<~TZP1VDfQDw1rmeN!tc}vV%`RPg>%CjQCO1t? ztywp-VQzEC(9uR8HpcKVon7F8&AXcqcb}8X#6%NgP4u5=S-fQFYO60>WBHl^`GiJ` z9u^}!=H@LMHnID*J+|+8s2n)O(bG;pcE<5D6Ix42&6YhaM|#dr*50iCbo>X_=*=2G zOx=F=$r@UV*~buc?WA4Kz!)omak~sa(0nA{Kc_svpFFtTmT3eO7yHi6@xNg zYp-*#blm_zq!>`bDq@&=PS_&P8M7YLyH(jH$U?V^F1uL-gc5pi!%*NUeFu83emXVQ zq5%$%CZCPIU=6fVfc2bk48%qKI0EgBc{_5T=yICP9f_0y`Pv)76ziVSMsy6sKm@Y! z!L|Xf9R&~!N|1uvSzGQ?KR28-QcFmo)8!yb0*$2z#;Vq8QWI4IR(a%sND?bwk$Ubb z$7**8(SaceuHWasPEAwvBYw35;;r4W1!8ceiWsOMH-@Z ztj&0v3x;r|Gl3h#wvc)S#S6P9H*A%FH6ex#+b<~~ELx|&)Bs7+)n&@$jco!fV%@qq ziIU0zN4gbq!LE?)3QQJQr%@>d>&(u>D?uiBs7SNwhJkc!1d-0FWgTyx4oJbAh;v||qeJMt4TtlwlhAOT>bheP@(REZ5AGwU~dD9;Pm z175bl%`oJim_R|+i4Mkf(Vkm+9RW?lM-Ri()Hk*;;j&iDMr*B89YqW4xv8t{sJ=I} z41kE|f}QjYFNj;pf(pjD0U9h6)xBXR$w&m1+S`HE`jH4Yb;cSuD%*Fv>l2<7uCYk4 z0ygM$Kc?HZwh+ZmEAX!Z7ITd$iEYh6W%nCZ`lT8~t;CM#0lzXz6YdD&%AYWk0+FEr z;xqsN0flKpLr_UWLm+T+Z)Rz1WdHzpoPCiyNW)MRhW|dKA{B>r5OK&*9mI;Lh@)1a z2o*xD(5i#UO<&NYAxUv@6kH1qJ{GGEF3!3-xC(;c1H{qENzp}0JU1z{i1EPXe*E|R zKlh#s_!||bn!#~E)hr{OObFTBst|fb5I#gOh7pOG`kW}H;8|by)Jt_2=ULu;e^#%O zHyPj)h-aB@Si~E|)0>vgd7n7SN|Hi+PCRPR1&JTIF1!53x#+N;XGV=odY(8+EEGFf z?qF6jRN^V(n4)Tw@6WodaNgpqR%)zuPyWJiURzn_I;}w@v4|yz5Fn$5GAghTr(Gk( zM4HYM9{vHxFOo|pR~d{P3#dYcu$S42Ne zq^6oAeo~dx8e*wc)cqq3eHHEL*DmyH9I@K?AX;p0ZF>_gxm(>JtP|U(a2%d>y&=+b z&)5IVUGmt0{mrAJ?jITG>u68EcA;P6i1on-(PDG^*qd<4-RcHmo!CBw zijZ6|>HO{m&~{dWhe=$mV{RuIIF@6)?IV9Cz-|F#ne$BmJ^TW|SO_RWa>1nYrx!pw zSqUB{akYuLlVspnj`4P`@|ghGH4s3-{Y?P9k|q%bNAs?W0uG=U$V!N6vmyZ+$peLO z_yYkdw|cJ%V(iLWJmfb4^hy#uzqiA?E($n+VjwFay3L9N7$grA!r>1D=-lePDu}Tw zZ}F1f1kfu<@ciB`@46`90E&UEgqSuf5`ZvLAsqfdfXS`itAZF3{~uI65vFELPy!@F z8w9BYQ%C|@1Z{#U;Od~N!B`Ww1|tBJ!U&+20EKzxr}iR1qD>^*4~LGs4sgaHKsK~N zkWMg#B%npmCa40g4yqcA4RLEQ0zfH@0BQ+Pm}h<-F9KxRM7I5K=(y_uXB`3*LmLE{ z1XD-?S_Ex^D&Xp%s=?S2w+15sl)?z0mH>r$=9l#%K%q?(+wcDbXpjM%y|@n_JCHz# zZwkSyf-M0)GG>-g7?ZMY0zhu23(##*a&D?A zJ}w^#aB_ek&W8ZBicdL!#2g@waVoeacn)!m1@?`!YGPCoT7bKN8NK>+1SE>{Apou7 zQw|_82Z&>w3T_FWLtJBl{UEJ|7*&K8;3{iIuRa|CiQ;?+K&$wa14zsP;uxobTY~2h z*H~b`NUJ4Am7oC0O*;?(@@&;J`I!0hS^T!X-U2|XdXmIOLLqj&1qk0RqIEPUf)T~m z!~wf$2LeEzt$HROGk-pd-`3Y#07%tOk~l~x#ICmh;oC*Dj^RWwqS%@^U^neR0LZgd z&*Wp~&u8)5`g#ihspd%%7YT*f^%fv}yNK4YoCrn~Tk{eCJ^xhiB=9eO^!#(blfb|D k(euA-w#+~GAAk1eA57`mwI1`)d;kCd07*qoM6N<$f@x=T>Hq)$ 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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 c6decc7bb84adcdd272c252721ab6f207baf297e Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Thu, 21 Apr 2022 21:54:33 +0300 Subject: [PATCH 54/55] 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 55/55] 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