ZX Format #01
31 октября 1995
  IS-DOS  

IS-DOS - Программистам: Программа gmen.com

<b>IS-DOS</b> - Программистам: Программа gmen.com
Рубрика "Как это сделано?"

           Елисеев В. А.

        Программа gmen.com
   и системный рестарт menu (#91).

    Сегодня в рубрике "Как это  сделано?"
мы с вами познакомимся с  внутренним  ус-
тройством  программы  gmen.com.  Эта  не-
большая, но чрезвычайно необходимая прог-
раммка управляет назначением устройств  в
оболочке IS-DOS, она позволяет  назначить
любое логическое устройство (A,  B,  C  и
т. д. ) системным (S),  быстрым  (Q)  или
текущим (T). Основу этой  программы  сос-
тавляет процедура обработки меню  -  спе-
циального окна с курсором и  текстом  оп-
ций, выбор  которых  вызывает  исполнение
соответствующих команд. За обработку  ме-
ню в ядре IS-DOS отвечает системный  рес-
тарт с номером #91. Надеюсь, что  подроб-
ный  анализ  исходного  текста  программы
gmen.com поможет Вам легко и  быстро  ос-
воить  эту  непростую  процедуру  и  нау-
читься использовать ее в своих программах.
    Итак,  Вашему  вниманию  предлагается
исходный текст программы gmen.com в  фор-
мате IS-ASSEMBLER'a с подробными  коммен-
тариями к каждой строке программы.

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

;Пример использования  рестарта
;menu #91

;Утилита системного меню gmen.com
;исходный текст с комментариями

       ORG  #5DC0

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

;основная часть программы:
;установка цветов, открытие окна,
;вызов меню

START  XOR  A         ;обнуление рег. A
       LD   IX,WND    ;в IX - адрес век-
                      ;тора окна
       LD   HL,(COL+5);перенести из век-
       LD   (WND+4),HL;тора unicolor в
                      ;вектор окна цвета
                      ;окна и тени
       LD   HL,(COL+7);перенести из век-
       LD   (IX-10),L ;тора unicolor в
       LD   (IX-12),H ;вектор меню цвета
                      ;основного и рабо-
                      ;чего курсора
       LD   C,#61     ;открыть окно
       RST  #10       ;рестарт wt #61
       LD   C,#91     ;вызвать меню

       RST  #10       ;рестарт menu #91

;вектор меню находится непосредственно
;перед вектором окна, смещение для IX
;отсчитывается в обратную сторону

END    XOR  A         ;выход в SHELL по
       LD   A,#F2     ;окончании работы
       RET            ;menu #91

;#F2 - код внутренней команды оболочки
;(аналог shell2 с сохранением позиций
;курсора в обеих панелях), которая
;выполняется по RET, если установлен
;флаг Z (командой XOR A)

;****************************************
s
;процедура инициализации меню:
;считывает из вектора конфигурации
;системы имена системного, быстрого и
;текущего устройств и помещает их в
;текст меню

INIT   LD   C,#10     ;определение адреса
       RST  #10       ;вектора
       EXX            ;конфигурации сис-
                      ;темы (q cnfg #10)
                      ;в HL -адрес
       LD   C,#41     ;в C - число для
                      ;преобразования
                      ;номера устройства
                      ;(#00-#05) в
                      ;символьную (A-F)
                      ;форму
       DEC  HL        ;в HL - адрес номе-
                      ;ра системного
                      ;устройства
       LD   A,(HL)    ;считать номер
                      ;устройства в A
       ADD  A,C       ;преобразовать
       LD   (TXT+8),A ;поместить в текст
                      ;меню
       DEC  HL        ;то же для быстрого
       LD   A,(HL)    ;устройства
       ADD  A,C
       LD   (TXT+17),A
       DEC  HL        ;то же для текущего
       LD   A,(HL)    ;устройства
       ADD  A,C
       LD   (TXT+26),A;
       EXX            ;восстановить набор
                      ;регистров
       RET            ;возврат в menu

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

;процедура назначения одного из устройств
;системным,быстрым и текущим одновременно
;использована система "горячих клавиш"
;рестарта menu #91
;на входе в B - номер устройства в сим-
;вольном (A-F) виде

ALL    LD   C,#10     ;определение адреса
       RST  #10       ;вектора конфиг.
       LD   A,#CF     ;в A - число для
                      ;преобразования из
                      ;символьной формы в
                      ;число
       ADD  A,B       ;преобразование
       EXX
       DEC  HL        ;в HL - адрес номе-
                      ;ра системного
                      ;устройства
       LD   (HL),A    ;записать номер
       DEC  HL        ;то же для быстрого
       LD   (HL),A
       DEC  HL        ;то же для текущего
       LD   (HL),A
END1   XOR  A         ;возврат в menu
       INC  A
       RET

;если процедура "горячих клавиш заканчи-
;вается с установленным флагом Z, то при
;возврате в меню выполняется строка с
;номером, кот. хранится в A

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

;процедура назначения устройств
;отработка опций меню по ENTER

SET    LD   C,#10     ;определение адреса
       RST  #10       ;вектора конфиг.
       EXX
       LD   E,(IX-9)  ;считать из вектора
                      ;меню текущую пози-
                      ;цию курсора
       XOR  A
       LD   D,A       ;обнулить D
       SBC  HL,DE     ;установить в HL
                      ;адрес соответству-
                      ;ющего устройства в
                      ;векторе системы
                      ;путем вычитания
                      ;номера строки меню
       PUSH HL        ;сохранить адрес
       LD   A,(HL)    ;
       LD   H,(IX-9)  ;определить относи-
       LD   L,#08     ;тельные координаты
                      ;для курсора редак-
                      ;тирования (H-Y,
                      ;L-X)
       SCF            ;установить флаг C
                      ;для вызова dvtrn
                      ;#4A после q dev
                      ;#8C
       LD   C,#8C     ;вызов q dev #8C
       RST  #10       ;(запрос имени
                      ;устройства)

;благодаря вызову dvtrn #4A полученное
;в результате работы q dev # 8C имя
;устройства в символьном виде (A-F)
;преобразуется в физический номер
;(#00-#05)

       POP  HL        ;вспомнить адрес
                      ;устройства в
                      ;векторе конфиг.
       JR   NZ,SET2   ;если устройства с
                      ;таким именем нет,
                      ;перейти на SET2
       LD   (HL),A    ;иначе - вписать
                      ;номер по адресу
SET2   LD   C,#08     ;ожидание нажатия
       RST  #10       ;клавиши kwait #08
       JR   END1      ;возврат в menu

;для возврата в menu использован фрагмент
;предшествующей процедуры (см. END1)

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

;процедура выхода из меню
;отработка опции EXIT

EXIT   OR   #FF       ;поместить в A код
                      ;#FF для выхода из
                      ;menu и сбросить
                      ;флаг С
       RET            ;возврат в menu

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

;область данных программы:

;вектор unicolor - специальная таблица,
;содержащая информацию о цветах програм-
;мы и позволяющая редактировать их при
;помощи универсальной утилиты unicolor

COL    DEFM "UnCo"    ;маркер программы
                      ;unicolor
       DEFB #04       ;число цветов
       DEFB %01110000 ;цвета окна
       DEFB %01000001 ;цвета тени
       DEFB %00000111 ;цвета курсора
       DEFB %01000111 ;цвета рабочего
                      ;курсора

;вектор меню - таблица параметров для
;работы menu #91, располагается перед
;вектором окна, смещение для индексной
;адресации отсчитывается в обратную
;сторону от начала вектора окна

       DEFB %01100000 ;цвета рабочего
                      ;курсора
       DEFB %00000000 ;регистр состояния
       DEFB %00000110 ;цвет курсора
       DEFB #01       ;позиция курсора
       DEFW INIT      ;адрес процедуры
                      ;инициализации
       DEFW #0000     ;адрес процедуры
                      ;вызываемой при
                      ;нажатии любой
                      ;клавиши (0-нет
                      ;процедуры)
       DEFW TABKEY    ;адрес процедуры
                      ;обслуживания
                      ;"горячих клавиш"
       DEFW TABENT    ;адрес процедуры
                      ;обслуживания
                      ;по ENTER

;вектор окна

WND    DEFW #0415     ;координаты окна
       DEFW #0806     ;размеры окна
       DEFB %01110000 ;цвета окна
       DEFB %00000001 ;цвета тени
       DEFW #091D     ;координаты печати

;карта перемещения курсора 00 - строка не
;используется 01 - используется

       DEFB #01
       DEFB #01
       DEFB #01
       DEFB #01

;текст окна

TXT    DEFM "System  A"
       DEFM "Quick   A"
       DEFM "Current A"
       DEFM "Exit"
       DEFB 03        ;маркер конца
                      ;текста

;таблица адресов процедур, вызываемых по
;нажатию ENTER

TABENT DEFW SET
       DEFW SET
       DEFW SET
       DEFW EXIT

;таблица адресов процедур обработки
;"горячих клавиш"

TABKEY DEFB #65       ;e  - EXIT
       DEFB #04       ;номер строки меню
                      ;для режима выпол-
                      ;нения ее по "горя-
                      ;чей клавише"
       DEFB #00       ;маркер режима
                      ;выполнения строки

       DEFB #20       ;SP - EXIT
       DEFW EXIT

       DEFB #31       ;1  - устр. "A"
       DEFW ALL

       DEFB #32       ;2  - устр. "B"
       DEFW ALL

       DEFB #33       ;3  - устр. "С"
       DEFW ALL

       DEFB #34       ;4  - устр. "D"
       DEFW ALL

       DEFB #35       ;5  - устр. "E"
       DEFW ALL

       DEFB #36       ;6  - устр. "F"
       DEFW ALL

       DEFB #FF       ;маркер конца
                      ;списка

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

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



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

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

IS-DOS - начинающим: IS-DOS - первое знакомство

IS-DOS - пользователям: Краткий путеводитель по системному диску IS-DOS

IS-DOS - Программистам: UniColor - cтандарт настройки цветов в программах IS-DOS

IS-DOS - программистам: Оконная система IS-DOS

IS-DOS - Программистам: Программа gmen.com

Железо - Доработки: блокиpовка поpта #1FFD на Scorpion ZS-256

Железо - Переферия: тормоз KAY'я

Железо - Производители: KAY

Железо - производители: Scorpion ZS 256

Игрушки - Новелла: Crystal Kingdom Dizzy

Игрушки - По полочкам: Быки и коровы

Игрушки - По полочкам: НЛО. Враг неизвестен

Игрушки - Что новенького: обзор новинок

Интервью - Старые знакомые: Рассказ Славы Медноногова о своей деятельности как программиста

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

Конкурс - Конкурс на конкурс

Конкурс - Уровни к Laser Squad

Отдохнём - Нечто: один день из жизни программиста

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

Почтовый ящик - Обмен опытом: читы

Почтовый ящик - Письма по играм

Премьера - Color Lines

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

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

Программистам - Системы: Редактор миссий к игре Laser Squad

Разное - Amiga: история Амиги

Разное - Перспективы: игрушки


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

Похожие статьи:
Ликбез - Аккумуляторы. Практическое применение различных типов.
Рассказ - делаем бомбу ч. 2.
Партийная зона - итоги 1999 года: 18 дем для Спектрума. Разбор новых и старых дем.
Джойстик - прохождение игры Inside Outing.
Credits - авторы газеты.

В этот день...   28 апреля