Программа 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 предназначена для подключения
системы 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)
|