O P E R A Č N Í S Y S T É M CCC PPPP / M M 222 222 C C P P / M M 2 2 2 2 C P P / MM MM 2 2 C PPPP / M M M 2 2 C C P / M M 2 .. 2 CCC P / M M 22222 .. 22222 Implementace na Sharp MZ-800 VERZE: 1.2 Jiří Lamač Praha, únor 1989 1 OBSAH: str. 1. Předmluva 3 2. Úvod do operačního systému CP/M 5 2.1 Co to je operační systém 5 2.2 Vznik CP/M 6 2.3 Základní informace o CP/M 8 2.4 Interpretr příkazů CCP 14 2.5 Standardní služby BDOSu 16 2.6 Modul BIOS 26 3. Implementace CP/M na Sharpu - popis systému 30 3.1 Vlastnosti použitého CCP a BDOS 30 3.2 Zavedení systému 33 3.3 Obsluha klávesnice 35 3.4 Obsluha obrazovky 37 3.5 Tiskárna a seriové rozhraní RS-232 38 4. Diskové operace 39 4.1 Formát záznamu na disketových mechanikách 41 4.2 Výběr mechaniky 43 4.3 Operace čtení a zápisu 44 4.4 Práce s diskovým bufferem 45 5. Základní programové příslušenství 47 5.1 Program FORMAT 49 5.2 Program COPYSYS 50 5.3 Program COPYDISK 51 5.4 Program SETUP 52 5.5 Program DISKDEF 52 5.6 Program DEFKEY 53 5.7 Program KEYB 54 5.8 Programy CLS, EJECT a BOOT 55 5.9 Program DIAPRINT 55 5.10 Programy MLOAD a MSAVE 56 5.11 Program TIME 59 5.12 Program XDOS 59 6. Než začnete pod systémem pracovat 60 6.1 Využití programu z jiného počítače 60 7. Literatura 62 2 1. Předmluva Sharp MZ-800 je dnes u nás jedním z nejlepších zahraničních osmibitových počítačů. Jeho hardwarová konstrukce je v mnohém podobná počítačům pro profesionální použití. Uživatel, který se však rozhodl si tento počítač koupit, byl jistě velmi zklamán, když zjistil, že na Sharpa není prakticky žádné firemní programové vybavení. Ideální je samozřejmě používat operační systém CP/M, který běžnému uživateli nabízí prakticky vše, co jen může od počítače požadovat. Je možný jednoduchý přístup k souborům, lze užívat kvalitní programy firem zvučných jmen, jako jsou překladače snad všech významných programovacích jazyků (Turbo Pascal, Ada, Basic, Fortran, Cobol, C, Prolog, Forth, Lisp), textové editory (WordStar, Word Master), databázové programy (dBase II), programy pro tabulkové výpočty (Multiplan, SuperCalc), makroasemblery a dokonce i křížové asemblery pro jiné mikroprocesory. Důležitý je také fakt, že implementací CP/M Sharp MZ-800 získává kompatibilitu s jinými osmibitovými počítači u nás, jako je např. TNS, SAPI 1, Robotron 1715, Sinclair ZX Spectrum, Schneider CPC 664 a 6128, ale i Commodore 128 a další. Firma Sharp pro svůj počítač MZ-800 nabízí diskový operační systém, nazvaný P-CP/M, ve kterém jsou však závažné softwarové chyby, které způsobují "záhadné" mizení částí souborů apod. P-CP/M rovněž neumí spolupracovat s jinými disketovými mechanikami, než firemními čtyřicetistopými a není zcela standardní, protože pod ním nepracují některé programy. Největším nedostatkem P-CP/M je jeho až neuvěřitelná pomalost, připomínající výkon počítače s procesorem I8080 na 1 MHz. Na druhou stranu je v P-CP/M použito některých pěkných myšlenek, např. nepotřebuje stisknout CTRL/C po výměně diskety. Z výše uvedených důvodů vznikl nový operační systém, který myšlenkově z P-CP/M vychází, v žádném případě však není jeho modifikací nebo kopií. Minimum vnějších změn přináší výhodu, že si uživatel P-CP/M přechodem na nový CP/M nemusí zvykat na žádné novinky. Popisovaný CP/M zachovává dobré vlastnosti původního řešení, ale eliminuje jeho zápory. Mimo jiné umožňuje spolupráci se širokou škálou disketových mechanik, které se u nás mezi lidmi vyskytují. Dále zvyšuje pracovní rychlost (podle druhu činnosti dva- až dvacetkrát). I přes některé vlastnosti pro CP/M netypické (možnost volně vyměňovat diskety v mechanikách, kopírovat soubory bez nutnosti volání speciálního kopírovacího programu, nebo užívat rozšířených funkcí logického rozdělení disku - USERs), které nový systém má, lze říci, že i přes tyto změny se jedná o naprosto standardní verzi CP/M 2.2, která má určitou nadstavbu. Například umožňuje volbu další činnosti programu při chybě (Retry / Abort / Ignore), lze na ní psát v úplné češtině (podle normy KOI-8-Čs), má zabudované grafické znaky pro kreslení oken a jednoduchých obrázků atd. Dále popisovaný CP/M umí obsluhovat všechny standardně dodávané periferie, počínaje již zmíněnými floppy disky, přes samozřejmou Centronics nebo IRPR tiskárnu, tři různé RAM disky o nastavitelné kapacitě až do 512 K a seriové rozhraní 3 RS-232C. Formát záznamu na disku je přímým ekvivalentem záznamu používaného na IBM PC, takže diskety jsou bez problémů přenositelné. Součástí systémové diskety je i množství programů pro poměrně variabilní rekonfiguraci systému (kterou si uživatel může provést sám, aniž by přímo zasahoval do strojového kódu systému), definici uživatelských kláves, či rychlé kopírování disket. Všem uživatelům tohoto systému přejeme co největší pohodu a spokojenost při práci pod naším systémem a zároveň děkujeme za všechny případné konstruktivní návrhy a připomínky. (c) 1989 Jiří Lamač, autor systému 4 2. Úvod do operačního systému CP/M Kapitola 2 se týká operačního systému CP/M obecně, nezávisle na popisované implementaci, proto ti, kteří CP/M již znají odjinud, mohou pokračovat kapitolou 3. Zároveň doporučujeme těm, kteří hodlají k systému přistupovat jen jako uživatelé (a to je správný postoj), aby přeskočili kapitoly 2.5 a 2.6 popisující BDOS a BIOS. Tyto části, převzaté z [17], jsou potřebné při volání systému ze strojového kódu a v tomto textu jsou zahrnuty spíše pro úplnost. 2.1 Co to je operační systém Malé osobní počítače, takové jako je např. Sinclair ZX-81 nebo samotný Sharp MZ-800 bez disketových mechanik a RAM disku, nemají skutečný operační systém, i když se to někdy mylně uvádí. Je téměř pravidlem, že bývají vybaveny pevnou pamětí ROM o kapacitě 16 až 48 kB, ve které bývá umístěn interpretr jazyka Basic, případně ještě hexadecimální monitor a textový editor. O nějakém standardním systému ani známky. Není pak divu, že člověk, který nikdy nepracoval na větších počítačích (např. SMEP), si o operačním systému, případně o sdílení času, může leda nechat zdát. O co tedy vlastně jde. Učená definice říká, že operační systém je souhrn určitého množství programů, které přesně definovaným způsobem zajišťují komunikaci mezi hlavním programem a uživatelem. Je to jakýsi mezičlánek, který umí zpracovat informace dodané mu hlavním programem a zároveň obsluhuje periférie (to by zpravidla neměla být starost hlavního programu). U větších počítačů se systém stará též o přidělování strojního času a paměti různým současně běžícím úlohám. Řeknete si, vždyť to není nic nového. Obsluha klávesnice a obrazovky je přece v pevné paměti každého, i toho nejmenšího počítače. Ale ouha, když si do Sharpa MZ-800 přenesete program třeba z Robotronu 1715, těžko asi bude pracovat. Tady už to nikomu divné nepřijde, vždyť je to úplně jiný počítač. Když ale oba počítače mají podobný mikroprocesor, mělo by to přece nějak jít. A jsme u toho. Každý počítač obsluhuje určité periférie, které se obecně ovládají různě (jen kolik je např. různých videoprocesorů). Operace prováděné s perifériemi však jsou stále stejné - "přečti znak", "zapiš znak" a u počítačů s disky ještě "přečti z disku" a "zapiš na disk". Jestliže dohodneme nějaký způsob, jakým budou programy volat obslužné podprogramy, mohou být programy bez omezení přenosné mezi naprosto odlišnými počítači. Operační systém CP/M zde představuje takový celosvětově dohodnutý (a na osmibitových počítačích nejvíce rozšířený) standard, definující toto propojení. 5 2.2 Vznik CP/M CP/M (Control Program for Microcomputers) je v současné době pravděpodobně nejpopulárnější operační systém pro osmibitové mikropočítače s mikroprocesorem Z80, I8080 nebo 8085. Přes 300 firem vyrábějících mikropočítače dodává CP/M jako součást standardního programového vybavení a odhaduje se, že CP/M je využíván asi na 800 000 pracovištích. CP/M je sice již starší, ne však zastaralý systém. Jeho první verze byla vytvořena již v roce 1974, jako důsledek značného rozšíření mikroprocesoru Intel 8080. Do té doby totiž byla v programovém vybavení pro tento typ mikroprocesoru značná nejednotnost. Otcem systému je Garry Kildall, původně programový konzultant u firmy Intel. Firma uvažovala o vytvoření standardního systému pro I8080. Pracovalo na něm více programátorů, avšak po rychlém vzestupu firmy byly softwarové problémy odsunuty do pozadí pozornosti (jak se to bohužel běžně dělá u nás). G. Kildall se s firmou Intel nepohodl, navíc bylo konstatováno, že jeho výtvor nemá žádné zvláštní vlastnosti, především mu chybí nepřeberné množství rozličných příkazů, jako mají jiné bohatší a honosnější systémy. G. Kildall však věděl, že v jednoduchosti je síla, a pracoval na dalším vývoji CP/M na vlastní pěst. Zajímavé je, že k pozdějšímu bezkonkurenčnímu rozšíření CP/M došlo i přes nezájem firmy Intel. V téže době přišel John Torode, zaměstnanec firmy Digital Systems, s řadičem mechaniky pro pružné disky, který umožnil perfektní spolupráci CP/M s diskovou pamětí. Předvádění prototypové verze CP/M mělo značný ohlas mezi nadšenými vyznavači mikropočítačových systémů a zájem projevily i nově vznikající firmy produkující mikropočítačové stavebnice a systémy. Vznikla tak potřeba instalovat operační systém CP/M na různé mikropočítačové systémy. V letech 1974 až 1976 přepracoval G. Kildall CP/M tak, že ze systému vyčlenil části závislé na konkrétním technickém prostředí. Systém se tak rozdělil na technicky závislou a technicky nezávislou část, s přesně definovaným rozhraním. Při přenosu systému bylo nutno přizpůsobit technicky závislou část novému prostředí, zbytek systému zůstal beze změn, včetně uživatelských příkazů. Vznikla tak verze označovaná CP/M 1.3, která byla jako první zveřejněna a otevřela CP/M brány do světa uživatelů. V roce 1976 založil G. Kildall firmu Digital Research, která distribuuje CP/M a související programy. Další vývoj CP/M byl ovlivněn především vývojem diskových pamětí. Vzniká verze CP/M 1.4, která dovoluje ovládat standardní disk firmy IBM (formát IBM 3740 - osmipalcový jednostranný pružný disk s jednoduchou hustotou záznamu). Široké použití tohoto disku dovolilo vysokou přenosnost souborů mezi jednotlivými instalacemi CP/M a tím nebývalou přenosnost programových produktů. Vývoj pružných disků se však nezastavil - vznikají disky dalších rozměrů (5 1/4 a 3 1/2 '') s rozmanitými formáty záznamu. 6 Objevily se rovněž pevné disky s velkými kapacitami, použitelné v mikropočítačových systémech. Operační systém CP/M byl proto upraven tak, aby dovolil ovládat co nejširší škálu diskových pamětí. Do technicky závislé části byly zabudovány tabulky, popisující vlastnosti použitých disků. Příslušná verze z roku 1979 nese označení CP/M 2.2, a je nejrozšířenější verzí systému CP/M. U nás je známý spíše pod označením Mikros. Rozšířené jsou i východoněmecké verze SCP, SCPX a odvozené. Vývoj operačního systému pokračoval ještě dále. Byla vytvořena verze CP/M 3.1 (někdy také označovaná CP/M PLUS), která umí ovládat bankovanou paměť, má rozšířenou škálu systémových služeb, možnost nápovědy apod. Existují také varianty CP/M, umožňující spouštění dalších úloh (Concurrent CP/M), multiuživatelský přístup z více terminálů (MP/M), či sdílení prostředků v rámci sítě (CP/NET). Tyto verze však nedosáhly výraznějšího rozšíření, neboť nejsou zcela standardní a některé programy na nich nepracují. Navíc se pozice systému CP/M výrazně posílila, když firma Zilog přišla s mikroprocesorem Z80, pro který byla napsána spousta skvělých programů pracujících pod CP/M (odhady hovoří o 5000 programů). Tento mikroprocesor díky podstatně vyššímu hodinovému kmitočtu (až 8 MHz) a bohatšímu instrukčnímu souboru umožnil výrazné zrychlení všech činností systému i uživatelských programů. V roce 1979 byl CP/M oceněn cenou Datapro Software Honor Roll. Firma Intel kupodivu nakonec systém CP/M přes všechny jeho výhody a velké rozšíření nepřijala a vydala se cestou svého vlastního operačního systému ISIS, který se však neujal a je používán pouze ve vývojových systémech Intel. V čem spočívá neobyčejný úspěch operačního systému CP/M ? Systém vyniká značnou jednoduchostí a nezávislostí na technických prostředcích. Přitom jde o mocný systém s možností snadného rozšiřování. Jistě by bylo možné navrhnout systémy, které by byly z jistých hledisek rafinovanější než CP/M. Otázkou však zůstává, zda by se podařilo zachovat pružnost při tak malých nárocích na paměť. Jedná se o velmi účelný kompromis mezi mocností příkazů a minimalizací nároků na paměť. Rovněž strategie využívání diskového média je jednoduchá a přitom spolehlivá. Celková struktura systému je navržena tak chytře, že byla převzata ve většině operačních systémů pro mikropočítače. 7 2.3 Základní informace o CP/M CP/M je monoprogramový diskově orientovaný operační systém. Je přísně modulární, přičemž návaznost na technické prostředky je soustředěna v jediném modulu, který je lehko modifikovatelný. Služby systému umožňují tvorbu další programové nadstavby a to systémových programů i účelového aplikačního programového vybavení. CP/M je rozdělen na tři moduly: - vstupně/výstupní modul (BIOS, Basic Input/Output System), - jádro systému (BDOS, Basic Disk Operating System), - interpretr příkazů (CCP, Console Command Processor). Vstupně/výstupní modul obsahuje fyzické drivery jednotlivých periférií včetně disků. Tento modul představuje základní část operačního systému a umožňuje v konfiguraci technických prostředků používat různé typy disků. Jádro tvoří na konfiguraci technických prostředků nezávislý operační systém, který zajišťuje vykonávání všech systémových služeb. Interpretr příkazů, který umožňuje komunikaci operátora se systémem na úrovni konzole, tvoří relativně nezávislý modul CP/M. Je-li to potřebné, může být v paměti překryt uživatelským programem nebo jeho daty. Po zavedení systému zbyde v paměti RAM volná část, nazývaná pracovní oblast (TPA, Transient Program Area). Slouží k zavádění a běhu služebních a uživatelských programů a k uložení jejich dat. Tato oblast začíná na adrese 0100H, která je též startovací adresou všech programů pracujících pod systémem. Umístění jednotlivých modulů v paměti RAM je na následujícím schématu: _________________________ _ | | \ | BIOS | | |_________________________| | | | | | BDOS | | cca 6K bytů |_________________________| | | | | | CCP | | |_________________________| _/ | | | TPA | |_________________________| | | <- 0100H | Systémové parametry | |_________________________| 8 Ze zobrazeného rozdělení paměti vyplývá, že operační systém je rezidentní na konci paměti RAM. Je to proto, aby TPA začínala vždy na stejné adrese. V případě, že velikost TPA nestačí, mají programy možnost překrýt modul CCP. Tímto způsobem je uživatelským programům v rámci dané konfigurace paměti poskytnuta co největší oblast pro jejich práci. Nejspodnější část paměti (od adresy 0000 do 00FFH) je rezervována pro systémové informace, které jsou nutné pro práci systému. Tyto informace budou popsány dále. CP/M je schopen ovládat 1 až 16 různých diskových jednotek, přičemž každý soubor na disku může mít kapacitu až 8 MB. Každý z disků má svůj vlastní adresář, ve kterém jsou uloženy informace o souborech na disku. Počet položek adresáře může být předem určen. Položka adresáře obsahuje informace o rozsahu a umístění příslušného souboru na disku. Systém ovládání souborů umožňuje přímý přístup ke kterémukoli z až 65536 záznamů max. 8 MB souboru. Každému z diskových souborů je možno přiřadit příznaky "systémový" a "chráněný proti zápisu". Přes tuto velkou flexibilitu typů disků zabezpečuje systém ovládání souborů logicky jednotný a rychlý přístup k jednotlivým souborům. Systém ovládání souborů používá pevnou délku logického záznamu - 128 bytů. Diskům o větší kapacitě vyhovuje (z důvodu rychlosti přístupu) větší délka fyzického záznamu. Na to je v CP/M též pamatováno a v BIOSu je možno implementovat algoritmus kumulující více logických 128 bytových záznamů do delšího fyzického záznamu s jediným omezením, že jeho délka musí být násobkem 128 bytů. Systém ovládání souborů CP/M rozděluje disk na tzv. alokační bloky. Všechny alokační bloky na jednom disku mají stejnou délku. Jsou tvořeny celistvým počtem sektorů, který je vždy mocninou 2 (např. často používaná délka alokačního bloku je 2^3 = 8 sektorů = 1 KB, příp. 2^4 = 16 sektorů). Je-li souboru přidělované místo na disku, děje se tak po diskrétních jednotkách - alokačních blocích. Alokační bloky jsou číslované 0, 1, 2 atd. Informace o uložení daného souboru na disku je jednoznačně daná čísly alokačních bloků tohoto souboru. Tento způsob má proti tradičním technikám ukládání souboru na disku formou zřetězeného seznamu dvě výhody: - Nemůže dojít z důvodu přerušení seznamu k ztrátě informace o umístění zbytku souboru, - je zaručené, že přinejmenším ta část souboru, která vyplňuje alokační blok, je na disku uložena kontinuálně (v těch sektorech, které tvoří alokační blok) a tedy v případě sekvenčního přístupu k tomuto souboru je přístupová doba minimalizovaná. Navíc systém ovládání souborů v případě potřeby přiřazuje souboru další volný alokační blok fyzicky nejbližší k poslednímu alokovanému bloku souboru. Pohyby čtecí hlavy jsou tím omezené na minimum. 9 Na jednotlivé soubory na disku se CP/M odvolává pomocí jména. Jméno souboru je tvořeno 1 až 8 ASCII znaky; případně je možné za ním udat ještě verzi, která je tvořena 1 až 3 ASCII znaky a je od vlastního jména souboru oddělena tečkou. Příklad: Soubory TURBO a TURBO.COM jsou dva různé soubory, ze kterých první je specifikovaný jen jménem, druhý má jméno stejné jako 1. soubor, ale odlišuje se od něho verzí COM. Jak už bylo uvedeno, soubory umístěné na disku jsou katalogizované v adresáři. Adresář daného disku je umístěný vždy v počátečních alokačních blocích (0 a výše), v každém případě zabírá alespoň jeden alokační blok, a to nultý. Systém ovládání souborů považuje alokační bloky adresáře za obsazené (alokované). Položka adresáře je tvořena popisem jednoho souboru na daném disku. To znamená, že kolik položek má adresář, tolik souborů může disk obsahovat. Počet položek se definuje při implementaci systému. Položka adresáře zabírá 32 bytů. To znamená, že do jednoho sektoru adresáře se vejdou 4 položky. Položka obsahuje kromě jiného příznak obsazení položky, jméno a verzi souboru, počet sektorů souboru a čísla alokačních bloků, které byly souboru přidělené. V položce je vždy 16 míst pro čísla alokačních bloků. Jestliže seznam alokačních bloků zabírá více než 16 míst, musí být pro něj v adresáři rezervovaná další položka, která popisuje toto další rozšíření (extension) souboru. Zrušíme-li soubor, projeví se to v adresáři tak, že do příznaku obsazenosti položky daného souboru se zapíše E5H. Místo v adresáři, které položka zabírala, je možno využít pro položku popisující jiný soubor. Příznak zrušení položky (a tedy i souboru) - konstanta E5H - byla zvolena proto, že distributoři pružných disků popisují disky právě touto konstantou a systému ovládání souborů se takový disk jeví jako prázdný - všechny položky v adresáři mají příznak "zrušený". Programátor, který pracuje s diskovým souborem, se na tento soubor odvolává pomocí řídícího bloku souboru (FCB - File Control Block). FCB je vlastně položkou adresáře (má v podstatě stejnou strukturu) a při práci se souborem jsou do něho přepisované některé údaje z položky adresáře (např. čísla alokačních bloků souboru), které jsou po dobu práce se souborem aktualizované a při uzavření souboru jsou zapsané zpět do adresáře. Struktura FCB je následující: ____________________________________________________________ | | | DN N1 ... N8 V1 V2 V3 EX S1 S2 RC AB0 ... AB15 CR R0 R1 R2 | |____________________________________________________________| 0 1 8 9 10 11 12 13 14 15 16 31 32 33 34 35 10 FCB zabírá 36 bytů s následujícím významem: DN - číslo diskové jednotky, na které chceme vykonávat diskovou operaci; 1 znamená jednotku A, 2 " B, . . 16 znamená jednotku P (max. 16 jednotek označujeme A až P), 0 znamená už předtím (implicitně) vybranou jednotku. Vybraná jednotka (nebo častěji disk), je jednotka na které budou probíhat diskové operace. N1 až N8 - jméno souboru, přičemž v případě, jestliže je kratší než 8 znaků, je do tohoto počtu doplněno mezerami, V1 až V3 - verze souboru, v případě potřeby doplněná mezerami. Protože verze je tvořena ASCII znaky, může být 7. bit kódu využit pro jiné účely: Je-li 7. bit V1 nastaven, je daný soubor chráněný proti zápisu (značí se R/O, Read Only), je-li zrušen, soubor není chráněný (R/W, Read/Write), Je-li 7. bit V2 nastaven, soubor je systémový (značíme SYS) a v seznamu souborů (DIR) se nevypíše, při zrušeném bitu není soubor systémový (značíme DIR). EX - číslo "části" souboru (extension) popsané jednou položkou adresáře. Části (EX) číslujeme 0, 1, 2 atd. S1, S2 - rezervované pro operační systém, RC - počet záznamů (sektorů), které obsahuje daná část (EX) souboru, AB0 až AB15 - čísla alokačních bloků daného souboru, které obhospodařuje operační systém, CR - číslo záznamu (sektoru), se kterým se bude pracovat (v rámci dané části - extension souboru) při sekvenčních operacích (číst/zapisovat). Chce-li uživatel zpracovávat soubor od začátku, nuluje CR. R0 až R2 - tvoří absolutní číslo záznamu (bez ohledu na část EX souboru), které se využívá při přímém přístupu k danému záznamu. Každý soubor, se kterým programátor pracuje, musí být popsán položkou FCB, přičemž místo pro daný FCB může programátor rezervovat kdekoli ve svém programu. Když přistupuje k souboru, musí vyplnit prvních 16 bytů FCB (obvykle vyplní DN, jméno, verzi a zbytek šestnáctice nuluje) a musí inicializovat CR. V případě přímého přístupu musí namísto CR inicializovat R0 až R2. V případě prvního přístupu na disk zjišťuje operační systém 11 o tomto disku některé důležité informace, které potom udržuje v paměti. Jednou z takovýchto velmi důležitých informací je např. obsazenost disku. Operační systém musí zjistit, které alokační bloky jsou již přiřazeny a které jsou ještě volné, aby v případě zápisu nového souboru nepřepsal (použitím už přiřazeného alokačního bloku) některý z existujících souborů. Operační systém přečte celý adresář, kde v jednotlivých položkách jsou čísla už přiřazených alokačních bloků a vyrobí alokační vektor disku. Tento vektor je tvořen posloupností bitů. Kolik alokačních bloků má disk, tolik bitů má alokační vektor. Každý bit odpovídá jednomu alokačnímu bloku. Má-li hodnotu 0, je daný alokační blok volný, v opačném případě je již přiřazen. Operační systém potom během své práce aktualizuje tento alokační vektor (při rušení souboru nuluje, při zápisu nastavuje ty bity, které odpovídají příslušným alokačním blokům). Jak bylo uvedeno, operační systém vyrobí z adresáře alokační vektor disku jen jednou, v případě prvního přístupu na disk. Potom ho už jen aktualizuje. Pro disk, s kterým systém po svém zavedení ještě nepracoval, nemá vytvořený alokační vektor. Disk, pro který už existuje alokační vektor, nazýváme aktivním diskem. Aktivních disků může být několik. Jestliže systém pracoval s prvním diskem, pak s druhým a naposled se třetím, všechny tyto tři disky jsou již aktivní. O tom, které disky jsou aktivní, má systém informaci v tzv. vektoru aktivních disků. Představme si, že v době práce systému někdo v jednotce, se kterou se již pracovalo (je aktivní) vymění disk. Je jisté, že alokační vektor tohoto nového disku nebude totožný s alokačním vektorem předcházejícího disku a při zápisu na tento nový disk (kdy systém využívá alokační mapu předcházejícího disku - neví, že disky byly vyměněny) dojde k přepisování jeho už existujících souborů. Aby se to nestalo, vytváří si operační systém při prvním přístupu na disk kontrolní součty jednotlivých sektorů adresáře a ty potom při své práci kontroluje a aktualizuje. Když nenastane shoda kontrolních součtů disku, se kterým pracuje, se součty, které si vyrobil, oprávněně předpokládá, že se jedná o jiný disk a označí ho jako R/O - chráněný proti zápisu a tak zabrání přepsání informace na tomto disku. Při výměně disku se proto doporučuje stlačit CTRL/C, což způsobí kromě jiného, že všechny disky v systému se označí jako neaktivní, t.j. že se pro všechny budou vytvářet alokační vektory znovu, a ty už budou odpovídat vyměněným diskům. Na závěr si všimneme oblasti systémových parametrů. Jak už bylo řečeno, tato oblast je na adresách 0000 až 00FFH. Na adrese 0000 je skok do BIOSu, který způsobí znovuzavedení modulů CCP a BDOS ze systémového disku do paměti, nastaví adresu DMA na 0080H a všechny disky označí jako neaktivní. (Tuto funkci označujeme jako WBOOT, Warm Boot). Na adrese 0005 je skok do BDOSu a pomocí této adresy jsou volány všechny systémové služby. 12 Skoky na adresách 0000 a 0005 t.j. skoky do BIOSu a do BDOSu jsou při generování systému nasměrovány na skutečné adresy odpovídající uložení operačního systému pro daný rozsah paměti. Od adresy 005CH vytváří CCP řídící blok souboru (FCB) pro soubor daný jako parametr příkazu interpretovaného CCP. Oblast od 0080H do 00FFH, t.j. 128 bytů, tvoří buffer pro jeden sektor disku. DMA se automaticky nastavuje na tuto adresu při funkci WBOOT. Všechny diskové operace se vykonávají po sektorech (128 bytů) a operační systém nemá vlastní I/O buffer pro tyto operace. Programátor musí tento buffer nastavovat sám. Oblast od adresy 0080H využívá též CCP a odevzdává v ní programátorovi text příkazového řádku, který zadal z konzole. 13 2.4 Interpretr příkazů CCP Uživatel komunikuje s CP/M pomocí interpreteru příkazů, který čte příkazy zadávané z konzole. Jednotlivé diskové jednotky označuje CCP písmeny A, B, C, až P (max. počet jednotek, se kterými je CP/M schopen pracovat, je 16), za kterými se píše dvojtečka ":". Říkáme, že disk je vybraný, když CCP adresuje právě tento disk. Aby bylo vždy jasné, který disk je vybraný, CCP informuje operátora kódem tohoto disku (A, B, ..P), který je následován symbolem ">", kterým CCP oznamuje, že je schopen přijmout příkaz. Například, v případě, že je vybraný disk B, CCP se na obrazovce zahlásí výpisem: B> a čeká na příkaz operátora. Když chceme vybrat pro následující operace disk A, zadáme jeho kód: B>A: a CCP se ohlásí A> Kódem disku spolu s dvojtečkou udaným před jménem souboru udáváme, na kterém disku je daný soubor. Jestliže kód disku neudáme, CCP předpokládá, že soubor je na disku, který je právě vybraný. Příkazy CP/M jsou implementované ve dvou úrovních: - příkazy zabudované v CCP, - příkazy realizované pomocí programů rezidentních na discích. Každý příkaz je aktivován zápisem jeho jména, případně parametrů a stlačením klávesy CR. Jde-li o příkazy DIR, ERA, REN, SAVE, TYPE, USER a d:, zabudované v CCP, jsou ihned vykonány. Ostatní, tzv. tranzientní příkazy, hledá CCP na disku. V případě nalezení je zavede do TPA a odevzdá jim řízení. Funkce zabudovaných příkazů je následující: DIR vypíše seznam souborů aktivní nebo zadané jednotky - např. DIR B:*.COM nebo jenom DIR, ERA zruší specifikované soubory - ERA B:A*.*, REN provede přejmenování souboru - REN NEW.MAC=OLD.MAC, SAVE uloží požadovaný počet stránek oblasti TPA (od začátku) na disk pod zadaným jménem - SAVE 16 HELP.TXT, TYPE vypíše obsah souboru (týká se pouze textových souborů), přičemž výpis lze ukončit stiskem libovolné klávesy, USER nastaví číslo uživatele - USER 0 (až 15). Při psaní parametrů příkazů je povoleno užívání hvězdičkové konvence, tj. lze napsat otazník místo libovolného znaku a 14 hvězdička nahrazuje skupinu znaků. Interpreter příkazů využívá jako řídící znaky některé nezobrazitelné znaky ASCII kódu. Tyto znaky jsou generované konzolí displeje při současném stlačení klávesy CTRL a příslušného písmene. Zmíněné znaky se označují jako CTRL/
. Např. CTRL/C generuje kód 03H apod. Následuje
seznam těchto řídících znaků i s jejich funkcemi:
CTRL/C (03) znovuzavedení operačního systému,
CTRL/E (05) fyzické ukončení řádku,
CTRL/P (10H) logické zapnutí/vypnutí tiskárny,
CTRL/S (13H) přerušení výstupu na konzoli a vykonávání
programu až do vstupu jakéhokoli dalšího
znaku,
CTRL/R (12H) výpis obsahu vstupujícího řádku,
CTRL/U (15H) zrušení vstupujícího řádku,
CTRL/X (18H) vymazání vstupujícího řádku z obrazovky i z
operační paměti,
CTRL/Z (1AH) označení konce souboru (u textových souborů).
Pro programy rezidentní na disku konstruuje CCP ze zbytku
příkazového řádku, který následuje bezprostředně za jménem
programu, dva FCB. První od adresy 005CH, druhý od adresy 006CH.
Je-li parametrem příkazu jméno souboru, FCB tohoto souboru
připraví CCP od adresy 005CH. V případě, že je uvedený druhý
parametr, potom pro tento je vytvořen FCB na místě AB0 až AB15
prvního FCB a musí být přesunut do jiné oblasti paměti, aby nebyl
aktivací prvního FCB přepsán.
Dále je pro programy rezidentní na disku oblast od adresy
0080H inicializovaná ASCII řetězcem, který tvoří zbytek
příkazového řádku. Na adrese 0080H je délka tohoto řetězce a od
adresy 0081H následují jednotlivé ASCII znaky. Tímto způsobem
může volaný program získat potřebné parametry.
15
2.5 Standardní služby BDOSu
Každá služba volaná do systému je realizovaná modulem BDOS,
který dle potřeby volá drivery BIOSu. Každá služba má přiřazeno
číslo, které se při volání předává v registru C. V případě, kdy
služba vyžaduje vstupní parametr, např. adresu FCB, je systému
poskytnut v registrech DE. Je-li zapotřebí vstupní parametr
jednobytový (např. znak), odevzdává se v registru E, obsah D je
pak nepodstatný.
Jestliže služba vrací volajícímu programu dvoubytový
parametr, je tento v registrech HL. Jednobytový výstupní parametr
vrací v registru A. Všeobecně pro výstupní parametr platí B=H a
A=L, t.j. obsahy registrů B, H a A, L jsou stejné.
Volání služby se realizuje odevzdáním řízení pomocí
instrukce CALL 0005H. Na této adrese je instrukce JP BDOS, která
zabezpečí správný vstup do BDOSu nezávisle na tom, kde je BDOS v
paměti umístěn. Každá služba se tedy volá následující sekvencí
instrukcí:
LD C,číslo služby
LD DE,parametr
CALL 5
přičemž návrat ze služby je vykonán na adresu následující za
instrukcí CALL 5.
Je potřebné si uvědomit, že služby BDOSu nezachovávají
obsahy registrů !
služba: Reset systému
číslo služby: 0
vstupní parametr: -
výstupní parametr: -
funkce: Odevzdává řízení do BIOSu, který vykoná znovuzavedení
modulů CCP a BDOS z disku do paměti, nastaví adresu DMA na
hodnotu 0080H, zachová předtím vybraný disk a číslo uživatele.
Potom odevzdá řízení na CCP. Tato služba má stejný efekt jako
instrukce JP 0.
služba: Vstup znaku z konzole
číslo služby: 1
vstupní parametr: -
výstupní parametr: ASCII znak
funkce: Přečte znak z konzole (čeká na jeho vstup). Když je kód
přečteného znaku <20H (SPACE) a není to znak CR, LF, TAB nebo BS,
nevypíše ho na konzoli. Ostatní znaky zobrazí na konzoli.
služba: Výstup znaku na konzoli
číslo služby: 2
vstupní parametr: ASCII znak výstupní parametr: -
funkce: Zobrazí vystupující znak na konzoli, případně i na
tiskárně, je-li zapnuta pomocí CTRL/P. Znak TAB zobrazí jako
16
příslušný počet mezer.
služba: Vstup znaku ze snímače
číslo služby: 3
vstupní parametr: -
výstupní parametr: ASCII znak
funkce: Přečte znak ze snímače děrné pásky (čeká na jeho vstup).
služba: Výstup znaku na děrovač
číslo služby: 4
vstupní parametr: ASCII znak
výstupní parametr: -
funkce: Vyděruje znak na děrovači děrné pásky.
služba: Výstup znaku na tiskárnu
číslo služby: 5
vstupní parametr: ASCII znak
výstupní parametr: -
funkce: Vytiskne znak na tiskárně.
služba: Přímý vstup/výstup na konzoli
číslo služby: 6
vstupní parametr: 0FFH (pro vstup znaku)
nebo ASCII znak (pro výstup)
výstupní parametr: ASCII znak (byl-li požadován vstup)
nebo nedefinovaná hodnota.
funkce: Je-li vstupní parametr 0FFH, čte status konzole (ptá se,
zda nebyla stlačena klávesa). Jestliže nebyla žádná klávesa
stlačena, vrací jako výstupní parametr 00, v opačném případě
vrací ASCII reprezentaci vloženého znaku. Z uvedeného vyplývá, že
se nečeká na vstup znaku z konzole! Na rozdíl od služby č. 1
nezobrazuje vstupní znak na konzoli. Je-li vstupní parametr různý
od 0FFH, považuje tento parametr za ASCII kód vypisovaného znaku
a vypíše ho na konzoli.
služba: Zjisti hodnotu I/O bytu
číslo služby: 7
vstupní parametr: -
výstupní parametr: hodnota I/O bytu
funkce: Poskytne obsah adresy 0003. Na této adrese je u systémů
Intel I/O byte.
služba: Nastav I/O byte
číslo služby: 8
vstupní parametr: hodnota I/O bytu
výstupní parametr: -
funkce: Na adresu 0003 uloží vstupní parametr, který představuje
I/O byte.
služba: Vypiš ASCII řetězec
číslo služby: 9
vstupní parametr: adresa počátku řetězce výstupní parametr: -
funkce: Vypíše na konzoli textový řetězec od zadané adresy.
Řetězec musí být ukončen znakem "$" (24H), před kterým výpis
17
skončí. Výpis jednotlivých znaků vykonává stejně jako služba č.2.
služba: Čti řetězec znaků z konzole
číslo služby: 10
vstupní parametr: adresa paměťového bufferu
výstupní parametr: -
funkce: Vstupní parametr je adresou počátku bufferu, který má
následující strukturu:
MAX - 1 byte
SKUT - 1 byte
ZNAKY - SKUT bytů, kde
MAX je maximální počet znaků (bytů), které je možné uložit do
bufferu,
SKUT bude skutečný počet znaků načtených do bufferu. Za tímto
bytem jsou ZNAKY, t.j. ASCII reprezentace znaků tak, jak přišly z
konzole. Vstup znaků z konzole je ukončen znakem CR nebo LF,
které se ale do bufferu již neukládají. Buffer, který je třeba v
paměti rezervovat pro načítání řádku z konzole, musí mít délku
MAX + 2 byty. Jestliže byl buffer naplněn MAX počtem znaků, je
vstup ukončen stejně, jako kdyby vstoupil znak CR.
Při zadávání řetězce znaků je možné vykonávat následující
editační funkce:
- DEL vymaže naposled napsaný znak z bufferu a zobrazí tento
rušený znak na konzoli (DEL se do bufferu neuloží).
- BS vymaže naposled zapsaný znak z bufferu i z obrazovky (BS se
do bufferu neuloží).
- CTRL/E vykoná fyzický přechod kurzoru na nový řádek obrazovky
(obsah bufferu se nezmění).
- CTRL/X způsobí vymazání všech vložených znaků z bufferu i z
obrazovky.
- CTRL/U způsobí vymazání všech vložených znaků z bufferu a
nastaví kurzor na novém řádku pod pozici, odkud začíná
načítávaný řádek.
- CTRL/R nastaví kurzor na nový řádek pod pozici, odkud začíná
načítávaný řádek a vypíše aktuální obsah bufferu.
- CTRL/C - Jestliže byl tento znak stlačený jako první, způsobí
znovuzavedení operačního systému, jinak se uloží do bufferu.
- CTRL/P zapne/vypne tiskárnu, t.j. další vložené znaky se budou
zobrazovat i na tiskárně (když tomu dosud tak nebylo), až do
následujícího stlačení CTRL/P. Hodnota CTRL/P (10H) se do
bufferu neuloží.
Ostatní znaky, pokud jsou zobrazitelné, t.j. jejich kód je >=20H,
se při vstupu zobrazují na konzole (případně i na tiskárně při
CTRL/P). Řídící znaky se zobrazují jako dvojznaky a to znak "^" a
příslušné písmeno. Například 02 se zobrazí jako ^B (B má kód
42H), 1AH se zobrazí jako ^Z (Z má kód 5AH).
služba: Zjisti status konzole
číslo služby: 11
vstupní parametr: -
výstupní parametr: hodnota odpovídající stavu konzole
funkce: Je-li ve vstupním bufferu klávesnice nějaký znak (t.j.
pokud byla stlačena klávesa konzole), vrátí hodnotu 01, v opačném
případě vrátí 00.
18
služba: Zjisti číslo verze systému
číslo služby: 12
vstupní parametr: -
výstupní parametr: číslo verze
funkce: Z důvodu možnosti dalšího rozvoje CP/M a z toho
vyplývající možné nekompatibility mezi jednotlivými verzemi (při
předpokladu, že vyšší verze může mít další nové služby, které
nižší verze nemá), poskytuje tato služba uživatelským programům
možnost zjistit verzi operačního systému. Volání vrátí v registru
jednobytové číslo představující číslo verze (v našem případě 22H,
protože jde o systém 2.2).
služba: Reset diskového systému
číslo služby: 13
vstupní parametr: -
výstupní parametr: -
funkce: Volání zabezpečí inicializaci diskového systému, t.j.
nastaví DMA adresu na 0080H, vybere disk A, všechny ostatní disky
označí jako neaktivní a všechny disky včetně disku A označí jako
R/W. Tato služba není ekvivalentní se službou č. 0. Nedojde k
znovuzavedení systému.
služba: Vyber disk
číslo služby: 14
vstupní parametr: číslo vybíraného disku
výstupní parametr: -
funkce: Označí zadaný disk jako "vybraný", t.j. všechny
následující diskové operace budou probíhat na tomto disku, pokud
není explicitně v FCB uvedeno jinak. Vstupní parametr je 0 pro
disk A, 1 pro B atd. až 15 pro P. Toto nastavení platí až do
následujícího resetu diskového systému.
služba: Otevři soubor
číslo služby: 15
vstupní parametr: adresa FCB
výstupní parametr: kód adresáře
funkce: Před prvním čtením ze souboru, nebo prvním zápisem do
existujícího souboru je potřebné získat informace o tomto
souboru. K tomuto účelu používáme službu "Otevři soubor".
Soubor, který chceme otevřít, udáváme adresou jeho FCB. BDOS
prohlédne adresář zadaného disku pro aktivního uživatele a hledá
položku adresáře, která odpovídá bytům 1 až 14 v udaném FCB.
(T.j. hledá položku, které odpovídá jméno, verze, EX, S1 a S2,
přičemž S2 automaticky nuluje). Jestliže se ve jméně nebo verzi
udané v FCB vyskytuje na pozici některého znaku otazník "?", není
tento znak s odpovídající pozicí v položce adresáře porovnávaný.
Nastane-li shoda s některou položkou adresáře (adresář je
prohledávaný od začátku), je informace z této položky adresáře
překopírovaná do FCB (t.j. čísla alokačních bloků souboru jsou
dosazeny na pozici 16 až 31 v FCB).
Služba Otevři soubor tedy zabezpečí obsazení daného FCB
informacemi o rozsahu a umístění daného souboru na disku. Tyto
informace v FCB jsou během následujících diskových operací s
uvedeným souborem aktualizovány. Opětovné uložení aktualizovaného
FCB do odpovídající položky adresáře zabezpečí služba "Zavři
19
soubor". Výstupní parametr (kód adresáře) bude mít hodnotu 0FFH,
jestliže daný soubor nebyl v adresáři nalezen, v opačném případě
má hodnotu 0 až 3, což odpovídá pozici dané položky adresáře v
sektoru adresáře (- pro aplikační programování nepodstatné).
služba: Zavři soubor
číslo služby: 16
vstupní parametr: adresa FCB
výstupní parametr: kód adresáře
funkce: Soubor, který byl nějakým způsobem aktualizován, je
potřebné uzavřít, t.j. informace o rozsahu souboru a jeho uložení
na disku, které jsou během práce s tímto souborem průběžně
zaznamenávané v FCB, je potřebné uložit do příslušné položky
adresáře. Soubor, z kterého se jen četlo, není nutno zavírat,
protože jeho rozsah ani umístění na disku se nezměnily.
Jestliže byla operace uzavření úspěšná, výstupní parametr má
hodnotu 0 až 3, v případě neúspěšného zavírání (např. soubor není
na disku) vrací služba hodnotu 0FFH.
služba: Hledej první odpovídající položku v adresáři
číslo služby: 17
vstupní parametr: adresa FCB
výstupní parametr: kód adresáře
funkce: Služba hledá od začátku adresáře položku, kterou popisuje
FCB. V případě, kdy najde zadanou položku, dá k dispozici od DMA
adresy záznam (128 bytů) adresáře, ve kterém je daná položka, a
jako výstupní parametr vrátí kód adresáře (0 až 3). Volající
program má potom tuto položku na adrese DMA + 32 * A. Jestliže
hledaný soubor není v adresáři, má výstupní parametr hodnotu
0FFH. Ve jménu, nebo verzi souboru, udaného v FCB se může
vyskytovat jeden, nebo více otazníků "?". V tomto případě, stejně
jako při službě "Otevři soubor", není odpovídající znak v položce
adresáře kontrolovaný na shodu. Otazník tedy zastupuje jakýkoli
znak. V případě, že se otazník nachází na pozici DN (0. byte
FCB), je prohledáván adresář vybraného disku a služba vrátí první
nalezenou položku, která odpovídá danému FCB, i když je tato
položka označena jako zrušená.
služba: Hledej následující položku adresáře
číslo služby: 18
vstupní parametr: adresa FCB
výstupní parametr: kód adresáře
funkce: Služba je ekvivalentní se službou č. 17 s tím rozdílem,
že hledání je vykonáváno od předtím nalezené položky. Tuto službu
je možné volat pouze bezprostředně po službě č. 17 nebo č. 18.
Výstupní parametr má hodnotu 0FFH, jestliže tato položka v
adresáři neexistuje, v opačném případě nabývá hodnoty 0 až 3, což
je pořadové číslo položky v záznamu (sektoru) adresáře.
služba: Zruš soubor
číslo služby: 19
vstupní parametr: adresa FCB výstupní parametr: kód adresáře
funkce: Na disku se zruší soubor odpovídající zadanému FCB. Jméno
a verze souboru mohou obsahovat jeden nebo více otazníků. V tomto
20
případě jsou zrušeny všechny soubory odpovídající dané
specifikaci. Služba vrací hodnotu 0FFH, jestliže zadaný soubor
nebyl v adresáři nalezen, v opačném případě vrací hodnotu 0 až 3.
služba: Sekvenční čtení
číslo služby: 20
vstupní parametr: adresa FCB
výstupní parametr: kód adresáře
funkce: Ze souboru (udaného pomocí FCB), který byl předtím
aktivován službou "Otevři soubor", přečte následující 128 bytový
záznam do paměti na adresu DMA. Záznam se přečte od pozice CR
dané částí souboru a CR se přitom automaticky zvýší tak, že
ukazuje na následující záznam souboru. (CR udává počet přečtených
záznamů z dané části souboru). Jestliže se CR přeplní,
automaticky se otevře další část (EX) souboru a CR se vynuluje.
Služba vrátí hodnotu 00, když byla operace čtení úspěšná.
Nenulová hodnota indikuje, že soubor už neobsahuje žádná data
(jsme na konci souboru).
služba: Sekvenční zápis
číslo služby: 21
vstupní parametr: adresa FCB
výstupní parametr: kód adresáře
funkce: Do souboru (popisovaného FCB), který byl předtím
aktualizován službou "Otevři" nebo "Založ soubor", se zapíše 128
bytový záznam z adresy DMA. Záznam je uložen na pozici, na kterou
ukazuje CR a tento se přitom automaticky zvýší tak, že ukazuje na
následující budoucí záznam souboru. Když se CR přeplní,
automaticky se otevře další část souboru a CR se nuluje. Při
vykonání zápisu do existujícího souboru je příslušný starý záznam
(daný CR) přepsán novým záznamem.
Služba vrátí hodnotu 00, byla-li operace zápisu úspěšná.
Nenulová hodnota indikuje plný disk.
služba: Založ soubor
číslo služby: 22
vstupní parametr: adresa FCB
výstupní parametr: kód adresáře
funkce: Služba "Založ soubor" je podobná službě "Otevři soubor",
s rozdílem, že FCB musí obsahovat jméno souboru, který se v
adresáři nenachází. Operační systém vytvoří na disku prázdný
soubor o nulové délce a jeho jméno zapíše do adresáře. Služba
vrací hodnotu 0 až 3 při úspěšné operaci, nebo 0FFH, když v
adresáři už není místo. Do takto vytvořeného souboru je možno
zapisovat pomocí služeb č. 21 a č. 34.
služba: Přejmenuj soubor
číslo služby: 23
vstupní parametr: adresa FCB
výstupní parametr: kód adresáře
funkce: Služba změní jméno souboru, specifikovaného prvními
šestnácti byty FCB, na jméno, které je zadáno v druhé šestnáctici
FCB. Kód disku na pozici 0 v FCB se využije pro výběr disku. Při
návratu ze služby má výstupní parametr hodnotu 0 až 3 při
úspěšném přejmenování, nebo 0FFH, když přejmenovávaný soubor na
21
disku není.
služba: Vrať vektor aktivních disků
číslo služby: 24
vstupní parametr: -
výstupní parametr: vektor aktivních disků (2 byty)
funkce: Služba poskytne v registrech HL informaci o discích,
které jsou aktivní, t.j. pro které systém ovládání souborů
vytvořil příslušné tabulky v operační paměti. Bit 0 reg. L
odpovídá jednotce A, bit 7 reg. H odpovídá jednotce P. Má-li bit
hodnotu 1, znamená to, že odpovídající jednotka je aktivní.
služba: Vrať číslo vybraného disku
číslo služby: 25
vstupní parametr: -
výstupní parametr: číslo vybraného disku
funkce: Služba vrátí číslo vybraného disku, t.j. číslo 0 pro disk
A, atd. až č. 15 pro disk P.
služba: nastav DMA adresu
číslo služby: 26
vstupní parametr: požadovaná DMA adresa
výstupní parametr: -
funkce: DMA adresa (DMA = Direct Memory Access) je adresa v
operační paměti, kam se čte (odkud se zapisuje) sektor diskového
souboru.
Poznámka: V případě většiny řadičů pružných disků nejde o
přímý přístup do paměti, jak název DMA napovídá, ale DMA je třeba
chápat jako ukládací adresu v operační paměti.
Adresa DMA zůstává pro všechny následující diskové operace
nezměněna až do dalšího volání služby č. 26. Vyjímku tvoří volání
služeb č. 0 a 13, které nastavují DMA adresu na 0080H.
služba: Dodej adresu alokačního vektoru
číslo služby: 27
vstupní parametr: -
výstupní parametr: adresa alokačního vektoru
funkce: Služba poskytne v registrech HL adresu počátku alokačního
vektoru vybraného disku. Alokační vektor je tvořen posloupností
bitů, přičemž každý bit této posloupnosti odpovídá příslušnému
alokačnímu bloku. Je-li alokační blok volný, má příslušný bit
hodnotu 0, v opačném případě má hodnotu 1. Délka alokačního
vektoru, t.j. počet jeho bitů odpovídá max. počtu alokačních
bloků a tedy závisí na kapacitě disku.
služba: Označ disk jako chráněný proti zápisu
číslo služby: 28
vstupní parametr: -
výstupní parametr: -
funkce: Služba označí vybraný disk jako chráněný proti zápisu
(R/O). Na tento disk není možné zapsat soubor, mazat nebo
přejmenovávat soubor. Tato ochrana trvá až do doby volání služby
0 nebo 13, které všechny disky v systému označí jako R/W, t.j.
zruší jejich ochranu.
22
služba: Dodej hodnotu R/O vektoru
číslo služby: 29
vstupní parametr: -
výstupní parametr: hodnota R/O vektoru
funkce: Služba poskytne v registru HL hodnotu R/O vektoru
tvořeného posloupností bitů, z kterých každý odpovídá jednomu
disku v systému. Má-li příslušný bit hodnotu 1, je odpovídající
disk chráněný proti zápisu. Nejméně významný bit odpovídá disku
A, atd.
služba: Nastav atributy souboru
číslo služby: 30
vstupní parametr: adresa FCB
výstupní parametr: kód adresáře
funkce: Služba změní atributy souboru "chráněný proti zápisu" a
"systémový" podle hodnoty příslušných bitů verze v FCB, tj.
nastavený 7. bit prvního znaku verze označuje R/O, 7. bit druhého
znaku verze označuje soubor jako systémový.
služba: Dodej adresu bloku diskových parametrů
číslo služby: 31
vstupní parametr: -
výstupní parametr: adresa bloku diskových parametrů
funkce: Volání této služby poskytne v registru HL adresu v BIOSu,
od které začíná blok diskových parametrů vybraného disku. Tento
blok udává fyzické charakteristiky příslušného disku.
služba: Poskytni/změň číslo uživatele
číslo služby: 32
vstupní parametr: - 0FFH pro poskytnutí čísla uživatele,
- hodnota různá od 0FFH pro nastavení nového
čísla uživatele
výstupní parametr: číslo uživatele (bylo-li požadováno)
funkce: Je-li vstupní parametr 0FFH, poskytne služba číslo právě
nastaveného uživatele (0 až 15). V případě, že je vstupní
parametr různý od 0FFH, předpokládá se, že je to číslo uživatele,
které je třeba nastavit.
služba: Přímé čtení ze souboru
číslo služby: 33
vstupní parametr: adresa FCB
výstupní parametr: kód chyby
funkce: Volání služby poskytne na nastavené DMA adrese 128 bytový
záznam ze souboru (předtím aktivovaného službou "Otevři soubor"),
popsaného v FCB, přičemž absolutní pořadové číslo tohoto záznamu
v souboru bylo udáno v FCB+33 a FCB+34. Při volání služby musí
být hodnota bytu na adrese FCB+35 nulová! Tato služba, na rozdíl
od sekvenčního čtení, automaticky nezvýší udanou hodnotu čísla
záznamu.
Číslo požadovaného záznamu může nabývat hodnoty 0 až 65535 a
může proto specifikovat část až 8 megabytů dlouhého souboru.
Služba navíc automaticky nastaví v FCB odpovídající část
souboru (EX) i číslo přečteného záznamu (CR).
23
Vrácený výstupní parametr reprezentuje následující chybové
kódy:
0 - žádná chyba, operace se vykonala,
1 - byla čtena nezapsaná data,
2 - tento kód není využit,
3 - nemůže uzavřít danou část souboru,
4 - chce číst z nezapsané části souboru,
5 - plný adresář,
6 - pokus o čtení mimo fyzický konec disku.
služba: Přímý zápis do souboru
číslo služby: 34
vstupní parametr: adresa FCB
výstupní parametr: kód chyby
funkce: Služba je podobná službě předešlé s tím rozdílem, že
vykonává přímý zápis do souboru. I chybové kódy, které služba
vrací, jsou stejné.
služba: Vypočti délku souboru
číslo služby: 35
vstupní parametr: adresa FCB
výstupní parametr: vrácená délka souboru na adresách FCB+33,
FCB+34, FCB+35
funkce: Služba vrátí počet záznamů souboru udaného v FCB na
adresy FCB+33, +34, +35. Soubor může mít délku 0 až 65536 záznamů
(sektorů) a na uložení tohoto čísla jsou nutné 3 byty. Délka
souboru podle nejvyššího pořadového čísla záznamu v nejvyšší
přiřazené části souboru udává tedy pořadové číslo prvního volného
záznamu na konci souboru. Byl-li ale soubor zapsán pomocí služby
č. 34, nemusí délka odpovídat počtu uložených záznamů.
služba: Vrať číslo záznamu pro přímý zápis
číslo služby: 36
vstupní parametr: adresa FCB
výstupní parametr: číslo záznamu na adresách FCB+33 a FCB+34
funkce: Při sekvenčním čtení nebo zápisu je udané v FCB číslo
části (EX) souboru a pořadové číslo záznamu v této části (CR).
Volání služby 36 poskytne na adresách FCB+33 a FCB+34 absolutní
pořadové číslo záznamu (od začátku souboru) nehledě na právě
otevřenou část souboru.
služba: Reset diskové jednotky
číslo služby: 37
vstupní parametr: vektor diskových jednotek (reg. DE)
výstupní parametr: 0
funkce: Na rozdíl od služby č. 13, která vykonávala reset celého
diskového systému (t.j. všech diskových jednotek), zabezpečuje
tato služba reset jen zadaných diskových jednotek. Jako vstupní
parametr se odevzdává 16 bitový vektor (délka odpovídá max.
možnému počtu jednotek v systému), přičemž nejnižší bit odpovídá
jednotce A, nejvyšší jednotce P. Jednotkám, na které chceme
aplikovat reset (t.j. nastavit jako neaktivní a nechráněné proti
zápisu) nastavíme v odevzdávaném vektoru odpovídající bit.
24
číslo služby: 38
Tato služba není implementovaná
číslo služby: 39
Tato služba není implementovaná
služba: Popiš alokační blok nulami a potom do něho ulož záznam
číslo služby: 40
vstupní parametr: adresa FCB
výstupní parametr: kód chyby
funkce: Služba má stejný efekt jako služba č. 34 s tím rozdílem,
že v případě prvního zápisu do nově alokovaného bloku se tento
nejdříve popíše binárními nulami a až pak se do něho uloží
záznam. Vykonává vlastně před zápisem "inicializaci" obsahu
alokovaného bloku.
Chybový kód, který služba vrací, je stejný, jako v případě
služby č. 34.
25
2.6 Modul BIOS
Vstupně/výstupní modul (BIOS) je modul, ve kterém jsou
soustředěny všechny části operačního systému, závislé na
technických prostředcích, na kterých je systém CP/M
implementován. Tento modul má jednoznačně definovaný vstupní
vektor, přes který jsou volány drivery (obslužné podprogramy)
jednotlivých zařízení. Implementovat CP/M na konkrétní typ
počítače znamená v konečném důsledku napsat BIOS pro tento
počítač.
Dále se budeme zabývat především společnými znaky různých
BIOSů, t.j. vstupním vektorem, přes který může uživatel
programovat přímo vstupně/výstupní operace, aniž by volal jádro
operačního systému. Popis BIOSu pro Sharp MZ-800 je součástí
tohoto textu a je o něm pojednáno později. Případného zájemce o
podrobnější popis klasického BIOSu odkazuji na [15], resp. [16].
Vstupní vektor se nachází na začátku BIOSu. Má 17 položek, z
kterých každá představuje 3 bytovou instrukci skoku na příslušný
podprogram BIOSu. Struktura vektoru je následující:
JP BOOT ;vstupní bod do BIOSu při počátečním zavedení
;operačního systému z disku do paměti
JP WBOOT ;zajistí znovuzavedení modulů CCP a BDOS do paměti
JP CONST ;zjistí stav konzole
JP CONIN ;čte znak z konzole
JP CONOUT ;vypíše znak na konzoli
JP LIST ;vypíše znak na tiskárně
JP PUNCH ;vyděruje znak do děrné pásky
JP READER ;přečte znak ze snímače děrné pásky
JP HOME ;nastaví hlavu na stopu 0 vybraného disku
JP SELDSK ;vybere diskovou jednotku
JP SETTRK ;nastaví číslo stopy
JP SETSEC ;nastaví číslo sektoru
JP SETDMA ;nastaví DMA adresu
JP READ ;čte nastavený sektor
JP WRITE ;zapíše nastavený sektor
JP LISTST ;vrátí status tiskárny (její připravenost)
JP SECTRN ;převeďe logické číslo sektoru na fyzické
Vstupní vektor BIOSu je možno rozdělit na tři logické části:
inicializaci systému (BOOT, WBOOT), jednoznakové I/O operace
(CONST, CONIN, CONOUT, LIST, PUNCH, READER, LISTST) a diskové
operace (HOME, SELDSK, SETTRK, SETSEC, SETDMA, READ, WRITE,
SECTRN).
O všech jednoznakových operacích se předpokládá, že jsou
vykonávány se znaky v kódu ASCII, s nulovým sedmým bitem. Na
periferní zařízení CP/M hledí jako na "logická", konkrétní
fyzická zařízení definuje BIOS.
Logická periferní zařízení, která CP/M ovládá, jsou:
konzole: Základní I/O periférie, přes kterou operátor komunikuje
26
se systémem. Nejčastěji je to displej s klávesnicí
(terminál), ale obecně to může být i psací stroj,
dálnopis apod.
tiskárna: Zařízení pro výpisy textů (mozaiková tiskárna, rychlá
řádková tiskárna apod.).
děrovač: Zařízení pro děrování děrné pásky.
snímač: Zařízení pro čtení děrné pásky.
V BIOSu napíše implementátor drivery pro konkrétní zařízení,
která mají funkce odpovídající uvedeným logickým zařízením. Je
zřejmé, že daný systém nemusí všechny tyto periférie obsahovat.
Pro práci CP/M je nezbytná pouze konzole.
Nutno poznamenat, že poslední dvě jmenovaná zařízení (pro
práci s děrnou páskou) jsou dnes uváděna jaksi pro úplnost, neboť
jejich využití mělo význam spíše v době vzniku CP/M. V dnešní
době je výhodnější místo těchto zařízení zabudovat např. přídavná
sériová rozhraní.
Diskové operace se provádějí jako posloupnost volání
jednotlivých podprogramů, které nastavují číslo diskové jednotky,
stopy, sektoru a adresu v paměti pro danou operaci. Příslušné
parametry musejí být nastaveny ještě před samotnou operací čtení
nebo zápisu a zůstávají nezměněné až do okamžiku, kdy nastavíme
jejich novou hodnotu.
V následujícím textu jsou detailně popsané jednotlivé rutiny
obsažené v BIOSu.
BOOT - Vstupní bod do BIOSu, na který odevzdává řízení zavaděč
operačního systému (Cold Start Loader) po zavedení
celého systému do paměti. Inicializuje některé systémové
parametry.
WBOOT - Na tuto adresu je odevzdané řízení při volání služby č.
0 (reset systému). Adresa 0 v oblasti systémových
parametrů obsahuje instrukci skoku na tuto položku
vstupního vektoru BIOSu. WBOOT zabezpečí znovuzavedení
modulů CCP a BDOS do paměti a odevzdává řízení na CCP.
Skok na adresu 0 (JP 0) je obvyklý způsob ukončení práce
uživatelských programů a odevzdání řízení operačnímu
systému.
CONST - Přes tento bod se získá stav vstupu konzole. V registru
A poskytne tento podprogram hodnotu 0FFH, pokud je na
konzoli připravený znak pro vstup, jinak vrací nulu.
CONIN - Podprogram přečte ze vstupu konzole znak do registru A a
nuluje sedmý (paritní) bit. Podprogram čeká, dokud na
konzoli není znak k dispozici.
CONOUT - Podprogram zabezpečí výpis znaku z registru C na
konzoli.
LIST - Znak z registru C se vypíše na tiskárně.
PUNCH - Znak z registru C se vyděruje do děrné pásky.
READER - Ze snímače děrné pásky se přečte znak do registru A.
Podprogram na znak čeká.
HOME - Na vybraném disku nastaví hlavu na nultou stopu.
SELDSK - Vybere disk, kterého číslo je v registru C (0 pro disk
27
A, 1 pro B atd.) pro následující diskové operace.
Podprogram vrátí v registru HL adresu 16 bytové oblasti
(tzv. hlavičky bloku diskových parametrů) patřící
vybranému disku. Při pokusu vybrat neimplementovaný disk
vrací hodnotu 0000.
Struktura hlavičky bloku diskových parametrů a vlastního
bloku diskových parametrů přesahuje rámec tohoto
přehledu a je popsaná v [16].
SETTRK - V registru BC se BIOSu předává číslo stopy, na které se
má vykonat následující disková operace. Podprogram
nastaví tuto stopu.
SETSEC - V registru BC se zadává číslo sektoru, na kterém se má
vykonat následující disková operace. Podprogram nastaví
tento sektor.
SETDMA - V registru BC se zadává počáteční adresa oblasti paměti
(DMA adresa) pro následující čtení nebo zápis na disk.
Například jestliže při BC = 1000H nastavíme DMA adresu,
budou následující diskové operace čtení i zápisu
vykonávané na adresách 1000H až 107FH tak dlouho, dokud
tuto adresu nezměníme.
READ - Podprogram čte jeden záznam o délce 128 bytů z vybraného
disku, nastavené stopy a sektoru na nastavenou adresu
DMA.
V registru A vrátí 0 v případě úspěšné operace a 1 v
případě chyby. Chybový kód 1 je jednotný pro všechny
druhy chyb, ať už jde o chybu adresace na disku, ztrátu
dat, chybu kontrolního součtu atd.
WRITE - Podprogram zapíše jeden záznam o délce 128 bytů na
nastavený sektor na nastavené stopě na vybraném disku z
nastavené DMA adresy.
V registru A je vrácena 0 při úspěšné operaci, nebo 1 v
případě chyby.
LISTST - V registru A vrátí hodnotu 0, jestliže tiskárna není
schopna převzít vypisovaný znak. V případě její
připravenosti se vrací hodnota 0FFH.
SECTRN - Podprogram zabezpečuje převod logického čísla sektoru na
fyzické. Vstupními parametry jsou logické číslo sektoru
v registru BC a adresa převodní tabulky v registru DE.
Logické číslo sektoru je vlastně indexem v této tabulce.
Podprogram poskytne v registru HL výsledné fyzické číslo
sektoru.
CP/M nemusí zapisovat jednotlivé sektory na disk v
plynule stoupajícím pořadí, ale z důvodu minimalizace
přístupové doby mohou být sektory zaznamenány na
přeskáčku. Tento způsob záznamu potom v konečném
důsledku znamená, že čísla sektorů, ve kterých je
sekvenčně zapsán soubor, se neshodují s čísly
odpovídajících sektorů na disku. Říkáme, že sektory
každé stopy jsou přečíslované. Je-li např. parametr
tohoto prečíslení rovný 6, vypadá posloupnost po sobě
následujících fyzických sektorů takto: 1, 7, 13, 19, 25,
5, 11, 17 atd. Logickému číslu sektoru 0 pak odpovídá
fyzický (skutečný) sektor č. 1, logickému číslu 1
odpovídá sektor 7, logickému číslu 2 odpovídá sektor 13
atd.
28
Ze všech funkcí realizovaných přes vstupní vektor, kromě
BOOT a WBOOT vykonává BIOS návrat pomocí instrukce RET.
Na závěr této kapitoly je znázorněn způsob, jak může
uživatel programovat diskové operace přes vstupní vektor
nezávisle na umístění BIOSu v paměti. Toto je potřebné v případě,
kdy vykonáváme konverzi diskových souborů mezi různými operačními
systémy apod.
Víme, že na adrese 0 v oblasti systémových parametrů je
instrukce skoku na 2. položku, t.j. na instrukci JP WBOOT
vstupního vektoru BIOSu. Adresová část této instrukce tedy
obsahuje adresu instrukce JP WBOOT. Protože struktura vstupního
vektoru je pevně daná, znamená to, že instrukce JP SELDSK, JP
SETTRK, JP SETSEC, JP SETDMA, JP READ, JP WRITE je o 24, 27, 30,
33, 36, 39 bytů dále od instrukce JP WBOOT (její adresu můžeme
zjistit) a tak můžeme napsat následující podprogramy:
DISK: LD HL,(1) ;vyber disk
LD DE,24
ADD HL,DE
JP (HL)
TRACK: LD HL,(1) ;nastav stopu
LD DE,27
ADD HL,DE
JP (HL)
WRT: LD HL,(1) ;zapiš sektor
LD DE,39
ADD HL,DE
JP (HL)
Funkci vyber disk E a nastav stopu 37H pak můžeme
programovat následujícím způsobem:
LD C,4 ;disk E
CALL DISK
LD A,L ;je zadaný disk v systému ?
OR H
JR Z,ERROR ;jednotka není v systému
LD BC,37H ;číslo stopy
CALL TRACK ;nastav zadanou stopu
29
3. Implementace CP/M na Sharpu - popis systému
Sharpovskému CP/M jsou věnovány celé dvě následující obsáhlé
kapitoly. Podrobný a úplný popis programové obsluhy všech
zařízení by ovšem byl zbytečně obsáhlý a není ani nutný pro účely
pochopení funkce systému jako celku. Snažil jsem se proto
zachovat stručnost, aniž by byly vypuštěny některé důležité
informace.
Vzhledem k rozšířené funkci některých služeb oproti
"klasické" CP/M je nový BIOS poměrně složitý program. Svědčí o
tom i jeho délka (kolem 6 kilobytů), která ve srovnání s
obyčejným BIOSem je asi pětkrát větší. Rozsah paměti, kterou
zabírá celý systém, se tím zdvojnásobuje. Proto je systém
implementován tak, jako by pracoval na počítači s 60 KB RAM. CCP
začíná na adrese D400H, BDOS na DC00H a BIOS na adrese EA00H,
přičemž zabírá místo až do konce paměti RAM (FFFFH). Co se týče
obsahu modulů CCP a BDOS, i když mají standardní délku a funkci,
jsou přepsané do instrukčního souboru procesoru Z-80 a zároveň
mírně přepracované na rozdíl od původního jádra CP/M od Digital
Research.
3.1 Vlastnosti použitého CCP a BDOS
Prvotním impulsem k přepracování těchto standardních modulů
byla nešťastná vlastnost klasického CP/M, že potřeboval stisknout
CTRL/C po každé výměně diskety. Při opomenutí této akce došlo pak
dříve či později k nucenému opuštění běžícího programu, jakmile
se uživatel pokusil na nově vloženou disketu psát. Tuto situaci
nebylo možno žadným způsobem obejít, opomineme-li různé programy
řešící tento problém přidáním dalšího rezidentního modulu pod
CCP.
Nejdříve byla upravena příslušná část BDOSu, ošetřující
detekci výměny diskety (nesouhlasící kontrolní součty adresáře)
následným výpočtem nových kontrolních součtů a samozřejmě
aktualizací celého alokačního vektoru. Tyto změny byly provedeny
v původním BDOSu, a to nepříliš populárním způsobem, kterému se
občas říká záplata (přímo v kódu). Protože to ale nebylo
elegantní, dospěla situace nakonec k tomu, že originální CCP a
BDOS byly podrobeny důkladnému disassemblování a všechny změny v
obou modulech pak byly prováděny ve zdrojovém textovém souboru.
Současně došlo k přepsání programu do instrukčního souboru
procesoru Z-80, což přineslo jednak určité zrychlení a také
zkrácení modulů, takže mohly být do nich doplněny některé další
funkce.
Vzniklý BDOS má na rozdíl od standardu tyto nové vlastnosti:
1) Diskety v mechanikách lze měnit v libovolný okamžik, aniž by
bylo třeba po výměně tisknout CTRL/C (BDOS si to provede sám).
Není pouze dobré např. měnit disketu v době, kdy je otevřen
nějaký soubor, se kterým se pracuje. To ovšem není žádný
prohřešek proti standardu, neboť něco podobného nelze dělat
snad v žádném operačním systému. Přitom samozřejmě funkce
30
klávesy CTRL/C zůstala zachována, takže její stisk způsobí
aktivaci pouze vybrané jednotky.
2) Při volání služby č. 13 (reset systému) nedochází k aktivaci
jednotky A:, jak tomu bylo dříve, nýbrž se pouze reaktivuje
právě vybraná jednotka. Při návratu ze služby je nastavena
jednotka A:, jak to popisuje standard, avšak není aktivována.
Aktivace jednotky znamená totiž vytvořit nový alokační vektor,
a to podle zaplnění diskety může trvat i jednu až dvě sekundy.
Zvláště při běhu dávky (SUBMIT) z jiné jednotky než A: je toto
zdržení dost citelné. Obvykle totiž po návratu z resetu stejně
nastavujeme jinou než systémovou jednotku a protože nyní vůbec
nedojde k její aktivaci, celý proces se urychlí.
3) Z BDOSu bylo vypuštěno původní chybové hlášení "R/O disk"
(protože nyní už k tomu nemůže dojít) a dále hlášení "Bad
sector" a "Select", protože tyto chyby si ošetřuje BIOS.
Hlášení "R/O file" bylo ponecháno s tím, že je doplněno volbou
"Abort/Ignore". Volbou Abort vypadneme do DOSu, stiskem "I"
nastane návrat ze služby tak, jako by byl soubor smazán,
přejmenován či přepsán, ale ve skutečnosti k tomuto nedošlo.
Při ukládání nového souboru se starým jménem teď budou v
adresáři oba soubory zároveň, a je na nás, co s nimi pak
uděláme. Každopádně však nemusíme opuštěním programu přijít o
třeba i důležitá data.
4) Byly rozšířeny možnosti využívání dělení disku do
uživatelských oblastí (USERs). Týká se to služeb pro otevření
souboru, sekvenční i přímé čtení a výpočet délky souboru. V
těchto případech nedochází k obvyklému prohlížení adresáře,
ale nové prohlížení má dva průchody. První průchod je totožný
s původním prohledáváním adresáře. Je-li nalezen hledaný
soubor, služba končí a vrací se do volajícího programu.
Jestliže hledání však končí neúspěchem, adresář je prohledáván
znovu od začátku s tím rozdílem, že není porovnáváno číslo
uživatele. Dojde proto i k nalezení souboru stejného jména,
který byl však zaznamenán pod jiným číslem uživatele. To
umožňuje volat programy i od jiných uživatelů, avšak nemůžeme
tyto programy či soubory mazat či jinak modifikovat. Při
výpisu adresáře (DIR) se tyto soubory pochopitelně nevypisují.
Navenek se to celé jeví tak, jako by soubory z ostatních
uživatelů měly příznak SYS a R/O.
Také modul CCP byl mírně přepracován, a to:
1) Na první pohled je vidět změněný prompt. CCP se hlásí
A0>_
Je zřejmé, že mezi kódem disku a znakem připravenosti se
vypisuje ještě číslo aktuálního uživatele, aby bylo vždy
jasné, jaký uživatel je právě aktivní.
2) Je přidán další rezidentní příkaz, a sice COPY. Tento příkaz
je poměrně užitečný, neboť při práci neustále něco někam
kopírujeme a jsme nuceni na to volat speciální kopírovací
program (PIP nebo POWER) což zdržuje jednak vlastním zaváděním
tohoto programu a jednak je zmenšen paměťový prostor
využitelný ke kopírování. Rezidentní COPY samozřejmě využívá
celou oblast TPA. Syntaxe je stejná jako u příkazu REN:
31
COPY DestFile=SourceFile
Na místě zdrojového i cílového souboru je nunto zadat úplné
jméno souboru, takže není možné např. napsat
COPY a:=b:*.*
což ale není závažné omezení, protože větší počet souborů
nejčastěji kopírujeme pomocí dávky (SUBMIT) a zde není problém
všechny soubory vypsat.
3) Dávka (SUBMIT) běží z libovolné aktivní jednotky a uživatele
(není vázána na systémový disk). To je výhodné v případě, že
využíváme rychlý RAM disk, který přitom není adresován jako
A:.
4) V případě zaplnění disku (připadá v úvahu během SAVE nebo
COPY) následuje smazání souboru, který zaplnění způsobil.
Nehrozí proto situace, že by na disku zůstala část původního
souboru a chyběl jeho konec (původní CCP to tak dělal).
5) Je ošetřen stav, kdy zavádíme z disku do TPA dlouhý program a
zároveň je pod CCP rezidentní nějaký další modul. Nevejde-li
se nahrávaný program do zmenšené TPA, je vypsáno hlášení "No
space" a program není zaveden. U původního CCP došlo k
destruktivnímu přepsání rezidentního modulu.
32
3.2 Zavedení systému
CP/M maximálně využívá standardního hardwaru Sharp. Proto i
bootování systému probíhá standardně pomocí vestavěné ROM. Po
zapnutí počítače a vložení diskety do jednotky A: ROM přečte boot
sektor (strana 1, stopa 0, sektor 1) a podle údajů v něm natahne
vlastní booter. Tento program o délce asi 1 KB je umístěn na
disku na straně 1, stopě 0 a sektorech 2 až 5. Po zavedení v módu
MZ-700 od obvyklé adresy 1200H se připne RAM od 0000H, booter se
přemístí od této adresy a je mu odevzdáno řízení. Následuje
inicializace všech I/O obvodů (GDG je přepnuto do módu MZ-800,
single read a single write, inicializují se scroll registry) a
jsou vyslána řídící slova do PPI, PIO a PIT. PPI a PIO pracují v
obvyklém módu, pouze brána A obvodu PIO se používá pro
přerušování CPU v módu IM 2 od signálu VBLN (50 Hz). PIT kanál
nula generuje zvukové signály (pípání kláves a BEL) a druhé dva
kanály zapojené v serii dělí řádkový kmitočet obrazu pro
generování reálného času. Po inicializaci obvodů booter zkoumá
záznam na disketě (zda je jedno- nebo oboustranná) a podle
tohoto zjištění zavede vlastní operační systém nezávisle na tom,
je-li mechanika oboustranná či nikoli a předá mu řízení skokem do
sestavovacího programu na konci BIOSu. Zde je třeba říci, že to,
co se natahuje z disku, není přímo BIOS v té podobě, jak později
běží. Booter prohlédne instalační tabulky na začátku BIOSu (ty
popisují konkrétní individuální konfiguraci systému) a podle
jejich obsahu přemístí závislé části BIOSu na správná místa, čímž
teprve vznikne spustitelný BIOS. Zároveň jsou ztraceny rutiny,
které nejsou v konkrétní konfiguraci potřebné a spuštěním BIOSu
je přepsán i sestavovací program, protože ten je umístěn v
diskovém bufferu. Proto např. není možné již spuštěný BIOS
disassemblovat, protože již není kompletní. Nelze rovněž provést
v BIOSu nějaké změny a zapsat jej zpět na disk, protože by se
podruhé nespustil. Po vygenerování individuální verze BIOSu se
inicializuje obvod SIO vysláním asi deseti řídících slov, jejichž
obsah je dán požadavky uživatele a lze jej měnit programem SETUP.
Je-li připojen RAM disk, je také inicializován jeho adresář.
Do všech příznaků obsazenosti je zapsáno E5H, takže disk je
prázdný, ale v případě potřeby lze programem POWER pomocí příkazu
RECLAIM obnovit původní obsah RAM disku (zbytek adresáře je
zachován). Zálohovaný RAM disk lze také naplnit sekvencí, která
zajistí, že BIOS při bootu disk vůbec neinicializuje - tato
sekvence je vzestupná řada čísel od 8 do 0FH včetně, zapsaná od
adresy 0008H do nulté stránky RAM disku. Vznikne tak vlastně
fiktivní položka adresáře, která je-li zapsána pod číslem
uživatele 31, je trvalá a systémovými službami přitom
nepřístupná. Chceme-li, aby tato položka nezabírala na disku
žádné místo (jako fiktivní soubor), musíme do druhé šestnáctice
bytů této položky uložit samé nuly. Začátek RAM disku tedy bude
vypadat např. takto:
Adr: 0000 Data: 1F 00 00 00 00 00 00 00 08 09 0A 0B 0C 0D 0E 0F
0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Nakonec celé bootovací sekvence je vypsán seznam všech
33
nastavených logických disků i s jejich kapacitami a je předáno
řízení do CCP.
Teplý start systému funguje standardním způsobem. Po skoku
JP BIOS+3 jsou z disku zavedeny moduly CCP a BDOS a je jim
předáno řízení.
Určitou negativní vlastností je nemožnost použít obvyklého
CTRL/RESET k teplému restartu CP/M. Je to dáno tím, že po resetu
původní ROM inicializuje všechny obvody a BIOS pak již nemůže v
jejich registrech obnovit původní hodnoty, protože je jednoduše
nezná. Kromě toho inicializaci většiny obvodů z prostorových
důvodů neprovádí samotný BIOS, ale předcházející booter. Použití
CTRL/RESET tedy vede sice ke skoku do CP/M, ale obvody pracují v
nesprávných režimech. Ze stejného důvodu nemohou také uživatelské
programy měnit režimy periferních obvodů, protože BIOS je zpět
již nepřeprogramuje.
34
3.3 Obsluha klávesnice
Čtení klávesnice je napsáno znovu v BIOSu, nepoužívá se tedy
rutin v ROM. Klávesnice má proto několik dalších funkcí, jako je
předávání znaků přes buffer o délce 256 bytů (je umístěn na konci
VRAM), opakování již odeslaných příkazů, funkce smazání
klávesnicového bufferu, používání funkčních kláves atd.
Klávesnice se čte přes přerušení v módu IM 2 od obvodu PIO (50
Hz). Zároveň s obsluhou klávesnice je zobrazován kurzor (některé
programy vyžadují viditelný kurzor i v době, kdy se nečeká na
klávesnici). Přerušení rovněž hlídá, zda se nemá vypnout motor
některé mechaniky (při dosažení 250 přerušení od poslední operace
s mechanikou). Stará se i o zobrazování systémového řádku (mód
klávesnice, reálný čas a obsah funkčních kláves) a umožňuje
pravidelný autorepeat (s tím byly v původní P-CP/M problémy,
protože zde nebylo přerušení využito).
Z klávesnice lze zapsat všechny znaky o kódech 0 až FFH (!),
což lze s výhodou použít k psaní češtiny v kódu KOI-8-Cs. Vedlo
to k určité komplikaci, protože klávesnice kromě těchto znaků
musí vracet i interní řídící znaky (funkční klávesy, ovládání
bufferu apod.) a proto BIOS používá ke čtení klávesnice
dvoubytové číslo pro kód klávesy.
Klávesnice je čtena neustále nezávisle na ostatních
činnostech počítače. V případě, že běžící program nestačí znaky z
klávesnice zpracovávat, klávesnice pracuje do vyrovnávacího
klávesnicového bufferu. Je proto možné např. při překladu souboru
asemblerem již zadat příkaz pro spuštění překládaného programu,
který v době zadání tohoto příkazu ještě vlastně neexistuje.
Jinou funkcí je opakování již zadaného příkazu. Text
několika naposled napsaných řádek je totiž i po odeslání klávesou
CR uložen v bufferu a jednotlivé příkazy je možno vyvolat
klávesou BLANK. Chceme-li např. opakovat poslední zapsaný příkaz,
stiskneme BLANK a CR. O více příkazů se dá vracet vícenásobným
stiskem BLANK. Pro vymazání nahromaděného textu z bufferu na
obrazovce lze s výhodou použít CTRL/X. Klávesnicový buffer je
cyklicky uzavřen do kruhu, takže v případě "přejetí" hledaného
příkazu se lze k tomuto příkazu zpět vrátit.
Následuje tabulka popisující funkci editačních a jinak
využitých kláves. Je mi jasné, že někteří lidé budou po přečtení
této tabulky pochybovat o mém zdravém rozumu, nicméně si myslím,
že lépe to vymyslet nejde:
Klávesa Funkce
GRAPH prefix pro znaky >=128 (mód klávesnice "GRAP").
GRAPH/cokoli generuje znak odpovídající stisklé
klávese, avšak má nastaven 7. bit. Lze použít při
psaní češtiny, kdy GRAPH/písmeno dává odpovídající
český znak (norma KOI-8-Cs). ALPHA
CAPS LOCK on/off (indikace jako mód "NORM"/"CAPS")
BREAK CTRL/C
BLANK návrat k předcházejícím příkazům (z kláv. bufferu)
35
SHIFT/BLANK mazání znaků nahromaděných v klávesnicovém bufferu
"LIBRA" přepíná rychlý/pomalý scroll
SHIFT/"LIBRA" přepíná zobrazenou sadu funkčních kláves (F1 - F5,
nebo F6 - F10)
INST BS (pozor, CCP např. používá INST namísto DEL!)
SHIFT/INST CTRL/T
DEL DEL
SHIFT/DEL CTRL/G
KURZOR VLEVO CTRL/S
SHIFT/K. VLEVO CTRL/A
KURZOR VPRAVO CTRL/D
SHIFT/K.VPRAVO CTRL/F
KURZOR NAHORU CTRL/E
SHIFT/K.NAHORU CTRL/R
KURZOR DOLŮ CTRL/X
SHIFT/K. DOLŮ CTRL/C
ŠIPKA VLEVO CTRL/W
ŠIPKA VPRAVO CTRL/Z
"PI" _ (underline)
SHIFT/CR LF
Zapnutý CAPS LOCK se týká pouze písmen, ostatní znaky
zůstávají beze změny. SHIFT/písmeno při zapnutém CAPS LOCKu dává
odpovídající malé písmeno, tak jak to dělají jiné rozumné
počítače. Prefix GRAPH se vztahuje jen na bezprostředně
následující klávesu, a to bez ohledu na to, zda je řídící či
nikoli. Zcela zvláštní význam mají klávesy SHIFT/CTRL/BREAK,
jejichž současné stisknutí má za následek okamžité opuštění
programu bez závislosti na momentální činnosti počítače a skok do
operačního systému. Je to výhodná funkce v případě, že program
uvízne v nekonečném cyklu, nebo chceme-li např. tisknout na
nepřipojené tiskárně. Ostatní klávesy fungují tak jako na jiných
počítačích, tzn. CTRL/písmeno dává odpovídající řídící znak.
36
3.4 Obsluha obrazovky
Obsluze obrazovky byla věnována veliká pozornost, zvláště co
se týče rychlosti obrazovkových operací. Například při výpisu
znaku se vůbec nevypočítává adresa v obrazovce z aktuální pozice
kurzoru, ale na pointer do obrazovky je využita zvláštní
proměnná. Znak se nezobrazuje cyklem, ale přímo sekvencí
instrukcí. Blokové přesuny v paměti, potřebné pro rolování kusů
obrazovky, nejsou realizovány instrukcí LDIR, nýbrž sekvence
šestnácti bezprostředně za sebou následujících instrukcí LDI,
resp. LDD. Roluje-li se celá obrazovka, je využito schopností GDG
rolovat hardwarově. Podle nastaveného módu rolování (klávesa
"LIBRA") se roluje buď po znakovém, nebo grafickém řádku. Tento
režim funguje při rolování oběma směry. Součástí výstupního
programu je i podprogram pro rychlé mazání řádky, což ve spojení
s již zmíněnými přesuny částí obrazovky výrazně zvyšuje komfort
při editování textu. Jako určitou výhodu proti původní P-CP/M lze
hodnotit i zabudovaný nový generátor znaků, protože nové znaky se
podstatně lépe čtou. Je také možné oba typy znaků mezi sebou
přepínat. Obyčejné ASCII znaky o kódech 20H až 7EH, BEL, BS, LF
a CR jsou zobrazovány obvyklým způsobem. Znaky s nastaveným
sedmým bitem jsou použity jednak pro pseudografiku, kreslení
rámečků a oken (kódy 80H - BFH) a dále pro české znaky s
diakritickými znaménky (C0H - FFH). Seznam ostatních řídících
kódů je v následující tabulce:
Znak Funkce
ESC ( LOWLIGHT (přepnutí na znaky z ROM)
ESC ) HIGHLIGHT (přepnutí na znaky BIOSu - jsou tlustší)
ESC 0 INVERS VIDEO
ESC 1 NORMAL VIDEO
ESC * nebo CTRL/Z CLS+HOME
ESC T ERASE TO EOLN
ESC R DELETE LINE
ESC E INSERT LINE
ESC = y x CURSOR LEAD (souřadnice y a x mají ofset 20H)
CTRL/W prefix nastavující 7. bit u následujícího znaku
(využívá se v případě, že chceme psát česky z
programu, který neumí využívat 7. bit kódu).
BIOS neumí zpracovat znaky TAB, FF a DEL. Řídící znaky byly
zvoleny ve snaze po co největší standardizaci BIOSu a jsou shodné
s terminálem Televideo 925, případně i 912 nebo 950.
37
3.5 Tiskárna a děrná páska
Obsluha tiskárny je řešena přes tiskárenský konektor na
zadní straně počítače, připojený přes oddělovače na obvod PIO.
Rutina neprovádí žádné znakové konverze. Lze připojit tiskárnu s
rozhraním Centronics, IRPR, i jiné, protože podprogram testuje
sestupnou i vzestupnou hranu vstupního uvolňovacího signálu.
Na místě driverů pro práci s děrnou páskou je pochopitelně
implementována obsluha standardního seriového rozhraní RS-232C.
Je využit kanál A obvodu SIO a pomocí programu SETUP lze nastavit
všechny potřebné parametry komunikace, lze dokonce zapnout i
vypnout handshaking (to původní P-CP/M neuměl). Opět se
neprovádějí žádné znakové konverze. BIOS nepočítá s volbou
přenosové rychlosti, protože originálních Sharp firemních karet
pro seriovou komunikaci je u nás velmi málo a karty vyráběné
amatérsky nebo na zakázku mají baudovou rychlost nastavitelnou
pomocí miniaturních přepínačů. Jestliže někdo vlastní originální
stykovou kartu, může si rychlost přenosu nastavit z nějakého
programu (např. TURBO Pascal), protože BIOS s porty pro nastavení
rychlosti nic nedělá. Kanál B obvodu SIO je naprogramován do
stejného režimu jako kanál A, takže uživatel jej může obsluhovat
ve svém programu.
38
4. Diskové operace
Přístup na disk je základní vlastností každého operačního
systému. I když obsluha disku je probádané a často omílané téma,
stále jsou ještě detaily, ve kterých se dá komunikace s diskem
vylepšit. Popisovaný BIOS např. obchází řadič a vše, co může,
dělá raději softwarově. Rutiny jsou sice delší a méně průhledné,
ale je tím umožněno veškeré operace časovat přímo programem,
nezávisle na tom, co dělá hardwarově řadič. Mimo jiné to až
dvakrát urychluje práci disku, navíc všechny časové konstanty
obsluhy disku si může uživatel nastavit podle vlastností svých
vlastních mechanik (program SETUP). Podmínkou správné funkce jsou
jen konstantní hodiny procesoru.
Konkrétně: Řadič Western Digital, obsluhuje-li mechaniku
3 1/2 nebo 5 1/4 '', umí jen čtyři časy kroku diskové hlavy, a to
6, 12, 20 a 30 ms. Při použití osmdesátistopé mechaniky (to je
dnes standard) je doba SEEKu (nastavení hlavy na stopu) důležitým
faktorem, který má vliv na rychlost disku. Vzhledem k tomu, že
naprostá většina dnes používaných mechanik má dobu kroku hlavy
(step time) pouhé tři milisekundy, je softwarové obcházení řadiče
téměř nezbytné. Při požadavku na SEEK se programově generují
jednotlivé STEP pulsy, mezi kterými program běží v časové smyčce,
na jejímž konci volá do řadiče příkaz "Force Interrupt", aby
řadič byl znovu schopen komunikace.
Jiné urychlení se dosahuje v případě chyby adresace na
disku. Obvykle se výskyt této chyby ošetřuje tak, že se s hlavou
odjede na stopu 0 (HOME) a poté se znovu provádí SEEK. Uvážíme-
li, že se celá procedura může opakovat několikrát, představuje to
několikasekundové zpoždění. Přitom chyba adresace nejčastěji
vznikne tím, že při výměně diskety se hlava mírně posune mimo
svou polohu na stopě a pak dochází ke čtení z prostoru mezi dvěma
stopami. Náš BIOS ošetřuje vzniklou chybu takto:
1) Provede se jeden krok hlavou (nachází-li se hlava na
vnějších stopách, krokuje se směrem dovnitř, v opačném
případě směrem ven), čímž se hlava dostane přesně na
některou stopu. Pak se provede SEEK na správnou stopu a
čte se znovu.
2) Je-li předchozí krok neúspěšný, došlo zřejmě k tomu, že
hlava se nachází na jiné stopě než si myslíme. Proto je
do řadiče volán příkaz "Read address", koriguje se číslo
aktuální stopy a čte se znovu.
3) Pri neúspěchu se nejspíš hlava nachází mimo aktivní
plochu diskety. Teprve v tom případě se provádí HOME
(opět softwarově) a znovu se čte.
Dojde-li k chybě na disku, pokouší se BIOS provést čtení
nebo zápis pětkrát, než hlásí chybu. Chybové hlášení se zobrazuje
v systémovém řádku, takže nenarušuje výpisy programu. Uživatel má
možnost výběru "Retry/Abort/Ignore", význam čehož je následující:
Retry - opětovný pokus provést danou operaci. Je výhodné
třeba při pokusu o zápis na chráněnou disketu. Stačí
39
disketu vyjmout, přesunout ochranný segment, disketu
vrátit zpět do mechaniky a stisknout "R". Zápis se
provede.
Abort - návrat ze služby BIOSu s chybovým příznakem.
Jestliže si chybu neošetřuje sám program, předá se
řízení operačnímu systému.
Ignore - návrat z BIOSu, jako kdyby k chybě nedošlo. Při
pokusu o zápis není dobré tuto variantu používat,
neboť data v diskovém bufferu jsou označena za
zapsaná. I použití při pokusu o čtení je třeba si
rozvážit, abychom např. nespustili chybně přečtený
program apod. Mohlo by to být osudné pro Vaše
diskety.
BIOS správně reaguje i na stav, kdy např. není v mechanice
disketa. Je až neuvěřitelné, kolik různých BIOSů zůstane "viset",
nedáme-li do mechaniky disketu. Naše rutiny pro čtení sektoru a
adresní značky mají časové omezení asi 1.2 sekundy, a když do
této doby řadič neukončí příkaz, je tento ukončen násilně.
Pozornost byla věnována také tomu, aby diskové rutiny pokud
možno co nejméně zakazovaly přerušení, protože přes něj běží
klávesnice. Ideální by bylo, kdyby klávesnice byla čtena
nepřetržitě, což by ovšem znamenalo mít přerušení neustále
povolené a z disku bychom toho asi mnoho nepřečetli. Přerušení se
proto zakazuje pouze na nejnutnější dobu, tj. při vlastním čtení
nebo zápisu dat. Ostatní dobu (při operacích HOME, SEEK, čekání
na rozběh motoru apod.) je stále povoleno, i když to má za
následek netypické zvuky linoucí se z disketových mechanik. Na
jejich životnost to však nemá vliv, nepravidelné řízení by
mechanikám nemělo vadit.
Dokonalý je i způsob kontroly adresace na disku - je totiž
na rozdíl od jiných CP/M (i původní P-CP/M) úplný. Je to sice
náhoda, ale i mně se stalo, že vodič vybírající stranu diskety
ztratil kontakt a následně došlo k přepsání diskety. To se v
novém CP/M nemůže stát! BIOS pozná i to, když mu vytáhnete nějaký
vodič z řadiče.
40
4.1 Formát záznamu na disketových mechanikách
Je jasné, že v dnešní situaci, kdy člověk skoro několikrát
denně zakopává o IBM PC, není možné používat disketu s jiným
formátem než pécéčkovým. Fyzická stopa diskety tudíž obsahuje
devět sektorů o délce 512 bytů. Pokud jde o ostatní parametry
stopy (délky všech čtyř Gapů, adresní značky atd.), souhlasí s
doporučením IBM a Western Digital. Při psaní programu FORMAT byly
tabulky pro zápis stopy převzaty z přenosného počítače IBM PC s
mechanikami 3 1/2'' 720 KB.
Z originální pécéčkové diskety byl převzat i PC boot sektor,
který je při kopírování systému CP/M na Sharpu též přenesen na
novou disketu. To umožňuje přímé čtení disket ze Sharpa na IBM
PC, protože Sharpovská disketa obsahuje tabulku s popisem
parametrů diskety. Hodnoty v boot sektoru se vztahují k disketě
3 1/2'' 720 KB, protože tyto diskety jsou dnes již u PC častější
než dříve montované 5 1/4''. Pokud by někdo potřeboval číst
Sharpovské diskety na PC s "pětačtvrtkami", musel by tabulky v
pécéčkovém boot sektoru přepsat tak, aby popisovaly tuto disketu.
Z hlediska optimalizace přístupových dob jsou samozřejmě
fyzické sektory diskety přečísleny. Aby však diskety byly čitelné
na jiných počítačích, přečíslení neprovádí BIOS pomocí tabulek,
ale sektory jsou přímo přeházeny na disketě, a sice s parametrem
dvě. Stopa tedy obsahuje sektory v tomto pořadí:
1, 6, 2, 7, 3, 8, 4, 9, 5.
Adresní značky jednotlivých sektorů jsou samozřejmě
přeházeny zároveň se sektory, takže disketa se navenek jeví jako
nepřečíslená.
Aby to však nebylo tak jednoduché, autor CP/M byl požádán,
aby bylo možné používat i jednostranné mechaniky. Tím bylo nutno
vytvořit dva různé formáty, vzhledem k nutnosti původní Sharp
boot stopy. Logické rozdělení disket těchto formátů je v
následujích tabulkách.
Oboustranný záznam
IBM PC boot sektor strana 0, stopa 0, sektor 1
IBM PC FAT (vynechané místo) strana 0, stopa 0, sektor 2-5
Začátek Sharp BIOSu strana 0, stopa 0, sektor 6-9
Sharp boot sektor (formát ROMky) strana 1, stopa 0, sektor 1
CP/M booter strana 1, stopa 0, sektor 2-5
Zbytek Sharp boot stopy strana 1, stopa 0, sektor 6-16
Pozor! Sharpovská boot stopa obsahuje šestnáct sektorů o
délce 256 bytů. I když je to z hlediska IBM PC nestandardní,
tento formát je nutný, protože jiný formát Sharp ROM
nepřečte a CP/M by tudíž pomocí standardní ROM nešel zavést.
Konec Sharp BIOSu strana 0, stopa 1, sektor 1-7
Sharp CCP a BDOS strana 0, stopa 1, sektor 8 až
strana 1, stopa 1, sektor 9
CP/M adresář strana 0, stopa 2, sektor 1-8
Začátek prostoru pro soubory strana 0, stopa 2, sektor 9
41
Jednostranný záznam
Sharp boot sektor stopa 0, sektor 1
CP/M booter stopa 0, sektor 2-5
Zbytek Sharp boot stopy stopa 0, sektor 6-16
Boot stopa má stejný formát jako v předešlém případě.
IBM PC boot sektor stopa 1, sektor 1
IBM PC FAT (vynechané místo) stopa 1, sektor 2-5
Sharp BIOS stopa 1, sektor 6 až
stopa 2, sektor 7
Sharp CCP a BDOS stopa 2, sektor 8 až
stopa 3, sektor 9
CP/M adresář stopa 4, sektor 1-8
Začátek prostoru pro soubory stopa 4, sektor 9
Logické parametry CP/M diskety jsou tyto:
Kapacita diskety: 720 / 360 / 180 KB (podle počtu stop a stran)
Místo pro soubory: 698 / 338 / 158 KB
Počet stop: 160 / 80 / 40
Počet sektorů na stopě: 36
Velikost adresáře: 4 KB
Max. počet souborů na disku: 128
Velikost alokačního bloku: 2 KB
Počet systémových stop: 4
Logické parametry CP/M RAM disku:
Kapacita disku: nastavitelná v rozmezí 0 až 512 KB po 16 KB
Počet stop: 0 až 16 podle kapacity
Počet sektorů na stopě: 256
Velikost adresáře: 4 KB
Max. počet souborů na disku: 128
Velikost alokačního bloku: 2 KB
Počet systémových stop: 0
42
4.2 Výběr mechaniky
Používáme-li více mechanik, je do BIOSu volaná služba výběru
mechaniky, se kterou se bude dále pracovat. Tato služba spočívá
především ve zjištění, zda je požadovaná mechanika logicky
připojena (počet mechanik se nastavuje pomocí SETUP). V případě
pokusu vybrat neexistující mechaniku se do systémového řádku
vypíše hlášení
Disk select error: Abort/Ignore
přičemž volbou "A" BIOS vrací příznak chyby (tj. obvykle
vypadneme do DOSu), volba "I" způsobí návrat do volajícího
programu s tím, že k chybě nedošlo, avšak zůstal vybrán naposled
nastavený disk.
Při úspěšném výběru mechaniky BIOS vrací pointer na tabulku
diskových parametrů. Těchto tabulek je celkem pět, tj. každá
mechanika má tabulku svou. V případě potřeby je proto možné
parametry libovolné mechaniky změnit, aniž by to mělo vliv na
parametry mechanik ostatních (program DISKDEF).
Jednotlivé disketové mechaniky adresuje BIOS postupně A:,
B:, C: až případně D:, disk E: je RAM disk. Výhledově se počítá
s připojením ještě dalších dvou mechanik, a to o rozměru 8'',
které se budou značit F: a G:.
Používáme-li systém pouze s jednou mechanikou, tato
mechanika má význam dvou logických jednotek (A: a B:). BIOS si
uchovává v paměti číslo naposled používané mechaniky a je-li
požadován přístup na mechaniku druhou, vypíše se do systémového
řádku hlášení
Select disk d: Push any key.
což uživateli umožňuje pracovat na jedné mechanice tak, jako
by měl mechaniky dvě.
43
4.3 Operace čtení a zápisu
Čtení a zápis sektoru na disk se provádí standardně, používá
se jeden diskový buffer pro jeden fyzický sektor (512 bytů). Je
použit obvyklý blok/deblokovací algoritmus (viz dále). Čtení a
zápis obstarávají rutiny s několikastupňovým hierarchickým
uspořádáním. Nejvyšší rutiny, do kterých se řízení dostává při
každém volání služby, zajišťují převod mezi logickými a fyzickými
sektory a podle potřeby volají rutiny nižší. To jsou zejména
rutiny pro přímé čtení nebo zápis konkrétního fyzického sektoru,
které v případě chyby vypisují také chybové hlášení
Read/write error: Retry/Abort/Ignore
význam čehož je zřejmý. Tyto rutiny volají hierarchicky ještě
nižší stupeň, který ošetřuje a napravuje vzniklé chyby a stará se
o přímý transport dat mezi diskovým bufferem a disky bez ošetření
vzniklých chyb.
Je užitečné vědět, co BIOS dělá s diskovým bufferem, dojde-
li k chybě. Volba "Retry" je jasná, vše se děje znovu. Při volbě
"Abort" nebo "Ignore" dojde k tomu, že je nulován příznak zápisu
do bufferu, a data v bufferu jsou označena za platná. Proto v
případě pokusu o nové čtení vadného sektoru BIOS chybu již
nehlásí (je tím umožněno se alespoň pokusit načíst část sektoru).
Při zápisu to má ovšem za následek, že se buffer na disk vůbec
nezapíše a proto je třeba si použití varianty "Abort" nebo
"Ignore" rozvážit.
44
4.4 Práce s diskovým bufferem
To není nic jiného než blokovací a deblokovací algoritmus.
BIOS musí zajistit převod logických sektorů, které používá jádro
CP/M, o délce 128 bytů, na fyzické sektory, které mají 512 bytů.
Algoritmus funguje takto:
Při požadavku na čtení se testuje, zda sektor z požadovaného
fyzického sektoru se již nenachází v bufferu. Když ano, je předán
volajícímu programu a s disketovou mechanikou se nic nedělá.
Jestliže buffer obsahuje jiný sektor, je třeba buffer napřed
naplnit daty z disku. Před vlastním načtením se samozřejmě ještě
vyhodnotí stav příznaku zápisu do bufferu, a je-li příznak
nastaven, předchozí obsah bufferu se uklidí na disketu. Výjimku
tvoří čtení logického sektoru, který je ve fyzickém sektoru
umístěn jako první. Tehdy dochází k fyzickému čtení z disku vždy,
bez ohledu na to, zda sektor již v bufferu je nebo není. Tím je
zajištěno, že při výměně diskety jsou zapomenuta stará data z
předcházející diskety. (Každá operace prováděná po výměně diskety
nejdříve přistupuje do adresáře, a tudíž čte nejprve první
logický sektor z fyzického).
Zápis na disk je mírně komplikovanější. BIOS především
vyhodnocuje vstupní parametr služby WRITE (v registru C). Tento
parametr má následující význam:
Nula: Běžný zápis sektoru.
Jedna: Zápis do adresáře.
Dvě: Zápis do prvního sektoru nově alokovaného
alokačního bloku.
Jestliže se při zápisu na disk nachází odpovídající fyzický
sektor v bufferu, je logický sektor přemístěn do bufferu a je
nastaven příznak požadavku na zápis. Jestliže je buffer obsazen
jiným sektorem, musí se buffer přiřadit novému sektoru a provést
přesun tohoto sektoru do bufferu. Před přesunem je starý obsah
bufferu označen za neplatný, a v případě nastaveného příznaku
zápisu do bufferu se ještě vlastní buffer odklízí na disketu
(operace vyčištění bufferu je stejná jako při čtení sektoru).
Každý zápis do bufferu má za následek současné nastavení příznaku
zápisu, při fyzickém zápisu bufferu na disketu je příznak
nulován.
Při překopírování logického sektoru do bufferu je třeba
rozlišovat, zda se jedná o zápis do adresáře, o zápis sekvenční
nebo náhodný. Rozdíl je totiž v tom, že při přístupu do adresáře
je třeba před přesunem sektoru do bufferu tento buffer
inicializovat daty z disku, aby nedošlo ke ztrátě ostatních
logických sektorů v sektoru fyzickém. Při zápisu do adresáře se
také ihned potřebné změny v bufferu zaznamenávají na disk a
příznak zápisu je nulován (zápis do adresáře je mimo jiné
průvodním znakem uzavírání souboru, což může předcházet výměně
diskety). Podobná situace je při náhodném zápisu na disk, rovněž
je nutno buffer předečíst z diskety. Rozdíl je jen v tom, že
fyzický zápis bufferu není proveden ihned, ale až je-li to nutné
45
(tj. když potřebujeme buffer uvolnit pro jiný sektor).
Zcela speciální případ tvoří sekvenční zápis sektorů, např.
při zápisu sekvenčního souboru. Bohužel BDOS při volání zápisu do
BIOSu neinformuje, zda požadovaný zápis má charakter sekvenční
nebo náhodný. Kdyby se totiž sekvenční zápis prováděl jako
náhodný (s předečítáním bufferu z diskety před přesunem logického
sektoru), zápis souborů by byl velmi pomalý (zaznamenal by se
nejvýš jeden sektor za otáčku diskety). Proto BIOS používá při
zápisu příznak sekvenčního zápisu. O co vlastně jde. Je-li
příznak sekvenčního zápisu nastaven, neprovádí se při požadavku
na zápis předečítání bufferu z diskety. To umožňuje využívat
maximální možné záznamové rychlosti mechaniky, která je prakticky
totožná s rychlostí čtení. Jde jen o to, kdy příznak sekvenčního
zápisu nastavit a kdy nulovat:
- Je-li při volání zápisu sektoru do BIOSu vstupní parametr rovný
dvěma, jedná se o zápis prvního sektoru nějakého alokačního
bloku. To má vždy za následek nastavení příznaku sekvenčního
zápisu.
- Příznak je zrušen vždy, je-li nějak porušen předpokládaný
průběh sekvenčního zápisu. BIOS vždy při zápisu vyhodnocuje,
zda fyzické umístění sektoru, který se má zapsat, je
následující za umístěním sektoru, který se zapisoval posledně
(je nutno si pamatovat číslo disku, stopy a sektoru minulé
operace i současné operace). Jestliže pořadí těchto dvou
sektorů neodpovídá sousední poloze sektorů na disku, je příznak
sekvenčního zápisu nulován.
- Příznak je nulován vždy po dosažení konce aktuálního alokačního
bloku. V našem případě je použit speciální čítač, který počítá
všechny zapsané sektory od okamžiku, kdy byl vstupní parametr
zápisové služby roven dvěma (začátek alokačního bloku).
Dosáhne-li tento čítač hodnoty 16 (= 2KB), dojde k nulování
příznaku sekvenčního zápisu.
- Příznak sekvenčního zápisu je nulován každou službou čtení.
Zároveň je čítač zapisovaných sektorů nastaven na koncovou
hodnotu.
46
5. Základní programové příslušenství
K systému CP/M pro Sharp MZ-800 byly napsány další programy,
tvořící jeho nezbytný doplněk. Jsou to hlavně programy FORMAT a
COPYSYS pro inicializaci disket, programy SETUP pro modifikování
hardwarové konfigurace a DISKDEF pro nastavení logických
parametrů disketových jednotek, programy DEFKEY a KEYB pro
definování klávesnice a programy MLOAD a MSAVE pro zálohování
programů na magnetofonových kazetách.
Bohužel popis dalších uživatelských programů, které pracují
pod systémem, jako jsou překladače různých programovacích jazyků,
editory a databáze, není do tohoto textu zahrnut. Znamenalo by to
totiž napsat knihu o několika stech stránek. Zájemci se proto
musí obrátit na jinou dostupnou literaturu popisující uživatelské
programy CP/M. Poměrně rozsáhlý sortiment takové literatury např.
nabízí JZD Agrokombinát Slušovice jako příslušenství svých
počítačů TNS, nebo podnik Kancelářské stroje k počítačům
Robotron.
Je důležité se zmínit o jedné věci. Některé systémové
programy potřebují pro svou funkci znát některé systémové
parametry (např. program FORMAT potřebuje vědět, zda je mechanika
jedno- nebo dvoustranná, program TIME potřebuje zjistit, kolik je
hodin apod.). Protože služby pro zjištění takovýchto informací
nejsou v standardní CP/M dostupné, řeší to naše CP/M jakousi
tabulkou, ve které jsou tyto informace uvedeny a programy mohou
údaje z této tabulky číst. Tabulka vypadá následovně:
Adresa Hodnota, význam
EA33H 0-15, barva pozadí obrazovky
EA34H 0-15, barva tisku na obrazovku
EA35H 0-255, délka pípnutí klávesnice v milisekundách
EA36H 0-3, číslo poslední disketové jednotky v systému
EA37H 0-7, fyzické parametry disketové mechaniky A: takto:
bit 2 - jeho nastavení signalizuje dvojitý krok
disketové hlavy (jestliže simulujeme
čtyřicetistopou mechaniku na osmdesátistopé).
bit 1 - nula indikuje jednostrannou mechaniku,
jednička dvoustrannou.
bit 0 - při nule má mechanika 40 stop, nastavený
bit informuje o osmdesátistopé mechanice.
EA38H 0-7, fyzické parametry jednotky B:. Význam stejný jako
v předešlém případě.
EA39H 0-7, parametry jednotky C:.
EA3AH 0-7, parametry jednotky D:.
EA3B,3CH 0-9999, doba rozběhu disketových mechanik v
milisekundách.
EA3DH 0-99, doba ustálení diskové hlavy na stopě (Settling
time).
EA3EH 0-99, doba kroku diskové hlavy v milisekundách
EA3FH 0-32, velikost RAM disku v jednotkách 16 KB EA40H,41H,42H
reálný systémový čas v sekundách
EA43H 0-1, příznak přerušení (zakázáno/povoleno) při
diskových operacích.
47
EA44H a výše řetězec bytů, kterými se při spuštění systému
programuje obvod SIO.
Vzhledem k tomu, že některé z těchto parametrů jsou potřebné
jen při spuštění systému, je jejich místo při běhu systému
využito takto:
Adresa Hodnota, význam
EA33H 0-255, doba v jednotkách 20 ms do vypnutí pohonných
motorů disketových mechanik.
EA34H 0-2, vstupní parametr služby WRITE.
EA44H a výše řetězec, kterým se při WBOOT inicializuje oblast
systémových parametrů.
48
5.1 Program FORMAT
Tento program slouží k formátování disket použitelných pak
pod CP/M. Spuštění programu se provede prostřednictvím CCP
napsáním jeho názvu (FORMAT) a odesláním. Program se zeptá:
Type disk drive to format or CR to reboot:
na což lze odpovědět buď zadáním kódu mechaniky A, B, C,
nebo D, nebo stlačením klávesy CR se vrátit zpět do CCP.
Po zadání kódu jednotky se vypíše:
Push a key when ready..
Poté se stiskem klávesy odstartuje vlastní formátování. Celá
činnost má dvě fáze:
- Zjištění, v jakém formátu se bude formátovat. Za tím účelem
program přečte tabulky popisující fyzické parametry připojených
mechanik a podle toho zvolí příslušný formát diskety. Jestliže
si přejeme naformátovat disketu v jiném formátu, napřed pomocí
programu SETUP nastavíme parametry jednotky a pak formátujeme.
Formátovat lze jedno- i oboustranně, 40 nebo 80 stop na straně
a dokonce s jednoduchým nebo dvojitým krokem hlavy. Je třeba
pouze dát pozor na to, abychom při volbě dvojitého kroku
zároveň nastavili čtyřicetistopou mechaniku!
- Vlastní formátování diskety. Jsou zaznamenány prázdné sektory o
obsahu všech bytů E5H.
- Verifikace. Program se pokouší přes standardní služby BIOSu
přečíst všechny sektory na disketě. Pozor! Vznikne-li na
disketě chyba, nedojde k jejímu opravení, nýbrž je vypsáno
hlášení "Sorry, permanent error occured." a formátování končí
neúspěchem. V dnešní době kvalitních 3 1/2'' disketových
mechanik je chyba na disketě vyloučena, takže k této
eventualitě prakticky vůbec nemůže dojít. Proto autor programu
FORMAT upustil od procedury vyřazení vadných sektorů z
použitelného místa na disketě.
Po úspěšném formátování se vypíše:
Format complete.
s následným
Type disk drive to format or CR to reboot:
a celá činnost se opakuje.
Při špatném zadání některého parametru se program na tento
dotazuje znovu. Činnost programu lze v kterémkoli okamžiku
přerušit stiskem kláves SHIFT/CTRL/BREAK. Poslední vyvinutá verze
programu FORMAT nese označení FORMAT 1.1.
49
5.2 Program COPYSYS
Formátováním diskety smažeme její veškerý obsah. To znamená,
že pokud chceme tuto disketu používat mimo jiné i k zavádění
operačního systému, musíme na ni zapsat operační systém.
(Pokoušíme-li se znovuzavádět CCP a BDOS z diskety, kde tyto
moduly nejsou, BIOS vypisuje hlášení
Boot error
do systémové řádky). Překopírování systému se provede takto:
- Vložit původní systémovou disketu do jednotky A: a zavolat
program COPYSYS. Po jeho spuštění dojde k načtení obsahu
systémových stop z disku do paměti.
- Program se dotáže
Type disk drive to write or CR to reboot:
na což lze odpovědět buď kódem jednotky, na kterou chceme
systém překopírovat, nebo stiskem CR opustit COPYSYS.
- Zadáním kódu jednotky A, B, C, nebo D dojde k zápisu systému z
paměti do systémových stop zvolené diskety.
Program COPYSYS provádí fyzické překopírování obsahu
systémových stop. To znamená, že se překopíruje i navolená
konfigurace. Není proto nutné programem SETUP obsah nové diskety
modifikovat.
Je samozřejmé, že má-li jednotka, na kterou provádíme zápis,
jiné parametry než jednotka systémová, program COPYSYS
automaticky provede konverzi obsahu systémových stop tak, aby
záznam systému na nové disketě odpovídal fyzickým parametrům této
diskety. Je třeba to mít na pozoru, protože pak např. při vložení
této diskety do systémové jednotky nedojde ke správnému načtení
systémových stop.
50
5.3 Program COPYDISK
Potřebujeme-li zhotovit kopii celé diskety, je nevýhodné
kopírovat po jednotlivých souborech, tak jak to dělají běžné
kopírovací programy (PIP, POWER) protože je to příliš zdlouhavé.
Proto byl pro tento účel napsán zvláštní program, který provede
rychlé překopírování diskety, a to způsobem fyzického kopírování.
Program používá celou využitelnou paměť TPA jako buffer pro
kopírovaná data.
Zvláštností programu je, že kopírování není prováděno přímým
ovládáním řadiče disketových jednotek, nýbrž voláním standardních
služeb operačního systému pomocí vstupního vektoru BIOSu. Program
COPYDISK si přitom zcela regulérně přečte obsahy diskových
tabulek a podle toho dále pracuje, takže lze kopírovat diskety s
prakticky libovolným formátem. Jediným omezením pochopitelně je,
že obě jednotky musí mít stejné fyzické i logické parametry.
Není-li tomu tak, program vypíše hlášení
Disks are different.
čímž kopírování končí. Díky popsané metodě kopírování lze s
výhodou program COPYDISK používat i na jiných počítačích s
procesorem Z80 (je systémově nezávislý). To bylo úspěšně
vyzkoušeno na počítači TNS.
Program COPYDISK se volá příkazem
COPYDISK DestDrive=SourceDrive
Např. pro překopírování diskety A: na C: napíšeme
COPYDISK C:=A:
Zavoláme-li program pouhým zapsáním
COPYDISK
dojde ke kopírování B:=A:.
Program COPYDISK umí kopírovat diskety i na jediné
mechanice, s tím, že vždy při naplnění nebo vyprázdnění bufferu
si požádá o výměnu diskety. Podmínkou správné funkce při
kopírování na jedné jednotce je jednoduchý blok/deblokovací
algoritmus, používající jediný buffer pro fyzický sektor diskety
(tuto podmínku splňuje naprostá většina počítačů).
51
5.4 Program SETUP
To je jeden ze základních programů nové CP/M. Umožňuje totiž
velmi variabilně měnit vlastnosti systému, především fyzické
parametry připojených disketových mechanik, kapacitu
instalovaného RAM disku a parametry seriového rozhraní RS-232C.
Při zavolání programu si tento nejprve překopíruje parametry
stávajícího systému ze systémových stop disku A: (proto si do
mechaniky A: dejte disketu, která má sloužit jako výchozí) do
paměti, kde pak provádí všechny změny. Při opuštění programu pak
dojde ke zpětnému zapsání nových parametrů z paměti na disk A:,
je-li to požadováno. Vystoupíme-li z programu bez zápisu na disk,
nachází se systém na disketě v tom stavu, v jakém byl před
spuštěním SETUPu.
Popis ovládání programu SETUP zde není uveden, protože jeho
názornost to ani nepotřebuje (vše se vybírá pomocí menu).
Zajímavostí programu je, že byl celý napsán v TURBO Pascalu, tj.
bez použití jediné asemblerové instrukce (také to demonstruje,
jaké možnosti Turbo Pascal má).
5.5 Program DISKDEF
Tak jako pomocí programu SETUP se daly nastavit fyzické
parametry připojených disketových mechanik (počet stop, stran,
jednoduchý nebo dvojitý krok hlavy, veškeré časování diskových
operací), program DISKDEF slouží k nastavení logických parametrů
diskety (velikost alokačního bloku, velikost adresáře, počet
systémových stop, počet sektorů na stopě) což je velmi výhodné,
potřebujeme-li pracovat s disketou z jiného počítače. V naprosté
většině případů, kdy si od někoho disketu půjčíme, vystačíme s
programy SETUP a DISKDEF, abychom tuto disketu správně přečetli a
také na ni mohli psát. Předpokládá to pouze vědět, jak vlastně
tato disketa vypadá (ale i to se dá zjistit).
Jinak o programu DISKDEF platí totéž, co bylo řečeno výše o
SETUPu. Ovládání je snadné, a celý program je napsán v Pascalu.
Pro zajímavost je na systémové disketě přiložen i zdrojový
program (DISKDEF.PAS). Proto by DISKDEF měl být ve zdrojovém
tvaru přenositelný i na jiné počítače (nebylo zkoušeno).
52
5.6 Program DEFKEY
Tento program se používá k definici znakových řetězců, které
jsou generovány klávesnicí při stisku funkčních kláves F1 až F10.
Práce s programem je jednoduchá - zavoláme jej
DEFKEY