; Disassembly of bios7800.bin
; Disassembled Sun Mar 08 20:30:38 1998
; Using DiStella v2.0
;
; Comments added by Keith Henrickson <flipper@phin.com>
; They may be wrong. Use at your own risk.  Modification suggested
; for bypassing authentication scheme is at this date untested.
;
; Command Line: E:\DISTELLA\DISTELLA.EXE -cbios7800.cfg bios7800.bin 
;
; bios7800.cfg contents:
;
;      ORG F000
;      CODE F000 F003
;      CODE F400 F52D
;      CODE F636 F6D8
;      CODE F6E1 F761
;      CODE F76A F838
;      CODE F8E7 F91C
;      CODE F9EE FBBD

VSYNC   =  $00
VBLANK  =  $01
WSYNC   =  $02
RSYNC   =  $03
COLUP0  =  $06
COLUPF  =  $08
COLUBK  =  $09
PF2     =  $0F
RESP1   =  $11
GRP0    =  $1B
GRP1    =  $1C
HMP0    =  $20
HMM0    =  $22
HMBL    =  $24
VDELP0  =  $25
VDEL01  =  $26
VDELBL  =  $27
RESMP0  =  $28
CXCLR   =  $2C
CXM0P   =  $30
INPT4   =  $3C
LF409   =   $F409
LF412   =   $F412
LF41B   =   $F41B
LF460   =   $F460
LF500   =   $F500
LF639   =   $F639
LF655   =   $F655
LF659   =   $F659
LF662   =   $F662
LF66E   =   $F66E
LF672   =   $F672
LF679   =   $F679
LF67C   =   $F67C
LF68C   =   $F68C
LF68F   =   $F68F
LF690   =   $F690
LF69A   =   $F69A
LF69F   =   $F69F
LF6A8   =   $F6A8
LF6AD   =   $F6AD
LF6B9   =   $F6B9
LF6C2   =   $F6C2
LF700   =   $F700
LF800   =   $F800
LF901   =   $F901
LFA84   =   $FA84

       ORG $F000

LF000: PHA                ; This is the NMI routine.
       JMP($00F4)         ; RAM NMI vector is at $00F4.


; this code is designed to be executed while stored in ram at 2300.
LF400: JMP    $26C2       ; Enter 2600 mode.
LF403: JMP    $26C2       ; Enter 2600 mode.
LF406: LDA    #$16      
       STA    VBLANK      ; I suspect this switches out bios.
LF40A: LDY    #$FF    
       LDX    #$7F    
LF40E: LDA    LFE00,X 
       CMP    LFD80,Y 
       BNE    LF400   
       DEY            
       DEX            
       BPL    LF40E       ; Compares FE7F with FE7F two ways??
       LDA    LFFFC   
       AND    LFFFD   
       CMP    #$FF    
       BEQ    LF400       ; If RESET vector is FFFF, then go 2600.
       LDA    LFFFC   
       ORA    LFFFD   
       BEQ    LF400       ; If RESET vector is 0000, then go 2600.
       LDA    LFFF8   
       ORA    #$FE    
       CMP    #$FF        
       BNE    LF403       ; If low-bit of FFF8=0, then go 2600.
       LDA    LFFF8   
       EOR    #$F0        ; Invert high nibble
       AND    #$F0        ; Extract high nibble
       BNE    LF403       ; If high nibble was not F, then go 2600.
       LDA    LFFF9   
       AND    #$0B        ; Apply mask 00001011
       CMP    #$03        ; Low two bits must be set. Bit 2 can. Bit 3 not.
       BNE    LF403       ; If low nibble FFF9 was not 3 or 7, go 2600.
       LDA    LFFF9   
       AND    #$F0        ; Extract high nibble of FFF9
       STA    $EE     
       STA    $2406       ; Store it a couple of places for auth. (whocares)
       CMP    #$40    
       BCC    LF403       ; If high nibble < than 4, then go 2600
       SBC    #$01        ; Subtract 1.
       CMP    LFFFD   
       BCS    LF403       ; If high-byte of start is >=, go 2600
       JSR    $2536       ; Start the authentication process.
       LDA    #$00    
       STA    $F0     
       JSR    $241B   
       LDA    #$16    
       STA    VBLANK  
       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    INPT4   
       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.

       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            

       PHP            
       DEC    $F0     
       BPL    LF52C   
       LDA    #$02    
       STA    VBLANK  
LF524: LDA    $F0     
       BMI    LF524   
       LDA    #$16    
       STA    VBLANK  
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
       STX    $E4     
       STX    $E5     
