Хочу начать новую тему касаемую программного обеспечения для Специалиста_МХ Commander, далее доработанного Vinxru до MXOS.
Я давно хотел свести данные по этому ПО в отдельную тему. Последним толчком для этого послужило написание мною драйвера дисковода под Commander. Обо всём по порядку. Я буду пользоваться описанием данного ПО когда-то предоставленным HardWareMan'ом и выдержками с описания MXOS от Vinxru.
Commander написал в 1992 году Константин Юденцов (ныне покойный) и он является альтернативной RAMFOS'у операционной системой для Специалиста_МХ. Основными достоинствами/недостатками являются:
1. нет поддерживаемых системой верхней и нижней строки состояния;
2. система не содержит форму для открытия файла;
3. нет поддержки звука на основе К580ВИ53;
4. нет поддержки цвета;
5. поддерживается значительно меньше специальных кодов при выводе на экран;
6. поддерживается лишь одна модель принтера;
7. поддерживается лишь 64 кБайт дополнительного ОЗУ (что в сумме дает 128 кБайт), которое используется как RAM-диск.
Поддерживаются две кодировки KOI-7 и KOI-8, переключаемые как с клавиатуры, так и ESC-последовательностями (ESC+'(' и ESC+')'). Знакогенератор содержит 256 символов. Используется раскладка клавиатуры Стандартного специалиста. При холодной перезагрузке запускается файл B:AUTOEX.BAT, затем A:FORMAT.COM B:, а затем A:NC.COM. Устройство A: - это ПЗУ, устройство B: - это оперативная память. Максимально поддерживается 8 устройств.
При перезагрузке инициируемой программами запускается лишь A:NC.COM. Папки самой операционной системой не поддерживаются, но это можно реализовать через драйверы. Максимальное количество файлов в папке - 48 штук, но оболочка поддерживает отображение лишь 36 файлов. Остальные файлы Вы не увидите, не сможете выполнять над ними действия из оболочки, но сможете запустить их командной строки. Максимальный размер файла - 64 кБайт, но оболочка может работать лишь с ~36 кБайт. При попытке скопировать (и т. п.) файл большего размера произойдет переполнение буфера, уничтожение системных переменных, затем экрана, затем самой ОС в зависимости от размера файла.
Клавиши выполняют следующие команды:
ESC - очистка командной строки;
TAB - переход между панелями;
F1, F2 - выбор накопителя для левой и правой панели;
F3 - отображение на неактивной панели информации о накопителе активной панели;
F4 - запуск внешнего редактора E.COM для выбранного файла;
F5 - копирование файла;
F6 - изменение имени файла / перемещение;
F7 - загрузка файлов с ленты (магнитофона) на накопитель;
F8 - удаление файла;
F9 - сохранение файла с накопителя на ленту.
Следующий раз я приведу структуру FAT, используемую в Commander'е. Остальное можно прочитать здесь.
- - - Добавлено - - -
Продолжу.
Commander поддерживает лишь 64 кБайт RAM-диска и отображается как накопители B-H. Причём при старте эти диски являются копиями друг друга. Но каждый из этих дисков можно настроить под свои нужды используя свои драйверы (что и сделал я). Система адресует диски 256 байтными блоками. А так как последние 64 байта адресного пространства всегда занимают основное ОЗУ и устройства, то целых блоков получается 255.
Файловая система подобна FAT. Накопитель максимальным объемом 64 кБайт разбит на 256 блоков (кластеров) по 256 байт. Первые 4 кластера содержат служебную информацию. Нулевой кластер - это таблица FAT, следующие 4 кластера - каталог.
Таблица FAT содержит 256 чисел. Число 5 по адресу 8, значит что за 8 блоком следует читать 5-ый блок. Последний блок замыкается сам на себя, то есть у последнего блока в ячейке 7 должно быть число 7. Свободным блокам в таблице FAT соответствует число 0. Из рисунка видно как выглядит распределение чисел в FAT в зависимости от номера кластера и количество кластеров.
Каталог находящийся в кластерах с 1-го по 3-й содержит список файлов. 48 файлов по 16 байт на каждый. Конец каталога - это байт FFh в начале имени файла.
Формат дескриптора файла:
6 байт - имя файла;
3 байта - расширение файла;
1 байт - атрибуты файла: 00h - обычный файл, 01h - системный файл;
2 байта - начальный адрес загрузки в ОЗУ, он же и стартовый;
2 байта - размер файла в байтах - 1;
1 байт - ?;
1 байт - номер первого кластера в FAT.
Я не зря в предпоследнем байте поставил знак вопроса. У HardWareMan'а - это флаг автозапуска, 00h - данные, FFh - программа. А вот Vinxru так и не понял его назначения. Я в одном месте листинга MXOS нашёл, что при создании файла почему-то сюда записывается как бы "накопленный" байт, который получается при суммировании всех байтов программы, но не является контрольной суммой файла.
В следующий раз я опишу MXOS от Vinxru, которая является доработанной/переработанной версией Commander'а.
Здесь я цитирую со своей редакцией описание ПО Vinxru (https://github.com/alemorf/retro/tre...pecialist-mxos).
MXOS - это название операционной системе я дал сам, поскольку оригинального названия я не нашел.
Исправленные недоработки:
В файле DOS.SYS
1. поддержка ДОЗУ (RAM-диска) большего объема, чем 64 кБайт;
2. размер ПЗУ у Специалиста_MX2 всего 32 кБайт;
3. загрузка шрифта в ОЗУ (ускорение работы и возможность загрузки ОС с любого накопителя);
4. включена инициализация контроллера цвета при запуске.
В файле NC.COM
1. включен цвет;
2. Bподдержка ДОЗУ (RAM-диска) большего объема, чем 64 кБайт;
3. исправлена ошибка определения свободного объема.
MXOS более шустрая и обладает более приятным интерфейсом напоминающим Norton Commander. Любое расширение файла можно привязать к любой программе. Список соответствий хранится в файле NC.EXT, максимальный размер которого 36 кБайт. Но при этом MXOS содержит меньше сервисных возможностей и не совместима с RAMFOS'ом. Оригинальная ОС (Commander) поддерживает лишь 64 кБайт дополнительного ОЗУ (что в сумме дает 128 кБайт), которое используется как RAM-диск. Запуск с большим объемом памяти приведет к зависанию, так как в порт выбора страницы записывается случайное число. Исправленная версия ОС поддерживает 448 кБайт дополнительной памяти, т. е. 7 страниц как накопители B...H. Многие возможности можно реализовать дополнительными модулями. Например, в комплекте идет драйвер ПЗУ подключаемого к порту расширения.
MXOS поддерживает BAT-файлы и передачу аргументов запускаемым программам. При холодной перезагрузке запускается файл B:AUTOEX.BAT, затем A:FORMAT.COM B:, а затем A:NC.COM. Устройство A: - это ПЗУ, устройство B: - это оперативная память. Максимально поддерживается 8 устройств. При создании собственного ПЗУ (загрузочного диска A вы можете разместить AUTOEX.BAT так же и на диске A:, а в нем разместить запуск драйверов. Если при запуске компьютера зажать клавишу ?, то MXOS сразу перейдет к загрузке программы с магнитофона. Если при запуске компьютера зажать клавишу ?, то MXOS пропустит запуск B:AUTOEX.BAT.
В отличии от "монитора" стандартного Специалиста, MXOS не содержит режима работы с консоли и соответственно директив вводимых с клавиатуры. Вся работа происходит в диалоговом режиме.
В оригинальной системе ПЗУ по адресам 800h...FFFh должно содержать знакогенератор. Перед выводом каждого символа на экран, этот символ будет копировать из ПЗУ в ОЗУ. Что не только медленно, но и не позволяет отвязать систему от ПЗУ.
Теперь пришло время рассказать о прекрасном инструменте от автора называемым "подключаемыми драйверами накопителя". Авторы вышеупомянутого ПО и b2m всегда высказывались, что достаточно просмотреть файл DISK_H.COM и всё сразу станет понятным о механизме подключения сторонних накопителях.
Давайте рассмотрим этот драйвер (дизассемблированный листинг от Vinxru, но в мнемонике Z80). Т.к. он не большой я приведу его полностью.
Обработчик имеет три функции (номер передаётся в регистре Е):
1 - записать блок (256 байт, номер блока в регистре D, адрес в HL);
2 - считать блок (256 байт, номер блока в регистре D, адрес в HL);
3 - выдать размер диска (в блоках, в регистре А).
Обратиться к обработчику текущего диска можно по адресу С863h.
А теперь я опишу назначение данного драйвера. Он предназначен для загрузки каталога и запуска файлов с внешнего ROM-диска, подключаемого к К580ВВ55 (порт программатора). Его объём до 64 кБайт. Нигде нет его схемы, но из конфига эмулятора от b2m я предполагаю что данные ПЗУ подключаются к порту А ППА, а адрес - к портам В и С. Автор выбрал для подключения внешнего ROM-диска накопитель H.; Установить драйвер
org #fa00
ld a, #07
ld hl, #fa0f
jp sys_installDriver ; посадить обработчик на один из 8 дисков
; Сделать активным диск H
LFA08 ld e, #01
ld a, #07
jp sys_fileGetSetDrive ; выдать/установить текущий диск
LFA0F ld a, e ; Запись не поддерживается
cp #01
ret z
push hl ; сохранение регистров
push de
push bc
ld a, #90 ; настройка портов
ld (IO_EXT_MODE), a
ld a, #0d ; 6 вывод = 1
ld (IO_KEYB_MODE), a
ld a, e ; определение размера
cp #03
jp z, LFA39
cp #02 ; чтение 256-байтного блока
jp nz, LFA51 ; не верная функция - выход
; чтение блока
; вход: [D] - номер блока
; вход: [HL] - адрес буфера в памяти
xor a
ld e, a ; [DE] = 0 - начальный адрес в блоке
LFA2D call LFA61 ; чтение данных
ld (hl), a ; сохранение данных в памяти
inc hl ; инкремент адреса в буфере
inc e ; следующий адрес в блоке
jp z, LFA51 ; выход, если блок закончился
jp LFA2D ; иначе - цикл
; определение обьема ПЗУ
; выход: [A] - количество секторов на диске
LFA39 xor a
ld b, a
ld d, a
ld e, #04 ; [DE] = 4 - начальный адрес в блоке
LFA3E call LFA61 ; чтение данных
cp #ff
jp nz, LFA47 ; переход, если не конец диска
inc b ; инкремент счётчика байтов
LFA47 inc e ; инкремент адреса в блоке
ld a, e
cp #c0
jp nz, LFA3E
ld a, #c0 ; И общий обьем ПЗУ получается ROM_SIZE-0FFh
sub b ; A = A - B
LFA51 push af
ld a, #0c ; 6 вывод = 0
ld (IO_KEYB_MODE), a
ld a, #9b ; восстановление режима портов
ld (IO_EXT_MODE), a
pop af ; восстановление регистров
pop bc
pop de
pop hl
ret
; чтение данных
; вход: [DE] - адрес
; выход: [A] - данные
LFA61 ex de, hl ; [HL] - номер блока/байт
ld (IO_EXT_B), hl ; передача адреса
ld a, (IO_EXT_A) ; приём данных
ex de, hl
ret
Юденцов может и хотел написать драйвер дисковода, но наверное не успел. Я где-то здесь на форуме написал в сердцах что не хочу писать его (драйвер), но всё же почти сделал это. На данный момент я сделал вывод корневого каталога с дискеты, подсчёт занимаемого места файлов корневого каталога. Работает операция копирования содержимого выбранного файла в RAM-диск, но где-то скрылась ошибка и данные переписываются неверно. Сейчас я перечислю все трудности, с которыми я столкнулся при написании драйвера:
1. в MX-DOS (ОС контроллера дисковода) дискриптор файла очень отличается от FAT дискриптора файла. А именно название файла не 8 символов, а 6, причём все буквы только заглавные и в кодировки КОИ-7;
2. не поддержено разбиение на каталоги. Так что я на первом этапе вывожу только корневой каталог дискеты. Переход в другие каталоги я хочу сделать путём переименования каталога в EXE файл и передачей ему номеров 1-го сектора и 1-й дорожки открываемого каталога;
3. Т.к. Commander поддерживает только 64 кБайта или 256 кластеров, то отображаемая информация по F3 то же будет не верной. Если принять максимальное количество файлов в одном каталоге в MX-DOS может быть 16 с максимальным размером каждого файла 64 кБайта то получаем 16*64 кБайт=1024 кБайта. Максимальная ёмкость дискеты всего 800 кБайт.
Исходники драйвера я выложу позже.
Сейчас я опишу алгоритм построения программы драйвера. Входными переменными, об этом писалось ранее, являются номер кластера и адреса буфера. Номер кластера может принимать значения от 04h...feh. Причём последние в этом списке значатся:
feh - чтение/запись каталога;
fdh - чтение/запись каталога;
fch - чтение/запись каталога;
fbh - чтение/запись таблицы FAT.
Т.е. при запросе кластера с этими номерами мы уверены, что идёт обращение к каталогу или таблице FAT. Остальные кластеры - это обращение к 256 байтному блоку памяти с конкретным номером. Т.к. каталог у нас будет состоять не более чем из 16 файлов (максимальное количество каталогов/файлов в одном каталоге MX-DOS), то обращение к кластерам с номерами fdh/feh можно просто заменить заполнение кластерами символом ffh.
А вот обращение к 04h...fah - это работа с конкретным кластером. Я сделал так. Опрашиваю весь каталог из области fc00h...fcffh и по данным каждого дескриптора файла я вычисляю начальный и конечный кластеры занимаемые каждым файлом. Если этому диапазону принадлежит запрашиваемый кластер, то я считываю в буфер запрашиваемую область. Т.к. в MX-DOS можно считывать только один сектор (1/10 часть дорожки = 1024 байт), то необходим выбор какую 1/4 часть нам использовать. Номер 1-го сектора/дорожки мы берём из дескриптора соответствующего файла дискеты.
Запись кластера должна действовать в обратном порядке, но пока мною не написана.
Заполнение таблицы FAT я сделал при обращении к кластеру fbh. Я подсмотрел листинг файла dos.sys от Vinxru. Там есть подпрограмма fileCreate, которая создаёт файл со входными данными дескриптора. Но применить её полностью мне не удалось. Она сначала ищет в каталоге имя создаваемого файла и если он есть, то сначала удаляет его. На этом этапе у меня всё зависало и я убрал эти обращения. Тупо подставляю переделанной подпрограмме дескриптор и она помещает дескриптор в каталог и соответственно размещает номера кластеров в таблице FAT. И всё.
Функцию "выдать размера устройства" я сделал так. Я просматриваю весь каталог и суммирую число кластеров занимаемое каждым файлом. Хотя система число кластеров больше 256 не воспринимает. Так что выводимая информация по F3 будет недостоверной.
В атаче исходники программы. Из архива файл ramfos.bin нужно переименовать в ramfos.rom и подставить в эмулятор emu.