Программирование Turbo Sound
Данная статья Shiru Otaku опубликована
в бумажном виде в журнале NedoPC#3. Здесь
публикуется по просьбе автора и с согласия
редакции журнала NedoPC.
Выбор чипа
Оба чипа управляются одними и теми же
стандартными портами (#FFFD - выбор регис─
тра AY, #BFFD - вывод значения в регистр
AY). В один момент времени к этим портам
подключается один из чипов, и все выводы в
регистры AY направляются в него.При сбросе
выбирается чип номер 0. Переключение между
чипами производится путём выбора регистра
AY с номером,находящимся вне диапазона су─
ществующих регистров. Выбор регистра #FF
подключает нулевой чип, #FE - первый.
Условная процедура выбора 0-го чипа:
selChip0:
LD BC,#FFFD
LD A,#FF
OUT (C),A
RET
Аналогично происходит выбор 1-го чипа:
selChip1:
LD BC,#FFFD
LD A,#FE
OUT (C),A
RET
Можно сделать простую процедуру,выбира─
ющую нужный чип по его номеру в аккумуля─
торе (0...1):
selChip:
LD BC,#FFFD
AND 1 ; во избежание ошибок
; при числе в аккумуляторе,
; не равном 0 или 1
XOR B
OUT (C),A
RET
Полная совместимость TS со всем ранее
написанным ПО обеспечивается при условии,
что оно не пытается производить выбор
несуществующих регистров AY (на текущий
момент программ, не отвечающих этому усло─
вию, не замечено).
Использование TS
Так как второй чип не имеет собственных
управляющих портов, обеспечивается возмож─
ность использовать любые ранее написанные
процедуры вывода звука без всяких дорабо─
ток. Например,есть две процедуры: проигры─
вающая музыку и проигрывающая звуковые
эффекты. На одном чипе для проигрывания
звуковых эффектов параллельно с музыкой
приходится временно выключать один или не─
сколько каналов музыки, чтобы дать возмож─
ность проиграться звуковому эффекту. При
наличии Turbo Sound можно запустить музыку
на одном чипе, а эффекты на втором,исполь─
зуя те же процедуры. Нужно только вставить
переключение чипов между ними.
Например, было:
CALL musicPlay
CALL soundPlay
Стало:
CALL selChip1
CALL musicPlay
CALL selChip0
CALL soundPlay
При отсутствии TS новый вариант будет
работать точно так же, как старый.
На текущий момент не существует специа─
лизированных плееров музыки под TS. Но в
тестовых целях возможно осуществить такое
проигрывание, создав два обычных трёхкана─
льных модуля (в каждом из них должно соде─
ржаться по три канала шестиканальной ком─
позиции) и откомпилировав их в разные ад─
реса. Для проигрывания достаточно будет
сделать следующее:
CALL selChip1
CALL player1
CALL selChip0
CALL player0
При этом каждому из плееров не нужно
знать, на какой чип он выводит данные.
Важный момент: после завершения работы
с TS нужно выбирать нулевой чип. Также это
нужно делать перед выполнением программно─
го сброса.В противном случае возможны про─
блемы с работой устройств, подключаемых к
портам ввода-вывода AY, так как на разъём
TS заводятся только линии портов ввода-вы─
вода нулевого чипа. Примеры кода,приведён─
ные выше, учитывают это требование.
Другие реализации Turbo Sound
Всё вышесказанное относилось к работе с
TS версии NedoPC. Но существует также два
старых варианта схемы Turbo Sound: QUADRA
от Amazing Soft Making и вариант TS от
Power of Sound.
Вариант QUADRA полностью несовместим с
NedoPC TS - в нём предполагается наличие
собственных управляющих портов для второго
чипа (#EEFD - выбор регистра AY, #AFFD -
вывод значения). Поддержка этого варианта
схемы лишена смысла ввиду его непопулярно─
сти и полном отсутствии программного обес─
печения.
Вариант TS от Power of Sound поддержан
в единственном на данный момент редакторе
шестиканальной музыки, Turbo Sound Editor.
С точки зрения программирования он отлича─
ется только способом переключения чипов,
что позволяет легко добавить его поддержку
в создаваемом для NedoPC TS программном
обеспечении.Для этого достаточно предоста─
вить пользователю возможность выбора типа
TS и соответствующим образом доработать
процедуры выбора чипа.
Переключение чипов в PoS TS происходит
посредством вывода значения 0..1 в порт
#1F (номер выбираемого чипа соответствует
выводимому значению).
Ниже приводится вариант универсальной
процедуры выбора чипа по его номеру в ак─
кумуляторе. Предполагается,что тип TS сох─
ранён по адресу chipType+1, нулевое значе─
ние соответствует варианту TS от NedoPC,
ненулевое - варианту от PoS.
selChip:
AND 1
chipType:
LD B,0 ; вместо нуля присутствует
;число, соответствующее типу
TS
DEC B
JR NC,chipPoS
LD C,#FD
XOR B
OUT (C),A
RET
chipPoS:
OUT (#1F),A
RET
Автоопределение наличия и типа TS
Ниже приводится текст процедуры автома─
тического определения наличия и типа TS
(варианты NedoPC и PoS ), использующаяся в
Turbo Sound Editor . Следует учесть, что в
случае невозможности чтения значений реги─
стров AY (встречается в редких случаях)
автоматическое определение работать не бу─
дет.Поэтому желательно предусматривать во─
зможность указания типа TS 'вручную'.
;Turbo-Sound checker by Himik's ZxZ/PoS-WT
;24.05.05 at work ;)
;Found:
;No AY/YM chip on board
;Single AY/YM chip on board
;Turbo-Sound port by PoS & Bitwalker
;(port #1F for swith)
;Turbo-Sound port by NedoPC
;(registers #FE-#FF selection)
ORG #61A8
C_1
DI
XOR A
LD HL,#FE00
LD DE,#FFBF
LD BC,#FFFD
OUT (C),B ;SELECT TS AY0 CHRV
OUT (C),A ;SELECT REG 0
LD B,E
OUT (C),B ;#BF-> REG 0 AY0 CHRV
INC A
OUT (#1F),A ;SELECT TS AY1 POS
OUT (C),C ;#FD-> REG 0 AY1 POS
LD B,D
OUT (C),H ;SELECT TS AY1 CHRV
OUT (C),L ;SELECT REG 0
LD B,E
OUT (C),H ;#FE-> REG 0 AY1 CHRV
LD A,L
OUT (#1F),A ;SELECT TS AY0 POS
OUT (C),L ;#00-> REG 0 AY0 POS
INC A
OUT (#1F),A ;SELECT TS AY1 POS
LD B,D
OUT (C),D ;SELECT TS AY0 CHRV
OUT (C),L ;SELECT REG 0
IN A,(C) ;READ BYTE FROM REG 0
CP C
;переходим, если найден TS by NedoPC
JR Z,TS_ENABLE_CHRV
;переходим, если найден TS by PoS
CP #FE
JR Z,TS_ENABLE_POS
;переходим, если ни одного чипа не найдено
CP #FF
JR Z,NO_AY
C_2
;найден только один чип
TE_DISABLE
LD A,1
OUT (#FE),A
RET
NO_AY
LD A,2
OUT (#FE),A
RET
TS_ENABLE_CHRV
LD A,4
OUT (#FE),A
RET
TS_ENABLE_POS
LD A,6
OUT (#FE),A
RET
DISPLAY /A, "Length: ",C_2-C_1
Shiru (NedoPC team)
Ред.: Полагаю, на сегодняшний момент
поддерживать вариант PoS не имеет никакого
смысла - переделка TS by PoS под стандарт
NedoPC ничего не стоит и даже упрощает
схему (исчезают D3 и D4.1, на 1/D4 подаёт─
ся 10/D1, а на 2/D4 подаётся инвертирован─
ное данное D7 ).
В приложении ищите 6-канальный модуль
X-agon'а, скомпилированный под NedoPC TS.
Кроме того, в архиве должно лежать 4 трека
Shiru Otaku (каждый состоит из двух pt3-
модулей) - это ремиксы известных мелодий с
приставок.