  Краткое описание операционной системы CP/M 
                    версии 2.2 
 
 
                   10.09.1987. 
  
                     B I O S  
 
 
                точки входа в BIOS 
 
     вход   в   BIOS  осуществляется   посредством   вектора 
перехода,   размещенного  в  определенной ячейке. Адрес первого
вектора (холодный старт системы) определяется как 16-битный адрес,
расположенный в ячейках ОЗУ 0001, 0002h минус 3 (байты 0h..2h ОЗУ
содержат команду JMP WBOOT). 
 
       Вектор переходов имеет следующий вид : 
 
      JMP       BOOT      ; холодный старт системы 
      JMP       WBOOT     ; горячий старт системы 
      JMP       CONST     ; состояние консоли 
      JMP       CONIN     ; ввод символа с консоли 
      JMP       CONOUT    ; вывод на дисплей 
      JMP       LIST      ; вывод на принтер 
      JMP       PUNCH     ; вывод на магнитофон 
      JMP       READER    ; ввод с магнитофона 
      JMP       HOME      ; установка дорожки 0 на выбранном диске 
      JMP       SELDSK    ; выбор диска 
      JMP       SETTRK    ; установка   номера  дорожки 
      JMP       SETSEK    ; установка номера сектора 
      JMP       SETDMA    ; установка адреса пдп 
      JMP       READ      ; чтение выбранного сектора 
      JMP       WRITE     ; запись  выбранного  сектора 
      JMP       LISTST    ; состояние принтера 
      JMP       SECTRAN   ; перенумерация секторов 
 
     каждый   адрес   перехода   соответствует    конкретной 
подпрограмме,   которая   выполняет  определенную   функцию. 
Таблица переходов делится на три основные части : 
     -    реинициализация системы ( вызовы BOOT и WBOOT ) 
     -    ввод-вывод    байтовой    информации   (    вызовы 
          CONST,CONIN,CONOUT,LIST,PUNCH,READER и LISTST ) 
     -    блочный  ввод-вывод для обмена с диском  (  вызовы 
          HOME,SELDSK,SETTRK,SETSEC,SETDMA,READ,WRITE      и 
          SECTRAN ) 
     все  консольные  и листинговые операции  выполняются  в 
коде  ASCII (кои-7),  со сброшеным в 0 битом четности  (D7). 
Условием  конца текстового файла в сP/M авляется включение в 
файл кода (1B HEX) ^Z в коде ASCII.  Периферийные устройства 
воспринимаются   CP/M   как   "логические"   устройства    и 
отображаятся  на  физические устройства  только  посредством 
модуля BIOS.  
     Если  устройства LIST (принтер) ,  PUNCH (магнитофон на 
вывод  )  и READER ( магнитофон на ввод)  отсутствуют  ,  TO 
подпрограммы  LIST  и PUNCH можно реализовать в  виде  одной 
команды  RET  ,  а  подпрограмма  реадер  должна  вернуть  в 
регистре а код 1A HEX. 
     Обмен с диском всегда осуществляется с помощью  вызовов 
