;-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