[<>]
~~TOC wide~~
====== 1.3. Работа с подпрограммами BDOS ======
Кроме подпрограмм [[msx:bios|BIOS]] в версии [[msx:disk_basic|]], а также в операционной системе [[msx:dos:|]] поддерживаются подпрограммы системы [[msx:bdos|BDOS]].
Подпрограммы BDOS вызываются следующим образом:
* α) из операционной системы [[msx:dos:|]]:
LD C,номер подпрограммы
CALL 0005h
* β) из системы [[msx:disk_basic|]]:
LD C,номер подпрограммы
CALL F37Dh
Приведем несколько примеров вызова подпрограмм BDOS из системы [[msx:disk_basic|]].
{{anchor:e1030-01}} __//Пример 1//__. Вывод //символа// на экран.
\\ {{.examples:1030-01.bas|}} \\ [[+tab|wmsxbpge>1030-01.bas]]
10 CLEAR 200,&HC000:DEFUSR=&HC000
20 DATA &H1E,64 :'В регистре E - код символа
30 DATA &H0E,&H02 :'LD C,02h ;Номер подпрограммы
40 DATA &HCD,&H7D,&HF3 :' ;Обращение к BDOS
50 DATA &HC9 :'RET
60 FOR T=0 TO 7:READ J:POKE &HC000+T,J:NEXT
70 A=USR(A) :' На экране появляется символ!
{{anchor:e1030-02}} __//Пример 2//__. Попробуем //уничтожить// имя файла с диска.\\ {{.examples:1030-02.bas|}} \\ [[+tab|wmsxbpge>1030-02.bas]]
10 CLEAR 200,&HC000:DEFUSR=&HC000
20 PRINT"Имя файла состоит из 8 символов, точки и еще 3 символов!"
30 INPUT"Какое имя уничтожить:";F$
70 'Запись имени файла в FCB
80 POKE &HE000,1 'Дисковод A:
90 FOR T=1 TO 8:POKE &HE000+T,ASC(MID$(F$,T,1)):NEXT 'Имя файла
100 FOR T=9 TO 11:POKE &HE000+T,ASC(MID$(F$,T+1,1)):NEXT 'Расширение
110 'Подпрограмма DELETE FILE
120 DATA &H11,&H00,&hE0 :'LD DE,E000h;адрес FCB
130 DATA &H0E,&H13 :'LD C,13h ;Номер подпрограммы
140 DATA &HCD,&H7D,&HF3 :'CALL F37Dh
150 DATA &HC9 :'RET
160 FOR T=0 TO 8:READ J:POKE &HC000+T,J:NEXT
170 A=USR(A): PRINT"Operation complete"
{{anchor:e1030-03}} __//Пример 3//__. Вывод //четырехбайтного// числа, содержащегося в регистрах HL и DE на экран дисплея (авторы алгоритма: J.Suzuki и T.Patterson). Программа "вырезана" А.Никитиным из файла ''COMMAND.COM'', поэтому, к сожалению, она написана на Макроассемблере.\\ {{.examples:1030-03.asm|}} \\ [[+tab|wmsxbpge>1030-03.asm]]
BDOS EQU #0005 ; Aдрес, нужный для доступа к BDOS
;
LD HL,12 ; В регистре HL содержатся младшие два байта вы-
LD DE,0 ; водимого числа, а в регистре DE - старшие два
; байта
LD BC,0 ; Очистка ячеек памяти, нужных для перевода чис-
LD (METKA),BC ; ла из шестнадцатеричного вида в десятичный
LD (METKA+2),BC ;
LD C,#20 ; В регистре С - число 20h (п о ч е м у!?)
LOOP1: ADD HL,HL ; Сложение и сдвиги необходимы для установки
RL E ; флага C регистра флагов, а следовательно, и
RL D ; для увеличения содержимого регистра E,a затем
PUSH HL ; и регистра D .
LD HL,METKA ; Считывание предыдущих результатов вычислений
LD B,#04 ; и (при выполнении условия переполнения регист-
ZAPOL: LD A,(HL) ; ра D) увеличениe их содержимого
ADC A,A ; Обратите внимание на эту команду: она увеличи-
DAA ; вает содержимое регистра А при установленном
LD (HL),A ; флаге C
INC HL ;
DJNZ ZAPOL ;
POP HL ;
DEC C ; Уменьшение значения цикла.
JR NZ,LOOP1 ; На выходе из этого цикла в ячейках METKA ÷
; METKA+3 будет лежать Ваше число в десятичном
; виде
LD BC,#0410 ; Первый байт - данные для работы цикла, второй
; байт нужен для коррекции кода числа
LD HL,METKA+3 ; Число выводится со старшего байта
PRINT: LD A,(HL) ; Блок печати числа
RRA ;
RRA ;
RRA ;
RRA ; "Переворачивание" числа...
CALL POLBYTE ; ...и переход на печать младшего полубайта
LD A,#01 ; Проверка, последняя ли это цифра
SUB B ;
JR NZ,STEK ; Если выводимая цифра является последней и она-
LD C,A ; - нуль, то вывод символа "нуль"
STEK: LD A,(HL) ;
DEC HL ;
CALL POLBYTE ; Переход на печать старшего полубайта
DJNZ PRINT ;
RET ; К о н е ц программы
POLBYTE:AND #0F ; "Отрезание" младшего полубайта
JR Z,SUMMA ; Если это число - нуль, то - печать символа
; "пробел"
LD C,#00 ; Иначе - печать самого числа ──────┐
SUMMA: OR #30 ; Получение кода данного числа │
SUB C ; Корректирование кода ◀──────┘
WYWOD: PUSH AF ; Сохранение содержимого всех регистров
PUSH BC ;
PUSH DE ;
PUSH HL ;
LD E,A ; Печать числа по коду (из регистра E)
LD C,#02 ;
CALL BDOS ;
POP HL ;
POP DE ;
POP BC ;
POP AF ;
RET ;
METKA: DEFS 4 ; Область памяти,необходимая для арифметических
; расчетов
----
[<>]
{{tag>MSX msxbdpl}}