// A minimal working raster IRQ // Commodore 64 PRG executable file .file [name="irq-raster.prg", type="prg", segments="Program"] .segmentdef Program [segments="Basic, Code, Data"] .segmentdef Basic [start=$0801] .segmentdef Code [start=$80d] .segmentdef Data [startAfter="Code"] .segment Basic :BasicUpstart(main) .const IRQ_RASTER = 1 .const WHITE = 1 .const BLACK = 0 .const CIA_INTERRUPT_CLEAR = $7f .label KERNEL_IRQ = $314 .label RASTER = $d012 .label VICII_CONTROL1 = $d011 .label IRQ_STATUS = $d019 .label IRQ_ENABLE = $d01a .label BG_COLOR = $d020 .label CIA1_INTERRUPT = $dc0d .segment Code // Interrupt Routine irq: { // *BG_COLOR = WHITE lda #WHITE sta BG_COLOR // *BG_COLOR = BLACK lda #BLACK sta BG_COLOR // *IRQ_STATUS = IRQ_RASTER // Acknowledge the IRQ lda #IRQ_RASTER sta IRQ_STATUS // } jmp $ea81 } main: { // asm sei // *CIA1_INTERRUPT = CIA_INTERRUPT_CLEAR // Disable CIA 1 Timer IRQ lda #CIA_INTERRUPT_CLEAR sta CIA1_INTERRUPT // *VICII_CONTROL1 |=$80 // Set raster line to $100 lda #$80 ora VICII_CONTROL1 sta VICII_CONTROL1 // *RASTER = $00 lda #0 sta RASTER // *IRQ_ENABLE = IRQ_RASTER // Enable Raster Interrupt lda #IRQ_RASTER sta IRQ_ENABLE // *KERNEL_IRQ = &irq // Set the IRQ routine lda #irq sta KERNEL_IRQ+1 // asm cli // } rts }