LF63C: LDA    LFF80,X 
       STA    $1901,X 
       STA    $2000,X 
       DEX            
       BPL    LF63C   
       LDA    #$02    
       STA    VBLANK  
       JSR    LFB84   
       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   
       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     
       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    A       
       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: LDX    #$16        ; finally, back to something important
       STX    VBLANK      ; switch out bios and use reset vector
       TXS                ; on cart to start the game.
       SED            
       JMP(LFFFC)     

LF7C2: LDA    #$02        ; this is the 2600 mode enabler.
       STA    VBLANK      ; doing a rom bios switch-in
       LDX    #$7F    
LF7C8: LDA    LF7D4,X     ; again, copy code to ram....
       STA    $0480,X 
       DEX            
       BPL    LF7C8   
       JMP    $0480       ; execute it

LF7D4: LDA    #$00        ; I think this store to vblank right here is
       TAX                ; what causes the mode switch itself.  Everything
       STA    VBLANK      ; else seems to be cleaning up and initializing
LF7D9: STA    RSYNC,X     ; the tia.
       INX            
       CPX    #$2A    
       BNE    LF7D9   
       STA    WSYNC   
       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    CXCLR   
       LDA    #$08    
       STA    GRP0    
       JSR    $04CB   
       NOP            
       BIT    WSYNC   
       BMI    LF80A   
LF831: LDA    #$FD    
       STA    COLUPF  
       JMP(LFFFC)         ; And use the reset vector on the cart to start
       NOP                ; the 2600 game.

LF880: LDA    #$1D        ; this is called any time the self-test fails.
       STA    VBLANK      ; what does it do?

START:     
       SEI                ; BIOS entry point.  Disable interrupts
       CLD                ; Clear decimal flag
       LDA    #$02       
LF888: STA    VBLANK      ; switch off video output (2600 would..)
       LDA    #$FB    
       STA    $F5     
       LDA    #$12    
       STA    $F4         ; set nmi vector to FB12. (shares cleanup of irq)
       LDA    #$7F    
       STA    INPT4       ; I am sure this is something 7800
       LDA    #$00    
       STA    HMP0        ; 7800 thing maybe?
       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   
       STA    $2100,Y 
       CMP    $2100,Y 
       BNE    LF8D0   
       DEY            
       BNE    LF8A1   
       DEX            
       BPL    LF89C       ; and right down here, it passes
       LDA    #$43    
       STA    $2080       ; store 43 to 2080
       CMP    $80         ; and read it back for 0080
       BNE    LF8CB       ; make sure they match. If not, fail selftest.
       STA    $2180       ; store the 43 to 2180
       CMP    $0180       ; and read it back from 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    #$04
       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   

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    A          ; now we get onto the more complex math instrs
       ROL    A       
       ROL    A       
       CMP    #$52    
       BNE    LFA58      ; make sure rotate left works.
       ROR    A       
       ROR    A       
       ROR    A       
       CMP    #$AA    
       BEQ    LFA5B      ; test rotate right
LFA58: JMP    LF933      ; fail!

LFA5B: ASL    A          ; test arithmetic shift left
       BCC    LFA58   
       ASL    A       
       BCS    LFA58   
       ASL    A       
       CMP    #$50    
       BNE    LFA58   
       EOR    #$05    
       LSR    A          ; and logical shift right
       BCC    LFA58   
       LSR    A       
       BCS    LFA58   
       LSR    A       
       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

; I think this is the interrupt routine.

LFAAA: TXA
       PHA            
       LDA    #$43    
       STA    INPT4   
       LDX    #$0F    
       LDA    $EF     
       STA    HMM0    
       BIT    $F3     
       BVC    LFAC0   
       BPL    LFABE   
LFABC: STA    HMBL    
LFABE: STA    HMBL    
LFAC0: STA    HMBL    
       SEC            
       SBC    #$10    
       CMP    #$10    
       BCS    LFACB   
       SBC    #$0F    
LFACB: STA    HMM0    
       DEX            
       BPL    LFABC   
       LDX    #$40    
       STX    INPT4   
       AND    #$F0    
       ORA    #$0E    
       STA    VDELBL  
       LDA    $EF     
       AND    #$F0    
       ORA    #$06    
       STA    VDELP0  
       AND    #$F0    
       CLC            
       ADC    #$40    
       BCC    LFAEB   
       ADC    #$0F    
LFAEB: ORA    #$03    
       STA    VDEL01  
       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    
       TAX            
LFB1D: STA    VBLANK,X
       INX            
       CPX    #$2C    
       BNE    LFB1D      ; and reset all the TIA registers.
       LDA    #$02    
       STA    VBLANK     ; turn of video signal
       LDX    #$00    
       STX    HMP0    
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

