prog8/examples/cx16/zsmkit_v2/demo.p8
2024-11-29 00:04:57 +01:00

67 lines
1.4 KiB
Lua

%import textio
%import diskio
%import palette
%import zsmkit
%zeropage basicsafe
;; Proof Of Concept ZSM player using zsmkit v2 by MooingLemur
;; zsmkit bank is hardcoded in the module import above
main {
ubyte[255] zsmkit_lowram
sub start() {
; load zsmkit in bank 1 and the music starting from bank 2 onwards.
cx16.rambank(zsmkit.ZSMKitBank)
void diskio.load_raw("zsmkit-a000.bin",$A000)
cx16.rambank(2)
void diskio.load_raw("music.zsm",$A000)
;;void diskio.load_raw("song2.zsm",$A000)
zsmkit.zsm_init_engine(&zsmkit_lowram)
setup_isr()
play_music()
}
sub setup_isr() {
;; You could use zsmkit.zsmkit_setisr() and be done with it
;; but here's an example of a custom ISR.
;; Note that jsrfar is unsafe to call in a handler, so the ISR
;; uses zsmkit.zsm_tick_isr() with a manual bank change
sys.set_irq(&irq.handler)
}
sub play_music() {
uword zsmptr
ubyte zsmbank
txt.cls()
zsmkit.zsm_setbank(0, 2)
zsmkit.zsm_setmem(0, $A000)
zsmkit.zsm_play(0)
repeat {
sys.waitvsync()
void, zsmptr, zsmbank = zsmkit.zsm_getptr(0)
txt.home()
txt.print_ubhex(zsmbank, true)
txt.print(":")
txt.print_uwhex(zsmptr, false)
}
}
}
irq {
sub handler() -> bool {
ubyte savebank
savebank = cx16.getrambank()
cx16.rambank(zsmkit.ZSMKitBank)
zsmkit.zsm_tick_isr(0) ; NOTE that zsm_tick() is not allowed in a handler
cx16.rambank(savebank)
return true
}
}