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 =,=,... Např. chceme na klávesu F1 nadefinovat příkaz ERA B:*.REL a na F2 PIP B:=A:*.REL. Provedeme to DEFKEY F1=ERA B:*.REL,F2=PIP B:=*.* (a CR). Kódy kláves (F1 apod.) lze psát i zkráceně, např. DEFKEY 1=ERA B:*.REL,2=PIP B:=*.* Na každou klávesu lze nadefinovat max. 11 znaků, v případě delšího řetězce jsou přebytečné znaky ignorovány. Řetězce mohou obsahovat libovolné znaky v rozsahu kódů 00H až 7EH (nelze nadefinovat české znaky). Řídící znaky se zadávají jako dvojznaky "^" a příslušné písmeno. Např. při definování příkazu DIR, který se má ihned provést, napíšeme DIR^M (^M je kód klávesy CR). Definování obsahu kláves se provádí přepsáním původních řetězců v oblasti VRAM na adresách BE80H až BEFFH, kterou využívá BIOS. Dále uvádíme obsah této oblasti, jak vypadá po zavedení systému: org BE80H DefKeys: defm 4,'DIR ' defm 5,'TYPE ' defm 4,'ERA ' defm 5,'USER ' defm 7,'SUBMIT ' defm 6,'FILES ' defm 7,'FORMAT',0Dh,' ' defm 8,'COPYSYS',0Dh,' ' defm 9,'COPYDISK',0Dh,' ' defm 7,'DEFKEY ' 53 5.7 Program KEYB Autor CP/M byl požádán, aby na CP/M šlo psát také na klávesnici, podobné psacímu stroji. Tak vznikl program KEYB. Volá se buď KEYB CS nebo KEYB GR První volání (s parametrem CS) zabezpečí předefinování tabulek klávesnice BIOSu na klávesnici podobnou psacímu stroji. Na horní řadě kláves jsou pak umístěny malé znaky české abecedy, číslice zapisujeme se současným stiskem SHIFT. Původní "šiftované" znaky jsou umístěny na klávesy F6 až F10 (jejich původní obsah je pak nedostupný) a na některé klávesy hlavní klávesnice ("LIBRA", SHIFT/"LIBRA", SHIFT/"/" a SHIFT/"?"). Volání KEYB GR předefinuje tabulky klávesnice zpět na původní tvar, bez českých znaků. 54 5.8 Programy CLS, EJECT a BOOT Jedná se o kratičké prográmky s jasnou funkcí. CLS při zavolání smaže obrazovku, EJECT nastaví čistou stránku na tiskárně a BOOT způsobí opuštění CP/M a start rezidentního systému (ROM), což lze použít např. chceme-li vstoupit do Sharp monitoru. 5.9 Program DIAPRINT Je malý prográmek v jazyce Pascal. Jak již bylo dříve uvedeno, umí naše CP/M pracovat v plnohodnotné češtině podle normy KOI-8-Cs. Autor například s velkou oblibou používá výborný textový editor WordStar Cs, ve kterém byl mimo jiné napsán i tento text. Je nasnadě, že když náš počítač může psát česky, bylo by dobré, kdyby uměl také česky tisknout. To by měl zajišťovat právě DIAPRINT. Protože autor CP/M měl však k dispozici pouze zapůjčenou tiskárnu D-100 polské výroby, vzniklý program DIAPRINT příliš neodpovídá požadavkům kompatibility s tiskárnami EPSON apod., takže je třeba program DIAPRINT brát jen jako jakýsi impuls k vlastnímu experimentování (i když s tiskárnou D-100 DIAPRINT funguje). Každopádně je třeba přepsat všechny procedury v modulu DIAPRINT.INC, které zabezpečují přepnutí tiskárny do grafického módu a zpět, a také tisk diakritických znamének v grafickém režimu. Je pravděpodobné, že bude třeba mírně pozměnit i vlastní DIAPRINT.PAS. Autor se tímto všem uživatelům omlouvá a přeje slušivý český tisk. 55 5.10 Programy MLOAD a MSAVE Tyto programy jsou určeny především pro zálohování (backup) programů a dat zaznamenaných na disketách. Je také možné použít programy MLOAD a MSAVE k přenosu souborů ze systému CP/M do obyčejného Sharpa či naopak. Není problém rovněž přenášet programy mezi Sharpem a jinými počítači, neboť kompatibilní program existuje např. pro Sinclair ZX Spectrum, IBM PC a další. Základem je struktura záznamu velmi příbuzná se záznamem obyčejného ZX Spectra (jestliže se někdo diví, proč je zvolen formát ZX Spectra a ne Sharp ROMky, mohu vysvětlit, že zvolený záznam je rychlejší, podstatně spolehlivější a úspěch nahrávání nezávisí na fázi přehrávaného signálu). Záznam vytvořený programem MSAVE (čitelný pomocí MLOAD) má následující strukturu: Magnetofonový pásek ------------------------------------------------------ | Blok 0 | Blok 1 | Blok 2 | ... | Blok X (poslední) | ------------------------------------------------------ Blok ------------------- | Header | Record | ------------------- Header ------------------------------------------------- | Leader | Header flag | Data | Header Checksum | ------------------------------------------------- Record ------------------------------------------------------- | Leader | Record flag | Data | Record Checksum | ------------------------------------------------------- Leader ------------------------------------------------ |++++----|++++----|++++----| ... |++++++|------| ------------------------------------------------ | | | | | | 1.24 ms| |191 us|210 us| |<------>| |<---->|<---->| | | | 5 s pro header, 2 s pro record | |<-------------------------------------------->| Data Bit=0 Bit=0 Bit=1 Bit=0 --------------------------------------------- |++++----|++++----|++++++++--------|++++----| --------------------------------------------- | | | | | 489 us | | 977 us | |<------>| |<-------------->| 56 ------ ------ |++++| - kladná magnetizace |----| - záporná magnetizace ------ ------ Formát dat v hlavičce každého bloku je podobný hlavičce, kterou vytváří Spectrum ROM při záznamu CODE. Rozdíly jsou dány nutností použít v CP/M jedenáct znaků pro jméno (8 znaků pro název a 3 pro verzi) a potřebou počítat jednotlivé bloky, neboť programy delší než operační paměť se musí na kazetu ukládat po několika blocích. Tyto bloky mají délku 32 kB a každý z nich má samostatnou hlavičku: Byte číslo Význam Hodnota 0 Typ CODE 03H 1 až 10 Název souboru bez osmého znaku a verze znak (znaky mají zrušený 7. bit) 11 a 12 Délka bloku v bytech 0000-8000H 13 a 14 Startovací adresa 0100H 15 Poslední znak názvu souboru znak 16 Pořadové číslo bloku počínaje nulou 00-FFH (poslední blok má nastaven 7. bit) Kontrolní součet bloku (checksum) se určí XORováním všech bytů bloku včetně úvodního (Flag). Programy mají jednoduchou obsluhu. Program MLOAD se zavolá z CCP příkazem MLOAD přičemž specifikace souboru může být předznamenaná kódem požadované diskové jednotky a je v ní povoleno používat znaků hvězdička "*" a otazník "?". Specifikace souboru musí být uvedena. Program hledá na pásce soubor vyhovující dané specifikaci a když ho najde (přesněji když najde nultý blok tohoto souboru), soubor překopíruje na příslušnou diskovou jednotku. Pokud zde soubor daného jména již existuje, je novým souborem přepsán. Byl-li požadován přenos jen jednoho souboru, program se po vykonání akce vrátí do CCP. V opačném případě budou přeneseny všechny nalezené programy vyhovující specifikaci. Návrat z programu je zprostředkován klávesou SHIFT/BREAK, stisknutou v okamžiku hledání dalšího souboru na pásce. Hlášení programu MLOAD: Searching - program hledá na pásce soubor daného jména. Ignoring - byl nalezen program jiného jména nebo nalezený blok nemá číslo nula (jsme uprostřed souboru). Loading - soubor se nahrává z pásku do oblasti TPA. Writing - soubor se kopíruje z oblasti TPA na disk. Transferred - soubor byl úspěšně překopírován. Operation completed - program úspěšně vykonal požadovanou funkci a vrací se. Operation aborted - činnost programu byla předčasně zastavena (klávesa SHIFT/BREAK). Tape error - byla detekována chyba při čtení z kazety (ztráta dat nebo chybný kontrolní součet). 57 Disk write error - chyba při zápisu na disk (není místo na disku nebo v adresáři). Too long - délka bloku je příliš velká, takže není možno jej nahrát do paměti. Používání programu MSAVE je analogické programu MLOAD. Po spuštění programu příkazem MSAVE program zaznamená na kazetu všechny soubory z vybraného nebo požadovaného disku, které vyhovují uvedené specifikaci. Před začátkem záznamu prvního souboru program napíše Start tape, then press any key. a čeká na stisk klávesy, aby obsluha měla čas na spuštění magnetofonu. Mezi jednotlivými soubory jsou asi desetisekundové mezery, aby bylo možno soubory na pásce později snadno vyhledávat. Po zaznamenání všech požadovaných souborů se program vrací zpět do CCP. V případě potřeby lze činnost programu předčasně ukončit klávesou SHIFT/BREAK. Programy MLOAD a MSAVE lze použít i v režimu rychlého záznamu. Tento režim je výhodný pro uživatele používající výhradně magnetofon a slouží ke krátkodobému zaznamenání pracovních souborů, u kterých nezáleží na spolehlivosti a trvanlivosti záznamu. Příkaz pro záznam na kazetu má tvar MSAVE kde parametr "rychlost" může nabývat hodnot 1, 2 nebo 3 a určuje, kolikrát je pořízený záznam rychlejší než klasický ROMkový. Zrychlený záznam není samozřejmě čitelný pomocí Sinclair ROM. Při zpětném nahrávání příkazem MLOAD se rychlost neudává, program si ji nastavuje sám. Hlášení programu MSAVE: Reading - soubor se kopíruje z disku do oblasti TPA. Saving - soubor se přehrává z TPA na kazetu. Transferred - soubor byl úspěšně zaznamenán. Start tape, then press any key - program vyzývá obsluhu, aby spustila magnetofon. Operation completed - program úspěšně provedl záznam všech souborů a vrací se. File(s) not found - disk neobsahuje žádný soubor, který by vyhovoval zadané specifikaci. Operation aborted - činnost programu byla předčasně ukončena klávesou SHIFT/BREAK. Disk read error - chyba při čtení souboru z disku. Too long - soubor nelze překopírovat z disku do paměti RAM (oblast TPA je menší než 32 kB). Nejnovější verze programu MLOAD a MSAVE nesou označení 4.0F. 58 5.11 Program TIME Tento program slouží k nastavení systémových hodin, jejichž stav se zobrazuje v systémovém řádku a který je také k dispozici všem programům pracujícím pod CP/M. Hodiny pracují ve čtyřiadvacetihodinovém cyklu. Po zavolání programu se vypíše Current time is hh:mm:ss Enter new time: Operátor může dotaz buď odeslat (údaj hodin se nezmění), nebo napsat aktuální čas ve tvaru hh:mm:ss, kde hh představuje stav hodin, mm stav minut a ss sekund (všechno jsou to dvojciferná čísla oddělená od sebe dvojtečkami). Údaj sekund není nutné psát, v tom případě se zapíše čas hh:mm:00. Program TIME ve skutečnosti nedělá nic jiného, než že přečte stav systémových hodin v sekundách z adres EA40H, EA41H a EA42H, převede jej na odpovídající počet hodin, minut a sekund a to vypíše. Po zápisu nového času převede zpět údaj hodin, minut a sekund na sekundy a toto tříbytové číslo zapíše na adresy EA40H až EA42H. 5.12 Program XDOS Tento výborný program (napsaný v Turbo Pascalu na IBM PC) umožňuje přenos souborů mezi operačními soubory CP/M a MS-DOS, a to oběma směry. Autor CP/M touto cestou děkuje J. Merclovi, že umožnil modifikaci XDOSu tak, aby fungoval pod naším CP/M a nabídl jej k volnému užívání. Po přeložení souboru XDOS.PAS pomocí Turbo Pascalu 3.0 pod operačním systémem CP/M vznikne spustitelný program XDOS.COM (překládáme do souboru - to napřed navolíme v menu "Compiler Options, volitelného z hlavního menu). Spuštěním tohoto programu získáme přístup k disketám, zaznamenaným pod MS-DOS. Jedinou podstatnou nevýhodou programu XDOS je, že umí pracovat pouze s disketami 360 KB, neumožňuje tudíž číst diskety 3 1/2'' 720 KB, které se u IBM PC dosti často vyskytují. Autor CP/M proto požádal J. Mercla, aby XDOS příslušně modifikoval, a doufá, že tato tolik potřebná verze XDOSu brzy spatří světlo světa. 59 6. Než začnete se systémem pracovat Předtím, než začnete systém běžně používat, je třeba v něm provést drobné změny, týkající se nastavení některých systémových proměnných (parametry připojených disketových mechanik, velikost RAM disku, parametry seriového rozhraní RS-232C, pípání klávesnice a další). Autor také doporučuje si na systémovém disku založit soubor AUTOEXEC.SUB, který obsahuje inicializaci celé hardwarové konfigurace a může také ze systémové diskety nakopírovat do RAM disku některé základní programy (POWER, WORDSTAR CS apod.). Samočinné spuštění souboru AUTOEXEC.SUB po zapnutí počítače zajistíme tak, že v SETUPu volíme "Auto execute file" a zapíšeme příkaz "SUBMIT AUTOEXEC" (program SUBMIT.COM je součástí systémové diskety). Především je nutno systém zkopírovat z distribuční diskety na pracovní disketu, z které jej budete zavádět, a původní disketu bezpečně uložit. Nejjednoduššeji to lze provést pomocí programů COPYSYS a pak COPYDISK (popis těchto programů je také součástí tohoto manuálu). Po uložení distribuční diskety a vložení zkopírované diskety do jednotky A: zavoláme SETUP a nastavíme všechny potřebné parametry. Zvláště důležité je nastavení časování disketových operací. Pro správné nastavení všech tří časů prostudujte prosím manuály svých disketových jednotek, kde jsou tyto časy uvedeny. Jestliže nastavíte časy nesprávně, můžete si být téměř jisti, že za nějaký čas nepůjdou diskety číst, proto nemáte-li manuál od svých mechanik, snažte se konkrétní časy někde vyzvědět. Jedná se především o "Settling time" - doba ustálení hlavy na stopě, a "Start time" - doba rozběhu hlavního motoru. V případě neúspěchu nastavte Settling time na 30 ms a Start time na 1000 ms, což by mělo vyhovovat všem mechanikám, avšak budete se muset spokojit s menší rychlostí Vašeho CP/M. Pokud se týká doby kroku - "Step time", ta se dá najít zkusmo. 6.1 Využití programu z jiného počítače Nespornou výhodou implementace CP/M na Sharpu je možnost využívat programy a datové soubory vytvořené na jiných počítačích. Je pouze třeba mít tyto programy a data zaznamenány na disketách. Překopírování programů na odpovídající médium lze provést několikerým způsobem: 1. Nejjednodušší je zřejmě zkopírovat si vše potřebné přímo z diskety na disketu. To bude pravděpodobně zdaleka nejčastější případ. 2. Nemáte-li možnost vypůjčit si někde kompatibilní disketu, budete muset zaznamenat program na zdrojovém počítači na kazetu ve formátu programu MSAVE (varianty programu MSAVE již existují např. pro IBM PC, Sinclair ZX Spectrum apod.). 3. Rychlejší způsob přenosu je po sériové lince, tj. pomocí seriového rozhraní RS-232C. Tuto možnost autor z vlastní zkušenosti vřele doporučuje, protože zmíněné rozhraní je 60 velice rozšířené, najdeme je prakticky na každém počítači. Kromě toho propojovací kabel má minimum žil, a přenos jde rychle. Přímý přenos po vodiči má jedinou nevýhodu - musíme oba počítače k sobě fyzicky přinést. Po přenesení programu do Sharpa je nutno některé programy přeinstalovat. Proto nezbývá než přenést i instalační program a tímto vlastní program instalovat. Pokud původní program neseženeme v nainstalovatelné podobě, je možné, že nebude fungovat. Naopak po správném nainstalování budeme překvapeni, že na Sharpu obvykle program funguje lépe než na původním počítači. Co se týče přenosnosti programů, je situace příznivá, neboť lze přenést téměř vše. Je nutné se pouze vyhnout programům, které dopředu předpokládají určitý přesně daný formát disku a nezískávají informace o disku čtením systémových tabulek (týká se např. programů určených výhradně pro osmipalcové disky - DOCTOR apod.). Při přenosu nebo kopírování každého programu je nezbytné spočítat (např. programem POWER) kontrolní součty originálních a překopírovaných programů a porovnat je na shodu. Je až neuvěřitelné, kolik vadných verzí programů koluje mezi lidmi. Chyba v programu může vzniknout jak při přenosu z jiného počítače, tak i při prostém kopírování z disku na disk. Proto radíme mít sadu disket se "zaručenými" programy, a pro práci pořizovat pracovní kopie na jiné médium. 61 7. Literatura [1] Western Digital Corporation, FD 179X-02, Floppy Disk Formatter/Controller Family. [2] Sharp Corporation, Service manual, Model MZ-800, MZ-1P16, MZ-1E20, 1984. [3] Sharp Corporation, Personal Computer MZ-800, Owner's Manual, 1984. [4] NEC Corporation, FD 1036A, 3.5'' Floppy Disk Drive, 1985. [5] NEC Corporation, FD 1037A, 3.5'' Floppy Disk Drive, 1987. [6] SGS-Ates, Z80 Microcomputer System, 1977. [7] Tesla, Katalog polovodičových prvků, 1987. [8] Kočí, J.: Řadič pružných disků pro Sharp MZ-800, výrobní dokumentace, 1988. [9] Kočí, J.: Karta seriových styků RS-232C pro Sharp MZ-800, výrobní dokumentace, 1988. [10] Kočí, J.: RAM disk 256/512 KB pro Sharp MZ-800, výrobní dokumentace, 1988. [11] Neznámý autor, dokumentace k řadiči pružných disků pro Sharp MZ-800, 1988. (řadič je odlišný od předchozího) [12] Macourek, T.: RAM-disk for Sharp MZ-800, Personal Computer, 1988. [13] Neznámý autor, dokumentace k jedné z variant RAM disku pro Sharp MZ-800. (RAM disk je odlišný od předchozího) [14] Richta, K., Zajíc, J.: Operační systém CP/M pro mikropočítače, Český výbor elektrotechnické společnosti ČSVTS, 1986. [15] Krejča, T.: ZX floppy, připojení floppy disků k mikropočítači, 666. ZO Svazarmu, 1987. [16] Navrátil, Z.: OS MIKROS, Príručka pre implementáciu, Kancelářské stroje, 1985. [17] Navrátil, Z.: OS MIKROS, Príručka programátora, Kancelářské stroje, 1985. [18] Lamač, J.: Operační systém CP/M 2.2, implementace pro ZX Spectrum, 602. Svazarmu, 1988.