AY-LPT — оригинальный звук для эмулятора ZX Spectrum под DOS и не только


Хотел уже продолжить серию статей про ZX Evolution (первая часть про сборку тут), но тут внезапно (!) разобрался с двумя «железными» проблемами: устранил доставший меня баг с зависанием в моём ZX Spectrum +2 и смог заставить заработать «аудиокарту» на чипе AY-3-8910, которая читала данные из LPT-порта ПК. Про ZX Spectrum +2 я, наверное, расскажу в следующей статье, а вот тему устройств AY-LPT раскрою сегодня.

Предыстория — зачем это понадобилось мне сейчас

Вообще, сама по себе тема вывода звука при эмуляции ZX Spectrum на ПК через отдельную плату с чипом AY-3-8910 или Yamaha YM2149 настолько стара, что уже умерла и похоронена. А всё потому, что актуально это было в конце 90-х и начале 2000-х, когда мощности ПК не позволяли качественно эмулировать звуковую систему типа AY даже с 3 каналами. С тех пор прошло много времени и ПК сейчас может сделать звук AY, пожалуй, даже лучше чем он был когда-то. Но мне таки пришлось немного «понекрофильствовать» из-за того, что когда я ровно год назад начал свой «поход за дискетами» (раз, два, три) для ZX Spectrum, то оказалось, что один из вариантов получить доступ к дискетам TR-DOS — это эмуляторы Спектрума под DOS. Чего я только тогда не перебрал, но найти нормальную звуковую карту (убил кучу времени, перебрал 3 штуки, включая Creative), которая бы работала под DOS, как нормальный Sound Blaster у меня не получилось. В итоге пришлось остановиться на аудиокарте, которая хотя бы нормально эмулировала Adlib и с этим уже вполне можно было жить в играх под DOS и в некоторых эмуляторах ZX Spectrum, но, к сожалению, единственный эмулятор (RealSpectrum), который прилично эмулировал прямой доступ к дисководу намертво вешался при попытке запустить его со звуком. Да, нашелся, конечно, обходной вариант с Windows XP, для которой есть драйвер прямого доступа к дисководу (fdrawcmd.sys), и которая отлично поддерживает любые аудиокарты, но грузить Windows для эмуляции ZX Spectrum?! Поэтому осадочек-то остался, а я обещал в итогах этой серии статей таки уйти от Windows и даже наметил каким образом: а конкретно с помощью отдельной платы AY-LPT, поскольку RealSpectrum такой вариант вполне поддерживал:

Скриншот для Windows, но AY-LPT работает только под DOS

Откладывать это в долгий ящик не стал и прочитав статью на Хабре про подобную плату заказал её одному умельцу. Обошлась она мне вместе с изготовлением платы, всеми компонентами и сборкой в 2 тысячи рублей. Может показаться и дороговато, но чтоб самому паять всё равно потребовалась бы хотя бы макетная плата и все эти компоненты, а их по одной штуке не закажешь. Индивидуальное производство оно недешевое. И ждать пришлось долго: плату я только в мае 2021 года и получил. Сразу опробовал — но не работает: ни в ZX Tune, ни в RealSpectrum. Пришлось огорчиться. И я отложил пока плату в сторону, сходу разобраться не удалось. Тот, кто мне её делал, предположил, что чип Yamaha YM2149F, который он заказывал на Aliexpress может быть нерабочим, поэтому ещё несколько месяцев я убил, заказывая чипы AY-3-8910 сначала тоже на Aliexpress, а затем и на Ebay, потому что первые были точно китайскими, а вот второй — оригиналом. Но и это не помогло. Зато у меня их теперь целая коллекция.

История — как я дорабатывал это устройство

Плата была собрана по этой схеме:

Для начала я проверил всё ли собрано согласно схеме, прозвонил все соединения, но всё было правильно. Потом проверил с включенным питанием — попадает ли оно туда куда надо. Ожидаемо тоже без проблем.

Потом надо было убедится, что по контактам LPT на ножки микросхемы приходят нормальные сигналы от ПК. Для этого пригодилась данная статья и программа XP LPT. Цитирую:

в программе xplpt нажимая кнопочки с 1 по 17, соответствующие пинам порта, проверяем появление питания на контактах LPT кабеля. Когда в программе напротив пина установлено значение 0, то питание на данном пине должно быть в пределах +0…+1 вольт. При установке значения 1 – на контакте соответствующего пина должно появиться напряжение в пределах +3…+ 5 вольт.

Всё тоже оказалось в норме. Тут я зашел в тупик, поскольку не понимал, а что собственно должно приходить от того же ZX Tune? В программе XP LPT я видел, что биты на порту переключаются, но плата-то молчит! Тут меня начало грызть подозрение что что-то тут не так, и эти подозрения усиливал следующий пассаж в статье на Хабре:

