mirror of
https://github.com/irmen/prog8.git
synced 2024-11-29 01:49:22 +00:00
113 lines
2.4 KiB
Plaintext
113 lines
2.4 KiB
Plaintext
|
%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()
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|