LFB84: LDA    LFFF9      ; I think this does the intro screen, as it is
       AND    #$04       ; called during the authentication
       BEQ    LFBBD   
       LDA    #$03    
       STA    $F1     
       STA    $F2     
       LDA    #$49    
       STA    $EF     
       LDA    #$66    
       STA    VDELP0  
       LDA    #$56    
       STA    VDEL01  
       LDA    #$2E    
       STA    VDELBL  
       LDA    #$AA    
       STA    $F4     
       LDA    #$FA    
       STA    $F5     
LFBA9: BIT    RESMP0  
       BMI    LFBA9   
LFBAD: BIT    RESMP0  
       BPL    LFBAD   
       LDA    #$84    
       STA    CXM0P   
       LDA    #$1F    
       STA    CXCLR   
       LDA    #$43    
       STA    INPT4   
LFBBD: RTS            

LFBBE: .byte $84,$1F,$19,$BB,$00,$00,$84,$40,$19,$1F,$BB,$00,$00,$85,$1C,$19
       .byte $4A,$00,$00,$89,$1C,$19,$4A,$00,$00,$8D,$1C,$19,$48,$00,$00,$91
       .byte $1B,$19,$46,$00,$00,$96,$19,$19,$42,$00,$00,$9D,$17,$19,$3E,$00
       .byte $00,$A6,$17,$19,$3E,$00,$00,$AF,$2C,$1C,$00,$AF,$2C,$1C,$50,$00
       .byte $00,$AF,$2C,$1D,$00,$AF,$2C,$1D,$50,$00,$00,$AF,$2D,$19,$28,$00
       .byte $00,$C2,$2D,$19,$28,$00,$00,$D5,$2D,$19,$28,$00,$00,$E8,$2D,$19
       .byte $28,$00,$00,$AF,$2D,$1A,$28,$00,$00,$C2,$2D,$1A,$28,$00,$00,$D5
       .byte $2D,$1A,$28,$00,$00,$E8,$2D,$1A,$28,$00,$00,$AF,$2D,$1B,$28,$00
       .byte $00,$C2,$2D,$1B,$28,$00,$00,$D5,$2D,$1B,$28,$00,$00
LFC4B: .byte $0F,$22,$06,$0F,$22,$00,$0F,$22,$00,$0F,$22,$00,$03,$22,$00,$85
       .byte $22,$0D,$05,$22,$13,$05,$22,$19,$05,$22,$1F,$05,$22,$25,$05,$22
       .byte $2B,$05,$22,$31,$0F,$22,$00,$01,$22,$37,$00,$22,$4B,$02,$22,$37
       .byte $00,$22,$51,$02,$22,$37,$00,$22,$57
LFC84: .byte $02,$22,$37,$00,$22,$5D,$02,$22,$37,$00,$22,$63,$02,$22,$37,$00
       .byte $22,$69,$02,$22,$37,$00,$22,$6F,$02,$22,$37,$00,$22,$75,$02,$22
       .byte $37,$00,$22,$7B,$02,$22,$37,$00,$22,$81,$02,$22,$37,$00,$22,$87
       .byte $01,$22,$41,$0F,$22,$00,$0F,$22,$00,$0F,$22,$00,$0F,$22,$00,$0F
       .byte $22,$00
LFCC6: .byte $00,$7C,$7F,$8F,$80,$FC,$7F,$8F,$C0,$1F,$87,$F8,$7E,$0F,$E0,$7F
       .byte $81,$FC,$07,$FF,$80,$7F,$80,$7F,$F8,$1F,$FF,$F0,$00,$7F,$80,$03
       .byte $FF,$FE,$1F,$00,$00,$00,$7F,$80,$00,$00,$3E,$00,$00,$0C,$00,$3F
       .byte $FF,$FF,$FF,$F0,$00,$C0,$00,$00,$3F,$FF,$FF,$00,$03,$FC,$00,$00
       .byte $3F,$00,$3F,$FF,$FF,$FF,$F0,$03,$F0,$00,$00,$3F,$FF,$FF,$FC,$03
       .byte $FC,$00,$00,$FF,$C0,$00,$03,$FF,$00,$00,$0F,$FC,$00,$00,$3F,$F0
       .byte $03,$FF,$C3,$FC,$00,$03,$FF,$F0,$00,$03,$FF,$00,$00,$3F,$FF,$00
       .byte $00,$3F,$F0,$00,$3F,$C3,$FC
LFD3D: .byte $00,$7C,$7F,$8F,$80,$7C,$7F,$8F,$80,$1F,$87,$F8,$7E,$0F,$F0,$7F
       .byte $83,$FC,$01,$FF,$80,$7F,$80,$7F,$E0,$1F,$FF,$F8,$00,$7F,$80,$07
       .byte $FF,$FE,$1F,$F0,$00,$00,$7F,$80,$00,$03,$FE,$00,$0F,$F3,$FC,$00
       .byte $03,$FF,$00,$00,$FF,$3F,$C0,$00,$3F,$F0,$00,$FF,$C3,$FC,$00,$3F
       .byte $C0,$FF,$00
