.macro irq_set(name, rasterline) { lda #<name sta $fffe lda #>name sta $ffff lda #rasterline sta $d012 lda $d011 and #$7f ora #(rasterline & $100) >> 1 sta $d011 } .macro irq_wait(rasterline) { irq_set(next, rasterline) inc $d019 rti next: } .macro pt_wait_ticks(pt, ticks) { lda #0 sta count + 1 lda #<again sta pt lda #>again sta pt + 1 again: count: lda #0 cmp #ticks beq done inc count + 1 rts done: } * = $0801 "Basic Upstart" BasicUpstart(start) * = $0810 "Program" start: { sei lda #$7f sta $dc0d bit $dc0d lda #$01 sta $d01a lda #$35 sta $01 irq_set(irq, 0) cli jmp * } irq: { lda #$e sta $d020 irq_wait($40) lda #2 sta $d020 irq_wait($80) lda #3 sta $d020 irq_wait($f8) lda #4 sta $d020 jsr sequence irq_set(irq, 0) inc $d019 rti } sequence: { jmp (pt) again: pt_wait_ticks(pt, 2 * 50) lda #5 sta $d021 pt_wait_ticks(pt, 2 * 50) lda #6 sta $d021 jmp again pt: .word again }
That NMI-for-Music is something i have to think about - not sure i like it, but it sounds like a good idea :) Edit: how are you dealing with the case when you need the processing time in the border for something else? just write a different timer value for one frame (that seems glitchy). or us a slightly smaller timer value, and wait (in a transition or so) until the music call arrives at the wanted new position?
irq: { irq_wait($f8) jsr blink_logo jsr blink_text irq_set(irq, 0) inc $d019 rti } blink_logo: { jmp (pt) pt: .word again again: pt_wait_ticks(pt, 2 * 50) lda #5 sta logo_color pt_wait_ticks(pt, 2 * 50) lda #6 sta logo_color jmp again } blink_text: { jmp (pt) pt: .word again again: pt_wait_ticks(pt, 1 * 50) lda #7 sta text_color pt_wait_ticks(pt, 1 * 50) lda #8 sta text_color pt_wait_ticks(pt, 1 * 50) lda #9 sta text_color jmp again }
; Implement of anonymous Irq Handlers and Protothreads ; by Trident Fjälldata 2025 (64tass example) ; BASIC START * = $0801 .text 12,8,0,0,$9e,"2061",0,0,0 ; CODE START *= $080d sei lda #$7f sta $dc0d bit $dc0d lda #$01 sta $d01a lda #$35 sta $01 #irq_set irq, 0 cli jmp * ; Calling the Protothreads irq lda #$0e sta $d020 #irq_wait $40 lda #$02 sta $d020 #irq_wait $80 lda #$03 sta $d020 #irq_wait $b4 lda #$04 sta $d020 #irq_wait $f8 lda #$06 sta $d020 jsr sequence #irq_set irq, 0 asl $d019 rti sequence .block jmp (pt) again #pt_wait_ticks pt, 2 * 50 lda #$05 sta $d021 #pt_wait_ticks pt, 2 * 50 lda #$06 sta $d021 #pt_wait_ticks pt, 2 * 50 lda #$07 sta $d021 jmp again pt .word again .endblock ; Macros Definitions irq_set .macro name, rasterline lda #<\name sta $fffe lda #>\name sta $ffff lda #\rasterline sta $d012 lda $d011 and #$7f ora #(\rasterline & $100) >> 1 sta $d011 .endm irq_wait .macro rasterline #irq_set next, \rasterline inc $d019 rti next .endm pt_wait_ticks .macro pt, ticks lda #0 sta count + 1 lda #<again sta \pt lda #>again sta \pt + 1 again count lda #0 cmp #\ticks beq done inc count + 1 rts done .endm