09 .OPT NO LIST›10 ; SAVE #D1:INTERUPT.M65›20 ;›30 ;›40 ; LOAD #D1:INIT.M65›50 ;›60 LIST›70 .PAGE "Interrupt Handler"›80 *= $C000›49152 OSROM .WORD $9211 rom c/sum›49154 .BYTE $10 day bcd rev date›49155 .BYTE $05 month "›49156 .BYTE $83 year "›49157 .BYTE 0 Option byte›49158 .BYTE "BB" Part num. Alpha›49160 .BYTE $00 ; " " bcd›49161 .BYTE $00 ; " " "›49162 .BYTE $01 ; " " "›49163 .BYTE 2 Rev num›49164 INTINI LDA #$40 Interrupt›49166 STA NMIEN handler init›49169 LDA TRIG3›49172 STA GINTLK›49175 RTS›49176 NMI BIT NMIST Check for dli›49179 BPL ?NODLI Skip if not›49181 JMP (VDSLST) else exec dli›49184 ?NODLI CLD Must be Vbi›49185 PHA cuz Reset doesn't›49186 TXA come here.›49187 PHA›49188 TYA When pulled:›49189 PHA y,x,a,p,rti›49190 STA NMIRES clear nmist›49193 JMP (VVBLKI) to dosysvbv›49196 IRQ CLD Default irq›49197 JMP (VIMIRQ) handler follows›49200 ?REGIRQ PHA right here›49201 LDA IRQST›49204 AND #$20 Serial in ready?›49206 BNE ?NOSERIN Go if not›49208 LDA #$DF Process Serin›49210 STA IRQEN Clear int›49213 LDA POKMSK Re-enable all›49215 STA IRQEN as set by user›49218 JMP (VSERIN) jmp xserin in sio›49221 ?NOSERIN TXA Save x on stack›49222 PHA›49223 LDA $D1FF Check hardware›49226 AND PDMSK select for PDev›49229 BEQ ?NOPDEV int. Go if not›49231 JMP (VPIRQ) Process PDevice›49234 ?NOPDEV LDX #6›49236 ?WHATIRQ LDA ?IRQTYP,X›49239 CPX #5 Seroc?›49241 BNE ?NOSEROC Skip if not›49243 AND POKMSK also skip if›49245 BEQ ?NXTTYP not enabled›49247 ?NOSEROC BIT IRQST›49250 BEQ ?GOTTYP›49252 ?NXTTYP DEX No match, check›49253 BPL ?WHATIRQ next›49255 JMP ?PIA? Go check PIA›49258 ?GOTTYP EOR #$FF Clear int›49260 STA IRQEN›49263 LDA POKMSK Reset irqen as›49265 STA IRQEN set by user›49268 CPX #0 Branch if not›49270 BNE ?XIRQHDLR the Break key›49272 LDA KEYDIS or is and keybd›49275 BNE ?PIA? is disabled›49277 ?XIRQHDLR LDA ?IRQOFF,X›49280 TAX jump to irq›49281 LDA VDSLST,X handler›49284 STA JVECK›49287 LDA VDSLST+1,X›49290 STA JVECK+1›49293 PLA›49294 TAX›49295 JMP (JVECK)›49298 ?XBRKKY LDA #0 Break Key Irq›49300 STA BRKKEY Clear flag›49302 STA SSFLAG Kill freeze›49305 STA CRSINH Restore cursor›49308 STA ATRACT Kill Atract›49310 PLA Restore accum.›49311 RTI›49312 ?PIA? PLA Check for PIA›49313 TAX interrupt›49314 BIT PACTL Branch if not›49317 BPL ?NOPORTA vprced›49319 LDA PORTA Else clear int›49322 JMP (VPRCED) and process›49325 ?NOPORTA BIT PBCTL Check for›49328 BPL ?BRKOPCODE Vinter›49330 LDA PORTB Clear int›49333 JMP (VINTER) and procss›49336 ?BRKOPCODE PLA›49337 STA JVECK Save a temporary›49340 PLA Pull flags›49341 PHA and re-save›49342 AND #$10 Test for Brk opcode›49344 BEQ ?NOFIND go if not›49346 LDA JVECK Restore stack›49349 PHA and›49350 JMP (VBREAK) process Brk›49353 ?NOFIND LDA JVECK no id, fix›49356 PHA stack and exit›49357 ?PLARTI PLA›49358 RTI RTI›49359 ?IRQTYP .BYTE $80 Break key›49360 .BYTE $40 Keyboard›49361 .BYTE $04 Timer4›49362 .BYTE $02 Timer2›49363 .BYTE $01 Timer1›49364 .BYTE $08 SerOc›49365 .BYTE $10 SerOr›49366 .BYTE $20 SerIn›49367 ?IRQOFF .BYTE 54 Brkkey Offsets›49368 .BYTE 8 Vkybd from›49369 .BYTE 20 Vtimr3 vdslst›49370 .BYTE 18 Vtimr2›49371 .BYTE 16 Vtimr1›49372 .BYTE 14 Vseroc›49373 .BYTE 12 Vseror›49374 .BYTE 10 Vserin›49375 LOCKUP JMP LOCKUP›49378 DOSYSBV INC RTCLOK+2 update›49380 BNE ?ATRACT? clok and›49382 INC ATRACT atract (starts›49384 INC RTCLOK+1 ;256/60*128 "›49386 BNE ?ATRACT? after keypress›49388 INC RTCLOK i.e. 9'06"›49390 ?ATRACT? LDA #$FE process›49392 LDX #0 atract mode›49394 LDY ATRACT skip if less›49396 BPL ?XATRACT than 128›49398 STA ATRACT execute atract›49400 LDX RTCLOK+1 random value›49402 LDA #$F6 half luminance›49404 ?XATRACT STA DRKMSK›49406 STX COLRSH›49408 LDA COLOR1›49411 EOR COLRSH reverse hue›49413 AND DRKMSK cut luminance›49415 STA COLPF1 set it›49418 LDX #0 Process timer1›49420 JSR ?DECTMR used by sio›49423 BNE ?CRITIC? Not expired›49425 JSR ?XTIMR1 handle if due›49428 ?CRITIC? LDA CRITIC skip 2nd›49430 BNE ?EXITEARLY stage if›49432 TSX critic or if›49433 LDA $0104,X interrupt flag›49436 AND #4 set at entry›49438 BEQ ?STAGE2›49440 ?EXITEARLY JMP DOXITBV›49443 ?STAGE2 LDA TRIG3 Cartridge›49446 CMP GINTLK changed?›49449 BNE LOCKUP Yes, quit.›49451 LDA PENV Update light pen›49454 STA LPENV shadow regs›49457 LDA PENH›49460 STA LPENH›49463 LDA SDLSTH update antic›49466 STA DLISTH location›49469 LDA SDLSTL›49472 STA DLISTL›49475 LDA SDMCTL›49478 STA DMACTL›49481 LDA GPRIOR also gtia›49484 STA PRIOR›49487 LDA VSFLAG Time to scroll?›49490 BEQ ?CLRCONSOL Not yet›49492 DEC VSFLAG Scroll screen›49495 LDA #8›49497 SEC Put number of›49498 SBC VSFLAG scan lines to›49501 AND #7 fine scroll into›49503 STA VSCROL Antic›49506 ?CLRCONSOL LDX #8›49508 STX CONSOL clear consol›49511 ?PMATRACT CLI Atract mode for›49512 LDA PCOLR0,X player-missiles›49515 EOR COLRSH›49517 AND DRKMSK›49519 STA COLPM0,X›49522 DEX›49523 BPL ?PMATRACT›49525 LDA CHBAS Update charset›49528 STA CHBASE location›49531 LDA CHACT and display›49534 STA CHACTL mode›49537 LDX #2›49539 JSR ?DECTMR Process Cdtmv2›49542 BNE ?OTHERTMR? Not yet›49544 JSR ?XTIMR2 execute cdtmv2›49547 ?OTHERTMR? LDX #2 process›49549 ?TMRLOOP INX timers 3-5›49550 INX›49551 LDA CDTMV1,X›49554 ORA CDTMV1+1,X›49557 BEQ ?NXTTIMR›49559 JSR ?DECTMR›49562 STA CDTMA1,X›49565 ?NXTTIMR CPX #8›49567 BNE ?TMRLOOP›49569 LDA SKSTAT Last key still›49572 AND #4 pressed?›49574 BEQ ?KEYTIM Yes›49576 LDA KEYDEL delay expired?›49579 BEQ ?KEYTIM›49581 DEC KEYDEL Else dec it›49584 ?KEYTIM LDA SRTIMR Now 0?›49587 BEQ ?XSTICK1 Skip if so›49589 LDA SKSTAT Last key still?›49592 AND #4›49594 BNE ?KEYREPEXIT No skip›49596 DEC SRTIMR Time now 1›49599 BNE ?XSTICK1 no, skip›49601 LDA KEYDIS Keyboard off? *›49604 BNE ?XSTICK1 Yes, skip *›49606 LDA KEYREP Reset timer›49609 STA SRTIMR›49612 LDA KBCODE›49615 CMP #159 Control 1?›49617 BEQ ?XSTICK1 yes, skip›49619 CMP #131 Control f1?›49621 BEQ ?XSTICK1 yes, ignore›49623 CMP #132 Control f2?›49625 BEQ ?XSTICK1 ignore›49627 CMP #148 Control f4?›49629 BEQ ?XSTICK1 ignore›49631 AND #$3F Mask Shft/Ctrl›49633 CMP #17 Help?›49635 BEQ ?XSTICK1 ignore›49637 LDA KBCODE repeat key›49640 STA CH press›49643 JMP ?XSTICK1›49646 ?KEYREPEXIT LDA #0 Reset timer›49648 STA SRTIMR›49651 ?XSTICK1 LDA PORTA›49654 LSR A update stick›49655 LSR A and paddle›49656 LSR A shadow regs›49657 LSR A›49658 STA STICK1›49661 STA STICK3›49664 LDA PORTA›49667 AND #$0F›49669 STA STICK0›49672 STA STICK2›49675 LDA TRIG0›49678 STA STRIG0›49681 STA STRIG2›49684 LDA TRIG1›49687 STA STRIG1›49690 STA STRIG3›49693 LDX #3›49695 ?PADLOOP LDA POT0,X Read pots›49698 STA PADDL0,X and save›49701 STA PADDL4,X›49704 DEX›49705 BPL ?PADLOOP›49707 STA POTGO reset pot scan›49710 LDX #2›49712 LDY #1›49714 ?PTRIGLOOP LDA STICK0,Y›49717 LSR A›49718 LSR A›49719 LSR A›49720 STA PTRIG1,X›49723 STA PTRIG5,X›49726 LDA #0›49728 ROL A›49729 STA PTRIG0,X›49732 STA PTRIG4,X›49735 DEX›49736 DEX›49737 DEY›49738 BPL ?PTRIGLOOP›49740 JMP (VVBLKD) End of vbi›49743 ?XTIMR1 JMP (CDTMA1)›49746 ?XTIMR2 JMP (CDTMA2)›49749 ?DECTMR LDY CDTMV1,X Decrement›49752 BNE ?DECIT countdown timers›49754 LDY CDTMV1+1,X›49757 BEQ ?EXITDECTMR›49759 DEC CDTMV1+1,X›49762 ?DECIT DEC CDTMV1,X›49765 BNE ?EXITDECTMR›49767 LDY CDTMV1+1,X›49770 BNE ?EXITDECTMR›49772 LDA #0 return 0 and +ve›49774 RTS if timer expired›49775 ?EXITDECTMR LDA #$FF else›49777 RTS non0 and -ve›49778 DOSETBV ASL A Set interrupt›49779 STA INTEMP vector or timer›49782 TXA›49783 LDX #5›49785 STA WSYNC Wait for hsync›49788 ?WAIT5 DEX Waste 24 cycles›49789 BNE ?WAIT5›49791 LDX INTEMP›49794 STA VIMIRQ+1,X›49797 TYA›49798 STA VIMIRQ,X›49801 RTS›49802 DOXITBV PLA Exit vblank nmi›49803 TAY›49804 PLA›49805 TAX›49806 PLA›49807 RTI›