Simple IRQ Music Player
This routine plays music inside an IRQ raster interrupt. Just a basic step to interrupts. This routine is in ACME Cross assembler format.
;-------------------------------- ;JCH, DMC, Whatever IRQ music plr ;================================ !to "irqmusplr.prg",cbm * = $0810 ;Remember SYS 2064 to enable it sei lda #<irq ldx #>irq sta $314 stx $315 lda #$1b ldx #$00 ldy #$7f sta $d011 stx $d012 sty $dc0d lda #$01 sta $d01a sta $d019 ; ACK any raster IRQs lda #$00 jsr $1000 ;Initialize Richard's music cli hold jmp hold ;We don't want to do anything else here. :) ; we could also RTS here, when also changing $ea81 to $ea31 irq lda #$01 sta $d019 ; ACK any raster IRQs jsr $1003 ;Play the music jmp $ea31 * = $1000-2 !binary "music.dat" ;Rip one of my tunes from the HVSC and save as music.dat if you like :)
Some additional notes by Frantic:
.sid files have a header of length $7c bytes. You must remove this header from the sid files before you can place them on $1000 in c64 memory (for sids that should indeed be placed on $1000, which is something like a standard, but not every tune follow this).
In some assemblers you can skip N number of bytes in the binary files directly, without having to do it with help of a hex editor or a tool such as “dd” or similar. An example for ACME follows:
*=$1000 !bin "Raymond.sid",, $7c+2
The “+2” at the end also removes the load address (two bytes) from the original c64 file inside the .sid file.
Also note that in order to make the example code above executable (by executing “RUN” instead of forcing the user/coder to manually enter “SYS xxxx” to start the program), you would either have to crunch the file (crunchers add startup code) or add a basic stub to the start, such as:
* = $0801 sysline: !byte $0b,$08,$01,$00,$9e,$32,$30,$36,$31,$00,$00,$00 ;= SYS 2061 * = $080d ;=2061 (Instead of $0810 as in Richards example ; not to waste unnecessary bytes) machine_code_entry: sei ...etc