PDA

Просмотр полной версии : Реверс-инжиниринг AY-3-8910



Titus
30.11.2025, 17:59
Несколько лет назад мне попалась замечательная работа по транзисторному реверс-инжинирингу AY-3-8910 от deathsoft'а.
Но только сейчас руки дошли сделать из этого логическую схему, попутно исследуя особенности работы чипа.

Итак, начнем (под спойлером):

Особенности работы схемы сброса RES:

1. Генератор шума, счетики периода тона для трех каналов, счетчик периода огибающей и счетчик периода шума сбрасываются в 0.
2. Имитируется выборка всех 16 регистров, на внутреннюю шину B0..7 выдается 0, активируется сигнал REG_WR, по которому одновременно во все 16 регистров записываются 0.
3. Счетчик формы огибающей записывается 0.


Недокументированный выход TEST1:

На выход TEST1 напрямую выдается сигнал F_ENV (выход генератора частоты огибающей).
Таким образом, при желании, если отказаться от подмешивания огибающей в основные каналы, можно получить 4-й независимый голос фиксированой громкости.


Недокументированный вход TEST2:

Если на входе TEST2 логическая '1', то блокируются внутренние сигналы REG_WR и DA_OUT_EN, что фактически эквивалентно отключению AY-3-8910 с шины.
Иными словами, вход TEST2 можно обозначить как /CS (Chip Select).


Глюки при записи новых значений в счетчики тона трех каналов, огибающей, генератора шума:

Из-за того, что запись в регистры не синхронна с тактовой частотой AY-3-8910, если момент записи попадает в активную фазу CNT_CLK, может произойти ситуация, когда компаратор счетчика даст ложное срабатывание. Это происходит потому, что сравнение счетчика со значением регистра происходит в тот момент, когда значение регистра изменяется, т.е. не стабилизировалось. В норме, если у нас в регистре записано число 100, а счетчик досчитал до 10, то при записи нового значения 200, счетчик продолжит считать до нового значения 200. Т.е. периоды будут 100, 100, 200, 200 и т.д. Если же запись произошла в момент активной фазы сравнения (CNT_CLK), то счетчик может сбросится, и мы получим такие периоды: 100, 100, 10, 200, 200 и т.д. Что будет слышиться на слух как щелчок.

Из перечисленного следует, что наиболее благоприятная схема тактирования AY-3-8910 должна удовлетворять двум требованиям:
1. Тактироваться от того же источника, что и процессор, производящий запись в регистры AY-3-8910.
2. Цикл начала записи (нестабильная фаза изменения на шине) не должен попадать на сигнал CNT_CLK. Чего, впрочем, достичь сложно, т.к. цикл CNT_CLK генерируется каждый 8-й такт CLK, и его позиция зависит исключительно от времени окончания сигнала RES.

Резюме - скорее всего избежать случайных 'иголок' при записи новых значений в генераторы тона каналов A,B,C, огибающей и шума - практически невозможно.


Подтягивающие ESD-резисторы на землю:

Все входы имеют защитные ESD-резисторы на землю. Судя по всему, они же являются слабыми (несколько мегаом) подтягивающими резисторами, позволяющими оставлять неиспользуемые выводы в воздухе. Впрочем, лучше этим не злоупотреблять, а сажать неиспользуемые выводы на землю принудительно.


Порты ввода-вывода IOA и IOB:

Порты являются одновременно и входами, и выходами с открытым коллектором, и с внутренними подтягивающими резисторами на плюс питания. При записи в регистры R16 и R17 записываются новые значения в порты IOA и IOB, соответсвенно. При чтении регистров R16 и R17 всегда читается фактическое текущее значение портов, а не содержимое регистров.


Чтение нереализованных битов в регистрах:

При чтении нереализованных битов в регистрах, в нормальных условиях читается 0, т.к. перед циклом чтения внутренняя шина B0..7 предзаряжается нулем. Однако, если цикл чтения будет очень долгим, есть вероятность, что эти биты 'поплывут'.


Генератор шума:

Генератор шума основан на 17-битном регистре сдвига с линейной обратной связью (LFSR) с использованием примитивного многочлена P(x)=x^17+x^14+1 с периодом 131071 циклов.


Нелинейность ЦАП:

Судя по исследованиям реальных чипов AY-3-8910, шкала громкости отличается от идеальной с шагом SQRT(2).