LFD80: .byte $03,$FF,$00,$03
LFD84: .byte $FC,$0F,$F0,$00,$3F,$F0,$3F,$FC,$03,$FC,$00,$FF,$00,$3F,$C0,$03
       .byte $FF,$00,$0F,$F0,$03,$FC,$00,$3F,$F0,$FF,$C0,$03,$FC,$03,$FF,$FF
       .byte $FF,$F0,$03,$FF,$00,$3F,$FF,$FF,$FF,$00,$3F,$F0,$3F,$F0,$03,$FC
LFDB4: .byte $00,$7C,$7F,$8F,$80,$7C,$7F,$8F,$80,$1F,$87,$F8,$7E,$07,$F0,$7F
       .byte $83,$F8,$00,$FF,$C0,$7F,$80,$FF,$C0,$1F,$FF,$FC,$00,$7F,$80,$0F
       .byte $FF
LFDD5: .byte $FE,$1F,$FC,$00,$00,$7F,$80,$00,$0F,$FE,$0F,$FF,$FF,$FF,$FC,$03
       .byte $FF,$00,$FF,$FF,$FF,$FF,$C0,$3F,$F0,$0F,$FC,$03,$FC,$3F,$F0,$00
       .byte $03,$FF,$03,$FF,$03,$FF,$00,$00,$3F,$F0,$3F
LFE00: .byte $F0,$03,$FF,$03,$FC,$FF,$C0,$00,$00,$FF,$C3,$FF,$0F,$FC,$00,$00
       .byte $0F,$FC,$3F,$F0,$00,$FF,$C3,$FC
LFE18: .byte $00,$7C,$7F,$8F,$80,$7C,$7F,$8F,$80,$0F,$87,$F8,$7C,$07,$F0,$7F
       .byte $83,$F8,$00,$7F,$C0,$7F,$80,$FF,$80,$1F,$FF,$FE,$00,$7F,$80,$1F
       .byte $FF,$FE,$1F,$FF,$00,$00,$7F,$80,$00,$3F,$FE,$55,$55,$55,$55,$55
       .byte $55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55
LFE57: .byte $00,$7C,$7F,$8F,$80,$7C,$7F,$8F,$80,$0F,$C7,$F8,$FC,$03,$F0,$7F
       .byte $83,$F0,$00,$3F,$E0,$7F,$81,$FF,$00,$01,$FF,$FE,$00,$7F,$80,$1F
       .byte $FF,$E0,$1F,$FF,$C0,$00,$7F,$80,$00,$FF,$FE,$AA,$AA
LFE84: .byte $AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
       .byte $AA,$AA
LFE96: .byte $00,$7C,$7F,$8F,$80,$7C,$7F,$8F,$80,$0F,$C7,$F8,$FC,$03,$F8,$7F
       .byte $87,$F0,$00,$1F,$E0,$7F,$81,$FE,$00,$00,$1F,$FF,$00,$7F,$80,$3F
       .byte $FE,$00,$1F,$FF,$E0,$00,$7F,$80,$01,$FF,$FE,$55,$55,$55,$55,$55
       .byte $55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55
LFED5: .byte $09,$CA,$C9,$C6,$B4,$12,$08,$1B,$60,$58,$81,$4B,$86,$01,$D8,$BF
       .byte $D9,$25,$A0,$7B,$DC,$32,$79,$84,$3B,$7C,$BC,$2F,$E2,$E2,$FA,$8D
       .byte $0A,$00,$3B,$C5,$EC,$AF,$2D,$8A,$CD,$06,$93
LFF00: .byte $6A,$A5,$14,$46,$77,$C4,$6A,$B2,$53,$36,$EF,$8C,$CE,$0C,$A2,$68
       .byte $71,$D3,$73,$E8,$F7,$6D,$06,$B5,$20,$EF,$23,$47,$0C,$51,$55,$C8
       .byte $FE,$F4,$58,$C4,$3F,$20,$A7,$67,$38,$B0,$76,$E2,$C4,$D8,$05,$63
       .byte $F8,$3C,$58,$3B,$2D,$22,$CC,$88,$B3,$71,$8F,$1D,$80,$0A,$87,$BD
       .byte $A1,$59,$23,$E9,$70,$E2,$D3,$EC,$46,$68,$80,$42,$39,$EA,$FF,$FF

LFFEE: .byte $47,$43,$43,$28,$43,$29 ; 'GCC(C)'
       .byte $31,$39,$38,$34,$2D,$F7 ; '1984-'

LFFFA: .byte $00,$F0 ; system vector - nmi
LFFFC: .byte $84,$F8 ; system vector - reset
LFFFE: .byte $AA,$FA ; system vector - irq