определенных  подпрограмм доступа к диску,  которые выбирают 
диск,  дорожку,  сектор на диске и устанавливают адрес пдп , 
используемые в данной опереции вода-вывода.  После того  как 
эти   параметры  установлены,   осуществляется  обращение  к 
функциям  READ или WRITE для выполнения собственно  операции 
ввода-вывода с диском.  Примитивы READ и WRITE должны выпол 
нять несколько попыток ( обычно 10 ) прежде,  чем возвратить 
признак  ошибочного  завершения операции (  повтор  неоходим 
только  для  работы  с реадьными дисковыми  накопителями  ). 
Примитив HOME может выполняться как примитив SETTRK с  пара 
метром 0. 
 
               Описание точек входа 
 
     BOOT  -   получает  управление от загрузчика начального 
               старта  системы и отвечает  за  инициализацию 
               основной системы,  включая выдачу сообщения о 
               запуске  CP/M.  После начальной инициализации 
               параметров  системы управление передается CCP 
               для дальнейшей работы. Регистр C перед передачей 
               управления  B CCP должен устанавливаться в  0 
               для выбора дисковода "а". 
 
     WBOOT   - получает   управление,   когда  имеет   место 
               повторный  старт  системы.   Повторный  старт 
               системы   осуществляется,   когда   программа 
               пользователя  передает управление в ячейку  с 
               адресом  0000H (стандартный способ  окончания 
               программ  пользователя  в  среде  CP/M).  При 
               повторном  старте CP/M должна  загружаться  в 
               озу  с системных дорожек диска вплоть до,  но 
               не  ввключая  BIOS.   Параметры  системы  при 
               повторном   старте   должны   устанавливаться 
               следующим образом: 
 
     - ячейки 0,1,2 - установить JMP WBOOT
     - ячейки 5,6,7 - установить JMP BDOS 
 
               по  завершении инициализации программа  WBOOT 
               должна  передать  управление в сср  на  адрес 
               устанавливается  номер текущего дисковода для 
               выбора после инициализации системы. 
 
     CONST   - производит  опрос  активности  клавиатуры   и 
               возвращает в регистре а - 0FFH, если клаввиша 
               клавиатуры нажата, и 00H в противном случае ( 
               по  выполняемой функции анологична  программе 
               0F812H   из  вектора  переходов  стандартного 
               мониора). 
 
     CONIN   - считывает символ с клавиатуры в регистр а,  а 
               до  этого ожидает факта нажатия клавиши (  по 
               выполняемой  функции анологична  подпрограмме 

               0F803H  из  вектора  переходов   стандартного 
               монитора). 
 
     CONOUT  - выводит символ из регистра с на экран дисплея 
               (    по   выполняемой   функкции   анологична 
               подпрограмме  0F809H  из  вектора   переходов 
               стандартного монитора). 
 
     LIST   -  выводит символ из регистра с на печать. 
 
     PUPNCH -  посылает  код из регистра с на  магнитофон  ( 
               программа   по  выполняемой  функции   близка 
               подпрограмме   0F80CH  из  вектора  переходов 
               стандартного монитора).  
 
     READER -  возвращает  в  регистре а  код,  считанный  с 
               магнитофона ; признак конца файла - ^Z(1AH) ( 
               программа   по  выполняемой  функции   близка 
               подпрограмме   0F806H  из  вектора  переходов 
               стандартного монитора). 
 
     HOME   -  помещает  головку  выбранного  дисковода   на 
               дорожку    с   номером   0.    Можно   просто 
               использовать подпрограмму SETTRK с параметром 
               равным 0. 
 
     SELDSK -  выбирает     дисковод,     номер     которого 
               определяется  содержимым  регистра   C,   для 
               последующих   операций  ввода-вывода  (C=0  - 
               выбран дисковод "A",C=1 - выбран дисковод "B" 
               и T.Д.  До дисковода "р"). При каждом вызове, 
               подпрограмма   SELDSK  должна  возвращать   в 
               регистровой  паре  HL  адрес  16-ти  байтовой 
               таблицы, называемой таблицей описания диска ( 
               DISK PARAMETER HEADER). Если делается попытка 
               выбора несуществующего дисковода,  то  SELDSK 
               должна возвратить HL=0000H. 
 
     SETTRK -  выбирает  дорожку  на  диске  по  содержимому 
               регистровой пары вс ( обычно номер дорожки не 
               привышает 80D). 
 
     SETSEC -  выбирает   сектор  на  выбранной  дорожке  по 
               содержимому  регистровой  пары  BC  (  обычно 
               номер сектора не привышает 26D). 
 
     SETDMA -  устанавливает адрес прямого доступа в  память 
               для   последующих  операций  ввода-вывода   с 
               диском по содержимому регистровой пары BC. 
 
     READ   -  подпрограмма  считывает один сектор с диска в 
               озу  начиная  с  адреса,   установленного   в 
               последней   операции   SETDMA  и   заканчивая 
               этим   адресом  +  128   байт.   Подпрограмма 
               возвращает следующие параметры :  
               A=00 - нет ошибок 
               A>0  - ошибка при считывании           
 
     WRITE  -  подпрограмма записывает один сектор из озу (с 
               адреса,  определенного  в последней  операции 
               SETDMA по этот адрес + 128 байт) на сыбранный 
               сектор  выбранной дорожки выбранного диска  ( 
               операции SETDSK,SETTRK,SETSEC).  Возвращаемые 
               параметры аналогичны команде READ. 
      
     LISTST -  должна возвращать в а байт равный 00H 
 
     SECTRAN - осуществляет    преобразование    логического 
               номера   сектора  на  диске  в  физический  ( 
               используется   для   убыстрения   доступа   к 
               информации  на реальном диске  ).  Логический 
               номер     сектора     должен     передаваться 
               подпрограмме в регистровой паре вс,  а  адрес 
               таблицы   перекодировки  номеров  секторов  в 
               регистровой  паре  DE.  Результирующий  номер 
               физического   сектора   должен   возвращаться 
               подпрограммой в регистровой паре HL. 
 
  
               Распределение служебной области CP/M 
                  в адресах 0000H - 0100H    
 
     0000-0002    JMP    WBOOT     ; горячий старт 
     0004         DS     1         ; номер текущего диска 
     0005-0007    JMP    BDOS      ; системные вызовы 
     0038-003A    JMP    MONITOR   ; обычно 0F800H 
     005C-007C    FCB              ; блок описания файла 
     0080-00FF    DMABUF           ; буфер обмена с диском 
 
 
               описание дисковых накопителей в CP/M 
 
     каждый  дисковод  должен иметь сопутствующий  заголовок 
