prog8/examples/cx16/zsmkit/demo1.p8

113 lines
2.4 KiB
Lua

%import textio
%import palette
%import zsmkit_low
;; Proof Of Concept ZSM player using a binary blob version of zsmkit by MooingLemur
;; This version shows how you could integrate the zsmkit blob located in lower memory at $0830.
;; It embeds the blob into the prg itself, no separate loading is necessary.
;; It uses zsmkit's streaming ability to load the song data from disk on the fly.
main $0830 {
; this has to be the first statement to make sure it loads at the specified module address $0830
%asmbinary "lib/zsmkit-0830.bin"
const ubyte zsmkit_bank = 1
bool loopchanged = false
bool beat = false
uword loop_number = 0
sub start() {
txt.print("zsmkit demo program (drive 8)!\n")
txt.print("during playback, press return to pause/unpause\n")
zsmkit.zsm_init_engine(zsmkit_bank)
play_music()
}
asmsub callback_handler(ubyte prio @X, ubyte type @Y, ubyte arg @A) {
%asm {{
brk
cpy #1
beq _loop
cpy #2
beq _sync
rts
_loop:
inc p8v_loopchanged
rts
_sync:
inc p8v_beat
rts
}}
}
sub play_music() {
uword next_free
zsmkit.zsm_setfile(0, iso:"music/MUSIC.ZSM")
cx16.rambank(2)
txt.print(iso:"STARTING IN BANK 2, ADDRESS $A000")
txt.nl()
txt.print(iso:"NOW LOADING PCM FROM MUSIC.ZSM")
txt.nl()
next_free = zsmkit.zsm_loadpcm(0, $a000)
txt.print(iso:"NOW AT BANK ")
txt.print_ub(cx16.getrambank())
txt.print(iso:", ADDRESS ")
txt.print_uwhex(next_free, true)
txt.nl()
zsmkit.zsm_play(0)
zsmkit.zsm_setcb(0, &callback_handler)
bool paused = false
uword oldjoy = $ffff
ubyte intensity = 0
repeat {
uword newjoy
newjoy, void = cx16.joystick_get(0)
if (newjoy != oldjoy and (newjoy & $10) == 0) {
if (paused) {
zsmkit.zsm_play(0)
paused = false
} else {
zsmkit.zsm_stop(0)
paused = true
}
zsmkit.zsm_close(1)
zsmkit.zsm_setfile(1, iso:"PAUSE.ZSM")
zsmkit.zsm_play(1)
}
oldjoy = newjoy
sys.waitvsync()
zsmkit.zsm_tick(0)
if (loopchanged) {
txt.nl()
loop_number += 1
loopchanged = false
txt.print(iso:"LOOP NUMBER: ")
txt.print_uw(loop_number)
txt.nl()
zsmkit.zsm_setrate(0, 60+(loop_number << 2))
}
if (beat) {
intensity = 16
beat = false
} else if (not paused) {
txt.print(".")
}
if (intensity > 0) {
intensity -= 1
palette.set_color(0, (intensity >> 1) * $111)
}
zsmkit.zsm_fill_buffers()
}
}
}