Приложение 1
Листинги звуковых эффектов SUPER SOUNDа
Все эффекты приведены точно в таком ви-
де, как в SUPER SOUND v2.2 и снабжены ком-
ментариями. Метки, начинающиеся с симво-
лов "+","*",":" и "?" являются специальны-
ми и отмечают изменяемые значения:
+ - однобайтовое изменяемое значение
* - два однобайтовых изменяемых значения
: - двухбайтовое изменяемое значение
? - изменяемая команда
Слово, следующее за специальным симво-
лом, повторяет название пункта в програм-
ме, отвечающего за данный параметр (воз-
можно в сокращенном виде). В случае изме-
няемой команды в комментарии (в скобках)
указаны все возможные варианты. Для нор-
мальной компиляции специальные метки необ-
ходимо удалить или переименовать.
1415.
Input Sound
10 DI ; запрет прерываний
20 LD HL,37000 ; HL=адрес сохранения звука
30 :LENGTH LD DE,27000 ; DE=длительность звука
40 LOOP1 LD B,8 ; B=счетчик битов
50 LOOP2 SLA (HL) ; скроллинг значения в
памяти
60 IN A,(254) ; ввести значение из порта
254
70 BIT 6,A ; проверить бит магнитофона
80 JR Z,+INPUT_SPD ; если 0, то перейти на
NOSIGN
90 SET 0,(HL) ; установить бит D0 в памяти
100 +INPUT_SPD LD C,3 ; C=задержка
110 PAUSE DEC C ; C=C-1
120 JR NZ,PAUSE ; если C<>0, то цикл
130 DJNZ LOOP2 ; продолжить цикл обработки
байта
140 INC HL ; HL=HL+1
150 DEC DE ; DE=DE-1
160 LD A,D ; DE=
170 OR E ; 0 ?
180 JR NZ,LOOP1 ; если нет, то цикл
190 EI ; разрешение прерываний
200 RET ; возврат
Play Sound
10 CALL 124 ; по адресу 124 находится RET
20 DEC SP ; поднять указатель стека
30 DEC SP ; на два байта
40 POP HL ; снять со стека адрес строки
20
50 LD DE,47 ; DE=число байт от строки 20
до буфера
60 ADD HL,DE ; HL=адрес буфера
70 :LENGTH LD DE,27000 ; DE=длительность звука
80 ?REVERSE NOP ; резерв для REVERSE (ADD HL,
DE)
90 DI ; запрет прерываний
100 LD A,(23624) ; A=
110 RRA ; цвет
120 RRA ; бор-
130 RRA ; дюра
140 LOOP3 LD B,8 ; B=счетчик битов
150 LOOP4 AND 239 ; сброс бита D4 регистра A
160 RLC (HL) ; скроллинг данных через флаг
CY
170 JR NC,NOSGN ; если флаг CY=0, то перейти на
NOSGN
180 OR 16 ; установка бита D4 регистра A
190 NOSGN OUT (254),A ; вывод A в порт 254
200 +PLAY_SPD LD C,3 ; C=задержка
210 PAUS2 DEC C ; C=C-1
220 JR NZ,PAUS2 ; если C<>0, то цикл
230 DJNZ LOOP4 ; продолжить цикл обработки
байта
240 ?REVERSE INC HL ; HL=HL+1 (DEC HL)
250 LD C,A ; сохранение A
260 DEC DE ; DE=DE-1
270 LD A,D ; DE=
280 OR E ; 0 ?
290 LD A,C ; восстановление A
300 JR NZ,LOOP3 ; если DE<>0, то цикл
310 EI ; разрешение прерываний
320 RET ; возврат
Double Beep
10 DI ; запрет прерываний
20 *FRQ1,FRQ2 LD DE,13000 ; E=частота 1, D=частота 2
30 +DURATION LD H,100 ; H=длительность
40 LD A,(23624) ; A=
50 RRA ; цвет
60 RRA ; бор-
70 RRA ; дюра
80 LD C,A ; сохранение A
90 EX AF,AF' ; смена регистров A и F на
альтернативные
100 LD A,C ; восстановление A
110 LD C,E ; C=счетчик 1
120 LD B,D ; B=счетчик 2
130 BEEP EX AF,AF' ; смена регистров A и F (смена
голоса)
140 DEC C ; C=C-1
150 JR NZ,CONT ; если C<>0, топерейти на CONT
160 LD C,E ; восстановить счетчик 1
170 XOR 16 ; инвертировать бит D4 голоса
1
180 CONT OUT (254),A ; вывести A в порт 254
190 EX AF,AF' ; смена регистров A и F (смена
голоса)
200 DEC B ; B=B-1
210 JR NZ,CONT2 ; если B<>0, то перейти на
CONT2
220 LD B,D ; восстановить счетчик 2
230 XOR 16 ; инвертировать бит D4 голоса
2
240 CONT2 OUT (254),A ; вывести A в порт 254
250 INC L ; L=L+1
260 JR NZ,BEEP ; если L<>0, то перейти на
BEEP
270 DEC H ; H=H-1
280 JR NZ,BEEP ; если H<>0, то перейти на
BEEP
290 EI ; разрешение прерываний
300 RET ; возврат
Exploding 1
10 :GROUP LD HL,0 ; HL=адрес ПЗУ
20 LD A,(23624) ; A=
30 RRA ; цвет
40 RRA ; бор-
50 RRA ; дюра
60 LD D,A ; D=A
70 *FRQ,LEN LD BC,38401 ; C=частота,B=длина
80 LOOP1 PUSH BC ; сохранение BC
90 +DURATION LD B,20 ; B=длительность
100 LOOP2 LD A,(HL) ; A=содержимое ячейки ПЗУ
110 AND 248 ; сброс битов бордюра
120 OR D ; установка битов бордюра
130 OUT (254),A ; вывод A в порт 254
140 PUSH BC ; сохранение BC
150 LD B,C ; B=частота
160 LOOP3 DJNZ LOOP3 ; задержка
170 INC HL ; HL=HL+1
180 POP BC ; восстановление BC
190 DJNZ LOOP2 ; цикл
200 POP BC ; восстановление BC
210 ?INCREASE INC C ; увеличение задержки (DEC C)
220 DJNZ LOOP1 ; цикл
230 RET ; возврат
Exploding 2
10 LD A,(23624) ; A=
20 RRA ; цвет
30 RRA ; бор-
40 RRA ; дюра
50 LD L,A ; L=A
60 *FRQ,LEN LD DE,12801 ; E=частота,D=длина
70 LOOP1 PUSH DE ; сохранить DE
80 LOOP2 LD B,E ; B=E
90 PAUSE DJNZ PAUSE ; задержка
100 LD A,(BC) ; A=содержимое ячейки ПЗУ
110 AND 248 ; сбросить биты бордюра
120 OR L ; установить цвет бордюра
130 OUT (254),A ; вывод A в порт 254
140 INC C ; увеличение адреса ПЗУ
150 INC D ; D=D+1
160 JR NZ,LOOP2 ; если D<>0, то цикл
170 POP DE ; восстановить DE
180 ?INCREASE INC E ; увеличение задержки (DEC E)
190 DEC D ; D=D-1
200 JR NZ,LOOP1 ; если D<>0, то цикл
210 RET ; возврат
Volume FX
10 DI ; запрет прерываний
20 *FRQ,VOL LD BC,12900 ; C=частота,B=громкость
30 *LEN,DUR LD DE,25650 ; E=длина,D=длительность
40 LD A,(23624) ; A=
50 RRA ; цвет
60 RRA ; бор-
70 RRA ; дюра
80 LOOP1 PUSH DE ; сохранение DE
90 LOOP2 PUSH BC ; сохранение BC
100 XOR 16 ; инвертирование бита D4
110 OUT (254),A ; вывод A в порт 254
120 LOOP3 DJNZ LOOP3 ; задержка (громкость)
130 XOR 16 ; инвертирование бита D4
140 OUT (254),A ; вывод A в порт 254
150 LD B,C ; B=C
160 LOOP4 DJNZ LOOP4 ; задержка (частота)
170 POP BC ; восстановление BC
180 DEC D ; D=D-1
190 JR NZ,LOOP2 ; если D<>0, то цикл
200 POP DE ; восстановление DE
210 ?DR:INC INC D ; увеличение длительности
(DEC D,NOP)
220 ?VL:DEC DEC B ; уменьшение громкости
(INC B,NOP)
230 ?FQ:INC INC C ; увеличение частоты
(DEC C,NOP)
240 DEC E ; E=E-1
250 JR NZ,LOOP1 ; если E<>0, то цикл
260 EI ; разрешение прерываний
270 RET ; возврат
Flowing 1
10 DI ; запрет прерываний
20 LD A,(23624) ; A=
30 RRA ; цвет
40 RRA ; бор-
50 RRA ; дюра
60 *FRQ,LEN LD BC,65281 ; C=частота,B=длина
70 LOOP1 PUSH BC ; сохранение BC
80 +DURATION LD B,20 ; B=длительность
90 LOOP2 XOR 16 ; инвертирование бита D4
100 OUT (254),A ; вывод A в порт 254
110 PUSH BC ; сохранение BC
120 LD B,C ; B=C
130 LOOP3 DJNZ LOOP3 ; задержка
140 POP BC ; восстановление BC
150 DJNZ LOOP2 ; цикл
160 POP BC ; восстановление BC
170 ?DECREASE DEC C ; уменьшение частоты (INC C)
180 DJNZ LOOP1 ; цикл
190 EI ; разрешение прерываний
200 RET ; возврат
Flowing 2
10 DI ; запрет прерываний
20 *FRQ1,FRQ2 LD DE,2660 ; E=частота 1,D=частота 2
30 +DURATION LD C,255 ; C=длительность
40 LD A,(23624) ; A=
50 RRA ; цвет
60 RRA ; бор-
70 RRA ; дюра
80 LOOP1 XOR 16 ; инвертирование бита D4
90 OUT (254),A ; вывод A в порт 254
100 LD B,D ; B=D
110 LOOP2 DJNZ LOOP2 ; задержка 1
120 XOR 16 ; инвертирование бита D4
130 OUT (254),A ; вывод A в порт 254
140 LD B,E ; B=E
150 LOOP3 DJNZ LOOP3 ; задержка
160 ?F1:INC INC D ; увеличение задержки 1
(DEC D,NOP)
170 ?F2:DEC DEC E ; увеличение задержки 2
(INC E,NOP)
180 DEC C ; C=C-1
190 JR NZ,LOOP1 ; если C<>0, то цикл
200 EI ; разрешение прерываний
210 RET ; возврат
Cycle 1
10 +QUANTITY LD B,24 ; B=количество нот
20 :FREQUENCY LD HL,200 ; HL=начальная частота
30 :DURATION LD DE,1 ; DE=длительность
40 PUSH HL ; сохранение HL
50 PUSH BC ; сохранение BC
60 CALL 949 ; вызов подпрограммы ПЗУ
70 POP BC ; восстановление BC
80 POP HL ; восстановление HL
90 :STEP LD DE,30 ; DE=шаг изменения частоты
100 ?INCREASE ADC HL,DE ; увеличение HL (SBC HL,DE)
110 DJNZ :DURATION ; цикл
120 RET ; возврат
Cycle 2
10 *STP,QUANT LD BC,12870 ; C=шаг,B=количество нот
20 :FREQUENCY LD HL,512 ; HL=начальная частота
30 :DURATION LD DE,20 ; DE=длительность
40 PUSH HL ; сохранение HL
50 PUSH BC ; сохранение BC
60 CALL 949 ; вызов подпрограммы ПЗУ
70 POP BC ; восстановление BC
80 POP HL ; восстановление HL
90 LD A,L ; умень-
100 ?DECREASE SUB C ; шение (ADD A,C)
110 LD L,A ; L
120 DJNZ :DURATION ; цикл
130 RET ; возврат
Noise 1
10 :GROUP LD HL,0 ; HL=адрес ПЗУ
20 LD A,(23624) ; A=
30 RRA ; цвет
40 RRA ; бор-
50 RRA ; дюра
60 LD D,A ; D=A
70 :LENGTH LD BC,2560 ; BC=длительность
80 BEGIN PUSH BC ; сохранение BC
90 LD A,(HL) ; A=содержимое ячейки ПЗУ
100 AND 248 ; сброс битов бордюра
110 OR D ; установка цвета бордюра
120 OUT (254),A ; вывод A в порт 254
130 +FREQUENCY LD B,40 ; B=частота
140 LOOP DJNZ LOOP ; задержка
150 ?BOUNDS INC HL ; HL=HL+1 (INC L)
160 POP BC ; восстановление BC
170 DEC BC ; BC=BC-1
180 LD A,B ; BC=
190 OR C ; 0 ?
200 JR NZ,BEGIN ; если нет, то цикл
210 RET ; возврат
Noise 2
10 :GROUP LD HL,0 ; HL=адрес ПЗУ
20 *FRQ1,FRQ2 LD DE,2660 ; E=задержка 1,D=задержка 2
30 +DURATION LD C,255 ; C=длительность
40 LD A,(23624) ; A=
50 RRA ; цвет
60 RRA ; бор-
70 RRA ; дюра
80 BEGIN XOR 16 ; инвертирование бита D4
90 OUT (254),A ; вывод A в порт 254
100 LD B,(HL) ; B=содержимое ячейки ПЗУ
110 LOOP1 DJNZ LOOP1 ; задержка 1
120 LD B,D ; B=D
130 LOOP2 DJNZ LOOP2 ; задержка 2
140 XOR 16 ; инвертирование бита D4
150 OUT (254),A ; вывод A в порт 254
160 LD B,(HL) ; B=содержимое ячейки ПЗУ
170 LOOP3 DJNZ LOOP3 ; задержка 3
180 LD B,E ; B=E
190 LOOP4 DJNZ LOOP4 ; задержка 4
200 INC HL ; HL=HL+1
210 ?F1:INC INC D ; увеличение D (DEC D,NOP)
220 ?F2:DEC DEC E ; уменьшение E (INC E,NOP)
230 DEC C ; C=C-1
240 JR NZ,BEGIN ; если C<>0, то цикл
250 RET ; возврат
2
Приложение 2
Советы по использованию ассемблера
Чтобы испытать эффекты в машинных ко-
дах, приведенные в этой книге, Вам придет-
ся использовать специальную программу -
ассемблер. В настоящее время существует
множество различных ассемблеров, но в Рос-
сии наиболее популярен и распространен
GENS4. Это составная часть пакета DEVPAC4
фирмы Hisoft. Вторая часть этого пакета
(монитор - отладчик MONS4) нас сейчас не
интересует.
Я не буду подробно описывать GENS4, это
отлично сделано в [1], но некоторые ключе-
вые моменты я объясню.
Существует несколько различных версий
этой программы (в т.ч. и дисковых), поэ-
тому ничего конкретного по загрузке посо-
ветовать не могу кроме того, что для безо-
пасности Вы можете пропустить бейсик-заг-
рузчик и грузить сразу кодовую часть. Для
ее загрузки с кассеты введите следующие
команды:
CLEAR 24999: LOAD "" CODE 25000
а с диска - такие:
CLEAR 24999: RANDOMIZE USR 15619:
REM: LOAD "GENS4D" CODE 25000
Для запуска загруженного таким образом
GENS4 введите команду
RANDOMIZE USR 25000.
Практически все эффекты, приведенные в
этой книге, можно ввести и ассемблировать
без изменений. Исключение составляют лис-
тинги эффектов SUPER SOUNDа, в которых
необходимо специальные метки заменить на
более приемлемые (они должны начинаться с
латинской буквы, быть несколько короче и
не содержать пробелов).
Перед любым эффектом необходимо вста-
вить директиву ассемблера ORG, указываю-
щую, с какого адреса разместить оттрансли-
рованный код. В данном случае этот адрес
должен быть не меньше 37000. Например:
10 ORG 40000
... ...
Если Вы хотите вызывать созданный эф-
фект прямо из ассемблера, то необходимо
вставить директиву ENT:
20 ENT $
... ...
Теперь немного о командах строчного ре-
дактора GENS4 (полный их список Вы можете
найти в [1]):
I[N][,M] - Автоматическая нумерация
строк начиная со строки N и с шагом M.
Отмена - клавиша Edit (CS/1). По умолчанию
N и M равны 10.
L[N][,M] - Вывод на экран листинга
программы со строки N по строку M включи-
тельно. По умолчанию выводится листинг
всей программы.
D N,M - Удалить строки от N до M
включительно.
G[,,S] - Загрузить с магнитного носи-
теля программу с именем S.
P[N][,M][,S] - Записать на магнитный
носитель программу со строки N по строку M
включительно под именем S. По умолчанию
используются параметры, установленные пре-
дыдущей командой G или P.
O[,,S] - Записать на магнитный носи-
тель откомпилированную программу под име-
нем S.
R - Запустить откомпилированную прог-
рамму. Возврат в GENS4 осуществляется по
команде RET.
B - Вернуться в бейсик. Перезапустить
GENS4 в нашем случае можно командой RANDO-
MIZE USR 25000.
Z - Удалить текст программы.
H - Вывести на экран список команд ре-
дактора.
A - Ассемблировать программу. Формат
этой команды довольно сложен. Подробно он
описан в [1]. Здесь же Вам достаточно
просто ввести букву A без параметров.
Список литературы
1. Ларченко А.А., Родионов Н.Ю. ZX-Spec-
trum и TR-DOS для пользователей и прог-
раммистов - 3-е изд. СПб.: Питер, 1994.
2. Диалекты Бейсика для ZX-Spectrum. Под
редакцией Ларченко А.А., Родионова Н.Ю.
СПб.: Питер, 1992.
3. АН СССР, ин-т проблем информатики. Лу-
щихина И.Ю. и др. Организация цифрового
музыкального интерфейса MIDI. Москва:
Препринт, 1988.
4. MIDI Musical Instrument Digital Inter-
face Specification 1.0 North Hollywood:
International MIDI Association (IMA),
1983.
5. Schulze, Hans-Jochen/Engel, Georg. Mo-
derne Musikelektronik, Praxisorientiere
Elektroakustik und Gerate zur elektro-
nischen Klangerzeugung. Berlin: Mili-
tarverlag der DDR (VEB), 1989.
* * *