ZX Format #02
30 ноября 1995
  IS-DOS  

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-позиция печати

;****************************************

    Автор программы - А. Леонтьев
    Комментарии - В. Елисеев
_________________________________________



Другие статьи номера:

IS-DOS - Информация: новости в мире IS-DOS

IS-DOS - Как это сделано No 2

IS-DOS - начинающим No 2

IS-DOS - пользователям No 2

IS-DOS - программистам No 2

Ассемблер - Ассемблер для чайников

Железо - Доработки: Пеpеключатель turbo/normal для Scorpion ZS-256-Turbo

Железо - Переферия: презентация звуковой карты General Sound.

Железо - Производители: Create Soft - Возвращаясь к напечатанному

Железо - Производители: KAY - Турбирование Spectrum - машин

Игрушки - Новелла: 48 Утюгов.

Игрушки - По полочкам: Carrier Command.

Интервью - интервью с Сергеем Зоновым и Андреем Ларченко

Информация - Авторы журнала

Информация - От авторов

Информация - Помощь

Информация - Чёрный ящик

Конкурс

Отдохнём - Нечто: Нервная работа

Почтовый ящик - Доска объявлений

Почтовый ящик - Письма читателей

Премьера - Digital Studio v1.12

Программистам - Basic для всех.

Разное - Из истории Амиги.

Разное - Перспективы П/О.

Системы - музыкальный редактор Instrument 3.01

Что новенького - Обзор новинок: Night Hunter, Extreme, Grell & Falla, Duck Out, Internationl Ninja Rabbits, Italian Super Car, Sly Spy Secret Agent, The Turn, Sextris.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Обзор игрушек - Обзор игровых программ: Total Recal, Robocop 2, Blob the Cop, Snoopy, Sir Wood 1-3, Licence to kill, X-Reversy, Passiance "Four Row'S", The Last Courier, 1 April.
Фан-клуб - В новосозданной рубрике я предлагаю обмениваться информацией о наших (Ваших) кумирах-музыкантах.
Информация - Адреса редакции.

В этот день...   21 июня