|
ZX Format
#02
30 ноября 1995 |
|
IS-DOS - Как это сделано No 2

Рубрика "Как это сделано?" No 2
В. Елисеев
Монитор командной строки IS-DOS
и рестарт строкового редактора #6E smbgt
Здравствуйте, уважаемые читатели ZX
Format! Надеюсь, что тем из вас, кто ре-
шил попробовать свои силы в программиро-
вании в среде IS-DOS, было интересно про-
читать о внутреннем устройстве системной
утилиты gmen.com, о которой шла речь в
первом номере журнала.
Сегодня мы с вами продолжим изучение
рестартов IS-DOS, так сказать, на живых
примерах и рассмотрим в общих чертах ис-
пользование рестарта строкового редакто-
ра #6E smbgt на примере утилиты mon.com.
Утилита mon.com хорошо известна каж-
дому пользователю IS-DOS, ведь с ее по-
мощью организуется диалог пользователя с
системой и вводятся все основные команды.
Она позволяет принимать с клавиатуры и
редактировать текст вводимой команды и по
нажатию ENTER передает его системе, вызы-
вая на исполнение команду, указанную в
тексте. Для ввода и редактирования тек-
ста команды в мониторе используется рес-
тарт #6E smbgt, представляющий собой фун-
кционально законченный модуль строкового
редактора с максимальным объемом строки
256 байт. Рассмотрим текст программы:
;****************************************
;Пример использования строкового
;редактора IS-DOS #6E smbgt
;Монитор командной строки mon.com
;исходный текст с комментариями
ORG #5D64
;****************************************
;начало программы, нахождение при помощи
;рестарта #45 g_com адреса буфера коман-
;дной строки - специальной области памя-
;ти, которая служит для передачи команд
;системе, и помещение его в стек
START LD C,#45 ;определение адреса
RST #10 ;буфера командной
EXX ;строки (в HL)
PUSH HL ;адрес - в стек
;****************************************
;инициализация программы, подготовка ра-
бочего окна, буфера и т. д.
;подпрограмма очистки буфера
CLBUF LD B,#7F ;длина буфера
CLBUF1 LD (HL),#20 ;инициализация
INC HL ;буфера
DJNZ CLBUF1 ;командной строки
;открываем окно для редактора
;предварительно определяем по содержимо-
;му системных переменных текущие цвета,
;чтобы окно не выделялось на общем фоне и
;помещаем их в вектор окна.
LD IX,WIND ;адрес вектора окна
;редактора
LD C,#72 ;определить адрес
RST #10 ;вектора экрана
EXX ; (в HL)
LD A,(HL) ;считать цвета
;текущего экрана
LD (IX+4),A ;ввести текущие
;цвета в вектор
;окна редактора
;рисуем окно
LD C,#61 ;инициализация окна
RST #10
;инициализируем курсор
CURINI SBC HL,HL ;обнуление HL
LD C,#6B ;установка
RST #10 ;координат курсора
POP HL ;в HL - адрес
;буфера командной
;строки
;****************************************
;ввод и редактирование команды
;задаем параметры для редактора - ширину
;окна и байт регистра состояния - и вызы-
;ваем редактор
LD A,#2A ;ширина окна ред.
LD DE,#0B00 ;регистр состояния
;байт регистра состояния определяет уста-
;новки редактора по умолчанию:
; байт 0=0 - строчные буквы
; 1 - прописные буквы
; байт 1=0 - латинский регистр
; 1 - русский регистр
; байт 2=0 - режим текста
; 1 - режим псевдографики
; байт 3 должен быть равен 1
LD BC,#036E ;вызов smbgt #6E
RST #10
;рестарт smbgt принимает с клавиатуры лю-
;бые символы, а также самостоятельно от-
;рабатывает управляющие клавиши перемеще-
;ния курсора и Delete, по нажатию ENTER
;происходит завершение редактирования и
;выход, при этом в регистре A содержится
;длина введенной строки. Выход возможен
;также и по клавишам CS+9, CS+SS, SS+A,
;SS+SPACE, SS+ENTER, при этом в регистре
;A возвращается код клавиши, вызвавшей
;выход из редактора
RET C ;выход по ошибке
;ввода-вывода
;если нажаты CS+9, CS+SS, SS+A,
;SS+SPACE, SS+ENTER,то
JR NZ,EXIT ;выход по отказу
;проверка - не пустой ли буфер?
AND A ;проверка флага
;ZERO
JR Z,START ;переход на начало
;при пустом буфере
;***************************************
;обработка содержимого буфера
PUSH HL ;запомнить адрес
;буфера ком. строки
LD D,E ;обнулить D
LD E,A ;в E - длина строки
ADD HL,DE ;определить адрес
;первой свободной
;ячейки буфера
LD (HL),#0D ;добавить ENTER
EX (SP),HL ;поместить в стек
;адрес конца буфера
;командной строки,
;а в HL - начала
PUSH HL ;поместить адрес
;начала командной
;строки в стек над
;адресом конца
LD B,(HL) ;сохранить первый
PUSH BC ;символ ком. строки
PUSH IX ;сохранить адрес
;вектора окна
;передача имени и параметров введенной
;команды интерпретатору IS-DOS
XOR A ;установить A=0
LD C,#44 ;вызов exebat #44
RST #10
;восстановление содержимого регистров
POP IX ;вектор окна
POP BC ;первый символ к.с.
POP HL ;адрес начала к.с.
POP DE ;адрес конца к.с.
;***************************************
;обработка результата выполнения команды
;и восстановление содержимого буфера для
;редактирования в случае ошибки
RET C ;выход по серьезной
;ошибке exebat
LD A,#20 ;в A - код пробела
LD (DE),A ;"забить" ENTER в
;буфере ком. строки
LD (HL),B ;восстановить
;первый символ в
;буфере ком. строки
PUSH HL ;запомнить в стеке
;адрес буфера к.с.
JR NZ,CURINI ;при ошибке в к.с.
;возврат с сохране-
;нием текста строки
;для исправления
JR CLBUF ;корректный возврат
;с очисткой буфера
;от выполненной
;строки
;****************************************
;выход по отказу
EXIT LD (HL),#0D ;поместить ENTER в
;начало буфера к.с.
XOR A ;установить флаги
;на выходе:
;Z=1, C=0
LD A,#F4 ;установить код
;внутренней команды
;оболочки (аналог
;shel1 #81 с сохра-
;нением позиций
;курсора на обеих
;панелях)
RET
;****************************************
;область данных программы
;вектор окна:
WIND DEFB #00 ;X-координата окна
DEFB #00 ;Y-координата окна
DEFB #03 ;высота окна
DEFB #20 ;ширина окна
DEFB %00101000 ;цвета окна
DEFB %11111111 ;цвет тени #FF -
;тень не выводится
DEFB #00 ;X-позиция печати
DEFB #00 ;Y-позиция печати
;****************************************
Автор программы - А. Леонтьев
Комментарии - В. Елисеев
_________________________________________
Другие статьи номера:
Похожие статьи:
В этот день... 22 ноября