Д

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

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

Операционная система (ОС) разработана для ЭВМ с процессором i8080 (Радио-86РК, Северная Пальмира, Апогей, Микроша, Партнёр 01.01) и аналогичных: КР580ВМ80А, i8085, Z80 и другие. Помещается в ПЗУ объёмом 8 кб. Обеспечивает минимальный набор команд для работы с файловым интерфейсом CH376.

Система имеет интерпретатор, шаблонизатор, поддерживает выполнение сценариев, программно эмулирует протокол I2C через параллельный порт i8255 (КР580ВВ55), позволяет просматривать графику формата WBMP в размере до 127х127 пикселей, поддерживает работу с файлами и каталогами.

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

При запуске ОС определит наличие модуля CH376 и носителя информации в нём. Если устройство готово к работе, с носителя информации будет загружен и выполнен сценарий AUTOEXEC.SCP. Если устройство не готово к работе или отсутствует, будет выполнен сценарий из ПЗУ. В этом случае дисковые операции будут недоступны.

Операционная система полность написана на ассемблере в среде Прекрасный Ассемблер (Pretty Intel 8080 Assembler): https://svofski.github.io/pretty-8080-assembler/

Список команд:

CHKMEM - проверка памяти
SYSINFO - вывод таблицы системных настроек

CLS - очистка экрана
FLUSH N - скролл текста вверх на N строк
CARRIAGE YYXX - установка каретки
TEXT ХХХХ - печать строки с адреса ХХХХ
NL - перевод каретки
XCG - переключение знакогонератора
POINTER XXXX - установка указателя на строку по адресу XXXX

LEDON - включить светодиод РУС/ЛАТ
LEDOFF - выключить светодиод РУС/ЛАТ

BEEP NNMM - звуковой сигнал, где NN - длительность, MM - тон
PEW NNMM - звуковой сигнал, где NN - длительность, MM - тон
DELAY A - задержка на A кадров

JUMP ХХХХ - безусловный переход на адрес ХХХХ, ключ 'L' - режим совместимости
READ ХХХХ - чтение байта из ячейки памяти ХХХХ и вывод на экран
WRITE XXXX AA BB CC ... - запись массива данных в ОЗУ с адреса XXXX
IN XXXX YYYY ZZZZ - чтение данных из порта в ОЗУ с адреса XXXX, адреса на порту с YYYY по ZZZZ
OUT XXXX YYYY ZZZZ - вывод данных в порт из ОЗУ с адреса XXXX по YYYY на PB и PC выводится адрес начиная с ZZZZ
DUMP AAAA BBBB - просмотр памяти с адреса AAAA по адрес BBBB

/ - установка текущего пути

CAT - каталог файлов корневой директории
MCAT ABCDE - создание каталога с именем ABCDE
ERASE ABCDE - удаление файла или каталога каталога с именем ABCDE
HELP - вызов файла справки (клавиша Ф1)
LOAD XXXX ABC* - загрузка файла ABC* в ОЗУ с адреса XXXX
SAVE XXXX YYYY ABC* - сохранение файла ABC* с адреса XXXX и длиной YYYY
CALL ABC* - загрузка файла ABC* в ОЗУ и вызов, ключ 'L' - режим совместимости
VIEW ABC* - загрузка текстового файла ABC* в ОЗУ и просмотр
SCP ABC* - загрузка и интерпретация сценария ABC*

WBMP ABC* - загрузка и отображение картинки с именем ABC*

PVAR - вывод символа из переменной на экран
KEYSCAN - Ожидание нажатия клавиши и вывод кода клавиши
IF A B - сравнение переменной с A и выполнение команды B при условии совпадения

I2CSTART AA - выбрать устройство с адресом AA
I2CSTOP - перевод линии передачи в режим ожидания
I2CTX AA BB CC DD... - передача данных
I2CRX - приём данных, ключ '!' - без подтверждения приёма

MONITOR - выход в управляющую программу Монитор

Клавиши: Ф1 - помощь, СТР - очистка экрана, HOME - видеорежим без межстрочных интервалов, стрелка вверх - последняя команда, стрелка вниз - текущий путь

Особенности

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

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

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

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

Внешние программы могут выполнять команды ОС. Для этого в регистровую пару HL нужно поместить адрес строки, в которой написана команда. Далее нужно сделать вызов 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;

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

Таким образом программы могут загружать файлы и выполнять иные операции.

Для работы с текстами в системе предусмотрен шаблонизатор. Данный механизм позволяет экономить длину строк, и делает вывод структурированных данных удобным. Текстовая строка всегда должна заканчиваться символом $00. Управляющие символы шаблонизатора:

$09 - табуляция, 8 символов
$0A - перевод строки
$0D - возврат каретки
$80 - вывод следующего байта в формате HEX
$81 - вывод следующего слова в формате DEC
$DF - ожидание нажатия клавиши

Следующие управляющие символы используются вместе с указателем на массив структурированных данных - POINTER. Такая конструкция называется шаблон.

$F0-$FF - вывод символа с позиции POINTER + смещение 0..F
$E0-EF - вывод HEX значения байта с позиции POINTER + смещение 0..F
$DB - вывод значения по адресу POINTER в BIN
$D8 - вывод POINTER в формате HEX
$D0-D7 - вывод DEC значения слова с позиции POINTER + смещение 0..8

Таким образом, шаблон для вывода каталога файлов будет выглядеть, как строка:

db $F0, $F1, $F2, $F3, $F4, $F5, $F6, $F7, " ", $F8, $F9, $FA, " ", $EB, " ", $ED, $EC, " ", $D7, $0A, $0D, $00

— где первые 12 байт выводят имя файла с расширением, далее атрибут файла (HEX), начальный кластер файла (HEX), длина файла (DEC) и конец строки.

Чтобы вывести на экран следующую строку каталога файлов, достаточно переместить POINTER на нужную запись и снова вызвать вывод шаблона. Так можно делать вывод записей структурированной базы данных. Аналогично в ОС реализованы шаблоны вывода дампа и вывода длины загружаемых файлов.

Для работы в сценариях есть одна единственная переменная. В эту переменную записываются результаты операций READ, KEYSCAN и I2CRX. Оператор IF делает сравнение с этой переменной. Оператор PVAR выводит литерное значение переменной в командную строку, например это удобно после приёма данных оператором I2CRX, если нужно считать и отобразить строку текста из устройства.

Выполнение простых фоновых задач происходит во время опроса клавиатуры. Если клавиши клавиатуры не нажимаются, происходит вызов CALL по адресу VECTOR. По этому адресу можно разместить дирестиву JMP и передать управление своему обработчику.