ZX Forum #04
19 ноября 1997

Мир звуков Спектрума - приложения 1, 2: листинги звуковых эффектов SUPER SOUND'а, советы по использованию ассемблера.

<b>Мир звуков Спектрума</b> - приложения 1, 2: листинги звуковых эффектов SUPER SOUND'а, советы по использованию ассемблера.

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

                *   *   *




Другие статьи номера:

Help - Описание оболочки электронного издания "ZX-FORUM 4".

Секреты успешного дизайна - глава для книги "Дизайн Ваших программ"

Экранные эффекты - Бегущая строка из R-Type.

Экранные эффекты - гашения экрана из Zynaps.

Экранные эффекты - "сворачивание" экрана из Comando Tracer.

Экранные эффекты - плавное "затухание" экрана из Сommando Tracer.

Экранные эффекты - модификация символьного набора для получения оригинального стилизованного шрифта из игры Rockstar.

Экранные эффекты - "выбегающая строка" из игры Rockstar.

Экранные эффекты - "наливающийся" экран из игры Rockstar.

Экранные эффекты - сложный многоступенчатый эффект из игры Bubbler.

Новые 40 лучших процедур - скроллинг экрана, слияние двух картинок, инвертирование экрана, поворот символов, замена атрибутов, заливка замкнутого контура, вычисление адресов в экране, копирование части экрана и т.д.

Технология спрайтов - часть 1: введение.

Технология спрайтов - часть 2: охота на спрайты (поиск и выдирание).

Технология спрайтов - часть 3: форматы спрайтов.

Технология спрайтов - часть 4: форматы спрайтов с маской.

Технология спрайтов - часть 5: структура спрайтовых блоков (как уживаются в памяти спрайт и маска, какие данные помогают нам оперативно находить адрес спрайта в памяти и многое другое.)

Технология спрайтов - часть 6: подготовка данных к печати.

Технология спрайтов - часть 8: печать спрайтов (координаты заданы в знакоместах).

Технология спрайтов - часть 9: печать спрайтов (координаты заданы в пикселях).

Технология спрайтов - часть 10: обзор программ для работы со спрайтами и графикой.

Мир звуков Спектрума - глава 1: Физика звука.

Мир звуков Спектрума - глава 2: Оператор BEEP, Создание эффектов на BEEPе, Создание музыки на BEEPе.

Мир звуков Спектрума - глава 3: Как получается звук (устройство BEEP'ра и способы звукоизвлечения).

Мир звуков Спектрума - глава 4: Программирование звука на ассемблере.

Мир звуков Спектрума - глава 4.1: Программирование звуковых эффектов - Тон, Шум, Комплексы эффектов.

Мир звуков Спектрума - глава 4.2: Программирование звуковых эффектов - Управление громкостью.

Мир звуков Спектрума - глава 4.3: Программирование звуковых эффектов - Управление тембром.

Мир звуков Спектрума - глава 4.4: Программирование звуковых эффектов - Программирование музыки.

Мир звуков Спектрума - глава 4.5: Программирование звуковых эффектов - Многоголосые мелодии (полифония).

Мир звуков Спектрума - глава 4.6: Обработка внешних сигналов - оцифровка.

Мир звуков Спектрума - глава 4.7: Обработка внешних сигналов - Реверберация.

Мир звуков Спектрума - глава 4.8: Синтезирование речи.

Мир звуков Спектрума - глава 4.9: воспроизведение звука на прерываниях.

Мир звуков Спектрума - глава 5: Оператор PLAY для музыкального сопроцессора AY- 3-8910 (AY-3-8912).

Мир звуков Спектрума - глава 5.1: Создание эффектов оператором PLAY.

Мир звуков Спектрума - глава 5.2: Создание музыки на PLAYе.

Мир звуков Спектрума - глава 6.1: описание регистров музыкального сопроцессора AY- 3-8910 (AY-3-8912).

Мир звуков Спектрума - глава 6.2: Программирование эффектов и музыки под музыкальный сопроцессор AY- 3-8910 (AY-3-8912).

Мир звуков Спектрума - глава 7: Обзор программного обеспечения ZX-Spectrum для создания звуков и музыки.

Мир звуков Спектрума - глава 7.1: Редактор звуковых эффектов SUPER SOUND.

Мир звуков Спектрума - глава 7.2: Музыкальный редактор Wham the Music Box.

Мир звуков Спектрума - приложения 1, 2: листинги звуковых эффектов SUPER SOUND'а, советы по использованию ассемблера.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Министроки - стих "Апокалипсис".
Ретро - Мордор.
Новости - сделав этот номер газеты я ничего особенного не делаю.
Demo Party - Merlin/CC: отчет о CC'999.
Мозамбик - реклама.

В этот день...   25 апреля