From e4c1bf15da59016e3e9d5b49ab5fdf9032824442 Mon Sep 17 00:00:00 2001 From: Karri Kaksonen Date: Sat, 2 Apr 2022 09:39:55 +0300 Subject: [PATCH] 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