General Sound AY Emulator v1.0
(c) Dr.Lion/RSM
──────────────────────────────────────────
Представленный ниже програмный продукт является авторским дос-
тоянием! При его использовании ссылка на автора обязательна!
Данный програмный продукт является эмулятором м/с AY-3-8910 на
звуковой карте General Sound 1.04 (GS). Версия ПЗУ GS не имеет
значения, так как оно используется лишь при загрузке внутреннего
кода эмулятора AY. В дальнейшем эмулятор работает непосредстве-
нно с "железом" GS.
Всвязи с тем, что скоростные характеристики GS весьма скромны
для полнофункциональной эмуляции AY, было принято решение реали-
зовать минимум возможностей AY, позволяющих проигрывать на эму-
ляторе музыку любым стандартным плеером, предварительно переде-
ланым под обмен данными с эмулятором AY.
Ниже представлены особенности эмулятора AY:
1.Обмен данными
Формат данных, передаваемых на эмулятор аналогичен формату AY,
т.е.существует порт регистра (#BB), в который записывается но-
мер выбираемого регистра, и порт данных (#B3), в который запи-
сываются передаваемые в регистр данные. Но в отличие от реаль-
ного AY, эмулятор не может моментально принять посылаемые на
него данные, ведь эти данные должен прочитать практически пол-
ностью загруженый генерацией звука процессор GS. Поэтому за-
пись данных в регистр эмулятора выполняется следующим образом:
....
LD A,register ;номер регистра для записи
OUT (#BB),A
LD A,data ;записываемые данные
OUT (#B3),A
CALL WaitDat
....
WaitDat IN A,(#BB) ;ожидание чтения эмулятором по-
RLCA ;сланых ему данных
JR C,WaitDat
RET
Так же эмулятор не позволяет производить чтение из его регис-
тров. Реализация такой возможности неоправдано затормозила бы
общую скорость обмена данными между ZX и эмулятором AY.
2.Частота дискретизации
Она составляет 12500Hz и позволяет воспроизводить тональные
частоты в диапазоне 6076,39-26,71Hz, что соответствует коэффи-
циентам деления от 18 до 4095. Частоты выше 6076,39Hz преобра-
зовываются в частоту 6076,39Hz. Диапазон шумовых частот гораз-
до уже, т.к. разрядность коеффициента деления для частоты шума
составляет 5 бит (но это стандарт AY).
3.Разрядность и назначение битов регистров
Это сохранилось без изменений за исключением регистров R12 и
R13. Регистр R12 может содержать числа от 0 до 3. Если число
больше 3, то оно преобразуется в 3. Таким образом честота оги-
бающей не может быть ниже 6,68Hz. С другой стороны, коэффици-
ент деления для частоты огибающей не может быть меньше 5. R13
может принимать значения 8, A, C, E или любое другое значение,
которое после преобразования все равно примет одно из четырех
оговореных выше значений.
4.Генераторы тона, шума, огибающей
Они построены на 24-х битных масштабирующих счетчиках-делите-
лях по примерной схеме:
.... ;тон канала A
A_NumA LD HL,0 ;младшие 16 бит накопления
A_SetA LD DE,0 ;младшие 16 бит приращения
ADD HL,DE
LD (A_NumA+1),HL ;накопление
A_NumB LD A,0 ;старшие 8 бит накопления
A_SetB ADC A,0 ;старшие 8 бит приращения
LD (A_NumB+1),A ;накопление
JR NC,B_NumA
LD A,C ;смена полупериода волны
XOR %00000001
LD C,A
B_NumB .... ;тон канала B
Масштаборующий коэффициент вычисляется по следующей формуле:
K=(NumA+65536*NumB)/(65536*256)
K=0-0,99999994 точность до 0,01Hz
Frq=Fgsi*K где Fgsi=12500Hz
Генератор шума сильно упрощен и очень далек от реальной схемы
генеретора шума AY. Ситуация еще больше усугубляется малой ча-
стотой дискретизации, которая позволяет использовать коэффици-
енты деления для частоты шума только в пределах от 18 до 31.
Реализация генератора случайной последовательности бит для ге-
нератора шума и миксера:
....
LD (N_NumB+1),A ;накопление
JR NC,Mixer
LD A,R ;вычисление псевдослучайного
RRCA ;бита
LD R,A
JR NC,Mixer
LD A,C ;смена полупериода волны для
XOR %00111000 ;всех каналов сразу
LD C,A
Mixer LD A,C ;замаскировать биты полуволн
MixVal OR 0 ;битами миксера
LD L,A ;бит=0 - активный сигнал
....
5.Дополнительные возможности
В эмуляторе AY реализовано два дополнительных регистра R14,R15
выполняющие некоторые дополнительные функции. Регистр R14 пре-
дназначен для управления общей громкостью звука эмулятора и
может принимать значения от 0(минимум) до 15(максимум). Не ре-
комендуется задавать значения больше 15. Код громкости преоб-
разуется по экспоненциальной шкале во внутреннюю громкость ка-
налов GS. Через R15 можно задать один из 4-х законов, по кото-
рым вычисляются выходные значения DAC'ов каналов GS.
6.DAC GS и каналы AY
Как известно, GS имеет четыре 8-ми битных канала A,B,C,D. Для
каждого канала можно задавать "аппаратную" громкость 0-63. Ка-
налы A и B объеденены в левый канал, а C и D - в правый. Соот-
ветствие AY каналов и каналов GS выражает следующая таблица:
┌──────────┬──────────┬─────────────────────┐
│ Канал AY │ Канал GS │ Громкость канала GS │
├──────────┼──────────┼─────────────────────┤
│ A │ A │ 100% (63 R14=15) │
│ B │ B,C │ 50% (31 R14=15) │
│ C │ D │ 100% (63 R14=15) │
└──────────┴──────────┴─────────────────────┘
Регистр R15 позволяет выбрать шкалу громкости по одному из за-
конов:0-линейный, 1-квадратный, 2-экспоненциальный, 3-гипербо-
лический. Следует заметить, что экспоненциальный закон являет-
ся "родным" для AY, поэтому он активен поумолчанию. Квадратный
закон введен как аналог экспоненциального закона, но он имеет
более высокую и насыщеную выходную громкость. Другие законы
носят, скорее, экспериментальный характер.
Эмулятор распространяется в виде исходника и инсталляционной
программы. Исходник можно вставить в свою программу. Инсталляци-
онная программа загружает в GS программу эмулятора AY и переза-
пускает Speccy. Она нужна для работы некоторых уже адаптирован-
ных под эмулятор программ, например PT3+69 by Alone Coder.
Эмулятор AY может найти самое разное приминение. Например, су-
шествует такой девайс, как Turbo Sound (два AY). Уже пытаются
написать под него 6-ти канальный музыкальный редактор. Но, ска-
жем, эмуляторов, поддерживающих данный девайс меньше, чем эмуля-
торов, имеющих в своем арсенале General Sound. Поэтому, новые
программы под 6-ти канальный FM-звук можно адаптировать под обы-
чный AY и мой эмулятор AY на GS. Вообщем, юзайте так, как вам
позволяет ваша фантазия!
Напоследок приведу пример адаптации PT3+69 под эмулятор AY:
-- Последовательность переделки PRO TRACKER 3.69 под GSAYemul --
1. В pt5_368.H найти процедуру OUTAY и заменить ее на:
OUTAY LD HL,frqA ;GSAYemul!
LD BC,#0D00 ;пересылка данных в эмулятор
OUTAY0 LD A,C
OUT (#BB),A
LD A,(HL)
INC HL
OUT (#B3),A
CALL OUTAY1
INC C
DJNZ OUTAY0
LD A,C
OUT (#BB),A
LD A,(HL)
CP B
RET Z
OUT (#B3),A
LD (HL),0
RET
OUTAY1 IN A,(#BB)
RLCA
JR C,OUTAY1
RET
2. В pt3D.H найти процедуру IVOLQ и заменить ее на:
IVOLQ LD (VOL),A ;GSAYemul!
PUSH AF ;глобальная громкость звука
LD DE,#41A6 ;в редакторе
CALL PRF8
LD A,#10
OUT (#BB),A
POP AF
OUT (#B3),A
RET
3. В PTconst.H найти процедуру GETRG и заменить ее на:
GETRG LD (ZZC),A ;GSAYemul!
PUSH DE ;анализатор каналов
LD DE,frqA
PUSH HL
LD H,0
ADD HL,DE
LD A,(HL)
POP HL
LD L,H
LD H,0
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
LD L,E
CPL
AND #0F
ADD A,'SIN
LD H,A
LD A,D
BIT 3,A
CPL
JR Z,$+3
XOR A
AND 7
POP DE
RET
4. В PT369.H найти метку tABOUT и заменить DB с названием реда-
ктора на новое:
DB "-- Pro Tracker v3+69 for GSAYemul v1.0 by Dr.Lion/RSM --"
5. Запускаем сборщик mkpt3.B и переменовываем полученый файл во
что-то вроде PT3+69gs.B
3.10.2004
──────────────────────────────────────────