Реальные измеренные значения громкости примерно такие (исследования от DDp):

00: 0.00
01: 0.99
02: 1.43
03: 2.08
04: 3.05
05: 4.57
06: 6.46
07: 10.63
08: 12.79
09: 20.57
10: 29.35
11: 37.23
12: 49.27
13: 63.54
14: 80.55
15: 100.0

Что делает звуковую характеристику AY более пологой, чем на YM, благодаря чему тихие звуки не так теряются на фоне громких, что работает как естественная компрессия.


Изменение наименований сигналов относительно транзисторной схемы deathsoft'a:

RST_1 -> RST
/F1 -> F1
/SEL_EA -> ENV_INV
/F_ENV -> F_ENV
F4 -> F_NOISE
BDIR_1 -> BDIR
BC2_1 -> BC2
BC1_1 -> BC1


Остальные переименования незначительны.



Обновление: Небольшие косметические правки в основной схеме, и добавлена почти синхронная версия схемы, без двунаправленных шин и большинства латчей. Латчи в регистрах оставлены, т.к. переделывание их в триггеры приведет к тому, что момент обновления регистров сдвинется во времени, что приведет к расхождению в таймингах с оригинальным чипом. В оригинальном чипе регистры в момент записи прозрачны для шины, и как только на шине появляется новое значение (еще не стабилизированное в начале цикла записи), оно же появляется в регистрах и сразу доступно компараторам счетчиков.

goodboy
30.11.2025, 21:09
LVD (по этому реверсу) делал verilog модель
https://github.com/lvd2/ay-3-8910_reverse_engineered

Titus
30.11.2025, 21:14
LVD (по этому реверсу) делал verilog модель
https://github.com/lvd2/ay-3-8910_reverse_engineered

Да. Но у них эта модель для симуляции, не для реализации в FPGA. Она не синхронная.

^m00h^
01.12.2025, 00:11
Круто, уже есть реверс-инженеринг ULA, z80, вгшки, теперь ещё и AY. В итоге спек может быть проэмулирован на 99.99% ?

newart
01.12.2025, 00:59
Отечественной ULA нет.

А есть ли фото кристала AY/YM?

Titus
01.12.2025, 01:41
А есть ли фото кристала AY/YM?
Да, в одной из папок по ссылке, которую выше давал goodboy.

xolod
01.12.2025, 05:03
Да. Но у них эта модель для симуляции, не для реализации в FPGA. Она не синхронная.

На основе реверса LVD испанец JOTEGO сделал реализацию AY / YM. https://github.com/jotego/jt49

Titus
01.12.2025, 12:12
На основе реверса LVD испанец JOTEGO сделал реализацию AY / YM. https://github.com/jotego/jt49

Только не LVD, а deathsoft'а.

А YM откуда испанец брал?

Titus
01.12.2025, 18:38
Обновление: Небольшие косметические правки в основной схеме, и добавлена почти синхронная версия схемы, без двунаправленных шин и большинства латчей. Латчи в регистрах оставлены, т.к. переделывание их в триггеры приведет к тому, что момент обновления регистров сдвинется во времени, что приведет к расхождению в таймингах с оригинальным чипом. В оригинальном чипе регистры в момент записи прозрачны для шины, и как только на шине появляется новое значение (еще не стабилизированное в начале цикла записи), оно же появляется в регистрах и сразу доступно компараторам счетчиков.

Titus
01.12.2025, 21:56
Еще раз обновил. Исправил полярность F1. С делителя она шла как F1, а на счетчики приходила как /F1.

- - - Добавлено - - -

И еще раз обновил.
Пересмотрел внимательно транзисторный вариант, и понял, что RS-триггеры в блоках счетчиков сокращать нельзя, т.к. они являются защитой от дребезга при записи в регистры.
Если без них, то от переходных процессов при записи нового значения в регистр может срабатывать не только компаратор, сбрасывая значение счетчика. Но еще и несколько раз бы переключился выход счетчика (TONE_A,B,C, F4, F_ENV). А с RS-триггеры защищают от множественного переключения, хотя и не защищают от сброса счетчика, как было замечено в основном описании.

