1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-07 23:29:39 +00:00

Add basic conio buffer

This commit is contained in:
Karri Kaksonen 2022-04-02 09:39:55 +03:00 committed by mrdudz
parent ba3cd27d30
commit e4c1bf15da
3 changed files with 520 additions and 0 deletions

31
libsrc/atari7800/clrscr.s Normal file
View File

@ -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

230
libsrc/atari7800/conio.s Normal file
View File

@ -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
.endmacro
.macro NullHeader offset, zero
.byte offset
.byte zero
.endmacro
.macro Header addr, palwidth, hpos
.byte <addr
.byte palwidth
.byte >addr
.byte hpos
.endmacro
.macro XHeader addr, flags, palwidth, hpos
.byte <addr
.byte flags
.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 DPPL
lda #>Topscanlines
sta DPPH
jmp vblankon
pal: lda #<PALscanlines
sta DPPL
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

259
libsrc/atari7800/font160.s Normal file
View File

@ -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