Из журнала Info Guide #8, Рязань, 12.2005 Программирование 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- модулей) - это ремиксы известных мелодий с приставок.