GeneralSound/v.1.0/GS_CMD.TXT
2025-02-15 18:26:49 +03:00

1017 lines
23 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 Зарезервированы.