Difference between revisions of "7800 NTSC BIOS"
From 8BitDev.org - Atari 7800 Development Wiki
(Created page with "==7800 NTSC BIOS== This reverse engineered 7800 NTSC BIOS code contains helpful context-comments and builds a 1:1 with the released BIOS using DASM. <pre> ; Disassembly of...") |
(No difference)
|
Revision as of 19:04, 20 July 2025
7800 NTSC BIOS
This reverse engineered 7800 NTSC BIOS code contains helpful context-comments and builds a 1:1 with the released BIOS using DASM.
; Disassembly of bios7800.bin
; Disassembled Sun Mar 08 20:30:38 1998
; Using DiStella v2.0
;
; Comments added by Keith Henrickson <flipper@phin.com>
; Further commented by Daniel Boris <dboris@home.com>
; Fixed to compile correctly with dasm, and additional comments by
; Mike Saarna. You can't have my email!
;
processor 6502
; some misc equates
LFD80 = $FD80
CartKey = $FF80
CartRegion = $FFF8
CartKeyStartPage = $FFF9
CartResetVectorHi = $FFFD
LF112 = $F112
LF118 = $F118
LF460 = $F460
LF700 = $F700
LF800 = $F800
; 7800 system
INPTCTRL = $01
; TIA
VSYNC = $00
VBLANK = $01
WSYNC = $02
RSYNC = $03
COLUP0 = $06
COLUPF = $08
COLUBK = $09
PF2 = $0F
RESP1 = $11
GRP0 = $1B
GRP1 = $1C
;Maria
BACKGRND = $20
POC1 = $21
P0C2 = $22
POC3 = $23
MWSYNC = $24
P1C1 = $25
P1C2 = $26
P1C3 = $27
MSTAT = $28
DPPH = $2C
DPPL = $30
CTRL = $3C
DLIAddr = $F4
ConsoleRegion = $FE
ORG $F000
LF000: pha ; This is the NMI routine.
jmp (DLIAddr) ; RAM NMI vector
ORG $F400
; this code is designed to be executed while stored in ram at 2300.
LF400
SwitchTo2600Mode1
jmp $26C2 ; Enter 2600 mode.
SwitchTo2600Mode2
jmp $26C2 ; Enter 2600 mode.
CartTest
lda #$16 ; ($2306)
sta INPTCTRL ; Switch in cart + enable Maria
ldy #$FF ;
ldx #$7F ;
CartTestLoop
lda LFE00,X ; Compare same FE7F+ ROM with differing opcodes,
cmp LFD80,Y ; to avoid false positives from a floating bus.
bne SwitchTo2600Mode1 ; Switch to 2600 mode
dey ;
dex ;
bpl CartTestLoop
lda CartResetVectorLo ;
and CartResetVectorHi ;
cmp #$FF ;
beq SwitchTo2600Mode1 ; If RESET vector is FFFF, then go 2600.
lda CartResetVectorLo ;
ora CartResetVectorHi ;
beq SwitchTo2600Mode1 ; If RESET vector is 0000, then go 2600.
lda CartRegion ; "Region verification"
ora #ConsoleRegion
cmp #$FF ;
bne SwitchTo2600Mode2 ; If low-bit of CartRegion=0, then go 2600.
lda CartRegion ;
eor #$F0 ; Invert high nibble
and #$F0 ; Extract high nibble
bne SwitchTo2600Mode2 ; If high nibble was not F, then go 2600.
lda CartKeyStartPage ;
and #$0B ;
cmp #$03 ;
bne SwitchTo2600Mode2 ; If low nibble FFF9 was not 3 or 7, go 2600.
lda CartKeyStartPage ;
and #$F0 ; Extract ROM start from high nibble
sta $EE ; Store it
sta $2406 ; Store it a couple of places for auth. (whocares)
cmp #$40 ;
bcc SwitchTo2600Mode2 ; If ROM start < than 4, then go 2600
sbc #$01 ; Subtract 1.
cmp CartResetVectorHi ; High byte of reset vector
bcs SwitchTo2600Mode2 ; If high-byte of start is >=, go 2600
jsr $2536 ; Start the authentication process.
lda #$00
sta $F0
jsr $241B
lda #$16
sta INPTCTRL
ldx #$00
txa
LF46D: sta $1800,X
dex
bne LF46D
pha
ldy #$7F
LF476: lda LFF00,Y
sta $1800,Y
dey
cpy #$F8
bne LF476
lda #$2E
sta $2409
lda #$24
sta $240A
LF48B
jsr $241B
pla
jsr $23FF
pha
inc $2406
lda $2406
cmp #$FF
bne LF48B
jsr $241B
jsr $2412
jsr $2412
lda #$36
sta $2409
lda #$24
sta $240A
dec $2406
LF4B3: jsr $241B
pla
jsr $23FF
pha
dec $2406
lda $2406
cmp $EE
bcs LF4B3
lda #$60
sta CTRL
ldx #$77
LF4CB: lda $1800,X
eor $1850,X
eor $1888,X
sta $1A00,X
dex
bpl LF4CB
lda $1A00
and #$07
sta $1A00
lda #$00
ldx #$04
sta $1A00,X
sta $2000,X
ldx #$77 ; That was a lot, but we end up here, comparing
LF4EE: lda $2000,X ; two parts of memory. If they match, then
cmp $1A00,X ; go to 7800 mode....
bne LF4FC ; otherwise go to 2600 mode.
dex ; nop out above branch to allow user-written
bpl LF4EE ; carts to run -- I think.
jmp $26B9 ; 7800 mode init
LF4FC: jmp $26C2 ; 2600 mode init.
LF500 = $F500 ; F500 is partway through the next opcode
ldx #$00 ; more authentication stuff all the way through
LF501: adc $1800,X
adc LFF00,X
tay
lda $2DD5,Y
sta $1800,X
inx
bne LF501
rts
ldx #$00
LF514: rol $1800,X
inx
bne LF514
rts
;$241B
php
dec $F0
bpl LF52C
lda #$02
sta INPTCTRL
LF524: lda $F0
bmi LF524
lda #$16
sta INPTCTRL
LF52C: plp
rts
LF52E: .byte $C7,$65,$AB,$CA,$EE,$F7,$83,$09
LF536: .byte $E1,$D0,$92,$67,$62,$B6,$72,$55,$8E,$91,$DC,$C5,$81,$BE,$78,$20
.byte $59,$B7,$E6,$3D,$06,$45,$AF,$C8,$08,$31,$38,$D1,$FB,$73,$84,$A9
.byte $17,$FC,$34,$87,$A3,$94,$FA,$90,$B8,$ED,$CE,$3B,$5B,$0A,$43,$D9
.byte $F3,$53,$82,$B3,$0D,$6D,$5A,$60,$9D,$51,$A7,$B9
LF572: .byte $11,$10,$BC,$E4,$7F,$80,$41,$E7,$E3
LF57B: .byte $F6,$56,$26,$35,$EC,$D6,$DF,$0C,$7F,$F4,$9E,$AC,$52,$46,$EF,$CF
.byte $BF,$A2,$3F,$A4,$13,$15,$97,$4A,$1C,$B0,$42,$8C,$B1,$05,$58,$80
.byte $18,$77,$2B,$02,$3E,$A8,$49,$1A,$6A
LF5A4: .byte $CB,$6E,$0B,$8A,$EB,$F1,$4F,$14,$79,$8B,$D8,$9F,$9B,$57,$19,$F8
.byte $2A,$2D,$76,$0E,$E8,$2E,$4B,$F9,$07,$03,$DE,$93,$16,$7E,$D4,$E5
.byte $B2,$F0,$7D,$7A,$DA,$D2,$A1,$CC,$1D,$E0,$5E,$23,$A0,$95,$22,$1E
.byte $36,$85,$FE,$1F,$39
LF5D9: .byte $AA,$89,$96,$AD,$0F,$2F,$C0,$47
LF5E1: .byte $27,$5D,$24,$EA,$C3,$A5,$F5,$21,$5F,$1B,$40,$8F,$AE,$74,$25,$DD
.byte $C1,$7C,$CD,$A6,$70,$D7,$33,$7B,$2C,$75,$BB,$86,$99,$BD,$54
LF600: .byte $9A,$6C,$63,$32,$48,$4C,$8D,$BA
LF608: .byte $5C,$61,$C4,$4E,$29,$37,$12,$C6,$98,$9C,$D5,$69,$6B,$E2,$04,$4D
.byte $E9,$C2,$88,$3A,$DB,$64,$01,$44,$6F,$B5,$F2,$30,$28,$FD,$50,$71
.byte $3C,$B4,$66,$68,$C9,$D3,$CA,$83,$C7,$AB,$F7,$65,$09,$EE
ldx #$77 ;($2536)
stx $E4
stx $E5
LF63C: lda CartKey,X ;Read Key
sta $1901,X ;Store it
sta $2000,X ;Store it again
dex ;next byte of key
bpl LF63C ;Continue
lda #$02 ;
sta INPTCTRL ;Disable cart
jsr LFB84 ;Init display
jsr $257B
dec $F2
ldx #$77
stx $E4
LF658: lda LFED5,X
sta $1901,X
dex
bpl LF658
lda $E1
sta $E3
jsr $25E1
dec $F2
LF66A: lda $E0
sta $2572
ldx #$77
LF671: lda $1800,X
LF674: sta $2000,X
dex
bpl LF671
rts
jsr $2639 ;($257B)
ldy $E5
iny
LF681: STY $E1
TYA
clc
adc $E2
pha
LF688: tax
lda #$00
sta $2671
LF68E: sta $1800,X
dex
LF692: bne LF68E
sta $1800
LF697: iny
STY $266E
STY $2674
STY $267C
STY $2681
ldx #$00
LF6A6: dec $266E
LF6A9: dec $2674
LF6AC: dec $267C
dec $2681
dec $E1
bmi LF6D1
LF6B6: ldy $E1
lda $2000,Y
and $25D9,X
beq LF6C9
lda $2662,X
sta $2672
jsr $266A
LF6C9: inx
cpx #$08
bmi LF6B6
jmp $25A4
LF6D1: pla
sta $E1
lda #$01
sta $E0
rts
LF6D9: .byte $01,$02,$04,$08,$10,$20,$40,$80
jsr $2639
lda $E3
sec
sbc $E4
sta $E0
sta $E1
ldx #$00
stx $1800
stx $268F
stx $26AC
dex
stx $26A9
stx $268C
stx $2692
stx $269A
stx $269F
ldx #$07
inc $26A9
inc $268C
inc $2692
inc $269A
inc $269F
dec $E1
bmi LF734
LF71D: lda $2662,X
sta $2690
sta $26AD
jsr $26A6
bcc LF72E
jsr $2688
LF72E: dex
bpl LF71D
jmp $2608
LF734: lda $E3
sta $E1
rts
ldx $E4 ;($2639)
inx
stx $E2
ldy #$00
STY $1900
LF743: lda $2662,Y
sta $2655
iny
lda $2662,Y
sta $2659
ldx $E2
clc
LF753: lda $1900,X
rol
sta $1900,X
dex
bpl LF753
cpy #$07
bmi LF743
rts
LF762: .byte $19,$1A,$1B,$1C,$1D,$1E,$1F,$21
ldy $E2
clc
LF76D: lda $1800,Y
adc $1900,Y
sta $1800,Y
dey
bpl LF76D
bcc LF787
lda $1700,Y
adc #$00
sta $1700,Y
dey
jmp $2679
LF787: rts
ldy $E2
sec
LF78B: lda $1800,Y
sbc $1900,Y
sta $1800,Y
dey
bpl LF78B
bcs LF7A5
lda $1700,Y
sbc #$00
sta $1700,Y
dey
jmp $2697
LF7A5: rts
ldy #$00
lda $1800,Y
cmp $1900,Y
beq LF7B1
LF7B0: rts
LF7B1: cpy $E2
beq LF7B0
iny
jmp $26A8
LF7B9: ; ($26B9) 7800 mode init
ldx #$16 ; finally, back to something important
stx INPTCTRL ; switch out bios and use reset vector
txs ; on cart to start the game.
SED
jmp (CartResetVectorLo)
; Enable 2600 mode
LF7C2: ; ($26C2) 2600 mode init
lda #$02 ; Enable memory/bios
sta INPTCTRL ;
ldx #$7F
LF7C8: lda LF7D4,X ; again, copy code to ram....
sta $0480,X
dex
bpl LF7C8
jmp $0480 ; execute it
; code executed at $0480 (RIOT RAM)
LF7D4: lda #$00 ;
tax ;
sta INPTCTRL ; Disable 7800 RAM
LF7D9: sta RSYNC,X ; Clear the TIA
inx ;
cpx #$2A ;
bne LF7D9 ;
sta WSYNC ; wait for sync
lda #$04 ;
nop ;
bmi LF80A
ldx #$04
LF7E9: dex
bpl LF7E9
txs
sta $0110
jsr $04CB
jsr $04CB
sta RESP1
sta GRP0
sta GRP1
sta PF2
nop
sta WSYNC
lda #$00
nop
bmi LF80A
bit RSYNC
bmi LF813
LF80A: lda #$02
sta COLUBK
sta LF112
bne LF831
LF813: bit WSYNC
bmi LF823
lda #$02
sta COLUP0
sta LF118
sta LF460
bne LF831
LF823: sta DPPH
lda #$08
sta GRP0
jsr $04CB
nop
bit WSYNC
bmi LF80A
LF831: lda #$FD
sta COLUPF
jmp (CartResetVectorLo) ; And use the reset vector on the cart to start
nop ; the 2600 game.
ORG $F880
LF880: lda #$1D ; this is called any time the self-test fails.
sta INPTCTRL ; Eanble TIA/Cart/lock out INPTCTRL
START: ; $F884
SEI ; BIOS entry point. Disable interrupts
CLD ; Clear decimal flag
lda #$02 ;
LF888: sta INPTCTRL ; Enable 7800 RAM
lda #$FB ;
sta $F5 ;
lda #$12 ;
sta $F4 ; set nmi vector to FB12. (shares cleanup of irq)
lda #$7F ;
sta CTRL ; Turn off DMA
lda #$00 ;
sta BACKGRND ; Background color
ldx #$05 ;
LF89C: lda LF91D,X ; looks icky, but it's just a ram test
ldy #$00 ;
LF8A1: sta $2000,Y ;
cmp $2000,Y ;
bne LF8D0 ; Test failed
sta $2100,Y ;
cmp $2100,Y ;
bne LF8D0 ; Test failed
dey ;
bne LF8A1 ;
dex ;
bpl LF89C ; and right down here, it passes
lda #$43 ; Check RAM 0 mirror
sta $2080 ;
cmp $80 ;
bne LF8CB ; make sure they match. If not, fail selftest.
sta $2180 ; Check RAM 1 mirror
cmp $0180 ;
bne LF8CB ; make sure they match. If not, fail selftest.
jmp LF938 ; continue selftest
LF8CB: ldy #$04 ;
jmp LF880 ; selftest fail.
LF8D0: sta $1800 ; test store and compare
cmp $1800
bne LF8E2 ; some kind of error code is being determined
LF8D8: ldy #$01
jmp LF880
LF8DD: ldy #$02
jmp $F880
LF8E2: ldy #$03
jmp LF880
LF8E7: lda #$00 ; this is a more comprehensive ram test than
sta $F0 ; the first routine, and it is called after
sta $F2 ; more of the selftest has completed.
ldy #$07
STY $F4
LF8F1: lda LF923,Y
sta $F1
lda LF92B,Y
sta $F3
ldx #$05
LF8FD: lda LF91D,X
LF900: ldy #$00
LF902: sta ($F0),Y
cmp ($F0),Y
bne LF8D8
sta ($F2),Y
cmp ($F2),Y
bne LF8DD
dey
bne LF902
dex
bpl LF8FD
dec $F4
ldy $F4
bpl LF8F1
jmp LFB17 ; ram test passed, so jump in here.
; ram test data
LF91D: .byte $00,$FF,$55,$AA,$69,$0F
LF923: .byte $22,$23,$24,$25,$26,$27,$22,$23
LF92B: .byte $18,$19,$1A,$1B,$1C,$1D,$1E,$1F
LF933: ldy #$00 ; local place for selftest fail branch target
jmp LF880
; 6502 CPU test
LF938: lda #$AA ; test some flags and branches
beq LF933 ; test failed
bpl LF933 ; test failed
bmi LF943 ; test passed
jmp LF933 ; test failed
LF943: bne LF948 ; test passed
jmp LF933 ; test failed
LF948: sta $AA ; store AA to 00AA
cmp $AA ; compare it back
bne LF933 ; if it doesn't match, selftest fail
lda #$00 ; do some more flag tests
bne LF933 ;
bmi LF933 ;
bpl LF959 ; test passed
jmp LF933 ;
LF959: beq LF95E ; test passed
jmp LF933 ;
LF95E: cmp #$00 ; test the compare instruction
bne LF933 ;
bcc LF933 ;
bcs LF969 ; test passed, since they're equal
jmp LF933 ;
LF969: cmp #$01 ; compare it to 01
bcs LF933 ;
bcc LF972 ; A < 01, so carry is clear
jmp LF933 ;
LF972: ldx #$55 ; test comparisons with the X register
cpx #$56 ;
beq LF933 ;
stx $01AA ;
cpx $01AA ;
bne LF933 ;
ldy $AA ; and with the Y register.
cpy #$AB ;
LF984: beq LF933 ;
STY $0155 ; put some stuff in the stack area to test stack
cpy $0155 ; and then access this data in many diffeent ways
bne LF933 ;
dex ;
txs ;
inx ;
pla ;
cmp #$AA ;
bne LF9EB ;
txa ;
pha ;
cpx $0155 ;
bne LF9EB ;
TYA ;
cmp #$AA ;
bne LF9EB ;
tax ;
lda $0100,X ;
tay ;
cpy #$55 ;
bne LF9EB ;
lda VSYNC,X ;
cmp $AA ;
bne LF9EB ;
cmp #$AA ;
bne LF9EB ;
eor #$FF ;
sta $0000,Y ;
cmp $55 ;
bne LF9EB ;
cmp $0100,Y ;
bne LF9EB ;
cmp $20AB,X ;
bne LF9EB ;
lda #$20 ;
sta $F1 ;
lda #$CC ;
sta $F0 ;
sta ($46,X) ;
cmp $CC ;
bne LF9EB ;
sta ($F0),Y ;
cmp $2121 ;
bne LF9EB ;
lda #$EE ; test the indirect jump by setting up a jump
sta $F0 ; to F9EE
lda #$F9 ;
sta $F1 ;
jmp ($00F0) ; and do it.
LF9E8: jmp $F9EB
LF9EB: jmp LF933
LF9EE: lda #$55 ; now test out the math functions.
clc
adc #$55
nop
bcs LF9EB ; test addition.
bpl LF9EB
beq LF9EB
cmp #$AA ; make sure it worked
bne LF9EB
adc #$55 ; test addition again.
LFA00: nop
bcc LF9EB
bmi LF9EB
bne LF9EB
sbc #$55 ; test subtraction
bcs LF9EB
bpl LF9EB
beq LF9EB
cmp #$AB ; make sure it worked
bne LF9EB
clc
sbc #$AA ; test subtraction again
bcc LF9EB
bmi LF9EB
bne LF9EB
lda #$FF ; set up a stack
tax ; and do all kinds of stuff in it for tests
inx
bne LFA58
dex
beq LFA58
bpl LFA58
cpx #$FF
bne LFA58
tay
iny
bne LFA58
dey
beq LFA58
iny
bne LFA58
sta $F0
inc $F0
bne LFA58
cpy $F0
bne LFA58
dec $F0
beq LFA58
cmp $F0
bne LFA58
lda #$AA
clc
rol ; now we get onto the more complex math instrs
rol
rol
cmp #$52
bne LFA58 ; make sure rotate left works.
ror
ror
ror
cmp #$AA
beq LFA5B ; test rotate right
LFA58: jmp LF933 ; fail!
LFA5B: asl ; test arithmetic shift left
bcc LFA58
asl
bcs LFA58
asl
cmp #$50
bne LFA58
eor #$05
lsr ; and logical shift right
bcc LFA58
lsr
bcs LFA58
lsr
cmp #$0A
bne LFA58
lda #$55 ; now test the ands and ors.
ora #$1B
cmp #$5F
bne LFA58
and #$55
and #$1B
cmp #$11
bne LFA58
ora #$55
eor #$1B ; and the eors
cmp #$4E
bne LFA58
jsr LFA91 ; test jump subroutine instruction
jmp LFA58 ; if we return, fail
LFA91: tsx
cpx #$52 ; check stack pointer
bne LFA58 ; fail if not right
pla
cmp #$8D
bne LFA58
pla
cmp #$FA
bne LFA58 ; get the old return address off the stack
lda #$F8
pha
lda #$E6
pha ; and make our own
rts ; and 'return' to F8E7
jmp LFA58 ; another jump to catch a failure
; Interrupt routine NMI.
LFAAA: txa ;Save A
pha ;
lda #$43 ;Setup control register
sta CTRL ;
ldx #$0F ; Handle the color scrolling in the FUJI
lda $EF
sta P0C2
bit $F3
bvc LFAC0
bpl LFABE
LFABC: sta MWSYNC ;Wait for 3 scanlines
LFABE: sta MWSYNC ;
LFAC0: sta MWSYNC ;
sec
sbc #$10
cmp #$10
bcs LFACB
sbc #$0F
LFACB: sta P0C2
dex
bpl LFABC ;Branch to do next section of fuji
ldx #$40 ;set 160x2/160x4 mode
stx CTRL ;
and #$F0 ;
ora #$0E ;set Palette 1 color 3
sta P1C3 ;
lda $EF ;
and #$F0 ;
ora #$06 ;set Palette 1 color 1
sta P1C1 ;
and #$F0
clc
adc #$40
bcc LFAEB
adc #$0F
LFAEB: ora #$03 ;set Palette 1 color 2
sta P1C2
dec $F1
bpl LFB0C
lda $F3
adc #$60
bcc LFB0A
lda $EF
clc
adc #$10
bcc LFB02
adc #$0F
LFB02: sta $EF
lda $F2
sta $F1
lda #$00
LFB0A: sta $F3
LFB0C: lda #$02
sta $F0
pla
tax
pla
rti
LFB14: jmp LFB14
LFB17: ldx #$FF ; selftest has passed, start system init
txs ; set up a stack
lda #$00 ; Clear TIA/Maria registers
tax ;
LFB1D: sta $01,X ; ;
inx ;
cpx #$2C ;
bne LFB1D ;
lda #$02 ;
sta INPTCTRL ; Enable 7800 RAM
ldx #$00 ;
stx BACKGRND ; Set background color
LFB2C: lda LF400,X ; copy the authentication and title screen to
sta $2300,X ; ram
lda LF500,X ;
sta $2400,X ;
lda LF600,X ;
sta $2500,X ;
lda LF700,X ;
sta $2600,X ;
lda LF800,X ;
sta $2700,X ;
lda LFBBE,X ;
sta $2200,X ;
cpx #$00 ;
bmi LFB7E ;
lda LFC4B,X ;
sta $1F84,X ;
lda LFCC6,X ;
sta $1984,X ;
lda LFD3D,X ;
sta $1A84,X ;
lda LFDB4,X ;
sta $1B84,X ;
lda LFE18,X ;
sta $1C84,X ;
lda LFE57,X ;
sta $1D84,X ;
lda LFE96,X ;
sta $1E84,X ;
LFB7E: dex ;
bne LFB2C ;
jmp $2306 ; and execute it
;Start display of Atari logo
LFB84: lda CartKeyStartPage ; Read ROM start byte from cart
and #$04 ; Is rom start greater then $4000?
beq LFBBD ; Branch if not
lda #$03
sta $F1
sta $F2
lda #$49
sta $EF
lda #$66 ;Palette 1 Color 1
sta P1C1 ;
lda #$56 ;Palette 1 Color 2
sta P1C2 ;
lda #$2E ;Palette 1 Color 3
sta P1C3 ;
lda #$AA ;Set NMI vector to FAAA
sta $F4 ;
lda #$FA ;
sta $F5 ;
LFBA9: bit MSTAT ;Check VBLANK status
bmi LFBA9 ;Wait till end of VBLANK
LFBAD: bit MSTAT ;Check BLANK status
bpl LFBAD ;Wait for start of next VBLANK
lda #$84 ;Set Display list pointer to $1f84
sta DPPL ;
lda #$1F ;
sta DPPH ;
lda #$43 ;Maria mode = DMA on/320A or 320C
sta CTRL ;
LFBBD: rts ;
; Graphics and Display List Data
LFBBE: ;$2200 Display Lists
.byte $84,$1F,$19,$BB ;$2200 Blank space
.byte $00,$00
.byte $84,$40,$19,$1F,$BB ;$2206 First DL on screen
.byte $00,$00
.byte $85,$1C,$19,$4A ;$220D Blank space before Fuji
.byte $00,$00
.byte $89,$1C,$19,$4A ;$2213 Fuji line 1
.byte $00,$00
.byte $8D,$1C,$19,$48 ;$2219 Fuji line 2
.byte $00,$00
.byte $91,$1B,$19,$46 ;$221F Fuji line 3
.byte $00,$00
.byte $96,$19,$19,$42 ;$2225 Fuji line 4
.byte $00,$00
.byte $9D,$17,$19,$3E ;$222B Fuji line 5
.byte $00,$00
.byte $A6,$17,$19,$3E ;$2231 Fuji line 6
.byte $00,$00
.byte $AF,$2C,$1C,$00 ;$2237 Start of Atari
.byte $AF,$2C,$1C,$50 ; and between lines
.byte $00,$00
.byte $AF,$2C,$1D,$00 ;$2241 End of Atari
.byte $AF,$2C,$1D,$50
.byte $00,$00
.byte $AF,$2D,$19,$28 ;$224B Atari line 1
.byte $00,$00
.byte $C2,$2D,$19,$28 ;$2251 Atari line 2
.byte $00,$00
.byte $D5,$2D,$19,$28 ;$2257 Atari line 3
.byte $00,$00
.byte $E8,$2D,$19,$28 ;$225D Atari line 4
.byte $00,$00
.byte $AF,$2D,$1A,$28 ;$2263 Atari line 5
.byte $00,$00
.byte $C2,$2D,$1A,$28 ;$2269 Atari line 6
.byte $00,$00
.byte $D5,$2D,$1A,$28 ;$226F Atari line 7
.byte $00,$00
.byte $E8,$2D,$1A,$28 ;$2275 Atari line 8
.byte $00,$00
.byte $AF,$2D,$1B,$28 ;$227B Atari line 9
.byte $00,$00
.byte $C2,$2D,$1B,$28 ;$2281 Atari line 10
.byte $00,$00
.byte $D5,$2D,$1B,$28 ;$2287 Atari line 11
.byte $00,$00
; $1F84 Display List List
LFC4B: .byte $0F,$22,$06 ;Blank space
.byte $0F,$22,$00 ;
.byte $0F,$22,$00 ;
.byte $0F,$22,$00 ;
.byte $03,$22,$00 ;
.byte $85,$22,$0D ;DLI
.byte $05,$22,$13 ;Draw Fuji
.byte $05,$22,$19 ;
.byte $05,$22,$1F ;
.byte $05,$22,$25 ;
.byte $05,$22,$2B ;
.byte $05,$22,$31 ;
.byte $0F,$22,$00 ;Blank area
.byte $01,$22,$37 ;Draw "ATARI"
.byte $00,$22,$4B ;Line 1
.byte $02,$22,$37
.byte $00,$22,$51 ;Line 2
.byte $02,$22,$37
.byte $00,$22,$57 ;Line 3
.byte $02,$22,$37
.byte $00,$22,$5D ;Line 4
.byte $02,$22,$37
.byte $00,$22,$63 ;Line 5
.byte $02,$22,$37
.byte $00,$22,$69 ;Line 6
.byte $02,$22,$37
.byte $00,$22,$6F ;Line 7
.byte $02,$22,$37
.byte $00,$22,$75 ;Line 8
.byte $02,$22,$37
.byte $00,$22,$7B ;Line 9
.byte $02,$22,$37
.byte $00,$22,$81 ;Line 10
.byte $02,$22,$37
.byte $00,$22,$87 ;Line 11
.byte $01,$22,$41
.byte $0F,$22,$00 ;Blank Space
.byte $0F,$22,$00 ;
.byte $0F,$22,$00 ;
.byte $0F,$22,$00 ;
.byte $0F,$22,$00 ;
LFCC6
.byte $00,$7c,$7f,$8f,$80,$fc,$7f,$8f,$c0,$1f,$87,$f8,$7e,$0f,$e0,$7f
LFCD6
.byte $81,$fc,$07,$ff,$80,$7f,$80,$7f,$f8,$1f,$ff,$f0,$00,$7f,$80,$03
LFCE6
.byte $ff,$fe,$1f,$00,$00,$00,$7f,$80,$00,$00,$3e,$00,$00,$0c,$00,$3f
LFCF6
.byte $ff,$ff,$ff,$f0,$00,$c0,$00,$00,$3f,$ff,$ff,$00,$03,$fc,$00,$00
LFD06
.byte $3f,$00,$3f,$ff,$ff,$ff,$f0,$03,$f0,$00,$00,$3f,$ff,$ff,$fc,$03
LFD16
.byte $fc,$00,$00,$ff,$c0,$00,$03,$ff,$00,$00,$0f,$fc,$00,$00,$3f,$f0
LFD26
.byte $03,$ff,$c3,$fc,$00,$03,$ff,$f0,$00,$03,$ff,$00,$00,$3f,$ff,$00
LFD36
.byte $00,$3f,$f0,$00,$3f,$c3,$fc,$00,$7c,$7f,$8f,$80,$7c,$7f,$8f,$80
LFD46
.byte $1f,$87,$f8,$7e,$0f,$f0,$7f,$83,$fc,$01,$ff,$80,$7f,$80,$7f,$e0
LFD56
.byte $1f,$ff,$f8,$00,$7f,$80,$07,$ff,$fe,$1f,$f0,$00,$00,$7f,$80,$00
LFD66
.byte $03,$fe,$00,$0f,$f3,$fc,$00,$03,$ff,$00,$00,$ff,$3f,$c0,$00,$3f
LFD76
.byte $f0,$00,$ff,$c3,$fc,$00,$3f,$c0,$ff,$00,$03,$ff,$00,$03,$fc,$0f
LFD86
.byte $f0,$00,$3f,$f0,$3f,$fc,$03,$fc,$00,$ff,$00,$3f,$c0,$03,$ff,$00
LFD96
.byte $0f,$f0,$03,$fc,$00,$3f,$f0,$ff,$c0,$03,$fc,$03,$ff,$ff,$ff,$f0
LFDA6
.byte $03,$ff,$00,$3f,$ff,$ff,$ff,$00,$3f,$f0,$3f,$f0,$03,$fc,$00,$7c
LFDB6
.byte $7f,$8f,$80,$7c,$7f,$8f,$80,$1f,$87,$f8,$7e,$07,$f0,$7f,$83,$f8
LFDC6
.byte $00,$ff,$c0,$7f,$80,$ff,$c0,$1f,$ff,$fc,$00,$7f,$80,$0f,$ff,$fe
LFDD6
.byte $1f,$fc,$00,$00,$7f,$80,$00,$0f,$fe,$0f,$ff,$ff,$ff,$fc,$03,$ff
LFDE6
.byte $00,$ff,$ff,$ff,$ff,$c0,$3f,$f0,$0f,$fc,$03,$fc,$3f,$f0,$00,$03
LFDF6
.byte $ff,$03,$ff,$03,$ff,$00,$00,$3f,$f0,$3f
LFE00
.byte $f0,$03,$ff,$03,$fc,$ff
LFE06
.byte $c0,$00,$00,$ff,$c3,$ff,$0f,$fc,$00,$00,$0f,$fc,$3f,$f0,$00,$ff
LFE16
.byte $c3,$fc,$00,$7c,$7f,$8f,$80,$7c,$7f,$8f,$80,$0f,$87,$f8,$7c,$07
LFE26
.byte $f0,$7f,$83,$f8,$00,$7f,$c0,$7f,$80,$ff,$80,$1f,$ff,$fe,$00,$7f
LFE36
.byte $80,$1f,$ff,$fe,$1f,$ff,$00,$00,$7f,$80,$00,$3f,$fe,$55,$55,$55
LFE46
.byte $55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55
LFE56
.byte $55,$00,$7c,$7f,$8f,$80,$7c,$7f,$8f,$80,$0f,$c7,$f8,$fc,$03,$f0
LFE66
.byte $7f,$83,$f0,$00,$3f,$e0,$7f,$81,$ff,$00,$01,$ff,$fe,$00,$7f,$80
LFE76
.byte $1f,$ff,$e0,$1f,$ff,$c0,$00,$7f,$80,$00,$ff,$fe,$aa,$aa,$aa,$aa
LFE86
.byte $aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa
LFE96
.byte $00,$7c,$7f,$8f,$80,$7c,$7f,$8f,$80,$0f,$c7,$f8,$fc,$03,$f8,$7f
LFEA6
.byte $87,$f0,$00,$1f,$e0,$7f,$81,$fe,$00,$00,$1f,$ff,$00,$7f,$80,$3f
LFEB6
.byte $fe,$00,$1f,$ff,$e0,$00,$7f,$80,$01,$ff,$fe,$55,$55,$55,$55,$55
LFEC6
.byte $55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$09
LFED6
.byte $ca,$c9,$c6,$b4,$12,$08,$1b,$60,$58,$81,$4b,$86,$01,$d8,$bf,$d9
LFEE6
.byte $25,$a0,$7b,$dc,$32,$79,$84,$3b,$7c,$bc,$2f,$e2,$e2,$fa,$8d,$0a
LFEF6
.byte $00,$3b,$c5,$ec,$af,$2d,$8a,$cd,$06,$93
LFF00
.byte $6a,$a5,$14,$46,$77,$c4
LFF06
.byte $6a,$b2,$53,$36,$ef,$8c,$ce,$0c,$a2,$68,$71,$d3,$73,$e8,$f7,$6d
LFF16
.byte $06,$b5,$20,$ef,$23,$47,$0c,$51,$55,$c8,$fe,$f4,$58,$c4,$3f,$20
LFF26
.byte $a7,$67,$38,$b0,$76,$e2,$c4,$d8,$05,$63,$f8,$3c,$58,$3b,$2d,$22
LFF36
.byte $cc,$88,$b3,$71,$8f,$1d,$80,$0a,$87,$bd,$a1,$59,$23,$e9,$70,$e2
LFF46
.byte $d3,$ec,$46,$68,$80,$42,$39,$ea,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
LFF56
.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
LFF66
.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
LFF76
.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
LFF86
.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
LFF96
.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
LFFA6
.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
LFFB6
.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
LFFC6
.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
LFFD6
.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
LFFE6
.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
LFD3D = $FD3D
LFDB4 = $FDB4
LFDD5 = $FDD5
LFE18 = $FE18
LFE57 = $FE57
LFE84 = $FE84
LFE96 = $FE96
LFED5 = $FED5
LFF00 = $FF00
GccCopyright
.byte $47,$43,$43,$28,$43,$29 ; 'GCC(C)'
.byte $31,$39,$38,$34,$2D,$F7 ; '1984-'
; Classic 6502 vectors. Called Cart* because they often
; are referenced when the game cart is switched in.
CartNMIVectorLo
.byte $00,$F0 ; system vector - nmi
CartResetVectorLo
.word START ; F884
CartIRQVectorLo
.byte $33,$F9 ; system vector - irq