Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
797 | DimkaM | 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 | |||
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} |