przykład injekcji:
https://www.youtube.com/watch?v=gdf9oATb2zI
sfx_engine obsluguje 4 kanaly dla sfx - w przykladzie wzbudzam tylko jeden,
zeby SFX_ENGINE nie uzywal konkretnego kanalu należy nadać mu wartosc $80 (np. zarezerwować kanał dla muzyki)
format danych:
linia:
%0 time,audf,audc
%11 repeat,audf,audc
audf
%10 repeat,audf,audc
audc
koniec: 0,1
reload: 0,0
zalety: SFX moze być bardziej skomplikowany od instrumentow uzywanych w playerach muzyki lub np. może być częścią muzyki,
dane mozna generowac do bufora playera muzyki lub bezposrednio do rejestrow,
moze byc samodzielnym silnikiem SFX
silnik:
SFXZP equ $80 ; ZPAGE
VPOKEY equ $D200
SFX_ENGINE lda SFX_ONOFF
beq @+
rts ; mozna tu wyzerować SFX_NO ale to zależy od implementacji
@ ldx #3 ; 3 2 1 0 = Channel
SFX_CONTCH lda SFX_NO,x
beq SFX_NXTCH
bmi SFX_NXTCH ; zarezerwowany kanał
ldy SFX_TIME,x
bne SFX_CONTTONE
asl @ ; TIME = 0 reload
tay
lda SFX_ADR_TAB-2,y ; adres SFX
sta SFXZP
lda SFX_ADR_TAB-1,y
sta SFXZP+1
ldy SFX_CNT,x ; pozcja w SFX
lda SFX_REPEAT,x
beq SFX_RELOAD
dec SFX_REPEAT,x
inc SFX_TIME,x
lda SFX_FLAG,x
asl @
bcs SFX_DF
bcc SFX_DC
SFX_RELOAD lda (SFXZP),Y
beq SFX_CTRL ;=0
asl @ ; b7 REPEAT?
bcc SFX_TIM
asl @ ; b6 flag
ror SFX_FLAG,x
lsr @
lsr @
sta SFX_REPEAT,x
lda #$02 ; /2
SFX_TIM lsr @ ; time i wyzeruj C
sta SFX_TIME,x ; pierwszy bajt (%0time,audf,audc)
iny
SFX_DF lda (SFXZP),Y
sta SFX_AUDF,x ; drugi
iny
bcs SFX_N3
SFX_DC lda (SFXZP),Y
sta SFX_AUDC,x ; trzeci
iny
SFX_N3 tya
sta SFX_CNT,x ; ustaw na kolejny bajt w SFX
SFX_CONTTONE txa ; zmien na adres w VPOKEY
asl @
tay
lda SFX_AUDF,x
sta VPOKEY,y ; nadpisuje to co player muzyki wygenerowal
lda SFX_AUDC,x
sta VPOKEY+1,y
dec SFX_TIME,x ; SFX_CONTTONE zalezy od implementacji
SFX_NXTCH dex
bpl SFX_CONTCH
rts
SFX_CTRL iny ;=0 (0,0) i (0,n)
lda (SFXZP),y
tay ;=0 reload lub <>0 end
beq SFX_RELOAD
lda #$00 ; OFF SFX
sta SFX_NO,x
sta SFX_CNT,x ; SFX_TIME = 0
beq SFX_NXTCH ; zawsze
SFX_ONOFF .byte 0 ; 0 ON
SFX_NO .byte 0,0,0,0 ; 0 wolny, numer sfx, $80 zarezerwowany
SFX_CNT .byte 0,0,0,0 ; licznik pozcji w sfx
SFX_TIME .byte 0,0,0,0 ; licznik trwania nuty
SFX_AUDC .byte 0,0,0,0
SFX_AUDF .byte 0,0,0,0
SFX_FLAG .byte 0,0,0,0 ; c=1 laduj AUDF, c=0 laduj AUDC
SFX_REPEAT .byte 0,0,0,0 ; licznik strumienia
SFX_ADR_TAB .word sfx14
sfx14 .HE C5 B0 A7 ; C repeat 5 audf
.HE A0 90 80 70 60
.HE C3 50 A6 ; C repeat 3 audf
.HE 40 30 20
.HE 01 00 00 ; silencio
.HE 00 01 ; end
w zalaczniku przyklad - klawiszem 1 generujemy kolejne SFX (wszystkie na jednym kanale)