переаметров  диска  DPH  (  16  байт  ),   который  содержит 
информацию   о   данном  дисководе  и   обеспечивает   адрес 
сверхоперативного  участка памяти для служебных  целей  BDOS 
при обмене с диском. 
 
               Формат заголовка параметров диска 
  
     ------------------------------------------------------- 
     I XLT I 0000 I 0000 I 0000 I DIRBUF I DPB I CSV I ALV I 
     I 16B I  16B I  16B I  16B I   16B  I 16B I 16B I 16B I 
     ------------------------------------------------------- 
 
     16B    -  шестнадцать бит ( два байта ) 
 
     XLT    -  адрес  вектора  пересчета номеров  логических 
               секторов в физические. 
 
     0000   -    Два  байта  для  служебных  целей  BDOS   ( 
               начальное значение неважно ). 
 
     DIRBUF -  адрес  128-байтного участка озу для работы  с 
               оглавлением  в  BDOS.  Бсе DPH  адресуются  к 
               одному и тому же участку. 
 
     DPB   -    адрес  блока  параметров диска  для  данного 
               дисковода.     Дисководы     с    идентичными 
               характеристиками  адресуются к одному и  тому 
               же блоку параметров диска. 
 
     CSV    -    адрес   сверхоперативного   участка    озу, 
               используемого  для проверки контрольной суммы 
               оглавления  при  смене  диска  в   дисководе. 
               Размер этого учаска должен быть 8 байт.  Этот 
               участок  памяти  должен быть  различеным  для 
               каждого DPH. 
 
     ALV  -    адрес    сверхоперативного    участка    озу, 
               используемого  BDOS для сохранения информации 
               о  занятости  диска.   Размер  этого  участка 
               должен  быть 32 байта для дисков емкостью  до 
               255K байт. Этот участок должен быть различным 
               для каждого DPH. 
 
     Если   в  BIOS  описано  N  дисководов,   то  все   DPH 
распологаются в таблице,  причем первая строка таблицы (  16 
байт  )  соответствует  дисководу  0  (A),   а  последняя  - 
дисководу  N-1  (...).  Подпрограмма SELDSK ответственна  за 
возврат базового адреса DPH для выбранного дисковода. 
 
               Блок параметров диска (DPB) 
 
     блок параметров диска имеет следующий формат : 
