Implementace CP/M na ZX Spectrum

V nedeľnej retro sérii pokračujeme popisom Lamačovej verzie CP/M podľa AR 9/88.

ZX Spectrum je dnes u nás jednoznačně nejrozšířenějším počítačem, a to nejen mezi amatéry. Je však pravda, že valná většina jeho majitelů ponejvíce jen hraje různé hry nebo píše jednoduché programy v BASICu. Je to zaviněno nedostatkem osvěty, úplnou absencí odborné literatury a také tím, že v záplavě profesionálních programů různých firem tyto hry naprosto převažují. Kvalitních systémových a uživatelských programů není zas tak mnoho. Navíc se šíří pokoutním způsobem, mnohdy v poškozené verzi a hlavně, málokdy s návodem. A tak ti, kteří by třeba i chtěli dělat něco „lepšího“, nemají možnosti. Existují sice překládače jazyka PASCAL, assembleru a C, nedosahují však úrovně obvyklé u programů pro „profesionální“ počítače. Především však jsou většinou určeny pro práci s kazetovým magnetofonem, což je zařízení již patřící minulosti. Hlavní nedostatek Spectra však vidíme v tom, že na něm není možno přímo bez pomocných programů pracovat se sekvenčními soubory.

Popisovaný operační systém tyto nedostatky beze zbytku řeší. Je možný jednoduchý přístup k souborům, lze užívat kvalitní programy firem zvučných jmen, jako je WordStar, TURBO-Pascal, MACRO 80, dBASE II, Fortran a další. Důležitý je také fakt, že Spectrum získá plnou kompatibilitu s jinými osmibitovými počítači u nás, jako je např. TNS, SAPI 1, ROBOTRON 1715, ale i Commodore 128, Schneider/Amstrad 664 a 6128. Sharp 821 a další.

Základní údaje o systému

Popisovaný operační systém pro Spectrum je vytvořen na základě u nás používaného operačního systému MIKROS, což je v podstatě klasický CP/M verze 2.2. Vzhledem k větší délce BIOSu je systém vygenerován pro 60k RAM, aby se do paměti vůbec vešel (BIOS V3.2 je dlouhý asi 5 kB, u verze 4.0 se počítá asi s 6,5 kB). Může využívat jednu až tři mechaniky Microdrive, případně ještě RAM disk.

Veškeré programy pracující pod OS MIKROS jsou pak bez omezení na Spectrum přenosné. Výjimkou jsou snad jen systémové programy, které již předem předpokládají určité dané parametry disku, jako je velikost adresáře, počet systémových stop apod. a nezískávají je čtením systémových diskových tabulek. Zdá se, že se to týká jen programů MOVCPM, SYSGEN a DOCTOR, jejichž verze pro Spectrum dokončujeme. Popis uspořádání a funkce operačního systému MIKROS byl před časem publikován na zelených stránkách AR.

Technické předpoklady

Používání CP/M na Spectru se bohužel neobejde bez zásahu do obvodů počítače. Je totiž nutné, aby paměť RAM začínala na adrese 0000h. Byla proto navržena velmi jednoduchá úprava, kterou lze snadno zvládnout i amatérsky, spočívající ve výměně osmi původních paměti RAM 4532, za obvody 4164, nebo 41256. Přepnutí do módu CP/M se provede tak, že se znemožní výběr ROM a VRAM (Video RAM), které stejně k ničemu nepotřebujeme, a na jejich místo se nastránkuje nově připojená paměť RAM (adresa 0000h až 7FFFh).

Pomocí stránkovacího portu je možno volit, která stránka přidané paměti bude aktivní. Při použití pamětí 4164 vznikne známé Spectrum 80K, které má oproti Spectru 48K navíc jednu stránku paměti (stránka = 32kB), paměti 41256 umožní získat navíc 7 stránek (Spectrum 272kB). Lze zapojit i dvě sady pamětí stejného typu, počítač pak má pamět o kapacitě 528kB. Výběr pamětí obstarává port na adrese FDh, jenž má následující funkci:

  • bit 7 .. 0 – mód Spectrum 48K,
  • …….. 1 – mód CP/M,
  • bity 6, 5, 4 a případně 3 určují aktivní stránku RAM.

Jak je vidět, i po zásahu zůstane Spectrum plně kompatibilní se všemi programy pro něj určenými, které lze i nadále beze změn používat.

