A compact disk operating system (OS) designed for Soviet and Russian retro computers based on the i8080 / KR580VM80A processor and compatible CPUs (i8085, Z80).
The system is written entirely in assembly language using Pretty Intel 8080 Assembler. The entire OS code is optimized to fit into an 8 KB ROM.
- Supported platforms: Radio-86RK, Severnaya Palmira, Apogey, Mikrosha, Partner 01.01, and compatible systems.
- File interface: File and directory operations through the popular CH376 controller.
- Scripting and automation: Support for scripts (command files), with a built-in interpreter and text-output template engine.
- Hardware emulation: Software implementation of the I2C protocol and an EEPROM programmer through the i8255 (KR580VV55) parallel port.
- Graphics: Viewing monochrome WBMP images up to 127×127 pixels.
- Quasi-multitasking: Execution of simple background tasks while the system is idle (during keyboard polling).
The CH376 file module is connected to the computer system bus according to the module pinout. The INT and RST pins do not need to be connected.
At startup, the OS automatically checks for the CH376 module and an installed storage medium:
- Device ready: the
AUTOEXEC.SCPscript is automatically loaded from the storage medium and executed. - Device absent/not ready: the fallback script stored in ROM is executed instead (disk operations are disabled in this case).
The OUT command sends data to the port and simultaneously displays a dump of that data. Port output PC7 emulates the write signal. The circuit is designed for programming AT28C64-type devices using the following connection to the VV55:
PA0–PA7→D0–D7PB0–PB7→A0–A7PC0–PC4→A8–A12PC7→/CE/OE→+5V/WE→GND
The I2C protocol is implemented in software ("bit-banging") through the VV55 parallel interface. To use I2C, a simple interface module must be added to the computer circuit:
Note: The pull-up resistor values can be reduced to 4.7 kΩ.
F1— Open help (HELP)СТР— Clear the screen (CLS)HOME— Switch to video mode without line spacingUp Arrow— Repeat the last commandDown Arrow— Display the current path
| Command | Description |
|---|---|
><name.extension> |
Quickly open a file with the specified name ABC*. Supported: .TXT, .SCP, .WBM, .BIN, .RK* |
/ |
Set the current working path |
CAT |
Display the files in the root directory |
MCAT <name> |
Create a directory with the specified name |
ERASE <name.extension> |
Delete a file or directory |
LOAD <address> <name.extension> |
Load a file into RAM at the specified HEX address |
SAVE <address> <length> <name.extension> |
Save a memory region to a file (address and length are in HEX) |
CALL <name.extension> [L] |
Load a file into RAM and execute it. L enables compatibility mode |
VIEW <name.extension> |
Load and view a text file |
SCP <name.extension> |
Load and interpret a script |
WBMP <name.extension> |
Load and display a WBMP image |
HELP |
Open the help file |
| Command | Description |
|---|---|
CHKMEM |
Test and verify RAM |
SYSINFO |
Display the current system-settings table |
DUMP <start> <end> |
Display a HEX memory dump between the specified addresses |
READ <address> |
Read a byte from memory, display it on screen, and store it in the variable |
WRITE <address> [data...] |
Write an array of HEX data to RAM. If no data is specified, the variable value is written |
IN <address> <start> <end> |
Read data from PPI port A into RAM at the specified address (BC port addresses specify start/end) |
OUT <address> <end> <start> |
Output data from RAM to PPI port A (BC port addresses specify start/end), while simultaneously displaying a dump |
JUMP <address> [L] |
Unconditional jump to the specified HEX address. L enables compatibility mode |
| Command | Description |
|---|---|
CLS |
Clear the screen |
FLUSH <N> |
Scroll text upward by N lines |
CARRIAGE <YYXX> |
Set the cursor to coordinates YY (row), XX (column) |
TEXT <address> [!] |
Print a string from the specified HEX address. ! outputs from the current cursor position |
NL |
Carriage return / new line |
XCG |
Switch the character generator (change font) |
POINTER <address> |
Set the pointer to a string/template at the specified address |
LEDON / LEDOFF |
Turn the RUS/LAT LED on / off |
BEEP <length> <tone> |
Sound signal (parameters in HEX) |
PEW <length> <tone> |
Alternative sound signal/effect (parameters in HEX) |
DELAY <A> |
Delay execution for A frames |
VAR <value> |
Directly write a HEX value to the system variable |
MVAR <value> |
Logical AND (masking) of the variable with the specified value |
IVAR |
Read a HEX parameter from the command line and store it in the variable |
CVAR |
Read a character parameter from the command line and store it in the variable |
KEYSCAN |
Wait for a key press and store its code in the variable |
IF <value> <command> |
Compare the variable with the specified value. If they match, execute the command |
TASK <address> |
Set the address of a background task executed while the system is idle |
| Command | Description |
|---|---|
I2CSTART <address> |
Generate a start condition and select an I2C device by HEX address |
I2CSTOP |
Generate a stop condition and place the bus in the idle state |
I2CTX [data...] |
Transmit data. If no argument is given, the variable value is transmitted |
I2CRX [!] |
Receive data into the variable. ! receives without acknowledgement (NACK) |
| Command | Description |
|---|---|
MONITOR |
Exit the OS to the computer's standard Monitor control program |
External software can use the OS command parser. Place the address of a string containing the command into the HL register pair (the string must end with byte $00), then execute a CALL to the entry point OS address + 3.
Example for the Radio-86RK:
ORIGIN equ $0000
OS equ $E000
ORG ORIGIN
LXI H, CMD_TITLE ; Load the command address
CALL OS + 3 ; Call the OS interpreter
RET
CMD_TITLE: db 'TEXT 1000', $00; Call the TEXT command for address $1000
ORG $1000
TXT_TITLE: db 'HELLO WORLD!!!', $0A, $0D, $00Interesting feature: When the CALL command is invoked, the current value of the OS internal tick counter is automatically placed in processor register A. This is convenient as a seed for pseudo-random number generators (PRNGs).
If a command in an .SCP script is preceded by the @ character, console echo is disabled for that line.
The OS supports one system variable. The results of the READ, KEYSCAN, and I2CRX commands are stored in it. The IF command compares against this variable, while WRITE and I2CTX, when called without parameters, use the value stored in it. For example, WRITE 0000 writes the byte from the variable to address $0000.
Simple background routines are executed automatically during the keyboard-polling loop. If the user does not press a key, the OS continuously executes a CALL to the address previously set by the TASK command.
To save memory and make structured data (for example, tables or lists) easier to display, the OS includes a template engine. A template text string must always end with byte $00.
$09— Tab (fixed width, 8 characters)$0A— Line feed (LF)$0D— Carriage return (CR)$80— Take the following byte and display it as HEX$81— Take the following word and display it as DEC$DF— Interactive pause (wait for any key press)
The construct reads data from memory using offsets relative to the address set by the POINTER command.
$F0–$FF— Display an ASCII character from the structure at offset0..F$E0–$EF— Display the HEX value of a byte at offset0..F$D0–$D7— Display the DEC value of a word at offset0..8$DB— Display the value at addressPOINTERin binary format (BIN)$D8— Display thePOINTERaddress itself in HEX format
Example template for displaying a file-directory entry:
; File name (8+3 bytes), space, attribute (HEX), cluster (HEX), length (DEC), newline
dir_item_tpl: db $F0, $F1, $F2, $F3, $F4, $F5, $F6, $F7, " ", $F8, $F9, $FA, " ", $EB, " ", $ED, $EC, " ", $D7, $0A, $0D, $00*To iterate through entries (for example, database records or files), simply change POINTER to the next structure and send the template for output again.
Компактная дисковая операционная система (ОС), разработанная для отечественных ретро-ЭВМ на базе процессора i8080 / КР580ВМ80А и совместимых с ними (i8085, Z80).
Система полностью написана на ассемблере в среде Прекрасный Ассемблер (Pretty Intel 8080 Assembler). Весь код ОС оптимизирован и помещается в ПЗУ объёмом 8 КБ.
- Поддерживаемые платформы: Радио-86РК, Северная Пальмира, Апогей, Микроша, Партнёр 01.01 и аналоги.
- Файловый интерфейс: Работа с файлами и каталогами через популярный контроллер CH376.
- Скриптинг и автоматизация: Поддержка выполнения сценариев (командных файлов), встроенный интерпретатор и шаблонизатор текстового вывода.
- Аппаратная эмуляция: Программная реализация протокола I2C и программатора EEPROM через параллельный порт i8255 (КР580ВВ55).
- Графика: Просмотр монохромных изображений формата WBMP размером до 127×127 пикселей.
- Квази-многозадачность: Выполнение простых фоновых задач во время простоя (опроса клавиатуры).
Файловый модуль CH376 подключается к системной шине ЭВМ согласно распиновке модуля. Выводы INT и RST подключать не нужно.
При запуске ОС автоматически определяет наличие модуля CH376 и установленного носителя информации:
- Устройство готово: с носителя автоматически загружается и выполняется сценарий
AUTOEXEC.SCP. - Устройство отсутствует/не готово: выполняется резервный сценарий из ПЗУ (в этом случае дисковые операции блокируются).
Команда OUT выдает данные в порт и одновременно отображает их дамп. Выход порта PC7 эмулирует сигнал записи. Схема разработана для прошивки микросхем типа AT28C64 со следующим подключением к ВВ55:
PA0–PA7→D0–D7PB0–PB7→A0–A7PC0–PC4→A8–A12PC7→/CE/OE→+5V/WE→GND
Протокол I2C реализован программным методом («ногодрыгом») через параллельный интерфейс ВВ55. Для работы требуется добавить в схему ЭВМ простейший модуль сопряжения:

Ф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 <адрес> |
Задание адреса фоновой задачи, выполняемой во время простоя |
| Команда | Описание |
|---|---|
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.
$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 на следующую структуру и заново отправлять шаблон на печать.