;--------------------------------------------------------- ;Atari 5200 4-Port BIOS Disassembly ; ;Disassembled and commented by Dan Boris 4/2002 ;----------------------------------------------------------- ;IRQ FC00: 6C 00 02 jmp ($0200) ;Jump to Immediate IRQ Vector ;Default Immediate IRQ FC03: 48 pha ;Save A FC04: A9 20 lda #$20 ; FC06: 2C 0E E8 bit IRQST ;Check IRQ source FC09: D0 0D bne $FC18 ;Branch if not serial input interrupt FC0B: A9 DF lda #$DF ; FC0D: 8D 0E E8 sta IRQEN ;Clear interrupt FC10: A5 00 lda $00 ;Get serial enable shadow FC12: 8D 0E E8 sta IRQEN ; FC15: 6C 10 02 jmp ($0210) ;Jump to serial input interrupt vector FC18: 10 6E bpl $FC88 ;Branch on Break IRQ FC1A: 50 79 bvc $FC95 ;Branch on Keyboard interrupt ;serial output data needed interrupt FC1C: A9 10 lda #$10 ; FC1E: 2D 0E E8 and $E80E ;Check for serial output interrupt FC21: D0 0D bne $FC30 ;Branch if no interrupt FC23: A9 EF lda #$EF ; FC25: 8D 0E E8 sta $E80E ;Clear interrupt FC28: A5 00 lda $00 ; FC2A: 8D 0E E8 sta $E80E ;Set IRQ enable from shadow FC2D: 6C 12 02 jmp ($0212) ;Jump to serial output interrupt vector ;serial output transmission done interrupt FC30: A9 08 lda #$08 ; FC32: 25 00 and $00 ;Check if serial output transmission done IRQ is enabled FC34: F0 12 beq $FC48 ;Branch if not enabled FC36: 2D 0E E8 and $E80E ;Check for serial output transmission IRQ FC39: D0 0D bne $FC48 ;Branch if no interrupt FC3B: A9 F7 lda #$F7 ; FC3D: 8D 0E E8 sta $E80E ;Clear interrupt FC40: A5 00 lda $00 ; FC42: 8D 0E E8 sta $E80E ;Set IRQ enable from shadow FC45: 6C 14 02 jmp ($0214) ;Jump to Serial output transmission done IRQ vector ;Timer 1 IRQ FC48: AD 0E E8 lda $E80E ; FC4B: 6A ror a ;Check bit 0 FC4C: B0 0D bcs $FC5B ;Branch if no interrupt FC4E: A9 FE lda #$FE ; FC50: 8D 0E E8 sta $E80E ;Clear interrupt FC53: A5 00 lda $00 ; FC55: 8D 0E E8 sta $E80E ;Set IRQ enable from shadow FC58: 6C 16 02 jmp ($0216) ;Jump to timer 1 IRQ Vector ;Timer 2 IRQ FC5B: 6A ror a ;Check bit 1 FC5C: B0 0D bcs $FC6B ;Branch if no interrupt FC5E: A9 FD lda #$FD ; FC60: 8D 0E E8 sta $E80E ;Clear interrupt FC63: A5 00 lda $00 ; FC65: 8D 0E E8 sta $E80E ;Set IRQ enable from shadow FC68: 6C 18 02 jmp ($0218) ;Jump to timer 2 IRQ Vector ;Timer 4 IRQ FC6B: 6A ror a ;Check bit 2 FC6C: B0 0D bcs $FC7B ;Branch if no interrupt FC6E: A9 FB lda #$FB ; FC70: 8D 0E E8 sta $E80E ;Clear interrupt FC73: A5 00 lda $00 ; FC75: 8D 0E E8 sta $E80E ;Set IRQ enable from shadow FC78: 6C 1A 02 jmp ($021A) ;Jump to timer 4 IRQ Vector FC7B: 8A txa ; FC7C: 48 pha ;Save X FC7D: BA tsx ;Get stack pointer FC7E: BD 03 01 lda $0103,x ;Get status register that was pushed on stack FC81: 29 10 and #$10 ;Check for BRK flag FC83: F0 2F beq $FCB4 ;Branch if not set FC85: 6C 0E 02 jmp ($020E) ;Jump to BRK interrupt vector ;Break IRQ FC88: A9 7F lda #$7F ; FC8A: 8D 0E E8 sta $E80E ;Clear IRQ FC8D: A5 00 lda $00 ; FC8F: 8D 0E E8 sta $E80E ;Set IRQEN from shadow FC92: 6C 0C 02 jmp ($020C) ;Jump to Break IRQ vector ;Keyboard Interrupt FC95: A9 BF lda #$BF ; FC97: 8D 0E E8 sta $E80E ;Clear IRQ FC9A: A5 00 lda $00 ; FC9C: 8D 0E E8 sta $E80E ;Set IRQEN from shadow FC9F: 6C 08 02 jmp ($0208) ;Jump to Keyboard IRQ vector ;NMI FCA2: 2C 0F D4 bit NMIST ;Test NMIST FCA5: 8D 0F D4 sta NMIRES ;Reset NMI FCA8: 30 05 bmi $FCAF ;Branch on DLI FCAA: 50 0B bvc $FCB7 ;Branch if not VBI FCAC: 6C 02 02 jmp ($0202) ;Jump to Immediate VBI vector FCAF: 6C 06 02 jmp ($0206) ;Jump to DLI vector FCB2: 68 pla ; FCB3: A8 tay ;Restore Y FCB4: 68 pla ; FCB5: AA tax ;Restore X FCB6: 68 pla ;Restore A FCB7: 40 rti ;Interrupt done ;Immediate VBI FCB8: 48 pha ;Save A FCB9: 8A txa ; FCBA: 48 pha ;Save X FCBB: 98 tya ; FCBC: 48 pha ;Save Y FCBD: E6 02 inc $02 ;Increment RTC low byte FCBF: D0 04 bne $FCC5 ;Branch if it didn't roll over FCC1: E6 04 inc $04 ;Increment Attract mode timer FCC3: E6 01 inc $01 ;Increment RTC high byte FCC5: A5 03 lda $03 ;Check critical code flag FCC7: D0 E9 bne $FCB2 ;Critical code, abbreviated VBI FCC9: A5 06 lda $06 ; FCCB: 8D 03 D4 sta $D403 ;Update DLISTH from shadow FCCE: A5 05 lda $05 ; FCD0: 8D 02 D4 sta $D402 ;Update DLISTL from shadow FCD3: A5 07 lda $07 ; FCD5: 8D 00 D4 sta $D400 ;Update DMACTL from shadow FCD8: A4 04 ldy $04 ;Get attract mode flag FCDA: 10 04 bpl $FCE0 ;Branch if flag not set FCDC: A0 80 ldy #$80 ;set flag FCDE: 84 04 sty $04 ;store it FCE0: A2 08 ldx #$08 ; FCE2: B5 08 lda $08,x ;copy color registers from shadows FCE4: C0 80 cpy #$80 ;Attrack mode flag? FCE6: 90 04 bcc $FCEC ;Branch if not FCE8: 45 01 eor $01 ;Alter color FCEA: 29 F6 and #$F6 ; FCEC: 9D 12 C0 sta $C012,x ;store in hardware register FCEF: CA dex ; FCF0: 10 F0 bpl $FCE2 ; FCF2: A2 07 ldx #$07 ; FCF4: BD 00 E8 lda $E800,x ;Get POT hardware register FCF7: 95 11 sta $11,x ;Write to shadow FCF9: CA dex ; FCFA: 10 F8 bpl $FCF4 ; FCFC: 8D 0B E8 sta $E80B ;Restart POT scan FCFF: 6C 04 02 jmp ($0204) ;Jump to Deferred VBI vector ;Keyboard IRQ FD02: 8A txa ; FD03: 48 pha ;Save X FD04: 98 tya ; FD05: 48 pha ;Save Y FD06: AD 09 E8 lda $E809 ;Get scan code FD09: 4A lsr a ;Shift down to drop low bit FD0A: 29 0F and #$0F ;Mask off the code FD0C: AA tax ;Move to index FD0D: BD 13 FD lda $FD13,x ;Lookup code FD10: 6C 0A 02 jmp ($020A) ;Keypad continuation vector ;Scan codes FD13: FF,0B,00,0A,0E,09,08,07,0D,06,05,04,0C,03,02,01 FD23: 78 sei ;Disable interrupts FD24: D8 cld ;Clear decimal mode FD25: A2 FF ldx #$FF ;Init stack pointer FD27: 9A txs ; FD28: AD FD BF lda $BFFD ;Diagnostic cart? FD2B: C9 FF cmp #$FF ; FD2D: D0 03 bne $FD32 ;Branch if it's not FD2F: 6C FE BF jmp ($BFFE) ;Jump to cart start vector ;---------------------------------------------------------------- ;Only in the 2-port FD32 AD 14 C0 LDA $C014 ;Read PAL register FD35 29 0E AND #$0E ;Mask off bits 1-3 FD37 D0 0F BNE $FD48 ;Jump if system is NTSC FD39 AD E7 BF LDA $BFE7 ;Read PAL byte in cart FD3C C9 15 CMP #$15 ;Be sure it's a PAL cart FD3E F0 08 BEQ $FD48 ; FD40 C9 30 CMP #$30 ; FD42 F0 04 BEQ $FD48 ; FD44 29 02 AND #$02 ; FD46 F0 FE BEQ $FD46 ;If it's not PAL cart hang system ;----------------------------------------------------------------- (FD48 on 2-port) FD32: E8 inx ;X=0 FD33: 8A txa ;Clear A FD34: 9D 00 E8 sta $E800,x ;Clear POKEY registers FD37: 9D 00 C0 sta $C000,x ;Clear GTIA registers FD3A: 9D 00 D4 sta $D400,x ;Clear ANTIC registers FD3D: 95 00 sta $00,x ;Clear zero page FD3F: E8 inx ; FD40: D0 F2 bne $FD34 ; FD42: A9 F8 lda #$F8 ; FD44: 8D 09 D4 sta CHBASE ;Set Character base to $F800 FD47: A2 0B ldx #$0B ; FD49: BD 95 FE lda $FE95,x ; FD4C: 9D 00 02 sta $0200,x ;Copy vectors to vector table FD4F: CA dex ; FD50: 10 F7 bpl $FD49 ; FD52: A9 3C lda #$3C ;Set pointer to $3C00 FD54: 85 12 sta $12 ; FD56: A9 00 lda #$00 ; FD58: 85 11 sta $11 ; FD5A: A2 0C ldx #$0C FD5C: A8 tay FD5D: 91 11 sta ($11),y FD5F: 88 dey FD60: D0 FB bne $FD5D FD62: C6 12 dec $12 FD64: CA dex FD65: 10 F6 bpl $FD5D ;Build display list FD67: A9 0D lda #$0D ;Antic mode 13 FD69: A2 4D ldx #$4D ; FD6B: 9D 07 20 sta $2007,x ;write to display list FD6E: CA dex ; FD6F: 10 FA bpl $FD6B ; FD71: A2 06 ldx #$06 ;Copy start of display list FD73: BD C8 FE lda $FEC8,x ; FD76: 9D 00 20 sta $2000,x ; FD79: CA dex ; FD7A: 10 F7 bpl $FD73 ; FD7C: A2 04 ldx #$04 ;Copy end of display list FD7E: BD CF FE lda $FECF,x ; FD81: 9D 55 20 sta $2055,x ; FD84: CA dex ; FD85: 10 F7 bpl $FD7E ; FD87: A9 00 lda #$00 ;Set Display List pointer to $2000 FD89: 85 05 sta $05 ; FD8B: A9 20 lda #$20 ; FD8D: 85 06 sta $06 ; FD8F: A9 22 lda #$22 ;Set DMACTL, dlist on/normal background FD91: 85 07 sta $07 ; ;Draw the Atari Logo Splash Screen ;Generate pointers to each line of display RAM FD93: A9 30 lda #$30 ;first line at address $3028 FD95: A8 tay ; FD96: A9 28 lda #$28 ; FD98: A2 36 ldx #$36 ;55 pointers FD9A: 9D 00 11 sta $1100,x ;Store low byte of pointer FD9D: 48 pha ; FD9E: 98 tya ; FD9F: 9D 00 10 sta $1000,x ;Store high byte of pointer FDA2: 68 pla ; FDA3: CA dex ; FDA4: 30 08 bmi $FDAE ;Done? FDA6: 18 clc ; FDA7: 69 28 adc #$28 ;Add 40 to low byte of pointer FDA9: 90 EF bcc $FD9A ;Overflow? FDAB: C8 iny ;Inc high byte of pointer FDAC: B0 EC bcs $FD9A ; ;Put Fuji Logo on screen FDAE: A2 13 ldx #$13 FDB0: 86 17 stx $17 FDB2: E8 inx FDB3: 86 18 stx $18 FDB5: A9 20 lda #$20 FDB7: 85 13 sta $13 FDB9: A9 01 lda #$01 FDBB: 85 15 sta $15 FDBD: A9 40 lda #$40 FDBF: 85 16 sta $16 FDC1: C6 13 dec $13 FDC3: 30 3E bmi $FE03 FDC5: A6 13 ldx $13 FDC7: BD E8 FE lda $FEE8,x FDCA: 85 14 sta $14 FDCC: BD 08 FF lda $FF08,x FDCF: AA tax FDD0: E4 14 cpx $14 FDD2: F0 1D beq $FDF1 FDD4: BD 00 11 lda $1100,x FDD7: 85 11 sta $11 FDD9: BD 00 10 lda $1000,x FDDC: 85 12 sta $12 FDDE: A4 17 ldy $17 FDE0: A5 15 lda $15 FDE2: 11 11 ora ($11),y FDE4: 91 11 sta ($11),y FDE6: A4 18 ldy $18 FDE8: A5 16 lda $16 FDEA: 11 11 ora ($11),y FDEC: 91 11 sta ($11),y FDEE: E8 inx FDEF: D0 DF bne $FDD0 FDF1: 06 15 asl $15 FDF3: 06 15 asl $15 FDF5: B0 06 bcs $FDFD FDF7: 46 16 lsr $16 FDF9: 46 16 lsr $16 FDFB: 90 C4 bcc $FDC1 FDFD: C6 17 dec $17 FDFF: E6 18 inc $18 FE01: B0 B6 bcs $FDB9 ;Put 'ATARI' on screen FE03: A9 11 lda #$11 ;Start ar $3911 in video memory FE05: 85 11 sta $11 ; FE07: A9 39 lda #$39 ; FE09: 85 12 sta $12 ; FE0B: A9 13 lda #$13 ; FE0D: 85 13 sta $13 ;Draw 20 lines FE0F: A9 00 lda #$00 ; FE11: 85 15 sta $15 ;Data pointer FE13: A9 01 lda #$01 FE15: A0 0A ldy #$0A FE17: 85 18 sta $18 FE19: A6 15 ldx $15 FE1B: E6 15 inc $15 FE1D: BD 28 FF lda $FF28,x FE20: F0 2A beq $FE4C FE22: AA tax FE23: 29 0F and #$0F FE25: 85 16 sta $16 FE27: 8A txa FE28: 4A lsr a FE29: 4A lsr a FE2A: 4A lsr a FE2B: 4A lsr a FE2C: AA tax FE2D: A5 18 lda $18 FE2F: 0A asl a FE30: 0A asl a FE31: 90 05 bcc $FE38 FE33: 91 11 sta ($11),y FE35: C8 iny FE36: A9 01 lda #$01 FE38: CA dex FE39: 10 F4 bpl $FE2F FE3B: A6 16 ldx $16 FE3D: 38 sec FE3E: 2A rol a FE3F: 0A asl a FE40: 90 05 bcc $FE47 FE42: 91 11 sta ($11),y FE44: C8 iny FE45: A9 01 lda #$01 FE47: CA dex FE48: 10 F3 bpl $FE3D FE4A: 30 CB bmi $FE17 FE4C: A5 18 lda $18 FE4E: 0A asl a FE4F: 0A asl a FE50: 90 FC bcc $FE4E FE52: 91 11 sta ($11),y FE54: A5 11 lda $11 ;Get low byte of memory pointer FE56: 18 clc ; FE57: 69 28 adc #$28 ;Add 40 to goto next line FE59: 85 11 sta $11 ; FE5B: 90 02 bcc $FE5F ;Overflow? FE5D: E6 12 inc $12 ;Inc high byte FE5F: C6 13 dec $13 ;Decrement line counter FE61: 10 B0 bpl $FE13 ;next loop FE63: A2 13 ldx #$13 ; FE65: BD D4 FE lda $FED4,x ;Read copywrite message FE68: 9D 94 3C sta $3C94,x ;Write to display memory FE6B: BD E8 BF lda $BFE8,x ;Read cart title from cartridge FE6E: 9D 80 3C sta $3C80,x ;Write to display memory FE71: CA dex ; FE72: 10 F1 bpl $FE65 ; FE74: AD FC BF lda $BFFC ;First digit of year FE77: 8D A0 3C sta $3CA0 ;Write to display memory FE7A: AD FD BF lda $BFFD ;Second digit of year FE7D: 8D A1 3C sta $3CA1 ;Write to display memory FE80: A9 0F lda #$0F ; FE82: 85 0D sta $0D ;Set color PF1 FE84: A9 C0 lda #$C0 ; FE86: 8D 0E D4 sta $D40E ;Enable DLI and VBI FE89: A9 02 lda #$02 ; FE8B: 8D 0F E8 sta $E80F ;Enable Keyboard scanning FE8E: E4 02 cpx $02 ; FE90: D0 FC bne $FE8E ;Wait FE92: 6C FE BF jmp ($BFFE) ;Jump to cart start ;Vector table FE95: 03,FC, ;Immediate IRQ B8,FC, ;Immediate VBI B2,FC, ;Deferred VBI A1,FE, ;DLI 02,FD, ;Keyboard IRQ B2,FC ;kepad continue vector ;DLI FEA1: 48 pha ;Save A FEA2: 8A txa ; FEA3: 48 pha ;Save X FEA4: 98 tya ; FEA5: 48 pha ;Save Y FEA6: A6 08 ldx $08 ;Get PM0 color FEA8: A0 72 ldy #$72 ; FEAA: E0 10 cpx #$10 FEAC: B0 02 bcs $FEB0 FEAE: A2 FE ldx #$FE ;Set initial PF0 color FEB0: 8E 0A D4 stx $D40A ;Wait for Sync FEB3: 8E 16 C0 stx $C016 ;SET PF0 color FEB6: CA dex ; FEB7: CA dex ;x = x - 2 FEB8: 88 dey ;loop 72 times FEB9: D0 EF bne $FEAA ; FEBB: E6 08 inc $08 FEBD: A0 10 ldy #$10 FEBF: C4 08 cpy $08 FEC1: 90 02 bcc $FEC5 FEC3: 84 08 sty $08 FEC5: 4C B2 FC jmp $FCB2 ;Start of display list ;24 blank lines, LMS $3000, Mode D + DLI FEC8: 70,70,70 4D,00,30,8D ;End of display list ;2 lines mode 7, JUMP $2000 FECF 07,07,41,00,20 ;Copyright message FED4: 63 6F 70 79 72 69 67 68 74 00 51 59 58 51 00 61 74 61 72 69 ;Data to build Fuji logo FEE8: 08,08,08,09,09,09,0A,0A FEF0: 0B 0B 0C 0D 0E 0F 10 11 FEF8: 12 14 16 19 1C 1F 36 36 FF00: 36 36 00 00 36 36 36 36 FF08: 00 00 00 00 00 00 01 01 FF10: 01 02 02 03 03 04 05 06 FF18: 07 08 09 0A 0B 0C 0E 10 FF20: 13 16 00 00 00 00 00 00 'Data for 'ATARI' on splash screen FF28: 92 4E 42 97 52 00 84 3E FF30: 34 79 42 00 76 2E 26 5B FF38: 32 00 76 82 86 53 43 22 FF40: 00 63 03 72 73 03 42 63 FF48: 12 00 62 22 72 72 22 42 FF50: 72 12 00 62 22 72 72 22 FF58: 42 72 12 00 52 42 62 62 FF60: 42 32 62 22 00 52 42 62 FF68: 62 42 32 52 32 00 52 42 FF70: 62 62 42 32 06 42 00 43 FF78: 43 52 53 43 22 05 52 00 FF80: 42 62 52 52 62 22 05 52 FF88: 00 42 62 52 52 62 22 42 FF90: 42 00 3E 42 4E 12 42 42 FF98: 00 3E 42 4E 12 52 32 00 FFA0: 3E 42 4E 12 52 32 00 23 FFA8: 83 32 33 83 02 62 22 00 FFB0: 22 A2 32 32 A2 02 62 22 FFB8: 00 22 A2 32 32 A2 02 72 FFC0: 12 00 22 A2 32 32 A2 02 FFC8: 72 12 00 00 00 00 00 00 FFD0: 00 00 00 00 00 00 00 00 FFD8: 00 00 00 00 00 00 00 00 FFE0: 00 00 00 00 00 00 00 00 FFE8: 00 00 00 00 00 00 00 00 FFF0: 00 ;(4-Port) FFF1: 52 4A 5A 20 31 39 38 32 ;"RJZ 1982" ; Rob Zydbell, author of the bios ; ;(2-Port) FFF1: 00 00 00 00 00 00 00 00 FFF9: 00 ;Vectors ;NMI FFFA: A2 FC ;RESET FFFB: 23 FD ;IRQ FFFE: 00 FC