; ============================================================= ; 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 $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 ; ---------------------------------------------------------------