Blame | Last modification | View Log | Download | RSS feed
Recoded by Evgeny Muchkin 06.10.1998SysOp of PALLY_STATION tel: 176-74-19(с) STINGER &(с) CYRAX- (*)Руководство по программированиюGeneral Sound.Версия v1.04. Редакция 004.1. Краткие технические характеристики GS.--------------------------------------Процессор: Z80, 12MHz, без циклов waitROM : 32k, 27256RAM : Static Ram 128k всего, 112k доступно для модулей и сэмплов вбазовой версииINT : 37.5 KHz Каналы: 4 независимых 8-и битных канала, каждый с 6-ибитным контролем громкости.2. Краткое описание GS, или много всякой лабуды.------------------------------------------------GS - музыкальная карточка, предназначенная для проигрывания музыкальныхмодулей и отдельных сэмплов (эффектов).Модули для GS - это стандартные Амижные и PCшные 4-х канальные MOD файлы,а сэмплы - как Амижные signed sample, так и PCшные unsigned sample.Проигрыватель MOD файлов в GS является практически полным аналогомProTracker'а на Амиге и создавался при интенсивном использовании исходни-ков ProTracker'a. (Исходники были из Protracker'а v2.1A by Lars "ZAP" Hamre- Amiga Freelancers)MOD Player поддерживает все команды Pro Tracker'а, за исключением двух:Е01 Filter On Амига-специфичная команда, включает фильтр высоких частот.EFX Invert Loop я еще не видел плейера, который бы поддерживал эту коман-ду. Возможно, она поддерживается на каких-то старых плейерах.GS представляет из себя, по-сути, микропроцессорный комплекс со своимпроцессором, ПЗУ, ОЗУ и портами, и абсолютно не зависит от главного процес-сора Спектрума, что позволяет, например, загрузить свой любимый модуль,сбросить Спектрум, загрузить ассемблер и творить под любимую музыку. Softвнутри GS полностью берет на себя задачи проигрывания звука, интерпретациимодуля и т.д. Программирование GS'а сводится к передаче байт за байтом мо-дуля и/или сэмплов, а затем требуется только подавать команды типа: запус-тить модуль, установить глобальную громкость проигрывания модуля, запус-тить сэмпл #09 в канале #02 и т.д.Если предполагается загрузить модуль вместе с сэмплами, то в GENERAL тре-буется загружать вначале модуль, а затем сэмплы.При загрузке модуля очень рекомендуется оставить свободными 2к памяти,т.е. загружать модули длиной максимум 110K. Это условие не является необхо-димым, но его исполнение очень желательно в целях совместимости с последую-щими версиями.Аналогично очень рекомендуется оставлять по 80 байт для каждого сэмпла,например, если требуется загрузить 63-х килобайтный модуль и 18 сэмплов, тоимеем:Total_Sample_Length=112*1024-63*1024-2*1024-18*80=46688 байтЭто суммарная длина сэмплов, которые при таком положении вещей могут бытьзагружены.Если же, например, требуется вычислить, сколько поместится в память GS'а2-х килобайтных сэмплов, то это вычисляется следующим образом:112*1024/(2048+80)=53 сэмпла.В GS'е имеются 4 физических канала, которые и проигрывают звук.Каналы 0 и 1 - левые, а 2 и 3 - правые.3. Интерфейс со Спектрумом.---------------------------На мир GS смотрит при помощи 4 регистров:1. Command register - регистр команд, доступный для записи порт по адресу187 (#BB). В этот регистр записываются команды.2. Status register - регистр состояния, доступный для чтения порт по ад-ресу 187 (#BB).Биты регистра:7 - Data bit, флаг данных6 - Неопределен5 - Неопределен4 - Неопределен3 - Неопределен2 - Неопределен1 - Неопределен0 - Command bit, флаг командЭтот регистр позволяет определить состояние GS, в частности можно ли про-читать или записать очередной байт данных, или подать очередную команду, ит.п.3. Data register - регистр данных, доступный для записи порт по адресу 179(#B3). В этот регистр Спектрум записывает данные, например, это могут бытьаргументы команд.4. Output register - регистр вывода, доступный для чтения порт по адресу179 (#B3). Из этого регистра Спектрум читает данные, идущие от GS.Command bit в регистре состояний устанавливается аппаратно после записикоманды в регистр команд. Сбрасываться в 0 он может только из GS, что сиг-нализирует об определенном этапе исполнения команды.Data bit в регистре состояний может быть установлен или сброшен как пожеланию Спектрума, так и по желанию GS: при записи Спектрумом в регистрданных он аппаратно устанавливается в 1, а после чтения GS'ом из этого ре-гистра сбрасывается в 0. При записи GS в регистр вывода он (все тот же Databit) аппаратно устанавливается в 1, а после чтения из этого порта Спектру-мом сбрасывается аппаратно в 0.Несмотря на то, что регистр данных и регистр вывода расположены в прос-транстве адресов портов по одному и тому же адресу и воздействуют на один итот же бит данных, они являются двумя независимыми регистрами. Значение,один раз записанное в один из этих регистров, остается неизменным в нем доновой записи.Состояние бита данных очень часто неопределено, и если в спецификации ко-манд не определены значения этого бита на опреденных этапах исполнения ко-манды, недопустимо делать какие-либо предположения относительно значенияэтого бита.4. Система команд GS.---------------------Вначале позволю себе небольшое отступление от собственно системы команд.GS, как известно, предназначен в основном для проигрывания модулей и сэм-плов. В данной версии (1.03) GS ROM допукается загрузка одного модуля и/и-ли до 32 сэмплов.Каждый сэмпл при загрузке его в память получает свой уникальный идентифи-катор, который однозначно определяет обращение к данному сэмплу в командах,которые требуют номер сэмпла. Самый первый загруженный сэмпл получает но-мер (handle) = 1, следующий - номер 2, и т.д.То же самое применимо и к модулям, и этот единственный загруженный мо-дуль будет иметь handle=1 после загрузки.Особенностью данной версии является также то, что вначале требуется заг-ружать модуль, а затем уже сэмплы.Особенности описания команд:Команды описываются следующим образом:1. Hex код команды2. Название команды3. Выполняемые действия при исполнении команды4. Формат команды5. Комментарии к командеФормат команды описывается следующим образом:GSCOM EQU 187GSDAT EQU 179SC #NN : Послать код команды в регистр командLD A,#NNOUT (GSCOM),AWC : Ожидание сброса Command bitWCLP IN A,(GSCOM)RRCAJR C,WCLPSD Data : Послать данные в регистр данныхLD A,DataOUT (GSDAT),AWD : Ожидание сброса Data bit, по сути, ожидание, пока GS не приметпосланные ему данныеWDLP IN A,(GSCOM)RLCAJR C,WDLPGD Data : Принять данные из регистра данныхIN A,(GSDAT)WN : Ожидание установки Data bit, по сути, ожидание очередных данныхот GSWNLP IN A,(GSCOM)RLCAJR NC,WNLPКоманды GS:#00 Reset flagsСбрасывает флаги Data bit и Command bit.SC #00WC(Data bit=0, Command bit=0)#01 Set silence (*)Выводит в ЦАПы всех каналов #80. По сути устанавливает тишину.SC #01WC#02 Set low volume (*)Устанавливает громкостx ЦАПов всех каналов в ноль.SC #02WC#03 Set high volume (*)Устанавливает громкость ЦАПов всех каналов в максимум.SC #03WC#04 Set 'E' 3bits (*)Устанавливает в 'E' регистре GS 3 младших бита в соответствии с задан-ным значением (2 младших бита в сущности являются номером канала#00-#03).SD Chan (#00-#07)SC #04WC#05 Out volume port (*)Устанавливает громкость канала, номер которого содержится в 'E', в ука-занное значение. (Команда срабатывает при условии, что 'E' находится впределах #00-#03)SD Volume (#00-#3F)SC #05WC#06 Send to DAC (*)Выводит байт в ЦАП канала, указываемого по 'E'.SD ByteSC #06WC#07 Send to DAC and to volume port (*)Выводит байт в ЦАП ('E') с заданной громкостью.SD ByteSC #07WCSD VolumeWD#08 - то же что и команда #00#09 Sets one's byte volume. (*)Установка громкости канала, номер которого задан в 2х старших битах.SD Byte (ccvvvvvv)SC #09WCcc - Номер каналаvvvvvv - Его громкость#0A DAC output (*)Еще один непосредственный вывод в ЦАП.SD ByteSC #0AWCSD Chan (#00-#03)WD#0B DAC and Volume output (*)И наконец последний вывод в ЦАП с установкой громкости.SD FbyteSC #0BWCSD Sbyte (ccvvvvvv)WDНазначение битов Sbyte как и у к.#09)Команды #01 - #0B служат в основном для построения различных Covox'ови поигрывателей, при этом не слишком углубляясь во внутреннюю структу-ру GS.vvvvvv - Его громкость#0C DAC output (*)Еще один непосредственный вывод в ЦАП.#0C Call SounDrive Covox mode (*)Вызывает режим четырехканального Ковокса, последовательно копирует ре-гистр данных по каналам. Выход из режима автоматически после выводачетвертого байта.SD CH1SC #0CWCSD CH2WDSD CH3WDSD CH4WD#0D Call Ultravox mode (*)Вызывает режим универсального Ковокса, последовательно копирует ре-гистр данных по каналам, число которых регулируется (1-4).В отличие отпредыдущего варианта синхронизация не производится. Выход также произ-водится автоматически по записи последнего байта.SD CHANSSC #0DWCSD CH1SD CH2SD CH3SD CH4CHANS (4-е младших бита) указывает какие каналы будут задействованы -для включения канала соответствующий бит нужно установить.Если каналвыключен, то поступивший байт попадает на следующий включенный канал(если успеет :)#0E Go to LPT Covox modeПереходит в режим одноканального Ковокса, напрямую копирует регистрданных в ЦАПы двух (правого и левого) каналов. Выход из этого режима -запись #00 в регистр команд.SC #0EWCSD \SD \... Это вывод в ЦАПы/SD /SC #00WC#0F Go in Profi Covox mode (*)Переходит в режим двухканального Ковокса, напрямую копирует регистрданных в ЦАПы одного канала, а регистр каманд в ЦАПы второго канала.Выход из этого режима - запись #4Е в регистр данных, затем последова-тельно #0F и #AA в регистр команд.SD #59SC #0FWCSD \SC \SD \SC Это вывод в ЦАПы... /SD /SC /SD #4EWDSC #0FWCSC #AAWC#10 Out to any port (*)Выводит байт вo внутренний порт GS (#00-#09).SD PortSC #10WCSD DataWD#11 In from any port (*)читает байт из внутреннего порта GS (#00-#09).SD PortSC #10WCGD DataWN#12 OUT to 0 port (*)Выводит байт в порт кофигурации GS (#00).SD DataSC #12WC#13 Jump to Address (*)Передает управление по заданному адресу.SD ADR.LSC #13WCSD ADR.HWD#14 Load memory block (*)Загрузка блока кодов по указанному адресу с заданной длиной.SD LEN.LSC #14SD LEN.HWDSD ADR.LWDSD ADR.HSD \WD \SD \WD Блок данных длиной LEN... /SD /WD /#15 Get memory block (*)Выгрузка блока кодов по указанному адресу с заданной длиной.SD LEN.LSC #15SD LEN.HWDSD ADR.LWDSD ADR.HGD \WN \GD \WN Блок данных длиной LEN... /GD /WN /#16 Poke to address (*)Записывает единичный байт по указанному адресу.SD ADR.LSC #16WCSD ADR.HWDSD ByteWD#17 Peek from address (*)Считывает единичный байт из указанного адреса.SD ADR.LSC #17WCSD ADR.HWDGD ByteWN#18 Load DE Pair (*)Загружает регистовую пару DE (относящуюся к GS, не путать с одноимен-ной парой Main CPU) указанным словом.SD B.ESC #18WCSD B.DWD#19 Poke to (DE) address (*)Записывает байт по адресу указанному в DE.SD ByteSC #19WC#1A Peek from (DE) address (*)Считывает содержимое адреса, указываемого по DE.SC #1AWCGD ByteWN#1B Increment of DE Pair (*)Увеличивает пару DE на единичку.SC #1BWC#1C Poke to (#20XX) address (*)Записывает байт по адресу, старший байт которого равен #20.SD ADR.LSC #1CWCSD ByteWD#1D Peek from (#20XX) address (*)читает байт с адреса, старший байт которого равен #20.SD ADR.LSC #1DWCGD ByteWN#1E - #1F Зарезервированы.#F1 - #F2 Зарезервированы.#F3 Warm restartСбрасывает полностью GS, но пропускает этапы определения количествастраниц памяти и их провеки, что очень сильно ускоряет процесс инициа-лизации.SC #F3WC#F4 Cold restartПолный перезапуск GS со всеми проверками. По сути, JP #0000.SC #F4WC#F5 Busy onУстанавливает флаг занятости в #FFSC #F5WC#F6 Busy offУстанавливает флаг занятости в #00SC #F6WCИзначально Busy=#00. Исполнение всех команд в GS выполняется в главномцикле командного интерпретатора. Этот цикл в условном виде можно предста-вить так:1 if Command bit=0 then go to 12 Execute Command3 if Command bit=1 then go to 24 if Playing=0 then go to 15 if Busy=#FF then go to 16 Process Sound7 go to 1Используя команды Busy можно например инициировать проигрывание сэмпловво всех каналах потом скажем изменить параметры проигрывания в каналах апотом запустить это все одновременно. Если же их не использовать то возмож-на такая ситуация: инициируется первый (сэмпл станет проигрываться а толькопотом инициируется второй сэмпл и т.д.)#F7 Get HX Register (*)Получить содержимое регистра HX (GS)HX участвует в обработке флага Busy.SC #F7WCGD HXWN#F8 - #F9 Зарезервированы.#FA Out zero_to_zeroВывод нуля в нулевой (конфигурационный) порт GS. Делает приостановкузвучания музыки до следующего чтения из к.л. порта.SC #FAWC#FB - #FF Зарезервированы.#20 Get total RAMПолучить общий объем доступной памяти на GS. (В базовой версии это 112к)SC #20WCGD RAM.L(Младшая часть)WNGD RAM.M(Средняя часть)WNGD RAM.H(Старшая часть)Total RAM=65536*RAM.H+256*RAM.M+RAM.L#21 Get free RAMПолучить общий об'ем свободной памяти на GS.SC #20WCGD RAM.L(Младшая часть)WNGD RAM.M(Средняя часть)WNGD RAM.H(Старшая часть)Free_RAM=65536*RAM.H+256*RAM.M+RAM.L#23 Get number of RAM PagesПолучить число страниц на GS.SC #23WCGD Number_RAM_PagesВ базовой версии 3 страницы.#24 - #29 Зарезервированы.#2A Set Module Master VolumeУстановить громкость проигрывания модулей.SD Module_Master_Volume [#00..#40]SC #2AWC[GD Old_Master_Volume] - Старая громк.Маленький пример использования данной команды:(Предполагается, что играется модуль)LD B,#40LOOP: LD A,BOUT (GSDAT),ALD A,#2AOUT (GSCOM),AEIHALTDJNZ LOOPLD A,#32OUT (GSCOM),AВышеописанное плавно снижает громкость играющего модуля, а затем останав-ливает его.#2B Set FX Master VolumeУстановить громкость проигрывания эффектов.SD FX_Master_Volume [#00..#40]SC #2BWC[GD Old_FX_Volume] - Старая громкостьАналогично предыдущей команде, но действует на сэмплы.С помощью этих двух команд можно регулировать баланс громкостей модуля исэмплов, и т.п.#2E Set Current FXУстановить текущий эффект. Просто присваивает переменной CURFX это зна-чение. Если какая-либо команда требует номер сэмпла (sample handle), томожно вместо этого номера подать ей #00 и интерпретатор подставит вмес-то этого нуля значение переменной CURFX. (См. команды #38, #39, #40-#4Fдля понимания вышеизложенного.)SD Cur_FXSC #2EWC#30 Load ModuleЗагрузка модуля в память.SC #30WC[GD Module_Handle]-номер модуля(Command bit=0, Data bit=0)SC #D1 (Open Stream-открыть поток)WCSD \WD \... Байты модуляSD /WD /SC #D2 (Close Stream-закрыть поток)WCПример:LD HL,Mod_adressLD DE,0-Mod_lengthLD C,GSCOMLD A,#30CALL SENDCOMLD A,#D1CALL SENDCOMLD A,(HL)LOOP: IN B,(C)JP P,READYIN B,(C)JP M,LOOPREADY: OUT (GSDAT),AINC HLLD A,(HL)INC EJP NZ,LOOPINC DJP NZ,LOOPWAIT: IN B,(C) ;Ждем принятияJP M,WAIT ;последнего байтаLD A,#D2CALL SENDCOMIN A,(GSDAT) ; Номер модуляOUT (GSDAT),ALD A,#31SENDCOM: OUT (GSCOM),AWAITCOM: IN A,(GSCOM)RRCAJR C,WAITCOMRET#31 Play moduleПроигрывание модуля.SD Module_Handle - номер модуляSC #31WC#32 Stop moduleОстановить проигрывание модуля.SC #32WC#33 Continue moduleПродолжить проигрывание модуля после остановки.SC #33WC#35 Set Module VolumeУстановить громкость проигрывания модулей.SD Module_Master_Volume [#00..#40]SC #35WC[GD Old_Master_Volume] - Старая громк.#36 Data on (*)Устанавливает регистр данных в #FF.SC #36WC[GD Data (#FF) ]#37 Reinitialisation (*)Переустанавливает внутренние переменные в исходное состояние.SC #37WC#38 Load FXЗагрузка сэмпла эффекта в память. Загружает беззнаковые сэмплы (PC type)SC #38WC[GD FX_Handle]-номер сэмпла(Command bit=0, Data bit=0)SC #D1 (Open Stream-открыть поток)WCSD \WD \... Байты сэмплаSD /WD /SC #D2 (Close Stream-закрыть поток)WCПри загрузке каждого сэмпла, в памяти GS создается для этого сэмпла заго-ловок, в котором описываются различные параметры сэмпла. После загрузки этипараметры устанавливаются в определенные значения, как то:Note=60, Volume=#40, FineTune=0, SeekFirst=#0F, SeekLast=#0F,Priority=#80, No Loop и внутренняя переменная CurFX устанавливается равнойFX_Handle.Затем командами #40, #41, #42, #45, #46 и #47 можно эти значения по умол-чанию сменить на свои. Это требуется потому что команда #39 для инициациипроигрывания сэмпла использует значения параметров из заголовка сэмпла.В своем естественном виде сэмплы обычно плохо пакуются компрессорами, носжимаемость обычно можно поднять, если перевести сэмпл в Delta-вид, т.е.хранить не абсолютные значения сэмпла, а относительное смещение относи-тельно предыдущего байта. Примерно вот так вот можно перевести сэмпл вDelta-вид:LD HL,Start_of_sampleLD DE,0-Length_of_sampleLD C,#00LOOP: LD A,(HL)SUB CLD C,(HL)LD (HL),AINC EJP NZ,LOOPINC DJP NZ,LOOPА вот как можно закачать сэмпл:LD IX,ParametersLD HL,Sample_adressLD DE,0-Sample_lengthLD C,GSCOMLD A,#38CALL SENDCOMLD A,#D1CALL SENDCOMLD A,(HL)LOOP: IN B,(C)JP P,READYIN B,(C)JP M,LOOPREADY: OUT (GSDAT),AINC HLADD A,(HL)INC EJP NZ,LOOPINC DJP NZ,LOOPWAIT: IN B,(C) ;Ждем принятияJP M,WAIT ;последнего байтаLD A,#D2CALL SENDCOM; Теперь переопределяем параметры; сэмпла по умолчанию своими; значениямиLD A,(IX+#00)OUT (GSDAT),A ; НотаLD A,#40CALL SENDCOMLD A,(IX+#01)OUT (GSDAT),A ; ГромкостьLD A,#41SENDCOM: OUT (GSCOM), AWAITCOM: IN A,(GSCOM)RRCAJR C,WAITCOMRET#39 Play FXПроигрывание эффекта.SD FX_Handle - номер сэмплаSC #39WCПри исполнении этой команды происходит следующее: смотрятся каналы, ука-занные в SeekFirst параметре нашего сэмпла, и если хотя-бы один из них сво-боден, в нем и проигрывается сэмпл, в противном случае смотрятся каналы,указанные в SeekLast и если один из них свободен, в нем и играется сэмпл,если свободных нет, то просматриваются все каналы, указанные SeekLast, изних выбирается канал с наименьшим приоритетом и сравнивается с приоритетомнашего сэмпла (имеется в виду сэмпл, который мы хотим проиграть), если уэтого сэмпла будет больший приоритет, чем у сэмпла, уже играющего в канале,то играющий в канале сэмпл будет остановлен, а наш сэмпл будет запущен вэтом канале вместо старого сэмпла. Вот такая вот приоритетная схема...Тогда сэмпл запускается в канале, то его нота, громкость и т.п. парамет-ры записываются в область данных канала из заголовка сэмпла.В общем случае, что-бы проиграть сэмпл с нужными параметрами, вы можетеустановить эти параметры после загрузки сэмпла и смело использовать коман-ду #39. Если же параметры должны меняться, то можно поступать следующим об-разом: командой #2E сделать текущим требуемый сэмпл, командами #4x изме-нить его параметры, а затем уже запускать его командой #39.Альтернативный метод запуска сэмплов предоставляют команды #80..#9F, приисполнении этих команд вы прямо в коде команды указываете, в каком каналетребуется запустить сэмпл, и кроме этого, вы можете также указать с какойнотой и/или громкостью требуется запустить сэмпл.#3A Stop FX in channelsустановка проигрывания эффектов в заданных каналах, которые указывают-ся в маске каналов (Channel Mask). В ней единица в n-ном бите указы-вает на то, что эффект в n-ном канале требуется остановитьSD Channel_MaskSC #3AWCОписанное выше есть идеальный вариант работы данной команды, но к сожале-нию не все так просто в этом мире, и эта команда действует не так, а имен-но: единица в бите 7 останавливает сэмпл в нулевом канале, и т.п. В следую-щих версиях это будет исправлено, а пока я могу порекомендовать останавли-вать вообще все сэмплы маской #FF.#3D Set FX VolumeУстановить громкость проигрывания эффектов.SD FX Volume [#00..#40]SC #3DWC[GD Old_FX_Volume] - Старая громкость#3E Load FX (Extended version)Загрузка сэмпла эффекта в память. Позволяет загружать сэмплы со знаком.(Amiga type)SD #01 (Signed sample)SC #3EWC[GD FX_Handle]-номер сэмпла(Command bit=0, Data bit=0)SC #D1 (Open Stream-открыть поток)WCSD \WD \... Байты сэмплаSD /WD /SC #D2 (Close Stream-закрыть поток)WC#40 Set FX Sample Playing NoteУстановка ноты по умолчанию для текущего эффекта.SD Note [0..95]SC #40WCNote=0 C-01 C#012 C-124 C-236 C-3 (C-1 в Амиге)48 C-4 (C-2 в Амиге)60 C-5 (C-3 в Амиге)72 C-684 C-7В данной версии Sound Generators Wave 2, 3 могут воспроизвести октавы 3,4 и 5, поэтому допустимым значением параметра Note является диапазон от 36до 71.#41 Set FX Sample VolumeУстановка громкости по умолчанию для текущего эффекта.SD FX_Volume [#00..#40]SC #41WC#42 Set FX Sample FinetuneУстановка Finetune по умолчанию для текущего эффекта.SD FX_Finetune [#00..#40]SC #42WC#43 - #44 Зарезервированы.#45 Set FX Sample PriorityУстановка приоритета для текущего эффекта. (См. команду #39)SD FX_Priority [#01..#fe]SC #45WC#46 Set FX Sample Seek First parameterУстановка параметра Seek First для текущего эффекта. (См. команду #39)SD FX_SeekFirstSC #46WC#47 Set FX Sample Seek Last parameterУстановка параметра Seek Last для текущего эффекта. (См. команду #39)SD FX_SeekLastSC #47WC#48 Set FX Sample Loop Begin (*)Установка начала цикла для текущего эффекта.SD LEN.LSC #48WCSD LEN.MWDSD LEN.HWDПри равенстве LEN.H - #FF зацикливание не производится#49 Set FX Sample Loop End (*)Установка конца цикла для текущего эффекта.SD LEN.LSC #49WCSD LEN.MWDSD LEN.HWD#4A - #4F Зарезервированы.#51 - #5F Зарезервированы.#60 Get Song PositionПолучение значения переменной Song_Position в текущем модуле.SC #60WCGD Song_Position [#00..#FF]Можно интерпретировать как количество проигранных паттернов модуля. Пос-ле старта модуля принимает значение 0 и увеличивается на единицу послепроигрывания очередного паттерна. Эта переменная может использоваться длясинхронизирования процессов в Спектруме с проигрыванием модуля. Для этогоможно, например, в начале процедуры обработки прерывания сделать SC #60,затем выполнить процедуры различных операций с экраном, скроллинга строчеки т.п. (т.е. чтобы была достаточная для выполнения команды задержка), а за-тем прочитать значение порта 179 (GD Song_Position), и сравнить его с тре-буемым и, в случае равенства, перейти на следующую часть демы, т.е.if (Song_Position==My_Position)then goto Next_Part_Of_Demo#61 Get Pattern PositionПолучение значения переменной Pattern_Position в текущем модуле.SC #61WCGD Pattern_Position [#00..#3F]Получить значение смещения в паттерне (текущий ROW), использование - ана-логично предыдущей команде, однако требуется заметить, что эта величина из-меняется довольно быстро, и поэтомуif (Pattern_Position>=My_Position) then goto Next_Part_Of_Demo#62 Get Mixed PositionПолучить значение Pattern_Position, немного смешанной с Song_Position.SC #62WCGD Mixed_PositionMixed_Position: (по битам)7-Song_Position.16-Song_Position.05-Pattern_Position.54-Pattern_Position.43-Pattern_Position.32-Pattern_Position.21-Pattern_Position.10-Pattern_Position.0Т.е если получить Mixed_Position и сделать с ним AND #3F, то получитсявылитый Pattern_Position, а если после получения его немного RLCA, RLCA,AND #02 - то это будут младшие два бита Song_Position. См. примечания к ко-мандам #60 и #61.#63 Get Channel NotesПолучить ноты всех каналов модуля.SC #63WCGD Note_of_channel_0WNGD Note_of_channel_1WNGD Note_of_channel_2WNGD Note_of_channel_3Если в каком-либо канале значение ноты изменилось с последнего исполне-ния команды #63, то бит 7 полученного заначенияNote_of_channel_Nбудет в нуле, если же это значение то же самое, что и было раньше, то этотбит будет в единице. Младшие семь битов и есть собственно нота от 0 до 95;если это значение равно 127, то это означает, что никакие сэмплы в каналене играют. Данная команда предназначена в основном для построения на ее ос-нове различных анализаторов.#64 Get Channel VolumesПолучить громкости всех каналов модуля.SC #64WCGD Volume_of_channel_0WNGD Volume_of_channel_1WNGD Volume_of_channel_2WNGD Volume_of_channel_3См. описание команды #63#65 Jump to position (*)Делает переход на заданную позицию.SD PositionSC #65WC#66 Set speed/tempo (*)Установка скорости в пределах #01-#1F. При значениях #20-#FF устанавли-вается темп проигрывания. Значения темпа соответствуют оригинальным прискорости равной #06.SD Speed/TempoSC #66WC#67 Get speed value (*)Чтение текущей скорости.SC #67WCGD SpeedWD#68 Get tempo value (*)Чтение текущего темпа.SC #68WCGD TempoWD#6A - #7F зарезервированы.#80 Direct Play FX Sample (#80..#83)Проигрывание сэмпла в заданном канале.SD Sample_NumberSC #80..#83 (Младшие биты определяют непосредственно номер канала, вкотором требуется играть сэмпл) WC#88 Direct Play FX Sample (#88..#8B)Проигрывание сэмпла в заданном канале с заданной нотой.SD Sample_NumberSC #88..#8B (Младшие биты определяют непосредственно номер канала, вкотором требуется играть сэмпл) WC SD Note [0..95] WD#90 Direct Play FX Sample (#90..#93)Проигрывание сэмпла в заданном канале с заданной громкостью.SD Sample_NumberSC #90..#93 (Младшие биты определяют непосредственно номер канала, вкотором требуется играть сэмпл)WCSD Volume [#00..#40]WD#98 Direct Play FX Sample (#98..#9B)Проигрывание сэмпла в заданном канале с заданной нотой и громкостью.SD Sample_NumberSC #98..#9B (Младшие биты определяют непосредственно номер канала, вкотором требуется играть сэмпл)WCSD Note [0..95]WDSD Volume [#00..#40]WD#B0 - #F0 Зарезервированы.Примечание: Команды, отмеченные как (*), являются недокументированнымии в полной мере относятся только к версии 1.04. На работоспособностьэтих команд в последующих версиях автор описания (2) ответственности ненесет.2.Напоминаю, что регистры (их имена), упомянутые в этом описании, отно-сятся только и только к внутренним регистрам GS и никакого отношения крегистрам основного процессора не имеют.5. Heмнoгo лиpики...Автopы GS : ( 2 штуки ;)─── Cлaвa Dangеrous ───(X-Tradе)Eму пpинaдлeжит идeя сoздaния GS'a, aппapaтнaя peaлизaция oнoгo, нeкoтopыeпoжeлaния oтнoситeльнo Soft'a GS'a, a тaкжe Amiga 1200, нa кoтopoй мнoюпpoизвoдились всячeскиe экспepимeнты. Oн eдинстeнный и нeпoвтopимый пpoиз-вoдитeль General Sound'a и имeннo oн зaвeдуeт пpoизвoдствoм и пpoдaжeй GS.─── Stingеr ───Этo я, aвтop сeгo oпусa и пo-сoвмeститeльству душa и сepдцe GeneralSound'a. Я являюсь paзpaбoтчикoм всeгo встpoeннoгo Soft'a в GS'e ипpeдпoлaгaю и дaльшe зaнимaться сим дeйствoм. (Дa, я тaкжe являюсь aвтopoмнeкoтopыx xитpыx нaвopoтoв в aппapaтнoй чaсти GS'a, и был бы aвтopoм eщeмнoгиx, eсли бы нe был всe вpeмя сдepживaeм Cлaвoй, пoстoяннo oзaбoчeннымпpoблeмaми пoнижeния цeны. )Haписaв oкoлo 20 кб кoдa зa пoл-гoдa, пpизaнaться, я нeмнoгo устaл, нoимeю дoвoльнo бoльшиe плaны oтнoситeльнo слeдующиx вepсий GS'a, кaк-тo:- Wave 4 Sound Generators вoспpoизвoдящиx всe oктaвы.- Ускopeниe зa счeт oныx пpoцeнтoв нa 30-40 гeнepaции звукa.- Oчeнь xoтeлoсь бы пpoигpывaниe STM'oв oт PC.- Paзвитaя систeмa кoмaнд.- Paзличныe спeцэффeкты нaд сэмплaми- Xpaнeниe пaттepнoв в зaкoмпpeссoвaннoм видe (oстaeтся oкoлo 15% oтизнaчaльнoгo oбьeмa).- И мнoгoe дpугoeBсe пpoгpaммнoe oбeспeчeниe дoлжнo paбoтaть и нa пoслeдующиx вepсияxпpoшивки, eсли oнo нaписaнo в сooтвeтствии с мoими вышeизлoжeннымипoжeлaниями и тpeбoвaниями. Кpoмe oписaнныx кoмaнд в GS'e сущeствуeт eщeбoльшoe кoличeствo кoмaнд, кoтopыe нe дoкумeнтиpoвaны, и я oстaвляю зaсoбoй пpaвo измeнять иx кaким-угoднo oбpaзoм и тoлькo oтнoситeльнoдoкумeнтиpoвaныx кoмaнд пpиeмлю зaкoнныe пpeтeнзии типa: "B дoкумeнтaциинaписaнo тaк, a в пpoшивкe этo paбoтaeт пo дpугoму... "Я плaниpую знaчитeльнoe paсшиpeниe систeмы кoмaнд, и буду paд кoнстpуктив-ным (жeлaтeльнo кoнкpeтным) пpeдлoжeниям.Taк чтo, eсли вы oзвучивaeтe игpушку или пишeтe музыкaльный peдaктop для GSи oбнapуживaeтe, чтo вaм oчeнь нe xвaтaeт кaкoй-либo кoмaнды, тo звoнитeмнe и выскaзывaйтe пpeдлoжeния. (Teлeфoн, я думaю, oсoбoгo тpудa узнaть нeсoстaвит ;)Sanx 4 moral support:Димa (X-Trade)SParker (XLD)_________________________________________-= THE END =-