Blame | Last modification | View Log | Download | RSS feed | ?url?
Recoded by Evgeny Muchkin 06.10.1998
SysOp of PALLY_STATION tel: 176-74-19
(с) STINGER &
(с) CYRAX- (*)
Руководство по программированию
General Sound.
Версия v1.04. Редакция 004.
1. Краткие технические характеристики GS.
--------------------------------------
Процессор: Z80, 12MHz, без циклов wait
ROM : 32k, 27256
RAM : 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 в регистр вывода он (все тот же Data
bit) аппаратно устанавливается в 1, а после чтения из этого порта Спектру-
мом сбрасывается аппаратно в 0.
Несмотря на то, что регистр данных и регистр вывода расположены в прос-
транстве адресов портов по одному и тому же адресу и воздействуют на один и
тот же бит данных, они являются двумя независимыми регистрами. Значение,
один раз записанное в один из этих регистров, остается неизменным в нем до
новой записи.
Состояние бита данных очень часто неопределено, и если в спецификации ко-
манд не определены значения этого бита на опреденных этапах исполнения ко-
манды, недопустимо делать какие-либо предположения относительно значения
этого бита.
4. Система команд GS.
---------------------
Вначале позволю себе небольшое отступление от собственно системы команд.
GS, как известно, предназначен в основном для проигрывания модулей и сэм-
плов. В данной версии (1.03) GS ROM допукается загрузка одного модуля и/и-
ли до 32 сэмплов.
Каждый сэмпл при загрузке его в память получает свой уникальный идентифи-
катор, который однозначно определяет обращение к данному сэмплу в командах,
которые требуют номер сэмпла. Самый первый загруженный сэмпл получает но-
мер (handle) = 1, следующий - номер 2, и т.д.
То же самое применимо и к модулям, и этот единственный загруженный мо-
дуль будет иметь handle=1 после загрузки.
Особенностью данной версии является также то, что вначале требуется заг-
ружать модуль, а затем уже сэмплы.
Особенности описания команд:
Команды описываются следующим образом:
1. Hex код команды
2. Название команды
3. Выполняемые действия при исполнении команды
4. Формат команды
5. Комментарии к команде
Формат команды описывается следующим образом:
GSCOM EQU 187
GSDAT EQU 179
SC #NN : Послать код команды в регистр команд
LD A,#NN
OUT (GSCOM),A
WC : Ожидание сброса Command bit
WCLP IN A,(GSCOM)
RRCA
JR C,WCLP
SD Data : Послать данные в регистр данных
LD A,Data
OUT (GSDAT),A
WD : Ожидание сброса Data bit, по сути, ожидание, пока GS не примет
посланные ему данные
WDLP IN A,(GSCOM)
RLCA
JR C,WDLP
GD Data : Принять данные из регистра данных
IN A,(GSDAT)
WN : Ожидание установки Data bit, по сути, ожидание очередных данных
от GS
WNLP IN A,(GSCOM)
RLCA
JR NC,WNLP
Команды GS:
#00 Reset flags
Сбрасывает флаги Data bit и Command bit.
SC #00
WC
(Data bit=0, Command bit=0)
#01 Set silence (*)
Выводит в ЦАПы всех каналов #80. По сути устанавливает тишину.
SC #01
WC
#02 Set low volume (*)
Устанавливает громкостx ЦАПов всех каналов в ноль.
SC #02
WC
#03 Set high volume (*)
Устанавливает громкость ЦАПов всех каналов в максимум.
SC #03
WC
#04 Set 'E' 3bits (*)
Устанавливает в 'E' регистре GS 3 младших бита в соответствии с задан-
ным значением (2 младших бита в сущности являются номером канала
#00-#03).
SD Chan (#00-#07)
SC #04
WC
#05 Out volume port (*)
Устанавливает громкость канала, номер которого содержится в 'E', в ука-
занное значение. (Команда срабатывает при условии, что 'E' находится в
пределах #00-#03)
SD Volume (#00-#3F)
SC #05
WC
#06 Send to DAC (*)
Выводит байт в ЦАП канала, указываемого по 'E'.
SD Byte
SC #06
WC
#07 Send to DAC and to volume port (*)
Выводит байт в ЦАП ('E') с заданной громкостью.
SD Byte
SC #07
WC
SD Volume
WD
#08 - то же что и команда #00
#09 Sets one's byte volume. (*)
Установка громкости канала, номер которого задан в 2х старших битах.
SD Byte (ccvvvvvv)
SC #09
WC
cc - Номер канала
vvvvvv - Его громкость
#0A DAC output (*)
Еще один непосредственный вывод в ЦАП.
SD Byte
SC #0A
WC
SD Chan (#00-#03)
WD
#0B DAC and Volume output (*)
И наконец последний вывод в ЦАП с установкой громкости.
SD Fbyte
SC #0B
WC
SD Sbyte (ccvvvvvv)
WD
Назначение битов Sbyte как и у к.#09)
Команды #01 - #0B служат в основном для построения различных Covox'ов
и поигрывателей, при этом не слишком углубляясь во внутреннюю структу-
ру GS.
vvvvvv - Его громкость
#0C DAC output (*)
Еще один непосредственный вывод в ЦАП.
#0C Call SounDrive Covox mode (*)
Вызывает режим четырехканального Ковокса, последовательно копирует ре-
гистр данных по каналам. Выход из режима автоматически после вывода
четвертого байта.
SD CH1
SC #0C
WC
SD CH2
WD
SD CH3
WD
SD CH4
WD
#0D Call Ultravox mode (*)
Вызывает режим универсального Ковокса, последовательно копирует ре-
гистр данных по каналам, число которых регулируется (1-4).В отличие от
предыдущего варианта синхронизация не производится. Выход также произ-
водится автоматически по записи последнего байта.
SD CHANS
SC #0D
WC
SD CH1
SD CH2
SD CH3
SD CH4
CHANS (4-е младших бита) указывает какие каналы будут задействованы -
для включения канала соответствующий бит нужно установить.Если канал
выключен, то поступивший байт попадает на следующий включенный канал
(если успеет :)
#0E Go to LPT Covox mode
Переходит в режим одноканального Ковокса, напрямую копирует регистр
данных в ЦАПы двух (правого и левого) каналов. Выход из этого режима -
запись #00 в регистр команд.
SC #0E
WC
SD \
SD \
... Это вывод в ЦАПы
/
SD /
SC #00
WC
#0F Go in Profi Covox mode (*)
Переходит в режим двухканального Ковокса, напрямую копирует регистр
данных в ЦАПы одного канала, а регистр каманд в ЦАПы второго канала.
Выход из этого режима - запись #4Е в регистр данных, затем последова-
тельно #0F и #AA в регистр команд.
SD #59
SC #0F
WC
SD \
SC \
SD \
SC Это вывод в ЦАПы
... /
SD /
SC /
SD #4E
WD
SC #0F
WC
SC #AA
WC
#10 Out to any port (*)
Выводит байт вo внутренний порт GS (#00-#09).
SD Port
SC #10
WC
SD Data
WD
#11 In from any port (*)
читает байт из внутреннего порта GS (#00-#09).
SD Port
SC #10
WC
GD Data
WN
#12 OUT to 0 port (*)
Выводит байт в порт кофигурации GS (#00).
SD Data
SC #12
WC
#13 Jump to Address (*)
Передает управление по заданному адресу.
SD ADR.L
SC #13
WC
SD ADR.H
WD
#14 Load memory block (*)
Загрузка блока кодов по указанному адресу с заданной длиной.
SD LEN.L
SC #14
SD LEN.H
WD
SD ADR.L
WD
SD ADR.H
SD \
WD \
SD \
WD Блок данных длиной LEN
... /
SD /
WD /
#15 Get memory block (*)
Выгрузка блока кодов по указанному адресу с заданной длиной.
SD LEN.L
SC #15
SD LEN.H
WD
SD ADR.L
WD
SD ADR.H
GD \
WN \
GD \
WN Блок данных длиной LEN
... /
GD /
WN /
#16 Poke to address (*)
Записывает единичный байт по указанному адресу.
SD ADR.L
SC #16
WC
SD ADR.H
WD
SD Byte
WD
#17 Peek from address (*)
Считывает единичный байт из указанного адреса.
SD ADR.L
SC #17
WC
SD ADR.H
WD
GD Byte
WN
#18 Load DE Pair (*)
Загружает регистовую пару DE (относящуюся к GS, не путать с одноимен-
ной парой Main CPU) указанным словом.
SD B.E
SC #18
WC
SD B.D
WD
#19 Poke to (DE) address (*)
Записывает байт по адресу указанному в DE.
SD Byte
SC #19
WC
#1A Peek from (DE) address (*)
Считывает содержимое адреса, указываемого по DE.
SC #1A
WC
GD Byte
WN
#1B Increment of DE Pair (*)
Увеличивает пару DE на единичку.
SC #1B
WC
#1C Poke to (#20XX) address (*)
Записывает байт по адресу, старший байт которого равен #20.
SD ADR.L
SC #1C
WC
SD Byte
WD
#1D Peek from (#20XX) address (*)
читает байт с адреса, старший байт которого равен #20.
SD ADR.L
SC #1D
WC
GD Byte
WN
#1E - #1F Зарезервированы.
#F1 - #F2 Зарезервированы.
#F3 Warm restart
Сбрасывает полностью GS, но пропускает этапы определения количества
страниц памяти и их провеки, что очень сильно ускоряет процесс инициа-
лизации.
SC #F3
WC
#F4 Cold restart
Полный перезапуск GS со всеми проверками. По сути, JP #0000.
SC #F4
WC
#F5 Busy on
Устанавливает флаг занятости в #FF
SC #F5
WC
#F6 Busy off
Устанавливает флаг занятости в #00
SC #F6
WC
Изначально Busy=#00. Исполнение всех команд в GS выполняется в главном
цикле командного интерпретатора. Этот цикл в условном виде можно предста-
вить так:
1 if Command bit=0 then go to 1
2 Execute Command
3 if Command bit=1 then go to 2
4 if Playing=0 then go to 1
5 if Busy=#FF then go to 1
6 Process Sound
7 go to 1
Используя команды Busy можно например инициировать проигрывание сэмплов
во всех каналах потом скажем изменить параметры проигрывания в каналах а
потом запустить это все одновременно. Если же их не использовать то возмож-
на такая ситуация: инициируется первый (сэмпл станет проигрываться а только
потом инициируется второй сэмпл и т.д.)
#F7 Get HX Register (*)
Получить содержимое регистра HX (GS)
HX участвует в обработке флага Busy.
SC #F7
WC
GD HX
WN
#F8 - #F9 Зарезервированы.
#FA Out zero_to_zero
Вывод нуля в нулевой (конфигурационный) порт GS. Делает приостановку
звучания музыки до следующего чтения из к.л. порта.
SC #FA
WC
#FB - #FF Зарезервированы.
#20 Get total RAM
Получить общий объем доступной памяти на GS. (В базовой версии это 112к)
SC #20
WC
GD RAM.L(Младшая часть)
WN
GD RAM.M(Средняя часть)
WN
GD RAM.H(Старшая часть)
Total RAM=65536*RAM.H+256*RAM.M+RAM.L
#21 Get free RAM
Получить общий об'ем свободной памяти на GS.
SC #20
WC
GD RAM.L(Младшая часть)
WN
GD RAM.M(Средняя часть)
WN
GD RAM.H(Старшая часть)
Free_RAM=65536*RAM.H+256*RAM.M+RAM.L
#23 Get number of RAM Pages
Получить число страниц на GS.
SC #23
WC
GD Number_RAM_Pages
В базовой версии 3 страницы.
#24 - #29 Зарезервированы.
#2A Set Module Master Volume
Установить громкость проигрывания модулей.
SD Module_Master_Volume [#00..#40]
SC #2A
WC
[GD Old_Master_Volume] - Старая громк.
Маленький пример использования данной команды:
(Предполагается, что играется модуль)
LD B,#40
LOOP: LD A,B
OUT (GSDAT),A
LD A,#2A
OUT (GSCOM),A
EI
HALT
DJNZ LOOP
LD A,#32
OUT (GSCOM),A
Вышеописанное плавно снижает громкость играющего модуля, а затем останав-
ливает его.
#2B Set FX Master Volume
Установить громкость проигрывания эффектов.
SD FX_Master_Volume [#00..#40]
SC #2B
WC
[GD Old_FX_Volume] - Старая громкость
Аналогично предыдущей команде, но действует на сэмплы.
С помощью этих двух команд можно регулировать баланс громкостей модуля и
сэмплов, и т.п.
#2E Set Current FX
Установить текущий эффект. Просто присваивает переменной CURFX это зна-
чение. Если какая-либо команда требует номер сэмпла (sample handle), то
можно вместо этого номера подать ей #00 и интерпретатор подставит вмес-
то этого нуля значение переменной CURFX. (См. команды #38, #39, #40-#4F
для понимания вышеизложенного.)
SD Cur_FX
SC #2E
WC
#30 Load Module
Загрузка модуля в память.
SC #30
WC
[GD Module_Handle]-номер модуля
(Command bit=0, Data bit=0)
SC #D1 (Open Stream-открыть поток)
WC
SD \
WD \
... Байты модуля
SD /
WD /
SC #D2 (Close Stream-закрыть поток)
WC
Пример:
LD HL,Mod_adress
LD DE,0-Mod_length
LD C,GSCOM
LD A,#30
CALL SENDCOM
LD A,#D1
CALL SENDCOM
LD A,(HL)
LOOP: IN B,(C)
JP P,READY
IN B,(C)
JP M,LOOP
READY: OUT (GSDAT),A
INC HL
LD A,(HL)
INC E
JP NZ,LOOP
INC D
JP NZ,LOOP
WAIT: IN B,(C) ;Ждем принятия
JP M,WAIT ;последнего байта
LD A,#D2
CALL SENDCOM
IN A,(GSDAT) ; Номер модуля
OUT (GSDAT),A
LD A,#31
SENDCOM: OUT (GSCOM),A
WAITCOM: IN A,(GSCOM)
RRCA
JR C,WAITCOM
RET
#31 Play module
Проигрывание модуля.
SD Module_Handle - номер модуля
SC #31
WC
#32 Stop module
Остановить проигрывание модуля.
SC #32
WC
#33 Continue module
Продолжить проигрывание модуля после остановки.
SC #33
WC
#35 Set Module Volume
Установить громкость проигрывания модулей.
SD Module_Master_Volume [#00..#40]
SC #35
WC
[GD Old_Master_Volume] - Старая громк.
#36 Data on (*)
Устанавливает регистр данных в #FF.
SC #36
WC
[GD Data (#FF) ]
#37 Reinitialisation (*)
Переустанавливает внутренние переменные в исходное состояние.
SC #37
WC
#38 Load FX
Загрузка сэмпла эффекта в память. Загружает беззнаковые сэмплы (PC type)
SC #38
WC
[GD FX_Handle]-номер сэмпла
(Command bit=0, Data bit=0)
SC #D1 (Open Stream-открыть поток)
WC
SD \
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_sample
LD DE,0-Length_of_sample
LD C,#00
LOOP: LD A,(HL)
SUB C
LD C,(HL)
LD (HL),A
INC E
JP NZ,LOOP
INC D
JP NZ,LOOP
А вот как можно закачать сэмпл:
LD IX,Parameters
LD HL,Sample_adress
LD DE,0-Sample_length
LD C,GSCOM
LD A,#38
CALL SENDCOM
LD A,#D1
CALL SENDCOM
LD A,(HL)
LOOP: IN B,(C)
JP P,READY
IN B,(C)
JP M,LOOP
READY: OUT (GSDAT),A
INC HL
ADD A,(HL)
INC E
JP NZ,LOOP
INC D
JP NZ,LOOP
WAIT: IN B,(C) ;Ждем принятия
JP M,WAIT ;последнего байта
LD A,#D2
CALL SENDCOM
; Теперь переопределяем параметры
; сэмпла по умолчанию своими
; значениями
LD A,(IX+#00)
OUT (GSDAT),A ; Нота
LD A,#40
CALL SENDCOM
LD A,(IX+#01)
OUT (GSDAT),A ; Громкость
LD A,#41
SENDCOM: OUT (GSCOM), A
WAITCOM: IN A,(GSCOM)
RRCA
JR C,WAITCOM
RET
#39 Play FX
Проигрывание эффекта.
SD FX_Handle - номер сэмпла
SC #39
WC
При исполнении этой команды происходит следующее: смотрятся каналы, ука-
занные в SeekFirst параметре нашего сэмпла, и если хотя-бы один из них сво-
боден, в нем и проигрывается сэмпл, в противном случае смотрятся каналы,
указанные в SeekLast и если один из них свободен, в нем и играется сэмпл,
если свободных нет, то просматриваются все каналы, указанные SeekLast, из
них выбирается канал с наименьшим приоритетом и сравнивается с приоритетом
нашего сэмпла (имеется в виду сэмпл, который мы хотим проиграть), если у
этого сэмпла будет больший приоритет, чем у сэмпла, уже играющего в канале,
то играющий в канале сэмпл будет остановлен, а наш сэмпл будет запущен в
этом канале вместо старого сэмпла. Вот такая вот приоритетная схема...
Тогда сэмпл запускается в канале, то его нота, громкость и т.п. парамет-
ры записываются в область данных канала из заголовка сэмпла.
В общем случае, что-бы проиграть сэмпл с нужными параметрами, вы можете
установить эти параметры после загрузки сэмпла и смело использовать коман-
ду #39. Если же параметры должны меняться, то можно поступать следующим об-
разом: командой #2E сделать текущим требуемый сэмпл, командами #4x изме-
нить его параметры, а затем уже запускать его командой #39.
Альтернативный метод запуска сэмплов предоставляют команды #80..#9F, при
исполнении этих команд вы прямо в коде команды указываете, в каком канале
требуется запустить сэмпл, и кроме этого, вы можете также указать с какой
нотой и/или громкостью требуется запустить сэмпл.
#3A Stop FX in channels
установка проигрывания эффектов в заданных каналах, которые указывают-
ся в маске каналов (Channel Mask). В ней единица в n-ном бите указы-
вает на то, что эффект в n-ном канале требуется остановить
SD Channel_Mask
SC #3A
WC
Описанное выше есть идеальный вариант работы данной команды, но к сожале-
нию не все так просто в этом мире, и эта команда действует не так, а имен-
но: единица в бите 7 останавливает сэмпл в нулевом канале, и т.п. В следую-
щих версиях это будет исправлено, а пока я могу порекомендовать останавли-
вать вообще все сэмплы маской #FF.
#3D Set FX Volume
Установить громкость проигрывания эффектов.
SD FX Volume [#00..#40]
SC #3D
WC
[GD Old_FX_Volume] - Старая громкость
#3E Load FX (Extended version)
Загрузка сэмпла эффекта в память. Позволяет загружать сэмплы со знаком.
(Amiga type)
SD #01 (Signed sample)
SC #3E
WC
[GD FX_Handle]-номер сэмпла
(Command bit=0, Data bit=0)
SC #D1 (Open Stream-открыть поток)
WC
SD \
WD \
... Байты сэмпла
SD /
WD /
SC #D2 (Close Stream-закрыть поток)
WC
#40 Set FX Sample Playing Note
Установка ноты по умолчанию для текущего эффекта.
SD Note [0..95]
SC #40
WC
Note=
0 C-0
1 C#0
12 C-1
24 C-2
36 C-3 (C-1 в Амиге)
48 C-4 (C-2 в Амиге)
60 C-5 (C-3 в Амиге)
72 C-6
84 C-7
В данной версии Sound Generators Wave 2, 3 могут воспроизвести октавы 3,
4 и 5, поэтому допустимым значением параметра Note является диапазон от 36
до 71.
#41 Set FX Sample Volume
Установка громкости по умолчанию для текущего эффекта.
SD FX_Volume [#00..#40]
SC #41
WC
#42 Set FX Sample Finetune
Установка Finetune по умолчанию для текущего эффекта.
SD FX_Finetune [#00..#40]
SC #42
WC
#43 - #44 Зарезервированы.
#45 Set FX Sample Priority
Установка приоритета для текущего эффекта. (См. команду #39)
SD FX_Priority [#01..#fe]
SC #45
WC
#46 Set FX Sample Seek First parameter
Установка параметра Seek First для текущего эффекта. (См. команду #39)
SD FX_SeekFirst
SC #46
WC
#47 Set FX Sample Seek Last parameter
Установка параметра Seek Last для текущего эффекта. (См. команду #39)
SD FX_SeekLast
SC #47
WC
#48 Set FX Sample Loop Begin (*)
Установка начала цикла для текущего эффекта.
SD LEN.L
SC #48
WC
SD LEN.M
WD
SD LEN.H
WD
При равенстве LEN.H - #FF зацикливание не производится
#49 Set FX Sample Loop End (*)
Установка конца цикла для текущего эффекта.
SD LEN.L
SC #49
WC
SD LEN.M
WD
SD LEN.H
WD
#4A - #4F Зарезервированы.
#51 - #5F Зарезервированы.
#60 Get Song Position
Получение значения переменной Song_Position в текущем модуле.
SC #60
WC
GD 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 #61
WC
GD 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 #62
WC
GD Mixed_Position
Mixed_Position: (по битам)
7-Song_Position.1
6-Song_Position.0
5-Pattern_Position.5
4-Pattern_Position.4
3-Pattern_Position.3
2-Pattern_Position.2
1-Pattern_Position.1
0-Pattern_Position.0
Т.е если получить Mixed_Position и сделать с ним AND #3F, то получится
вылитый Pattern_Position, а если после получения его немного RLCA, RLCA,
AND #02 - то это будут младшие два бита Song_Position. См. примечания к ко-
мандам #60 и #61.
#63 Get Channel Notes
Получить ноты всех каналов модуля.
SC #63
WC
GD Note_of_channel_0
WN
GD Note_of_channel_1
WN
GD Note_of_channel_2
WN
GD Note_of_channel_3
Если в каком-либо канале значение ноты изменилось с последнего исполне-
ния команды #63, то бит 7 полученного заначения
Note_of_channel_N
будет в нуле, если же это значение то же самое, что и было раньше, то этот
бит будет в единице. Младшие семь битов и есть собственно нота от 0 до 95;
если это значение равно 127, то это означает, что никакие сэмплы в канале
не играют. Данная команда предназначена в основном для построения на ее ос-
нове различных анализаторов.
#64 Get Channel Volumes
Получить громкости всех каналов модуля.
SC #64
WC
GD Volume_of_channel_0
WN
GD Volume_of_channel_1
WN
GD Volume_of_channel_2
WN
GD Volume_of_channel_3
См. описание команды #63
#65 Jump to position (*)
Делает переход на заданную позицию.
SD Position
SC #65
WC
#66 Set speed/tempo (*)
Установка скорости в пределах #01-#1F. При значениях #20-#FF устанавли-
вается темп проигрывания. Значения темпа соответствуют оригинальным при
скорости равной #06.
SD Speed/Tempo
SC #66
WC
#67 Get speed value (*)
Чтение текущей скорости.
SC #67
WC
GD Speed
WD
#68 Get tempo value (*)
Чтение текущего темпа.
SC #68
WC
GD Tempo
WD
#6A - #7F зарезервированы.
#80 Direct Play FX Sample (#80..#83)
Проигрывание сэмпла в заданном канале.
SD Sample_Number
SC #80..#83 (Младшие биты определяют непосредственно номер канала, в
котором требуется играть сэмпл) WC
#88 Direct Play FX Sample (#88..#8B)
Проигрывание сэмпла в заданном канале с заданной нотой.
SD Sample_Number
SC #88..#8B (Младшие биты определяют непосредственно номер канала, в
котором требуется играть сэмпл) WC SD Note [0..95] WD
#90 Direct Play FX Sample (#90..#93)
Проигрывание сэмпла в заданном канале с заданной громкостью.
SD Sample_Number
SC #90..#93 (Младшие биты определяют непосредственно номер канала, в
котором требуется играть сэмпл)
WC
SD Volume [#00..#40]
WD
#98 Direct Play FX Sample (#98..#9B)
Проигрывание сэмпла в заданном канале с заданной нотой и громкостью.
SD Sample_Number
SC #98..#9B (Младшие биты определяют непосредственно номер канала, в
котором требуется играть сэмпл)
WC
SD Note [0..95]
WD
SD 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 General
Sound'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угoe
Bс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 =-