Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:basic_dialogue_programming_language:102 [2023-02-11 19:47] GreyWolf [1.2.4. Примеры] |
msx:basic_dialogue_programming_language:102 [2023-06-12 00:03] (текущий) GreyWolf |
||
---|---|---|---|
Строка 4: | Строка 4: | ||
{{anchor:n1022}} | {{anchor:n1022}} | ||
====== 1.2. Использование подпрограмм BIOS ====== | ====== 1.2. Использование подпрограмм BIOS ====== | ||
- | FIXME | ||
- | [[msx:bios|]] | + | <WRAP group 99%> |
- | + | ||
- | <WRAP group 99%> | + | |
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
<WRAP half column><WRAP right> | <WRAP half column><WRAP right> | ||
Когда книга сталкивается с головой — и при | Когда книга сталкивается с головой — и при | ||
- | //этом раздается глухой звук, разве всегда | + | //этом раздается глухой звук, разве всегда |
//виновата книга. | //виновата книга. | ||
<WRAP rightalign> | <WRAP rightalign> | ||
Строка 24: | Строка 21: | ||
Подпрограммы BIOS ("Basic Input–Output System") имеют фиксированные адреса ROM, которые называются //входными// точками. | Подпрограммы BIOS ("Basic Input–Output System") имеют фиксированные адреса ROM, которые называются //входными// точками. | ||
<WRAP center round important 100%> | <WRAP center round important 100%> | ||
- | Прежде чем Вы начнете разработку собственных подпрограмм,написанных в машинных кодах,рекомендуем тщательно изучить, что делают подпрограммы BIOS. | + | Прежде чем Вы начнете разработку собственных подпрограмм, написанных в машинных кодах,рекомендуем тщательно изучить, что делают подпрограммы |
+ | [[msx:bios|BIOS]]. | ||
</WRAP> | </WRAP> | ||
- | Достаточно одного взгляда на описание подпрограмм BIOS, чтобы заметить, что некоторые подпрограммы для работы //не требуют// ввода параметров. | + | Достаточно одного взгляда на описание подпрограмм [[msx:bios|BIOS]], чтобы заметить, что некоторые подпрограммы для работы //не требуют// ввода параметров. |
Проиллюстрируем использование таких подпрограмм. | Проиллюстрируем использование таких подпрограмм. | ||
- | {{anchor:e10201-01}} __//Пример 1//__. //Инициализация// системы. | + | {{anchor:e10201-01}} __//Пример 1//__. //Инициализация// системы. |
<code> | <code> | ||
DEFUSR=0:A=USR(0) | DEFUSR=0:A=USR(0) | ||
Строка 40: | Строка 38: | ||
{{anchor:e10201-02}} __//Пример 2//__. \\ {{.examples:10201-02.bas|}} \\ [[+tab|wmsxbpge>10201-02.bas]] | {{anchor:e10201-02}} __//Пример 2//__. \\ {{.examples:10201-02.bas|}} \\ [[+tab|wmsxbpge>10201-02.bas]] | ||
- | \\ //Инициализация// значений функциональных клавиш. Если Вам время от времени необходимо возвращение к стандартному определению значений, присвоенных функциональным клавишам, то поступите следующим образом: | + | \\ //Инициализация// значений функциональных клавиш. Если Вам время от времени необходимо возвращение к стандартному определению значений, присвоенных функциональным клавишам, то поступите следующим образом: |
<code> | <code> | ||
10 KEY 1,"AAAA":KEY 2,"BBBB" | 10 KEY 1,"AAAA":KEY 2,"BBBB" | ||
Строка 49: | Строка 47: | ||
Программа BIOS с именем INIFNK по адресу &H3E переопределяет функциональные клавиши. Однако следует выполнить оператор ''KEY ON,'' чтобы увидеть результат на экране дисплея. | Программа BIOS с именем INIFNK по адресу &H3E переопределяет функциональные клавиши. Однако следует выполнить оператор ''KEY ON,'' чтобы увидеть результат на экране дисплея. | ||
- | {{anchor:e10201-03}} __//Пример 3//__. //Включение и выключение экрана.// Если Вы хотите моментально вывести большое количество информации на экран, то можно вначале "выключить" экран, затем выполнить операторы вывода информации, а только после этого "включить" экран. | + | {{anchor:e10201-03}} __//Пример 3//__. //Включение и выключение экрана.// Если Вы хотите моментально вывести большое количество информации на экран, то можно вначале "выключить" экран, затем выполнить операторы вывода информации, а только после этого "включить" экран. |
<WRAP round box> | <WRAP round box> | ||
- | Подпрограмма BIOS с именем DISSCR, расположенная по адресу &H41 , //"выключает"// экран, тогда как подпрограмма с именем ENASCR, расположенная по адресу &H44 , //"включает"// его. | + | Подпрограмма BIOS с именем DISSCR, расположенная по адресу &H41 , //"выключает"// экран, тогда как подпрограмма с именем ENASCR, расположенная по адресу &H44 , //"включает"// его. |
</WRAP> | </WRAP> | ||
Строка 102: | Строка 100: | ||
10 DEFUSR=&HCC:A=USR(A) </code> | 10 DEFUSR=&HCC:A=USR(A) </code> | ||
- | <WRAP group 99%> | + | <WRAP group 99%> |
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
<WRAP half column><WRAP right> | <WRAP half column><WRAP right> | ||
- | Может ли лакомка не есть, если стол | + | Может ли лакомка не есть, если стол |
- | \\ перед ним ломится от яств? Пусть же | + | \\ перед ним ломится от яств? Пусть же |
\\ он утолит, наконец, голод и жажду! | \\ он утолит, наконец, голод и жажду! | ||
<WRAP rightalign> | <WRAP rightalign> | ||
Строка 116: | Строка 114: | ||
===== 1.2.2. Подпрограммы BIOS, требующие параметров ===== | ===== 1.2.2. Подпрограммы BIOS, требующие параметров ===== | ||
- | Заметим, что большинство подпрограмм BIOS требуют для своей работы передачи параметров, значения которых должны быть помещены в определенные регистры перед вызовом подпрограмм. | + | Заметим, что большинство подпрограмм BIOS требуют для своей работы передачи параметров, значения которых должны быть помещены в определенные регистры перед вызовом подпрограмм. |
Такие подпрограммы обычно запускаются программой,написанной в машинных кодах и состоящей из: | Такие подпрограммы обычно запускаются программой,написанной в машинных кодах и состоящей из: | ||
Строка 122: | Строка 120: | ||
* β) вызова нужной подпрограммы BIOS. | * β) вызова нужной подпрограммы BIOS. | ||
- | Ознакомим Вас с приемами написания подпрограмм на машинном языке, требующих для своей работы передачи параметров. | + | Ознакомим Вас с приемами написания подпрограмм на машинном языке, требующих для своей работы передачи параметров. |
- | {{anchor:e10202-01}} __//Пример 1//__. Программа, включающая и выключающая индикатор CAPS (ввод заглавных букв). | + | {{anchor:e10202-01}} __//Пример 1//__. Программа, включающая и выключающая индикатор CAPS (ввод заглавных букв). |
Подпрограмма BIOS с именем CHGCAP,расположенная по адресу &H0132 выключает индикатор "CAPS", если регистр A процессора содержит ненулевое значение, и включает индикатор "CAPS", если этот регистр содержит 0. | Подпрограмма BIOS с именем CHGCAP,расположенная по адресу &H0132 выключает индикатор "CAPS", если регистр A процессора содержит ненулевое значение, и включает индикатор "CAPS", если этот регистр содержит 0. | ||
Строка 137: | Строка 135: | ||
</code> | </code> | ||
- | А теперь приведем запись программы на машинном языке (в шестнадцатеричных кодах): | + | А теперь приведем запись программы на машинном языке (в шестнадцатеричных кодах): |
\\ {{.examples:10202-01.asm|}} | \\ {{.examples:10202-01.asm|}} | ||
<code> | <code> | ||
Строка 167: | Строка 165: | ||
- | Отметим, что использование оператора CLEAR — это не единственный способ выделения //защищенной// области в RAM. Может быть также "передвинута" Таблица PIT; тогда все машинные подпрограммы могут быть введены в область, начинающуюся с адреса &Н8000. | + | Отметим, что использование оператора ''CLEAR'' — это не единственный способ выделения //защищенной// области в RAM. Может быть также "передвинута" Таблица PIT; тогда все машинные подпрограммы могут быть введены в область, начинающуюся с адреса &Н8000. |
Строка 173: | Строка 171: | ||
<WRAP round box> | <WRAP round box> | ||
- | Для передачи //однобайтного// аргумента подпрограмме вызовите подпрограмму, размещенную в ROM по адресу &H521F. Аргумент передается в регистр А. | + | Для передачи //однобайтного// аргумента подпрограмме вызовите подпрограмму, размещенную в ROM по адресу &H521F. Аргумент передается в регистр А. |
</WRAP> | </WRAP> | ||
Строка 197: | Строка 195: | ||
<WRAP round box> | <WRAP round box> | ||
- | Для передачи подпрограмме //двухбайтного// значения (например, адреса) используется подпрограмма, размещенная в ROM по адресу &H2F8A и использующая значение, хранящееся в шестнадцатибитном регистре HL. | + | Для передачи подпрограмме //двухбайтного// значения (например, адреса) используется подпрограмма, размещенная в ROM по адресу &H2F8A и использующая значение, хранящееся в шестнадцатибитном регистре HL. |
</WRAP> | </WRAP> | ||
Строка 294: | Строка 292: | ||
</code> | </code> | ||
- | {{anchor:e10202-05}} __//Пример 5//__. Использование подпрограммы расширенного BIOS для построения линии.\\ {{.examples:10202-05.bas|}} \\ [[+tab|wmsxbpge>10202-05.bas]] | + | {{anchor:e10202-05}} __//Пример 5//__. Использование подпрограммы расширенного BIOS для построения линии.\\ {{.examples:10202-05.bas|}} \\ [[+tab|wmsxbpge>10202-05.bas]] |
<code> | <code> | ||
10 DATA 01,10,00 :' LD BC, начальная X-координата | 10 DATA 01,10,00 :' LD BC, начальная X-координата | ||
Строка 313: | Строка 311: | ||
{{anchor:e10202-06}} __//Пример 6//__. \\ {{.examples:10202-06.bas|}} \\ [[+tab|wmsxbpge>10202-06.bas]] | {{anchor:e10202-06}} __//Пример 6//__. \\ {{.examples:10202-06.bas|}} \\ [[+tab|wmsxbpge>10202-06.bas]] | ||
<code> | <code> | ||
- | 5 'Автор программы: Беленький Г. (9 класс). 05.01.90 | + | 5 'Автор программы: Беленький Г. (9 класс). 05.01.90 |
10 DATA 01,00,00 :' LD BC, X начальное | 10 DATA 01,00,00 :' LD BC, X начальное | ||
11 DATA 11,00,00 :' LD DE, ∗∗∗∗ ◀─────────────────┐ | 11 DATA 11,00,00 :' LD DE, ∗∗∗∗ ◀─────────────────┐ | ||
Строка 332: | Строка 330: | ||
</code> | </code> | ||
- | {{anchor:e10202-07}} __//Пример 7//__. Использование подпрограммы расширенного BIOS для построения прямоугольника \\ {{.examples:10202-07.bas|}} \\ [[+tab|wmsxbpge>10202-07.bas]] | + | {{anchor:e10202-07}} __//Пример 7//__. Использование подпрограммы расширенного BIOS для построения прямоугольника \\ {{.examples:10202-07.bas|}} \\ [[+tab|wmsxbpge>10202-07.bas]] |
<code> | <code> | ||
10 DATA 01,10,00 :'LD BC, X-координата одного угла прямоугольника | 10 DATA 01,10,00 :'LD BC, X-координата одного угла прямоугольника | ||
Строка 367: | Строка 365: | ||
150 DATA CD,6F,00 :'D00B CALL 006Fh ;Установка режима SCREEN 1 | 150 DATA CD,6F,00 :'D00B CALL 006Fh ;Установка режима SCREEN 1 | ||
160 DATA 16,00 :'D00E LD D,0 ; | 160 DATA 16,00 :'D00E LD D,0 ; | ||
- | 170 DATA 06,FF :'D010 LD B,FFh ;255 символов | + | 170 DATA 06,FF :'D010 LD B,FFh ;255 символов |
180 DATA 21,00,00 :'D012 LD HL,0 ; | 180 DATA 21,00,00 :'D012 LD HL,0 ; | ||
190 DATA 3E,08 :'D015 LD A,8 ; | 190 DATA 3E,08 :'D015 LD A,8 ; | ||
Строка 394: | Строка 392: | ||
</code> | </code> | ||
- | __//Примечание//__. Для написания программ на машинном языке обычно требуется //программа–монитор//(т.е. программа, позволяющая подключать подпрограммы, написанные на машинном языке). | + | __//Примечание//__. Для написания программ на машинном языке обычно требуется //программа–монитор//(т.е. программа, позволяющая подключать подпрограммы, написанные на машинном языке). |
- | Если Вы не пользуетесь программой-монитором, то приходится вводить данные в операторах DATA, как мы это только что проделали. Однако для длинных программ этот метод утомителен. При малейшей ошибке система часто "зависает"; естественный выход при этом - нажать кнопку сброса "RESET",а это означает, что все должно быть начато заново. | + | Если Вы не пользуетесь программой-монитором, то приходится вводить данные в операторах DATA, как мы это только что проделали. Однако для длинных программ этот метод утомителен. При малейшей ошибке система часто "зависает"; естественный выход при этом - нажать кнопку сброса "RESET",а это означает, что все должно быть начато заново. |
Перед проверкой таких подпрограмм убедитесь,что они записаны на дискету! | Перед проверкой таких подпрограмм убедитесь,что они записаны на дискету! | ||
Строка 403: | Строка 401: | ||
===== 1.2.3. Подпрограммы BIOS, возвращающие параметры ===== | ===== 1.2.3. Подпрограммы BIOS, возвращающие параметры ===== | ||
- | <WRAP group 99%> | + | <WRAP group 99%> |
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
<WRAP half column><WRAP right> | <WRAP half column><WRAP right> | ||
Строка 413: | Строка 411: | ||
</WRAP></WRAP> | </WRAP></WRAP> | ||
- | Многие подпрограммы BIOS возвращают один или несколько параметров. Эти результаты, разумеется, можно передать через ячейки RAM с явно заданным адресом непосредственно перед выходом из подпрограммы. В дальнейшем применение функции ''PEEK'' позволит Вам прочитать полученные данные. | + | Многие подпрограммы BIOS возвращают один или несколько параметров. Эти результаты, разумеется, можно передать через ячейки RAM с явно заданным адресом непосредственно перед выходом из подпрограммы. В дальнейшем применение функции ''PEEK'' позволит Вам прочитать полученные данные. |
- | Однако, когда подпрограмма возвращает только одно значение, проще всего присвоить его результат переменной в операторе: | + | Однако, когда подпрограмма возвращает только одно значение, проще всего присвоить его результат переменной в операторе: |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 429: | Строка 427: | ||
где: | где: | ||
* α) ''USR'' ("USeR"-"пользователь") — служебное слово; | * α) ''USR'' ("USeR"-"пользователь") — служебное слово; | ||
- | * β) R — имя переменной-результата работы подпрограммы; | + | * β) R — имя переменной-результата работы подпрограммы; |
- | * γ) A — арифметическое выражение, значение которого совпадает со значением аргумента. | + | * γ) A — арифметическое выражение, значение которого совпадает со значением аргумента. |
{{anchor:e10203-01}} __//Пример 1//__. Проверка состояния джойстиков и передача значений через переменную в программу на [[msx:basic:|]]. | {{anchor:e10203-01}} __//Пример 1//__. Проверка состояния джойстиков и передача значений через переменную в программу на [[msx:basic:|]]. | ||
- | Подпрограмма с именем GTSTCK позволяет ввести данные с одного из трех джойстиков. Джойстик при этом выбирается по содержимому регистра А (0, 1 или 2); прочитанное значение помещается в регистр А. | + | Подпрограмма с именем GTSTCK позволяет ввести данные с одного из трех джойстиков. Джойстик при этом выбирается по содержимому регистра А (0, 1 или 2); прочитанное значение помещается в регистр А. |
- | Если номер джойстика задается посредством аргумента функции ''USR()'', то подпрограмма может быть "запущена" путем обращения к подпрограмме ROM, начинающейся с адреса &H521F. Как только значение аргумента помещено в регистр А, вызывается подпрограмма с именем GTSTCK. Содержимое регистра А (состояние джойстика) затем передается в основную программу через регистр HL. | + | Если номер джойстика задается посредством аргумента функции ''USR()'', то подпрограмма может быть "запущена" путем обращения к подпрограмме ROM, начинающейся с адреса &H521F. Как только значение аргумента помещено в регистр А, вызывается подпрограмма с именем GTSTCK. Содержимое регистра А (состояние джойстика) затем передается в основную программу через регистр HL. |
<WRAP round box> | <WRAP round box> | ||
- | Подпрограмма, размещенная с адреса &H2F99, передает содержимое регистра HL программе, составленной на языке [[msx:basic:|]]. | + | Подпрограмма, размещенная с адреса &H2F99, передает содержимое регистра HL программе, составленной на языке [[msx:basic:|]]. |
</WRAP> | </WRAP> | ||
Строка 447: | Строка 445: | ||
\\ {{.examples:10203-01.asm|}} | \\ {{.examples:10203-01.asm|}} | ||
<code> | <code> | ||
- | D000 CD,1F,52 CALL 521F ; В A помещается однобайтный аргумент | + | D000 CD,1F,52 CALL 521F ; В A помещается однобайтный аргумент |
D003 CD,D5,00 CALL 00D5 ; A=STICK(A) | D003 CD,D5,00 CALL 00D5 ; A=STICK(A) | ||
D006 26,00 LD H,0 ; В регистр H помещается 0 | D006 26,00 LD H,0 ; В регистр H помещается 0 | ||
Строка 474: | Строка 472: | ||
</code> | </code> | ||
- | Вы легко убедитесь, что функция ''USR(0)'' здесь "работает" точно так же, как функция ''STICK(0)''! | + | Вы легко убедитесь, что функция ''USR(0)'' здесь "работает" точно так же, как функция ''STICK(0)''! |
Перечислим теперь некоторые подпрограммы, возвращающие параметры: | Перечислим теперь некоторые подпрограммы, возвращающие параметры: | ||
- 1) чтение из видеопамяти <code> | - 1) чтение из видеопамяти <code> | ||
Строка 565: | Строка 563: | ||
</code> | </code> | ||
- | {{anchor:e10204-02}} __//Пример 2//__. Вывод на экран слова "Миша"! | + | {{anchor:e10204-02}} __//Пример 2//__. Вывод на экран слова "Миша"! |
\\ {{.examples:10204-02.bas|}} \\ [[+tab|wmsxbpge>10204-02.bas]] | \\ {{.examples:10204-02.bas|}} \\ [[+tab|wmsxbpge>10204-02.bas]] | ||
<code> | <code> | ||
Строка 609: | Строка 607: | ||
</code> | </code> | ||
- | {{anchor:e10204-04}} __//Пример 4//__. Вывод на экран дисплея //движущегося// спрайта | + | {{anchor:e10204-04}} __//Пример 4//__. Вывод на экран дисплея //движущегося// спрайта |
\\ {{.examples:10204-04.bas|}} \\ [[+tab|wmsxbpge>10204-04.bas]] | \\ {{.examples:10204-04.bas|}} \\ [[+tab|wmsxbpge>10204-04.bas]] | ||
<code> | <code> | ||
Строка 661: | Строка 659: | ||
POKE &HD000,0 | POKE &HD000,0 | ||
200 NEXT:GOTO 180 | 200 NEXT:GOTO 180 | ||
- | </code> | + | </code> |
{{anchor:e10204-06}} __//Пример 6//__. Мгновенное "утолщение" символов! | {{anchor:e10204-06}} __//Пример 6//__. Мгновенное "утолщение" символов! | ||
Строка 782: | Строка 780: | ||
</code> | </code> | ||
- | {{anchor:e10204-11}} __//Пример 11//__. Использование текстового представления для установки //точки// на графическом экране. | + | {{anchor:e10204-11}} __//Пример 11//__. Использование текстового представления для установки //точки// на графическом экране. |
\\ {{.examples:10204-11.bas|}} \\ [[+tab|wmsxbpge>10204-11.bas]] | \\ {{.examples:10204-11.bas|}} \\ [[+tab|wmsxbpge>10204-11.bas]] | ||
<code> | <code> |