I am working on a loading screen, and what I wanted was a simple raster trick (just change the border colour on the bottom half of the screen), and also call the KERNAL to load some more data from a disk. Easy peasy, right?
Here is my code. It loads with LOAD"*",8,1.
; The following is a short BASIC program; ; 10 SYS 2304 ; and causes the machine to jump to the machine code include later on. ; 2304 decimal is 900 hex. .byt $01, $08, $0C, $08, $0A, $00, $9E, $20 .byt $32, $33, $30, $34, $00, $00, $00 ; Fill up with no-ops until the start of the program. .dsb 242,$EA * = $0900 sei ; Turn BASIC off but leave KERNAL and IO on. lda #$36 sta $01 ; Enable raster interrupt signals from VIC lda #%00000001 sta $d01a ; Set the irqserve routine to start when raster line 0 hits. lda #0 sta $d012 lda #<irqserve sta $0314 lda #>irqserve sta $0315 ; enable interrupts again cli ; Infinite loop. stop: jmp stop As you can see, it ends in an infinite loop, which means the program should end there, right? That's not how this program behaves. This program will eventually return the user to the BASIC prompt. I'm trying to figure out why, and the problem appears to be in the routine irqserve:
irqserve: ; Look at the raster counter to see how far down the screen we are lda $d012 beq bluborder cmp #116 bcc blackborder jmp irqend bluborder: lda #$01 ; change border colour sta $d020 ; Next interrupt should fire at raster line 116. lda #116 sta $d012 jmp irqend blackborder: lda #$00 ; change border colour sta $d020 ; Next interrupt should fire at raster line 0. sta $d012 irqend: rts But what I can't figure out though is what to do at the end of my interrupt handler. Should it jump back to the KERNAL? Or do rti or rts?