;-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: Проигрывание текущего кадра.                       ;
 
; Параметров не имеет.                                         ;
 
;--------------------------------------------------------------;
 
 
 
        jp SFXPLAY
 
 
 
SFXFRAME
 
;487t, включая call..ret
 
sfxaddr=$+1
 
        ld hl,0
 
        ld a,h
 
        or a
 
        ret z
 
 
 
        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_toneq;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