Copyleft HUMONGOUS CP/M Archives
При поддержке журналаRadio Magazine
RU | EN

CRISS CP/M

Краткое руководство по программированию в ОС CP/M 2.2

CP/M (Control Program/Monitor либо Control Programs for Microcomputers) - операционная система, первоначально предназначенная для 8-разрядных микрокомпьютеров. Написана в 1973 году программистом Гэри Килдаллом. Данная ОС является базовой для компьютера КРИСС CP/M.

Команды CCP

После включения компьютера КРИСС CP/M загрузится в командную строку. На экране появится приглашение, например:

A>

Это означает, что система готова к вводу команд, а текущий диск - A:.

Далее приведены только базовые команды CCP (Console Command Processor) в CP/M 2.2. CCP -- это часть CP/M, которая обрабатывает команды, введённые пользователем в командной строке. Эти команды встроены в CCP и доступны сразу после загрузки CP/M.

Команда Описание Пример использования
DIR Вывод списка файлов на текущем диске. DIR (список файлов на диске A:).
ERA Удаление файла. ERA FILE.TXT (удаляет файл FILE.TXT).
REN Переименование файла. REN NEW.TXT=OLD.TXT (переименовывает OLD.TXT в NEW.TXT).
TYPE Вывод содержимого текстового файла на экран. TYPE README.TXT (выводит содержимое файла README.TXT).
SAVE Сохранение данных из памяти в файл. SAVE 10 FILE.BIN (сохраняет 10 страниц памяти в файл FILE.BIN).
USER Установка или получение текущего кода пользователя (0--15). USER 1 (переключает на пользователя 1).
Буква_диска: Смена текущего диска. B: (переключает на диск B:).

Стандартной команды копирования в CP/M нет, используйте специальные программы такие как PIP или POWER.

После смены диска приглашение командной строки изменится. Например, если вы переключились на диск B:, приглашение будет выглядеть как B>.

Структура распределения памяти

Общая структура памяти в ОС CP/M имеет следующий вид (взято отсюда) :

CP/M RAM

В компьютере КРИСС CP/M размер ОЗУ равен 64 Кб (FFFFh) Область в адресах 0000H - 0100H является служебной ОС CP/M. Конкретные значения адресов расположения модулей CCP, BDOS, BIOS зависят от конкретной реализации ОС.

АдресКомандаОписание
0000 - 0002 JMP WBOOT горячий старт
0004 DS номер текущего диска
0005 - 0007 JMP BDOS системные вызовы
0038 - 003A JMP MONITOR переход к процедурам отладчика
005C - 007C FCB блок описания файла FCB по умолчанию
0080 - 00FF DMABUF буфер обмена с диском по умолчанию
0100 - **** TPA область пользовательских программ
CCP - **** CCP процессор консольных команд
BDOS - **** BDOS BDOS
BIOS - **** BDOS BIOS
F800 - FFFF VIDEO Область памяти экрана

Функции BDOS (DS)

Для вызова функции BDOS в программе на ассемблере Z80 используется команда CALL 5 с предварительной установкой номера функции в регистре C и параметров в других регистрах.

Пример (вывод строки на консоль):

LD C, 9 ; Номер функции: Print String LD DE, message ; Адрес строки, заканчивающейся символом '$' CALL 5 ; Вызов BDOS RET message: DB "Hello, CP/M!$"

