Операционная система MXOS компьюетра Специалист МХ
[url]https://github.com/vinxru/MXOS[/url]
MXOS - это название операционной системе я дал сам, поскольку оригинального названия я не нашел. Народ её называл командер, а внутри оперционки содержатся лишь строки: BIOS 4.40, COMMANDER VERSION 1.4, (C) OMSK 1992.
MXOS это альтернативная операционная система для компьютера Специалист МХ. Оригинальна операционная система называлась RamFOS.
В отличии от RamFOS эта операционная система написана более грамотно. Для доступа к накопителям используются драйвера. Чтение и запись происходит 256 байтными блоками. В RamFOS доступ был побайтный и при том частый и хаотичный, что не позволяло подключить дисковд или SD карту в качестве накопителя.
Так же MXOS более шустрая и обладает более приятным интерфейсом напоминающим Norton Commander. Любое расширение файла можно привязать к любой программе. Список соответствий хранится в файле NC.EXT, максимальный размер которого 36 Кб.
Но при этом MXOS содержит меньше сервисных возможностей и не совместима с RamFOS и стандартным Специалистом. Основные отличия, это:
● Система не содержит форму (интерфейс пользователя) для открытия файла. То есть, в RAMFOS есть стандартная точка входа, при вызове которой на экране отображается список файлов и пользователь должен стрелками выбрать файл.
● Для вывода звука используется КР580ВВ55, а не КР580ВИ53
● Нет поддержки цвета (хотя и RamFOS его полноценно не поддерживал и не использовал вообще)
● Поддерживается значительно меньше специальных кодов (символов) при выводе на экран
● Поддерживается лишь одна модель принтера
● В комплекте нет никаких программ (Стандартная RAMFOS содержит полноэкранный редактор, ассемблер, отладчик и дизассемблер).
● Оригинальная ОС поддерживает лишь 64 Кб дополнительного ОЗУ, которое используется как RAM-диск. Запуск с большим объемом памяти приведет к зависанию, так как в порт выподра страницы записывается случаное число. Я исправил этот глюк и моя версия ОС поддерживает 448 Кб дополнительной памяти, т.е. 7 страниц как накопители B-H.
● Используется раскладка клавиатуры Стандартного специалиста. (У MX отличаются коды клавиш F1-F10, TAB, ESC.)
Многие возможности можно реализовать дополнительными модулями. Например, в комплекте идет драйвер ПЗУ подключаемого к порту расширения. Таким же образом могла быть выполнена поддержка дисковода. И скорее всего была выполнена, но драйвера я не нашел.
Поддерживаются две кодировки KOI-7 и KOI-8, переключаемые как с клавиатуры, так и ESC-последовательностями (ESC+'(' и ESC+')'). Знакогенератор содержит 256 символов.
MXOS поддерживает BAT-файлы и передачу аргументов запускаемым программам. При холодной перезагрузке запускается файл B:AUTOEX.BAT, затем A:FORMAT.COM B:, а затем A:NC.COM. Устройство A: - это ПЗУ, устройство B: - это оперативная память. Максимально поддерживается 8 устройств.
При создании собственного ПЗУ (загрузочного диска A:) вы можете разместить AUTOEX.BAT так же и на диске A:, а в нем разместить запуск драйверов.
Запуск MXOS
[IMG]http://cs624229.vk.me/v624229349/3581e/xKZHyJ2qeNc.jpg[/IMG]
Если при запуске компьютера зажать клавишу ?, то MXOS сразу перейдет к загрузке программы с магнитофона. Если при запуске компьютера зажать клавишу ?, то MXOS пропустит запуск B:AUTOEX.BAT.
При перезагрузке инициируемой программами запускается лишь A:NC.COM.
[IMG]http://cs624229.vk.me/v624229349/35826/a28w_oU7W2Y.jpg[/IMG]
Имя файла состоит из 6+3 символов. Ввод расширения при запуске файла из ком. строки обязателен. Папки самой операционной системой не поддерживаются, но это можно реализовать через драйверы. Максимальное кол-во файлов в папке - 48 шт, но оболочка поддерживает отображение лишь 36 файлов. Остальные файлы вы не увидите, не сможете выполнять над ними действия из оболочки, но сможете запустить их ком строки. Максимальный размер файла - 64 Кб, но оболочка может работать лишь с ~36 Кб. При попытке скопировать (и т.п.) файл большего размера произойдет переполнение буфера, уничтожение системных переменных, затем экрана, затем самой ОС в зависимости от размера файла. Структура хранения файлов напоминает FAT, только используются 8 битные номера кластеров.
В отличии от "монитора" стандартного Специалиста, MXOS не содержит режима работы с консоли и соответственно директив вводимых с клавиатуры. Вся работа происходит в диалоговом режиме.
Оболочка поддерживает две панели, как Norton Commander.
[IMG]http://cs624229.vk.me/v624229349/3582e/yiB0Y6EpffE.jpg[/IMG]
Клавиши выполняют следующие команды:
● ESC - Очистка ком строки
● TAB - Переход между панелями
● F1, F2 - Выбор накопителя для левой и правой панели
● F3 - Отображение на неактивной панели информации о накопителе активной панели (как на фото выше)
● F4 - Запуск внешнего редактора E.COM для выбранного файла
● F5 - Копирование файла
● F6 - Изменение имени файла / перемещение
● F7 - Загрузка файлов с ленты (магнитофона) на накопитель
● F8 - Удаление файла
● F9 - Сохранение файла с накопителя на ленту
Помимо исправления некоторых ошибок и увеличания ОЗУ я раскрасил интерфейс.
Я добавил ключ ENABLE_COLOR, который включает/выключает эту раскраску.
Все свои доработки и исправления я сделал отключаемыми с помощью таких ключей. Если выключить всё, то система будет идентична оригиналу. То есть, после компиляции получится файл такого же размера и содержания, что и оригинальный файл.
[IMG]http://cs616523.vk.me/v616523349/5671/JdN6AjQWZvk.jpg[/IMG]
[SIZE=4]ЯДРО (DOS.SYS)[/SIZE]
Представляет собой набор подпрограмм загружающихся по адресу 0C800h. Это подпрограммы обслуживания экрана, принтера, клавиатуры и накопителя на магнитой ленте и файловой системы.
Обращение к этим функциям происходит по фиксированным адресам (точкам входа), которые я перечислю ниже.
Плюсом отмечены точки входа совпадающие с Монитором 2 (это прошивка стандратного Специалиста). Программы стандартного Специалиста не обращающиеся к клавиатуре напрямую и использующие только эти точки входа будут работать и на MXOS.
+ C800h - reboot - Запуск файла A:NC.COM
+ C803h - getch - Ввод символа с клавиатуры; A-код
+ C806h - tapeRead - Ввод байта с ленты; A-код; если ошибка, то происходит переход на адрес по адресу 8FE1h
+ C809h - printChar - Вывод байта на экран; C-код
+ C80Сh - tapeWrite - Вывод байта на ленту; C-байт
C80Fh - input - Ввод строки с клавиатуры
C812h - keyScan - Ввод кода нажатой клавиши; A-код; иначе-0FFh
+ C815h - printHexByte - Вывести 16-ричное число на экран; A-число
+ C818h - printString - Вывод строки символов на экран, до нулевого байта; HL-начало строки
+ C81Bh - keyScan - Ввод кода нажатой клавиши; A-код; иначе-0FFh
C81Eh - getCursorPos - Получить координаты курсора в HL (координаты в пикселях)
C821h - setCursorPos - Установить координаты курсора из HL (координаты в пикселях)
+ C824h - tapeLoad - Загрузить программу с ленты
+ C827h - tapeSave - Сохранить программу на ленту
+ C82Ah - calcCrc - Расчет контрольной суммы
C82Dh - printHexWord - Вывести 16-ричное число на экран; HL-число
C830h - getMemTop - Получить объем доступной памяти; HL-объем
C833h - setMemTop - Установить объем доступной памяти; HL-объем
C836h - printer - Вывод байта на принтер
C838h - reboot - Переход на 0C800h
C83Сh - reboot2 - Запустить A:NC.COM (стандартную точку С800h можно изменить)
C83Fh - fileList - Получить список файлов
C842h - fileGetSetDrive - Получить/установить активное устройство
C845h - fileCreate - Создать файл
C848h - fileLoad - Загрузить файл по адресу из заголовка этого файла
C84Bh - fileDelete - Удалить файл
C84Eh - fileRename - Переименовать файл
C851h - fileLoadInfo - Загрузить информацию о файле
C854h - fileGetSetAddr - Получить/установить адрес загрузки файла
C857h - fileGetSetAttr - Получить/установить атрибуты файла
C85Ah - fileNamePrepare - Преобразовать имя файла во внутренний формат
C85Dh - fileExec - Запустить файл
C860h - installDriver - Установить драйвер накопителя
C863h - diskDriver - Драйвер выбранного диска
C866h - fileLoad2 - Загрузить файл по адресу
[SIZE=4]СТАНДАРТНЫЕ СИСТЕМНЫЕ ПЕРЕМЕННЫЕ[/SIZE]
8FE1h - 2 - tapeError - Адрес куда происходит переход при ошибке чтения с ленты
8FE3h - 2 - tapeAddr - Адрес программы загруженной с ленты
8FE7h - 2 - charGen - Адрес альтернативного знакогенератора; адрес необходимо разделить на 8
8FE9h - 1 - cursorCfg - Внешний вид курсора (7 - бит видимость, 654 - положение, 3210 - высота)
8FEAh - 1 - koi8 - 0FFh=включен KOI-8, 0=включен KOI-7
8FEBh - 1 - escMode - Обработка ESC-последовательности
8FECh - 1 - keyLocks - Состояние клавиш CAPS LOCK и РУС/LAT
8FEFh - 2 - lastKey - Две последние нажатые клавиши
8FF1h - 2 - beep - Длительность и частота звукового сигнала
8FF4h - 1 - repeat - Задержка повтора клавиш
8FFAh - 2 - inverse - 0=нормальный текст, 0FFFFh=инверсный текст
8FFCh - 1 - cursorY - Положение курсора по вертикали в пикселях
8FFDh - 1 - cursorX - Положение курсора по горизонтали в пикселях / 2
8FFEh - 1 - writeDelay - Скорость при записи на ленту
8FFFh - 1 - readDelay - Скорость при чтении с ленты
[SIZE=4]КАРТА ПАМЯТИ[/SIZE]
0000h...8FDEh - 36830 байт - Свободная память
8FDFh...8FFFh - 33 байта - Системные переменные
9000h...BFFFh - 12 Кб - Экран
C000h...СFFFh - 4 Кб - DOS.SYS (после ~CE94h свободно)
D000h...E1FFh - 4608 байт - NC.COM (после ~E11Bh свободно) / FORMAT.COM
E200h...FAFFh - 6 Кб - Резерв под драйвера
FB00h...FDFFh - 768 байт - Дисковый буфер
FF00h...FF81h - 130 байт - Коммандная строка. Заполняется fileExec
FF82h...FFC0h - 62 байта - Стек
FFC0h...FFEFh - 32 байта - DOS.SYS
FFD0h...FFFFh - 32 байта - Оборудование
[SIZE=4]ФОРМАТ ФАЙЛОВОЙ СИСТЕМЫ FAT8[/SIZE]
Оригинальная ОС поддерживает лишь 64 Кб ДОЗУ и при запуске с большим объемом зависнет. Это происходит из за того, что в регистр страницы ДОЗУ записывается случайное значение.
Исправленная ОС (опция BIG_MEM) по умолчанию 7 первых страниц ДОЗУ отображает как накопители B-H.
Операционная система адресует диски 256 байтными блоками. А так как последние 64 байта адресного пространства всегда занимают основное ОЗУ и устройства, то целых блоков получается 255.
То есть операционная система не использует последние 192 байта памяти. Только NC.COM в конце нулевой страницы (FF00h-FF0Ah) хранит своё состояние.
Файловая система подобна FAT. Накопитель максимальным объемом 64 КБ разбит на 256 блоков по 256 Кб.
Первые 4 блока содержат служеюную информацию. Нулевой блок таблицу FAT, следующие 4 блока - каталог.
Таблица FAT содержит 256 чисел. Число 5 по адресу 8, значит что за 8 блоком следует читать 5-ый блок. Последний блок замыкается сам на себя, то есть у последнего блока в ячейке 7 должно быть число 7. Свободным блокам в таблице FAT соответствует число 0. Первые 4 числа в таблице не используются, как и не используются блоки с нмоерами 0-3 для хранения файлов.
Каталог находящийся в блоках 1-3 содержит список файлов. 48 файлов по 16 байт на каждый. Если первый байт имени файла FFh, значит файл не существует.
Структура записи следующая:
6 байт - имя файла
3 байта - расширение файла
1 байт - атрибуты файла
2 байт - адрес загрузки файла
2 байт - длина файла - 1
1 байт - ?
1 байт - первый кластер файла
В ПЗУ компьютера то же хранятся файлы. И хранятся в таком же формате, что и файлы в ОЗУ. Для пользователя ПЗУ выглядит как диск A:
После включения компьютера процессор начинает выполнять программу с начала ПЗУ. Поэтому первые 3 байта ПЗУ, то есть таблицы FAT содержат команду перехода на загрузчик (команда JMP). Система на эти три байта внимания не обращает.
Сам же загрузчик можно размещать в любом блоке, который может быть даже помечен как свободный. При использовании неизменного ПЗУ это никогда не приведет к ошибке.
Загрузчик может даже размещается в конце каталога. Что бы это не вызвало глюка, используется следующий приём. Если первый символ имени файла FF, то остальные 15 байт записи могут содержать произвольные данные.
В оригинальной системе в ПЗУ по адресам 800h-FFFh должен содержаться знакогенератор. Перед выводом каждого символа на экран, символ из ПЗУ копируется в ОЗУ, а потом в видеопамять. Это не только медленно, но и не позволяет отвязать систему от ПЗУ. Эту недоработку я то же попрпавил. Я сделал хранение шрфита в ОЗУ.
И ЕЩЕ ХВАЛА КОМПИЛЯТОРУ TASM
Здорово, что в tasm есть макросы из языка Си. Код получается на порядок понятнее!
В дизассемблированых программах часто встречаются расчетные значения. То есть какие то непонятные числа, которые вычисляются по формуле из понятных чисел. Например:
; Это мы рисуем окно с координатами (0, 0), (192, 230)
db 2, 0, 90h, 0E0h, 16h
; Это мы рисуем горизонтаьную линию (4, 184), (208, 184)
db 1, 0D0h, 90h, 16h, 0Fh, 0F0h
; Это мы рисуем вертикальную линию (96, 3), (96, 205)
db 3, 9Ch, 0CDh, 80h
Мы можем их заменить на макросы
G_WINDOW(0, 0, 192, 230)
G_HLINE(4, 208, 184)
G_VLINE(96, 3, 205)
И написать макросы с формулами расчета
#define G_WINDOW(X,Y,W,H) .db 2, Y, 90h+(X»3), H-6, (W»3)-2
#define G_HLINE(X,Y,W) .db 1, Y, 90h+(X»3), (((X&7)+W+7)»3)-2, 0FFh»(X&7), (0FF00h»((W+X)&7)) & 0FFh
#define G_VLINE(X,Y,H) .db 3, Y, 90h+(X»3), H, 80h»(X&7)