Дисковая операционная система «МИР»

Компактная дисковая операционная система (ОС), разработанная для отечественных ретро-ЭВМ на базе процессора i8080 / КР580ВМ80А и совместимых с ними (i8085, Z80).

Система полностью написана на ассемблере в среде Прекрасный Ассемблер (Pretty Intel 8080 Assembler). Весь код ОС оптимизирован и помещается в ПЗУ объёмом 8 КБ.

Дисковая операционная система МИР для ЭВМ Радио-86РК

📌 Основные возможности

  • Поддерживаемые платформы: Радио-86РК, Северная Пальмира, Апогей, Микроша, Партнёр 01.01 и аналоги.
  • Файловый интерфейс: Работа с файлами и каталогами через популярный контроллер CH376.
  • Скриптинг и автоматизация: Поддержка выполнения сценариев (командных файлов), встроенный интерпретатор и шаблонизатор текстового вывода.
  • Аппаратная эмуляция: Программная реализация протокола I2C и программатора EEPROM через параллельный порт i8255 (КР580ВВ55).
  • Графика: Просмотр монохромных изображений формата WBMP размером до 127×127 пикселей.
  • Квази-многозадачность: Выполнение простых фоновых задач во время простоя (опроса клавиатуры).

Дисковая операционная система МИР


🔌 Подключение оборудования

Модуль CH376

Файловый модуль CH376 подключается к системной шине ЭВМ согласно распиновке модуля. Выводы INT и RST подключать не нужно.

При запуске ОС автоматически определяет наличие модуля CH376 и установленного носителя информации:

  • Устройство готово: с носителя автоматически загружается и выполняется сценарий AUTOEXEC.SCP.
  • Устройство отсутствует/не готово: выполняется резервный сценарий из ПЗУ (в этом случае дисковые операции блокируются).

Программатор EEPROM (Команда OUT)

Команда OUT выдает данные в порт и одновременно отображает их дамп. Выход порта PC7 эмулирует сигнал записи. Схема разработана для прошивки микросхем типа AT28C64 со следующим подключением к ВВ55:

  • PA0 – PA7 → D0 – D7
  • PB0 – PB7 → A0 – A7
  • PC0 – PC4 → A8 – A12
  • PC7 → /CE
  • /OE → +5V
  • /WE → GND

Модуль сопряжения I2C

Протокол I2C реализован программным методом («ногодрыгом») через параллельный интерфейс ВВ55. Для работы требуется добавить в схему ЭВМ простейший модуль сопряжения:

Протокол I2C для i8080 Примечание: Сопротивление подтягивающих резисторов можно уменьшить до 4.7 кОм.


💻 Справочник команд

Горячие клавиши

  • Ф1 — Вызов справки (HELP)
  • СТР — Очистка экрана (CLS)
  • HOME — Переключение в видеорежим без межстрочных интервалов
  • Стрелка вверх — Повтор последней команды
  • Стрелка вниз — Вывод текущего пути

Файловая система и навигация

Команда Описание
><имя.расширение> Быстрое открытие файла с указанным именем ABC*. Поддерживаются: .TXT, .SCP, .WBM, .BIN, .RK*
/ Установка текущего рабочего пути
CAT Просмотр каталога файлов корневой директории
MCAT <имя> Создание каталога с указанным именем
ERASE <имя.расширение> Удаление файла или каталога
LOAD <адрес> <имя.расширение> Загрузка файла в ОЗУ по указанному HEX-адресу
SAVE <адрес> <длина> <имя.расширение> Сохранение области памяти в файл (адрес и длина в HEX)
CALL <имя.расширение> [L] Загрузка файла в ОЗУ и его запуск. Ключ L — режим совместимости
VIEW <имя.расширение> Загрузка и просмотр текстового файла
SCP <имя.расширение> Загрузка и интерпретация сценария (скрипта)
WBMP <имя.расширение> Загрузка и отображение картинки формата WBMP
HELP Вызов файла справки

Работа с памятью и портами ввода-вывода

Команда Описание
CHKMEM Тестирование и проверка оперативной памяти
SYSINFO Вывод таблицы текущих системных настроек
DUMP <старт> <конец> Просмотр дампа памяти в HEX-формате между адресами
READ <адрес> Чтение байта из ячейки памяти, вывод на экран и запись в переменную
WRITE <адрес> [данные...] Запись массива HEX-данных в ОЗУ. Если данные не указаны, запишется значение переменной
IN <адрес> <начало> <конец> Чтение данных из ППА порт A (адреса на портах BC начало/конец) в ОЗУ по указанному адресу
OUT <адрес> <конец> <начало> Вывод данных в ППА порт A из ОЗУ (адреса на портах BC начало/конец) с одновременным выводом дампа
JUMP <адрес> [L] Безусловный переход по HEX-адресу. Ключ L — режим совместимости

Интерфейс, звук и переменные