Titus
02.12.2025, 01:18
Смотря на схему, становится очевидным, что для проигрывания оцифровок через AY можно получить не один набор громкостей на канал (16), а два набора.
Если включить период тона равный 0, и напрямую записывать громкости в канал, то получатся половинные громкости, т.к. высокочастотный ШИМ будет отфильтровываться звуковым трактом.

Titus
03.12.2025, 14:10
Еще раз обновил схемы.
Надеюсь, что это финальный релиз)

На всякий случай скажу, что я не собираюсь делать Verilog/FPGA модель.
Меня реверс интересует исключительно с точки зрения понимания нюансов работы AY и возможной реализации потактовой точной эмуляции.

Titus
03.12.2025, 20:17
Все, теперь точно последняя версия)
Ну, я надеюсь)

newart
04.12.2025, 01:47
Все, теперь точно последняя версия)
Ну, я надеюсь)

А что там с YM? Вдруг там свои нюансы?

Titus
04.12.2025, 02:17
А что там с YM? Вдруг там свои нюансы?

Конечно, YM - это совершенно другой чип, видимо, значительно отличающийся от AY по внутренней архитектуре.
Фотографии у меня нет, реверса тем более.

newart
10.12.2025, 02:50
Давайте сделаем фото. Готов пожертвовать до 3-х чипов.

Titus
10.12.2025, 13:10
Давайте сделаем фото. Готов пожертвовать до 3-х чипов.

Чипов, я думаю, у всех навалом.
Вопрос, кто это сфоткает)

Напиши с этим вопросом туда, где сидят люди этим занимающиеся, а именно на disc*rd, канал emu_russia.

- - - Добавлено - - -

По случайному совпадению, только сегодня там выложили ссылку на, оказывается, уже давно сфотканный кристалл YM (https://ic.onidev.fr/map/YM2149F.html).

Вопрос, кто будет из него рисовать транзисторную схему. Я не буду)

Titus
14.12.2025, 18:15
Снова обновил реверсы в первом посте. У меня был лишний бит в счетчиках каналов тона, исправил.

Начал писать по этому реверсу потактовую эмуляцию AY, и с первого же запуска ВСЁ заработало. Это всегда подозрительно. Но все же нашел лишний бит в счетчиках и исправил.

Titus
14.12.2025, 20:33
Для проверки своей модели сделал тест всех форм огибающей.

Сравнил со Spectaculator 8.0, оказалось у него неправильная форма огибающей с кодом 0x0D. Она должна быть 'атака и удержание', а у него 'атака и спад'.

- - - Добавлено - - -

У EmuZWin форма огибающих правильная. Зато, нет фильтра ВЧ, убирающего постоянку. Если тракт звуковухи сам постоянку не фильтрует и усилитель тоже, то динамики могут быть в смещенном состоянии, что может ухудшить качество звука. Впрочем, наверняка хоть в какой-нибудь цепочке (скорее всего усилок) фильтр убирающий постояннку есть.

А вот у Spectaculator'а не просто постоянка, у него еще и дополнительное смещение вверх, видимо, от сложения с бипером, который в спокойном виде имеет 1.

Titus
16.12.2025, 18:11
В общем, потестировал свою модель, сделанную точно по реверсу.
Погонял в разных играх и демах, звучит идеально, как настоящий AY, на сколько я его помню (давно вживую не слушал).

Единственное, есть одно замечание к потранзисторному реверсу deathsoft'а. Та схема тактирования, которая у него изображена, а именно соотношение фаз F1 и CNT_CLK должны приводить к тому, что счетчики периодов будут считать на 1 больше, чем надо. Или он что-то напутал, или я чего-то не понимаю. Но пока что по схеме именно так. В модели я это исправил, потому что понятно, что будет сразу звучать какофония. Потом как-нибудь проверю этот момент еще раз, ошибка ли это в его реверсе (для этого надо будет найти эти моменты на кристалле и сравнить), или же меня глючит и я не правильно понимаю этот момент)

Titus
20.12.2025, 15:24
Погонял разные жесткие тесты AY на своей модели и на Spectaculator 8.0.
В целом Спектакулятор корректно эмулирует AY, если не считать ошибки с формой огибающей 0x0D, о которой я писал выше.
А вот качество синтезируемого сигнала оставляет желать лучшего. Видимо, это связано с более грубыми таймингами и внутренним шагом квантования AY. Из-за чего сигнал спектрально в целом не очень чистый, а в жестких тестах так вообще полон лишних гармоник.
Пример спектрального анализа (слева EmuStudi AY, а посередине Spectaculator, а справа EmuZWin (все еще хуже)).

