Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:basic_dialogue_programming_language:107 [2023-01-24 15:29] GreyWolf [1.7. Программирование звуковых эффектов] |
msx:basic_dialogue_programming_language:107 [2023-02-18 18:12] (текущий) GreyWolf |
||
---|---|---|---|
Строка 27: | Строка 27: | ||
| 13 |Указатель формы волны| | | 13 |Указатель формы волны| | ||
- | Звуки бывают двух типов, которые мы назовем "звук" и "шум". За сочетание звучания "звука" и "шума" отвечает 7-й регистр PSG: | + | Звуки бывают двух типов, которые мы назовем "звук" и "шум". За сочетание звучания "звука" и "шума" отвечает 7–й регистр PSG: |
<code> | <code> | ||
Строка 58: | Строка 58: | ||
| A2h | Последнее число, записанное в PSG | | | A2h | Последнее число, записанное в PSG | | ||
- | Существует два способа записи чисел в PSG средствами языка MSX-BASIC: | + | Существует два способа записи чисел в PSG средствами языка [[msx:basic:|]]: |
* α) <code>SOUND reg, data</code> | * α) <code>SOUND reg, data</code> | ||
* β) <code>OUT &HA0,reg:OUT &HA1,data</code> | * β) <code>OUT &HA0,reg:OUT &HA1,data</code> | ||
- | {{anchor:e1071-01}} __//Пример 1//__. Программа в машинных кодах, записывающая число 254 в звукогенератор (в регистр 0).\\ {{.examples:1071-01.bas|}} \\ [[+tab|wmsxbpge>1071-01.bas]] | + | {{anchor:e1070-01}} __//Пример 1//__. Программа в машинных кодах, записывающая число 254 в звукогенератор (в регистр 0).\\ {{.examples:1070-01.bas|}} \\ [[+tab|wmsxbpge>1070-01.bas]] |
<code> | <code> | ||
10 CLEAR 200,&HF000:DEFUSR=&HF000 | 10 CLEAR 200,&HF000:DEFUSR=&HF000 | ||
Строка 179: | Строка 179: | ||
|(шестая)| — | 13| 0 | | |(шестая)| — | 13| 0 | | ||
- | {{anchor:e1071-02}} __//Пример 2//__. Программа, позволяющая прочесть данные из звукогенератора и проверить приведённую таблицу.\\ {{.examples:1071-02.bas|}} \\ [[+tab|wmsxbpge>1071-02.bas]] | + | {{anchor:e1070-02}} __//Пример 2//__. Программа, позволяющая прочесть данные из звукогенератора и проверить приведённую таблицу.\\ {{.examples:1070-02.bas|}} \\ [[+tab|wmsxbpge>1070-02.bas]] |
<code> | <code> | ||
10 CLEAR 200,&HF000:DEFUSR=&HF000 | 10 CLEAR 200,&HF000:DEFUSR=&HF000 | ||
Строка 191: | Строка 191: | ||
90 POKE &HF000+T,VAL("&h"+Z$):T=T+1:GOTO 70 | 90 POKE &HF000+T,VAL("&h"+Z$):T=T+1:GOTO 70 | ||
100 PLAY "O4 C#" | 100 PLAY "O4 C#" | ||
- | 110 PRINT USR(0);USR(1) 'Читаем содержимое 0-го и 1-го регистров | + | 110 PRINT USR(0);USR(1) 'Читаем содержимое 0–го и 1–го регистров |
</code> | </code> | ||
Строка 202: | Строка 202: | ||
Предлагаемый нами алгоритм реализации фонового музыкального сопровождения полностью //исключает// перечисленные неудобства! | Предлагаемый нами алгоритм реализации фонового музыкального сопровождения полностью //исключает// перечисленные неудобства! | ||
- | Расскажем Вам идею алгоритма. Во время работы процессор совершает маскируемые прерывания частотой 5О Гц и опрашивает область ловушек (hooks),а точнее происходят обращения (CALL ...) по адресам FD9Ah, FD9Fh. Напомним Вам, что эти прерывания разрешаются командой ассемблера EI, а запрещаются командой DI. Начальный адрес Таблицы ловушек - &hFD9A. По этому адресу системной области хранится подпрограмма перехода на программу сетевого обмена у компьютеров серии MSX-2 и число &HC9(машинный код команды RET) у компьютеров серии MSX-1, поэтому при обращении к данной ловушке либо из подпрограммы обработки прерываний (которая расположена по адресу 0038h), либо из Вашей программы означает мгновенный возврат в основную программу (если MSX-2 не ведёт "сетевой диалог"). | + | Расскажем Вам идею алгоритма. Во время работы процессор совершает маскируемые прерывания частотой 5О Гц и опрашивает область ловушек (hooks),а точнее происходят обращения (CALL ...) по адресам FD9Ah, FD9Fh. Напомним Вам, что эти прерывания разрешаются командой ассемблера EI, а запрещаются командой DI. Начальный адрес Таблицы ловушек — &hFD9A. По этому адресу системной области хранится подпрограмма перехода на программу сетевого обмена у компьютеров серии MSX-2 и число &HC9(машинный код команды RET) у компьютеров серии MSX-1, поэтому при обращении к данной ловушке либо из подпрограммы обработки прерываний (которая расположена по адресу 0038h), либо из Вашей программы означает мгновенный возврат в основную программу (если MSX-2 не ведёт "сетевой диалог"). |
Если по адресу FD9Ah "положить" подпрограмму: | Если по адресу FD9Ah "положить" подпрограмму: | ||
Строка 237: | Строка 237: | ||
^ //Команда// ^ Описание ^ | ^ //Команда// ^ Описание ^ | ||
|0|Установка частоты (высоты) звучания: \\ 1 полубайт — команда 00 ; 2 полубайт — номер ноты 1÷12.| | |0|Установка частоты (высоты) звучания: \\ 1 полубайт — команда 00 ; 2 полубайт — номер ноты 1÷12.| | ||
- | |1|Микширование (регистр 7 PSG,по умолчанию - &hb10111000): \\ 1 полубайт - команда 01 , 2 полубайт - формальный , следующий байт - байт состояния (структура аналогична структуре данных, находящихся в регистре 7): <code> | + | |1|Микширование (регистр 7 PSG,по умолчанию — &hb10111000): \\ 1 полубайт — команда 01 , 2 полубайт — формальный , следующий байт — байт состояния (структура аналогична структуре данных, находящихся в регистре 7): <code> |
&b10 ∗∗∗ ∗∗∗ | &b10 ∗∗∗ ∗∗∗ | ||
▲▲▲ ▲▲▲ | ▲▲▲ ▲▲▲ | ||
Строка 248: | Строка 248: | ||
|4|Установка частоты шума (по умолчанию — 20): \\ 1 полубайт — команда 04, 2 полубайт — данное (1÷15, частота = данное·2).| | |4|Установка частоты шума (по умолчанию — 20): \\ 1 полубайт — команда 04, 2 полубайт — данное (1÷15, частота = данное·2).| | ||
|5|Установка формы волны (пакета): \\ 1 полубайт — команда 05 , 2 полубайт — данное (1÷15).| | |5|Установка формы волны (пакета): \\ 1 полубайт — команда 05 , 2 полубайт — данное (1÷15).| | ||
- | |6|Установка значения для 11 регистра PSG(по умолчанию-100) \\ 1 полубайт — команда 06, 2 полубайт — данное (0÷15, значение = данное · 10).| | + | |6|Установка значения для 11 регистра PSG(по умолчанию — 100) \\ 1 полубайт — команда 06, 2 полубайт — данное (0÷15, значение = данное · 10).| |
- | |7|Установка значения для 12 регистра PSG(по умолчанию-10): \\ 1 полубайт — команда 07, 2 полубайт - данное (0÷15, значение=данное·2).| | + | |7|Установка значения для 12 регистра PSG(по умолчанию — 10): \\ 1 полубайт — команда 07, 2 полубайт — данное (0÷15, значение=данное·2).| |
|8|Установка текущей длительности звучания: \\ 1 полубайт — команда 08, \\ 2 полубайт — данное (1÷15), где <WRAP> | |8|Установка текущей длительности звучания: \\ 1 полубайт — команда 08, \\ 2 полубайт — данное (1÷15), где <WRAP> | ||
- | * 1 — целая с точкой, | + | * 1 — целая с точкой, |
* 2 — целая, | * 2 — целая, | ||
* 3 — половинная с точкой, | * 3 — половинная с точкой, | ||
Строка 272: | Строка 272: | ||
|15|Резервная: \\ 1 полубайт — команда 15, 2 полубайт — ... (можно использовать как передачу других команд, т.е. 15–я команда становится //префиксной//).| | |15|Резервная: \\ 1 полубайт — команда 15, 2 полубайт — ... (можно использовать как передачу других команд, т.е. 15–я команда становится //префиксной//).| | ||
- | Таким образом, Ваша подпрограмма должна распознавать номер команды, исполнять её, исходя из параметров, следующих за командой и помещать указатель данных на следующую команду. Если Вы желаете увеличить музыкальные возможности программы,а команд (в полубайт можно поместить число от 0 до 15) не хватает, то необходимо выделить префиксную команду (например, 15-ю, так как она резервная)и теперь порядок размещения данных в очереди станет следующим: | + | Таким образом, Ваша подпрограмма должна распознавать номер команды, исполнять её, исходя из параметров, следующих за командой и помещать указатель данных на следующую команду. Если Вы желаете увеличить музыкальные возможности программы,а команд (в полубайт можно поместить число от 0 до 15) не хватает, то необходимо выделить префиксную команду (например, 15–ю, так как она резервная)и теперь порядок размещения данных в очереди станет следующим: |
<code> | <code> | ||
<Команда>,<Команда>,{данное},{данное},... | <Команда>,<Команда>,{данное},{данное},... |