From db4a5eed00949a6731151d6ff1d0b1a3273c7e20 Mon Sep 17 00:00:00 2001 From: pmprog Date: Wed, 24 Mar 2021 15:27:19 +0000 Subject: [PATCH 1/2] C64 VIC-II RasterIRQ methods and example --- examples/c64/rasterirq.mfk | 40 +++++++++++++++++++++++++++++++++ include/c64_vic.mfk | 46 +++++++++++++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 examples/c64/rasterirq.mfk diff --git a/examples/c64/rasterirq.mfk b/examples/c64/rasterirq.mfk new file mode 100644 index 00000000..9abf5e79 --- /dev/null +++ b/examples/c64/rasterirq.mfk @@ -0,0 +1,40 @@ + +void RasterA() +{ + vic_rasterirq_acknowledge() + vic_border = $00 + + vic_rasterirq_reconfigure(RasterB.addr, $40) + vic_raster_return() +} + +void RasterB() +{ + vic_rasterirq_acknowledge() + vic_border = $04 + + vic_rasterirq_reconfigure(RasterC.addr, $A0) + vic_raster_return() +} + +void RasterC() +{ + vic_rasterirq_acknowledge() + vic_border = $02 + + vic_rasterirq_reconfigure(RasterA.addr, $00) + vic_raster_return() +} + +void main() +{ + byte i + + // Configure Raster IRQ + vic_rasterirq_configure(RasterA.addr, $00) + + while true + { + i = 0 + } +} diff --git a/include/c64_vic.mfk b/include/c64_vic.mfk index e19d9dee..a596569e 100644 --- a/include/c64_vic.mfk +++ b/include/c64_vic.mfk @@ -164,4 +164,48 @@ const byte medium_gray = 12 const byte light_green = 13 const byte light_blue = 14 const byte light_grey = 15 -const byte light_gray = 15 \ No newline at end of file +const byte light_gray = 15 + + +asm void vic_rasterirq_configure(pointer CallbackFunction, byte RasterLine) +{ + sei + ldx CallbackFunction.lo + stx $0314 + ldy CallbackFunction.hi + sty $0315 + lda #$7f ;CIA interrupt off + sta $dc0d + lda #$01 ;Raster interrupt on + sta $d01a + lda #27 ;High bit of interrupt position = 0 + sta $d011 + lda RasterLine ;Line where next IRQ happens + sta $d012 + lda $dc0d ;Acknowledge IRQ (to be sure) + cli + rts +} + +asm void vic_rasterirq_reconfigure(pointer CallbackFunction, byte RasterLine) +{ + ldx CallbackFunction.lo + stx $0314 + ldy CallbackFunction.hi + sty $0315 + lda RasterLine ;Line where next IRQ happens + sta $d012 + rts +} + +asm macro void vic_rasterirq_acknowledge() +{ + lda #$FF + sta $D019 +} + +asm macro void vic_raster_return() +{ + lda #$00 + jmp $EA81 +} From b0e8b5c8d62b9aca038a3b24731df91e56913335 Mon Sep 17 00:00:00 2001 From: pmprog Date: Wed, 24 Mar 2021 15:40:50 +0000 Subject: [PATCH 2/2] Formatting update --- examples/c64/rasterirq.mfk | 50 ++++++++++++++++++++++---------------- include/c64_vic.mfk | 12 +++------ 2 files changed, 33 insertions(+), 29 deletions(-) diff --git a/examples/c64/rasterirq.mfk b/examples/c64/rasterirq.mfk index 9abf5e79..2d3b120a 100644 --- a/examples/c64/rasterirq.mfk +++ b/examples/c64/rasterirq.mfk @@ -1,40 +1,48 @@ -void RasterA() -{ - vic_rasterirq_acknowledge() - vic_border = $00 +void RasterA() { + vic_rasterirq_acknowledge() + // First raster split, set border to black + vic_border = black + + // Set up next raster split vic_rasterirq_reconfigure(RasterB.addr, $40) - vic_raster_return() + + vic_rasterirq_return() } -void RasterB() -{ - vic_rasterirq_acknowledge() - vic_border = $04 +void RasterB() { + vic_rasterirq_acknowledge() + + // Second raster split, Dark grey + vic_border = dark_grey + // Set up next raster split vic_rasterirq_reconfigure(RasterC.addr, $A0) - vic_raster_return() + + vic_rasterirq_return() } -void RasterC() -{ - vic_rasterirq_acknowledge() - vic_border = $02 +void RasterC() { + vic_rasterirq_acknowledge() + + // Third raster split, Light grey + vic_border = light_grey + // Set up next raster split vic_rasterirq_reconfigure(RasterA.addr, $00) - vic_raster_return() + + vic_rasterirq_return() } -void main() -{ +void main() { byte i // Configure Raster IRQ vic_rasterirq_configure(RasterA.addr, $00) - while true - { - i = 0 - } + // Loop forever + while true { + i = 0 // Do nothing here + } } diff --git a/include/c64_vic.mfk b/include/c64_vic.mfk index a596569e..1053ffb0 100644 --- a/include/c64_vic.mfk +++ b/include/c64_vic.mfk @@ -167,8 +167,7 @@ const byte light_grey = 15 const byte light_gray = 15 -asm void vic_rasterirq_configure(pointer CallbackFunction, byte RasterLine) -{ +asm void vic_rasterirq_configure(pointer CallbackFunction, byte RasterLine) { sei ldx CallbackFunction.lo stx $0314 @@ -187,8 +186,7 @@ asm void vic_rasterirq_configure(pointer CallbackFunction, byte RasterLine) rts } -asm void vic_rasterirq_reconfigure(pointer CallbackFunction, byte RasterLine) -{ +asm void vic_rasterirq_reconfigure(pointer CallbackFunction, byte RasterLine) { ldx CallbackFunction.lo stx $0314 ldy CallbackFunction.hi @@ -198,14 +196,12 @@ asm void vic_rasterirq_reconfigure(pointer CallbackFunction, byte RasterLine) rts } -asm macro void vic_rasterirq_acknowledge() -{ +asm macro void vic_rasterirq_acknowledge() { lda #$FF sta $D019 } -asm macro void vic_raster_return() -{ +asm macro void vic_rasterirq_return() { lda #$00 jmp $EA81 }