https://pic.maxiol.com/images2/1766232661.1585644451.emustudiovsspectac.png

- - - Добавлено - - -

Сравнил с Unreal Fullscreen 48Гц (который заточен под точную синхронизацию с видео).
Оказалось, что у него со звуком все тоже грустно. Мало того, что спектр шумный, да еще и видна неравномерность, видимо, связанная с достаточно грубой подгонкой частоты аудио под кадровую развертку.

Слева EmuStudio AY, справа Unreal Fullscreen 48Гц:
https://pic.maxiol.com/images2/1766233440.1585644451.emustudiovsunreal4.png

newart
21.12.2025, 04:51
Вроде самая верная эмуляция в zxtune?

Titus
21.12.2025, 07:02
Вроде самая верная эмуляция в zxtune?
Не могу потестировать, он не в составе какого-нибудь эмулятора.
Но сомневаюсь, ведь он написан до всяких реверсов.

Dexus
21.12.2025, 11:43
Вроде самая верная эмуляция в zxtune?
Что значит "верная"? Эмулировать не сложно, сложно ресэмплировать до 44.1/48кгц так чтобы не было артефактов. С этим у всех проблема. Меньше всего проблем с этим у ayumi (https://github.com/true-grue/ayumi).

Я сам 5 лет назад делал тест и проверял все эмуляторы до которых мог добраться https://zx-pk.ru/threads/32191-emulyatsiya-ay-ym.html
Результаты: https://docs.google.com/spreadsheets/d/1xSE37ZgbsbdZlU6O4zt4zYxeBoqd1De2jztmIwQJtMQ/edit?gid=0#gid=0

У zxtune эмуляция очень хорошая, но у ay_emul - лучше (чище гармоники на маленьких делителях).
Со спектакулятором8.0 сравниваться вообще плохая идея, там период шумов кривой (но вроде в версии 9.0 есть шанс что исправили), и с гармониками все плохо.

Про некорректную работу делителя D - не знал, это непериодический делитель, и в музыке неприменим, потому как бы и оставался видимо незамеченным, всем пофиг.

Titus
21.12.2025, 12:15
Эмулировать не сложно, сложно ресэмплировать до 44.1/48кгц так чтобы не было артефактов.
В наше время включать виндосовский микшер в режиме 48кГц - это преступление.
Минимум 96кГц. Это умеют почти все звуковухи. Но лучше 192кГц.

Дело в том, что как бы ни был хорош ваш фильтр, который должен срезать все высокочастотные гармоники, на частоте микширования 44.1/48кГц на этот фильтр будут налагаться самые большие требования, т.к. нужна крутизна, скажем, от 20кГц к 22кГц. Фильтры с такими характеристиками имеют (возьмем крутой sinc-фильтр):

1. Задержку
2. Пред- и пост-осцилляцию
3. Порезанные углы у меандров

И иначе сделать фильтр с такой крутой полосой среза невозможно.
В лучших эмуляторах характеристику sinc берут такой, чтобы осцилляция была направлена только вперед, это лучше ее маскирует. Но смысл все равно остается.

В случае же частот микширования 96кГц и выше, требование к фильтру в разы облегчается, т.к. частота Найквиста уже лежит за километр от 20кГц.

В этом случае можно отфильтровать все паразитные гармоники, но оставить прекрасные меандры (если хочется).

Dexus
21.12.2025, 13:03
В наше время включать виндосовский микшер в режиме 48кГц - это преступление.
Минимум 96кГц. Это умеют почти все звуковухи. Но лучше 192кГц.

Да не, вполне используется, всеми. Ухо все равно не слышит больше 20кгц. Накой такое разбрасывание ресурсов?
Даже если 192 будет - все равно будут гармоники, и они будут до слышимого диапазона доходить вполне отчётливо и неприятно.

3. Порезанные углы у меандров
Это вот вообще не играет роли. Эти порезанные углы теоретически добавяли бы частоты выше 20кгц, которые все равно не слышно. Не стоит горевать о неслышимом.

А задержки там на порядок меньше того, что дают wsapiшные или любые другие схемы аудиовоспроиведения, вплоть, до думаю, даже 1мс от ASIO. А по факту сейчас меньше 80мс задержки только за счет буферов - не бывает.

Titus
21.12.2025, 13:12
Да не, вполне используется, всеми. Ухо все равно не слышит больше 20кгц. Накой такое разбрасывание ресурсов?
Даже если 192 будет - все равно будут гармоники, и они будут до слышимого диапазона доходить вполне отчётливо и неприятно.
Ухо не слышит даже больше 15кГц. Но это не имеет отношение к теме, потому что все гармоники, которые ушли выше, они многократно будут переотражаться вниз, и по попадут в диапазон 0..20кГц.
Именно для этого надо ставить 96 или 192кГц, чтобы верхние гармоники значительно ослабли отражаясь не от 22кГц, а от 48 и 96кГц соответственно. И при этом их гораздо легче подавить фильтром в столь широком диапазоне.

Dexus
21.12.2025, 14:50
> Именно для этого надо ставить 96 или 192кГц,

Никто не будет этого делать кроме особых людей. 95% сидят на 44.1 и 48. Просто прими это как данность и строй остальное исходя из этого.

> И при этом их гораздо легче подавить фильтром в столь широком диапазоне.

Не легче а тяжелее. Потому что все равно все переотражния доберутся до 50гц-15кгц, и подавлять их будет тяжелее потому что просто в разы большего размера окно понадобиться (и коэффициентов соответственно) для FIR фильтра.


Рекомендую создать код SINC ресэмплера для 44.1 и для 192 и сравнить уровни гармонических артефактов, и того какой ценой % процессора эти уровни достижимы.

Titus
21.12.2025, 15:43
Рекомендую создать код SINC ресэмплера для 44.1 и для 192 и сравнить уровни гармонических артефактов, и того какой ценой % процессора эти уровни достижимы.
Я не использую SINC-фильтр. Я использую качественный интегратор, что дает самые минимальные искажения из возможных.

Я сравнивал 44 и 192. Разница видна, разумеется.

- - - Добавлено - - -


Никто не будет этого делать кроме особых людей. 95% сидят на 44.1 и 48. Просто прими это как данность и строй остальное исходя из этого.
Если человеку лень зайти в настройки винды и поставить хотя бы 96кГц, я согласен считать его особым человеком и предоставить ему возможность слушать более альясинговый звук, чем он мог бы услышать на 96 и 192.

Dexus
21.12.2025, 17:53
Особые люди - это которые ставят 24бита 192КГц. Они же нередко верят в зависимость качества звука от % содержания кислорода в проводах. 99% довольствуются стандартными 16 битными 48/44.1, и блютусным наушниками..
На кого ориентируется твой софт? Для чего он вообще? В эмуляторах фильтрация вообще нередко на 16КГц обрубает. А то и на 11КГц (для имитации RF). Никто не будет ставить 96КГц просто потому что ты так хочешь.

Lethargeek
21.12.2025, 18:15
Я сравнивал 44 и 192. Разница видна, разумеется.
сколько килогерц у оригинала (включая аудиотракт с наводками и динамик) и насколько там прекрасны меандры?

newart
21.12.2025, 20:02
Не могу потестировать, он не в составе какого-нибудь эмулятора.
Но сомневаюсь, ведь он написан до всяких реверсов.

Почему не можешь? Если у теюя какой-то экзотический трек, его можно в .Z80 / .SNA сохранить и проиграть через zxtune.

Titus
21.12.2025, 21:29
сколько килогерц у оригинала (включая аудиотракт с наводками и динамик) и насколько там прекрасны меандры?

3.5Мгц/16 =218кГц.

- - - Добавлено - - -


Почему не можешь? Если у теюя какой-то экзотический трек, его можно в .Z80 / .SNA сохранить и проиграть через zxtune.

Я не знал, что zxtune кушает .Z80

Lethargeek
21.12.2025, 21:35
3.5Мгц/16 =218кГц.
для особо невнимательных еще раз:

включая аудиотракт с наводками и динамик
юзеры оригинала точно могли слышать качество хотя бы как 44кгц сейчас в эмулях?

Titus
21.12.2025, 22:16
для особо невнимательных еще раз:

юзеры оригинала точно могли слышать качество хотя бы как 44кгц сейчас в эмулях?

Такое ощущение, что вы меня не читаете)

