Свой очередной ретро-проект я решил посвятить исправлению одного из наиболее слабых мест излюбленного мной Apple ][+: его аудио. Так что предлагаю вместе разобраться с AY-3 и углубится в сопутствующие детали!
Хватит порочить имя Apple ][!
Почему я столь критичен? Все же Apple ][ снабжен лучшим встроенным звуком из всей «тройки 1977». Этим я хочу сказать, что он, в принципе, имеет такую возможность, тогда как его прямые конкуренты PET 2001 и TRS-80 Model 1 изначально были ее лишены.
Конечно же, когда инженеры Commodore добавили в свой PET аналогичный pc-спикер, а пользователи Tandy поняли, что могут использовать микрофонный вход для аудио, это преимущество было нивелировано. А чуть позже в 1979 году 8-битные компьютеры Atari порадовали домашних пользователей аудиоплатой POKEY. Но мы все же говорим о 1977!
И что вообще представляла из себя эта поддержка звука? В Apple ][ есть лишь встроенный динамик без какого-либо другого вывода аудио. Управляется динамик программным коммутатором, который как-бы представляет адрес памяти, но по факту к ней не относится.
Процессор 6502 способен обращаться только к памяти, поэтому все вводы-выводы должны быть представлены для него в виде ее адресов. В данном же случае спикером управляет адрес
$C030
(в десятичной системе это значение 49200, и оно пригодится нам чуть позже). Подобное представление ввода-вывода через память может показаться странным, но на деле используется даже сегодня.И когда я говорю «управляет динамиком», то буквально это и имею в виду.
Динамик – это бумажная диафрагма, управляемая электромагнитом. Одна запись в адрес включает этот электромагнит, а очередная запись его отключает. Но это крайне низкоуровневое представление. Для генерации мелодии с частотой 1000 Гц, например известной мелодии загрузки Apple ][, необходимо производить запись в адрес 2000 раз в секунду. При этом нельзя забывать, что стоковая модель не имеет таймеров или прерываний. Единственный способ реализации – это подсчитывать циклы, отталкиваясь от тактовой частоты процессора.
Давайте посмотрим и послушаем, насколько все это ограничено в реальности. Если у вас есть Apple II или эмулятор, зайдите в Applesoft и введите
X=PEEK(49200)
, где X
может быть любой переменной. (Я просто использовал X
и никогда не придавал этому значения. Поскольку процессор и BASIC думают, что считываем мы из памяти, то им нужно куда-то помещать результат). Вы можете ничего не услышать, но если все же услышите, то это будет едва заметный щелчок. Теперь введите следующее:10 X=PEEK(49200)
20 GOTO 10
В результате должен зазвучать низкий звук, подобный этому (записан с вебкамеры):
Если вы измените программу, как показано ниже, то услышите, как звук затухает и сменяется серией щелчков. Всего одна команда BASIC делает его очень медленным.
10 X=PEEK(49200)
20 PRINT "NYA"
30 GOTO 10
Этот низкий тон является, пожалуй, самым высоким, какой можно получить в BASIC. Естественно, с ассемблером можно добиться большего, так как работает он намного быстрее. ПЗУ Apple ][ включает подпрограмму звукового сигнала, к которой можно обратиться через вызов
CALL -16336
, хотя в итоге вы, конечно, окажетесь в управляющей программе. Джереми Пэриш в своей серии NES Works на YouTube отмечает, что приставка Famicom/NES разрабатывалась под игру Donkey Kong. При этом компьютер Apple ][ также разрабатывался под одну игру: Breakout. Реализовав ее аппаратно для Atari (хотя его проект так и не был использован), компьютерный энтузиаст Стив Возняк захотел создать ПК, который смог бы запускать эту игру в BASIC. И ему это удалось.
Скриншот выше был сделан с помощью Framemeister, отсюда и этот ужасный радужный эффект в тексте. Безусловно, это устройство не особо подходит для работы с Apple ][, о чем говорилось в статье про апскейлеры композитного видео (англ.). Я же использую его в качестве инструмента захвата за высокую гибкость и разнообразие входов.
В Breakout реализовано несколько звуковых сигналов, но до симфонии далековато
Под Apple ][ определенно есть программы, которые вытворяли с его динамиком невероятные вещи. Но если вам вдруг интересно, почему во многих играх параллельно с самой игрой не воспроизводится музыка, то проблема в том, что ее воспроизведение занимает все внимание ЦП. Реализация точного тайминга – это боль.
Хотя Стив Возняк нашел выход. Ведь Apple][ пережил всех своих соперников не с проста – решающую роль сыграли слоты расширения. По правде говоря, я бы не отказался от их большего числа.
Появление аудио платы
Приведу простую аналогию с речевым аппаратом человека. К примеру, я могу издать голосом определенный тон, а также поднять его выше или опустить. Лично для меня это ощущается так, будто я просто меняю высоту голоса. Естественно, при этом мышцы у меня в гортани сокращаются с разной скоростью, но мне не нужно управлять ими напрямую.
А что, если бы мы могли дать аналогичную возможность Apple ][? В отличие от человеческого мозга, этот компьютер не может самостоятельно научиться петь, но зато в него можно вставлять модули, что оказывается вполне справедливым компромиссом.
Внимание! Mockingboard:
Это репродукция оригинального дизайна с кое-какими новшествами и доработками, которую сегодня можно приобрести на сайте ReactiveMicro. (ссылка не партнерская, этот экземпляр я купил за собственные средства). Оригинальная Mockingboard была выпущена в 1983 году. К сожалению, в данной ревизии есть посадочные площадки под речевые микросхемы, но нет самих микросхем, так что компьютер со мной сегодня не заговорит.
Вы можете спросить, почему Apple не разработали тогда звуковую карту сами. Ведь они же выпустили, например Super Serial Card и Disk ][, которые стали стандартом. Вероятно, синтез музыки не рассматривался компанией как необходимая функция для аудитории малого бизнеса, энтузиастов и школ. А может быть тогда они еще беспокоились об Apple Corps.
Как бы то ни было, Apple IIgs должен был все изменить, но вышел он только в 1986, а его аудио-оборудование не имело обратной совместимости. Что же касается 8-битных Apple ][, то для них это было самым типичным решением или, по крайней мере, самым поддерживаемым со стороны ПО.
Конечно, установить карту в Apple ][ достаточно просто. Я определяю ее в слот 4, хотя это вовсе не обязательно, так как многие программы сами обнаружат подключение. Но поскольку слот 4 был открыт, я все же решил сделать это вручную. Спикер я переподключать не стал только потому, что боялся запустить машину и не услышать знакомый сигнал в случае ошибочной настройки аудио. На такой риск я пойти не могу.
Так как же она звучит? В основе Mockingboard лежит микросхема General Instrument AY-3-8910. Это трехголосый чип, о котором я в своем блоге уже писал. Да-да, все это возвращает нас к Pitfall II. Именно такая микросхема использовалась в компьютере MSX, а также в 16-битном Intellivision, Vectrex, Amstrad CPC и многих других машинах. Он несколько схож с SN76489, о которой я писал в постах Master System и Sega System 1.
Для справки: AY-3-8910 зачастую называется просто AY-3, так как в контексте звука этого достаточно, чтобы понять, о чем речь. Но в General Instrument данное обозначение использовали для широкого спектра микросхем; к примеру, для AY-3-8500, которая применялась при создании игр типа «падл-теннис». Этот чип имел аудиовыход, так что, думаю, его можно было бы использовать в качестве наисложнейшего для программирования синтезатора, но оно бы точно того не стоило.
Предлагаю вспомнить, как звучала музыка из Pitfall II на MSX:
Кстати, а вы знали, что Pitfall II был выпущен и для Apple ][? Это правда! В плане геймплея игра очень походит на свои версии под домашние ПК и демонстрирует весьма интересный пример графических особенностей Apple ][. Видите черные пятна по краю неба? Фишка в том, что на Apple ][ зеленый и синий не могут «соприкасаться». По этой причине в большей часть игрового мира используется «палитра» из синего и оранжевого, исключая цветовые баги. Думаю, реализация цветов в Apple ][ заслуживает отдельного поста.
Ну да вернемся к звуку. В этой игре он также реализуется через Mockingboard. Хотя я предполагаю, что разрабатывалась она под ранние версии этих плат, в которых устанавливался всего одна микросхема AY-3-8910. И все же в отношении звука игра получилась определенно удачнее и вполне может удивить разницей с версией для MSX.
Предполагаю, что Mockingboard обеспечивает большую фильтрацию, чем оборудование MSX. Хотя еще одним существенным отличием стало то, что игре для Apple ][ не нужно было заботиться о звуковых эффектах. На MSX1 микросхема AY-3 являлась единственным выводом звука, через который должны были проходить и музыка, и звуковые эффекты. А вот у Apple в дополнение к ней имелся pc-спикер, и в этой версии игры все звуковые эффекты передавались именно через него, что позволяло пользователям слышать их даже при отсутствии Mockingboard.
Важно упомянуть, что в Pitfall II возможности Mockingboard используются не на полную. Вообще, в более поздних играх, таких как Ultima V, задействовались даже две таких платы одновременно для получения еще более продвинутого звука. Так что в некотором смысле эта игра выдает лишь четверть тех возможностей, на которые способна Ultima V. Но у меня нет двух Mockingboard.
Приведу простой пример с демо-диска этой звуковой платы – Pop Goes the Weasel в стерео, где задействуется по одной AY-3 на канал. Здесь мы слышим жесткое панорамирование, на которое теперь стал способен не только Amiga.
Как это реализовано?
Построена Mockingboard достаточно просто. Она оснащена двумя VIA (универсальными интерфейсными адаптерами) MOS 6522. На плате используются детали от Rockwell, но WDC, создатели процессоров 65C02 и 65C816, до сих пор продают свою версию 6522. Помните, в начале я писал, что 6502 не может взаимодействовать с чем-либо, не представленным в виде памяти? Так вот 6522 устраняет этот нюанс, предоставляя контакты ввода-вывода общего назначения.
Каждый VIA имеет два порта передачи данных, которые для 6502 выглядят как адреса памяти, но по факту являются линиями ввода-вывода. Mockingboard связывает эти два набора линий с контрольным портом и информационными выводами. Использование двух микросхем VIA обусловлено наличием двух AY-3-8910 (речевые чипы могут взаимодействовать с шиной данных более прямолинейно).
MOS 6522 также использовались в Commodore VIC-20. Именно поэтому дисководы в VIC-20 и Commodore-64 такие медленные: производители перешли к использованию последовательного порта вместо параллельного, планируя задействовать сдвиговый регистр 6522 для тактирования процессов и компенсации отличий в быстродействии. К сожалению, в данном сдвиговом регистре есть баг, который не позволил инженерам Commodore реализовать задуманное. В итоге они наладили управление последовательным портом напрямую, используя ЦПУ, что оказалось намного медленнее.
Как насчет написания кода?
После приведенного в начале статьи рассуждения о BASIC я решил пройтись по всем регистрам AY-3-8910 и попробовать сделать в них запись командами
POKE
и PEEK
. Однако здесь возникают сложности, так что, возможно, вам потребуется отказаться от использования BASIC. Хотя на упомянутом выше демо-диске Mockingboard (кстати, бесплатно доступном на Wiki-странице ReactiveMicro) для удобства пользователя содержится вот что:Если вы все же с этим заморочитесь, то рекомендую пронаблюдать как, начав воспроизведение, вы можете переключиться на выполнение других действий. Звук продолжит воспроизводиться, пока вы непосредственно его не остановите. В этом ключевое преимущество Mockingboard и других синтезаторов звука. Вместо того, чтобы обращаться к динамику каждый раз, когда его бумажный конус должен сместиться, вам нужно подавать ему сигнал, только когда требуется изменить ноту. Это сильно разгружает ЦПУ, позволяя обрабатывать другие задачи, хотя ограничение из-за отсутствия в Apple ][ таймеров по-прежнему сохраняется.
Apple IIgs и далее
Вы можете посчитать, что для Apple IIgs плата Mockingboard не представляет ценности, поскольку эта система оборудована микросхемой Ensoniq, которая однозначно ее превосходит. Тем не менее обратную совместимость не реализовали, поэтому, если вдруг вы захотите запустить на Apple IIgs 8-битное ПО, даже современные программы вроде Nox Anarchist, вам все равно потребуется такая плата. При этом подходящие слоты имеются, но есть один нюанс.
Чтобы настроить слоты для работы с 8-битным ПО, нужно будет установить в панели управления используемый слот как «My Card». А если вы решите использовать
Slot 4
, то придется отключить порт для мыши. Внутренние дополнения в Apple IIgs были сопоставлены с виртуальными слотами, что обычно оказывалось удобным. Тем не менее, как только вы с этим разберетесь, больше проблем возникнуть не должно. Сегодня для любого пользователя Apple ][ наличие платы Mockingboard считается обязательным. Даже удивительно, почему я созрел к ее приобретению только теперь. Быть может, потому что использовал модель ][+, а большая часть соответствующего ПО относится к периоду до 1983 года. Однако, если у вас IIe, и вы хотите воспользоваться преимуществами этих расширений, то одна из таких плат окажется определенно кстати. Например, 8-bit Guy недавно выпустил Attack of the PETSCII Robots для Apple ][, которая поддерживает аудио Mockingboard только при наличии 128 КиБ ОЗУ.