Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. %\tracingall
  2. \XeTeXtracingfonts=1
  3.  
  4. \documentclass[a4paper,11pt]{article}
  5. \usepackage{metalogo}
  6. \usepackage{fontspec,unicode-math}
  7. \usepackage[a4paper,left=20mm,top=20mm,bottom=15mm,right=20mm,nohead,xetex]{geometry}
  8. \usepackage{polyglossia}
  9.  
  10. \usepackage[pdfencoding=unicode,psdextra,xetex]{hyperref}
  11. \hypersetup{unicode=true,colorlinks=true}
  12. \usepackage[numbered,dvipdfm]{bookmark}
  13. \usepackage[indentafter,raggedright,newlinetospace,pagestyles]{titlesec}
  14. \usepackage{etoc}
  15. \usepackage{tabu}
  16. \usepackage{enumitem}
  17.  
  18. %Доработанные шрифты с поддержкой перечеркнутого нуля
  19. \setmainfont{CMUSerif.otf}[Path=./,UprightFont = *-Roman,BoldFont = *-Bold,Numbers=SlashedZero]
  20. \setmonofont{CMUTypewriter.otf}[Path=./,UprightFont = *-Regular,Numbers=SlashedZero]
  21.  
  22. \setmathfont{Latin Modern Math}
  23.  
  24. % Точка после номера раздела в pdf bookmarks
  25. \makeatletter
  26. \renewcommand{\Hy@numberline}[1]{#1. }
  27. \makeatother
  28.  
  29. % Оформление оглавления
  30. \etocsetstyle{section}{}{}{\etocsavedsectiontocline{\etoclink{\numberline{\etocifnumbered{\etocnumber.}{}}\sloppy\MakeUppercase{\etocthename}}}{\etocpage}}{}
  31. \etocsetstyle{subsection}{}{}{\etocsavedsubsectiontocline{\etoclink{\numberline{\etocifnumbered{\etocnumber.}{}}\sloppy\etocname}}{\etocpage}}{}
  32. \etocsetstyle{subsubsection}{}{}{\etocsavedsubsubsectiontocline{\etoclink{\numberline{\etocifnumbered{\etocnumber.}{}}\sloppy\etocname}}{\etocpage}}{}
  33.  
  34. \setlist{nosep,after=\vspace{\baselineskip}}
  35.  
  36. \DeclareRobustCommand{\Cyrax}{\texorpdfstring{\(^\circledast\)}{\circledast}}
  37.  
  38. \setmainlanguage{russian}
  39. \setotherlanguage{english}
  40.  
  41. \begin{document}
  42.  
  43. \begin{titlepage}
  44. \begin{center}
  45.  
  46. \textbf{Recoded by Evgeny Muchkin 06.10.1998\\
  47. SysOp of PALLY\_STATION  tel: 176-74-19\\
  48. Last update and correxion by Cyrax, Inc. 18.04.2002\\
  49. Former GS programmer\ldots{} ;) email: reptyle@mail.ru}
  50. \vfill
  51.  
  52. \textbf{\LARGE\copyright~STINGER \&\\
  53. \copyright~Cyrax, Inc.~--- \Cyrax\label{Cyrax}}
  54.  
  55. \medskip
  56. \medskip
  57.  
  58. \textbf{\LARGE{}Руководство по программированию\\
  59. General Sound}
  60.  
  61. \medskip
  62. \medskip
  63.  
  64. \textbf{\Large{}Версия v1.04. Редакция 006}
  65.  
  66. \vfill
  67.  
  68. (отредактировал в документ CHRV)
  69.  
  70. \medskip
  71.  
  72. Оставлен полностью авторский текст за исключением \\
  73. форматирования и исправления ошибок в тексте.\\
  74. Добавлено описание исправлений в GS ROM v1.05.
  75.  
  76. \medskip
  77.  
  78. (преобразовал в \XeLaTeX{} deathsoft 01.07.2018)
  79.  
  80. \medskip
  81.  
  82. \textbf{24.02.2012}
  83. \end{center}
  84. \end{titlepage}
  85.  
  86. \newpage
  87.  
  88. \tableofcontents
  89.  
  90. \newpage
  91.  
  92. \section{Краткие технические характеристики GS}
  93. \begin{description}
  94. \item[Процессор:] Z80, 12MHz, без циклов wait
  95. \item[ROM:] 32k, 27256
  96. \item[RAM:] Static Ram 128k всего, 112k  доступно для модулей и сэмплов в  базовой версии
  97. \item[INT:] 37.5~kHz
  98. \item[Каналы:] 4 независимых 8-и битных канала,  каждый с 6-и битным контролем громкости.
  99. \end{description}
  100.  
  101. \section{Краткое описание GS, или много всякой лабуды}
  102. GS --- музыкальная карточка,  предназначенная для проигрывания  музыкальных модулей и отдельных сэмплов (эффектов).
  103.  
  104. Модули для GS --- это стандартные Амижные и PCшные 4-х канальные MOD файлы, а сэмплы --- как Амижные signed sample, так и PCшные unsigned sample.
  105.  
  106. Проигрыватель MOD  файлов  в  GS  является  практически  полным  аналогом ProTracker'а на Амиге и создавался при интенсивном  использовании  исходников ProTracker'a. (Исходники были из Protracker'а v2.1A by Lars ``ZAP'' Hamre --- Amiga Freelancers)
  107.  
  108. MOD Player поддерживает все команды Pro Tracker'а, за исключением двух:
  109. \begin{itemize}
  110. \item Е01 Filter On Амига-специфичная команда, включает фильтр высоких частот.
  111. \item EFX Invert Loop я еще не видел плеера,  который бы поддерживал эту команду. Возможно, она поддерживается на каких-то старых плеерах.
  112. \end{itemize}
  113.  
  114. GS представляет из себя,  по-сути,  микропроцессорный комплекс  со  своим процессором, ПЗУ, ОЗУ и портами, и абсолютно не зависит от главного процессора Спектрума,  что позволяет, например, загрузить свой любимый модуль, сбросить Спектрум,  загрузить ассемблер и творить под любимую музыку. Soft внутри GS полностью берет на себя задачи проигрывания звука, интерпретации модуля и т.д. Программирование GS'а сводится к передаче байт за байтом модуля и/или сэмплов,  а затем требуется только подавать команды типа: запустить модуль,  установить глобальную громкость проигрывания модуля, запустить сэмпл \#09 в канале \#02 и т.д.
  115.  
  116. Если предполагается загрузить модуль вместе с сэмплами, то в GENERAL требуется загружать вначале модуль, а затем сэмплы.
  117.  
  118. При загрузке модуля очень рекомендуется оставить свободными  2к памяти, т.е. загружать модули длиной максимум 110K. Это условие не является необходимым, но его исполнение очень желательно в целях совместимости с последующими версиями.
  119.  
  120. Аналогично очень рекомендуется оставлять по 80 байт для  каждого сэмпла, например, если требуется загрузить 63-х килобайтный модуль и 18 сэмплов, то имеем:
  121. \[\mathrm{Total\_Sample\_Length}=112\cdotp1024-63\cdotp1024-2\cdotp1024-18\cdotp80=46688\  \mathrm{байт}\]
  122.  
  123. Это суммарная длина сэмплов, которые при таком положении вещей могут быть загружены.
  124.  
  125. Если же, например, требуется вычислить,  сколько поместится в память GS'а 2-х килобайтных сэмплов, то это вычисляется следующим образом:
  126. \(112\cdotp\frac{1024}{2048+80}=53\) сэмпла.
  127. В GS'е имеются 4 физических канала, которые и проигрывают звук.
  128.  
  129. Каналы 0 и 1~--- левые, а 2 и 3~--- правые.
  130.  
  131. \section{Интерфейс со Спектрумом}
  132. На мир GS смотрит при помощи 4 регистров:
  133. \begin{enumerate}
  134. \item \textbf{Command register}~--- регистр команд,  доступный для записи порт по адресу 187 (\#BB). В этот регистр записываются команды.
  135. \item \textbf{Status register}~--- регистр состояния, доступный для чтения порт по адресу 187 (\#BB).
  136.  
  137. \begin{minipage}{\textwidth}
  138. Биты регистра:
  139. \begin{description}
  140. \item[7] — Data bit, флаг данных
  141. \item[6] — Не определен
  142. \item[5] — Не определен
  143. \item[4] — Не определен
  144. \item[3] — Не определен
  145. \item[2] — Не определен
  146. \item[1] — Не определен
  147. \item[0] — Command bit, флаг команд
  148. \end{description}
  149. \end{minipage}
  150.  
  151. Этот регистр позволяет определить состояние GS, в частности можно ли прочитать или записать очередной байт данных, или подать очередную команду,  и т.п.
  152.  
  153. \item \textbf{Data register}~--- регистр данных, доступный для записи порт по адресу 179 (\#B3). В этот регистр Спектрум записывает данные, например, это могут быть аргументы команд.
  154. \item  \textbf{Output register}~--- регистр вывода, доступный для чтения порт по адресу 179 (\#B3). Из этого регистра Спектрум читает данные, идущие от GS.
  155. \end{enumerate}
  156.  
  157. Command bit в регистре состояний устанавливается аппаратно после записи команды в регистр команд. Сбрасываться в 0 он может только из GS, что сигнализирует об определенном этапе исполнения команды.
  158.  
  159. Data bit в регистре состояний может быть установлен или сброшен как по желанию Спектрума, так и по желанию GS: при записи Спектрумом в регистр данных он аппаратно устанавливается в 1, а после чтения GS'ом из этого регистра сбрасывается в 0. При записи GS в регистр вывода он (все тот же Data bit) аппаратно устанавливается в 1, а после чтения из этого порта Спектрумом сбрасывается аппаратно в 0.
  160.  
  161. Несмотря на то, что регистр данных и регистр вывода расположены в пространстве адресов портов по одному и тому же адресу и воздействуют на один и тот же бит данных,  они являются двумя независимыми регистрами. Значение, один раз записанное в один из этих регистров, остается неизменным в нем до новой записи.
  162.  
  163. Состояние бита данных очень часто не определено, и если в спецификации команд не определены значения этого бита на определенных этапах исполнения команды, недопустимо делать какие-либо предположения относительно значения этого бита.
  164.  
  165. \section{Система команд GS}
  166. Вначале позволю себе небольшое отступление от собственно системы  команд. GS,  как известно,  предназначен в основном для проигрывания модулей и сэмплов. В данной версии (1.04) GS ROM допускается загрузка одного модуля и/или до 32 сэмплов.
  167.  
  168. Каждый сэмпл при загрузке его в память получает свой уникальный идентификатор, который однозначно определяет обращение к данному сэмплу в командах, которые требуют номер сэмпла. Самый первый загруженный сэмпл получает номер (handle) = 1, следующий --- номер 2, и т.д.
  169.  
  170. То же самое применимо и к модулям, и этот единственный загруженный модуль будет иметь handle=1 после загрузки.
  171.  
  172. Особенностью данной версии является также то, что вначале требуется загружать модуль, а затем уже сэмплы.
  173.  
  174. Особенности описания команд:
  175.  
  176. \begin{minipage}{\textwidth}
  177. Команды описываются следующим образом:
  178. \begin{enumerate}
  179. \item Hex код команды
  180. \item Название команды
  181. \item Выполняемые действия при исполнении команды
  182. \item Формат команды
  183. \item Комментарии к команде
  184. \end{enumerate}
  185. \end{minipage}
  186.  
  187. \begin{minipage}{\textwidth}
  188. Формат команды описывается следующим образом:
  189. \begin{verbatim}
  190. GSCOM EQU 187
  191. GSDAT EQU 179
  192.  
  193. SC #NN  : Послать код команды в регистр команд
  194.          LD A,#NN
  195.          OUT (GSCOM),A
  196.  
  197. WC      : Ожидание сброса Command bit
  198.     WCLP IN A,(GSCOM)
  199.          RRCA
  200.          JR C,WCLP
  201.  
  202. SD Data : Послать данные в регистр данных
  203.          LD A,Data
  204.          OUT (GSDAT),A
  205.  
  206. WD      : Ожидание сброса Data bit, по сути, ожидание, пока GS не примет
  207.          посланные ему данные
  208.     WDLP IN A,(GSCOM)
  209.          RLCA
  210.          JR C,WDLP
  211.  
  212. GD Data : Принять данные из регистра данных
  213.          IN A,(GSDAT)
  214.  
  215. WN      : Ожидание установки Data bit,по сути, ожидание очередных данных
  216.          от GS
  217.     WNLP IN A,(GSCOM)
  218.          RLCA
  219.          JR NC,WNLP
  220. (*):
  221. <PAUSE> - Просто небольшая задержка кадра два-три.
  222. \end{verbatim}
  223. \end{minipage}
  224.  
  225. И напоследок — небольшая последовательность против зависания (иногда помогает)
  226. \begin{verbatim}
  227.          XOR A
  228.          OUT (#B3),A
  229.          OUT (#BB),A
  230.          IN A,(#BB)
  231. \end{verbatim}
  232. для верности можно и продублировать ;).
  233.  
  234. \subsection{Команды GS:}
  235.  
  236. \subsubsection{\#00 Reset flags}
  237. Сбрасывает флаги Data bit и Command bit.
  238. \begin{verbatim}
  239.    SC #00
  240.    WC
  241.    (Data bit=0, Command bit=0)
  242. \end{verbatim}
  243.  
  244. \subsubsection{\#01 Set silence\Cyrax\label{cmd:01}}
  245. Выводит в ЦАПы всех каналов \#80. По сути устанавливает тишину.
  246. \begin{verbatim}
  247.    SC #01
  248.    WC
  249. \end{verbatim}
  250.  
  251. \subsubsection{\#02 Set low volume\Cyrax}
  252. Устанавливает громкость ЦАПов всех каналов в ноль.
  253. \begin{verbatim}
  254.    SC #02
  255.    WC
  256. \end{verbatim}
  257.  
  258. \subsubsection{\#03 Set high volume\Cyrax}
  259. Устанавливает громкость ЦАПов всех каналов в максимум.
  260. \begin{verbatim}
  261.    SC #03
  262.    WC
  263. \end{verbatim}
  264.  
  265. \subsubsection{\#04 Set ‘E’ 3bits\Cyrax}
  266. Устанавливает в `E' регистре GS 3 младших бита в соответствии с заданным значением (2  младших бита в сущности являются номером канала \#00~---~\#03).
  267. \begin{verbatim}
  268.    SD Chan (#00-#07)
  269.    SC #04
  270.    WC
  271. \end{verbatim}
  272.  
  273. \subsubsection{\#05 Out volume port\Cyrax}
  274. Устанавливает громкость канала, номер которого содержится в `E', в указанное значение. (Команда срабатывает при условии, что `E' находится в пределах \#00~---~\#03)
  275. \begin{verbatim}
  276.    SD Volume (#00-#3F)
  277.    SC #05
  278.    WC
  279. \end{verbatim}
  280.  
  281. \subsubsection{\#06 Send to DAC\Cyrax}
  282. Выводит байт в ЦАП канала, указываемого по `E'.
  283. \begin{verbatim}
  284.    SD Byte
  285.    SC #06
  286.    WC
  287. \end{verbatim}
  288.  
  289. \subsubsection{\#07 Send to DAC and to volume port\Cyrax}
  290. Выводит байт в ЦАП (`E') с заданной громкостью.
  291. \begin{verbatim}
  292.    SD Byte
  293.    SC #07
  294.    WC
  295.    SD Volume
  296.    WD
  297. \end{verbatim}
  298.  
  299. \subsubsection{\#08 --- то же что и команда \#00}
  300.  
  301. \subsubsection{\#09 Sets one's byte volume\Cyrax\label{cmd:09}}
  302. Установка громкости канала, номер которого задан в 2х старших битах.
  303. \begin{verbatim}
  304.    SD Byte (ccvvvvvv)
  305.    SC #09
  306.    WC
  307. \end{verbatim}
  308.  
  309. cc --- Номер канала\\
  310. vvvvvv --- Его громкость
  311.  
  312. \subsubsection{\#0A DAC output\Cyrax}
  313. Еще один непосредственный вывод в ЦАП.
  314. \begin{verbatim}
  315.    SD Byte
  316.    SC #0A
  317.    WC
  318.    SD Chan (#00-#03)
  319.    WD
  320. \end{verbatim}
  321.  
  322. \subsubsection{\#0B DAC and Volume output\Cyrax\label{cmd:0B}}
  323. И наконец последний вывод в ЦАП с установкой громкости.
  324. \begin{verbatim}
  325.    SD Fbyte
  326.    SC #0B
  327.    WC
  328.    SD Sbyte (ccvvvvvv)
  329.    WD
  330. \end{verbatim}
  331.  
  332. Назначение битов Sbyte как и у команды~\hyperref[cmd:09]{\#09}.
  333. Команды~\hyperref[cmd:01]{\#01}~---~\hyperref[cmd:0B]{\#0B} служат в основном для построения различных Covox'ов и проигрывателей, при этом не слишком углубляясь во внутреннюю структуру GS.
  334.  
  335. \subsubsection{\#0C Call SounDrive Covox mode\Cyrax}
  336. Вызывает режим четырехканального Ковокса, последовательно копирует регистр данных по каналам. Выход из режима автоматически после вывода четвертого байта.
  337. \begin{verbatim}
  338.    SD CH1
  339.    SC #0C
  340.    WC
  341.    SD CH2
  342.    WD
  343.    SD CH3
  344.    WD
  345.    SD CH4
  346.    WD
  347. \end{verbatim}
  348.  
  349. \subsubsection{\#0D Call Ultravox mode\Cyrax}
  350. Вызывает режим универсального Ковокса, последовательно копирует регистр данных по каналам, число которых регулируется (1~---~4). В отличие от предыдущего варианта синхронизация не производится. Выход также производится автоматически по записи последнего байта.
  351. \begin{verbatim}
  352.    SD CHANS
  353.    SC #0D
  354.    WC
  355.  
  356.    SD CH1
  357.    SD CH2
  358.    SD CH3
  359.    SD CH4
  360. \end{verbatim}
  361.  
  362. CHANS (4-е младших бита) указывает какие каналы будут задействованы --- для включения канала соответствующий бит нужно установить. Если канал выключен, то поступивший байт попадает на следующий включенный канал (если успеет :)
  363.  
  364. \subsubsection{\#0E Go to LPT Covox mode}
  365. Переходит в режим одноканального Ковокса, напрямую копирует регистр данных в ЦАПы двух (правого и левого) каналов. Выход из этого режима ---  запись \#00 в регистр команд.
  366. \begin{verbatim}
  367.    SC #0E
  368.    WC
  369.  
  370.    SD  \
  371.    SD   \
  372.    ...   Это вывод в ЦАПы
  373.         /
  374.    SD  /
  375.  
  376.    SC #00
  377.    WC
  378. \end{verbatim}
  379.  
  380. \subsubsection{\#0F Go in Profi Covox mode\Cyrax}
  381. Переходит в режим двухканального Ковокса, напрямую копирует регистр данных в ЦАПы одного канала, а регистр команд в ЦАПы второго канала. Выход из этого режима --- запись \#4Е в регистр данных, затем последовательно \#0F и \#AA в регистр команд.
  382. \begin{verbatim}
  383.    SD #59
  384.    SC #0F
  385.    WC
  386.  
  387.    SD  \
  388.    SC   \
  389.    SD    \
  390.    SC      Это вывод в ЦАПы
  391.    ...   /
  392.    SD   /
  393.    SC  /
  394.  
  395.    SD #4E
  396.    WD
  397.    SC #0F
  398.    WC
  399.    SC #AA
  400.    WC
  401. \end{verbatim}
  402.  
  403. \subsubsection{\#10 Out to any port\Cyrax}
  404. Выводит байт вo внутренний порт GS (\#00~---~\#09).
  405. \begin{verbatim}
  406.    SD Port
  407.    SC #10
  408.    WC
  409.    SD Data
  410.    WD
  411. \end{verbatim}
  412.  
  413. \subsubsection{\#11 In from any port\Cyrax}
  414. Читает байт из внутреннего порта GS (\#00~---~\#09).
  415. \begin{verbatim}
  416.    SD Port
  417.    SC #11
  418.    WC
  419.    GD Data
  420.    WN
  421. \end{verbatim}
  422.  
  423. \subsubsection{\#12 OUT to 0 port\Cyrax}
  424. Выводит байт в порт конфигурации GS (\#00).
  425. \begin{verbatim}
  426.    SD Data
  427.    SC #12
  428.    WC
  429. \end{verbatim}
  430.  
  431. \subsubsection{\#13 Jump to Address\Cyrax}
  432. Передает управление по заданному адресу.
  433. \begin{verbatim}
  434.    SD ADR.L
  435.    SC #13
  436.    WC
  437.    SD ADR.H
  438.    WD
  439. \end{verbatim}
  440.  
  441. \subsubsection{\#14 Load memory block\Cyrax}
  442. Загрузка блока кодов по указанному адресу с заданной длиной.
  443. \begin{verbatim}
  444.    SD LEN.L
  445.    SC #14
  446.      <PAUSE> (мб WD)
  447.    SD LEN.H
  448.    WD
  449.    SD ADR.L
  450.    WD
  451.    SD ADR.H
  452.      <PAUSE>
  453.  
  454.    SD \
  455.    WD  \
  456.    SD   \
  457.    WD     Блок данных длиной LEN
  458.    ...  /
  459.    SD  /
  460.    WD /
  461. \end{verbatim}
  462.  
  463. \subsubsection{\#15 Get memory block\Cyrax}
  464. Выгрузка блока кодов по указанному адресу с заданной длиной.
  465. \begin{verbatim}
  466.    SD LEN.L
  467.    SC #15
  468.      <PAUSE> (мб WD)
  469.    SD LEN.H
  470.    WD
  471.    SD ADR.L
  472.    WD
  473.    SD ADR.H
  474.      <PAUSE>
  475.  
  476.    GD \
  477.    WN  \
  478.    GD   \
  479.    WN     Блок данных длиной LEN
  480.    ...  /
  481.    GD  /
  482.    WN /
  483.    GD
  484. \end{verbatim}
  485.  
  486. \subsubsection{\#16 Poke to address\Cyrax}
  487. Записывает единичный байт по указанному адресу.
  488. \begin{verbatim}
  489.    SD Byte
  490.    SC #16
  491.    WC
  492.    SD ADR.L
  493.    WD
  494.    SD ADR.H
  495.    WD
  496. \end{verbatim}
  497.  
  498. \subsubsection{\#17 Peek from address\Cyrax}
  499. Считывает единичный байт из указанного адреса.
  500. \begin{verbatim}
  501.    SD ADR.L
  502.    SC #17
  503.    WD
  504.    SD ADR.H
  505.    GD Byte
  506. \end{verbatim}
  507.  
  508. \subsubsection{\#18 Load DE Pair\Cyrax}
  509. Загружает регистровую пару DE (относящуюся к GS, не путать с одноименной парой Main CPU) указанным словом.
  510. \begin{verbatim}
  511.    SD Byte.E
  512.    SC #18
  513.    WC
  514.    SD Byte.D
  515.    WD
  516. \end{verbatim}
  517.  
  518. \subsubsection{\#19 Poke to (DE) address\Cyrax}
  519. Записывает байт по адресу указанному в DE.
  520. \begin{verbatim}
  521.    SD Byte
  522.    SC #19
  523.    WC
  524. \end{verbatim}
  525.  
  526. \subsubsection{\#1A Peek from (DE) address\Cyrax}
  527. Считывает содержимое адреса, указываемого по DE.
  528. \begin{verbatim}
  529.    SC #1A
  530.    WC
  531.    GD Byte
  532.    WN
  533. \end{verbatim}
  534.  
  535. \subsubsection{\#1B Increment of DE Pair\Cyrax}
  536. Увеличивает пару DE на единичку.
  537. \begin{verbatim}
  538.    SC #1B
  539.    WC
  540. \end{verbatim}
  541.  
  542. \subsubsection{\#1C Poke to (\#20XX) address\Cyrax}
  543. Записывает байт по адресу, старший байт которого равен \#20. Смысла команда никакого не имеет, так как по этим адресам находится ПЗУ карты.
  544. \begin{verbatim}
  545.    SD ADR.L
  546.    SC #1C
  547.    WC
  548.    SD Byte
  549.    WD
  550. \end{verbatim}
  551.  
  552. \subsubsection{\#1D Peek from (\#20XX) address\Cyrax}
  553. Читает байт с адреса, старший байт которого равен \#20.
  554. \begin{verbatim}
  555.    SD ADR.L
  556.    SC #1D
  557.    WC
  558.    GD Byte
  559.    WN
  560. \end{verbatim}
  561.  
  562. \subsubsection{\#1E --- \#1F Зарезервированы.}
  563.  
  564. \subsubsection{\#20 Get total RAM}
  565. Получить общий объем доступной памяти на GS. (В базовой версии это 112к)
  566. \begin{verbatim}
  567.    SC #20
  568.    WC
  569.    GD RAM.L(Младшая часть)
  570.    WN
  571.    GD RAM.M(Средняя часть)
  572.    WN
  573.    GD RAM.H(Старшая часть)
  574. \end{verbatim}
  575.  
  576. \(\mathrm{Total\_RAM}=65536\cdotp\mathrm{RAM.H}+256\cdotp\mathrm{RAM.M}+\mathrm{RAM.L}\)
  577.  
  578. \subsubsection{\#21 Get free RAM}
  579. Получить общий объем свободной памяти на GS.
  580. \begin{verbatim}
  581.    SC #20
  582.    WC
  583.    GD RAM.L(Младшая часть)
  584.    WN
  585.    GD RAM.M(Средняя часть)
  586.    WN
  587.    GD RAM.H(Старшая часть)
  588. \end{verbatim}
  589.  
  590. \(\mathrm{Free\_RAM}=65536\cdotp\mathrm{RAM.H}+256\cdotp\mathrm{RAM.M}+\mathrm{RAM.L}\)
  591.  
  592. \subsubsection{\#22 Get GS Variable\Cyrax}
  593. Получить значение переменной GS номер которой задан по Num. Переменные описывают текущее состояние карты, например номер паттерна, темп и т.п. Соответственно номеров переменных не приводится (в следствие несистематизированности и отрывочности данных, а так же по иным причинам).
  594. \begin{verbatim}
  595.      SD Num
  596.      SC #22
  597.      WC
  598.      GD Variable
  599.      WN
  600. \end{verbatim}
  601.  
  602. \subsubsection{\#23 Get number of RAM Pages}
  603. Получить число страниц на  GS. (В базовой версии 3 страницы)
  604. \begin{verbatim}
  605.    SC #23
  606.    WC
  607.    GD Number_RAM_Pages
  608. \end{verbatim}
  609.  
  610. \subsubsection{\#24 --- \#29 Зарезервированы}
  611. \subsubsection{\#2A Set Module Master Volume}
  612. Установить громкость проигрывания модулей.
  613. \begin{verbatim}
  614.    SD Module_Master_Volume [#00..#40]
  615.    SC #2A
  616.    WC
  617.    [GD Old_Master_Volume] - Старая громкость
  618. \end{verbatim}
  619.  
  620. Маленький пример использования данной команды:
  621. (Предполагается, что играется модуль)
  622. \begin{verbatim}
  623.           LD B,#40
  624.  
  625.     LOOP: LD A,B
  626.           OUT (GSDAT),A
  627.           LD A,#2A
  628.           OUT (GSCOM),A
  629.           EI
  630.           HALT
  631.           DJNZ LOOP
  632.  
  633.           LD A,#32
  634.           OUT (GSCOM),A
  635. \end{verbatim}
  636.  
  637. Вышеописанное плавно снижает громкость играющего модуля, а затем останавливает его.
  638.  
  639. \subsubsection{\#2B Set FX Master Volume}
  640. Установить громкость проигрывания эффектов.
  641. \begin{verbatim}
  642.    SD FX_Master_Volume [#00..#40]
  643.    SC #2B
  644.    WC
  645.    [GD Old_FX_Volume] - Старая громкость
  646. \end{verbatim}
  647.  
  648. Аналогично предыдущей команде, но действует на сэмплы.
  649. С помощью этих двух команд можно регулировать баланс громкости модуля и сэмплов, и т.п.
  650.  
  651. \subsubsection{\#2E Set Current FX\label{cmd:2E}}
  652. Установить текущий эффект. Просто присваивает переменной CURFX это значение.
  653. Если какая-либо команда требует номер сэмпла (sample handle), то можно вместо этого номера подать ей \#00 и интерпретатор подставит вместо этого нуля значение переменной CURFX.
  654. (См. команды~\hyperref[cmd:38]{\#38}, \hyperref[cmd:39]{\#39}, \hyperref[cmd:40]{\#40}~---~\hyperref[cmd:49]{\#49} для понимания вышеизложенного.)
  655. \begin{verbatim}
  656.    SD Cur_FX
  657.    SC #2E
  658.    WC
  659. \end{verbatim}
  660.  
  661. \subsubsection{\#30 Load Module}
  662. Загрузка модуля в память.
  663. \begin{verbatim}
  664.    SC #30
  665.    WC
  666.   [GD Module_Handle]-номер модуля
  667.   (Command bit=0, Data bit=0)
  668.    SC #D1 (Open Stream-открыть поток)
  669.    WC
  670.  
  671.    SD \
  672.    WD  \
  673.    ...   Байты модуля
  674.    SD  /
  675.    WD /
  676.  
  677.    SC #D2 (Close Stream-закрыть поток)
  678.    WC
  679. \end{verbatim}
  680.  
  681. Пример:
  682. \begin{verbatim}
  683.             LD HL,Mod_adress
  684.             LD DE,0-Mod_length
  685.             LD C,GSCOM
  686.  
  687.             LD A,#30
  688.             CALL SENDCOM
  689.             LD A,#D1
  690.             CALL SENDCOM
  691.  
  692.             LD A,(HL)
  693.     LOOP:   IN B,(C)
  694.             JP P,READY
  695.             IN B,(C)
  696.             JP M,LOOP
  697.     READY:  OUT (GSDAT),A
  698.             INC HL
  699.             LD A,(HL)
  700.             INC E
  701.             JP NZ,LOOP
  702.             INC D
  703.             JP NZ,LOOP
  704.     WAIT:   IN B,(C)  ;Ждем принятия
  705.             JP M,WAIT ;последнего байта
  706.             LD A,#D2
  707.             CALL SENDCOM
  708.             IN A,(GSDAT) ; Номер модуля
  709.             OUT (GSDAT),A
  710.             LD A,#31
  711.  
  712.    SENDCOM: OUT (GSCOM),A
  713.    WAITCOM: IN A,(GSCOM)
  714.             RRCA
  715.             JR C,WAITCOM
  716.             RET
  717. \end{verbatim}
  718.  
  719. \subsubsection{\#31 Play module}
  720. Проигрывание модуля.
  721. \begin{verbatim}
  722.    SD Module_Handle - номер модуля
  723.    SC #31
  724.    WC
  725. \end{verbatim}
  726.  
  727. \subsubsection{\#32 Stop module}
  728. Остановить проигрывание модуля.
  729. \begin{verbatim}
  730.    SC #32
  731.    WC
  732. \end{verbatim}
  733.  
  734. \subsubsection{\#33 Continue module}
  735. Продолжить проигрывание модуля после остановки.
  736. \begin{verbatim}
  737.    SC #33
  738.    WC
  739. \end{verbatim}
  740.  
  741. \subsubsection{\#35 Set Module Volume}
  742. Установить громкость проигрывания модулей.
  743. \begin{verbatim}
  744.    SD Module_Master_Volume [#00..#40]
  745.    SC #35
  746.    WC
  747.   [GD Old_Master_Volume] - Старая громкость
  748. \end{verbatim}
  749.  
  750. \subsubsection{\#36 Data on\Cyrax}
  751. Устанавливает регистр данных в \#FF.
  752. \begin{verbatim}
  753.    SC #36
  754.    WC
  755.   [GD Data (#FF) ]
  756. \end{verbatim}
  757.  
  758. \subsubsection{\#37 Reinitialisation\Cyrax}
  759. Переустанавливает внутренние переменные в исходное состояние.
  760. \begin{verbatim}
  761.    SC #37
  762.    WC
  763. \end{verbatim}
  764.  
  765. \subsubsection{\#38 Load FX\label{cmd:38}}
  766. Загрузка сэмпла эффекта в память. Загружает беззнаковые сэмплы (PC type)
  767. \begin{verbatim}
  768.    SC #38
  769.    WC
  770.   [GD FX_Handle]-номер сэмпла
  771.   (Command bit=0, Data bit=0)
  772.    SC #D1 (Open Stream-открыть поток)
  773.    WC
  774.  
  775.    SD \
  776.    WD  \
  777.    ...   Байты сэмпла
  778.    SD  /
  779.    WD /
  780.  
  781.    SC #D2 (Close Stream-закрыть поток)
  782.    WC
  783. \end{verbatim}
  784.  
  785. При загрузке каждого сэмпла, в памяти GS создается для этого сэмпла заголовок, в котором описываются различные параметры сэмпла. После загрузки эти параметры устанавливаются в определенные значения, как то:  Note=60,    Volume=\#40,    FineTune=0,    SeekFirst=\#0F,    SeekLast=\#0F, Priority=\#80,  No Loop и внутренняя переменная CurFX устанавливается равной FX\_Handle.
  786. Затем командами~\hyperref[cmd:40]{\#40}, \hyperref[cmd:41]{\#41}, \hyperref[cmd:42]{\#42}, \hyperref[cmd:45]{\#45},
  787. \hyperref[cmd:46]{\#46} и \hyperref[cmd:47]{\#47} можно эти значения по умолчанию сменить на свои.
  788. Это требуется потому что команда~\hyperref[cmd:39]{\#39} для инициации проигрывания сэмпла использует значения
  789. параметров из заголовка сэмпла.
  790. В своем естественном виде сэмплы обычно плохо пакуются компрессорами, но сжимаемость обычно можно поднять,
  791. если перевести сэмпл в Delta-вид, т.е. хранить не абсолютные значения сэмпла, а относительное смещение
  792. относительно предыдущего байта.  Примерно вот так вот можно перевести сэмпл в Delta-вид:
  793. \begin{verbatim}
  794.            LD HL,Start_of_sample
  795.            LD DE,0-Length_of_sample
  796.            LD C,#00
  797.  
  798.      LOOP: LD A,(HL)
  799.            SUB C
  800.            LD C,(HL)
  801.            LD (HL),A
  802.            INC E
  803.            JP NZ,LOOP
  804.            INC D
  805.            JP NZ,LOOP
  806. \end{verbatim}
  807.  
  808. А вот как можно закачать сэмпл:
  809. \begin{verbatim}
  810.             LD IX,Parameters
  811.             LD HL,Sample_address
  812.             LD DE,0-Sample_length
  813.             LD C,GSCOM
  814.  
  815.             LD A,#38
  816.             CALL SENDCOM
  817.             LD A,#D1
  818.             CALL SENDCOM
  819.  
  820.             LD A,(HL)
  821.     LOOP:   IN B,(C)
  822.             JP P,READY
  823.             IN B,(C)
  824.             JP M,LOOP
  825.     READY:  OUT (GSDAT),A
  826.             INC HL
  827.             ADD A,(HL)
  828.             INC E
  829.             JP NZ,LOOP
  830.             INC D
  831.             JP NZ,LOOP
  832.     WAIT:   IN B,(C)  ;Ждем принятия
  833.             JP M,WAIT ;последнего байта
  834.             LD A,#D2
  835.             CALL SENDCOM
  836.  
  837.      ; Теперь переопределяем параметры
  838.      ; сэмпла по умолчанию своими
  839.      ; значениями
  840.  
  841.             LD A,(IX+#00)
  842.             OUT (GSDAT),A  ; Нота
  843.             LD A,#40
  844.             CALL SENDCOM
  845.             LD A,(IX+#01)
  846.             OUT (GSDAT),A  ; Громкость
  847.             LD A,#41
  848.  
  849.    SENDCOM: OUT (GSCOM), A
  850.    WAITCOM: IN A,(GSCOM)
  851.             RRCA
  852.             JR C,WAITCOM
  853.             RET
  854. \end{verbatim}
  855.  
  856. \subsubsection{\#39 Play FX\label{cmd:39}}
  857. Проигрывание эффекта.
  858. \begin{verbatim}
  859.    SD FX_Handle - номер сэмпла
  860.    SC #39
  861.    WC
  862. \end{verbatim}
  863.  
  864. При исполнении этой команды происходит следующее: смотрятся каналы, указанные в SeekFirst параметре нашего сэмпла,
  865. и если хотя-бы один из них свободен,  в нем и проигрывается сэмпл, в противном случае смотрятся  каналы,
  866. указанные в SeekLast и если один из них свободен, в нем и играется сэмпл, если свободных нет,
  867. то просматриваются все каналы, указанные SeekLast, из них выбирается канал с наименьшим приоритетом
  868. и сравнивается с приоритетом нашего сэмпла (имеется в виду сэмпл, который мы хотим проиграть),
  869. если  у этого сэмпла будет больший приоритет, чем у сэмпла, уже играющего в канале,
  870. то играющий в канале сэмпл будет остановлен, а наш сэмпл будет запущен в этом канале вместо старого сэмпла.
  871. Вот такая вот приоритетная схема\ldots
  872.  
  873. Тогда сэмпл запускается в канале, то его нота, громкость и т.п. параметры записываются в область данных канала
  874. из заголовка сэмпла.
  875.  
  876. В общем случае, чтобы проиграть сэмпл с нужными параметрами, вы можете установить эти параметры
  877. после загрузки сэмпла и смело использовать команду~\hyperref[cmd:39]{\#39}.
  878. Если же параметры должны меняться, то можно поступать следующим образом:
  879. командой~\hyperref[cmd:2E]{\#2E} сделать текущим требуемый сэмпл, командами  \#4x  изменить его параметры,
  880. а затем уже запускать его командой~\hyperref[cmd:39]{\#39}.
  881.  
  882. Альтернативный метод запуска сэмплов предоставляют команды~\hyperref[cmd:80]{\#80}---\hyperref[cmd:9B]{\#9B},
  883. при исполнении этих команд вы прямо в коде команды указываете, в каком канале требуется запустить сэмпл,
  884. и кроме этого, вы можете также указать с какой нотой и/или громкостью требуется запустить сэмпл.
  885.  
  886. \subsubsection{\#3A Stop FX in channels}
  887. Установка проигрывания эффектов в заданных каналах, которые указываются в маске каналов (Channel Mask). В ней единица в n-ном бите указывает на то, что эффект в n-ном канале требуется остановить
  888. \begin{verbatim}
  889.    SD Channel_Mask
  890.    SC #3A
  891.    WC
  892. \end{verbatim}
  893.  
  894. Описанное выше есть идеальный вариант работы данной команды, но к сожалению не все так просто в этом мире, и эта команда действует не так, а именно: единица в бите 7 останавливает сэмпл в нулевом канале, и т.п. В следующих версиях это будет исправлено,  а пока я могу порекомендовать останавливать вообще все сэмплы маской \#FF.
  895.  
  896. \subsubsection{\#3D Set FX Volume}
  897. Установить громкость проигрывания эффектов.
  898. \begin{verbatim}
  899.    SD FX Volume [#00..#40]
  900.    SC #3D
  901.    WC
  902.   [GD Old_FX_Volume] - Старая громкость
  903. \end{verbatim}
  904.  
  905. \subsubsection{\#3E Load FX (Extended version)}
  906. Загрузка сэмпла эффекта в память. Позволяет загружать сэмплы со знаком. (Amiga type)
  907. \begin{verbatim}
  908.    SD #01 (Signed sample)
  909.    SC #3E
  910.    WC
  911.   [GD FX_Handle]-номер сэмпла
  912.   (Command bit=0, Data bit=0)
  913.    SC #D1 (Open Stream-открыть поток)
  914.    WC
  915.  
  916.    SD \
  917.    WD  \
  918.    ...   Байты сэмпла
  919.    SD  /
  920.    WD /
  921.  
  922.    SC #D2 (Close Stream-закрыть поток)
  923.    WC
  924. \end{verbatim}
  925.  
  926. \subsubsection{\#40 Set FX Sample Playing Note\label{cmd:40}}
  927. Установка ноты по умолчанию для текущего эффекта.
  928. \begin{verbatim}
  929.    SD Note [0..95]
  930.    SC #40
  931.    WC
  932. \end{verbatim}
  933.  
  934. \begin{verbatim}
  935. Note=
  936. 0 C-0
  937. 1 C#0
  938. 12 C-1
  939. 24 C-2
  940. 36 C-3 (C-1 в Амиге)
  941. 48 C-4 (C-2 в Амиге)
  942. 60 C-5 (C-3 в Амиге)
  943. 72 C-6
  944. 84 C-7
  945. \end{verbatim}
  946.  
  947. В данной версии Sound Generators Wave 2, 3 могут воспроизвести октавы 3, 4 и 5,  поэтому допустимым значением параметра Note является диапазон от 36 до 71.
  948.  
  949. \subsubsection{\#41 Set FX Sample Volume\label{cmd:41}}
  950. Установка громкости по умолчанию для текущего эффекта.
  951. \begin{verbatim}
  952.    SD FX_Volume [#00..#40]
  953.    SC #41
  954.    WC
  955. \end{verbatim}
  956.  
  957. \subsubsection{\#42 Set FX Sample Finetune\label{cmd:42}}
  958. Установка Finetune по умолчанию для текущего эффекта.
  959. \begin{verbatim}
  960.    SD FX_Finetune [#00..#40]
  961.    SC #42
  962.    WC
  963. \end{verbatim}
  964.  
  965. \subsubsection{\#43 --- \#44 Зарезервированы}
  966. \subsubsection{\#45 Set FX Sample Priority\label{cmd:45}}
  967.  
  968. Установка приоритета для текущего эффекта. (См. Команду~\hyperref[cmd:39]{\#39})
  969. \begin{verbatim}
  970.    SD FX_Priority [#01..#FE]
  971.    SC #45
  972.    WC
  973. \end{verbatim}
  974.  
  975. После закачки каждому эффекту выставляется по умолчанию приоритет \#80. Эффекты, проигрываемые в модулях, имеют приоритет \#40.
  976.  
  977. \subsubsection{\#46 Set FX Sample Seek First parameter\label{cmd:46}}
  978. Установка параметра Seek First для текущего эффекта. (См. Команду~\hyperref[cmd:39]{\#39})
  979. \begin{verbatim}
  980.    SD FX_SeekFirst
  981.    SC #46
  982.    WC
  983. \end{verbatim}
  984.  
  985. В параметре FX\_SeekFirst используются 4 младших бита, номера каналов GS располагаются по возрастающей.
  986. \begin{verbatim}
  987.         бит 0 - канал 0
  988.         бит 1 - канал 1
  989.         бит 2 - канал 2
  990.         бит 3 - канал 3
  991. \end{verbatim}
  992.  
  993. Например, байт 00001010 включит первый и третий каналы General Sound.
  994.  
  995. \subsubsection{\#47 Set FX Sample Seek Last parameter\label{cmd:47}}
  996. Установка параметра Seek Last для текущего эффекта. (См. команду~\hyperref[cmd:39]{\#39})
  997. \begin{verbatim}
  998.    SD FX_SeekLast
  999.    SC #47
  1000.    WC
  1001. \end{verbatim}
  1002. Формат FX\_SeekLast соответствует формату FX\_SeekFirst (См. команду~\hyperref[cmd:46]{\#46})
  1003.  
  1004. \subsubsection{\#48 Set FX Sample Loop Begin\Cyrax}
  1005. Установка начала цикла для текущего эффекта.
  1006. \begin{verbatim}
  1007.    SD LEN.L
  1008.    SC #48
  1009.    WC
  1010.    SD LEN.M
  1011.    WD
  1012.    SD LEN.H
  1013.    WD
  1014. \end{verbatim}
  1015.  
  1016. При равенстве LEN.H --- \#FF зацикливание не производится
  1017.  
  1018. \subsubsection{\#49 Set FX Sample Loop End\Cyrax\label{cmd:49}}
  1019. Установка конца цикла для текущего эффекта.
  1020. \begin{verbatim}
  1021.    SD LEN.L
  1022.    SC #49
  1023.    WC
  1024.    SD LEN.M
  1025.    WD
  1026.    SD LEN.H
  1027.    WD
  1028. \end{verbatim}
  1029.  
  1030. \subsubsection{\#4A --- \#4F Зарезервированы.}
  1031.  
  1032. \subsubsection{\#51 --- \#5F Зарезервированы.}
  1033.  
  1034. \subsubsection{\#60 Get Song Position}
  1035. Получение значения переменной Song\_Position в текущем модуле.
  1036. \begin{verbatim}
  1037.    SC #60
  1038.    WC
  1039.    GD Song_Position  [#00..#FF]
  1040. \end{verbatim}
  1041.  
  1042. Можно интерпретировать как количество проигранных паттернов модуля. После старта модуля принимает значение 0 и увеличивается на единицу после проигрывания очередного паттерна. Эта переменная может использоваться для синхронизирования процессов в Спектруме с проигрыванием модуля. Для этого можно, например, в начале процедуры обработки прерывания сделать SC  \#60, затем выполнить процедуры различных операций с экраном, скроллинга строчек и т.п. (т.е. чтобы была достаточная для выполнения команды задержка), а затем прочитать значение порта 179 (GD Song\_Position), и сравнить его с требуемым и, в случае равенства, перейти на следующую часть демы, т.е.
  1043. \begin{verbatim}
  1044.  if (Song_Position==My_Position)
  1045.  then goto Next_Part_Of_Demo
  1046. \end{verbatim}
  1047.  
  1048. \subsubsection{\#61 Get Pattern Position}
  1049. Получение значения переменной Pattern\_Position в текущем модуле.
  1050. \begin{verbatim}
  1051.    SC #61
  1052.    WC
  1053.    GD Pattern_Position  [#00..#3F]
  1054. \end{verbatim}
  1055.  
  1056. Получить значение смещения в паттерне (текущий ROW), использование --- аналогично предыдущей команде, однако требуется заметить, что эта величина изменяется довольно быстро, и поэтому
  1057. \begin{verbatim}
  1058. if (Pattern_Position>=My_Position)
  1059. then goto Next_Part_Of_Demo
  1060. \end{verbatim}
  1061.  
  1062. \subsubsection{\#62 Get Mixed Position}
  1063. Получить значение Pattern\_Position, немного смешанной с Song\_Position.
  1064. \begin{verbatim}
  1065.    SC #62
  1066.    WC
  1067.    GD Mixed_Position
  1068. \end{verbatim}
  1069.  
  1070.    Mixed\_Position: (по битам)
  1071. \begin{verbatim}
  1072.    7-Song_Position.1
  1073.    6-Song_Position.0
  1074.    5-Pattern_Position.5
  1075.    4-Pattern_Position.4
  1076.    3-Pattern_Position.3
  1077.    2-Pattern_Position.2
  1078.    1-Pattern_Position.1
  1079.    0-Pattern_Position.0
  1080. \end{verbatim}
  1081.  
  1082. Т.е. если получить Mixed\_Position и сделать с ним \texttt{AND} \#3F, то получится вылитый Pattern\_Position,
  1083. а если после получения его немного \texttt{RLCA}, \texttt{RLCA}, \texttt{AND} \#02 --- то это будут младшие два бита Song\_Position. См. примечания к командам \#60 и \#61.
  1084.  
  1085. \subsubsection{\#63 Get Channel Notes\label{cmd:63}}
  1086. Получить ноты всех каналов модуля.
  1087. \begin{verbatim}
  1088.    SC #63
  1089.    WC
  1090.    GD Note_of_channel_0
  1091.    WN
  1092.    GD Note_of_channel_1
  1093.    WN
  1094.    GD Note_of_channel_2
  1095.    WN
  1096.    GD Note_of_channel_3
  1097. \end{verbatim}
  1098.  
  1099. Если в каком-либо канале значение ноты изменилось с последнего исполнения команды~\hyperref[cmd:63]{\#63},
  1100. то бит 7 полученного значения Note\_of\_channel\_N будет в нуле, если же это значение то же самое,
  1101. что и было раньше, то этот бит будет в единице. Младшие семь битов и есть собственно нота от 0 до 95.
  1102. Если это значение равно 127, то это означает, что никакие сэмплы в канале не играют.
  1103. Данная команда предназначена в основном для построения на ее основе различных анализаторов.
  1104.  
  1105. \subsubsection{\#64 Get Channel Volumes\label{cmd:64}}
  1106. Получить громкости всех каналов модуля.
  1107. \begin{verbatim}
  1108.    SC #64
  1109.    WC
  1110.    GD Volume_of_channel_0
  1111.    WN
  1112.    GD Volume_of_channel_1
  1113.    WN
  1114.    GD Volume_of_channel_2
  1115.    WN
  1116.    GD Volume_of_channel_3
  1117. \end{verbatim}
  1118.  
  1119. См. описание команды \#63
  1120. \subsubsection{\#65 Jump to position\Cyrax}
  1121. Делает переход на заданную позицию.
  1122. \begin{verbatim}
  1123.    SD Position
  1124.    SC #65
  1125.    WC
  1126. \end{verbatim}
  1127.  
  1128. \subsubsection{\#66 Set speed/tempo\Cyrax}
  1129. Установка скорости в пределах \#01~---~\#1F. При значениях \#20~---~\#FF устанавливается темп проигрывания. Значения темпа соответствуют оригинальным при скорости равной \#06.
  1130. \begin{verbatim}
  1131.    SD Speed/Tempo
  1132.    SC #66
  1133.    WC
  1134. \end{verbatim}
  1135.  
  1136. \subsubsection{\#67 Get speed value\Cyrax}
  1137. Чтение текущей скорости.
  1138. \begin{verbatim}
  1139.    SC #67
  1140.    WC
  1141.    GD Speed
  1142.    WD
  1143. \end{verbatim}
  1144.  
  1145. \subsubsection{\#68 Get tempo value\Cyrax}
  1146. Чтение текущего темпа.
  1147. \begin{verbatim}
  1148.    SC #68
  1149.    WC
  1150.    GD Tempo
  1151.    WD
  1152. \end{verbatim}
  1153.  
  1154. \subsubsection{\#69 Process Sound\Cyrax}
  1155. Переход на следующий кварк (или тик) в процессе проигрывания звука. Может, в частности, использоваться  для синхронизации с выводом звука. Для этого нужно установить флаг занятости (Busy On — что вызовет остановку звука), а затем с нужной периодичностью  выдавать команду \#69 для дальнейшего проигрывания.
  1156. \begin{verbatim}
  1157.    SC #69
  1158.    WC
  1159. \end{verbatim}
  1160.  
  1161. \subsubsection{\#6A --- \#7F зарезервированы.}
  1162.  
  1163. \subsubsection{\#80 Direct Play FX Sample (\#80~---~\#83)\label{cmd:80}}
  1164. Проигрывание сэмпла в заданном канале.
  1165. \begin{verbatim}
  1166.    SD Sample_Number
  1167.    SC #80..#83 (Младшие биты определяют непосредственно номер канала, в
  1168.                 котором требуется играть сэмпл)
  1169.    WC
  1170. \end{verbatim}
  1171.  
  1172. \subsubsection{\#88 Direct Play FX Sample (\#88~---~\#8B)}
  1173. Проигрывание сэмпла в заданном канале с заданной нотой.
  1174. \begin{verbatim}
  1175.    SD Sample_Number
  1176.    SC #88..#8B (Младшие биты определяют непосредственно номер канала, в
  1177.                 котором требуется играть сэмпл)
  1178.    WC
  1179.    SD Note [0..95]
  1180.    WD
  1181. \end{verbatim}
  1182.  
  1183. \subsubsection{\#90 Direct Play FX Sample (\#90~---~\#93)}
  1184. Проигрывание сэмпла в заданном канале с заданной громкостью.
  1185. \begin{verbatim}
  1186.    SD Sample_Number
  1187.    SC #90..#93 (Младшие биты определяют непосредственно номер канала, в
  1188.                 котором требуется играть сэмпл)
  1189.    WC
  1190.    SD Volume [#00..#40]
  1191.    WD
  1192. \end{verbatim}
  1193.  
  1194. \subsubsection{\#98 Direct Play FX Sample (\#98~---~\#9B)\label{cmd:9B}}
  1195. Проигрывание сэмпла в заданном канале с заданной нотой и громкостью.
  1196. \begin{verbatim}
  1197.    SD Sample_Number
  1198.    SC #98..#9B (Младшие биты определяют непосредственно номер канала, в
  1199.                 котором требуется играть сэмпл)
  1200.    WC
  1201.    SD Note [0..95]
  1202.    WD
  1203.    SD Volume [#00..#40]
  1204.    WD
  1205. \end{verbatim}
  1206.  
  1207. \subsubsection{\#A0 Change Channel Note (\#A0~---~\#A3)\Cyrax}
  1208. Смена текущей ноты в заданном канале. Производится «на лету».
  1209. \begin{verbatim}
  1210.      SD Note
  1211.      SC #A0..#A3
  1212.      WC
  1213. \end{verbatim}
  1214.  
  1215. \subsubsection{\#A8 Change Channel Volume (\#A8~---~\#AB)\Cyrax}
  1216. Подобно предыдущей команде «на лету» меняет громкость канала.
  1217. \begin{verbatim}
  1218.      SD Volume
  1219.      SC #A8..#AB
  1220.      WC
  1221. \end{verbatim}
  1222. Предыдущие две команды работают вне зависимости от того, что проигрывается в данном канале --- семпл или модуль. Появлении в канале нового звука — от модуля либо семпла вернет все в исходное состояние — то есть громкость либо нота будут те, которые указаны вновь поступившего звука. В силу данной темперированности для получения требуемого эффекта данные команды следует вызывать с некоей периодичностью (устанавливается экспериментально).
  1223.  
  1224. \subsubsection{\#B0 --- \#F0 Зарезервированы}
  1225.  
  1226. \subsubsection{\#F1 --- \#F2 Зарезервированы}
  1227. \subsubsection{\#F3 Warm restart\label{cmd:F3}}
  1228. Сбрасывает полностью GS, но пропускает этапы определения количества страниц памяти и их проверки, что очень сильно ускоряет процесс инициализации.
  1229. \begin{verbatim}
  1230.    SC #F3
  1231.    WC
  1232. \end{verbatim}
  1233.  
  1234. \subsubsection{\#F4 Cold restart\label{cmd:F4}}
  1235. Полный перезапуск GS со всеми проверками. По сути, \texttt{JP \#0000}.
  1236. \begin{verbatim}
  1237.    SC #F4
  1238.    WC
  1239. \end{verbatim}
  1240.  
  1241. \subsubsection{\#F5 Busy on}
  1242. Устанавливает флаг занятости в \#FF
  1243. \begin{verbatim}
  1244.    SC #F5
  1245.    WC
  1246. \end{verbatim}
  1247.  
  1248. \subsubsection{\#F6 Busy off}
  1249. Устанавливает флаг занятости в \#00
  1250. \begin{verbatim}
  1251.    SC #F6
  1252.    WC
  1253. \end{verbatim}
  1254.  
  1255. Изначально Busy = \#00. Исполнение всех команд в GS выполняется в  главном цикле командного интерпретатора. Этот цикл в условном виде можно представить так:
  1256. \begin{verbatim}
  1257. 1 if Command bit=0 then go to 1
  1258. 2 Execute Command
  1259. 3 if Command bit=1 then go to 2
  1260. 4 if Playing=0 then go to 1
  1261. 5 if Busy=#FF then go to 1
  1262. 6 Process Sound
  1263. 7 go to 1
  1264. \end{verbatim}
  1265.  
  1266. Используя команды Busy можно например инициировать проигрывание сэмплов во всех каналах, потом скажем изменить параметры проигрывания в каналах, а потом запустить это все одновременно. Если же их не использовать, то возможна такая ситуация: инициируется первый (сэмпл станет проигрываться, а только потом инициируется второй сэмпл и т.д.).
  1267.  
  1268. \subsubsection{\#F7 Get HX Register\Cyrax}
  1269. Получить содержимое регистра HX (GS).
  1270. HX участвует в обработке флага Busy (bit 7 0/1 – Busy On/Off).
  1271. \begin{verbatim}
  1272.    SC #F7
  1273.    WC
  1274.    GD HX
  1275.    WN
  1276. \end{verbatim}
  1277.  
  1278. \subsubsection{\#F8 --- \#F9 Зарезервированы}
  1279.  
  1280. \subsubsection{\#FA Out zero\_to\_zero}
  1281. Вывод нуля в нулевой (конфигурационный) порт GS. Делает приостановку звучания музыки до следующего чтения из к.л. порта.
  1282. \begin{verbatim}
  1283.    SC #FA
  1284.    WC
  1285. \end{verbatim}
  1286.  
  1287. \subsubsection{\#FA включение тестового режима\label{cmd:FA}}
  1288. Специальная команда для тестирования General Sound: 250 (\#FA).
  1289. Сначала в регистр команд кидается команда \#FA, после чего General Sound переходит в режим тестовых команд.
  1290. Далее в тот же регистр команд кидаем следующие команды:\\
  1291. \begin{tabu}{|l|X|}
  1292. \hline
  1293. \textbf{Команда} & \textbf{Действие}\\
  1294. \hline
  1295. 2 --- 5 & запись в громкость 63 и потом в звук попеременно 0 и 255, до тех пор, пока не подана новая команда \\ \hline
  1296. 6 & пишет в регистр данных то 0, то 255 (для проверки считывания данных со стороны спектрума)\\ \hline
  1297. 7 --- 10 & пишет 255 в звук, затем 0 и 255 в громкость\\ \hline
  1298. 11 --- 14 & ставит максимальную громкость, пищит в канал 0 и 255, и громкость уменьшает\\ \hline
  1299. 15 & во всех каналах ставит максимальные громкости и выдает пилу на звук\\ \hline
  1300. 16 & забирает данные из регистра данных и сбрасывает флаг поступления команды\\ \hline
  1301. 17 & забирает данные и не сбрасывает флаг поступления команды\\ \hline
  1302. 18 --- 21 & при максимальной громкости пишет в звук то 0, то байт из регистра данных\\
  1303. \hline
  1304. \end{tabu}
  1305.  
  1306. \subsubsection{\#FB --- \#FF Зарезервированы}
  1307.  
  1308. \subsection{Примечания}
  1309. \begin{enumerate}
  1310. \item Команды, отмеченные как~\Cyrax,  являются недокументированными и в полной мере относятся только к версии 1.04.
  1311. На работоспособность этих команд в последующих версиях автор описания (\hyperref[Cyrax]{2}) ответственности не несет.
  1312. \item Напоминаю, что регистры (их имена), упомянутые в этом описании, относятся только и только к внутренним регистрам GS и никакого отношения к регистрам основного процессора не имеют.
  1313. \item Данная редакция (006) является наиболее полной и точной на данный момент --- 18.04.2002. Так же она является последней и несет скорее познавательный характер (по крайней мере автор не видит иного применения данной сводки команд, кроме как для высокоуровневой эмуляции GS).
  1314. На дополнение сего текста меня сподвиг тот факт, что после порядка 4х лет я узрел свой труд в сети, да еще в составе тех описаний карточки. Поэтому мне хотелось бы, чтобы дока была по возможности наиболее полной и точной\ldots
  1315. \end{enumerate}
  1316.  
  1317. \subsection{Соответствие нумерации каналов Amiga и General Sound\label{sec:chn}}
  1318. Несмотря на то, что раскладка каналов по стерео в General Sound выполнена аналогично Amiga Protracker, нумерация каналов, принятая в трекерах, не соответствует нумерации каналов в командах управления General Sound.
  1319. Раскладка каналов по стерео в Amiga Protracker:
  1320. \begin{description}
  1321. \item[AM1] --- левый канал
  1322. \item[AM2] --- правый канал
  1323. \item[AM3] --- правый канал
  1324. \item[AM4] --- левый канал
  1325. \end{description}
  1326.  
  1327. Раскладка каналов по стерео в General Sound:
  1328. \begin{description}
  1329. \item[GS0] --- левый канал
  1330. \item[GS1] --- левый канал
  1331. \item[GS2] --- правый канал
  1332. \item[GS3] --- правый канал
  1333. \end{description}
  1334.  
  1335. Таким образом, между собой каналы соответствуют друг-другу следующим образом:
  1336. \begin{verbatim}
  1337. GS0->AM1
  1338. GS1->AM4
  1339. GS2->AM2
  1340. GS3->AM3
  1341. \end{verbatim}
  1342.  
  1343. Эта информация полезна при выставлении SeekFirst/SeekLast параметров для совмещения проигрывания модулей и эффектов.
  1344. Если перевести нумерацию каналов параметра SeekFirst из GS в Amiga нумерацию, то раскладка каналов по битам SeekFirst/SeekLast будет следующей:
  1345. \begin{verbatim}
  1346. 00001111
  1347.    ||||
  1348.    3241
  1349. \end{verbatim}
  1350. Например, если в Mod-трекере видно, что у модуля свободны каналы 1 и 3, то в большинстве случаев было бы разумно сначала попытаться проиграть сэмпл в этих каналах, а потом уже в любых других. Для этого в SeekFirst параметр следует выставить
  1351. \%00001001, задействовав GS-каналы 0 и 3, которым соответствуют каналы трекера 1 и 3.
  1352.  
  1353. \section{Heмнoгo лиpики...}
  1354. \subsection{Автopы GS : ( 2 штуки ;)}
  1355. \subsubsection{Cлaвa Dangеrous (X-Tradе)}
  1356. 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.
  1357.  
  1358. \subsubsection{Stingеr}
  1359. Этo я, aвтop сeгo oпусa и пo сoвмeститeльству душa и сepдцe GeneralSound'a.
  1360. Я являюсь  paзpaбoтчикoм всeгo встpoeннoгo Soft'a в GS'e и пpeдпoлaгaю и дaльшe зaнимaться сим дeйствoм.
  1361. (Д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,
  1362. eсли бы нe был всe вpeмя сдepживaeм Cлaвoй,  пoстoяннo oзaбoчeнным пpoблeмaми пoнижeния цeны.)
  1363.  
  1364. Haписaв oкoлo 20 кб кoдa зa пoл-гoдa, пpизнaться, я нeмнoгo устaл, нo имeю дoвoльнo бoльшиe
  1365. плaны oтнoситeльнo слeдующиx вepсий GS'a, кaк-тo:
  1366. \begin{itemize}
  1367. \item Wave 4 Sound Generators вoспpoизвoдящиx всe oктaвы
  1368. \item Ускopeниe зa счeт oныx пpoцeнтoв нa 30~---~40 гeнepaции звукa
  1369. \item Oчeнь xoтeлoсь бы пpoигpывaниe STM'oв oт PC
  1370. \item Paзвитaя систeмa кoмaнд
  1371. \item Paзличныe спeцэффeкты нaд сэмплaми
  1372. \item 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)
  1373. \item И мнoгoe дpугoe
  1374. \end{itemize}
  1375.  
  1376. Bсe пpoгpaммнoe oбeспeчeниe дoлжнo paбoтaть и нa пoслeдующиx вepсияx пpoшивки,
  1377. eсли oнo нaписaнo в сooтвeтствии с мoими вышeизлoжeнными пoжeлaниями и тpeбoвaниями.
  1378. К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ны,
  1379. и я oстaвляю зa сoбoй пpaвo измeнять иx кaким-угoднo oбpaзoм и тoлькo oтнoситeльнo
  1380. дoкумeнтиpoвaныx кoмaнд пpиeмлю зaкoнныe пpeтeнзии  типa:
  1381. ``B дoкумeнтaции нaписaнo тaк, a в пpoшивкe этo paбoтaeт пo дpугoму...''.
  1382.  
  1383. Я плaниpую знaчитeльнoe paсшиpeниe систeмы кoмaнд, и буду paд кoнстpуктивным (жeлaтeльнo кoнкpeтным) пpeдлoжeниям.
  1384. Taк чтo, eсли вы oзвучивaeтe игpушку или пишeтe музыкaльный peдaктop для GS и oбнapуживaeтe,
  1385. чтo вaм oчeнь нe xвaтaeт кaкoй-либo кoмaнды, тo звoнитe мнe и выскaзывaйтe пpeдлoжeния.
  1386. (Teлeфoн, я думaю, oсoбoгo тpудa узнaть нe сoстaвит ;)
  1387.  
  1388. \subsection{Sanx 4 moral support:}
  1389. Димa (X-Trade)
  1390. SParker (XLD)
  1391.  
  1392. \section{General Sound ROM v1.05a}
  1393. \copyright~Stinger, 1997,
  1394. bugfixed by psb \& Evgeny Muchkin, 2007.
  1395. В данной версии прошивки исправлены глюки версии 1.04 Beta.
  1396. \begin{enumerate}
  1397. \item Глюк с модулями, в которых >= 63 паттерна (klisje.mod, tranceillusion.mod).
  1398. \item Глюк со скоростью проигрывания ПОСЛЕДНЕЙ ноты модуля, её скорость выставлялась стандартной,
  1399. во многих модулях при зацикливании была заметна задержка\\
  1400. (напр., technostyle(z).mod).
  1401. Более того, при зацикливании не на 1ю позицию, скорость все равно выставлялась стандартной!
  1402. \item Пофиксена неправильная скорость проигрывания сэмплов. На некоторых модулях было заметно,
  1403. что сэмплы играли немного быстрее чем надо (например, EightMayDay.mod).
  1404. \item При начале проигрывания модуля GS сообщал, что играет какая-то нота, даже если в канале ничего не играло
  1405. (команда~\hyperref[cmd:64]{\#64} возвращала не 127).
  1406. \item Добавлена команда для плееров: \#6A --- Set player mode.
  1407. После этой команды GS перестанет обращать внимание на команду останова в модуле (ком. F00).
  1408. Полезно для некоторых модулей (bst.mod).\label{cmd:6A}
  1409. \end{enumerate}
  1410.  
  1411. Формат команды:
  1412. \begin{verbatim}
  1413.    SD #01       ;#01 - On, #00 — Off
  1414.   SC #6A
  1415.   WC                              
  1416. \end{verbatim}
  1417. \begin{enumerate}[resume]
  1418. \item Встроен релупер для модулей. Раньше, если в модуле играл сэмпл,
  1419. длина лупа которого была слишком маленькой (десятки-сотни байт), GS тормозил или зависал.
  1420. После этой команды сэмплы в загружаемом модуле фиксятся и GS не тормозит.\label{cmd:6B}
  1421. \end{enumerate}
  1422.  
  1423. Формат команды:
  1424. \begin{verbatim}
  1425.             SD MinLoopLen_Low
  1426.             SC #6B
  1427.             WC
  1428.             SD MinLoopLen_High
  1429. \end{verbatim}
  1430.  
  1431.         Параметр MinLoopLen задается в СЛОВАХ и может быть в диапазоне от 0 до 16384
  1432. (0 --- релупер выключен).
  1433.         Возможен короткий формат команды:
  1434. \begin{verbatim}
  1435.    SC #6B
  1436.    WC
  1437.     SC ...      ;следующая команда GS
  1438. \end{verbatim}
  1439.  
  1440.                 В этом случае длина поумолчанию будет 512 слов.
  1441.  
  1442. \textbf{ВНИМАНИЕ!} Настройки команд~\hyperref[cmd:6A]{\#6A} и \hyperref[cmd:6B]{\#6B}
  1443. сбрасываются только аппаратным RESET или командой~\hyperref[cmd:F4]{\#F4}
  1444. (командой~\hyperref[cmd:F3]{\#F3} не сбрасываются!).
  1445.  
  1446. \textbf{P.S.} В прошивке по смещению \#0004 находится номер версии в BCD формате;
  1447. по смещению \#0100 находятся оригинальные копирайты (3 строки по 24 символа);
  1448. по смещению \#0080 находится информация о патче, строка заканчивается 0.
  1449.  
  1450. \textbf{P.P.S.} Для работы старых плееров в новых режимах (п.\ref{cmd:6A} и \ref{cmd:6B}),
  1451. достаточно перед их запуском дать из бейсика команды:
  1452. \begin{verbatim}
  1453.    OUT 179,1
  1454.    OUT 187,106
  1455.    OUT 187,107
  1456. \end{verbatim}
  1457.  
  1458. \textbf{P.P.P.S.} Хочется выразить особую благодарность следующим людям:
  1459. \begin{description}
  1460. \item[Stinger:] за прошивку и доступные исходники
  1461. \item[Aprisobal:] без SjASMPlus не было бы ничего этого
  1462. \item[Evgeny Muchkin:] за всяческое содействие при создании патча
  1463. \item[Caro:] за IDA и моральную поддержку
  1464. \item[SMT \& Alone Coder:] за UnrealSpeccy (и за исправление глюков в нем!;)
  1465. \item[Half Elf:] за плагины к FAR'у
  1466. \item[n1k-o \& Manwe:] за консультации по mod'ам
  1467. \end{description}
  1468.  
  1469. \section{История версий}
  1470.  
  1471. 24.02.2012: thx Evgeny Muchkin\\
  1472. добавлен  пункт~\ref{cmd:FA}~\hyperref[cmd:FA]{\#FA} включение тестового режима.
  1473.  
  1474. 18.01.2011: thx  moroz1999\\
  1475. дополнено описание~\ref{cmd:45}~\hyperref[cmd:45]{\#45} Set FX Sample Priority;\\
  1476. дополнено описание~\ref{cmd:46}~\hyperref[cmd:46]{\#46} Set FX Sample Seek First parameter;\\
  1477. дополнено описание~\ref{cmd:47}~\hyperref[cmd:47]{\#47} Set FX Sample Seek Last parameter;\\
  1478. добавлен пункт~\ref{sec:chn} Соответствие нумерации каналов Amiga и General Sound.
  1479.  
  1480. 19.07.2009: базовая версия.
  1481. \end{document}
  1482.