4.2. Управление громкостью
Вообще-то, ZX-Spectrum абсолютно не
приспособлен для управления громкостью, но
ее все-таки можно изменять в неболь-
ших пределах благодаря относительно высо-
кой тактовой частоте микропроцессора Z80
(около 3,5 мГц).
Как уже говорилось в главе 2, когда Вы
посылаете сигнал на динамик, его мембрана
изменяет свое положение. Если во время ее
движения послать обратный сигнал, то она
вернется в исходное положение, не прой-
дя нужного пути. Таким образом, амплитуда
(соответственно и громкость) будет меньше
обычной. Для примера сравните звучание та-
ких двух практически одинаковых программ:
1415.
10 PROG1 DI ; запрет прерываний
20 LD B,255 ; B=частота
30 LD C,255 ; C=длительность
40 XOR A ; A=цвет бордюра (0)
50 LOOP1 XOR 16 ; инвертирование бита D4
60 OUT (254),A ; вывод A в порт 254
70 PUSH BC ; сохранение BC
80 LOOP2 DJNZ LOOP2 ; задержка
90 POP BC ; восстановление BC
100 DEC C ; C=C-1
110 JR NZ,LOOP1 ; если C<>0, то цикл
120 EI ; разрешение прерываний
130 RET ; возврат в бейсик
10 PROG2 DI ;
20 LD B,255 ;
30 LD C,255 ;
40 XOR A ;
50 LOOP1 XOR 16 ; все
60 OUT (254),A ;
70 XOR 16 ; (кроме этих двух строк,
80 OUT (254),A ; повторяющих предыдущие)
90 PUSH BC ;
100 LOOP2 DJNZ LOOP2 ; аналогично
110 POP BC ;
120 DEC C ; предыдущему
130 JR NZ,LOOP1 ;
140 EI ; примеру !
150 RET ;
2
Когда Вы их наберете на ассемблере и
запустите, Вы сильно удивитесь. Однако
против фактов не попрешь - вторая подпрог-
рамма будет звучать в несколько раз тише
первой!
Приведу текст более универсальной под-
программы:
1415.
10 DI ; запрет прерываний
20 LD B,50 ; B=громкость
30 LD C,50 ; C=частота
40 LD D,15 ; D=длительность
50 LD E,50 ; E=количество нот
60 XOR A ; A=цвет бордюра (0)
70 LOOP1 PUSH DE ; сохранение DE
80 LOOP2 PUSH BC ; сохранение BC
90 XOR 16 ; инвертирование бита D4
100 OUT (254),A ; вывод A в порт 254
110 LOOP3 DJNZ LOOP3 ; задержка (громкость)
120 XOR 16 ; инвертирование бита D4
130 OUT (254),A ; вывод A в порт 254
140 LD B,C ; B=C
150 LOOP4 DJNZ LOOP4 ; задержка (частота)
160 POP BC ; восстановление BC
170 DEC D ; D=D-1
180 JR NZ,LOOP2 ; если D<>0, то цикл
190 POP DE ; восстановление DE
200 NOP ; резерв
210 NOP ; резерв
220 NOP ; резерв
230 DEC E ; E=E-1
240 JR NZ,LOOP1 ; если E<>0, то цикл
250 EI ; разрешение прерываний
260 RET ; возврат в бейсик
2
В этом эффекте Вы можете подобрать нуж-
ную громкость. Но не очень увлекайтесь:
при значениях больших, чем 40-50, гром-
кость уже не увеличивается. Необходимо за-
метить, что при изменении громкости во
время воспроизведения меняется и частота.
Поэтому надо предусмотреть ее компенсацию.
Теперь о трех байтах резерва (команды
NOP). Они предназначены для изменения
громкости (регистр B), частоты (регистр C)
и длительности (регистр D). Если Вы заме-
ните эти три NOPа на команды DEC B (умень-
шение громкости), INC C (компенсация час-
тоты) и INC D (увеличение длительности),
то у Вас получится интересный эффект с за-
тухающей громкостью.