Команда Описание
CLS Очистка экрана
FLUSH <N> Прокрутка (скролл) текста вверх на N строк
CARRIAGE <YYXX> Установка каретки в координаты YY (строка), XX (столбец)
TEXT <адрес> [!] Печать строки с HEX-адреса. Ключ ! — вывод с текущей позиции курсора
NL Перевод каретки (новая строка)
XCG Переключение знакогенератора (смена шрифта)
POINTER <адрес> Установка указателя на строку/шаблон по адресу
LEDON / LEDOFF Включение / выключение светодиода РУС/ЛАТ
BEEP <длина> <тон> Звуковой сигнал (параметры в HEX)
PEW <длина> <тон> Альтернативный звуковой сигнал (эффект, параметры в HEX)
DELAY <A> Задержка выполнения на A кадров
VAR <значение> Прямая запись HEX-значения в системную переменную
MVAR <значение> Логическое И (маскирование) переменной с указанным значением
IVAR Чтение HEX-параметра из командной строки и его запись в переменную
CVAR Чтение символьного параметра из командной строки и его запись в переменную
KEYSCAN Ожидание нажатия клавиши и запись её кода в переменную
IF <значение> <команда> Сравнение переменной со значением. При совпадении выполняется команда
TASK <адрес> Задание адреса фоновой задачи, выполняемой во время простоя

Управление шиной I2C

Команда Описание
I2CSTART <адрес> Старт-условие и выбор I2C-устройства по HEX-адресу
I2CSTOP Стоп-условие, перевод линии передачи в режим ожидания
I2CTX [данные...] Передача данных. Если аргумент пуст, передается значение переменной
I2CRX [!] Прием данных в переменную. Ключ ! — прием без подтверждения (NACK)

Системные утилиты

Команда Описание
MONITOR Выход из ОС в штатную управляющую программу «Монитор» ЭВМ

🛠 Программирование и интеграция с ОС

Вызов команд ОС из внешних программ

Внешнее ПО может использовать парсер команд ОС. Для этого в регистровую пару HL передается адрес строки с командой (строка должна оканчиваться байтом $00), после чего выполняется CALL на точку входа Адрес ОС + 3.

Пример для ЭВМ Радио-86РК:

ORIGIN          equ $0000
OS              equ $E000

ORG ORIGIN
                LXI H, CMD_TITLE  ; Загружаем адрес команды
                CALL OS + 3       ; Вызываем интерпретатор ОС
                RET

CMD_TITLE:      db 'TEXT 1000', $00; Вызвать команду TEXT для адреса $1000

ORG $1000
TXT_TITLE:      db 'HELLO WORLD!!!', $0A, $0D, $00

Интересная особенность: При вызове команды CALL в регистр процессора A автоматически записывается текущее значение внутреннего счетчика тактов ОС. Это удобно использовать в качестве сида (seed) для генераторов псевдослучайных чисел (ГПСЧ).

Сценарии (Скрипты)

Если в .SCP сценарии перед командой указан символ @, то для этой строки отключается вывод эха в консоль.

ОС поддерживает одну системную переменную. В неё пишутся результаты команд READ, KEYSCAN и I2CRX. Команда IF сравнивает значение этой переменной, а команды WRITE и I2CTX, вызванные без параметров, берут данные из неё. К примеру, WRITE 0000 запишет байт из переменной в адрес $0000.

Фоновые задачи

Выполнение простых фоновых подпрограмм происходит автоматически в цикле опроса клавиатуры. Если пользователь не нажимает клавиши, ОС непрерывно выполняет инструкцию CALL по адресу, предварительно заданному командой TASK.


📊 Текстовый шаблонизатор

Для экономии памяти и удобного вывода структурированных данных (например, таблиц или списков) в ОС встроен шаблонизатор. Текстовая строка шаблона всегда должна завершаться байтом $00.

Управляющие символы общего назначения:

  • $09 — Табуляция (фиксированная, 8 символов)
  • $0A — Перевод строки (LF)
  • $0D — Возврат каретки (CR)
  • $80 — Взять следующий за этим кодом байт и вывести как HEX
  • $81 — Взять следующее за этим кодом слово и вывести как DEC
  • $DF — Интерактивная пауза (ожидание нажатия любой клавиши)

Динамические макросы (работают в связке с адресом из POINTER):

Конструкция берет данные из памяти со смещением относительно адреса, заданного командой POINTER.

  • $F0–$FF — Вывод ASCII-символа из структуры со смещением 0..F
  • $E0–$EF — Вывод HEX-значения байта со смещением 0 ..F
  • $D0–$D7 — Вывод DEC-значения слова со смещением 0..8
  • $DB — Вывод значения по адресу POINTER в бинарном виде (BIN)
  • $D8 — Вывод самого адреса POINTER в формате HEX

Пример шаблона для вывода строки каталога файлов:

; Имя файла (8+3 байта), пробел, атрибут (HEX), кластер (HEX), длина (DEC), перенос строки
dir_item_tpl: db $F0, $F1, $F2, $F3, $F4, $F5, $F6, $F7, " ", $F8, $F9, $FA, " ", $EB, " ", $ED, $EC, " ", $D7, $0A, $0D, $00*

Для перебора элементов (базы данных или списка файлов) достаточно изменять значение POINTER на следующую структуру и заново отправлять шаблон на печать.

Программирование в среде ОС МИР