Программа gmen.com и системный рестарт menu (#91).
;Пример использования рестарта 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-#07) в символьную (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
RST #10
;благодаря вызову dvtrn (#4A) полученное в результате работы q_dev (#8C) имя устройства в символьном виде (A-H) преобразуется в физический номер (#00-#07)
POP HL ;вспомнить адрес устройства в векторе конфигурации
JR NZ,SET2 ;если устройства с таким именем нет, перейти на SET2
LD (HL),A ;иначе - вписать номер по адресу
SET2 LDC,#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 #37 ;7 - устройство "G"
DEFW ALL
DEFB #38 ;8 - устройство "H"
DEFW ALL
DEFB #FF ;маркер конца списка
Монитор командной строки IS-DOS и рестарт строкового редактора $smbgt (#6E)
;Пример использования строкового редактора 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 ;проверка флага Z
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-позиция печати
UniColor - стандарт настройки цветов в программах IS-DOS.
В целях унификации процедуры настройки цветов в программах IS-DOS в последнее время все чаще применяется стандарт UniColor, позволяющий настраивать цвета любой программы при помощи универсальной утилиты unicolor.com. Поэтому при разработке любых программ в среде IS-DOS предпочтительнее пользоваться этим стандартом, дабы облегчить пользователям индивидуальную настройку системы.
Для обеспечения совместимости со стандартом UniColor все цвета программы должны быть собраны в специальную таблицу, называемую "вектором UniColor". Структура этой программы чрезвычайно проста:
Первые четыре байта занимает так называемый маркер UniColor - последовательность символов UnCo (#55, #6E, #43, #6F), по которой утилита unicolor.com определяет местонахождение вектора.
Пятый байт содержит информацию о количестве имеющихся в программе настраиваемых цветов.
Последующие байты в количестве, определяемом пятым байтом вектора, представляют собой коды цветов в стандартном для IS-DOS формате:
биты 0 - 2 - цвет чернил
биты 3 - 5 - цвет бумаги
бит 6 - яркость
бит 7 - мерцание
Всего возможно задание до 16 настраиваемых цветов. Впоследствии в программе необходимые цвета переносятся из вектора UniColor в вектор соответствующего окна, или передаются в качестве параметров в регистрах процессора обычными способами.
Пример: фрагмент программы, содержащей вектор UniColor.
START JR BEGIN
COL DEFM "UnCo" ;Маркер UniColor
DEFB #04 ;количество цветов = 4
DEFB %00111000 ;цвета окна WIN1
DEFB %00000001 ;цвет тени WIN1
DEFB %00001101 ;цвета окна WIN2
DEFB %00000001 ;цвет тени WIN2
BEGIN LD IX,WIN1 ;вектор W1 в IX
LD HL,(COL+5) ;перенести цвета
LD (WIN1+4),HL ;окна и тени из вектора UniColor в вектор окна W1
LD IX,WIN2 ;вектор W2 в IX
LD HL,(COL+5) ;перенести цвета
LD (WIN2+4),HL;для WIN2
…
WIN1 DEFW #0415
DEFW #0806
DEFB %00000000
DEFB %00000000
DEFW #0000
WIN2 DEFW #0404
DEFW #0806
DEFB %00000000
DEFB %00000000
DEFW #0000
uni_con.com
Программа uni_con.com предназначена для подключения системы iS-DOS (как Classic, так и Chic) к устройству винчестера для последующей ее загрузки с HDD. Загрузка системы осуществляется при помощи загрузчика, который должен быть прошит в ПЗУ TR-DOS (в KAY), откуда он вызывается и осуществляет загрузку системы с винчестера. Что же надо сделать, чтобы подключить систему к устройству:
1) На системном устройстве винчестера необходимо создать каталог BOOT
2) Скопировать туда файлы is_dos.rom, sv.com, uni_con.com и файл-загрузчик uni_Clas.sys или uni_Chic.sys (в зависимости от того, какая система установлена).
В случае использования системы iS-DOS Classic файл is_dos.rom отсутствует. В этом случае необходимо создать в текстовом редакторе файл с таким же именем и сохранить его в каталоге BOOT. Размер файла и его содержимое роли не играют. Когда система начнет грузиться с винчестера, файл можно удалить. Дело в том, что этот файл необходим для iS-DOS Chic, а программа uni_com.com рассчитана на две системы, поэтому в данном случае необходимо лишь формальное присутствие файла is_dos.rom.
3) Переключаем в системе устройство S на текущее устройство (где мы создали каталог BOOT)
4) Сохраняем систему на веник в каталог S:BOOT программой sv.com
5) Переименовываем файл uni_Clas.sys (или uni_Chic.sys в зависимости от используемой системы) в uni_boot.sys.
6) Запускаем программу uni_con.com.
Программа сама находит файлы is_dos.sys, is_dos.rom и uni_boot.sys, а также установленный в системе драйвер винчестера и записывает информацию о них в 0-й блок устройства S. Системные переменные Basic и TR-Dos (#5C00..#5DFF) программа сохраняет в файле uni_boot.sys. Файл uni_boot.sys защищается от удаления и чтения. Это делается для того, чтобы Вы его куда-нибудь не передвинули, или чтобы этого не сделала программа arzt+.com.
Загрузчик iS-DOS (8-я версия) копируется из ПЗУ TR-DOS в память по адресу #5E00 и запускается с этого адреса. Загрузчик считывает 0-е блоки (256 байт) на 0-й дорожке каждого трека с 0-го по 255-й, пока не обнаружит 3 буквы "KAY" в этом блоке со смещением #7D. В этом случае по смещению #80 располагается 32-байтовый описатель файла uni_boot.sys. Оттуда загрузчик берёт данные об этом файле, загружает его в память и запускает на выполнение. В файле размещается непосредственно программа запуска iS-DOS. Прочитанный 0-й блок устройства располагается в памяти по адресу #6000.
Теперь непосредственно дизассемблер программы uni_con.com:
ORG #5DC0
NOP
LD IX,#5FAA ;сюда сохраняем текущее состояние системы
XOR A
LD C,#36 ;$p_stat
RST #10 ;сохранение состояния системы
;Надо проверить, находятся ли все нужные файлы в текущей директории. Для этого вызываем программу проверки
;наличия файла CHECK. Если файлы есть, то программа загружает описатель файла по указанному адресу.
LD HL,ISDOS ;адрес текста с именем файла "is_dos.sys"
CALL CHECK ;проверка, есть ли такой файл в текущей директории
LD HL,ISROM ;адрес текста с именем файла "is_dos.rom"
CALL NC,CHECK ;если не было ошибок, то проверка на присутствие этого файла в директории
LD HL,UNIBT ;адрес текста с именем файла "uni_boot.sys"
CALL NC,CHECK ;если не было ошибок, то проверяем, есть ли этот файл в директории
RET C ;если где-то были ошибки, то выходим в систему
;честно говоря, этот фрагмент мне не совсем понятен, так как я не мог найти, что же находится в векторе конфигурации системы со смещением -8.
LD C,#10 ;читаем вектор конфигурации ядра
RST #10
EXX
LD DE,#FFF8 ;смещение -8 от начала вектора
ADD HL,DE
LD E,(HL) ;в DE загружаем значение двух байт со смещением -8 и -7
INC HL
LD D,(HL)
LD (BUF+1),DE ;в дальнейшем они нам понадобятся
LD DE,0 ;0-й блок устройства
LD HL,BUFER ;прочитаем в буфер в конце программы
LD BC,#010D
RST #10 ;читаем
RET C ;если была ошибка, то выходим в систему
Теперь надо подсчитать контрольные суммы описателей is_dos.sys и is_dos.rom
LD HL,ISDOS ;подсчёт КС is_dos.sys
XOR A
LD B,#20 ;размер описателя - 32 байта
KC0 XOR (HL) ;подсчитываем по XOR
INC HL
DJNZ KC0
LD (BUFER+27),A ;заносим посчитанную КС в буфер
XOR A ;теперь считаем КС описателя is_dos.rom
LD B,#20 ;в HL уже находится адрес описателя
KC1 XOR (HL)
INC HL
DJNZ KC1
LD(ROMKC),A ;сохраняем КС is_dos.rom
BUF LD HL,0 ;сюда сохраняются байты со смещением -8 и -7 в векторе конфигурации
LD (BUFER+28),HL
LD HL,ISDOS ;переносим описатели is_dos.sys и is_dos.rom в буфер
LD DE,BUFER+32
LD BC,#0041 ;#20+#20+1 байт КС описателя is_dos.rom
LDIR
LD DE,BUFER+125 ;вслед за ним переносим признак загрузочного блока "KAY" и описатель
LD BC,#0023 ;uni_boot.sys в буфер со смещением +#7D
LDIR
Проверяем, загружен ли в системе какой-либо драйвер винчестера
LD C,#13 ;получаем адрес вектора текущего блочного устройства
RST #10 ;в A возвращается № канала устройства
LD C,#14 ;по номеру канала в A получаем адрес драйвера устройства
RST #10
RET C
EXX
LD BC,9 ;смещение +9 от начала драйвера
ADD HL,BC
LD A,(HL)
AND #7F ;7-й бит не учитываем (это разрешение/запрет на обработку ошибок драйвером)
CP 4 ;без 7-го бита тут должно быть 4
JR NZ,NOIDE ;если не так, то это не драйвер винчестера
INC HL
INC HL
INC HL
LD A,(HL) ;байт со смещением +12
CP #FC ;должен быть равен #FC
JR NZ,NOIDE ; если не так, то это не драйвер винчестера
INC HL
INC HL ;байты +14 - это TMBUF. В драйвере винчестера буфера нет, поэтому эти байты
LD A,(HL) ;должны быть равны нулю
INC HL
OR (HL)
JR Z,CONT ;если так, то все в порядке, продолжаем выполнение программы
;Драйвер винчестера не найден, выдаём сообщение об ошибке
NOIDE LD IX,WIN ;вывод окна
XOR A
LD C,#61
RST #10
LD C,#66 ;печатаем текст с сообщением об ошибке
RST #10
LD C,8 ;ждём отпускания клавиши (если какая-либо нажата)
RST #10
DEC C ;C=7 $key
RST #10 ;ждем нажатия any key
XOR A
LD A,#F4 ;выход в систему
RET
;Вектор окна с сообщением об ошибке
WIN DEFB #01
DEFB #14
DEFB #03
DEFB #0E
DEFB #06
DEFB #01
DEFB #03
DEFB #0E
DEFM "Not IDE-driver"
;Продолжаем выполнение программы. Надо перенести оставшиеся данные в буфер
CONT INC HL ;смещение +16 от начала драйвера IDE, тут находится информация о конфигурации винчестера и устройствах, находящихся на нём
LD DE,BUFER+97 ;переносим эту информацию в буфер
LD BC,#0018 ;24 байта
LDIR
LD HL,BUFER ;сохраняем буфер на 0-й блок устройства
LD DE,0
LD BC,#010E
RST #10
RET C
LD HL,#5C00 ;копируем 512 байт системных переменных на место буфера
LD DE,BUFER
LD BC,#0200
LDIR
LD C,#01 ;почистим кэш
RST #10
LD C,#35 ;получаем описатель последнего открытого файла (это uni_boot.sys)
RST #10
EXX
LD BC,11 ;смещение +11 - это FSTAT
ADD HL,BC
RES 2,(HL) ;разрешаем чтение файла (вдруг до этого оно было запрещено)
LD DE,0 ;нам нужен 0-й блок файла
LD C,#2D ;возврат адреса 0-го блока uni_boot.sys
RST #10
RET C
EXX
INC HL
INC HL ;в байте +2 0-го блока находится смещение для расположения системных
LD E,(HL) ;переменных. Ведь они должны находиться в файле uni_boot.sys
INC HL
LD D,(HL) ;DE - адрес области системных переменных по отношению к началу файла
EX DE,HL ;uni_boot.sys
XOR A
LD DE,#0200 ;длина области системных переменных -512 байт
LD IX,BUFER ;пишем из буфера 512 байт переменных в файл uni_boot.sys по адресу в HL
LD C,#2A
RST #10
RET C
LD HL,CALC ;адрес строки с вызовом резидента calc для подсчёта КС файла uni_boot.sys
LD C,#48 ;заполняем буфер командной строки и запускаем $exebat для выполнения
RST #10 ;команды @calc
RET C
LD C,#35 ;описатель файла uni_boot.sys возвращается в HL'
RST #10
EXX
LD BC,11 ;смещение +11 - FSTAT
ADD HL,BC
SET 2,(HL) ;защищаем файл от чтения
SET 7,(HL) ;защищаем файл от удаления
LD C,#28 ;закрываем файл uni_boot.sys
RST #10
RET C
LD C,2 ;делаем flush
RST #10
RET C
LD IX,SVST ;восстанавливаем ранее сохранённую среду
XOR A
LD C,#37
RST #10
RET C
XOR A ;выход из программы
LD A,#F4
RET
;Процедура ищет в текущей директории файл, имя и расширение которого указаны в HL. Если находит, то открывает файл и переносит его описатель на место, указанное в HL на входе в процедуру. Одновременно проверяется файл на непрерывность. Если файл сегментирован, то происходит аварийное завершение программы.
CHECK LD C,#34 ;открываем файл по имени и типу, указанными в HL
RST #10
RET C
PUSH HL ;сохраняем HL для дальнейших нужд
EXX
POP DE ;строка с именем файла
LD BC,#0020 ;переносим туда весь описатель файла
LDIR
LD BC,#FFEB ;смещение -21 от конца файла (FSTAT)
ADD HL,BC
XOR A
BIT 6,(HL) ;проверка на непрерывность файла
RET NZ ;если файл непрерывен, то выход
LD BC,#FFF5 ;смещение -11 от FSTAT - это начало описателя файла
ADD HL,BC
;Для вывода сообщения об ошибке надо преобразовать описатель файла в имя и тип, разделённые точкой
LD DE,FNAME ;место, куда преобразовывать
LD C,#4F ;преобразуем описатель файла в имя файла и его тип
RST #10
LD HL,#0100 ;задаём позицию печати текста X=0, Y=1
LD C,#0C
RST #10
LD HL,TEXT ;адрес строки с текстом для его печати
LD C,#6C ;печать текста
RST #10
LD HL,TEXT1 ;продолжение строки с сообщением об ошибке
RST #10 ;печатаем её
LD C,8 ;если при этом была нажата какая-либо клавиша, то ждём её отпускания
RST #10
DEC C ;C=7 $key
RST #10 ;ожидаем нажатия any key
POP AF ;снимаем со стека адрес возврата в основную программу, потому что надо выйти в
XOR A ;систему
LD A,#F4 ;выход из программы
RET
TEXT DEFM "File" ;текст с сообщением о том, что файл сегментирован
DEFB #20
FNAME DEFS 13
DEFB #20
TEXT1 DEFM "isn't contiguous !"
DEFB #0D
CALC DEFM "@calc" ;текст с вызовом программы calc для подсчёта КС файла
DEFB #0D
ISDOS DEFM "is_dos sys" ;место для описателя is_dos.sys
DEFS #21
ISROM DEFM "is_dos rom" ;место для описателя is_dos.rom
DEFS #21
ROMKS DEFB #00 ;тут должна быть КС описателя is_dos.rom
DEFM "KAY" ;признак "KAY"
DEFM "uni_bootsys" ;место для описателя uni_boot.sys
DEFS #21
SVST DEFS 4 ;сюда сохраняется среда системы
BUFER ;буфер для подгрузки 0-го блока устройства и системных переменных
Теперь посмотрим, что же система сохраняет в 0-м блоке устройства:
|
Байт |
Длина |
Описание |
|
27 |
1 |
Контрольная сумма описателя is_dos.sys |
|
28 |
2 |
Байты -8 и -7 из вектора конфигурации системы. Назначение их неизвестно. |
|
32 |
32 |
Описатель is_dos.sys |
|
64 |
32 |
Описатель is_dos.rom |
|
96 |
1 |
Контрольная сумма описателя is_dos.rom |
|
97 |
24 |
Часть драйвера винчестера, где находится информация о структуре винчестера и его характеристиках |
|
125 |
3 |
Признак "KAY" |
|
128 |
32 |
Описатель uni_boot.sys |
|
В строках, выделенных серым цветом, находятся стандартные параметры, которые указаны в документации на систему (см. ПРИЛОЖЕНИЯ 1, 1a) |
||