Subversion Repositories pentevo

Rev

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}