Частота семплов виндовс нужна не для того, чтобы вы услышали >15 кГц, а для того, чтобы вы не получили множество отраженных гармоник, т.к. при такой частоте семплирования их отсеять не портя форму сигнала - проще всего.

Dexus
22.12.2025, 09:01
для того, чтобы вы не получили множество отраженных гармоник, т.к. при такой частоте семплирования их отсеять не портя форму сигнала - проще всего.
Смахивает на логику строителей винды11, которые меню пуск и таскбар на джаваскрипте запилили. Всё равно же дохрена мощностей, давайте требования повышать.

Вообще, достаточно просто нормальные фильтры использовать, и отраженных гармоник даже на 44100 не будет слышно, как в том же Ayumi и древнейшем ay_emul.

Решать проблемы брутфорсом - зумерский, а не спектрумистский путь.

Кроме того, давайте на забывать о таком:
https://volutar.eu5.org/audio44.png

Titus
22.12.2025, 14:59
Вообще, достаточно просто нормальные фильтры использовать, и отраженных гармоник даже на 44100 не будет слышно, как в том же Ayumi и древнейшем ay_emul.
Давайте остановимся на таком решении:
Все, кто ко мне прислушивается, пусть включают 96кГц и выше.
Кто хочет, пусть пользуется 48кГц, от этого его уши не завянут. Ну будет чуть больше гармоник, хуже неравномерность АЧХ и осцилляции. Но это все копейки.

