mads 2.1.0 Source: source/SuperKernel/main.xasm 1 ; Altirra - Atari 800/800XL/5200 emulator 2 ; 5200 OS ROM replacement 3 ; Copyright (C) 2008-2010 Avery Lee 4 ; 5 ; Copying and distribution of this file, with or without modification, 6 ; are permitted in any medium without royalty provided the copyright 7 ; notice and this notice are preserved. This file is offered as-is, 8 ; without any warranty. 9 10 opt h-o+f+ 11 12 icl 'includes.xasm' Source: source/SuperKernel/includes.xasm 1 ; Altirra - Atari 800/800XL/5200 emulator 2 ; 5200 OS ROM replacement 3 ; Copyright (C) 2008-2016 Avery Lee 4 ; 5 ; Copying and distribution of this file, with or without modification, 6 ; are permitted in any medium without royalty provided the copyright 7 ; notice and this notice are preserved. This file is offered as-is, 8 ; without any warranty. 9 10 = C010 trig0 equ $c010 11 = C011 trig1 equ $c011 12 = C012 trig2 equ $c012 13 = C012 colpm0 equ $c012 14 = C013 trig3 equ $c013 15 = C013 colpm1 equ $c013 16 = C014 colpm2 equ $c014 17 = C015 colpm3 equ $c015 18 = C016 colpf0 equ $c016 19 = C017 colpf1 equ $c017 20 = C018 colpf2 equ $c018 21 = C019 colpf3 equ $c019 22 = C01A colbk equ $c01a 23 = C01B prior equ $c01b 24 = C01F consol equ $c01f 25 = E800 pot0 equ $e800 26 = E800 audf1 equ $e800 27 = E801 pot1 equ $e801 28 = E801 audc1 equ $e801 29 = E802 pot2 equ $e802 30 = E802 audf2 equ $e802 31 = E803 pot3 equ $e803 32 = E803 audc2 equ $e803 33 = E804 pot4 equ $e804 34 = E804 audf3 equ $e804 35 = E805 pot5 equ $e805 36 = E805 audc3 equ $e805 37 = E806 pot6 equ $e806 38 = E806 audf4 equ $e806 39 = E807 pot7 equ $e807 40 = E807 audc4 equ $e807 41 = E808 audctl equ $e808 42 = E809 kbcode equ $e809 43 = E80A skres equ $e80a 44 = E80B potgo equ $e80b 45 = E80D serin equ $e80d 46 = E80D serout equ $e80d 47 = E80E irqen equ $e80e 48 = E80E irqst equ $e80e 49 = E80F skctl equ $e80f 50 = D400 dmactl equ $d400 51 = D401 chactl equ $d401 52 = D402 dlistl equ $d402 53 = D403 dlisth equ $d403 54 = D404 hscrol equ $d404 55 = D405 vscrol equ $d405 56 = D409 chbase equ $d409 57 = D40A wsync equ $d40a 58 = D40E nmien equ $d40e 59 = D40F nmist equ $d40f 60 = D40F nmires equ $d40f 61 62 = 0000 pokmsk equ $00 63 = 0001 rtclok equ $01 64 ; equ $02 65 = 0003 critic equ $03 66 = 0004 atract equ $04 67 = 0005 sdlstl equ $05 68 = 0006 sdlsth equ $06 69 = 0007 sdmctl equ $07 70 = 0008 pcolr0 equ $08 71 = 0009 pcolr1 equ $09 72 = 000A pcolr2 equ $0a 73 = 000B pcolr3 equ $0b 74 = 000C color0 equ $0c 75 = 000D color1 equ $0d 76 = 000E color2 equ $0e 77 = 000F color3 equ $0f 78 = 0010 color4 equ $10 79 = 0011 paddl0 equ $11 80 = 0012 paddl1 equ $12 81 = 0013 paddl2 equ $13 82 = 0014 paddl3 equ $14 83 = 0015 paddl4 equ $15 84 = 0016 paddl5 equ $16 85 = 0017 paddl6 equ $17 86 = 0018 paddl7 equ $18 87 88 = 0200 vimirq equ $0200 ;IRQ immediate vector 89 = 0202 vvblki equ $0202 ;VBI immediate vector 90 = 0204 vvblkd equ $0204 ;VBI deferred vector 91 = 0206 vdslst equ $0206 ;display list vector 92 = 0208 vkybdi equ $0208 ;keyboard immediate vector 93 = 020A vkybdf equ $020a ;keyboard deferred vector 94 = 020C vtrigr equ $020c ;soft-trigger vector (BREAK key) 95 = 020E vbrkop equ $020e ;BRK opcode vector 96 = 0210 vserin equ $0210 ;serial input ready vector 97 = 0212 vseror equ $0212 ;serial output ready vector 98 = 0214 vseroc equ $0214 ;serial output complete vector 99 = 0216 vtimr1 equ $0216 ;POKEY timer #1 vector 100 = 0218 vtimr2 equ $0218 ;POKEY timer #2 vector 101 = 021A vtimr4 equ $021a ;POKEY timer #4 vector 102 103 = 021E jveck equ $021e 13 14 org $f800 15 F800 00 00 00 00 00 00 + ins 'atarifont.bin',$0,$400 16 17 ;========================================================================= 18 FC00 .proc irq 19 FC00 6C 00 02 jmp (vimirq) 20 .endp 21 22 ;========================================================================= 23 ;Must be at $FC03 for Montezuma's Revenge to work. 24 FC03 org $fc03 25 FC03 .proc sysirq 26 FC03 48 pha 27 28 ;We test interrupts in this order: 29 ; 20 -> VSERIN 30 ; 80 -> VTRIGR 31 ; 40 -> VKYBDI 32 ; 10 -> VSEROR 33 ; 08 -> VSEROC 34 ; 01 -> VTIMR1 35 ; 02 -> VTIMR2 36 ; 04 -> VTIMR4 37 ; VBRKOP 38 ; 39 ;Note that there is a complication with VSEROC, since it is not 40 ;masked by POKEY. We must only dispatch it if it is enabled in 41 ;POKMSK. 42 FC04 A9 20 lda #$20 43 FC06 2C 0E E8 bit irqst 44 FC09 D0 0D bne not_serin 45 FC0B 45 00 eor pokmsk 46 FC0D 8D 0E E8 sta irqen 47 FC10 A5 00 lda pokmsk 48 FC12 8D 0E E8 sta irqen 49 FC15 6C 10 02 jmp (vserin) 50 FC18 not_serin: 51 FC18 30 0F bmi not_trigr 52 FC1A A9 80 lda #$80 53 FC1C 45 00 eor pokmsk 54 FC1E 8D 0E E8 sta irqen 55 FC21 A5 00 lda pokmsk 56 FC23 8D 0E E8 sta irqen 57 FC26 6C 0C 02 jmp (vtrigr) 58 FC29 not_trigr: 59 FC29 70 0F bvs not_kybd 60 FC2B A9 40 lda #$40 61 FC2D 45 00 eor pokmsk 62 FC2F 8D 0E E8 sta irqen 63 FC32 A5 00 lda pokmsk 64 FC34 8D 0E E8 sta irqen 65 FC37 6C 08 02 jmp (vkybdi) 66 FC3A not_kybd: 67 FC3A 6A ror 68 FC3B 2C 0E E8 bit irqen 69 FC3E F0 0D beq not_seror 70 FC40 45 00 eor pokmsk 71 FC42 8D 0E E8 sta irqen 72 FC45 A5 00 lda pokmsk 73 FC47 8D 0E E8 sta irqen 74 FC4A 6C 12 02 jmp (vseror) 75 FC4D not_seror: 76 FC4D 6A ror 77 FC4E 24 00 bit pokmsk 78 FC50 F0 12 beq not_seroc 79 FC52 2C 0E E8 bit irqen 80 FC55 D0 0D bne not_seroc 81 FC57 45 00 eor pokmsk 82 FC59 8D 0E E8 sta irqen 83 FC5C A5 00 lda pokmsk 84 FC5E 8D 0E E8 sta irqen 85 FC61 6C 14 02 jmp (vseroc) 86 FC64 not_seroc: 87 FC64 A9 01 lda #$01 88 FC66 2C 0E E8 bit irqst 89 FC69 D0 0D bne not_timr1 90 FC6B 45 00 eor pokmsk 91 FC6D 8D 0E E8 sta irqen 92 FC70 A5 00 lda pokmsk 93 FC72 8D 0E E8 sta irqen 94 FC75 6C 16 02 jmp (vtimr1) 95 FC78 not_timr1: 96 FC78 2A rol 97 FC79 2C 0E E8 bit irqst 98 FC7C D0 0D bne not_timr2 99 FC7E 45 00 eor pokmsk 100 FC80 8D 0E E8 sta irqen 101 FC83 A5 00 lda pokmsk 102 FC85 8D 0E E8 sta irqen 103 FC88 6C 18 02 jmp (vtimr2) 104 FC8B not_timr2: 105 FC8B 2A rol 106 FC8C 2C 0E E8 bit irqst 107 FC8F D0 0D bne not_timr4 108 FC91 45 00 eor pokmsk 109 FC93 8D 0E E8 sta irqen 110 FC96 A5 00 lda pokmsk 111 FC98 8D 0E E8 sta irqen 112 FC9B 6C 1A 02 jmp (vtimr4) 113 FC9E not_timr4: 114 FC9E 8A txa 115 FC9F 48 pha 116 FCA0 BA tsx 117 FCA1 BD 01 01 lda $0101,x 118 FCA4 29 10 and #$10 119 FCA6 D0 03 bne wtf 120 FCA8 6C 0E 02 jmp (vbrkop) 121 FCAB wtf: 122 FCAB 68 pla 123 FCAC AA tax 124 FCAD 68 pla 125 FCAE 40 rti 126 .endp 127 128 ;========================================================================= 129 ;Must be at $FCB2 for Congo Bongo to work (grrr... damn SEGA) 130 FCAF org $fcb2 131 FCB2 .proc xitvbl 132 FCB2 68 pla 133 FCB3 A8 tay 134 FCB4 68 pla 135 FCB5 AA tax 136 FCB6 68 pla 137 FCB7 40 rti 138 .endp 139 140 ;========================================================================= 141 ;Must be at $FCB8 for Montezuma's Revenge to work. 142 FCB8 org $fcb8 143 FCB8 .proc sysvbl 144 FCB8 48 pha 145 FCB9 8A txa 146 FCBA 48 pha 147 FCBB 98 tya 148 FCBC 48 pha 149 150 FCBD E6 02 inc rtclok+1 151 FCBF D0 08 bne rtnocarry 152 FCC1 E6 01 inc rtclok 153 FCC3 A5 04 lda atract 154 FCC5 30 02 bmi rtnocarry 155 FCC7 E6 04 inc atract 156 FCC9 rtnocarry: 157 158 FCC9 A5 03 lda critic 159 FCCB D0 E5 bne xitvbl 160 161 FCCD A5 05 8D 02 D4 mva sdlstl dlistl 162 FCD2 A5 06 8D 03 D4 mva sdlsth dlisth 163 FCD7 A5 07 8D 00 D4 mva sdmctl dmactl 164 165 ;copy and attract colors 166 FCDC A0 00 ldy #0 167 FCDE 24 04 bit atract 168 FCE0 10 02 A4 01 spl:ldy rtclok 169 170 FCE4 A2 08 ldx #8 171 FCE6 colorloop: 172 FCE6 98 tya 173 FCE7 55 08 eor pcolr0,x 174 FCE9 9D 12 C0 sta colpm0,x 175 FCEC CA dex 176 FCED 10 F7 bpl colorloop 177 178 ;update pots 179 FCEF A2 07 ldx #7 180 FCF1 potloop: 181 FCF1 BD 00 E8 lda pot0,x 182 FCF4 95 11 sta paddl0,x 183 FCF6 CA dex 184 FCF7 10 F8 bpl potloop 185 FCF9 8D 0B E8 sta potgo 186 187 ;run deferred 188 FCFC 6C 04 02 jmp (vvblkd) 189 .endp 190 191 ;========================================================================= 192 ; System keyboard handler 193 ; 194 ; MUST be at $FD02 for Blueprint to work. 195 ; 196 FCFF org $fd02 197 FD02 .proc syskbd 198 FD02 8A txa 199 FD03 48 pha 200 FD04 98 tya 201 FD05 48 pha 202 FD06 AD 09 E8 lda kbcode 203 FD09 4A lsr 204 FD0A 29 0F and #$0f 205 FD0C AA tax 206 FD0D BD 13 FD lda keytable,x 207 FD10 6C 0A 02 jmp (vkybdf) 208 .endp 209 210 ;========================================================================= 211 ;Keyboard translation table 212 ; 213 ;MUST be at $FD13 for Congo Bongo to work. 214 ; 215 FD13 org $fd13 216 FD13 keytable: 217 FD13 FF 0B 00 0A 0E 09 + dta $ff,$0b,$00,$0a,$0e,$09,$08,$07,$0d,$06,$05,$04,$0c,$03,$02,$01 218 219 ;========================================================================= 220 ; NMI handler 221 ; 222 FD23 .proc nmi 223 FD23 2C 0F D4 bit nmist 224 225 ;This is pretty useless, but the stock 5200 OS does it, and it 226 ;affects DLI timing -- in particular, it can cause DLIs ported 227 ;from the 400/800 OS to fail. 228 FD26 8D 0F D4 sta nmires 229 230 FD29 10 03 6C 06 02 spl:jmp (vdslst) 231 FD2E 6C 02 02 jmp (vvblki) 232 .endp 233 234 ;========================================================================= 235 ; RESET handler 236 ; 237 FD31 .proc reset 238 ;initialize CPU 239 FD31 78 sei 240 FD32 D8 cld 241 FD33 A2 FF ldx #$ff 242 FD35 9A txs 243 244 ;check for diagnostic cartridge 245 FD36 AD FD BF lda $bffd 246 FD39 C9 FF cmp #$ff 247 FD3B D0 03 bne notdiag 248 FD3D 6C FE BF jmp ($bffe) 249 FD40 notdiag: 250 251 ;zero hardware registers and page zero 252 FD40 A2 00 ldx #0 253 FD42 A9 00 lda #0 254 FD44 zeroloop: 255 FD44 95 00 sta $00,x 256 FD46 9D 00 C0 sta $c000,x 257 FD49 9D 00 D4 sta $d400,x 258 FD4C 9D 00 E8 sta $e800,x 259 FD4F E8 inx 260 FD50 D0 F2 bne zeroloop 261 262 ;init hardware display 263 FD52 A9 F8 8D 09 D4 mva #$f8 chbase 264 265 ;initialize vectors 266 FD57 A2 0B ldx #$0b 267 FD59 vecloop: 268 FD59 BD 95 FE lda irqtable,x 269 FD5C 9D 00 02 sta $0200,x 270 FD5F CA dex 271 FD60 10 F7 bpl vecloop 272 273 ;set up default display 274 FD62 A2 4F ldx #79 275 FD64 pfcopyloop: 276 FD64 BD CD FD lda playfield,x 277 FD67 9D 00 10 sta $1000,x 278 FD6A CA dex 279 FD6B 10 F7 bpl pfcopyloop 280 281 FD6D A2 13 ldx #19 282 FD6F namecopyloop: 283 FD6F BD E8 BF lda $bfe8,x 284 FD72 9D 50 10 sta $1050,x 285 FD75 CA dex 286 FD76 10 F7 bpl namecopyloop 287 288 ;PF0 is the flashing color, while PF1 is white. PF2 and PF3 are black. 289 ;In fact, PF3 must be black in order for the Defender title to appear 290 ;properly. 291 FD78 A9 10 85 0C mva #$10 color0 292 FD7C A9 0F 85 0D mva #$0F color1 293 FD80 A9 00 85 0E mva #$00 color2 294 FD84 A9 00 85 0F mva #$00 color3 295 FD88 A9 00 85 10 mva #$00 color4 296 FD8C A9 04 8D 1B C0 mva #$04 prior 297 298 ;move display list; must be at $2000 for Miniature Golf to work 299 FD91 A2 0A ldx #playfield-dlist-1 300 FD93 dlcopy: 301 FD93 BD C2 FD lda dlist,x 302 FD96 9D 00 20 sta $2000,x 303 FD99 CA dex 304 FD9A 10 F7 bpl dlcopy 305 306 FD9C A9 22 85 07 mva #$22 sdmctl 307 FDA0 A9 C0 8D 0E D4 mva #$c0 nmien 308 FDA5 A9 00 85 05 A9 20 + mwa #$2000 sdlstl 309 310 ;enable key input 311 FDAD A9 02 8D 0F E8 mva #$02 skctl 312 FDB2 A9 C0 lda #$c0 313 FDB4 85 00 sta pokmsk 314 FDB6 8D 0E E8 sta irqen 315 316 ;wait two seconds (four is too long) 317 FDB9 A9 78 lda #120 318 FDBB C5 02 D0 FC cmp:rne rtclok+1 319 320 ;invoke cartridge 321 FDBF 6C FE BF jmp ($bffe) 322 323 FDC2 dlist: 324 FDC2 70 dta $70 325 FDC3 70 dta $70 326 FDC4 70 dta $70 327 FDC5 42 00 10 dta $42,a($1000) 328 FDC8 82 dta $82 329 FDC9 07 dta $07 330 FDCA 41 C2 FD dta $41,a(dlist) 331 332 FDCD playfield: 333 ; 0123456789012345678901234567890123456789 334 FDCD 21 6C 74 69 72 72 + dta d"Altirra 5200 ROM Kernel " 335 FDF5 2E 6F 77 00 70 6C + dta d"Now playing: " 336 .endp 337 338 ;========================================================================= 339 ; Default IRQ table 340 ; 341 ; MUST be at $FE95 for Pitfall! to work. 342 ; 343 FE1D org $fe95 344 FE95 irqtable: 345 FE95 03 FC dta a(sysirq) ;vimirq = $fc03 346 FE97 B8 FC dta a(sysvbl) ;vvblki = $fcb8 347 FE99 B2 FC dta a(xitvbl) ;vvblkd 348 FE9B A1 FE dta a(sysdli) ;vdslst = $fea1 349 FE9D 02 FD dta a(syskbd) ;vkybdi 350 FE9F B2 FC dta a(xitvbl) ;vkybdf 351 352 ;========================================================================= 353 ;Must be at $FEA1 for A.E. 354 FEA1 org $fea1 355 FEA1 .proc sysdli 356 FEA1 48 pha 357 358 ;cycle color PF0, but avoid going through grayscales 359 FEA2 E6 0C inc color0 360 FEA4 D0 04 bne noroll 361 FEA6 A9 10 lda #$10 362 FEA8 85 0C sta color0 363 FEAA noroll: 364 FEAA 68 pla 365 FEAB 40 rti 366 .endp 367 368 ;========================================================================= 369 370 FEAC org $fffa 371 FFFA 23 FD dta a(nmi) 372 FFFC 31 FD dta a(reset) 373 FFFE 00 FC dta a(irq)