К сожалению, в ZX-Spectrum для управления звуком отведен всего-навсего один бит. Это бит D4 порта 254 (#FE). Но, несмотря на это, программисты умудряются создавать довольно красивые мелодии и эффекты.
Когда этот бит, установлен, на динамик (усилитель) подается напряжение, и его мембрана находится в одном положении. Когда же он сброшен, на динамике напряжения нет, и мембрана находится в другом положении. Таким образом, если Вы будете изменять состояние этого бита с достаточно высокой частотой, то мембрана будет вибрировать, и Вы услышите звук.
Использовать этот способ можно даже из бейсика:
И так же легко на ассемблере, но в этом случае придется запрещать прерывания, если Вы хотите получить качественное звучание:
Вы, наверное, заметили, что в этих программах в порт выводится не 16 и 0, что соответствовало бы установке и сбросу бита D4, а 23 и 7. Дело в том, что этот порт кроме динамика управляет ещё цветом бордюра и выходом на магнитофон. Познакомимся с его возможностями поближе:
При вводе байта из порта бит D6 контролирует магнитофонный вход.
Думаю, теперь понятно, откуда взялись цифры 23 и 7: для установки и сброса бита D4 необходимо последовательно вывести в порт значения 16 и 0. Но при этом надо сохранять цвет бордюра равный 7 (белый). Следовательно, первое значение будет равно 16+7=23, а второе - 0+7=7.Вообще то, Вы можете устанавливать любой цвет бордюра. Более того, можно создавать на нем различные цветовые эффекты. Для этого достаточно при инвертировании звукового бита использовать разные цвета бордюра.
Вы, наверное, заметили, что в приведенной выше программе на ассемблере, запрещаются прерывания. Думаю, стоит это пояснить. Дело в том, что ZX Spectrum устроен так, что каждую пятидесятую долю секунды вызывается подпрограмма ПЗУ, расположенная с адреса 56 (#38). И, если Вы хотите получить качественный (не трещащий) звуковой сигнал, то её надо отключить, что и достигается запрещением прерываний (команда DI). При возврате в бейсик прерывания необходимо снова разрешать (команда EI).
Когда этот бит, установлен, на динамик (усилитель) подается напряжение, и его мембрана находится в одном положении. Когда же он сброшен, на динамике напряжения нет, и мембрана находится в другом положении. Таким образом, если Вы будете изменять состояние этого бита с достаточно высокой частотой, то мембрана будет вибрировать, и Вы услышите звук.
Использовать этот способ можно даже из бейсика:
Бейсик ZX:
10 FOR A=1 TO 300: OUT 254,23
20 OUT 254,7: NEXT A
И так же легко на ассемблере, но в этом случае придется запрещать прерывания, если Вы хотите получить качественное звучание:
Assembler Z80:
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 ; возврат в бейсик
Вы, наверное, заметили, что в этих программах в порт выводится не 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).