Краткое руководство по программированию в ОС CP/M 2.2
CP/M (Control Program/Monitor либо Control Programs for Microcomputers) - операционная система, первоначально предназначенная для 8-разрядных микрокомпьютеров. Написана в 1973 году программистом Гэри Килдаллом. Данная ОС является базовой для компьютера КРИСС CP/M.
Структура распределения памяти
Общая структура памяти в ОС 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
Вызов функций BDOS осуществляется командой JP 0005, код функции передается в регистре C.
#d | #h | Вход | Выход | Описание |
---|---|---|---|---|
0 | 00 | - | - | сброс системы (горячий рестарт системы) |
1 | 01 | - | A = введенный символ | ввод с клавиатуры |
2 | 02 | E = выводимый символ | - | вывод на терминал |
3 | 03 | - | A = введенный символ | в КРИСС CP/M устройство назначается в системной консоли |
4 | 04 | E = выводимый символ | - | вывод на внешнее устройство, в КРИСС CP/M устройство назначается в системной консоли |
5 | 05 | E = выводимый символ | - | вывод на печатающее устройство |
6 | 06 | E = 0FFh или символ | A = символ или состояние | ввод/вывод на терминал: E=0FFH - ввод в A символа, либо 00 E=ASCII символ - вывод |
7 | 07 | - | A = IOBYTE | чтение байта управления вводом/выводом |
8 | 08 | E = значение IOBYTE | - | установка байта ввода/вывода |
9 | 09 | DE = адрес строки | - | вывод строки на терминал до символа $ (не печатается) |
10 | 0A | DE = адрес буфера строки | - | ввод строки с клавиатуры в буфер, его структура MX NS C1 .. Cn, MX - размер буфера, NS - число фактически считанных символов C* - символы |
11 | 0B | - | A = FFh/00 есть/нет символ в вводе | опрос состояния клавиатуры |
12 | 0C | - | HL = номер версии ОС | получение номера версии CPM: H=0 - CP/M , H=11 - MP/M, L=20...2F на CP/M 2.0 ... 2.15 |
13 | 0D | - | - | сброс дисковой системы |
14 | 0E | E = дисковод | - | выбор диска, 0-A, 1-B, 2-C, .., 15-P |
15 | 0F | DE = FCB | A = код каталога | открытие файла вход, возвращает 0FFH ,если файл отсутствует |
16 | 10 | DE = FCB | A = код каталога | закрытие файла, возвращает 0FFH, если файл отсутствует |
17 | 11 | DE = FCB | A = код каталога | поиск первого файла в каталоге диска, по текущему адресу DMA заносится запись,содержащая точку входа каталога |
18 | 12 | DE = FCB | A = код каталога | поиск следующего файла - то же что и 17 но с текущего положения в каталоге |
19 | 13 | DE = FCB | A = код каталога | стирание файла, возвращает 0FFH, если файл отсутствует |
20 | 14 | DE = FCB | A = код ошибки | последовательное чтение, файл должен быть открыт, DMA, номер сек. и номер дорожки должен быть установлены, возвращает A=0 если норма и A<>0 если конец файла |
21 | 15 | DE = FCB | A = код ошибки | последовательная запись, файл должен быть открыт, DMA, номер сек. и номер дорожки должен быть установлены, возвращает A=0 если норма и A<>0 если диск полон |
22 | 16 | DE = FCB | A = код каталога | создание файла, возвращает 0FFH, если диск полон |
23 | 17 | DE = FCB | A = код каталога | переименование файла, FCB имеет другую структуру |
24 | 18 | - | HL = состояние | опрос вектора распределения активного дисковода |
25 | 19 | - | A = текущий дисковод | получение активного диска |
26 | 1A | DE = DMA | - | установка адреса DMA |
27 | 1B | - | HL = адрес вектора распределения | получение адреса размещения вектора распределения |
28 | 1C | - | - | защита диска от записи |
29 | 1D | - | HL = адрес вектора распределения | получение вектора дисковода "только чтение" |
30 | 1E | DE = FCB | A = код каталога | установка атрибутов файла |
31 | 1F | - | HL = DPB | получение адреса блока параметров диска |
32 | 20 | E = FF/номер | A = номер пользователя | установка или получение (E=FFh) номера пользователя |
33 | 21 | DE = FCB | A = код каталога | чтение в произвольном порядке |
34 | 22 | DE = FCB | A = код каталога | запись в произвольном порядке |
35 | 23 | DE = FCB | A = код каталога | вычисление размера файла |
36 | 24 | DE = FCB | - | расчет текущего адреса записи |
37 | 25 | DE = DPH | A = 00 | сброс выбранного дисковода |
40 | 28 | DE = FCB | A = код каталога | прямая запись адресованной записи |
Функции BIOS
Вход в BIOS осуществляется посредством вектора перехода, размещенного в определенной ячейке. Адрес "нулевого" вектора WBOOT определяется как 16-битный адрес, расположенный в ячейках ОЗУ 0001, 0002h (байты 0h..2h ОЗУ содержат команду JMP WBOOT).
Описание функций BIOS компьютера КРИСС CP/M не полностью соответствует первоначальной спецификации CP/M 2.2.
# | Мнемоника | Название | Вход | Выход | Описание |
---|---|---|---|---|---|
- | BOOT | холодный старт | - | C = активный дисковод | отвечает за начальную инициализацию системы, включая выдачу сообщения о запуске CP/M. После инициализации управление передается CCP |
0 | WBOOT | горячий старт | - | - | получает управление, когда имеет место повторный старт системы, обычно когда программа пользователя передает управление в ячейку с адресом 0000H - стандартный способ окончания программ пользователя в среде CP/M. По завершении инициализации управление передается в CCP |
1 | CONST | состояние консоли | - | A = 0FFH, если клавиша нажата, иначе 00H | производит опрос активности клавиатуры |
2 | CONIN | ввод символа с консоли | - | A = принятый символ | считывает символ, до этого ожидает нажатия клавиши |
3 | CONOUT | вывод на дисплей | C = символ для вывода | - | выводит символ на экран дисплея |
4 | LIST | вывод на принтер | C = символ для вывода | - | выводит символ на печать. |
5 | PUNCH | вывод на устройство | C = символ для вывода | - | в КРИСС CP/M вывод осуществляется на устройство, назначенное через системную консоль. |
6 | READER | ввод с устройства | - | A = принятый символ | в КРИСС CP/M - ввод с устройства, назначенного через системную консоль, 0, если нет данных на входе. |
7 | HOME | установка дорожки 0 на выбранном диске | - | - | устанавливает указатель дорожки в 0 |
8 | SELDSK | выбор диска | C = номер дисковода | HL = DPH | выбирает дисковод, (C=0 - дисковод "A",C=1 - дисковод "B" и т.д. до "P"). При выборе несуществующего дисковода возвращается HL=0000H |
9 | SETTRK | установка номера дорожки | BC = номер дорожки | - | выбирает дорожку на диске, обычно номер дорожки не превышает 80D |
10 | SETSEC | установка номера сектора | BC = номер сектора | - | выбирает сектор на выбранной дорожке, обычно номер сектора не превышает 26D |
11 | SETDMA | установка адреса DMA | BC = адрес буфера DMA | - | устанавливает адрес прямого доступа в память для последующих операций ввода-вывода с диском |
12 | READ | чтение сектора | - | A = код ошибки, 00, если без ошибки | считывает один сектор 128 байт с диска в ОЗУ, начиная с адреса, установленного в последней операции SETDMA |
13 | WRITE | запись сектора | - | A = код ошибки, 00, если без ошибки | записывает один сектор 128 байт из ОЗУ с адреса, определенного в последней операции SETDMA |
14 | LISTST | чтение порта принтера | - | A = байт данных | в КРИСС CP/M при работе с последовательным портом возвращает последний принятый байт, 00, если нет данных |
15 | SECTRAN | перенумерация секторов | BC, DE | HL = BC | в оригинале осуществляет преобразование логического номера сектора на диске в физический. В КРИСС CP/M не используется, физический и логический адреса совпадают. |