В ряде экспериментов выяснилось, что для полного счастья необходимо еще контролировать управляющий сигнал BDIR, поэтому на схеме появился этот сигнал, заведенный на первый пин LPT (Strobe). Сигнал Strobe в LPT инвертированный, и по хорошему нужно бы было поставить транзистор, такой как у сигнала RESET, для обратной инверсии, но можно и просто помнить о том, что если шлем 1, то BDIR = 0 и если шлем 0, то BDIR = 1.

А ещё больше подозрений появилось у меня после того, как я натолкнулся в интернете на вот эту запись. Её автор утверждал, что автор схемы, которую я пытался «починить» использовал свой способ передачи управляющих сигналов SELECT и INIT, отличный от того «стандарта», который использовался в эмуляторах. Возможно, в версии ZX Tune, которая была актуальна лет 8 назад, там всё так и было сделано, но где ж её теперь взять? Эти подозрения и подтвердил в личной переписке автор данной схемы. Проверил я это чисто экспериментально — позакорачивал на чипе ноги DA0-DA7 с BDIR и получил какие-то отрывки частот на выходе. То есть схема-то работает, но сигналы идут не те.

Ну а мне-то ZX Tune нужен был поскольку-постольку, а надо было чтобы работало в эмуляторах Спектрумах. А вот в них скорее всего была применена как раз первая схема, приведенная в той статье и доработанная далее.

Проанализировав обе схемы я порадовался, что дорабатывать особо ничего и не надо — достаточно поменять местами два сигнала (23 и 29 пин микросхемы) убрав «лишний» транзистор, и допаять +5 В и землю на 25 и 24 соответственно (кстати, можно и не допаивать — и так работает). Схему питания можно не менять, да и делитель частоты тоже ( в схеме выше он разведен для 14 МГц кварца, а у меня и так на 3,5 МГц). Сказано — сделано:

Дырочки остались от выпаянных компонент (двух резисторов и транзистора)
А вот тут красными «соплями» оформлено изменение двух сигналов 23 и 29 ног, а жёлтыми — дополнительная земля и питание для 24 и 25 ног.

В ZX Tune данная схема так и не заработала (ожидаемо, но всё-таки печально), а вот эмуляторы Спектрума положительно отнеслись к данному творению и звук появился! И это было хорошо. Плохо было то, что звук был не тот! Он был гораздо выше чем надо, басов невозможно было услышать вообще. Явно что-то не то либо с выходом, либо с делителем частоты кварца. Мысль про выход я сразу отбросил — там по сути происходит только понижение уровня сигнала и микширование 3 каналов звука в стерео, а отпаяв выход я получил с прямо с микросхемы тот же визгливый тембр. На всякий случай убрал резисторы на входы, но другого результата тоже не получил.

Значит дело было либо в самом кварце, либо в делителе. Кварц было проверять не на чем и я уж даже думал собрать схему для проверки кварцевого резонатора, но решил сначала подумать про делитель. Со схемами подобного рода до этого я никогда не сталкивался, но «покурив» мануалы по чипу AY (стр. 29), схему работы микросхемы приведенной там (CD4013), схему работы микросхемы 74HC04N и схемы монтажа кварцевых резонаторов в ZX Spectrum я решил, что сделано-то вроде всё правильно, но мне не нравится прямое подключение кварца к микросхеме сразу к двум входам. В остальных схемах используются диоды, резисторы и конденсаторы и это, наверное, неспроста. И действительно, стоило впаять на каждую ножку кварца по диоду — всё как по волшебству преобразилось и звук стал узнаваемым!

Эмуляторы и прочее ПО с доступом к AY-LPT

ZX Tune, как я уже говорил, не заработал с этой платой, но сначала мне вообще было непонятно — как включить поддержку AY-LPT. Оказывается надо ещё скачать библиотеку InpOut32 и положить DLL в папку ZX Tune. Тогда в настройках появится выбор аудиоустройства aylpt:

Удивительно, но судя по программе XP LPT в Windows XP приложение действительно что-то выдает в порт LPT, то есть это, похоже, единственное приложение работающее не только под DOS.

А вот эмуляторы с AY-LPT работают только в DOS, что логично — в Windows обеспечить стабильную поставку данных в порт проблематично. Из того что я смог проверить лично:

  1. RealSpectrum — поддерживает AY-LPT из коробки, нужно в настройках только установить правильный порт (в шестнадцатеричной системе, обычно 378) по Alt-F12.
  2. Эмулятор Шалаева — поддерживает вывод через плагин AY LPT. Работает, но есть проблемы со скоростью самого эмулятора, очень тяжело настроить стабильную работу на современных ПК.
  3. R80 — поддерживает AY-LPT, неплохо работает в DOS.
  4. Z80 Stealth — программа похоже с самой полной эмуляцией разнообразного спектрумовского звука, может выводить и в порт LPT. Однако у меня он в DOS не запускается, поэтому работоспособность подтвердить не могу.

