Звук Чипа Ay-3-8910 (Или Yamaha Ym2149F) Родной Для Zx Spectrum На Пк Через Usb

Прошло около года с момента успешного подключение музыкального синтезатора YM2149F к LPT-порту компьютера .

LPT — это, конечно, хорошо, но время не стоит на месте, и найти компьютер или ноутбук с LPT-портом становится все сложнее.

Да и сам автор (то есть я) устал каждый раз лезть под стол, где стоит системный блок, и втыкать плату LPT во что-то другое, например в программатор (у меня есть программатор Willem LPT, но не в этом суть) ).

Поэтому на этот раз мы подключим микросхему YM2149F к USB. И конечно, чтобы соответствовать требованиям эпохи, мы сделаем это на дешевом старинном микроконтроллере.

PIC16F628 .



Звук чипа AY-3-8910 (или Yamaha YM2149F) родной для ZX Spectrum на ПК через USB

Короче говоря, YM2149F (или его функциональный эквивалент AY-3-8910 ) — микросхема трёхголосного аудиосинтезатора, использовавшаяся в старых компьютерах, таких как Atari ST, Amstrad CPC, ZX Spectrum, MSX и некоторых других, для воспроизведения музыки.

В России чип приобрел некоторую популярность благодаря его установке в различные клоны ZX Spectrum. Во время шествия ZX Spectrum по территории бывшего СССР музыканты написали для этого программируемого звукового генератора тысячи мелодий.

И даже сейчас легко можно найти людей, создающих музыку специально для этого чипа.

В конце статьи будут ссылки на огромный архив чип-тюнов для YM/AY на сотни часов непрерывного прослушивания.



Демо

Как и в прошлый раз, перед началом сразу дам ссылку для прослушивания конечного результата: https://soundcloud.com/tronix286 Последние записи были сделаны с этого устройства.

Записывал так себе плеером, который записывает MP3 максимум 128Кб/с, так что в реальности аппарат звучит «ярче».

Но общее представление о звуке получить можно.



Железо

Почему такой странный выбор контроллера? Почему бы не AVR/ARM/iCore i7/FTDI в худшем случае? Частично ответ на этот вопрос был дан в начале темы: для ретро-синтезатора - ретро-микроконтроллер! Более того, AY-3-8910 и Microchip, можно сказать, имеют общие корни.

В общем, возникла череда странных обстоятельств.

Во-первых, я наткнулся в Интернете на библиотеку, реализующую программный стек USB 1.1 для микроконтроллеров PIC16F628 — вот эта библиотека: 16ФУСБ .

Во-вторых, у меня давно лежала и пылилась парочка PIC16F628A, с которой я не знал, что делать.

В-третьих, на компьютере уже было настроенное программное обеспечение (MPLABX, MPASM) и программатор для PIC. Ну, в отличие от программного стека V-USB на известном многим AVR мало или даже нет проектов на ПИКах без аппаратного USB. А это значит, что историческую несправедливость необходимо восстановить.

Вот типовая схема подключения с сайта библиотеки 16fusb:

Звук чипа AY-3-8910 (или Yamaha YM2149F) родной для ZX Spectrum на ПК через USB

В библиотеке 16fusb есть хороший пример под названием «direct-io».

Смысл простой — отправляем байт по USB и он «отображается» на восьми ножках микроконтроллера.

Также можно отправить два дополнительных сигнала управления, то есть еще два бита (или две ножки).

И в обратную сторону, то есть от контроллера к хосту (компьютеру).



Звук чипа AY-3-8910 (или Yamaha YM2149F) родной для ZX Spectrum на ПК через USB

Для управления YM2149F используется восьмибитная шина данных D0-D7 и три сигнала управления BC1, BDIR и RESET. BC1 и BDIR управляют выбором адреса регистра и его значения, а также переводят микросхему в неактивное состояние.

Сигнал RESET используется для сброса всех регистров в исходное значение.

Таким образом, чтение с PIC на компьютер не требуется; Все, что вам нужно, это возможность отправлять команды в YM. И нам нужен третий управляющий сигнал, а значит еще одна ножка МК.

В своей прошивке для управления конкретно YM2149F было сделано следующее:

  • все, что связано с чтением сигналов с PIC на хост (компьютер), выкинуто для увеличения скорости обработки USB-запросов;
  • состояние направлений портов ввода/вывода жестко запрограммировано при инициализации МК и не меняется в процедурах выдачи байтов в ноги.

  • организован кольцевой буфер объемом 64 байта.

    При декодировании запроса от хоста байты добавляются в буфер.

    Когда есть свободное время, данные из буфера выводятся в YM.

  • Оптимизирована скорость выдачи байт на ножки МК.

    Частично из-за жестко запрограммированных направлений ввода-вывода, частично из-за знания предыдущего состояния битов управления.

  • Исправлена ошибка с зацикливанием PIC после нескольких тысяч пакетов (расширен цикл RxLoop в файле isr.asm, вместо goto RxLoop вставлена проверка на признак конца пакета)
  • что-то еще, я не помню
