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     ; endw zalaczniku przyklad - klawiszem 1 generujemy kolejne SFX (wszystkie na jednym kanale)