------------------------------------------------------------- 
I SPT I BSH I BLM I EXM I DSM I DRM I AL0 I AL1 I CKS I OFF I 
I 16B I  8B I  8B I  8B I 16B I 16B I  8B I  8B I 16B I 16B I 
------------------------------------------------------------- 
     16B  -    шестнадцать бит 
      8B  -    восемь бит 
     SPT  -    полное число секторов, расположенных на одной 
               дорожке диска. 
     BSH  -    коэфицент  сдвига блока распределения  данных 
               на диске.  
               Значения BSH и BLM , определяют размер группы 
               данных BLS ,  который не является элементом в 
               блоке параметров диска.  При условии, что BLS 
               выбрано, приводятся значения BSH и BLM : 
      
                     BLS       BSH       BLM 
                     1024      3           7 
                     2048      4          15 
                     4096      5          31 
                     8192      6          63 
                    16384      7         127 
 
     EXM  -    маска поля памяти  
     DSM  -    полный об'ем дисковода ( в группах ) 
               значение  EXM  зависит как от BLS,  так и  от 
               того, превышает ли DSM число 255 : 
 
                    BLS       DSM<255        DSM>255 
                   1024          0              - 
                   2048          1              0 
                   4096          3              1 
                   8192          7              3 
                  16384         15              7 
 
               значение DSM - на 1 меньше,  чем максимальное 
               число   групп   данных   на   данном   диске, 
               измеряемое  в  единицах  BLS.  BLS*(DSM+1)  - 
               общее  число  байтов  на  даном   диске,   за 
               исключением     области    для     размещения 
               операционной системы (системных дорожек). 
     DRM  -    полное  число записей в  оглавлении.  AL0,AL1 
               определяют       зарезервированные      блоки 
               оглавления.  Элемент DRM - на 1  меньше,  чем 
               общее    число    32-X   байтных    элементов 
               оглавления.  Значения AL0 и AL1  определяются 
               DRM. Их можно рассматривать как цепочку из 16 
               битов, как показано ниже : 
          ------------------------------------------------- 
          I         AL0           I           AL1         I 
          I00 01 02 03 04 15 06 07I08 09 0A 0B 0C 0D 0E 0FI 
          ------------------------------------------------- 
 
               позиции  00  соответствует старший бит  байта 
               AL0,  а  позиции 0F - младший бит байта  AL1. 
               Каждый  бит  резервирует группу  для  записей 
               оглавления   - T.E.    Максимальный    размер 
               оглавления   - 16  групп.   Каждая  запись  в 
               оглавлении занимает 32 байта.  Ниже приведена 
               таблица зависимости числа записей от  размера 
               группы : 
 
                    BLS       число записей на 1 группу 
                   1024                 32 
                   2048                 64 
                   4096                128 
                   8192                256 
                  16384                512 
 
               таким  образом,  если  DRM=127  (128  записей 
               оглавления),   и  BLS=1024  (обычно),  то  на 
               группу приходится 32-E записи, т.Е. Требуется 
               зарезервировать   4  блока.   В  этом  случае 
               устанавливают    4    старших    бита    AL0, 
               следовательно: AL0=F0 , AL1=00. 
     CKS  -    размер вектора проверки оглавления (обычно  8 
               байт).  Значение  CKS определяется так:  если 
               среда  дисковода сменная,  то  CKS=(DRM+1)/4, 
               где DRM - номер последней записи  оглавления. 
               Если  среда постоянная,  то CKS=0,  и в  этом 
               случае    никакие   записи   оглавления    не 
               проверяются. 
     OFF  -    число   дорожек   под   размещение   системы, 
               резервируемых в начале физического диска. Это 
               значение      автоматически       добавляется 
               системойкаждый    раз,    когда    вызывается 
               подпрограмма SETTRK ,  и может использоваться 
               для  пропуска  дорожек с кодами  операционной 
               системы. 
        
 
                  Системные вызовы BDOS CP/M 
 
             описание системных вызовов BDOS CP/M
 
   блок управления файлом (FCB) 
массив данных длиной в 36 байт, описывающий файл 
информации в CP/M 
 
структура FCB 
 
 00 01 02     08 09 0A 0B 0C 0D 0E 0F 10     1F 20 21 22 23 
------------------------------------------------------------ 
!DR!F1!F2!/ /!F8!T1!T2!T3!EX!S1!S2!RC!D0!/ /!DN!CR!R0!R1!R2! 
------------------------------------------------------------ 
 00 01 02     08 09 10 11 12 13 14 15 16     31 32 33 34 35 
 
DR    - код дисковода 0-16 (0-по.Умолч.;1-A;2-B...16-B) 
F1-F8 - имя файла в коде ASCII со старшим разрядом=0 
T1-T3 - тип файла в коде ASCII со старшим разрядом=0 
EX    - номер участка                    (установить=0) 
S1,S2 - системные байты                  (установить=0) 
RC    - системный байт                   (установить=0) 
D0-DN - системные байты                    (не трогать) 
CR    - номер текущей записи             (установить=0) 
R0,R1,R2   -   служебные байты для системы (не трогать) 
   при запросе доступа к файлу заполнение младших 16 байтов 
FCB и инициализация поля "CR" возлагается на программиста ! 
Описание системных вызовов 
 
