Краткое руководство по программированию в ОС 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 размер ОЗУ равен 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 напрямую




