Рубрика "Как это сделано?" 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-позиция печати ;**************************************** Автор программы - А. Леонтьев Комментарии - В. Елисеев _________________________________________