ZX Format
#01
31 октября 1995 |
|
IS-DOS - Программистам: Программа 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 ;маркер конца
;списка
;***************************************
Автор программы - А. Леонтьев
Комментарии - В. Елисеев
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября