mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-11-24 12:31:25 +00:00
106 lines
1.8 KiB
Plaintext
106 lines
1.8 KiB
Plaintext
|
|
||
|
//#resource "vcs-ca65.h"
|
||
|
|
||
|
import "vcslib.ecs"
|
||
|
|
||
|
component SoundEffect
|
||
|
duration: 0..255
|
||
|
sounddata: array of 0..255
|
||
|
end
|
||
|
|
||
|
component SoundChannel
|
||
|
sfx: [SoundEffect]
|
||
|
timer: 0..255
|
||
|
end
|
||
|
|
||
|
// TODO
|
||
|
component SoundPriority
|
||
|
priority: 0..15
|
||
|
end
|
||
|
|
||
|
system SoundEngine
|
||
|
locals 3
|
||
|
on preframe do
|
||
|
join [SoundChannel]
|
||
|
with [SoundEffect]
|
||
|
---
|
||
|
lda {{base timer}},y
|
||
|
jeq @nosound
|
||
|
sec
|
||
|
sbc #1
|
||
|
sta {{base timer}},y
|
||
|
pha
|
||
|
lda {{<sounddata}}
|
||
|
sta {{$0}}
|
||
|
lda {{>sounddata}}
|
||
|
sta {{$1}} ; save pointer to sound data
|
||
|
sty {{$2}} ; save Y (sound channel #)
|
||
|
pla
|
||
|
tay
|
||
|
lda ({{$0}}),y ; get sound data
|
||
|
bpl @setfreq ; hi bit clear = just freq
|
||
|
ldy {{$2}}
|
||
|
lsr ; right shift (/ 2)
|
||
|
bcs @setvol ; lo bit set = volume
|
||
|
sta AUDC0,y ; lo bit clear = control
|
||
|
lsr ; also set freq (/ 2)
|
||
|
@setfreq:
|
||
|
ldy {{$2}}
|
||
|
sta AUDF0,y ; set frequency
|
||
|
jmp @done
|
||
|
@nosound:
|
||
|
lda #0
|
||
|
@setvol:
|
||
|
sta AUDV0,y ; set volume
|
||
|
@done:
|
||
|
---
|
||
|
// TODO: need to pass sound entity as arg
|
||
|
on playsound do select [SoundChannel]
|
||
|
---
|
||
|
; arg 0 = sound channel
|
||
|
ldy #{{arg 0}}
|
||
|
; arg 1 = sound effect #
|
||
|
lda #{{arg 1}}
|
||
|
sta {{base sfx}},y
|
||
|
tax
|
||
|
---
|
||
|
// TODO: shouldn't need to split up like this...
|
||
|
on playsound do select [SoundEffect]
|
||
|
---
|
||
|
lda {{base duration}},x
|
||
|
---
|
||
|
on playsound do select [SoundChannel]
|
||
|
---
|
||
|
sta {{base timer}},y
|
||
|
; arg 2 = base volume
|
||
|
lda #{{arg 2}}
|
||
|
sta AUDV0,y
|
||
|
---
|
||
|
end
|
||
|
|
||
|
// TODO: default entities?
|
||
|
|
||
|
|
||
|
demo SoundDemo
|
||
|
using FrameLoop, SoundEngine
|
||
|
|
||
|
entity SFXScore [SoundEffect]
|
||
|
const duration = 11
|
||
|
const sounddata = [
|
||
|
$02,$03,$04,$08,$10,$20,$10,$20,$10,$08,
|
||
|
$a8]
|
||
|
end
|
||
|
|
||
|
// TODO: make sfx have priority?
|
||
|
entity SFX1 [SoundChannel] end
|
||
|
entity SFX2 [SoundChannel] end
|
||
|
|
||
|
system Test
|
||
|
on preframeloop do once
|
||
|
---
|
||
|
{{!playsound 0 0 15}}
|
||
|
---
|
||
|
end
|
||
|
end demo
|
||
|
|