mirror of
https://github.com/irmen/prog8.git
synced 2024-11-26 11:49:22 +00:00
08ac459a41
When it returns true it means run the system IRQ handler afterwards. When it returns false, the system handler is NOT ran afterwards.
87 lines
2.8 KiB
Lua
87 lines
2.8 KiB
Lua
%import textio
|
|
%import diskio
|
|
%zpreserved $22,$2d ; zsound lib uses this region
|
|
|
|
; NOTE: this is a proof of concept to stream ZCM digi from disk while playing.
|
|
; currently there's no real streaming API / circular buffer in zsound,
|
|
; so it simply loads the whole ZCM file in chunks in memory sequentially.
|
|
; But it does so while the playback is going on in the background.
|
|
; It seems fast enough to stream + play 16khz 16bit stereo samples. (around 64 Kb/sec)
|
|
; Maybe we can go faster but 22 Khz seemed too much to keep up with.
|
|
|
|
main $0830 {
|
|
|
|
zsound_lib:
|
|
; this has to be the first statement to make sure it loads at the specified module address $0830
|
|
%asmbinary "zsound_combo-0830.bin"
|
|
|
|
; note: jump table is offset by 2 from the load address (because of prg header)
|
|
romsub $0832 = zsm_init() clobbers(A)
|
|
romsub $0835 = zsm_play() clobbers(A, X, Y)
|
|
romsub $0838 = zsm_playIRQ() clobbers(A, X, Y)
|
|
romsub $083b = zsm_start(ubyte bank @A, uword song_address @XY) clobbers(A, X, Y) -> bool @Pc
|
|
romsub $083e = zsm_stop()
|
|
romsub $0841 = zsm_setspeed(uword hz @XY) clobbers(A, X, Y)
|
|
romsub $0844 = zsm_setloop(ubyte count @A)
|
|
romsub $0847 = zsm_forceloop(ubyte count @A)
|
|
romsub $084a = zsm_noloop()
|
|
romsub $084d = zsm_setcallback(uword address @XY)
|
|
romsub $0850 = zsm_clearcallback() clobbers(A)
|
|
romsub $0853 = zsm_get_music_speed() clobbers(A) -> uword @XY
|
|
romsub $0856 = pcm_init() clobbers(A)
|
|
romsub $0859 = pcm_trigger_digi(ubyte bank @A, uword song_address @XY)
|
|
romsub $085c = pcm_play() clobbers(A, X, Y)
|
|
romsub $085f = pcm_stop() clobbers(A)
|
|
romsub $0862 = pcm_set_volume(ubyte volume @A)
|
|
|
|
const ubyte digi_bank = 1
|
|
const uword digi_address = $a000
|
|
const ubyte zcm_DIGITAB_size = 8 ; header size
|
|
const uword ram_bank_size = $2000
|
|
|
|
ubyte load_ok = false
|
|
|
|
sub prebuffer() {
|
|
txt.print("prebuffering...")
|
|
void diskio.f_read(digi_address, ram_bank_size*4)
|
|
}
|
|
|
|
sub start() {
|
|
txt.print("\nzsound digi streaming (drive 8)!\n")
|
|
|
|
if not diskio.f_open("thriller.zcm") {
|
|
txt.print("?no file\n")
|
|
return
|
|
}
|
|
|
|
cx16.rambank(digi_bank)
|
|
prebuffer()
|
|
|
|
pcm_init()
|
|
pcm_trigger_digi(digi_bank, digi_address)
|
|
sys.set_irq(&zsm_playroutine_irq)
|
|
|
|
txt.print("\nstreaming from file, playback in irq!\n")
|
|
uword size = 1
|
|
while size {
|
|
size = diskio.f_read(digi_address, ram_bank_size) ; load next bank
|
|
txt.print_ub(cx16.getrambank())
|
|
txt.spc()
|
|
sys.wait(5) ; artificial delay
|
|
}
|
|
|
|
txt.print("sound file end reached.\n")
|
|
diskio.f_close()
|
|
|
|
repeat {
|
|
}
|
|
|
|
pcm_stop() ;unreached
|
|
}
|
|
|
|
sub zsm_playroutine_irq() -> bool {
|
|
pcm_play()
|
|
return true
|
|
}
|
|
}
|