Created by Dmitriy Ivanov Fork of the original Project: https://hub.mos.ru/dni-fx/peace-dos
The operating system (OS) is designed for computers based on the i8080 processor (Radio-86RK, Severnaya Palmira, Apogey, Mikrosha, Partner 01.01) and compatible systems using processors such as the KR580VM80A, i8085, Z80, and others. It fits into an 8 KB ROM and provides a minimal set of commands for working with the CH376 file interface.
The system includes an interpreter and a template engine, supports script execution, implements the I2C protocol in software through the i8255 (KR580VV55) parallel port, can display WBMP graphics up to 127×127 pixels, and supports working with files and directories.
The CH376 file module is connected to the computer's system bus according to the module pinout. The INT and RST pins do not need to be connected.
At startup, the OS checks for the presence of the CH376 module and storage media connected to it. If the device is ready, the AUTOEXEC.SCP script is loaded from the storage medium and executed. If the device is unavailable or not ready, the script stored in ROM is executed instead. In that case, disk operations are unavailable.
The operating system is written entirely in assembly language using Pretty Intel 8080 Assembler: https://svofski.github.io/pretty-8080-assembler/
CHKMEM - memory test
SYSINFO - display the system settings table
CLS - clear the screen
FLUSH N - scroll text upward by N lines
CARRIAGE YYXX - set the cursor position
TEXT ХХХХ - print a string starting at address ХХХХ
NL - move to a new line
XCG - switch the character generator
POINTER XXXX - set the string pointer to address XXXX
LEDON - turn on the RUS/LAT LED
LEDOFF - turn off the RUS/LAT LED
BEEP NNMM - sound signal, where NN is the duration and MM is the tone
PEW NNMM - sound signal, where NN is the duration and MM is the tone
DELAY A - delay for A frames
JUMP ХХХХ - unconditional jump to address ХХХХ; key L enables compatibility mode
READ ХХХХ - read a byte from memory address ХХХХ and display it on screen
WRITE XXXX AA BB CC ... - write a data array to RAM starting at address XXXX
IN XXXX YYYY ZZZZ - read data from a port into RAM starting at address XXXX; port addresses range from YYYY to ZZZZ
OUT XXXX YYYY ZZZZ - output data from RAM addresses XXXX through YYYY to the port; the address starting from ZZZZ is output on PB and PC
DUMP AAAA BBBB - display memory from address AAAA through address BBBB
/ - set the current path
CAT - list files in the root directory
MCAT ABCDE - create a directory named ABCDE
ERASE ABCDE - delete a file or directory named ABCDE
HELP - open the help file (F1 key)
LOAD XXXX ABC* - load file ABC* into RAM starting at address XXXX
SAVE XXXX YYYY ABC* - save file ABC* starting at address XXXX with length YYYY
CALL ABC* - load file ABC* into RAM and execute it; key L enables compatibility mode
VIEW ABC* - load text file ABC* into RAM and display it
SCP ABC* - load and interpret script ABC*
WBMP ABC* - load and display an image named ABC*
VAR X - store value X in the variable
MVAR X - logical AND with X (masking)
IVAR - read a HEX command-line parameter and store it in the variable
CVAR - read a character command-line parameter and store it in the variable
KEYSCAN - wait for a key press and display the key code
IF A B - compare the variable with A and execute command B if they match
I2CSTART AA - select a device with address AA
I2CSTOP - put the communication line into the idle state
I2CTX AA BB CC DD... - transmit data
I2CRX - receive data; key ! disables receive acknowledgement
TASK XXXX - execute a task at address XXXX while the system is idle
MONITOR - exit to the Monitor control program
Keys: F1 - help, СТР - clear the screen, HOME - video mode without line spacing, Up Arrow - last command, Down Arrow - current path
If a command in a script is preceded by the @ character, command echo is disabled.
When the CALL command is invoked, the value of the OS internal counter is placed in processor register A. This is convenient for initializing pseudo-random number generators.
The OUT command sends data to the port and simultaneously displays a dump of that data. Port output PC7 emulates the write signal for an external memory IC. The command was designed for programming AT28C64-type memory chips. Connect the chip to the port as follows:
PA0 - PA7 → D0 - D7
PB0 - PB7 → A0 - A7
PC0 - PC4 → A8 - A12
PC7 → /CE
/OE → +5V
/WE → GND
The I2C protocol is implemented by bit-banging the VV55 parallel port. To allow the OS to communicate over I2C, an interface module must be added to the computer circuit:
The pull-up resistor values can be reduced to 4.7 kΩ.
External programs can execute OS commands. To do this, place the address of a string containing the command into the HL register pair. Then call CALL <OS load address> + 3. For example, for the Radio-86RK:
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, $00This allows programs to load files and perform other operations.
The system includes a template engine for working with text. This mechanism reduces the length of strings and makes structured-data output more convenient. A text string must always end with the $00 character. Template control characters:
$09 - tab, 8 characters
$0A - line feed
$0D - carriage return
$80 - output the next byte in HEX format
$81 - output the next word in DEC format
$DF - wait for a key press
The following control characters are used together with POINTER, which points to an array of structured data. Such a construction is called a template.
$F0-$FF - output the character at POINTER + offset 0..F
$E0-EF - output the HEX value of the byte at POINTER + offset 0..F
$DB - output the value at address POINTER in BIN format
$D8 - output POINTER in HEX format
$D0-D7 - output the DEC value of the word at POINTER + offset 0..8
For example, the template for displaying a file directory is the following string:
db $F0, $F1, $F2, $F3, $F4, $F5, $F6, $F7, " ", $F8, $F9, $FA, " ", $EB, " ", $ED, $EC, " ", $D7, $0A, $0D, $00The first 12 bytes output the file name with extension, followed by the file attribute (HEX), the file's starting cluster (HEX), the file length (DEC), and the end-of-line characters.
To display the next line of the file directory, simply move POINTER to the required entry and output the template again. This approach can also be used to display records from a structured database. The OS uses the same mechanism for memory-dump templates and for displaying the lengths of loaded files.
Scripts have exactly one variable. The results of READ, KEYSCAN, and I2CRX operations are stored in this variable. The IF operator compares against this variable. If WRITE or I2CTX is used without an argument, the current variable value is used as the argument. For example, WRITE 0 writes the contents of the variable to memory address zero.
Simple background tasks are executed while the keyboard is being polled. If no keyboard key is pressed, a CALL is made to the address specified by the TASK command.
Операционная система (ОС) разработана для ЭВМ с процессором 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*
VAR X - запись значения X в переменную
MVAR X - логическое И с X (маскирование)
IVAR - чтение HEX параметра командной строки и запись в переменную
CVAR - чтение символьного параметра командной строки и запись в переменную
KEYSCAN - Ожидание нажатия клавиши и вывод кода клавиши
IF A B - сравнение переменной с A и выполнение команды B при условии совпадения
I2CSTART AA - выбрать устройство с адресом AA
I2CSTOP - перевод линии передачи в режим ожидания
I2CTX AA BB CC DD... - передача данных
I2CRX - приём данных, ключ '!' - без подтверждения приёма
TASK XXXX - выполнение задачи по адресу XXXX во время простоя
MONITOR - выход в управляющую программу Монитор
Клавиши: Ф1 - помощь, СТР - очистка экрана, HOME - видеорежим без межстрочных интервалов, стрелка вверх - последняя команда, стрелка вниз - текущий путь
Если в сценарии перед командой стоит символ @, то эхо отключается.
При вызое команды CALL в регистр процессора A записывается значение внутреннего счётчика ОС, это удобно для выставления начальных значений генераторов псевдослучайных чисел.
Команда OUT выдаёт данные в порт и одновременно выводит дамп этих данных. Выход порта PC7 эмулирует сигнал записи во внешнюю микросхему памяти. Команда разработана для прошивки микросхем типа AT28C64. Подключение микросхемы к порту:
PA0 - PA7 → D0 - D7
PB0 - PB7 → A0 - A7
PC0 - PC4 → A8 - A12
PC7 → /CE
/OE → +5V
/WE → GND
Протокол I2C реализован ногодрыгом через параллельный порт ВВ55. Для того, чтобы ОС могла работать по протоколу I2C, необходимо в схему ЭВМ добавить модуль сопряжения:
Сопротивление подтягивающих резисторов можно уменьшить до 4.7 кОм.
Внешние программы могут выполнять команды ОС. Для этого в регистровую пару 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 делает сравнение с этой переменной. Если использовать команды WRITE и I2CTX без аргумента, то аргументом становится значение переменной. Например, команда WRITE 0 запишет в нулевую ячейку памяти содержимое переменной.
Выполнение простых фоновых задач происходит во время опроса клавиатуры. Если клавиши клавиатуры не нажимаются, происходит вызов CALL по адресу заданному командой TASK.
