Этому разделу, несомненно, можно посвятить отдельный труд. Ибо нестандартных решений в этом направлении очень много, хотя они и не сильно распространены. Возможности синтеза звуков средствами самой приставки достаточно скудны, и пригодны пожалуй лишь для генерации спецэффектов, но не музыки (речь идет о pAPU сопроцессоре). Но сэкономив (в очередной раз) на синтезаторе, разработчики NES всёже реализовали возможность расширения аппаратных средств генерации звука. Как и в предыдущих случаях, это расширение должно находится на картридже (а где же еще). Т.е. как альтернативу встроенному pAPU, картридж может содержать свой звуковой процессор (чип-синтезатор). Вписывающийся своими регистрами управления в адресное пространство процессора приставки (как правило в свободные ячейки диапазона $4000-$4FFF), на выходе же имеющий аналоговый сигнал сформированного звука. На разъёме картриджа для этого предусмотрено два контакта (см. приложение 4) – один из них – аналоговый выход с pAPU (встроенного в процессор Денди), второй разведен на звуковой выход с приставки. В случае, если картридж не содержит своего звукового процессора, то эти контакты просто замкнуты. Возможно использование микшера для объединения сигнала pAPU и синтезатора на картридже, возможен и вариант установки двух звуковых процессоров на картридже … но это уже все зависит от разработчиков картриджа. Увы, но картридж содержит ограниченное число игр, а покупать для каждой игры одно и тоже оборудование (хотябы даже один и тот же синтезатор) удовольствие дорогое, и как следствие мало распространенное. Можно отметить, что картридж со всеми возможными расширениями (большое ПЗУ (PRG-ROM, CHR-ROM), дополнительное ОЗУ, видео ОЗУ (экранных страниц), ОЗУ для сохранения игр, звуковой(ые) процессор) намного сложнее и «интеллектуальнее» самой приставки – и соответственно в несколько раз ее дороже (и покупать ради новой игры еще один такой картридж стали бы не многие). Поэтому большинство производителей игр не гнались за качеством а брали дешевизной, используя лишь необходимый минимум (память программ и знакогенераторов, ну и маппер, как вынужденную необходимость). Ну а для звука – что есть – встроенный pAPU, который мы и рассмотрим чуть подробнее ниже.
Сопроцессор pAPU.
Звуковой сопроцессор pAPU является именно той «изюминкой», наличие которой отличает базовый процессор архитектуры MSC6502 и CPU, примененный в NES/Famicom/Dendy. А так как первым «официальным» процессором был (видимо) RicohRP2A03, то и звуковой сопроцессор pAPU получил уже как нарицательное имя 2A03 (хотя входит в состав и других совместимых процессоров и SoC).
И так, pAPU 2A03 представляет собой пятиканальный синтезатор. Причем первые два канала генерируют сигнал прямоугольной формы, третий – треугольной (пила), четвертый – «шум», пятый – «цифровой канал» (дельта-модуляция, DMC). В некоторых «китайских» вариациях Денди (на неизвестной бескорпусной SoC) цифровой канал мог отсутствовать.
Подробное рассмотрение всех особенностей программирования 2A03 достаточно объёмно, даже про нюансы программирования цифрового канала (DMC) писались отдельные статьи. Здесь же (ниже) дадим лишь краткие сведения о pAPU – т.к. в англоязычной документации информация исчерпывающая, а заниматься чисто ее переводом я не стал (да и не думаю, что сегодня кого-либо всерьез заинтересует программирование звука в Денди с нуля или портированием с других источников). По-любому, если я займусь этой темой глобально, эта глава, несомненно, будет дополнена. А пока для общей картины, помимо изложенного выше, приведем таблицу с описанием регистров pAPU (более подробно можно прочитать в англоязычной документации см. приложение 6).
Регистры pAPU выполняют следующие функции:
Регистр (адресация по CPU)
Операция
Назначение
$4000
w/o
Регистр управления канала 1 (Прямоугольник [Square]).
ddlennnn – duty, loop env/disable length, env disable, vol/env (режим, флаг зацикливания, регулирование громкости/пакетный сигнал, значение громкости/размер пакета)
$4001
w/o
Регистр управления генератором канала 1.
epppnsss - enable sweep, period, negative, shift
$4002
w/o
Регистр управления частотой (периодом) канала 1.
pppp pppp - period low (период сигнала – младшая часть)
$4003
w/o
Регистр управления частотой (периодом) канала 1.
lllllppp - length index, period high (длительность, период сигнала – старшая часть)
$4004
w/o
Регистр управления канала 2 (Прямоугольник [Square]). См. описание $4000
$4005
w/o
Регистр управления генератором канала 2. См. описание $4001
$4006
w/o
Регистр управления частотой канала 2. См. описание $4002
$4007
w/o
Регистр управления частотой канала 2. См. описание $4003
$4008
w/o
Регистр управления канала 3 (Пила [Triangle]).
clll llll - control, linear counter load
$4009
-
-
$400A
w/o
Регистр управления частотой (периодом) канала 3.
pppp pppp - period low (период сигнала – младшая часть)
$400B
w/o
Регистр управления частотой (периодом) канала 3.
lllllppp - length index, period high (длительность, период сигнала – старшая часть)
$400C
w/o
Регистр управления канала 4 (Шум [Noise]).
--le nnnn - loop env/disable length, env disable, vol/env period