Zde je však nutné se zmínit o dosud publikovaných úpravách paměti Spectra. Mohlo by se totiž zdát, že námi navrhovaná úprava je další variací na staré téma. Není tomu tak. Starší úpravy totiž spočívaly vesměs v tom, že umožňovaly stránkovat paměť v horní polovině adresovaného prostoru, tj. na adresách 8000h až FFFFh, což pro náš účel nevyhovuje. Uprava popsaná ve Sdělovací technice č. 11/1987 sice stránkuje paměť dole, ale způsobuje kolize dat na sběrnici při připojení standardních periférií pro Spectrum, ať už je to ZX Interface 1, Opus Discovery, Beta-disk, ZX Interface 3, Kempston E, Lprint 4 a další. TO pak přináší uživatelům mnoho nepříjemných překvapení.

Při úpravě je nutno zaručit správné občerstvování nově připojených pamětí. Tyto paměti vyžadují v občerstvovacím cyklu osmibitovou adresu. Použitý mikroprocesor Z80A však poskytuje jen sedmibitové občerstvení. Součástí přidané destičky s několika IO je proto také obvod zajišťující generování osmého bitu občerstvovací adresy.

Programové vybavení

Základním požadavkem při vzniku CP/M pro ZX Spectrum bylo využití standardních periférií pro záznam dat, což je ZX Interface 1 a Microdrive. Máme pochopitelně napsanou CP/M na Spectrum i pro disketové mechaniky, což však při velmi jednoduché programové obsluze disketového řadiče nebyl žádný zvláštní problém. Základem této verze je poměrně rozšířený systém Beta-disk, který používá řadič FD 1793 a který je možno snadno amatérsky vyrobit. Podmínkou je však získání potřebných IO a disketové mechaniky. Daleko dostupnější  a naprosto nejrozšířenější jsou však Microdrive. Dovážel je před časem PZO Tuzex.

Proto tedy ZX Microdrive. Je to, pravda, poněkud specifické zařízení, které nebylo jednoduché přizpůsobit požadavkům CP/M, který vyžaduje možnost přímého přístupu na disk. Tím se dostáváme K vlastnímu systémově závislému bloku operačního systému, k BIOSu. Hlavním programem je zde totiž simulátor pružných disků na ZX Microdrive. Kdyby se Microdrive obsluhovaly stejně jako disk, celý systém by pracoval neuvěřitelně pomalu (vyzkouŠeno). Bylo nutno se uchýlit k takovým prostředkům, jako je sdílení času, priorita diskových operací, nepřetržitá činnost klávesnice i při běhu Microdrive a přístup k souborům přes velké vyrovnávací paměti. Tyto věci známe spíše od počítačů podstatně vyšších tříd, jako je např. IBM PC. Nicméně výsledkem je funkční, použitelný systém. Verze BIOSU Č. 3.2, použitelná pro celkový rozsah paměti 80K i 272K, ovládá Microdrive znatelně rychleji než originální Sinclair ROM v ZX Interface 1. Nejnovější verze BIOSu V4.0, určená pro RAM 272K a více, pracuje s Microdrive dokonce několikrát rychleji, než podobné systémy s disketovými mechanikami.

Při použití celkového rozsahu RAM nejméně 272K, lze pracovat pod operačním systémem CP/M na Spectru i s použitím kazetového magnetofonu. Po zdlouhavém nahrání všech programů i dat z kazety, Ize totiž dále pracovat již jen s RAM diskem a nakonec data opět nahrát na kazetu. I to bylo úspěšně vyzkoušeno. Pro vážnější práci by však bylo zálohování zdroje asi podmínkou. Přesto je jistě tento způsob zajímavý, zvláště pro výukové účely.

Rutiny BIOSu

Studený a teplý start

Studený start systému je vyřešen asi jediným možným způsobem. Do mechaniky 1 se vloží kartridž se systém a zadá se příkaž RUN. Zaváděč zjistí velikost paměti RAM, otestuje ji, zavede systém a spustí jej.

Teplý start ovšem funguje poněkud jinak. Na jiných počítačích se systém znovu zavádí z disku. Zde ale systém na běžných kartridžích vůbec není, aby tu nezabíral drahocenné místo. Proto se při prvním natažení systém přemístí do nevyužité paměti VRAM, odkud se při teplém startu instrukcí LDDR přesune na místo funkce.

Klávesnice Také činnost klávesnice byla pozměněna. Především nestačil počet kláves. Nová obsluha klávesnice tudíž zpracovává tři současně stisknuté klávesy. Je tak možno vkládat všechny ASCII znaky od CHR(0) až po CHR(127). Některé klávesy mají odlišný význam – jsou uspořádány v následující tabulce:

KlávesaFunkceKlávesaFunkce
EXTEND MODECTRLEDITESCAPE
GRAPHTABBREAKCTRL S
TRUE VIDEOCTRL CINV VIDEOCTRL R
CURSOR LEFTBSCURSOR RIGHTCTRL D
CURSOR UPCTRL ECURSOR DOWNCTRL X

Symbol shift + SPACE + B je přerušení programu se skokem do systému. Je to výhodná funkce např. v případě, že program uvízne v nekonečném cyklu. Ostatní klávesy fungují tak jako na jiných počítačích, tzn. CTRL + písmeno dává odpovídající řídicí znak.

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í paměti o velikosti 128 znaků. Je proto možné např. při překladu souboru assemblerem již psát další příkazy, které budou provedeny později po skončení překladu.

Výstup na terminál

Jak je známo, CP/M vyžaduje obrazovku S 80 znaky na řádek. Jak se však ukázalo, S určitými omezeními pracuje i na systémech s 64 znaky. U Spectra je to vyřešeno mikroprintem s formátem 64 znaků na 24 řádcích. Součástí výstupního programu jsou i podprogramy pro rolování obrazovky nahoru a dolu a pro mazání řádky, což výrazně zvyšuje komfort při editování textu. ASCII znaky CHR(20) až CHR(126), BEL, BS, LF a CR jsou zobrazovány obvyklým způsobem, seznam ostatních řídicích kódů je v následující tabulce

ZnakFunkceZnakFunkce
ESC = Y xCURSOR LEADESC TERASE TO EOLN
ESC RDELETE LINEESC EINSERT LINE
ESC (END HIGHLIGHTESC )START HIGHLIGHT
CTRL ZCLS+HOME

BIOS neumí zpracovat znaky TAB, FF a DEL. Rídicí znaky byly zvoleny ve snaze po co největší standardizaci BIOSu a jsou shodné s terminálem Televideo 925 a 950.

Součástí výstupní rutiny je i podprogram pro tisk kursoru, který běží přes přerušení a kursor je tudíž stále viditelný. Některé programy totiž vyžadují viditelný kursor i v době, kdy se nečeká na klávesnici. Kursor bliká i v době běhu mechanik Microdrive.

Tiskárna a děrná páska

To jsou zařízení, která má každý uživatel jiná. Proto v BIOSu nejsou obslužné programy pro tisk a pásku zahrnuty. Za jeho vstupním vektorem jsou ještě čtyři vektory další, které jsou v pořadí:

AdresaPodprogram
BIOS + 33HVýstup znaku na tiskárnu
BIOS + 36HStatus tiskárny
BIOS + 39HVyděrování znaku na pásku
BIOS + 3CHPřečtení znaku z pásky

Vstupní parametr je v registru C, výstupní V A. Uživatel na příslušné místo BIOSU (přidané vektory) umístí instrukci skoku na svůj podprogram, který napíše, přeloží od adresy BASIC RAMTOP + 1 a zařadí do systému na adresu CCP-800h, odkud jej systém přemístí na místo určení a zavolá. Pro uživatelské rutiny je zde volných 300h bajtů. Při volání je nastránkovaný mód 48K, povolené prerušení a SP je nastaven na adresu, pod níž je volných nejméně 20h bajtů. Uživatel smí používat registry AF, BC, DE a HL a nesmí zakázat přerušení (pozor na časovací smyčky!). Není možno také volat rutiny do ROM ani do přídavné ROM, kterou má např. ZX Interface 1 nebo jiné interfejsy.

Diskové operace

Diskové operace na úrovni Microdrive jsou zdaleka nejsložitějšími operacemi BIOSu. Jejich základem je sdílení času procesoru mezi činností Microdrive a běžícím programem. To se uskutečňuje přes přerušení a probíhá ve dvou různých prioritách. Vyšší prioritu mají okamžité požadavky běžících programů. Nižší prioritu má přístup BIOSu na disk při vykonávání dřívějších požadavků na sekvenční čtení a zápis. Komunikace programu se soubory se uskutečňuje přes přístupové vyrovnávací paměti. Jejich velikost je 2K u BIOSu V3.2, nebo 32 až 64K u systému 4.0.

Formát záznamu

