|
- ; =============================================================
- ; irq-handler.asm — Custom IRQ Handler Skeleton for C64
- ; Demonstrates: raster IRQ, custom border color flash
- ; Assemble to $C000. Run with SYS 49152 to install, SYS 49166 to remove.
- ; =============================================================
-
- * = $C000
-
- ; ---------------------------------------------------------------
- ; INSTALL — Patches IRQ vector to our handler
- ; ---------------------------------------------------------------
- INSTALL SEI ; disable interrupts while patching
-
- ; Save original IRQ vector
- LDA $0314
- STA OLDIRQ
- LDA $0315
- STA OLDIRQ+1
-
- ; Install our handler
- LDA #<RASTER_IRQ
- STA $0314
- LDA #>RASTER_IRQ
- STA $0315
-
- ; Set up VIC-II raster interrupt at line 100
- LDA $D011
- AND #$7F ; clear raster bit 8
- STA $D011
- LDA #100 ; trigger at raster line 100
- STA $D012
-
- ; Enable VIC-II raster IRQ, keep CIA #1 timer IRQ enabled too
- LDA #$01
- STA $D01A ; VIC IRQ mask: raster
-
- CLI ; re-enable interrupts
- RTS
-
- ; ---------------------------------------------------------------
- ; REMOVE — Restores original IRQ vector
- ; ---------------------------------------------------------------
- REMOVE SEI
- LDA OLDIRQ
- STA $0314
- LDA OLDIRQ+1
- STA $0315
- LDA #$00
- STA $D01A ; disable VIC IRQs
- CLI
- RTS
-
- ; ---------------------------------------------------------------
- ; RASTER_IRQ — Our custom interrupt handler
- ; Called when VIC-II raster reaches line 100
- ; ---------------------------------------------------------------
- RASTER_IRQ:
- ; Acknowledge VIC-II interrupt (write-back clears flags)
- LDA $D019 ; read VIC interrupt status
- STA $D019 ; acknowledge by writing back
-
- ; Check if this is really a raster interrupt
- AND #$01 ; bit 0 = raster IRQ
- BEQ NOT_RASTER
-
- ; --- RASTER EFFECT: Flash border color ---
- INC COLORIDX
- LDA COLORIDX
- AND #$0F ; keep in 0-15 range
- STA COLORIDX
- STA $D020 ; write border color
-
- ; Schedule next IRQ at line 200
- LDA $D012
- CMP #200
- BEQ FLIP_RASTER
- LDA #200
- STA $D012
- JMP DONE_IRQ
- FLIP_RASTER:
- LDA #100
- STA $D012
-
- DONE_IRQ:
- NOT_RASTER:
- ; Chain to original IRQ for keyboard/timer/jiffy updates
- JMP (OLDIRQ)
-
- ; ---------------------------------------------------------------
- ; Data
- ; ---------------------------------------------------------------
- OLDIRQ .WORD $EA31 ; default IRQ handler address
- COLORIDX .BYTE 0
-
- ; ---------------------------------------------------------------
- ; End of code
- ; ---------------------------------------------------------------
|