Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:basic_dialogue_programming_language:102 [2023-02-11 18:26] 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 (ввод заглавных букв).\\ {{.examples:10201-01.bas|}} \\ [[+tab|wmsxbpge>10201-02.bas]] | + | {{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|}} | ||
<code> | <code> | ||
3E, 00 LD A,0 | 3E, 00 LD A,0 | ||
Строка 143: | Строка 142: | ||
</code> | </code> | ||
и на языке [[msx:basic:|]]: | и на языке [[msx:basic:|]]: | ||
+ | \\ {{.examples:10202-01.bas|}} \\ [[+tab|wmsxbpge>10202-01.bas]] | ||
<code> | <code> | ||
10 CLEAR 200,&HD000 ' Резервирование области в RAM | 10 CLEAR 200,&HD000 ' Резервирование области в RAM | ||
Строка 165: | Строка 165: | ||
- | Отметим, что использование оператора CLEAR — это не единственный способ выделения //защищенной// области в RAM. Может быть также "передвинута" Таблица PIT; тогда все машинные подпрограммы могут быть введены в область, начинающуюся с адреса &Н8000. | + | Отметим, что использование оператора ''CLEAR'' — это не единственный способ выделения //защищенной// области в RAM. Может быть также "передвинута" Таблица PIT; тогда все машинные подпрограммы могут быть введены в область, начинающуюся с адреса &Н8000. |
- | {{anchor:e10202-02}} __//Пример 2//__. Включение и выключение индикатора CAPS в соответствии со значением аргумента функции ''USR''. \\ {{.examples:10202-02.bas|}} \\ [[+tab|wmsxbpge>10202-02.bas]] | + | {{anchor:e10202-02}} __//Пример 2//__. Включение и выключение индикатора CAPS в соответствии со значением аргумента функции ''USR''. |
<WRAP round box> | <WRAP round box> | ||
- | Для передачи //однобайтного// аргумента подпрограмме вызовите подпрограмму, размещенную в ROM по адресу &H521F. Аргумент передается в регистр А. | + | Для передачи //однобайтного// аргумента подпрограмме вызовите подпрограмму, размещенную в ROM по адресу &H521F. Аргумент передается в регистр А. |
</WRAP> | </WRAP> | ||
На языке ассемблера это пишется следующим образом: | На языке ассемблера это пишется следующим образом: | ||
+ | \\ {{.examples:10202-02.asm|}} | ||
<code> | <code> | ||
CD,1F,52 CALL 521F ; Вызов подпрограммы по адресу 521F | CD,1F,52 CALL 521F ; Вызов подпрограммы по адресу 521F | ||
Строка 180: | Строка 181: | ||
</code> | </code> | ||
Приведем окончательную программу: | Приведем окончательную программу: | ||
+ | \\ {{.examples:10202-02.bas|}} \\ [[+tab|wmsxbpge>10202-02.bas]] | ||
<code> | <code> | ||
10 CLEAR 200,&HD000 'Резервирование области в RAM | 10 CLEAR 200,&HD000 'Резервирование области в RAM | ||
Строка 193: | Строка 195: | ||
<WRAP round box> | <WRAP round box> | ||
- | Для передачи подпрограмме //двухбайтного// значения (например, адреса) используется подпрограмма, размещенная в ROM по адресу &H2F8A и использующая значение, хранящееся в шестнадцатибитном регистре HL. | + | Для передачи подпрограмме //двухбайтного// значения (например, адреса) используется подпрограмма, размещенная в ROM по адресу &H2F8A и использующая значение, хранящееся в шестнадцатибитном регистре HL. |
</WRAP> | </WRAP> | ||
Строка 259: | Строка 261: | ||
</code> | </code> | ||
- | {{anchor:e10202-03}} __//Пример 3//__. Запись в видеопамять. Изменение латинской буквы "A".\\ {{.examples:10201-03.bas|}} \\ [[+tab|wmsxbpge>10201-03.bas]] | + | {{anchor:e10202-03}} __//Пример 3//__. Запись в видеопамять. Изменение латинской буквы "A".\\ {{.examples:10202-03.bas|}} \\ [[+tab|wmsxbpge>10202-03.bas]] |
<code> | <code> | ||
10 CLEAR 200,&H9000:SCREEN 1 | 10 CLEAR 200,&H9000:SCREEN 1 | ||
Строка 275: | Строка 277: | ||
</code> | </code> | ||
- | {{anchor:e10202-04}} __//Пример 4//__. Запись данных в регистр видеопроцессора (VDP).\\ {{.examples:10201-04.bas|}} \\ [[+tab|wmsxbpge>10201-04.bas]] | + | {{anchor:e10202-04}} __//Пример 4//__. Запись данных в регистр видеопроцессора (VDP).\\ {{.examples:10202-04.bas|}} \\ [[+tab|wmsxbpge>10202-04.bas]] |
<code> | <code> | ||
10 INPUT C,B:POKE &HA000,C:POKE &HA001,B 'C - регистр, B - значение | 10 INPUT C,B:POKE &HA000,C:POKE &HA001,B 'C - регистр, B - значение | ||
Строка 290: | Строка 292: | ||
</code> | </code> | ||
- | {{anchor:e10202-05}} __//Пример 5//__. Использование подпрограммы расширенного BIOS для построения линии.\\ {{.examples:10201-05.bas|}} \\ [[+tab|wmsxbpge>10201-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-координата | ||
Строка 307: | Строка 309: | ||
</code> | </code> | ||
- | {{anchor:e10202-06}} __//Пример 6//__. \\ {{.examples:10201-06.bas|}} \\ [[+tab|wmsxbpge>10201-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, ∗∗∗∗ ◀─────────────────┐ | ||
Строка 328: | Строка 330: | ||
</code> | </code> | ||
- | {{anchor:e10202-07}} __//Пример 7//__. Использование подпрограммы расширенного BIOS для построения прямоугольника \\ {{.examples:10201-07.bas|}} \\ [[+tab|wmsxbpge>10201-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-координата одного угла прямоугольника | ||
Строка 347: | Строка 349: | ||
В заключении пункта приведем более сложный пример. | В заключении пункта приведем более сложный пример. | ||
- | {{anchor:e10202-08}} __//Пример 8//__. "Утолщение" символов в режиме SCREEN 1. \\ {{.examples:10201-08.bas|}} \\ [[+tab|wmsxbpge>10201-08.bas]] | + | {{anchor:e10202-08}} __//Пример 8//__. "Утолщение" символов в режиме SCREEN 1. \\ {{.examples:10202-08.bas|}} \\ [[+tab|wmsxbpge>10202-08.bas]] |
<code> | <code> | ||
10 CLEAR 300,&HD000 | 10 CLEAR 300,&HD000 | ||
Строка 363: | Строка 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 ; | ||
Строка 390: | Строка 392: | ||
</code> | </code> | ||
- | __//Примечание//__. Для написания программ на машинном языке обычно требуется //программа–монитор//(т.е. программа, позволяющая подключать подпрограммы, написанные на машинном языке). | + | __//Примечание//__. Для написания программ на машинном языке обычно требуется //программа–монитор//(т.е. программа, позволяющая подключать подпрограммы, написанные на машинном языке). |
- | Если Вы не пользуетесь программой-монитором, то приходится вводить данные в операторах DATA, как мы это только что проделали. Однако для длинных программ этот метод утомителен. При малейшей ошибке система часто "зависает"; естественный выход при этом - нажать кнопку сброса "RESET",а это означает, что все должно быть начато заново. | + | Если Вы не пользуетесь программой-монитором, то приходится вводить данные в операторах DATA, как мы это только что проделали. Однако для длинных программ этот метод утомителен. При малейшей ошибке система часто "зависает"; естественный выход при этом - нажать кнопку сброса "RESET",а это означает, что все должно быть начато заново. |
Перед проверкой таких подпрограмм убедитесь,что они записаны на дискету! | Перед проверкой таких подпрограмм убедитесь,что они записаны на дискету! | ||
Строка 399: | Строка 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> | ||
Строка 409: | Строка 411: | ||
</WRAP></WRAP> | </WRAP></WRAP> | ||
- | Многие подпрограммы BIOS возвращают один или несколько параметров. Эти результаты, разумеется, можно передать через ячейки RAM с явно заданным адресом непосредственно перед выходом из подпрограммы. В дальнейшем применение функции ''PEEK'' позволит Вам прочитать полученные данные. | + | Многие подпрограммы BIOS возвращают один или несколько параметров. Эти результаты, разумеется, можно передать через ячейки RAM с явно заданным адресом непосредственно перед выходом из подпрограммы. В дальнейшем применение функции ''PEEK'' позволит Вам прочитать полученные данные. |
- | Однако, когда подпрограмма возвращает только одно значение, проще всего присвоить его результат переменной в операторе: | + | Однако, когда подпрограмма возвращает только одно значение, проще всего присвоить его результат переменной в операторе: |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 425: | Строка 427: | ||
где: | где: | ||
* α) ''USR'' ("USeR"-"пользователь") — служебное слово; | * α) ''USR'' ("USeR"-"пользователь") — служебное слово; | ||
- | * β) R — имя переменной-результата работы подпрограммы; | + | * β) R — имя переменной-результата работы подпрограммы; |
- | * γ) A — арифметическое выражение, значение которого совпадает со значением аргумента. | + | * γ) A — арифметическое выражение, значение которого совпадает со значением аргумента. |
- | {{anchor:e10203-01}} __//Пример 1//__. Проверка состояния джойстиков и передача значений через переменную в программу на [[msx:basic:|]].\\ {{.examples:10203-01.bas|}} \\ [[+tab|wmsxbpge>10203-01.bas]] | + | {{anchor:e10203-01}} __//Пример 1//__. Проверка состояния джойстиков и передача значений через переменную в программу на [[msx:basic:|]]. |
- | Подпрограмма с именем GTSTCK позволяет ввести данные с одного из трех джойстиков. Джойстик при этом выбирается по содержимому регистра А (0, 1 или 2); прочитанное значение помещается в регистр А. | + | Подпрограмма с именем GTSTCK позволяет ввести данные с одного из трех джойстиков. Джойстик при этом выбирается по содержимому регистра А (0, 1 или 2); прочитанное значение помещается в регистр А. |
+ | Если номер джойстика задается посредством аргумента функции ''USR()'', то подпрограмма может быть "запущена" путем обращения к подпрограмме ROM, начинающейся с адреса &H521F. Как только значение аргумента помещено в регистр А, вызывается подпрограмма с именем GTSTCK. Содержимое регистра А (состояние джойстика) затем передается в основную программу через регистр HL. | ||
+ | |||
+ | <WRAP round box> | ||
+ | Подпрограмма, размещенная с адреса &H2F99, передает содержимое регистра HL программе, составленной на языке [[msx:basic:|]]. | ||
+ | </WRAP> | ||
+ | |||
+ | |||
+ | Подпрограмма на языке ассемблера выглядит следующим образом: | ||
+ | \\ {{.examples:10203-01.asm|}} | ||
<code> | <code> | ||
- | Если номер джойстика задается посредством аргумента функции USR(), то | + | D000 CD,1F,52 CALL 521F ; В A помещается однобайтный аргумент |
- | подпрограмма может быть "запущена" путем обращения к подпрограмме ROM, на- | + | D003 CD,D5,00 CALL 00D5 ; A=STICK(A) |
- | чинающейся с адреса &H521F. Как только значение аргумента помещено в ре- | + | D006 26,00 LD H,0 ; В регистр H помещается 0 |
- | гистр А, вызывается подпрограмма с именем GTSTCK. Содержимое регистра А | + | D008 6F LD L,A ; Содержимое А помещается в L |
- | (состояние джойстика) затем передается в основную программу через ре- | + | D00A C3,99,2F JP 2F99 ; Содержимое регистра HL передается |
- | гистр HL. | + | ; основной программе |
- | ┌────────────────────────────────────────────────────────────────┐ | + | D00D C9 RET |
- | │ Подпрограмма, размещенная с адреса &H2F99, передает содержимое │ | + | </code> |
- | │ регистра HL программе, составленной на языке MSX-BASIC. │ | + | Приведем теперь программу на языке [[msx:basic:|]]. |
- | └────────────────────────────────────────────────────────────────┘ | + | \\ {{.examples:10203-01.bas|}} \\ [[+tab|wmsxbpge>10203-01.bas]] |
- | Подпрограмма на языке ассемблера выглядит следующим образом: | + | <code> |
- | D000 CD,1F,52 CALL 521F ; В A помещается однобайтный аргумент | + | 10 CLEAR 200,&HD000 'Резервирование области в RAM |
- | D003 CD,D5,00 CALL 00D5 ; A=STICK(A) | + | 20 AD=&HD000 |
- | D006 26,00 LD H,0 ; В регистр H помещается 0 | + | 30 READ A$:IF A$="Z" THEN 100 |
- | D008 6F LD L,A ; Содержимое А помещается в L | + | 50 A=VAL("&H"+A$):POKE AD,A:AD=AD+1:GOTO 30 |
- | D00A C3,99,2F JP 2F99 ; Содержимое регистра HL передается | + | 100 DEFUSR=&HD000 |
- | ; основной программе | + | 110 A=USR(0) |
- | D00D C9 RET | + | 120 IF A<>0 THEN PRINT A |
- | Приведем теперь программу на языке MSX-BASIC. | + | 130 GOTO 110 |
- | 10 CLEAR 200,&HD000 'Резервирование области в RAM | + | 220 DATA CD,1F,52 :' CALL 521F |
- | 20 AD=&HD000 | + | 230 DATA CD,D5,00 :' CALL 00D5 |
- | 30 READ A$:IF A$="Z" THEN 100 | + | 240 DATA 26,00 :' LD H,0 |
- | 50 A=VAL("&H"+A$):POKE AD,A:AD=AD+1:GOTO 30 | + | 250 DATA 6F :' LD L,A |
- | 100 DEFUSR=&HD000 | + | 260 DATA C3,99,2F :' JP 2F99 |
- | 110 A=USR(0) | + | 270 DATA C9,"Z" :' RET |
- | 120 IF A<>0 THEN PRINT A | + | </code> |
- | 130 GOTO 110 | + | |
- | 220 DATA CD,1F,52 :' CALL 521F | + | |
- | 230 DATA CD,D5,00 :' CALL 00D5 | + | |
- | 240 DATA 26,00 :' LD H,0 | + | |
- | 250 DATA 6F :' LD L,A | + | |
- | 260 DATA C3,99,2F :' JP 2F99 | + | |
- | 270 DATA C9,"Z" :' RET | + | |
- | Вы легко убедитесь, что функция USR(0) здесь "работает" точно так же, | + | |
- | как функция STICK(0)! | + | |
- | Перечислим теперь некоторые подпрограммы, возвращающие параметры: | + | |
- | 1) чтение из видеопамяти | + | |
- | LD HL,adrVRAM | + | |
- | CALL 004A | + | |
- | LD H,0 | + | |
- | LD L,A | + | |
- | CALL 2F99 | + | |
- | RET | + | |
- | 2) начальный адрес атрибутов спрайта | + | |
- | CALL 521F | + | |
- | CALL 004A | + | |
- | CALL 2F99 | + | |
- | RET | + | |
- | 3) размер спрайта | + | |
- | CALL 008A | + | |
- | LD H,0 | + | |
- | LD L,A | + | |
- | CALL 2F99 | + | |
- | RET | + | |
- | 4) чтение числа из звукогенератора | + | |
- | CALL 521F | + | |
- | CALL 0096 | + | |
- | LD H,0 | + | |
- | LD L,A | + | |
- | CALL 2F99 | + | |
- | RET | + | |
- | 5) задержка до нажатия клавиши и чтение ее кода | + | |
- | CALL 009F | + | |
- | LD H,0 | + | |
- | LD L,A | + | |
- | CALL 2F99 | + | |
- | RET | + | |
- | 6) чтение состояния рукоятки джойстика | + | |
- | CALL 521F | + | |
- | CALL 00D5 | + | |
- | LD H,0 | + | |
- | LD L,A | + | |
- | CALL 2F99 | + | |
- | RET | + | |
- | 7) чтение состояния кнопки джойстика | + | |
- | CALL 521F | + | |
- | CALL 00D8 | + | |
- | LD H,0 | + | |
- | LD L,A | + | |
- | CALL 2F99 | + | |
- | RET | + | |
- | 8) чтение состояния клавиши на графическом планшете | + | |
- | CALL 521F | + | |
- | CALL 00DB | + | |
- | LD H,0 | + | |
- | LD L,A | + | |
- | CALL 2F99 | + | |
- | RET | + | |
- | 9) чтение статуса манипулятора PDL | + | |
- | CALL 521F | + | |
- | CALL 00DE | + | |
- | LD H,0 | + | |
- | LD L,A | + | |
- | CALL 2F99 | + | |
- | RET | + | |
+ | Вы легко убедитесь, что функция ''USR(0)'' здесь "работает" точно так же, как функция ''STICK(0)''! | ||
+ | Перечислим теперь некоторые подпрограммы, возвращающие параметры: | ||
+ | - 1) чтение из видеопамяти <code> | ||
+ | LD HL,adrVRAM | ||
+ | CALL 004A | ||
+ | LD H,0 | ||
+ | LD L,A | ||
+ | CALL 2F99 | ||
+ | RET | ||
+ | </code> | ||
+ | - 2) начальный адрес атрибутов спрайта <code> | ||
+ | CALL 521F | ||
+ | CALL 004A | ||
+ | CALL 2F99 | ||
+ | RET | ||
+ | </code> | ||
+ | - 3) размер спрайта <code> | ||
+ | CALL 008A | ||
+ | LD H,0 | ||
+ | LD L,A | ||
+ | CALL 2F99 | ||
+ | RET | ||
+ | </code> | ||
+ | - 4) чтение числа из звукогенератора <code> | ||
+ | CALL 521F | ||
+ | CALL 0096 | ||
+ | LD H,0 | ||
+ | LD L,A | ||
+ | CALL 2F99 | ||
+ | RET | ||
+ | </code> | ||
+ | - 5) задержка до нажатия клавиши и чтение ее кода <code> | ||
+ | CALL 009F | ||
+ | LD H,0 | ||
+ | LD L,A | ||
+ | CALL 2F99 | ||
+ | RET | ||
+ | </code> | ||
+ | - 6) чтение состояния рукоятки джойстика <code> | ||
+ | CALL 521F | ||
+ | CALL 00D5 | ||
+ | LD H,0 | ||
+ | LD L,A | ||
+ | CALL 2F99 | ||
+ | RET | ||
+ | </code> | ||
+ | - 7) чтение состояния кнопки джойстика <code> | ||
+ | CALL 521F | ||
+ | CALL 00D8 | ||
+ | LD H,0 | ||
+ | LD L,A | ||
+ | CALL 2F99 | ||
+ | RET | ||
+ | </code> | ||
+ | - 8) чтение состояния клавиши на графическом планшете <code> | ||
+ | CALL 521F | ||
+ | CALL 00DB | ||
+ | LD H,0 | ||
+ | LD L,A | ||
+ | CALL 2F99 | ||
+ | RET | ||
+ | </code> | ||
+ | - 9) чтение статуса манипулятора PDL <code> | ||
+ | CALL 521F | ||
+ | CALL 00DE | ||
+ | LD H,0 | ||
+ | LD L,A | ||
+ | CALL 2F99 | ||
+ | RET | ||
</code> | </code> | ||
Строка 536: | Строка 547: | ||
===== 1.2.4. Примеры ===== | ===== 1.2.4. Примеры ===== | ||
+ | {{anchor:e10204-01}} __//Пример 1//__. Чтение символа с заданной позицией из буфера клавиатуры | ||
+ | \\ {{.examples:10204-01.bas|}} \\ [[+tab|wmsxbpge>10204-01.bas]] | ||
<code> | <code> | ||
- | П р и м е р 1. Чтение символа с заданной позицией из буфера клавиатуры | + | 10 CLEAR 200,&HA000:DEFUSR=&HA000:POKE &HA100,2 '◀── Позиция символа |
- | ───────────── | + | 20 FOR I=0 TO 14:READ R$:POKE &HA000+I,VAL("&h"+R$):NEXT |
- | 10 CLEAR 200,&HA000:DEFUSR=&HA000:POKE &HA100,2 '◀── Позиция символа | + | 30 Z=USR(0) |
- | 20 FOR I=0 TO 14:READ R$:POKE &HA000+I,VAL("&h"+R$):NEXT | + | 40 DATA CD,B4,00 :' CALL 00B4h |
- | 30 Z=USR(0) | + | 50 DATA 3A,00,A1 :' LD A,(A100h) |
- | 40 DATA CD,B4,00 :' CALL 00B4h | + | 60 DATA 4F :' LD C,A |
- | 50 DATA 3A,00,A1 :' LD A,(A100h) | + | 70 DATA 06,00 :' LD B,0 |
- | 60 DATA 4F :' LD C,A | + | 80 DATA 09 :' ADD HL,BC |
- | 70 DATA 06,00 :' LD B,0 | + | 90 DATA 7E :' LD A,(HL) |
- | 80 DATA 09 :' ADD HL,BC | + | 100 DATA CD,A2,00 :' CALL 00A2h |
- | 90 DATA 7E :' LD A,(HL) | + | 110 DATA C9 :' RET |
- | 100 DATA CD,A2,00 :' CALL 00A2h | + | </code> |
- | 110 DATA C9 :' RET | + | |
- | П р и м е р 2. Вывод на экран слова "Миша"! | + | {{anchor:e10204-02}} __//Пример 2//__. Вывод на экран слова "Миша"! |
- | ───────────── | + | \\ {{.examples:10204-02.bas|}} \\ [[+tab|wmsxbpge>10204-02.bas]] |
- | 10 AD=&HD000:DEFUSR=&HD000 | + | <code> |
- | 20 READ A$:IF A$="Z" THEN A=USR(0):END | + | 10 AD=&HD000:DEFUSR=&HD000 |
- | 30 POKE AD,VAL("&h"+A$) | + | 20 READ A$:IF A$="Z" THEN A=USR(0):END |
- | 40 AD=AD+1:GOTO 20 | + | 30 POKE AD,VAL("&h"+A$) |
- | 50 DATA 3E,ED :' LD A,ED | + | 40 AD=AD+1:GOTO 20 |
- | 60 DATA CD,A2,00 :' CALL 00A2h;Вывод на экран содержимого регистра А | + | 50 DATA 3E,ED :' LD A,ED |
- | 70 DATA 3E,C9 :' LD A,C9 | + | 60 DATA CD,A2,00 :' CALL 00A2h;Вывод на экран содержимого регистра А |
- | 80 DATA CD,A2,00 :' CALL 00A2h;Вывод на экран содержимого регистра А | + | 70 DATA 3E,C9 :' LD A,C9 |
- | 90 DATA 3E,DB :' LD A,DB | + | 80 DATA CD,A2,00 :' CALL 00A2h;Вывод на экран содержимого регистра А |
- | 100 DATA CD,A2,00 :' CALL 00A2h;Вывод на экран содержимого регистра А | + | 90 DATA 3E,DB :' LD A,DB |
- | 110 DATA 3E,C1 :' LD A,C1 | + | 100 DATA CD,A2,00 :' CALL 00A2h;Вывод на экран содержимого регистра А |
- | 120 DATA CD,A2,00 :' CALL 00A2h;Вывод на экран содержимого регистра А | + | 110 DATA 3E,C1 :' LD A,C1 |
- | 130 DATA C9 :' RET | + | 120 DATA CD,A2,00 :' CALL 00A2h;Вывод на экран содержимого регистра А |
- | 140 DATA "Z" :' К о н е ц | + | 130 DATA C9 :' RET |
+ | 140 DATA "Z" :' К о н е ц | ||
+ | </code> | ||
- | П р и м е р 3. Вывод на экран дисплея н е п о д в и ж н о г о | + | {{anchor:e10204-03}} __//Пример 3//__. Вывод на экран дисплея //неподвижного// спрайта. |
- | ────────────── спрайта. | + | \\ {{.examples:10204-03.bas|}} \\ [[+tab|wmsxbpge>10204-03.bas]] |
- | 10 SCREEN 1 | + | <code> |
- | 20 KEY OFF:CLEAR 300,&HD000:I=&HD000 | + | 10 SCREEN 1 |
- | 30 READ A$:IF A$="z" THEN SCREEN 1:GOTO 50 | + | 20 KEY OFF:CLEAR 300,&HD000:I=&HD000 |
- | 40 POKE I,VAL("&h"+A$):I=I+1:GOTO 30 | + | 30 READ A$:IF A$="z" THEN SCREEN 1:GOTO 50 |
- | 50 DEFUSR=&HD00C:A=USR(0) | + | 40 POKE I,VAL("&h"+A$):I=I+1:GOTO 30 |
- | 60 DATA FF,FF,C3,C3:'Д а н н ы е | + | 50 DEFUSR=&HD00C:A=USR(0) |
- | 70 DATA C3,C3,FF,FF:'Д а н н ы е | + | 60 DATA FF,FF,C3,C3:'Д а н н ы е |
- | 80 DATA 64,01,00,0F:'X, Y, Ш а б л о н , Ц в е т | + | 70 DATA C3,C3,FF,FF:'Д а н н ы е |
- | 90 DATA 21,00,D0 :'LD HL,D000 | + | 80 DATA 64,01,00,0F:'X, Y, Ш а б л о н , Ц в е т |
- | 100 DATA 11,00,38 :'LD DE,3800 | + | 90 DATA 21,00,D0 :'LD HL,D000 |
- | 110 DATA 01,08,00 :'LD BC,0008 | + | 100 DATA 11,00,38 :'LD DE,3800 |
- | 120 DATA CD,5C,00 :'CALL 005C | + | 110 DATA 01,08,00 :'LD BC,0008 |
- | 130 DATA 21,08,D0 :'LD HL,D008 | + | 120 DATA CD,5C,00 :'CALL 005C |
- | 140 DATA 11,00,1B :'LD DE,1B00 | + | 130 DATA 21,08,D0 :'LD HL,D008 |
- | 150 DATA 01,04,00 :'LD BC,0004 | + | 140 DATA 11,00,1B :'LD DE,1B00 |
- | 160 DATA CD,5C,00 :'CALL 005C | + | 150 DATA 01,04,00 :'LD BC,0004 |
- | 170 DATA 21,09,D0 :'LD HL,D009 | + | 160 DATA CD,5C,00 :'CALL 005C |
- | 180 DATA 34 :'INC (HL) | + | 170 DATA 21,09,D0 :'LD HL,D009 |
- | 190 DATA C9 :'RET | + | 180 DATA 34 :'INC (HL) |
- | 230 DATA"z" :'К о н е ц | + | 190 DATA C9 :'RET |
- | П р и м е р 4. Вывод на экран дисплея д в и ж у щ е г о с я | + | 230 DATA"z" :'К о н е ц |
- | ────────────── спрайта | + | </code> |
- | 10 SCREEN 1 | + | |
- | 20 KEY OFF:CLEAR 300,&HD000:I=&HD000 | + | |
- | 30 READ A$:IF A$="z" THEN SCREEN 1:GOTO 50 | + | |
- | 40 POKE I,VAL("&h"+A$):I=I+1:GOTO 30 | + | |
- | 50 DEFUSR=&HD00C:A=USR(0) | + | |
- | 60 DATA FF,FF,C3,C3:'Д а н н ы е | + | |
- | 70 DATA C3,C3,FF,FF:'Д а н н ы е | + | |
- | 80 DATA 64,01,00,0F:'X, Y, Ш а б л о н , Ц в е т | + | |
- | 90 DATA 21,00,D0 :'LD HL,D000 | + | |
- | 100 DATA 11,00,38 :'LD DE,3800 | + | |
- | 110 DATA 01,08,00 :'LD BC,0008 | + | |
- | 120 DATA CD,5C,00 :'CALL 005C | + | |
- | 130 DATA 21,08,D0 :'LD HL,D008◀┐ | + | |
- | 140 DATA 11,00,1B :'LD DE,1B00 │ | + | |
- | 150 DATA 01,04,00 :'LD BC,0004 │ | + | |
- | 160 DATA CD,5C,00 :'CALL 005C │ | + | |
- | 170 DATA 21,09,D0 :'LD HL,D009 │ | + | |
- | 180 DATA 34 :'INC (HL) │ | + | |
- | 190 DATA CD,BA,00 :'CALL 00BA │ | + | |
- | 200 DATA 06,F1,00 :'LD B,F1◀─┐ │Задержка | + | |
- | 210 DATA 10,FD :'DJNZ ─┘ │Задержка | + | |
- | 220 DATA C3,17,D0 :'JP D017 ───┘ | + | |
- | 230 DATA"z" :'К о н е ц | + | |
- | П р и м е р 5. Столкновение спрайтов | + | |
- | ────────────── | + | |
- | 10 POKE &HD000,0:KEYOFF | + | |
- | 20 SCREEN 1:SPRITE$(0)="orpolrplor":SPRITE$(1)="orplorlorlo" | + | |
- | 30 DEFUSR=&H9000:D=&H9000 | + | |
- | 50 READ A$ | + | |
- | 60 IF A$="z" THEN 180 | + | |
- | 70 POKE D,VAL("&h"+A$) | + | |
- | 80 D=D+1 | + | |
- | 90 GOTO 50 | + | |
- | 100 DATA CD,3E,01 :' CALL 013E | + | |
- | 110 DATA E6,20 :' AND 20 | + | |
- | 120 DATA FE,00 :' CP 0 | + | |
- | 130 DATA C8 :' RET Z | + | |
- | 140 DATA 3E,01 :' LD A,1 | + | |
- | 150 DATA 32,00,D0 :' LD (D000),A | + | |
- | 160 DATA C9 :' RET | + | |
- | 170 DATA "z" :' К о н е ц | + | |
- | 180 FOR I=0 TO 255:PUT SPRITE 1,(I,40),6,0:PUT SPRITE 2,(255-I,40),5,1 | + | |
- | 190 A=USR(0):P=PEEK(&HD000): | + | |
- | IF P=1 THEN FOR K=0 TO 10:COLOR 1,15,15:COLOR 15,1,1:NEXT: | + | |
- | POKE &HD000,0 | + | |
- | 200 NEXT:GOTO 180 | + | |
- | + | ||
- | П р и м е р 6. Мгновенное "утолщение" символов! | + | |
- | ────────────── | + | |
- | 10 CLEAR 100,&HA000:AD=&HA000:DEFUSR=&HA000 | + | |
- | 30 READ A$:IF A$="z"THEN 80 | + | |
- | 50 POKE AD,VAL("&h"+A$):AD=AD+1:GOTO 30 | + | |
- | 80 A=USR(0):END | + | |
- | 90 DATA CD,6F,00 :' CALL 006Fh | + | |
- | 100 DATA 21,08,01 :' LD HL,0108h | + | |
- | 110 DATA 11,F8,07 :' LD DE,07F8h | + | |
- | 120 DATA CD,4A,00 :' CALL 004Ah ◀──┐ | + | |
- | 130 DATA 47 :' LD B,A │ | + | |
- | 140 DATA CB,38 :' SRL B │ | + | |
- | 150 DATA B0 :' OR B │ | + | |
- | 160 DATA CD,4D,00 :' CALL 004Dh │ | + | |
- | 170 DATA 7D :' LD A,L │ | + | |
- | 180 DATA BB :' CP E │ | + | |
- | 190 DATA CA,1C,A0 :' JP Z,A01Ch──│──┐ | + | |
- | 200 DATA 23 :' INC HL │ │ | + | |
- | 210 DATA C3,09,A0 :' JP A009 ───┘ │ | + | |
- | 220 DATA 7A :' LD A,D ◀──────┘ | + | |
- | 230 DATA BC :' CP H | + | |
- | 240 DATA CA,25,A0 :' JP Z,A025h──┐ | + | |
- | 250 DATA 23 :' INC HL │ | + | |
- | 260 DATA C3,09,A0 :' JP A009h │ | + | |
- | 270 DATA C9 :' RET ◀──┘ | + | |
- | 280 DATA "z" :' К о н е ц | + | |
- | П р и м е р 7. Образование слова-"перевертыша" | + | {{anchor:e10204-04}} __//Пример 4//__. Вывод на экран дисплея //движущегося// спрайта |
- | ────────────── | + | \\ {{.examples:10204-04.bas|}} \\ [[+tab|wmsxbpge>10204-04.bas]] |
- | 10 CLEAR 400,&HD000:DEFUSR=&HD00F:A=&HD00F | + | <code> |
- | 20 READ A$:IF A$="z" THEN R=USR(R):END ELSE 30 | + | 10 SCREEN 1 |
- | 30 POKE A,VAL("&h"+A$):A=A+1:GOTO 20 | + | 20 KEY OFF:CLEAR 300,&HD000:I=&HD000 |
- | 40 DATA CD,C3,00 :' CALL 00C3 ; Очистка экрана | + | 30 READ A$:IF A$="z" THEN SCREEN 1:GOTO 50 |
- | 50 DATA CD,B4,00 :' CALL 00B4 ; Ввод строки | + | 40 POKE I,VAL("&h"+A$):I=I+1:GOTO 30 |
- | 60 DATA 06,11 :' LD B,11h ; Загрузка параметра цикла | + | 50 DEFUSR=&HD00C:A=USR(0) |
- | 70 DATA 23 :' INC HL ; ◀──────┐ | + | 60 DATA FF,FF,C3,C3:'Д а н н ы е |
- | 80 DATA 10,FD :' DJNZ $-1 ; ───────┘ | + | 70 DATA C3,C3,FF,FF:'Д а н н ы е |
- | 90 DATA 06,11 :' LD B,11h ; Загрузка параметра цикла | + | 80 DATA 64,01,00,0F:'X, Y, Ш а б л о н , Ц в е т |
- | 100 DATA 7E :' LD A,(HL) ; | + | 90 DATA 21,00,D0 :'LD HL,D000 |
- | 110 DATA 2B :' DEC HL ; | + | 100 DATA 11,00,38 :'LD DE,3800 |
- | 120 DATA CD,A2,00 :' CALL 00A2 ; Печать символа, код которого содер- | + | 110 DATA 01,08,00 :'LD BC,0008 |
- | ; жится в регистре A | + | 120 DATA CD,5C,00 :'CALL 005C |
- | 130 DATA 10,F9 :' DJNZ $-5 ; Цикл, организованный для печати | + | 130 DATA 21,08,D0 :'LD HL,D008◀┐ |
- | ; слова | + | 140 DATA 11,00,1B :'LD DE,1B00 │ |
- | 140 DATA C9 :' RET ; К о н е ц | + | 150 DATA 01,04,00 :'LD BC,0004 │ |
- | 150 DATA "z" | + | 160 DATA CD,5C,00 :'CALL 005C │ |
+ | 170 DATA 21,09,D0 :'LD HL,D009 │ | ||
+ | 180 DATA 34 :'INC (HL) │ | ||
+ | 190 DATA CD,BA,00 :'CALL 00BA │ | ||
+ | 200 DATA 06,F1,00 :'LD B,F1◀─┐ │Задержка | ||
+ | 210 DATA 10,FD :'DJNZ ─┘ │Задержка | ||
+ | 220 DATA C3,17,D0 :'JP D017 ───┘ | ||
+ | 230 DATA"z" :'К о н е ц | ||
+ | </code> | ||
- | П р и м е р 8. Вычеркивание из слова латинской буквы "А" | + | {{anchor:e10204-05}} __//Пример 5//__. Столкновение спрайтов |
- | ────────────── | + | \\ {{.examples:10204-05.bas|}} \\ [[+tab|wmsxbpge>10204-05.bas]] |
- | 10 CLEAR 200,&HD000:DEFUSR=&HD001:A=&HD001 | + | <code> |
- | 20 READ R$:IF R$="z" THEN 40 | + | 10 POKE &HD000,0:KEYOFF |
- | 30 POKE A,VAL("&h"+R$):A=A+1:GOTO 20 | + | 20 SCREEN 1:SPRITE$(0)="orpolrplor":SPRITE$(1)="orplorlorlo" |
- | 40 P=USR(0) | + | 30 DEFUSR=&H9000:D=&H9000 |
- | 45 DATA CD,C3,00 :'CALL 00C3 ; Очистка экрана | + | 50 READ A$ |
- | 50 DATA CD,B4,00 :'CALL 00B4 ; Ввод строки | + | 60 IF A$="z" THEN 180 |
- | 70 DATA 3E,41 :'LD A,41 ; Загрузка кода вычеркиваемого символа | + | 70 POKE D,VAL("&h"+A$) |
- | 75 DATA 23 :'INC HL ; | + | 80 D=D+1 |
- | 80 DATA BE :'CP (HL) ; | + | 90 GOTO 50 |
- | 90 DATA 28,04 :'JR Z,$+6 ; | + | 100 DATA CD,3E,01 :' CALL 013E |
- | 100 DATA 7E :'LD A,(HL) ; | + | 110 DATA E6,20 :' AND 20 |
- | 110 DATA CD,A2,00 :'CALL 00A2 ; Вывод символа с кодом,содержащимся в | + | 120 DATA FE,00 :' CP 0 |
- | ; регистре А | + | 130 DATA C8 :' RET Z |
- | 120 DATA 3E,00 :'LD A,00 ; | + | 140 DATA 3E,01 :' LD A,1 |
- | 130 DATA BE :'CP (HL) ; | + | 150 DATA 32,00,D0 :' LD (D000),A |
- | 140 DATA 28,02 :'JR Z,$+3 ; Выход из программы по биту Z | + | 160 DATA C9 :' RET |
- | 141 DATA 18,EF :'JR $-15 ; | + | 170 DATA "z" :' К о н е ц |
- | 145 DATA C9 :'RET ; | + | 180 FOR I=0 TO 255:PUT SPRITE 1,(I,40),6,0:PUT SPRITE 2,(255-I,40),5,1 |
- | 150 DATA "z" | + | 190 A=USR(0):P=PEEK(&HD000): |
+ | IF P=1 THEN FOR K=0 TO 10:COLOR 1,15,15:COLOR 15,1,1:NEXT: | ||
+ | POKE &HD000,0 | ||
+ | 200 NEXT:GOTO 180 | ||
+ | </code> | ||
- | П р и м е р 9. Подсчет количества символов во введенном слове | + | {{anchor:e10204-06}} __//Пример 6//__. Мгновенное "утолщение" символов! |
- | ───────────── | + | \\ {{.examples:10204-06.bas|}} \\ [[+tab|wmsxbpge>10204-06.bas]] |
- | 10 CLEAR 200,&HD000:DEFUSR=&HD001:A=&HD001 | + | <code> |
- | 20 READ R$:IF R$="z" THEN 40 | + | 10 CLEAR 100,&HA000:AD=&HA000:DEFUSR=&HA000 |
- | 30 POKE A,VAL("&h"+R$):A=A+1:GOTO 20 | + | 30 READ A$:IF A$="z"THEN 80 |
- | 40 P=USR(0) | + | 50 POKE AD,VAL("&h"+A$):AD=AD+1:GOTO 30 |
- | 45 DATA CD,C3,00 :' CALL 00C3 ; Очистка экрана | + | 80 A=USR(0):END |
- | 50 DATA CD,B4,00 :' CALL 00B4 ; Ввод слова | + | 90 DATA CD,6F,00 :' CALL 006Fh |
- | 60 DATA 06,00 :' LD B,00 ; | + | 100 DATA 21,08,01 :' LD HL,0108h |
- | 70 DATA 3E,00 :' LD A,00 ; | + | 110 DATA 11,F8,07 :' LD DE,07F8h |
- | 75 DATA 23 :' INC HL ; | + | 120 DATA CD,4A,00 :' CALL 004Ah ◀──┐ |
- | 80 DATA BE :' CP (HL) ; | + | 130 DATA 47 :' LD B,A │ |
- | 90 DATA 28,03 :' JR Z,$+5 ; | + | 140 DATA CB,38 :' SRL B │ |
- | 100 DATA 04 :' INC B ; | + | 150 DATA B0 :' OR B │ |
- | 110 DATA 18,F7 :' JR $-7 ; | + | 160 DATA CD,4D,00 :' CALL 004Dh │ |
- | 120 DATA 78 :' LD A,B ; | + | 170 DATA 7D :' LD A,L │ |
- | 130 DATA 32,00,A0 :' LD (A000),A; | + | 180 DATA BB :' CP E │ |
- | 140 DATA C9 :' RET ; | + | 190 DATA CA,1C,A0 :' JP Z,A01Ch──│──┐ |
- | 150 DATA "z" | + | 200 DATA 23 :' INC HL │ │ |
- | 160 PRINT PEEK(&HA000) | + | 210 DATA C3,09,A0 :' JP A009 ───┘ │ |
+ | 220 DATA 7A :' LD A,D ◀──────┘ | ||
+ | 230 DATA BC :' CP H | ||
+ | 240 DATA CA,25,A0 :' JP Z,A025h──┐ | ||
+ | 250 DATA 23 :' INC HL │ | ||
+ | 260 DATA C3,09,A0 :' JP A009h │ | ||
+ | 270 DATA C9 :' RET ◀──┘ | ||
+ | 280 DATA "z" :' К о н е ц | ||
+ | </code> | ||
+ | {{anchor:e10204-07}} __//Пример 7//__. Образование слова-"перевертыша" | ||
+ | \\ {{.examples:10204-07.bas|}} \\ [[+tab|wmsxbpge>10204-07.bas]] | ||
+ | <code> | ||
+ | 10 CLEAR 400,&HD000:DEFUSR=&HD00F:A=&HD00F | ||
+ | 20 READ A$:IF A$="z" THEN R=USR(R):END ELSE 30 | ||
+ | 30 POKE A,VAL("&h"+A$):A=A+1:GOTO 20 | ||
+ | 40 DATA CD,C3,00 :' CALL 00C3 ; Очистка экрана | ||
+ | 50 DATA CD,B4,00 :' CALL 00B4 ; Ввод строки | ||
+ | 60 DATA 06,11 :' LD B,11h ; Загрузка параметра цикла | ||
+ | 70 DATA 23 :' INC HL ; ◀──────┐ | ||
+ | 80 DATA 10,FD :' DJNZ $-1 ; ───────┘ | ||
+ | 90 DATA 06,11 :' LD B,11h ; Загрузка параметра цикла | ||
+ | 100 DATA 7E :' LD A,(HL) ; | ||
+ | 110 DATA 2B :' DEC HL ; | ||
+ | 120 DATA CD,A2,00 :' CALL 00A2 ; Печать символа, код которого содер- | ||
+ | ; жится в регистре A | ||
+ | 130 DATA 10,F9 :' DJNZ $-5 ; Цикл, организованный для печати | ||
+ | ; слова | ||
+ | 140 DATA C9 :' RET ; К о н е ц | ||
+ | 150 DATA "z" | ||
+ | </code> | ||
+ | {{anchor:e10204-08}} __//Пример 8//__. Вычеркивание из слова латинской буквы "А" | ||
+ | \\ {{.examples:10204-08.bas|}} \\ [[+tab|wmsxbpge>10204-08.bas]] | ||
+ | <code> | ||
+ | 10 CLEAR 200,&HD000:DEFUSR=&HD001:A=&HD001 | ||
+ | 20 READ R$:IF R$="z" THEN 40 | ||
+ | 30 POKE A,VAL("&h"+R$):A=A+1:GOTO 20 | ||
+ | 40 P=USR(0) | ||
+ | 45 DATA CD,C3,00 :'CALL 00C3 ; Очистка экрана | ||
+ | 50 DATA CD,B4,00 :'CALL 00B4 ; Ввод строки | ||
+ | 70 DATA 3E,41 :'LD A,41 ; Загрузка кода вычеркиваемого символа | ||
+ | 75 DATA 23 :'INC HL ; | ||
+ | 80 DATA BE :'CP (HL) ; | ||
+ | 90 DATA 28,04 :'JR Z,$+6 ; | ||
+ | 100 DATA 7E :'LD A,(HL) ; | ||
+ | 110 DATA CD,A2,00 :'CALL 00A2 ; Вывод символа с кодом,содержащимся в | ||
+ | ; регистре А | ||
+ | 120 DATA 3E,00 :'LD A,00 ; | ||
+ | 130 DATA BE :'CP (HL) ; | ||
+ | 140 DATA 28,02 :'JR Z,$+3 ; Выход из программы по биту Z | ||
+ | 141 DATA 18,EF :'JR $-15 ; | ||
+ | 145 DATA C9 :'RET ; | ||
+ | 150 DATA "z" | ||
+ | </code> | ||
- | П р и м е р 10. Иллюстрация работы подпрограммы BIOS по адресу 0010h | + | {{anchor:e10204-09}} __//Пример 9//__. Подсчет количества символов во введенном слове |
- | ─────────────── | + | \\ {{.examples:10204-09.bas|}} \\ [[+tab|wmsxbpge>10204-09.bas]] |
- | 10 CLEAR 100,&HD000:DEFUSR=&HD000:AD=&HD000 | + | <code> |
- | 40 C$="YAMAHA !!!":C=LEN(C$) | + | 10 CLEAR 200,&HD000:DEFUSR=&HD001:A=&HD001 |
- | 50 FOR I=1 TO LEN(C$) | + | 20 READ R$:IF R$="z" THEN 40 |
- | 60 POKE &HA000+I,ASC(MID$(C$,I,1)) | + | 30 POKE A,VAL("&h"+R$):A=A+1:GOTO 20 |
- | 70 NEXT | + | 40 P=USR(0) |
- | 80 READ A$:IF A$="z"THEN 120 | + | 45 DATA CD,C3,00 :' CALL 00C3 ; Очистка экрана |
- | 100 POKE AD,VAL("&h"+A$):AD=AD+1:GOTO 80 | + | 50 DATA CD,B4,00 :' CALL 00B4 ; Ввод слова |
- | 120 POKE &HD001,C:A=USR(0):END | + | 60 DATA 06,00 :' LD B,00 ; |
- | 130 DATA 06,00 :' LD B,0 ;В регистре B уже находится длина | + | 70 DATA 3E,00 :' LD A,00 ; |
- | ;слова C$ | + | 75 DATA 23 :' INC HL ; |
- | 140 DATA 21,00,A0 :' LD HL,A000 | + | 80 DATA BE :' CP (HL) ; |
- | 150 DATA CD,10,00 :' CALL 0010 ;◀──┐ | + | 90 DATA 28,03 :' JR Z,$+5 ; |
- | 160 DATA CD,A2,00 :' CALL 00A2 ; │ | + | 100 DATA 04 :' INC B ; |
- | 170 DATA 10,F8 :' DJNZ D005 ;───┘ | + | 110 DATA 18,F7 :' JR $-7 ; |
- | 180 DATA C9 :' RET | + | 120 DATA 78 :' LD A,B ; |
- | 190 DATA "z" | + | 130 DATA 32,00,A0 :' LD (A000),A; |
+ | 140 DATA C9 :' RET ; | ||
+ | 150 DATA "z" | ||
+ | 160 PRINT PEEK(&HA000) | ||
+ | </code> | ||
- | П р и м е р 11. Использование текстового представления для установки | + | {{anchor:e10204-10}} __//Пример 10//__. Иллюстрация работы подпрограммы BIOS по адресу 0010h |
- | ────────────── т о ч к и на графическом экране. | + | \\ {{.examples:10204-10.bas|}} \\ [[+tab|wmsxbpge>10204-10.bas]] |
- | 10 SCREEN 7 | + | <code> |
- | 20 POKE &HA000,&H28 :'Загрузка кода ASCII символа "(" | + | 10 CLEAR 100,&HD000:DEFUSR=&HD000:AD=&HD000 |
- | 30 POKE &HA001,&HF :'Управляющий код. Если координата X двухбайтовая, | + | 40 C$="YAMAHA !!!":C=LEN(C$) |
- | то управляющий код равен &H1C, иначе - &h0F | + | 50 FOR I=1 TO LEN(C$) |
- | 40 POKE &HA002,&HFF :'Координата X | + | 60 POKE &HA000+I,ASC(MID$(C$,I,1)) |
- | 50 POKE &HA003,&H2C :'Код ASCII символа "," | + | 70 NEXT |
- | 60 POKE &HA004,&HF :'Управляющий код | + | 80 READ A$:IF A$="z"THEN 120 |
- | 70 POKE &HA005,&H1A :'Координата Y | + | 100 POKE AD,VAL("&h"+A$):AD=AD+1:GOTO 80 |
- | 80 POKE &HA006,&H29 :'Код ASCII символа ")" | + | 120 POKE &HD001,C:A=USR(0):END |
- | 90 POKE &HA007,&H2C :'Код ASCII символа "," | + | 130 DATA 06,00 :' LD B,0 ;В регистре B уже находится длина |
- | 100 POKE &HA008,&HF :'Управляющий код | + | ;слова C$ |
- | 110 POKE &HA009,&HF :'Код цвета т о ч к и | + | 140 DATA 21,00,A0 :' LD HL,A000 |
- | 120 POKE &HA00A,&H0 :'Конец т е к с т о в о г о представления | + | 150 DATA CD,10,00 :' CALL 0010 ;◀──┐ |
- | 130 CLEAR 200,&HD000:DEFUSR=&HD000:P=&HD000 | + | 160 DATA CD,A2,00 :' CALL 00A2 ; │ |
- | 140 READ A$ | + | 170 DATA 10,F8 :' DJNZ D005 ;───┘ |
- | 150 IF A$="z" THEN GOTO 170 | + | 180 DATA C9 :' RET |
- | 160 POKE P,VAL("&h"+A$):P=P+1:GOTO 140 | + | 190 DATA "z" |
- | 170 A=USR(0) | + | </code> |
- | 180 DATA 21,00,A0 :'LD HL,A000 Загрузка адреса текстового представления оператора | + | |
- | 190 DATA F7,87,6D,00 :'RST 30[87/006D] Обращение к подпрограмме BIOS | + | |
- | 200 DATA c9,"z" | + | |
- | 210 A$=INPUT$(1) | + | |
- | П р и м е р 12. Вывод на экран дисплея числа из регистра B | + | {{anchor:e10204-11}} __//Пример 11//__. Использование текстового представления для установки //точки// на графическом экране. |
- | ─────────────── | + | \\ {{.examples:10204-11.bas|}} \\ [[+tab|wmsxbpge>10204-11.bas]] |
- | 10 DATA 3A,00,E0 :' D000:LD A,(E000) ;Исходное число | + | <code> |
- | 20 DATA 47 :' LD B,A ;сохраняем в регистре B | + | 10 SCREEN 7 |
- | 30 DATA CD,12,D0 :' CALL D012 ;──────────────────────┐ | + | 20 POKE &HA000,&H28 :'Загрузка кода ASCII символа "(" |
- | 40 DATA CD,A2,00 :' CALL 00A2 ;Печатаем символ │ | + | 30 POKE &HA001,&HF :'Управляющий код. Если координата X двухбайтовая, |
- | 50 DATA 78 :' LD A,B ;Восстанавливаем │ | + | то управляющий код равен &H1C, иначе - &h0F |
- | 60 DATA CD,16,D0 :' CALL D016 ;──────────────────────│┐ | + | 40 POKE &HA002,&HFF :'Координата X |
- | 70 DATA CD,A2,00 :' CALL 00A2 ;Печатаем символ ││ | + | 50 POKE &HA003,&H2C :'Код ASCII символа "," |
- | 80 DATA C9 :' RET ;Возврат в MSX-BASIC ││ | + | 60 POKE &HA004,&HF :'Управляющий код |
- | 90 DATA 0F :'D012: RRCA ;◀─────────────────────┘│ | + | 70 POKE &HA005,&H1A :'Координата Y |
- | 100 DATA 0F :' RRCA ;Ставим старший полубайт│ | + | 80 POKE &HA006,&H29 :'Код ASCII символа ")" |
- | 110 DATA 0F :' RRCA ;на место младшего │ | + | 90 POKE &HA007,&H2C :'Код ASCII символа "," |
- | 120 DATA 0F :' RRCA ; ▼ | + | 100 POKE &HA008,&HF :'Управляющий код |
- | 130 DATA E6,0F :'D016: AND 0F ;Выделяем младший полубайт | + | 110 POKE &HA009,&HF :'Код цвета т о ч к и |
- | 140 DATA 0E,0A :' LD C,0A ;Сравниваем с 10 | + | 120 POKE &HA00A,&H0 :'Конец т е к с т о в о г о представления |
- | 150 DATA B9 :' CP C ;··· | + | 130 CLEAR 200,&HD000:DEFUSR=&HD000:P=&HD000 |
- | 160 DATA FA,21,D0 :' JP M,D021 ;Если меньше, то ───────┐ | + | 140 READ A$ |
- | 170 DATA C6,37 :' ADD A,37 ; │ | + | 150 IF A$="z" THEN GOTO 170 |
- | 180 DATA C9 :' RET ; │ | + | 160 POKE P,VAL("&h"+A$):P=P+1:GOTO 140 |
- | 190 DATA C6,30 :'D021: ADD A,30 ;◀──────────────────────┘ | + | 170 A=USR(0) |
- | 200 DATA C9 :' RET ; | + | 180 DATA 21,00,A0 :'LD HL,A000 Загрузка адреса текстового |
- | 210 ' :'E000: заданное число | + | представления оператора |
- | 220 FOR I=0 TO 35: READ A$ | + | 190 DATA F7,87,6D,00 :'RST 30[87/006D] Обращение к подпрограмме BIOS |
- | 230 POKE &HD000+I,VAL("&h"+A$) | + | 200 DATA c9,"z" |
- | 240 NEXT I | + | 210 A$=INPUT$(1) |
- | 245 PRINT"Введите целое число, не превышающее 255"; | + | </code> |
- | 250 INPUT BYTE: POKE &HE000,BYTE | + | |
- | 255 PRINT"Ваше число в шестнадцатеричном виде: &h"; | + | |
- | 260 DEFUSR=&HD000:Z=USR(0) | + | |
- | run | + | |
- | Введите целое число, не превышающее 255? 255 | + | |
- | Ваше число в шестнадцатеричном виде: &hFF | + | |
- | Ok | + | |
- | + | ||
- | П р и м е р 13. Ввод в память компьютера числа с клавиатуры при помо- | + | |
- | ─────────────── щи подпрограммы BIOS | + | |
- | 5' Автор программы: Поляков С.,10-й класс. 14.01.89 | + | |
- | 10 CLEAR 200,&HD000:AD=&HD000 | + | |
- | 30 READ A$:IF A$="z" THEN 60 | + | |
- | 50 A=VAL("&h"+A$):POKE AD,A:AD=AD+1:GOTO 30 | + | |
- | 60 DEFUSR=&HD000 | + | |
- | 70 PRINT"Введите десятичное трехзначное число от 0 до 255:" | + | |
- | 80 A=USR(0):PRINT"Вы ввели число:"PEEK(&HB000):END | + | |
- | 110 DATA F7,00,B4,00 :'RST 30[00/00B4];BIOS ввода строки | + | |
- | 120 DATA 23 :'INC HL | + | |
- | 130 DATA 7E :'LD A,(HL) ;В А - код первого символа | + | |
- | 140 DATA 06,63 :'LD B,63h ;Блок получения числа сотен | + | |
- | 150 DATA D6,30 :'SUB 30h ;;; В регистре А - число | + | |
- | 160 DATA 57 :'LD D,A ;;; | + | |
- | 170 DATA 8A :'ADC A,D ;;; | + | |
- | 180 DATA 10,FD :'DJNZ $-1 ;;; | + | |
- | 190 DATA 5F :'LD E,A ;В регистрах А и Е - число | + | |
- | 200 DATA 16,00 :'LD D,00h ;сотен, умноженное на 100 | + | |
- | 210 DATA D5 :'PUSH DE ;Результат - в регистре DE | + | |
- | 220 DATA 23 :'INC HL | + | |
- | 230 DATA 7E :'LD A,(HL) ;В А - код второго символа | + | |
- | 240 DATA 06,09 :'LD B,09h ;Блок получения числа десятков | + | |
- | 250 DATA D6,30 :'SUB 30h ;;; В регистре А - число | + | |
- | 260 DATA 57 :'LD D,A ;;; | + | |
- | 270 DATA 8A :'ADC A,D ;;; | + | |
- | 280 DATA 10,FD :'DJNZ $-1 ;;; | + | |
- | 290 DATA D1 :'POP DE ; | + | |
- | 300 DATA 8B :'ADC A,E ; | + | |
- | 310 DATA 5F :'LD E,A ;В регистрах А и Е - сумма со- | + | |
- | 320 DATA D5 :'PUSH DE ;тен и десятков | + | |
- | 330 DATA 23 :'INC HL ; | + | |
- | 340 DATA 7E :'LD A,(HL) ;В А - код третьего символа | + | |
- | 350 DATA D6,30 :'SUB 30h ;В регистре А - число | + | |
- | 360 DATA D1 :'POP DE | + | |
- | 370 DATA 8B :'ADC A,E ;В А - введенное нами число | + | |
- | 380 DATA 6F :'LD L,A | + | |
- | 390 DATA 26,00 :'LD H,00 | + | |
- | 400 DATA 22,00,B0 :'LD (B000h),HL | + | |
- | 410 DATA C9 :'RET | + | |
- | 420 DATA "z" | + | |
+ | {{anchor:e10204-12}} __//Пример 12//__. Вывод на экран дисплея числа из регистра B | ||
+ | \\ {{.examples:10204-12.bas|}} \\ [[+tab|wmsxbpge>10204-12.bas]] | ||
+ | <code> | ||
+ | 10 DATA 3A,00,E0 :' D000:LD A,(E000) ;Исходное число | ||
+ | 20 DATA 47 :' LD B,A ;сохраняем в регистре B | ||
+ | 30 DATA CD,12,D0 :' CALL D012 ;──────────────────────┐ | ||
+ | 40 DATA CD,A2,00 :' CALL 00A2 ;Печатаем символ │ | ||
+ | 50 DATA 78 :' LD A,B ;Восстанавливаем │ | ||
+ | 60 DATA CD,16,D0 :' CALL D016 ;──────────────────────│┐ | ||
+ | 70 DATA CD,A2,00 :' CALL 00A2 ;Печатаем символ ││ | ||
+ | 80 DATA C9 :' RET ;Возврат в MSX-BASIC ││ | ||
+ | 90 DATA 0F :'D012: RRCA ;◀─────────────────────┘│ | ||
+ | 100 DATA 0F :' RRCA ;Ставим старший полубайт│ | ||
+ | 110 DATA 0F :' RRCA ;на место младшего │ | ||
+ | 120 DATA 0F :' RRCA ; ▼ | ||
+ | 130 DATA E6,0F :'D016: AND 0F ;Выделяем младший полубайт | ||
+ | 140 DATA 0E,0A :' LD C,0A ;Сравниваем с 10 | ||
+ | 150 DATA B9 :' CP C ;··· | ||
+ | 160 DATA FA,21,D0 :' JP M,D021 ;Если меньше, то ───────┐ | ||
+ | 170 DATA C6,37 :' ADD A,37 ; │ | ||
+ | 180 DATA C9 :' RET ; │ | ||
+ | 190 DATA C6,30 :'D021: ADD A,30 ;◀──────────────────────┘ | ||
+ | 200 DATA C9 :' RET ; | ||
+ | 210 ' :'E000: заданное число | ||
+ | 220 FOR I=0 TO 35: READ A$ | ||
+ | 230 POKE &HD000+I,VAL("&h"+A$) | ||
+ | 240 NEXT I | ||
+ | 245 PRINT"Введите целое число, не превышающее 255"; | ||
+ | 250 INPUT BYTE: POKE &HE000,BYTE | ||
+ | 255 PRINT"Ваше число в шестнадцатеричном виде: &h"; | ||
+ | 260 DEFUSR=&HD000:Z=USR(0) | ||
+ | run | ||
+ | Введите целое число, не превышающее 255? 255 | ||
+ | Ваше число в шестнадцатеричном виде: &hFF | ||
+ | Ok | ||
+ | </code> | ||
+ | {{anchor:e10204-13}} __//Пример 13//__. Ввод в память компьютера числа с клавиатуры при помощи подпрограммы BIOS | ||
+ | \\ {{.examples:10204-13.bas|}} \\ [[+tab|wmsxbpge>10204-13.bas]] | ||
+ | <code> | ||
+ | 5' Автор программы: Поляков С.,10-й класс. 14.01.89 | ||
+ | 10 CLEAR 200,&HD000:AD=&HD000 | ||
+ | 30 READ A$:IF A$="z" THEN 60 | ||
+ | 50 A=VAL("&h"+A$):POKE AD,A:AD=AD+1:GOTO 30 | ||
+ | 60 DEFUSR=&HD000 | ||
+ | 70 PRINT"Введите десятичное трехзначное число от 0 до 255:" | ||
+ | 80 A=USR(0):PRINT"Вы ввели число:"PEEK(&HB000):END | ||
+ | 110 DATA F7,00,B4,00 :'RST 30[00/00B4];BIOS ввода строки | ||
+ | 120 DATA 23 :'INC HL | ||
+ | 130 DATA 7E :'LD A,(HL) ;В А - код первого символа | ||
+ | 140 DATA 06,63 :'LD B,63h ;Блок получения числа сотен | ||
+ | 150 DATA D6,30 :'SUB 30h ;;; В регистре А - число | ||
+ | 160 DATA 57 :'LD D,A ;;; | ||
+ | 170 DATA 8A :'ADC A,D ;;; | ||
+ | 180 DATA 10,FD :'DJNZ $-1 ;;; | ||
+ | 190 DATA 5F :'LD E,A ;В регистрах А и Е - число | ||
+ | 200 DATA 16,00 :'LD D,00h ;сотен, умноженное на 100 | ||
+ | 210 DATA D5 :'PUSH DE ;Результат - в регистре DE | ||
+ | 220 DATA 23 :'INC HL | ||
+ | 230 DATA 7E :'LD A,(HL) ;В А - код второго символа | ||
+ | 240 DATA 06,09 :'LD B,09h ;Блок получения числа десятков | ||
+ | 250 DATA D6,30 :'SUB 30h ;;; В регистре А - число | ||
+ | 260 DATA 57 :'LD D,A ;;; | ||
+ | 270 DATA 8A :'ADC A,D ;;; | ||
+ | 280 DATA 10,FD :'DJNZ $-1 ;;; | ||
+ | 290 DATA D1 :'POP DE ; | ||
+ | 300 DATA 8B :'ADC A,E ; | ||
+ | 310 DATA 5F :'LD E,A ;В регистрах А и Е - сумма со- | ||
+ | 320 DATA D5 :'PUSH DE ;тен и десятков | ||
+ | 330 DATA 23 :'INC HL ; | ||
+ | 340 DATA 7E :'LD A,(HL) ;В А - код третьего символа | ||
+ | 350 DATA D6,30 :'SUB 30h ;В регистре А - число | ||
+ | 360 DATA D1 :'POP DE | ||
+ | 370 DATA 8B :'ADC A,E ;В А - введенное нами число | ||
+ | 380 DATA 6F :'LD L,A | ||
+ | 390 DATA 26,00 :'LD H,00 | ||
+ | 400 DATA 22,00,B0 :'LD (B000h),HL | ||
+ | 410 DATA C9 :'RET | ||
+ | 420 DATA "z" | ||
</code> | </code> | ||
Строка 867: | Строка 901: | ||
</WRAP></WRAP> | </WRAP></WRAP> | ||
- | + | {{anchor:e10204-14}} __//Пример 14//__. Инициализация текстово-графического режима SCREEN 1-2 на компьютерах MSX-1. | |
- | Пример 14. Инициализация текстово-графического режима SCREEN 1-2 на компьютерах MSX-1. | + | \\ {{.examples:10204-14.bas|}} \\ [[+tab|wmsxbpge>10204-14.bas]] |
<code> | <code> | ||
10 CLEAR 400,&HD000:DEFUSR=&HD000:K=&HD000 | 10 CLEAR 400,&HD000:DEFUSR=&HD000:K=&HD000 |