CP/M na Microdrive využívá jiný formát záznamu než originální ROM, a to ze dvou důvodů. Jednak je zvýšená jmenovitá kapacita kartridže na 96K, jednak původní formát záznamu není možný, protože u něj není počítáno s existencí adresáře. Kartridž je implementována jako disk s jednou stopou, na které je 192 sektorů o velikosti 0,5K. Každý sektor má hlavičku o délce 4 bajty, ve které je nulový flag, číslo kartridže (2 bajty), číslo sektoru a kontrolní součet. Za hlavičkou následuje 512 bajtů dat, která jsou uvedena flagem o hodnotě FFh a zakončena kontrolním součtem. Číslo kartridže je náhodné číslo, které je generováno při formátování a slouží BIOSU k rozpoznání výměny kartridže bez počítání kontrolních součtů adresáře BDOSem. Z důvodu co největší optimalizace přístupových dob při sekvenčních operacích není pevně stanoven parametr přečíslení sektorů. BIOS přečíslení neprovádí vůbec, sekvence po sobě následujících čísel sektorů je generována při formátování kartridže a parametr přečíslení je volitelný. Uživatel tak může přístupové doby optimalizovat na minimum, s ohledem na druh prováděné práce a konkrétní časové konstanty svých mechanik Microdrive. Ty se však, bohužel, u jednotlivých kusů liší. Jako nejvýhodnější se ukázalo přečíslení po dvou u kartridži určených pro záznam programu a po dvanácti pro sekvenční soubory, které vyhovuje všem mechanikám.

Kartridž je médium, na kterém se po formátování téměř vždy vytvoří nějaké vadné sektory, způsobené přinejmenším slepkou páskové smyčky. Proto je zápis do těchto vadných sektorů znemožněn tím, že po několikerém testu kartridže je do adresáře zapsán systémový, proti zápisu chráněný soubor, který obsahuje všechny vadné sektory. Tento soubor je zaznamenán pod číslem neexistujícího uživatele 31, na které systém proto nijak nereaguje.

Na kartridž je možno v ideálním případě zaznamenat až 95kB dat, z čehož adresář má velikost 1kB (2 sektory). Tím je omezen maximální počet souborů zaznamenaných na jedné kartridži na dvaatřicet, což ale běžně postačuje.

Operace čtení

Sekvenční čtení sektoru je nejčastěji prováděná operace. Musí proto pracovat co nejrychleji. Provádí se tak, že při požadavku na čtení se nejdříve testuje, zda daný sektor se už nevyskytuje v přístupovém bufferu (ve valné většině případů tomu tak je). Když ano, sektor se předá volajícímu programu a pochopitelně s mechanikou Microdrive není nijak manipulováno. Pouze při operaci otvírání a zavírání souboru (přístup do adresáře) se hlídá, zda mezitím kartridž někdo nevyměnil. Pokud by se prováděl kontrolní součet adresáře, jako u standardni CP/M, trvalo by to nejméně celý jeden oběh pásku. Proto tato kontrola spočívá v přečtení první hlavičky sektoru a porovnání náhodného čísla kartridže s číslem uloženým v paměti. Jestliže se číslo neshoduje, jsou vyprázdněny příslušné přístupové buffery dané mechaniky a čtení probíhá přímo z kartridže. Celý test výměny netrvá déle než asi 150 ms. Aby však nedocházelo k zbytečnému zdržování, tento test se neprovádí vždy. Jeho činnost je vypuštěna v případě, že poslední operace čtení nebo zápisu na dané mechanice neproběhla před více než dvěma sekundami. Je totiž zjištěno, že dříve než za zmíněné dvě sekundy není možno kartridž vyměnit.

Jiná situace nastává, když daný sektor není v bufferu nalezen. Pak se uvolní ta část bufferu, která je v dané chvíli relativně nejméně potřebná a do takto vzniklého místa se načte sektor z kartridže, aby se mohl posléze předat volajícímu programu.

U systému 4.0 s rozšířenou pamětí je navíc každá operace čtení následována logickými procedurami, jejichž cílem je co nejvíce minimalizovat doby spojené se čtením souboru. I když není požadována žádná další operace čtení a běží hlavní program, BIOS si přes přerušení zaplňuje přístupový buffer dalšími sektory z otevřeného souboru, dokud se buffer zcela nezaplní, nebo dokud počet sektorů nepřesáhne hodnotu 16. Tím je zajištěno, že čtení souboru z mechaniky se o 8 kilobajtů „předchází“ před vlastními požadavky na čtení a odezva BIOSu na požadavek čtení je velmi rychlá. Jedná se jen o přemístění dat v paměti RAM.

Operace zápisu