Как уже говорилось выше, нужен еще один управляющий сигнал – RESET, но свободных ветвей нет. Поэтому для тактирования PIC используется кварцевый генератор, а не кварц, тем самым освобождая одну ножку МК (RA6), необходимую для управления сигналом RESET. Торчащая в воздухе ножка RA5 в этом семействе работает только как входная и не может использоваться для управления выходным сигналом.

Можно было бы перенести на него функционал перехвата окончания USB-пакета (EOP) с ножки RB2, но это не так просто - в отличие от ножки RB2, ножка RA5 разделяет функционал с MCLR и VPP по программированию и вход организован внутри как триггер Шмитта.

После диодов просто не хватает напряжения для его срабатывания.

С другой стороны, для тактирования YM2149F собран генератор на микросхеме 74HC02 и кварце 3,579545 МГц.

Я мог бы попытаться использовать вторую свободную половину микросхемы для сборки аналогичного генератора для ПОС, но меня остановили два обстоятельства: 1) у меня нет кварца на 24 МГц (но у меня был кварцевый генератор от какой-то древней матери) 2) Я не знаю, как поведет себя 74HC02, если у него с «разных сторон» разные частоты, и одна из них довольно высокая (24 МГц — это все-таки очень высокая частота).

Еще один вариант освобождения ножки RA6 для кварца: Сигналы BC1 и BDIR принимают только следующие значения:

   

BC1 BDIR 0 0 0 1 1 1

И никогда BC1 = 1, BDIR = 0. Это можно использовать как RESET, добавив логику НЕ и ИЛИ из половины микросхемы 74HC02 и инвертировав выходной сигнал с помощью транзистора.

Конечно, чтобы выводить BC=1 и BDIR=0, нужно немного подправить прошивку.

А еще, ножка RA4, управляющая сигналом BDIR, представляет собой открытый коллектор, поэтому ее необходимо подключить к источнику питания — на схеме это резистор R5 номиналом 10К.



Программное обеспечение

На компьютере в качестве музыкального проигрывателя выступает отличный кроссплатформенный проигрыватель чип-тюнинга.

ZX Тюнинг :

Звук чипа AY-3-8910 (или Yamaha YM2149F) родной для ZX Spectrum на ПК через USB

Он не поддерживает USB напрямую, но если находит в своем каталоге одну из библиотек dlportio.dll/inpout32.dll/inpoutx64.dll, то позволяет переключить настройки вывода звука на YM-LPT ( для предыдущего проекта ), а затем использует функцию __stdcall void DlPortWritePortUchar(unsigned short port, unsigned char val); для вывода байтов YM2149. Порт 0x378 данные, Порт 0x37a передача сигналов управления (D1 - ~BDIR, D2 - BC1, D3 - ~RESET).

Таким образом, можно написать небольшую библиотеку-заглушку с одной-единственной функцией DlPortWritePortUchar, в которой можно перенаправить вывод байтов на USB-устройство, что и было сделано.

Я просто взял исходники библиотеки вход32 за основу и написал функцию-заглушку для перенаправления вывода байтов на это устройство.

В итоге достаточно поставить вот эту библиотеку-заглушку input32.dll или inputx64.dll , в зависимости от версии используемого плеера (x86/x64), в одной директории с плеером ZX Тюнинг , запускаем его и перемещаем устройство в настройках звука айлпт до самого верха (как на скриншоте выше).



Скачать бесплатно и без СМС

Драйвера для Win XP, Win 7 (x32/x64) можно скачать здесь: 16FUSB_driver-libusb-win32-1.2.6.0.zip Схема устройства: ym-usb_scheme_1.0.rar Скомпилированная прошивка (.

hex) и скомпилированные заглушки DLL: ym-usb_firmware_and_DLLs_v1.2.rar Исходники прошивки: ym-usb_PIC16F628A_source_v1.2.rar Исходные коды библиотеки-заглушки: inpout32-64_DLL_source_v1.2.rar Руководство по данным программируемого звукового генератора (PSG) General Instruments AY-3-8910/8912: http://bulba.untergrund.net/AY-3-8910.rar Тема на форуме ZX.PK.ru, из которой «родился» аппарат: http://zx-pk.ru/showthread.phpЭt=22202 Огромный архив трекерной музыки: Модланд ( FTP ) Музыка ZX онлайн: http://zxtunes.com/ Всего наилучшего! Теги: #Звук #ZX Spectrum #chiptune #PIC16 #PIC16 #ay-3-8910 #YM2149F #LPT

Вместе с данным постом часто просматривают: