1017 lines
23 KiB
Plaintext
1017 lines
23 KiB
Plaintext
#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 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 Output to any port (*)
|
||
Выводит байт вo внутренний порт GS (#00-#09).
|
||
|
||
SD Port
|
||
SC #10
|
||
WC
|
||
SD Data
|
||
WD
|
||
|
||
#11 Input from any port (*)
|
||
читает байт из внутреннего порта GS (#00-#09).
|
||
|
||
SD Port
|
||
SC #10
|
||
WC
|
||
GD Data
|
||
WN
|
||
|
||
#12 OUT to 0 port (*) (Out to page register)
|
||
Выводит байт в порт кофигурации 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 (*) (Set memory pointer)
|
||
Загружает регистовую пару 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 (*) (Put byte to system area)
|
||
Записывает байт по адресу, старший байт которого равен #20.
|
||
|
||
SD ADR.L
|
||
SC #1C
|
||
WC
|
||
SD Byte
|
||
WD
|
||
|
||
#1D Peek from (#20XX) address (*) (Get byte from system area)
|
||
читает байт с адреса, старший байт которого равен #20.
|
||
|
||
SD ADR.L
|
||
SC #1D
|
||
WC
|
||
GD Byte
|
||
WN
|
||
|
||
#1E - #1F Зарезервированы.(Неиспользуться)
|
||
|
||
#20 Get total RAM (Get memory size)
|
||
Получить общий объем доступной памяти на 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
|
||
|
||
#22
|
||
|
||
|
||
#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] - Старая громкость
|
||
|
||
Аналогично предыдущей команде, но действует на сэмплы.
|
||
|
||
С помощью этих двух команд можно регулировать баланс громкостей модуля и
|
||
сэмплов, и т.п.
|
||
|
||
#2C Set Current Module
|
||
Недокумментированная команда.
|
||
Установить текущий модуль.Присваивает переменной CURMOD соответст-
|
||
вующее значение.
|
||
|
||
#2D Set Current Sample
|
||
Недокумментированная команда.
|
||
Установить текущий модуль.Присваивает переменной CURSMP соответст-
|
||
вующее значение.
|
||
|
||
#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 и никакого отношения к
|
||
регистрам основного процессора не имеют.
|
||
|
||
#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 Зарезервированы. |