;-Minimal ayFX player2 v0.16 20.06.06--------------------------;
; cropped for Hardy                                            ;
;                                                              ;
; Простейший плеер эффектов. Проигрывает эффекты на одном AY,  ;
; в канале B.                                                  ;
; Процедура проигрывания использует регистры AF,BC,DE,HL,IX.   ;
;                                                              ;
; Запуск эффекта:                                              ;
;   ld a, номер эффекта (0..127)                               ;
;   call AFXPLAY                                               ;
;                                                              ;
; В обработчике прерывания:                                    ;
;   call AFXFRAME                                              ;
;                                                              ;
;--------------------------------------------------------------;


;--------------------------------------------------------------;
; SFXFRAME: Проигрывание текущего кадра.                       ;
; Параметров не имеет.                                         ;
;--------------------------------------------------------------;

afxFrame_skip
        ld bc,0xfffd
;wait 420t
        ld b,31
        djnz $
        add hl,hl
        nop
;
        RET 


afxFrame_nochtone
        LD A,(HL)
        LD A,(HL)
        LD A,(HL)
        LD A,(HL)
        LD A,(HL)
        jr afxFrame_toneq ;12(jr)+ 35 +12 = 59t

SFXFRAME
;487t, включая call..ret
sfxaddr=$+1
        ld hl,0
        ld a,h
	or a
        if PENT
        jr z,afxFrame_skip         ;канал не играет, пропускаем
        else
        ret z
        endif

        ld bc,0xfffd
        LD E,(HL)          ;берём значение информационного байта
        INC HL
        ld a,9
        OUT (C),A ;выбрали регистр громкости
        LD A,E
        AND #0F
        LD B,0xbf
        OUT (C),A                    ;собственно вывод громкости

        BIT 5,E                         ;будет изменение тона?
        jr Z,afxFrame_nochtone          ;тон не изменяется
        LD A,(HL)
        LD (sfxtoneL),A
        INC HL
        LD A,(HL)
        LD (sfxtoneH),A
        INC HL ;7(jr)+7+13+6+7+13+6 = 59t
afxFrame_toneq
        ld a,2
        LD B,#FF                        ;выводим значения тона
        OUT (C),A
        LD B,0xbf
sfxtoneL=$+1
       LD D,0 ;младший байт тона может быть 0xfe!!!
        OUT (C),D
        INC A
        ld b,0xff
        OUT (C),A
        LD B,0xbf
sfxtoneH=$+1
       LD D,0
        OUT (C),D
        BIT 6,E                         ;будет изменение шума?
        
        jr Z,afxFrame_nochnoise          ;шум не изменяется
        LD A,(HL)                       ;читаем значение шума
        INC HL
        SUB #20 ;7+7+6+7 = 27t
        
        jr nc,afxFrame_endsfx
;меньше #20, играем дальше
        LD B,0xFF
        LD D,6
        OUT (C),D
        LD B,0xbf
        OUT (C),A                        ;вывод значения шума
         ;7(jr)+7+7+12+7+12 = 52t
afxFrame_noiseq
        ld a,e
        rrca                          ;сдвигаем флаги TN
        rrca                           ;сдвигаем флаги TN
        rrca                           ;сдвигаем флаги TN
        ld e,a
        LD B,0xFF                     ;читаем регистр микшера
        LD A,7
        OUT (C),A
        IN A,(C)
        XOR E                          ;накладываем флаги канала
         AND %11101101
        XOR E
        LD B,0xbf
        OUT (C),A                      ;выводим обратно в микшер ;может быть 0xfe!!!
        LD (sfxaddr),hl                ;сохраняем изменившийся адрес
        ret

afxFrame_endsfx
         add hl,hl
         inc hl
        LD H,A                          ;иначе конец эффекта =0
        LD E,#90                ;выключаем тон и шум в микшере
        jr afxFrame_noiseq ;12(jr)+ 11+6+ 4+7+12 = 52t
afxFrame_nochnoise
         jr $+2
         jr $+2
         jr $+2
         jr $+2
         ld a,(hl)
        jr afxFrame_noiseq ;12(jr)+ 48+7+ 12 = t (=27+52)

;--------------------------------------------------------------;
; Запуск эффекта на свободном канале. При отсутствии           ;
; свободных каналов выбирается наиболее давно звучащий.        ;
; Вход: A = номер эффекта 0..255                               ;
;--------------------------------------------------------------;

SFXPLAY
        add a,a
        add a,+(sfx+1)&0xff
        ld l,a
        adc a,+(sfx+1)/256
        sub l
        ld h,a
        LD C,(HL)
        INC HL
        LD B,(HL)
        ADD HL,BC                    ;адрес эффекта получен в hl
        ld (sfxaddr),hl
	ret
