Из журнала ZX Format #1, Санкт-Петербург, 11.1995 Рубрика "Как это сделано?" Елисеев В. А. Программа 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) ;**************************************** ;процедура инициализации меню: ;считывает из вектора конфигурации ;системы имена системного, быстрого и ;текущего устройств и помещает их в ;текст меню 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 ;маркер конца ;списка ;*************************************** Автор программы - А. Леонтьев Комментарии - В. Елисеев