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

ZX Forum #04

          3. Как получается звук

   К сожалению, в ZX-Spectrum для управле-
ния звуком отведен всего-навсего один бит.
Это бит D4  порта 254 (#FE).  Но, несмотря
на это, программисты умудряются  создавать
довольно красивые мелодии и эффекты.
   Когда  этот  бит  установлен, на  дина-
мик (усилитель) подается напряжение, и его
мембрана находится в одном положении. Ког-
да же он сброшен, на  динамике  напряжения
нет, и мембрана находится в другом положе-
нии. Таким образом, если Вы  будете  изме-
нять состояние этого бита с достаточно вы-
сокой частотой, то мембрана будет вибриро-
вать и Вы услышите звук.
   Использовать этот способ можно даже  из
бейсика:

   10 FOR A=1 TO 300: OUT 254,23
   20 OUT 254,7: NEXT A

И так же легко  на ассемблере, но  в  этом
случае придется запрещать прерывания, если
Вы хотите получить качественное звучание:
1415.
 10            DI                 ; запрет прерываний
 20            LD      BC,2560    ; BC=длительность
 30            LD      A,7        ; A=цвет бордюра
 40  BEGIN     XOR     16         ; инвертирование бита D4
 50            OUT     (254),A    ; вывод A в порт 254
 60            LD      D,100      ; D=задержка (частота)
 70  PAUSE     DEC     D          ; D=D-1
 80            JR      NZ,PAUSE   ; если D<>0, то цикл
 90            DEC     BC         ; BC=BC-1
100            LD      D,A        ; сохранение A
110            LD      A,B        ; BC=
120            OR      C          ;    0 ?
130            LD      A,D        ; восстановление A
140            JR      NZ,BEGIN   ; если BC<>0, то цикл
150            EI                 ; разрешение прерываний
160            RET                ; возврат в бейсик
2
   Вы, наверное, заметили, что в этих про-
граммах в порт выводится не  16  и  0, что
соответствовало бы установке и сбросу  би-
та D4, а 23 и 7. Дело в том, что этот порт
кроме динамика управляет еще цветом бордю-
ра и выходом на магнитофон. Познакомимся с
его возможностями поближе:

   Биты D0...D2 определяют цвет бордюра:

  000(0) - черный       100(4) - зеленый
  001(1) - синий        101(5) - голубой
  010(2) - красный      110(6) - желтый
  011(3) - фиолетовый   111(7) - белый

   Бит D3 управляет выходом на магнитофон.
   Бит D4 управляет звуком.  Биты  D5...D7
не используются.
   При вводе байта из порта бит D6 контро-
лирует магнитофонный вход.
   Думаю, теперь  понятно, откуда  взялись
цифры 23 и 7: для установки и сброса  бита
D4 необходимо  последовательно  вывести  в
порт значения 16 и 0.  Но  при  этом  надо
сохранять цвет бордюра равный  7  (белый).
Следовательно, первое значение будет  рав-
но 16+7=23, а  второе - 0+7=7.  Вообще-то,
Вы можете устанавливать любой цвет  бордю-
ра.  Более того, можно  создавать  на  нем
различные цветовые эффекты. Для этого дос-
таточно при инвертировании звукового  бита
использовать разные цвета бордюра.
   Вы, наверное, заметили, что в приведен-
ной выше программе  на  ассемблере  запре-
щаются прерывания. Думаю, стоит это  пояс-
нить. Дело в том, что ZX-Spectrum  устроен
так, что каждую пятидесятую  долю  секунды
вызывается  подпрограмма  ПЗУ, расположен-
ная с адреса 56 (#38).  И, если  Вы хотите
получить качественный (не трещащий) звуко-
вой сигнал, то ее  надо  отключить, что  и
достигается запрещением прерываний (коман-
да DI). При возврате в  бейсик  прерывания
необходимо снова разрешать (команда EI).