Ещё натолкнулся на проект ayplayer, но ни одного скомпилированного файла там нет (уж могли бы положить под DOS, не так-то просто сейчас это собрать). На всякий случай собрал в Linux, но играет, конечно же, только в ALSA, как и указано в дисклеймере. В порт LPT выдавать будет только в DOS, если собрать в конфигурации real. Но в DOS можно и эмулятор запустить для этих целей, тем более что в RealSpectrum есть целый режим для этого (по кнопке F8), жаль играет только формат .AY:

Тестирование

Меня безусловно интересовало качество воспроизведения, т.е. имеет ли смысл вывод звука через подобное устройство.

Для проверки я записал несколько композиций через эмулятор и это устройство, через тот же эмулятор, но уже через обычную аудиокарту, а также через тот же музыкальный чип в клоне Спектрума ZX Spider 128. В ZX Spectrum +2 записывать аудио не стал — там всё равно только моно. Для записи выбрал композиции звучащие в заставках Hero Quest и в Space Crusade, поскольку они отличаются друг от друга и максимально раскрывают все нюансы, да и знаю я их неплохо.

Начнём с заглавной музыки Hero Quest. Музыка специфическая и на отдельных нотах можно услышать все неточности:

Hero Quest, DOS, RealSpectrum, AY-LPT, YM2149F

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

Hero Quest, Windows XP, RealSpectrum, аудиокарта

Тут заметил что на Windows XP эмулятор даёт увеличение трека почти на 7 секунд.

И на ZX Spider 128 никаких хрипов не слышно, значит это поведение именно AY-LPT:

Hero Quest, ZX Spider 128, YM2149F

И вообще на ZX Spider 128 звучание максимально сглаженное и приятное. Над аудиотрактом поработали неплохо.

А вот сравним с AY-3-8910 «курильщика», выпущенной в Китае компанией Microchip:

Hero Quest, DOS, RealSpectrum, AY-LPT, AY-3-8910 (Microchip)

Вообще непонятно что играет. То ли опять герцовка не та, то ли микросхема сделана крайне плохо. Склоняюсь ко второму, потому что в ZX Spider 128 она себя ведет похоже. А вот с оригинальной AY-3-8910 купленной на Ebay таких проблем не было, звучит так же, как и Yamaha YM2149.

А теперь титульная композиция Space Crusade. Максимально нажористая, сильно отличается от предыдущей.

Space Crusade, DOS, RealSpectrum, AY-LPT, YM2149F

Тут я хрипов не слышу. Скорее всего используется более короткие звуки, на которых это не слышно.

Space Crusade, DOS, RealSpectrum, AY-LPT, AY-3-8910

Тут я разницы вообще не заметил, хотя в AY разрядность огибающей 4 бита, в отличие от YM, в которой 5 бит. Обратите, кстати, внимание на отрезок с 18 по 21 секунду — резонанс. Не знаю задумки автора мелодии, но получилось не очень хорошо.

Space Crusade, Windows XP, RealSpectrum, аудиокарта

Вроде звучит более «нажористо» (а может просто громкость до конца не выровнял), но вслепую не отличу. Опять же отрезок 18-21 сек. звучит почти точно так же, хотя высоких поменьше и поэтому помягче.

Space Crusade, ZX Spider 128, YM2149F

Опять мне больше всего понравился этот вариант. Да и отрезок 18-21 на нём звучит даже прилично, не вызывает желания тут же вырубить.

Теперь сравним с микросхемой File KC89C72, которая изначально шла у меня к ZX Spider 128:

Space Crusade, DOS, RealSpectrum, AY-LPT, File KC89C72

Да, громче, как и китайские аналоги AY от Microchip, но звук не похож на оригинал. Оригинальные YM или AY звучат гораздо приятнее.

Вот на фото, всё что сравнивал:

Японская Yamaha и американский General Instrument (в центре) оказались гораздо лучше «китайцев» (по краям)

Аналогов типа WF19054, JFC95101 в руках у меня не оказалось, но думаю что окажутся таким же китайским г.

Итого

Я не зря копался с AY-LPT, поскольку мало того, что решил проблему с выводом звука из эмуляторов в DOS, так ещё и узнал много нового (а точнее хорошо забытого старого) и прокачал свои навыки. Также с помощью данной платы можно быстро протестировать аудиомикросхему, не разбирая Спектрум.

Качество звука меня устроило вполне, хотя и есть небольшие хрипы. Возможно, стоило бы доработать аудиовыход, для большей стабильности звука. Ну и неплохо было бы сделать краевой разъем LPT, который мог бы втыкаться прямо в плату ПК, а ещё сделать корпус из алюминия, чтобы не хвататься за электрокомпоненты с риском сжечь их статикой.

P.S. Ну и на закуску для тру олдфагов записал 4 часть мегадемо Lyra II с ПК под FreeDOS, эмулятор RealSpectrum, вывод звука через AY-LPT:

Показываю с полной загрузкой системы от включения до запуска демо

Для сравнения то же мегадемо, но записанное на ZX Spectrum +2 и на ZX Spider 128 (запускалось с реального дисковода).

AY-LPT — оригинальный звук для эмулятора ZX Spectrum под DOS и не только: Один комментарий

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s