Приложение 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. * * *