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›