Pyk
25.12.2025, 18:45
Погонял разные жесткие тесты AY на своей модели и на Spectaculator 8.0.
Можно поинтересоваться, что за тест на скринах? Хочется ради интереса сравнить с моей реализацией AY в Emu80, хотя иллюзий относительно качества и не питаю ;)

Titus
25.12.2025, 19:00
Можно поинтересоваться, что за тест на скринах? Хочется ради интереса сравнить с моей реализацией AY в Emu80, хотя иллюзий относительно качества и не питаю ;)

Да просто смесь меандра, генерируемого программно и огибающей.

Чем удобно, что эмуляция должна быть точной, чтобы гармоники были правильные, а так же удобно эти гармоники наблюдать в анализаторе спектра.

Кинь ссылку на свой эмулятор, если он умеет эмулировать спектрум, я запущу на нем.

Pyk
25.12.2025, 20:51
Кинь ссылку на свой эмулятор
https://emu80.org, та же ссылка всегда в подписи.
Спектрум эмулирует, хотя полноценно тайминги выдерживаются пока только для Пентагона. Но для AY это не важно.

- - - Добавлено - - -

Turbo Sound и General Sound также поддерживаются.

Titus
25.12.2025, 22:41
https://emu80.org, та же ссылка всегда в подписи.
Спектрум эмулирует, хотя полноценно тайминги выдерживаются пока только для Пентагона. Но для AY это не важно.
Ты будешь смяться, я не нашел, как в твой эмулятор Пентагона-128 бросить снапшот .Z80. Вижу только .trd и .tap.

Pyk
25.12.2025, 23:05
бросить снапшот .Z80
Смеяться не буду, так как поддержки снапшотов .z80 в настоящее время в Emu80 нет... :( Пока только trd, tap и tzx со стандартными блоками.
Все-таки Emu80 больше позиционируется как эмулятор других компьютеров, и поддержку Спектрума я хоть и улучшаю, но она не приоритетна.
А вообще надо бы сделать, конечно...

Titus
25.12.2025, 23:34
Сравнил с unrealfix (который на сайте у AAA).

Ужасный звук. Надеюсь, это связано с тем, что сборка 2008 года, и есть более новые.

https://pic.maxiol.com/images2/1766694794.1585644451.clipboard122520250.png

Titus
26.12.2025, 02:56
И для полноты картины звук на ZXMAK2:

https://pic.maxiol.com/images2/1766706958.1585644451.clipboard122620250.png

Titus
26.12.2025, 17:24
Для кучи потестировал, качество биперного звука на разных эмуляторах (на просто меандре 15кГц)

По порядку идут EmuStudio, Spectaculator 9.0, ZXMAK2, Unreal Fullscreen 48Hz:
https://pic.maxiol.com/images2/1766758903.1585644451.clipboard122620250.png