Пакет документации о рестартах iS-DOS 1969 г.

Исходники IS-DOS - исходники gmen.com, монитор командной строки IS-DOS, UniColor, uni_con.com.


 

Программа 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-DOSKAY), откуда он вызывается и осуществляет загрузку системы с винчестера. Что же надо сделать, чтобы подключить систему к устройству:

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)




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



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

Похожие статьи:
Ликбез - полный дизассемблер ПЗУ (часть 20).
Рассказ - "Ни одна гадина не уйдет от возмездия".
Лит. страничка - Ночная смена (продолжение).
Scene - The Scene Behind A Curtain.
Gameland - Прохождение новых отгрузок для игры "Чёрный Ворон".

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