Номер функции Номер (hex) Имя функции Входные параметры Возвращаемое значение Описание
0 00h System Reset Нет Нет Завершение программы и возврат в CP/M.
1 01h Console Input Нет A = введённый символ Чтение символа с консоли (клавиатуры).
2 02h Console Output E = символ для вывода Нет Вывод символа на консоль (экран).
3 03h Reader Input Нет A = введённый символ Чтение символа с устройства чтения (например, считывателя бумажной ленты).
4 04h Punch Output E = символ для вывода Нет Вывод символа на устройство вывода (например, перфоратор).
5 05h List Output E = символ для вывода Нет Вывод символа на устройство печати (принтер).
6 06h Direct Console I/O E = 0xFF (ввод) или E = символ для вывода A = введённый символ (если E = 0xFF) Прямой ввод/вывод на консоль (без буферизации).
7 07h Get I/O Byte Нет A = текущее значение байта ввода/вывода Получение текущего значения байта ввода/вывода.
8 08h Set I/O Byte E = новое значение байта ввода/вывода Нет Установка значения байта ввода/вывода.
9 09h Print String DE = адрес строки, заканчивающейся символом $ Нет Вывод строки на консоль.
10 0Ah Read Console Buffer DE = адрес буфера для ввода A = количество введённых символов Чтение строки с консоли в буфер.
11 0Bh Get Console Status Нет A = 0xFF (если есть ввод), иначе 0x00 Проверка состояния консоли (есть ли ввод с клавиатуры).
12 0Ch Return Version Number Нет HL = номер версии CP/M (старший байт = 0x22 для CP/M 2.2) Возврат номера версии CP/M.
13 0Dh Reset Disk System Нет Нет Сброс дисковых систем (очистка буферов и сброс дисков).
14 0Eh Select Disk E = номер диска (0 = A:, 1 = B:, и т.д.) Нет Выбор диска.
15 0Fh Open File DE = адрес FCB (File Control Block) A = код ошибки (0 = успешно) Открытие файла.
16 10h Close File DE = адрес FCB A = код ошибки (0 = успешно) Закрытие файла.
17 11h Search for First DE = адрес FCB A = код ошибки (0xFF = файл не найден) Поиск первого файла, соответствующего маске.
18 12h Search for Next DE = адрес FCB A = код ошибки (0xFF = файл не найден) Поиск следующего файла, соответствующего маске.
19 13h Delete File DE = адрес FCB A = код ошибки (0 = успешно) Удаление файла.
20 14h Read Sequential DE = адрес FCB A = код ошибки (0 = успешно) Последовательное чтение из файла.
21 15h Write Sequential DE = адрес FCB A = код ошибки (0 = успешно) Последовательная запись в файл.
22 16h Make File DE = адрес FCB A = код ошибки (0 = успешно) Создание нового файла.
23 17h Rename File DE = адрес FCB A = код ошибки (0 = успешно) Переименование файла.
24 18h Return Login Vector Нет HL = битовая маска активных дисков Возврат битовой маски активных дисков.
25 19h Return Current Disk Нет A = номер текущего диска (0 = A:, 1 = B:) Возврат номера текущего диска.
26 1Ah Set DMA Address DE = адрес DMA Нет Установка адреса DMA (Direct Memory Access) для операций с диском.
27 1Bh Get Addr (Alloc) Нет HL = адрес таблицы распределения дискового пространства Возврат адреса таблицы распределения дискового пространства.
28 1Ch Write Protect Disk E = 0 (снять защиту), 1 (установить защиту) Нет Установка защиты диска от записи.
29 1Dh Get R/O Vector Нет HL = битовая маска дисков, защищённых от записи Возврат битовой маски дисков, защищённых от записи.
30 1Eh Set File Attributes DE = адрес FCB A = код ошибки (0 = успешно) Установка атрибутов файла.
31 1Fh Get Addr (Disk Params) Нет HL = адрес параметров диска Возврат адреса параметров диска.
32 20h Set/Get User Code E = 0xFF (получить код), иначе E = новый код A = текущий код пользователя Установка или получение текущего кода пользователя (0--15).
33 21h Read Address DE = адрес FCB A = код ошибки (0 = успешно) Чтение адресного блока данных из файла.
34 22h Write Address DE = адрес FCB A = код ошибки (0 = успешно) Запись адресного блока данных в файл.
35 23h Compute File Size DE = адрес FCB A = код ошибки (0 = успешно) Вычисление размера файла в блоках.
36 24h Set Address Record DE = адрес FCB Нет Установка текущей позиции для операций адресного доступа.

FCB (File Control Block) -- структура данных, используемая для работы с файлами. Обычно занимает 36 байт.

DMA (Direct Memory Access) -- адрес в памяти, куда читаются или откуда записываются данные.

Функции BIOS (DS)

В таблице функций BIOS нумерация начинается с -1 (холодный старт), как это принято в документации CP/M.

Номер функции Номер (hex) Имя функции Входные параметры Возвращаемое значение Описание
-1 FFh BOOT Нет Нет Начальная загрузка системы (холодный старт).
0 00h WBOOT Нет Нет Перезагрузка системы (тёплый старт).
1 01h CONST Нет A = 0xFF (если есть ввод), иначе 0x00 Проверка состояния консоли (есть ли ввод с клавиатуры).
2 02h CONIN Нет A = введённый символ Чтение символа с консоли (клавиатуры).
3 03h CONOUT C = символ для вывода Нет Вывод символа на консоль (экран).
4 04h LIST C = символ для вывода Нет Вывод символа на устройство печати (принтер).
5 05h PUNCH C = символ для вывода Нет Вывод символа на устройство вывода (например, перфоратор).
6 06h READER Нет A = введённый символ Чтение символа с устройства чтения (например, считывателя бумажной ленты).
7 07h HOME Нет Нет Перемещение головки диска на нулевую дорожку.
8 08h SELDSK C = номер диска (0 = A:, 1 = B:, и т.д.) HL = адрес таблицы параметров диска Выбор диска и возврат адреса таблицы параметров.
9 09h SETTRK BC = номер дорожки Нет Установка номера дорожки для операций чтения/записи.
10 0Ah SETSEC BC = номер сектора Нет Установка номера сектора для операций чтения/записи.
11 0Bh SETDMA BC = адрес DMA Нет Установка адреса DMA (Direct Memory Access) для операций чтения/записи.
12 0Ch READ Нет A = код ошибки (0 = успешно) Чтение сектора с диска в память.
13 0Dh WRITE Нет A = код ошибки (0 = успешно) Запись сектора из памяти на диск.
14 0Eh LISTST Нет A = состояние устройства печати (0xFF = готово, иначе 0x00) Проверка состояния устройства печати (принтера).
15 0Fh SECTRAN BC = адрес таблицы перевода, DE = номер сектора HL = переведённый номер сектора Перевод логического номера сектора в физический.

Пример прямого вызова функции BIOS вывода на консоль:

LD C, 'A' ; Загружаем символ 'A' в регистр C (символ для вывода)   ; Получаем адрес таблицы переходов BIOS LD HL, (0001h) ; Загружаем адрес WBOOT из ячейки 0001h LD DE, 9 ; Смещение для CONOUT в таблице переходов (3 функции * 3 байта) ADD HL, DE ; Вычисляем адрес перехода для CONOUT   ; Вызываем CONOUT через таблицу переходов CALL HL ; Вызываем BIOS напрямую  

© Copyright Radio / Радио / OGSS / НГСС / I. Reshetnikov / Решетников И.С. 2020-2022