Návod na používání služeb systému CP/M
****************************************
Operační systém CP/M ( Control Program for Microcomputers )
je monoprogramový ( v jednom okamžiku může být spuštěn pouze
jeden program ) jednouživetelský ( v jednom okamžiku může systém
používat pouze jeden uživatel ) diskově orientovaný systém,
který slouží k ovládání mikropočítačů postavených na bázi
osmibitových mikroprocesorů I8080, I8085 nebo Z80 a vybavených
operační pamětí o optimální velikosti 64KB.
Všechna níže uvedená čísla mají šestnáctkový základ. Pouze
ta čísla, za kterými bezprostředně následuje znak T jsou
dekadická.
Operační pamět je rozdělěna na tyto části:
vrchol RAM FFFF
BIOS
F200
BDOS
E400
CCP
DC00
TPA
0100
SPA
0000
Umístění programových modulů CCP, BDOS a BIOS v paměti záleží na
konkrétní verzi a implementaci systému CP/M. Po pravé straně
jsou adresy použité pro verzi 2.2 systému.
Rozdělení SPA
-------------
System Parameter Area obsahuje instrukce skoků a proměnné,
které systém potřebuje ke své činnosti.
0000 JP BIOS+3 instrukce skoku na teplý start BIOSu
0003 DB IOBYTE stavová slabika I/O systému
0004 DB IMPDSK číslo implicitního disku
0005 JP BDOS+6 instrukce skoku do BDOSu
0008 DS 0038 nevyužito
0040 DS 0010 vyrovnávací paměť pro BIOS
0050 DS 000C nevyužito
005C DS 0010 FCB prvního parametru příkazu
006C DS 0010 FCB druhého parametru příkazu
007C DB ?
007D DS 0003 číslo záznamu při přímém přístupu
0080 DS 0080 vyrovnávací paměť pro sektor
následují další části paměti
0100 ... Transient Program Area
xxxx ... Console Command Processor
xxxx ... Basic Disc Operating System
xxxx ... Basic Input/Output System
Bajt IOBYTE popisuje stav přiřazení čtyř logických systémových
zařízení, je tedy rozdělena do čtyřech logických polí, každé
o délce 2 bity, která reprezentují čtyři logická zařízení.
Každé toto pole může mít hodnotu 0 až 3. Tím je vždy určeno
jedno ze čtyř možných fyzických zařízení, která lze přiřadit
jednomu logickému zařízení. Formát slabiky IOBYTE je:
bit 7 6 5 4 3 2 1 0
zařízení tiskárna děrovač snímač konzola
Hodnoty určuje a testuje např. program STAT nebo PIP. Symbolice
těchto programů odpovídají i použité zkratky a popis, vlastní
realizace je závislá na zařízeních připojených k systému:
konzola - CON: 0 - TTY:, 1 - CRT:, 2 - BAT:, 3 - UC1
snímač - RDR: 0 - TTY:, 1 - PTR:, 2 - UR1:, 3 - UR2
děrovač - PUN: 0 - TTY:, 1 - PTP:, 2 - UP1:, 3 - UP2
tiskárna - LST: 0 - TTY:, 1 - CRT:, 2 - LPT:, 3 - UL1:
Zpracování příkazů modulem CCP
------------------------------
Příkazový řádek zpracovávaný modulem CCP má tvar:
[d:]příkaz[_filespec1[_filespec2[_next]]]
kde:
_ je oddělovač ( zpravidla mezera )
d: je určení disku
příkaz je jméno interního nebo externího příkazu
filespec představuje volitelný parametr příkazu
next představuje další parametry příkazu
V hranatých závorkách jsou uvedeny nepovinné parametry. Parametr
next modul CCP nezpracovává. Po odeslání externího příkazu je
zaveden do TPA od adresy 0100 program příkaz.COM a je mu předáno
od téže adresy řízení. Parametry filespec jsou zpracovány do
podoby FCB a jsou umístěny do SPA. Zkrácený příkazový řádek je
počínaje filespec1 přemístěn do SPA od adresy 0081, přičemž na
adrese 0080 je jeho délka. Specifikace souboru filespec může
obsahovat znaky "?" a "*". Znak "?" znamená, že na jeho pozici
může být jakýkoli jiný znak ( to má význam při hledání souboru
v direktoráři ), znak "*" znamená, že od jeho pozice do
oddělovače ( do tečky v případě přípony ) budou doplněny "?".
FCB ( File Control Block ) má tvar:
+00 - DR - disk 0: aktuální, 1: A, 2: B, ... 10: P
+01 - F1 až F8 - jméno souboru nebo mezery
+09 - T1 - první znak přípony, bit 7=1 znamená R/O
+0A - T2 - druhý znak přípony, bit 7=1 znamená SYS
+0B - T3 - třetí znak přřípony
+0C - EX - číslo fondu úseků, 0 až 1F
+0D - S1 - pracovní proměnná pro systém
+0E - S2 - vyšší bity EX
+0F - RC - počet recordů ve fondu úseků EX, 0 až 80
+10 - D0 až DF - čísla přidělěných úseků
+20 - CR - číslo recordu v rámci fondu úseků EX
+21 - R0 a R1 - číslo recordu v rámci celého souboru
+23 - R2 - pro přetečení R0 a R1
EX je v podstatě číslo hlavičky souboru ( soubor může mít
několik hlaviček, to záleží na jeho délce ), S2 by mělo být
vynulováno před voláním služeb 15T, 17T, 18T a 22T.
Služby modulu BDOS
------------------
Volání služeb modulu BDOS se realizuje instrukcí CALL 0005
s příslušným nastavením parametrů. V registru C se předává číslo
volané služby. Zkratkou DIR je míněn adresář disku, číslo IDT
znamená číslo, které představuje pořadí položky ( hlavičky )
v jednom recordu DIR a recordem je míněn jeden záznam o délce
0080 bajtů.
00 - 0 - načtení systému z disku E a posléze start CCP
01 - 1 - přečtení znaku z konzoly do Acc a jeho vytištění
02 - 2 - tisk znaku E na konzolu
03 - 3 - přečtení znaku ze snímače do Acc
04 - 4 - vyslání znaku E na děrovač
05 - 5 - tisk znaku E na tiskárně
06 - 6 - přímý přístup na konzolu
E: FF - INKEY$ do Acc
FE - čtení stavu bafru ( 00/FF = není/je znak )
ASCII - tisk znaku
07 - 7 - načtení IOBYTE do Acc
08 - 8 - nastavení IOBYTE podle E
09 - 9 - tisk řetězce od DE do CHR(24) na systémovou konzolu
0A - 10 - čtení řetězce na DE. Na DE je délka načteného řetězce
0B - 11 - čtení stavu bafru konzoly do Acc, 0/1 = není/je znak
0C - 12 - čtení verze systému do HL jako BCD
0D - 13 - inicializace diskového systému. Jako implicitní je vy-
brán disk A: a všechny disky jsou nastaveny jako R/W.
Není načítán systém. DMA je nastavena na 0080.
0E - 14 - nastavení implicitního disku E ( 00 = A: ... 0F = P: )
0F - 15 - otevření souboru pro čtení a přidávání. V DE je adresa
FCB, Acc vrací 0 až 3 ( číslo IDT ) nebo FF ( soubor
není na disku ).
10 - 16 - uzavření souboru, ve kterém byly provedeny změny. V DE
je adresa FCB souboru, Acc vrací 0 až 3 ( číslo
IDT ) nebo FF ( soubor není na disku ).
11 - 17 - hledání hlavičky souboru v DIR od první položky. V DE
je adresa FCB souboru, Acc vrací 0 až 3 ( číslo IDT )
nebo FF ( soubor není na disku ). Hlavička souboru se
pak nachází na adrese DMA zvětšené o 32T*A bajtů.
Pokud je na DR FCB znak "?" ( otazník, 3F ), hledá se
i mezi smazanými soubory a u všech uživatelů.
12 - 18 - hledání následující položky v DIR. Lze volat pouze
bezprostředně po službě č. 17T nebo 18T.
13 - 19 - smazání souborů vyhovujících specifikaci FCB. Na bajtu
DR nesmí být otazník, v názvu být smí. V DE je adresa
FCB souboru, Acc vrací 00 ( OK ) nebo FF ( soubor není
na disku ).
14 - 20 - provede načtení dalšího recordu z otevřeného souboru
na adresu DMA. Record se čte od pozice určené položkou
CR ve FCB. V DE je adresa FCB souboru, Acc vrací 00
( OK ) nebo 01 ( konec souboru ) nebo vyšší hodnoty
( další chyby ).
15 - 21 - provede zápis dalšího recordu do otevřeného souboru
z adresy DMA. Record se zapíše na pozici určenou
položkou CR ve FCB. V DE je adresa FCB souboru, Acc
vrací 0 ( OK ), 01 ( plný DIR ), 02 ( plný disk ) nebo
vyšší hodnoty ( další chyby ).
16 - 22 - otevření ( doposud neexistujícího ) souboru pro zápis.
V DE je adresa FCB souboru, Acc vrací 0 až 3 ( číslo
IDT ) nebo FF ( není místo v DIR ).
17 - 23 - přejmenování souboru. Prvních 16T byte FCB určuje disk
a staré jméno souboru, dalších 16T byte určuje nové
jméno souboru ( disk je ignorován ). V DE je adresa
FCB souboru, Acc vrací 0 až 3 ( číslo IDT ) nebo FF
( soubor není na disku ).
18 - 24 - přečtení vektoru aktivních disků do HL. Bit 0 odpovídá
disku A, nejvyšší bit odpovídá disku P. Nasetovaný bit
určuje aktivní disk.
19 - 25 - načtení čísla vybranáho ( implicitního ) disku do Acc.
1A - 26 - nastavení adresy DMA na DE.
1B - 27 - přečtení adresy vektoru úseků vybraného disku do HL.
Každý bit vektoru odpovídá jednomu úseku na disku,
délka vektoru, tj. počet jeho bitů odpovídá kapacitě
disku. Nasetovaný bit označuje obsazený úsek.
1C - 28 - nastavení implicitního disku jako R/O.
1D - 29 - přečtení vektoru R/O disků do HL. Bit 0 odpovídá disku
A, nejvyšší bit odpovídá disku P. Nastavený bit určuje
disk R/O, shozený bit určuje disk R/W.
1E - 30 - Nastavení atributů Read Only/Read Write a SYS/DIR
jednoznačně specifikovaného souboru. V DE je adresa
FCB souboru, Acc vrací 0 až 3 ( číslo IDT ) nebo FF
( soubor není na disku ).
1F - 31 - přečtení adresy bloku diskových parametrů do HL.
20 - 32 - přečtení/nastavení čísla uživatele
E: FF - číslo uživatele do Acc
00 až 0F - nastavení uživatele
21 - 33 - přímé čtení ze souboru na DMA podle R0 a R1. R2 musí
mít nulovou hodnotu. Soubor musí být otevřen s vynulo-
vanou položkou EX. V DE je adresa FCB souboru, Acc
vrací 0 - OK, 1 - čtení neexistujících dat, 3 - není
možné uzavřít daný fond úseků ( tato chyba by neměla
za normálních okolností nastat ), 4 - pokus o přechod
k neexistujícímu fondu úseků, 5 - plný DIR, 6 - plný
disk.
22 - 34 - přímý zápis dat z DMA do souboru podle R0 a R1. Platí
totéž co pro službu 33T.
23 - 35 - vrací délku v recordech jednoznačně určeného souboru.
V DE je adresa FCB souboru, na položkách R0, R1 a R2
služba vrátí číslo recordu, který by bezprostredně
následoval za koncem souboru. Protože lze do souboru
zapisovat přímým přístupem, nemusí být toto číslo
v souladu se skutečnou délkou souboru.
24 - 36 - vypočte z EX a CR číslo recordu a uloží ho do R0 a R1.
V DE je adresa FCB.
25 - 37 - zrušení disků z vektoru aktivních disků podle DE.
26 - 38 - nepoužita
27 - 39 - nepoužita
29 - 40 - shodné s 34T, ale record je nejprve vynulován.
Služby modulu BIOS
------------------
Volání služeb BIOSu se realizuje instrukcí CALL address
s příslušným nastavením parametrů. Parametr address představuje
adresu začátku modulu BIOS + offset volané služby. BIOS obsahuje
vstupní body pro obsluhu čtyř logických znakových zařízení:
CON: , RDR: , PUN: a LST:
offset
+00 BOOT - studený start systému CP/M
+03 WBOOT - teplý start systému CP/M
+06 CONST - do Acc stav konzoly ( viz služba 11T BDOS )
+09 CONIN - vstup znaku z konzoly do Acc bez nulování 7. bitu
+0C CONOUT - tisk znaku v C na konzolu
+0F LIST - tisk znaku v C na tiskárně
+12 PUNCH - vyslání znaku v C na děrovač
+15 READER - načtení znaku ze snímače do Acc, CY oznamuje chybu
+18 HOME - nastavení hlavičky na implicitním disku na stopu 0
+1B SELDSK - nastavení implicitního disku podle registru C
+1E SETTRK - nastavení čísla stopy na implicitním disku dle BC
+21 SETSEC - nastavení fyzického sektoru na impl. disku dle BC
+24 SETDMA - nastavení adresy DMA pro přenos dat dle BC
+27 READ - čtení jednoho recordu, Acc: =0 - OK, =1 - ERROR
+2A WRITE - zápis jednoho recordu, Acc: =0 - OK, =1 - ERROR
+2D LISTST - čtení stavu tiskárny do Acc. 0-BUSY, FF-READY
+30 SETRAN - přepočet log. čísla sektoru na fyz. z BC a DE
Popis parametrů diskových jednotek
----------------------------------
Parametry diskových jednotek jsou určovány tabulkami DPH
a DPB v modulu BIOS. To umožňuje používání libovolných
diskových jednotek, případně i dynamickou změnu charakteristiky
jednotky.
Tabulka DPH ( Disk Parameter Header )
XLT DW adresa tabulky pro přepočet logických čísel
sektorů na fyzická, nebo 0000 jestliže se
přepočet neprovádí
DIRBUF DW adresa 0080 bajtů dlouhého bafru pro operace s
direktorářem
DPB DW adresa tabulky DPB ( Disk Parameter Block )
CSV DW adresa pracovní oblasti pro uložení kontrolních
součtů recordů adresáře, délka je CKS bajtů
ALV DW adresa ABM ( Alocation Block Map ), mapy obsa-
zení alokačních bloků disku, délka je DSM/8+1
Tabulka DPB ( Disk Parameter Block )
SPT DW počet recordů na stopě ( Sectors Per Track ),
je-li délka sektoru větší než délka recordu, je
SPT rovno součinu fyzického počtu sektorů na
stopě a počtu recordů v jednom sektoru. Při
oboustranném disku jsou oba povrchy chápány
jako jedna stopa
BSH DB dvojkový logaritmus počtu vět v alokačním bloku
pro přepočet čísla alokačního bloku na record
( Block Shift )
BLM DB počet recordů v alokačním bloku minus jedna
( Block Mask )
EXM DB počet logických rozšíření ( po 16 KB ) adreso-
vaných jednou položkou adresáře minus jedna
( Extent Mask ). Je určena velikostí alokačního
bloku ( BLS ) a celkovým počtem alokačních
bloků ( DSM ) takto:
BLS DSM<256 DSM>256 DÉLKA DAT
1KB 0 - 16
2KB 1 0 32 16
4KB 3 1 64 32
8KB 7 3 128 64
16KB 15 7 256 128
DÉLKOU DAT je míněna maximální délka dat, kte-
rou lze obsáhnout jedním rozšířením.
DSM DW velikost disku v alokačních blocích minus jedna
( Disk Size Max ), poslední alokační blok
DRM DW maximální počet hlaviček v direktoráři minus
jedna ( Directory Max ). Direktorář zabírá
celistvý počet alokačních bloků. Každý record
direktoráře obsahuje čtyři hlavičky, proto:
DRM=(X*(BLM+1)*4)-1, kde X je počet alokačních
bloků adresáře
AL0a1 DW první dva bajty bitové mapy určující alokační
bloky rezervované pro direktorář. Nastavený bit
15T ( tj. bit 7 AL0 ) rezervuje alokační blok
0 a tak dále až po bit 0 ( tj. bit 0 AL1 ),
který rezervuje 15T alokační blok
CKS DW počet sektorů direktoráře testovaných na kon-
trolní součet ( Check Sum ). U výměnného média
je CKS=(DRM+1)/4 u nevýměnného média pak 0
OFF DW počet stop rezervovaných pro systém na začátku
média
===== napsal LZR Soft, datum poslední editace: 14. 1. 1992 =====