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
