CP/M-80 - OS-DOS Орион-128, CP/M-80
Руководство системного программиста Orion Soft, OS-DOS V2.3X, 2.4X, 2.6X, 3.6X, CP/M-80 Орион Софт OS-DOS
Продаю платы и наборы микросхем, куплю микросхемы
Авторский контроллер НГМД. Мы собираем именно такой и на нем работаем. Читайте про пакет Атлас. Также дискеты можно отформатировать из под ORDOS пакетом программ Атлас.
Дискеты должны быть отформатированы в OS DOS (CP/M-80) программой FORMAT.COM и на дискету записана система OS DOS V3.60 программой SYS.COM или SG360.COM
Пример OS DOS от ORION SOFT
Руководство системного программиста, функции BDOS и вектора BIOS OS-DOS V2.3X, 2.4X, 2.6X, 3.6X 1993, 1995 ORIONSOFT В.П. СУГОНЯКО
Краткое руководство по внутренним и внешним командам OS-DOS Орион-128, CP/M-80, ORION SOFT
В качестве базового шаблона при адаптации СР/М на "Орион-128" использован BIOS ПК "Корвет", рассчитанный на БИС КР1818ВГ93. О том как устроен контроллер, как его собрать и отладить, а так же тест-программы и холодный загрузчик приведены в журнале "Радиолюбитель" NN 5-7 за 1993г., сборка контроллера
Авторская реализация СР/М для ПК "Орион-128" названа "OS-DOS" - OrionSoft Disk Operating System". Разработаны "OS-DOS48K" - для работы в ОЗУ страницы 0 и "OS-DOS60K" - для работы в странице 1. Соответственно присвоены версии X.4X и X.6X (более ранние - 2.3X, 2.4Х, 2.6X).
ОС состоит из 3-х модулей - ССР, BDOS и BIOS. При установке СР/М-80 на компьютер адаптации подлежит лишь модуль BIOS, выполняющий дисковые операции и операции ввода/вывода самого низкого уровня (т.е управление непосредственно "железом"). От того насколько удачно написан BIOS во многом зависит удобство пользования компьютером и программная совместимость.
По заявлениям фирмы ORION SOFT, сложность адаптации BIOS заключалась в том, что первоначально он предназначался для управления аппаратными интерфейсными устройствами - дисплей (с аппаратным курсором), клавиатура и другие устройства ввода/вывода. В компьютерах "Корвет" и "Орион-128" аппаратные функции этих устройств реализованы программно, поэтому при адаптации ОС потребовалось применять всевозможные программные ухищрения.
В этой статье мы раскроем многие тайны OS-DOS, расскажем о том, как устроен BOOT-сектор (и что это такое), как пользоваться функциями BDOS и векторов BIOS. Так же информация публиковалась в журнале Радиолюбитель.
Функции BDOS и вектора BIOS
ВООТ-сектор
Напомним, как происходит процесс загрузки операционной системы в память компьютера. "Холодный" загрузчик LDOS$ [1] считывает первый сектор (1 Кбайт) нулевой дорожки дискеты в свой
внутренный буфер. Затем первые 256 байт переносит в область
00-0FFH и передает управление по адресу 0000Н. Считывание сектора напрямую по адресу 0000Н (как это делается для простоты в
реализациях других авторов) делает, практически, бесполезной
директиву ССР - SAVE, т.к. уничтожает полезную информацию в
области ТРА (области размещения пользовательских программ).
Размещение информации в области 00-0FFH (эта область является служебной при работе OS-DOS и не может быть затерта программами пользователя) приведено в дампе в таблице 1. Она состоит из набора служебных ячеек, констант и вторичного загрузчика. Вторичный загрузчик как раз и "знает", как загрузить и
разместить СР/М в памяти компьютера. Такая двухступенчатая
система загрузки позволяет иметь один на все случаи "холодный"
загрузчик и применительно к загружаемой программе (не обязательно OS-DOS) - "свой", специализированный вторичный загрузчик.
Холодный загрузчик OS-DOS из OR DOS: LDOS$ (DOS$, DOSL$) - одна и таже программа под разными названиями (расположена в Ромдиске)
Таблица 1
0 1 2 3 4 5 6 7 8 9 А B C D E F
0000 C330 0000 0000 0000 0101 0301 0500 5000 .0............P.
0010 2800 040F 0084 017F 00C0 0020 0004 00D7 (.......... ....
0020 4F52 494F 4E20 3132 382E 3200 9D00 AC00 ORION 128.2.....
0030 3100 012A 2B00 3A0A 00FE 023E 5001 050E 1..*+.:....>P...
0040 CA48 003E 3001 0307 3208 0032 14F7 CDC2 .H.>0...2..2....
0050 00C3 5F00 3208 0032 14F7 CDC2 000E 0179 .._.2..2.......y
0060 3212 F73E 84CD A500 C5D5 CDAF 001A E6DD 2..>............
0070 C200 F8D1 C105 C27D 002A 2D00 E90C 3E06 .......}.*-...>.
0080 B9C2 5F00 1DCA 9300 3A08 00E6 EF32 14F7 .._.....:....2..
0090 C35D 003E 58CD A500 3A10 F70F DA98 003A .].>X...:......:
00A0 0800 C354 0032 10F7 3E0F 3DC2 AA00 C911 ...T.2..>.=.....
00B0 10F7 0113 F71A 1FD0 1FD2 B500 0A77 23C3 .............w#.
00C0 B500 3A0B 00B7 1E01 C81E 02C9 2020 2020 ..:.........
00D0 4F52 494F 4E53 4F46 5420 2D20 2020 2020 ORIONSOFT -
00E0 2020 2073 7567 6F6E 716B 6F20 772E 702E СУГОНЯКО В.П.
00F0 0000 0000 0000 0000 0000 0000 0000 0000 ................
Разберем более подробно назначение служебных ячеек и констант. По адресу 0000-0002 находится вектор перехода на дополнительный загрузчик. Наличие байта 0С3Н по адресу 0000Н указывает LDOS$ на то, что данная дискета содержит операционную систему. В противном случае (после процесса форматирования) там находится байт 0Е5Н и "холодный" загрузчик не передает управление дополнительному, а выводится сообщение "NON-SYSTEM DISK".
Далее. 0003-0007 - ячейки, используемые самой OS-DOS. По адресу 0007-001F находится информация описывающая структуру (или стандарт) дискеты: сколько дорожек, сторон, плотность записи и другую служебную информацию. Она формируется и записывается программой FORMAT.COM, применительно к тому режиму, в котором происходил процес форматирования дискеты. В наследство от "Корвета", некоторые "фирмы" пытаются всучить "Ориону" все многообразие этих "стандартов". Дискета: одно-двухсторонняя, 80-40 дорожек, одинарная - двойная плотность. Авторы поддерживают (и мы просим это делать пользователей ПК "Орион-128") только вариант: 80 дорожек, две стороны, двойная плотность. Это позволит получить максимальную полезную емкость дискеты и иметь единый "стандарт" для ПК "Орион-128", что избавит от проблем при распространении программ.
В ячейках 0020Н-002А размещается имя дискеты. Программа форматирования дискет FORMAT.COM, распространявшаяся с OS-DOS V2.3X, заносит в эти ячейки имя "ОРИОН-128.2". Начиная с OS-DOS V2.4X (2.6X) имя дискеты выводится перед выводом каталога дискеты командой DIR. Устанавливается имя в программе FORMAT.COM или SYS.COM (конечно соответствующей версии).
По адресу 002В-002СН находится адрес размещения OS-DOS в ОЗУ при считывании ее со второго сектора (напомним: первый сектор, где размещался ВООТ-сектор и начало ССР мы считали в служебный буфер "холодного" загрузчика) и далее. Управление считанной операционной системе передается по адресу, находящемуся в ячейках 002D-002Е. Это адрес входа в вектор BIOS для "холодного" перезапуска OS-DOS, т.е. производится повторное считывание ССР и BDOS с дискеты BIOSoм. Этим компенсируются потери части ССР при первичном считывании ОС загрузчиком LDOS$. Ячейка 002FH - флаговая. Ее значение указывает на страницу (банк) загрузки OS-DOS. Флаг используется вторичным загрузчиком. 00 - указывает на основную страницу загрузки OS-DOS -VX.4X, 01 - загрузка в страницу 1 - OS-DOS VX.6X и т.д. Начиная с адреса 0030Н по 00СВН находится вторичный загрузчик. После выполнения своих функций (считывание и запуск OS- DOS) он затирается. На его месте операционная система размещает свои служебные буферы.
Следует сказать, что построенный авторами по такой схеме ВООТ-сектор не требует изменений при применении его как для OS-DOS48K (размещается в основной памяти компьютера - V2.30, 2.31,2.40,2.41), так и для OS-DOS60K (размещается в дополнительной странице 1-3 - V2.60,2.61). Это же относится и к V3.60. Модификации подвергаются только две пары ячеек - 002В-002С и 002D-002Е. Для OS-DOS60К они имею следующие значение: 0CB00Н и 0DA00Н соответственно.
В процессе работы OS-DOS ячейки по адресу 0000-0007Н имеют следующее назначение:
0000-0002Н - вектор перехода в BIOS на перезагрузку OS-DOS
("горячий старт"). По этому адресу передается управление после окончания выполнения пользовательской программы. При этом
происходит восстанавлеие CCP и BDOS, если они были затерты.
0003Н - байт назначения логических устройств (БНЛУ)
Байт переназначения логических устройств делится на четыре
поля (A,B,C,D) по два бита. Каждое поле определяет текущее
назначение устройств.
A B C D
---------------------
D7D6 D5D4 D3D2 D1D0
---------------------
LST PUN RDR CON
LST - Устройство печати
PUN - Устройство вывода данных (перфоратор)
RDR - Устройства ввода данных (перфосчитыватель)
CON - Консоль (дисплей-вывод, клавиатура-ввод)
В OS-DOS для "Orion-PRO" каналы PUN и RDR используются для
порта COM1 - интерфейс сети.
A(D7-D6) B(D5-D4) B(D5-D4) D(D1-D0)
-------- -------- -------- --------
/00 - TTY /00 - TTY /00 - TTY /00 - TTY
LST 01 - CRT PUN 01 - PTP RDR 01 - PRT CON 01 - CRT
10 - LPT 10 - UP1 10 - UR1 10 - BAT
\11 - UL1 \11 - UP2 \11 - UR2 \11 - UC1
TTY - Низкоскоростная консоль (телетайп)
CRT - Высокоскоростная консоль (дисплей)
BAT - Устройство пакетной обработки
UC1 - Консоль, определенная пользователем
PTR - Устройство чтения с перфоленты
UR1 - Устр.ввода N1, определенное пользователем
UR2 - Устр.ввода N2, определенное пользователем
PTP - Устр.вывода на перфоленту
UP1 - Устр.вывода N1, определенное пользователем
UP2 - Устр.вывода N2, определенное пользователем
LPT - Построчно печатающее устройство
UL1 - Дополнительное печатающее устройство
Приведенная информация взята из фирменного руководства по
СР/М-80 DIGITAL RESEARCH INC. и носит, скорее, просветительный
характер. Известные реализации BIOS для СР/М ПК "Орион-128" (в
том числе и авторский - OS-DOS) не предусматривают переключение
логических устройств. Для этого они должны иметь программы-драйверы в теле BIOS. BDOS не оперируют ячейкой 0003Н,
за исключение функций 7 и 8 которые только читают БНЛУ или заносят в него новое значение. Поэтому команды программы
STAT.COM, оперирующие переназначением логических устройств, так же
изменяют лишь значение ячейки 0003Н и поэтому безполезны (пока!). OS-DOS при "холодном старте" в байт 0003Н заносит значение 00.
0004Н - номер текущего диска
0005-0007Н - вектор входа в BDOS для вызова функции на выполнение. Для этого предварительно подготавливается состояние
регистров, затем вызывается функция, как подпрограмма по адресу
0005Н (CALL 5).
BIOS. Таблица векторов.
Вход в BIOS (BASIC INPUT/OUTPUT SYSTEM) осуществляется через таблицу векторов. Она размещается в начале модуля BIOS. Таблица векторов состоит из 17 входов на подпрограммы, выполняющих функции управления и взаимодействия с "железом" компьютера. Некоторые из этих векторов могут быть "пустыми" для определенных функций (к примеру, содержать только команду RET -READER, PUNCH и др.), но вход в таблице векторов должен присутствовать.
Таблица входов векторов
Bas + 00H JMP BOOT ; "Холодный" старт системы
03H JMP WBOOT ; "Горячий" старт системы
06H JMP CONST ; Статус клавиатуры
09H JMP CONIN ; Ввод символа с клавиатуры
0CH JMP CONOUT ; Вывод символа на дисплей
0FH JMP LIST ; Вывод символа на принтер
12H JMP PUNCH ; Вывод на перфоленту
15H JMP READER ; Ввод с перфоленты
18H JMP HOME ; Установка дорожки 0 на
; выбранном диске
1BH JMP SELDSK ; Выбор диска (0,1,2)
1EH JMP SETTRK ; Уст.номера дорожки (0-79)
21H JMP SETSEC ; Уст.номера сектора (1-10)
24H JMP SETDMA ; Уст.адреса буфера обмена
27H JMP READ ; Чтение выбранного сектора
2АH JMP WRITE ; Запись выбранного сектор
2DH JMP LISTST ; Статус состояния принтера
30H JMP SECTRAN ; Перенумерация секторов
Значение BAS - это адрес начала размещения BIOS в памяти
компьютера. Его следует считывать с ячеек по адресу 0001-0002Н.
Для OS-DOS48K - 0AC00H, для
OS-DOS60K - 0DA00H.
Таблица векторов по функциональному назначению делится на
три основные группы:
- реинициализация системы (BOOT и WBOOT)
- ввод-вывод байтовой информации (CONST,CONIN CONOUT,LIST,PUNCH,READER и LISTST)
- блочный ввод-вывод для обмена с диском (HOME SELDSK,SETTRK,SETSEK,SETDMA,READ,WRITE и SECTRAN)
Рассмотрим более подробно функциональные особенности векторов BIOS
BOOT - Получает управление от вторичного загрузчика
системы и выполняет инициализацию, включая выдачу сообщения
о запуске OS-DOS. После инициализации параметров системы,
вполнения файла AUTOEXEC.BAT (если он есть на загрузочной дискете) управление передает в модуль CCP для дальнейшей работы,
установив текущим дисковод "А".
WBOOT - Получает управление, когда необходима (если затерты BDOS и CCP) перезагрузка системы. "Теплый старт" системы происходит и при передаче управление программой пользователя в ячейку с адресом 0000Н (стандартный способ окончания
программ пользователя в среде CР/М) или вводе CTRL/C. При этом
производится загрузка в память компьютера с системных дорожек
диска - ССР и BDOS. По завершении инициализации WBOOT передает
управление в ССР. Устанавливается номер текущего дисковода,
инициализированный до рестарта системы.
CONST - Производит опрос активности клавиатуры и возвращает в регистре
"А" - 0FFН, если клавиша клавиатуры нажата, или 00Н в противном случае. По выполняемой функции аналогична подпрограмме STAT (0F812Н) Монитора.
CONIN - Считывает символ с клавиатуры, ожидая факт нажатия клавиши. Результат возвращается в регистре "А". По выполняемой функции аналогична подпрограмме KBRD
(0F803Н) Монитора.
CONOUT - Выводит символ из регистра "С" на экран дисплея
По выполняемой функции аналогична подпрограмме TVC (0F809Н)
Монитора.
LIST - Выводит символ из регистра "С" на принтер. В теле BIOS OS-DOS драйвер принтера не содержится и загружается в
виде СОМ-файла пользователем (DPRINT.COM).
PUNCH - Выводит байт на перфоратор. В реализации, ранее
перечисленных версий OS-DOS фирмы "Орионсофт" вектор не
используется. Установлена "заглушка".
READER - Считывает байт с перфосчитывателя. В реализации,
ранее перечисленных версий OS-DOS вектор так же не используется. Установлена "заглушка".
HOME - Помещает считывающую головку выбранного дисковода в исходное состояние, т.е. на дорожку с номером "00". Можно использовать подпрограмму SETTRK с параметром равным 00H.
SELDSK - Выбирает дисковод, номер которого задается в регистре "C".
Это необходимо для последующих операций чтения/записи (C=0 - выбирается дисковод "А", C=1 - дисковод "B").
При каждом вызове подпрограмма SELDSK должна возвращать в регистровой паре HL адрес таблицы описания диска (DISK PARAMETER
HEADER). Eсли делается попытка выбора несуществующего дисковода, то HL=0000H.
SETTRK - Выбирает дорожку на диске по содержимому
регистра С (номер дорожки не должен превышать 79).
SETSEC - Выбирает сектор на выбранной дорожке по содержимому регистра C.
SETDMA - Устанавливает адрес буфера обмена, в который по
регистру ВС, будет считана одна запись (128 байт) в память
компьютера. По умолчанию устанавливается буфер по адресу
0080Н.
READ - Подпрограмма считывает одну запись с диска в память компьютера, начиная с адреса, установленного в последней
операции SETDMA и заканчивая этим адресом + 128 байт. подпрограмма Предварительно устанавливают SETTRK, SETSEC. В регистре "А" возвращает следующие параметры :
А = 00 - нет ошибок
А > 0 - ошибка при считывании сектора
WRITE - Подпрограмма записывает одну запись из памяти
компьютера (с адреса, определенного в последней операции SET-DMA, размером в 128 байт) на выбранный сектор, выбранной дорожки, выбранного диска ( операции SETSEC, SETTRK SETDSK).
Возвращает параметры аналогичные команде READ.
Следует уточнить, что подпрограммы READ и WRITE предварительно вычисляют: в каком секторе, какой дорожки находится
искомая запись. Затем производят считывание/запись сектора (1
Кбайт) и найденную запись (128 байт) переносят в буфер обмена
по адресу, установленному в SETDMA.
Такая двойная "бухгалтерия" происходит из-за того, что в
былые времена сектор имел размер в 128 байт и назывался - запись. Дорожки на дискете размещались с одной стороны и содержали по 40 секторов.
В настоящее время современные дисководы имеют более высокие
плотности записи на дискету. Чтобы реализовать это достижение,
пришлось изменить структуру дорожки - сделать меньше количество
секторов - 5, а размер их увеличить до одного килобайта. Это
уменьшило количество служебной информации на дорожке и резко
повысило об ем полезной.
Но BDOS остался без изменений и оперирует по "старинке" записями по 128 байт. Пришлось на BIOS возложить функции "бухгалтера".
LISTST - Производит опрос статуса состояния (готов/не готов) принтера. Подпрограмма в теле BIOS не содержится и загружается совместно с подпрограммой вывода символа на принтер -DPRINT.COM. При готовности принтера - возвращает в регистре
"А" = 00Н, при неготовности А=FF.
SECTRAN - Осуществляет преобразование логического номера
записи в физический сектор на диске. Изначально задумано для
убыстрения доступа к информации на диске, за счет использования
принципа чередования секторов на дорожке. Однако это было
актуально в то время, когда размер записи и сектора равнялся
128 байтам. В настоящее время, в реализации современного BIOS
(в том числе и для "Орион-128") данный вектор из-за двойной
"бухгалтерии" утратил актуальность и не используется. Тем не
менее по запросу BDOS он эмулирует свои функции.
Некоторые особенности в использовании векторов
- условием конца текстового файла в OS-DOS является включение в файл кода 1AН (или CTRL/Z).
- периферийные устройства воспринимаются OS-DOS как "логические" устройства и соотносятся на физические - только посредством модуля BIOS.
- обмен с диском всегда осуществляется с помощью вызова подпрограмм
доступа к диску.
Предварительно с помощью дополнительных векторов выбирают номер диска, дорожку, сектор на дорожке и устанавливают адрес размещения считанной информации. После того как эти параметры установлены, осуществляется обращение к функциям READ или WRITE для выполнения собственно операции чтения/записи сектора. Выполняется несколько попыток (обычно 5-6 ) прежде, чем возвращается признак ошибочного завершения операции.
На предыдущую страницу На главную страницу На следующую страницу