-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcpm22_cp1251.txt
495 lines (399 loc) · 21.3 KB
/
cpm22_cp1251.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
Краткое описание операционной системы 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 .
***************************