Zápis je podobně uzpůsoben velkým časovým nárokům, jako čtení. Většinou je uskutečněn tak, že je uvolněna nejméně potřebná část bufferu a do této části je zapisovaný sektor uložen. V příslušných tabulkách se zapíší informace o tom, že daný sektor má být zapsán a řízení se předá hlavnímu programu, jako kdyby zápis již byl hotov. Vlastní zapsání sektoru provede BIOS později, nejčastěji přes přerušení. Někdy však je také operace zápisu provedena jako vedlejší účinek operace čtení v okamžiku, kdy je při čtení nalezen sektor, který má být zapsán. Nikdo se však nemusí obávat, že by např. při výpadku sítě neměl poslední data zaznamenána, protože systém všechny požadované zápisy provede většinou ihned, nejpozději však do třiceti sekund od vlastního požadavku.

Práce s přístupovými buffery

Jak již bylo vysvětleno, čtení a zápis sektoru neprobíhá přímo, ale přes přístupové buffery obecně různých délek, které si systém mění podle potřeby. Po zavedení systému a několika minutách práce systému jsou pochopitelně všechny buffery zcela zaplněny a systém musí začít šetrně hospodařit s místem bufferů. Tato strategie byla několikrát měněna a zkoušena, než byl nalezen její definitivní tvar.

Je-li požadována operace čtení nebo zápisu a není-li daný sektor v bufferu nalezen, začne BIOS hledat, který sektor v bufferu relativně nejméně potřebuje. Celý postup se liší podle toho, zda sektor, pro nějž uvolňujeme místo, náleží adresáři či nikoli. Má-li sektor číslo 0 nebo 1, tedy patří adresáři a pro získání potřebného místa bude vypuštěn sektor:

  1. Neadresářový sektor, který byl ale už volajícím programem přečten nebo zapsán celý (to znamená, že byly přečteny nebo zapsány všechny čtyři subsektory tohoto sektoru, neboť fyzický sektor má délku 512 bajtů a logický sektor jen 128).
  2. Neadresářový sektor, z něhož se pouze četlo.
  3. Jakýkoli sektor, z něhož se pouze četlo.
  4. Nebyla-li žádná z předchozích činnosti úspěšná, nastane operace honosně nazvaná ,, aktivní časový výběr“.

O co se vlastně jedná. V této situaci, která v danou chvíli znamená zastavení práce hlavního programu, je třeba nějakou část bufferu co nejrychleji uklidit. Protože všechny sektory v bufferu byly hlavním programem zapsány, ale na kartridži ještě nejsou, je nutno nějaký sektor rychle zaznamenat. Proto se spustí motor jedné mechaniky Microdrive (pokud ovšem nějaká již neběží) a hledá se nějaký sektor, který má být zapsán. Je-li nalezen, zápis se provede a takto uvolněné místo je využito pro jiný sektor. Při výběru mechaniky, na kterou se přebytečný sektor odklidí, má samozřejmě přednost mechanika již běžící.

Pokud je zapotřebí získat prostor pro sektor, který je součástí nějakého souboru, jsou zvažována kritéria v tomto pořadí:

  1. Předcházející sektor, z něhož se pouze četlo a je celý přečtený volajícím programem. Je to nejčastější sektor, který V souboru novému sektoru předcházel a tudíž již s největší pravděpodobností nebude čten.
  2. Sektor, z něhož se pouze četlo a je přečtený celý.
  3. Jakýkoli sektor, z něhož se pouze četlo
  4. Aktivní časový výběr.

Protože BIOS musí obsluhovat mechaniky Microdrive na nejnižší možné úrovni, stará se i o zapínání a vypínání pohonných motorků. Jelikož tato operace trvá zhruba 18 ms, je vyloučeno s motorkem manipulovat po každé operaci čtení nebo zápisu. Motorky se proto zapínají okamžitě, je-li to nutné, avšak jejich vypínání je zpožděné, tak jak to dělají diskové řadiče. Proto Microdrive už tak často neblikají a neprovádějí záznam a čtení s opětovným zapínáním a vypínáním mechanik jako při práci s originálním ROM, ale většinou vypadá celé čtení nebo zápis tak, že se mechanika rozběhne a po chvíli zastaví. Kromě jiného to také prodlužuje nepříliš velkou životnost mechanik.

Jiří Lamač, autor BIOSu, Daniel Meca


Článok bol pôvodne publikovaný v Amatérskom rádiu 9 / 1988 na str. 339-341


Pridaj komentár