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 =====