0 (C=00) - сброс системы (горячий рестарт системы) 
1 (C=01) - ввод с клавиатуры в регистр а 
2 (C=02) - вывод на терминал из регистра E 
3 (C=03) - ввод с фотосчитывателя в регистр A 
4 (C=04) - вывод на перфоратор из регистра е 
5 (C=05) - вывод на ацпу из регистра E 
6 (C=06) - прямой ввод/вывод на TEрминал  
           E=0FFH - ввод в ак либо символа,либо 00 
           E=ASCII символ - вывод 
7 (C=07) - чтение байта управления вводом/выводом в AK 
8 (C=08) - установка байта ввода/вывода из регистра E 
9 (C=09) - вывод строки на Tерминал 
           DE - адрес первого символа строки 
           $  - символ конца строки (не печатается) 
10(C=0A) - ввод строки с клавиатуры в буфер строки 
           DE - адрес буфера строки 
           вк - признак конца при вводе строки 
           структура буфера строки 
           DE:  +0 +1 +2 +3 +4 +5 +6 +7  ...  +254(MAX) 
               ---------------------------------- 
               !MX!NS!C1!C2!C3!C4!C5!C6! ... !??! 
               ---------------------------------- 
           MX - максимальное число символов в буфере 
           NS - число фактически считанных символов 
           C1..- Символы 
 
11(C=0B) - опрос состояния клавиатуры в ак 
           AK=00 - не активна, ак=0FFH - активна 
 
12(C=0C) - получение номера версии CPM в HL 
           H=0 - сP/M , H=11 - MP/M 
           L=20...2F на CP/M 2.0 ... 2.15 
 
13(C=0D) - сброс дисковой системы 
 
14(C=0E) - выбор диска по содержимому регистра E 
           0-A,1-B,2-C,.....,15-P 
 
15(C=0F) - открытие файла  
           вход : DE - адрес FCB файла 
           выход: AK - код каталога (0-3) или 0FFH ,если 
           указанный файл на диске отсутствует 
 
16(C=10) - закрытие файла  
           вход : DE - адрес FCB файла 
           выход: ак - код каталога (0-3) или 0FFH , если 
           указанный файл отсутствует на диске 
 
17(C=11) - поиск первого - поиск файла в каталоге диска 
           вход : DE - адрес FCB 
           выход: ак - код каталога 
           по текущему адресу пдп заносится запись,содержащая 
           точку входа каталога 
 
18(C=12) - поиск следующего - то же что и 17 но с текущего 
           положения в каталоге 
 
19(C=13) - стирание файла  
           вход : DE - адрес FCB 
           выход: ак - KOд каталога (0-3) или 0FFH-если неT 
 
20(C=14) - последовательное чтение 
           вход : DE - адрес FCB, файл должен быть открыт 
           адрес пдп,номер сек.И номер дорожки должен быть  
           установлены заранее 
           выход: ак=0 если норма и ак<>0 если конец файла 
 
21(C=15) - последовательная запись 
           вход : то же,что и в 20 
           выход: ак=0 если норма и AK<>0 если диск полон 
 
22(C=16) - создание файла 
           вход : DE - адрес FCB 
           выход: ак - код каталога (1-3),если норма и 
           ак=0FFH , если диск полон 
 
23(C=17) - переименование файла 
 
24(C=18) - получение вектора регистрации в системе 
 
25(C=19) - получение активного диска 
 
26(C=1A) - установка адреса пдп из DE 
 
27(C=1B) - получение адреса размещения в HL 
 
28(C=1C) - защита диска от записи 
 
29(C=1D) - получение вектора "только чтение" в HL 
 
30(C=1E) - установка атрибутов файла 
 
31(C=1F) - получение адреса блока параметров диска в HL 
 
32(C=20) - установка/получение кода пользователя 
 
33(C=21) - чтение в произвольном порядке 
 
34(C=22) - запись в произвольном порядке 
 
35(C=23) - вычисление размера файла 
 
36(C=24) - установка произвольной записи 
 
     типичный пример вызова системной функции :  
 
  BDOS    EQU       5         ; адрес входа в BDOS 
          MVI       C,9       ; код вызова "печать строки" 
          LXI       D,ADRES   ; в DE адрес строки в озу 
          CALL      BDOS      ; вызов системы 
 
 
          *************************** 
               10 . 09 . 1987 .
          ***************************
 
 

