QUICK DISK MZ-1F11 Následující text se vztahuje na quick disk model MZ-1F11 Nebudeme zde blíže popisovat řízení QUICK DISKU z BASICu, neboť toto bylo podrobně popsáno v obslužném manuálu SHARP Všimneme si více možností, jak je možno QUICK DISK připojit a obsluhovat ve strojovém kódu. Všeobecně Prostřednictvím ROM ležící od E000H po FFFH ( pouze v MZ-800 a u MZ-700 jestliže je QUICK-DISk připojen) lze uložit až 34 souborů o celkové délce 64 kilobajtů. Systém sice dovoluje uložit na QUICK DISK až 50 souborů, ale buffer pro directory pojme pouze 34 souborů Pravděpodobně však nebudete potřebovat uložit na jeden QUICK DISK více než 34 souborů. Tyto soubory jsou na QUICK DISK uloženy jako dlouhý řetězec bajtů a nečlení se jako je obvyklé u floppy disku na jednotlivé sektory a stopy. Má to bohužel za následek, že žádné jednotlivý soubor nelze samostatně vymazat nebo přepsat. Lze pouze quick disk znovu formátovat a tím všechna pole vymazat. Přes rutinu E010H probíhý kompletní řízení QUICK DISKu. Je ovšem nutné předem uvést kód, který určuje operaci, která se na QUICK DISKu má provst. Operace se volní podle řídícího kódu, který je uložen na adrese 11130H. Kontrolní kódy pro rutinu E010H 01 READY CHECK Přezkušuje,zda QUICK DISk je připojen. Jestliže ne, pak je nastaven příznak CARRY = 1 02 FORMAT Formátuje QUICK DISK 03 READ Čte datový blok ( od bodu hlavičky) 04 SAVE ukládá datový blok na QUICKD DISK ( od hlavičky) 05 HEADPOINTCLEAR nastavuje hlavičku (inicializace) 06 MOTOR OFF Vypnutí motoru Tyto kódy musejí být uloženy na adreseu 1130H dříve než je vyvolána rutina E010H. Headpoint představuje hexadecimální kód, který je převzat z adresy 1130H a označuje na QUICK DISKu bod, od kterého se má ukládat nebo číst. Je při READ (kód 03) a SAVE (kód O4) interpretován jako startovací bod a po čtení/psaní znovu nastavován Tato rutina nastavuje CARRY jestiže se vyskytne chyba: Jestliže CARRY = 1, pak je druh chyby uložen v ACCU. ACCU druh chyby adresa sdělení 28H not found err F290H soubor nebyl nalezen 39H bad Disk err F319H Disk není v pořádku 2EH write protect F2D6H Disk chráněný proti zápisu 32H not ready err F2E7H Quick Disk není připraven 35H no file space err F2F4H na disku není místo 36H unformat err F309H Disk ještě není naformátován 2AH already exist err F2C4H Jméno souboru již existuje 33H too many files err F2A2H příliš mnoho souborů na disku 00H BREAK F329H Přerušení SHIFT&BREAK Ostatní znamená HARD ERROR F2B8H Uvedené adresy sdělení jsou texty chybových hlášení, která jsou v ASCII formátu uložena v ROM a je možné je zobrazit na obrazovce následujícím programem: LD DE,message adr CALL 0006H CALL 0015H STAVBA HLAVIČKY QUICK DISKU Hlavička Quick disku je velmi podobná hlavičce rutiny kasetového magnetofonu a je uložena v oblasti 10F0H až 1112H Význam jednotlivýchdat 10F0H kód souboru 01H strojový program OBJ 02H program BASIC BTX 03H BASIC data BSD 04H BASIC randomfiles BRD 05H RB 07H LIB 0AH SYS 0BH GR 94H u text. souborů TEXYTXT 95H LISP soubor LSP Poznámka: Kódy 94H a 95H nejsou v Directory monitoru známy,proto se zobrazují ??? 10F1H až 1101H Jméno souboru s koncovým znakem (0DH) 1104H Délka souboru 1106H Počáteční adresa datovéhobloku 1108H Autostartovací adresa programu Zbylé adresy hlavičky nejsou využity. Další důležité subrutiny ROM EF27H Ready check odpovídá E010H s 1130H = 01 F25FH Headpoint clear odpovídá EO10H s 1130H = 05 E2E8H Motor off odpovídá E010H s 1130H = 06 EEF7H Filesearch Vyhledává na disku soubor, jehož jméno je uloženo od 11A3H Jestliže název na 11A3H začíná 0DH ( není tedy zadáno žádné jméno), pak se uvažuje prvý soubor na disku. Nastaví se Headpoint a hlavička souboru se zavede od 10F0H až po 112FH. Přitom se kód souboru ( na adrese 10F0H) nebere v úvahu.Podle potřeby je třeba kód souboru přezkoumat. Filesearch musí být inicializován za pomoci F25FH (Headpoint). Při dalším vyvolání funkce Filesearch bez inicializace se provádí prohledávání dále. Pokud se vyskytne chyba, nastaví se Cy=1. Pozor! Z technických příčin není v průběhu vyvolání funkce Filesearch dostatek času,takže by případně mohlo dojít i k přeskočení souborů. Čas například nestačí k tomu, aby názvy nalezených souborů byly zobrazovány na obrazovce. Proto je pro Directory nutný také buffer. EFA2H File end search Vyhledá konec datového bloku na Quick disku, nastaví Headpoint, zjistí, zda eventuelně soubor tohoto jména již existuje ( v hlavičce od 10F1H maximálně 16 znaků +CR) nebo zda případně více je na disku více souborů ( maximálně 50, viz výše). Podprogram File end search proběhne úspěšně tehdy, jestliže Cy = 0 a A=28H ( not found). A nyní k důležitým subrutinám LOAD a SAVE, které obě se vyvolávají přes E010H ( viz výše ) LOAD Jak již bylo uvedeno výše, inicializuje se funkce LOAD kódem 03 na adrese 1130H. Kromě tohoto kódu a Headpoint, který je nastaven funkcí Filesearch, potřebuje LOAD ještě startovací adresu oblasti, do které má být soubor uložen, délku ukládaného souboru a další kód, který slouží k rozpoznání datového bloku ( rozlišení mezi hlavičkou a blokem). Data pro Quickdisk startovací adresa na 1132H délka 1134H kód 03H 1130H 2.kód 01H 1131H SAVE Save se ovládá kódem 04 na 1130H a kódem 04 na 1131H. Kromě toho je třeba určit délku hlavičky 0040H, její startovací adresu 10F0H, startovacíadresu oblasti, která má býtuložena a délku souboru. Následující tabulka popisuje, kde musejí být tato data předána. Kód na 1130H = 04 2.kód na 1131H = 04 Start Header na 1132H = 10F0H Délka hlavičky na 1134H = 0040H Start DATA na 1136H Délka DATA na 1138H Označením data je míněna ukládaná oblast. Nyníještě příklady pro formátování, zavádění a ukládání: Format: CALL EF27H Test zda je QD připraven JP C,ERROR Jestliže Cy = 1 Error (not ready err) LD A,02H kód pro formátování LD (1130H),A uložení kódu CALL E010H hlavní rutina QD JP C,ERROR jestliže Cy =1 Error viz tabulka RET LOAD CALL EF27H Test,zda je QD připraven JP C,ERROR vizvýše LD DE,EE65H Text "Filename ?" CALL 0006H Posun na dalšířádek CALL 0015H Zobrazenítextu CALL 0006H LD DE,11A3H Buffer pro Filename CALL 0003H Vstup řádku LD A,(DE) 1.znak v bufferu CP 1BH Kód pro SHIFT+BREAK JP Z,ERROR jestliže BREAK, pak ERROR CALL FE5FH Headpoint clear CALL EEF7H Filesearch LD HL,(1104H) Délka souboru ( v hlavičce) LD (1134H),HL LD HL,(1106H) Počáteční adresa souboru LD (1132H),HL LD HL,0103H Kód 03 a 2.kód 01 LD (1130H),HL CALL E010H Hlavní rutina QD JP C,ERROR CALL E2E8H Motor off RET SAVE CALL EF27H Test,zda je QD připraven JP C,ERROR LD DE,EE65H Text "Filename ?" CALL 0006H CALL 0015H CALL 0006H LD DE,11A3H Vstupní buffer CALL 0003H Vstup řádku LD A,(DE) CP 1BH JP Z, ERROR viz výše EX DE,HL buffer 11A3H do HL LD DE,10F1H Buffer pro Filename v hlavičce LD BC,0010H Maximální délka souboru LDIR Blokový přesun LD A,0DH LD (DE),A Nastavení konce LD HL, délka uložení délky souboru do HL LD (1104H),HL Uložení adresy dohlavičky LD HL,startadr. Naplnění HL startovací adresou souboru LD (1106H),HL LD HL,Execute Naplnění HL autostartadresou LD (1108H),HL LD A,01H kód pro soubor strojovéhokodu LD (10F0H),A CALL F25FH Headpoint clear CALL EFA2H File end search JP C, ERROR CP 28H Kód pro "not found" JP NZ,ERROR LD HL,(1104H) délka LD (1138H),HL LD HL,(1106H) startovací adresa LD (1136H),HL LD HL,0404H kód 04 pro save a 2. kód 04 LD HL,0040H délka hlavičky LD (1134H),HL LD HL,10F0H start hlavičky LD (1132H),HL CALL E010H hlavní rutina JP C, ERROR CALL E2E8H Motor off RET Uvedené programy mohou fungovat jako podprogramy, je ovšem potřeba přidat rutinu ERROR, která pak zobrazuje patřičná chybová hlášení. Řízení plotteru ve strojovém kódu --------------------------------- Tato kapitola Vám má umožnit instrukcemi strojového kódu řídit vícebarevný plotter (MZ-1P16) připojený k MZ-800. Obsluha plotteru v BASICu je dostatečně popsána v originálním manuálu. Ve strojovém kódu lze rovněž rozlišovat dva různé způsoby obsluhy plotteru. 1)GRAPHIK MODUS V grafickém modu lze zobrazovat znaky nejrůznějším způsobem. 2)CHARACTER MODUS ( TEXT MODUS ) Ve znakovém modu je možno tisknout určité znaky (písmena, číslice, zvláštní znaky. Tyto znaky se tisknou v různých velikostech (26,40 a 80 znaků na řádku) Znaky, které dokáže plotter vytisknout, jsou uvedeny v tabulce znaků (viz obslužný manuál SHARP strana A-26) Pokud necháme na plotteru vytisknout znak,který v tabulce uveden není, automaticky se v další barvě vytiskne hexadecimální kód tohoto znaku. Rutiny monitoru k řízení plotteru ---------------------------------- Monitor 1Z-013B obsahuje dvě rutiny křízení plotteru. a)CALL 01F8H Tato rutina posílá obsah akumulátoru na plotter. Obsahem akumulátoru může být řídící znak nebo znak z tabulky znaků. Před vyvoláním této rutiny musí být akumulátor naplněn požadovaným obsahem ( to je překvapení, co ? - pozn. překl) b)CALL 01A5H Tato rutina posílá na plotter jednotlivý bajt řetězce. Řetězec znaků může obsahovat řídící znaky a/nebo znaky z tabulky znaků. Řetězec musí být ukončen znakem 0DH a jeho počáteční adresa musí být uložena v registru DE. Obě rutiny plotteru mají tentýž význam: Posílají na plotter jeden bajt. Rutinu 01A5H použijeme, jestliže na plotter posíláme více bajtů (znaků a/nebo řídících znaků), jinak použijeme rutinu 018FH, která tiskárně posílá pouze jeden bajt. Řízení plotteru ve znakovém modu -------------------------------- Po zapnutí se MZ-800 nastaví do CHARACTER MODU. Barva tisku je automaticky černá a hlava tiskárny se nastaví k levému okraji. Za pomoci obou plotterových rutin (CALL 018FH a CALL 01A5H) je nyní možno zadávat plotteru různé řídící funkce i znaky z tabulky znaků. Tabulka řízení a význam jednotlivých znaků ------------------------------------------ Řídící znak: Význam: 01H Přepíná plotter do znakového (textového) modu 02H Přepíná plotter do modu GRAPHIK 03H Zpětný posun o jeden řádek 04H Test tiskárny (4 čtverce v různých barvách) 0AH Posun o jeden řádek 0BH Změna velikosti písma ze 40 na 26 znaků na řádku 0CH Změna velikosti písma z 26 na 40 znaků na řádku 0DH Návrat vozíku - CR 0EH Hlava tiskárny se přesune o jednu pozici doleva 0FH Posun o stránku 1DH Změna barvy 09H,09H,09H Změna velikosti písma ze 40 na 80 znaků na řádku 09H,09H,0BH Změna velikosti písma z 80 na 40 znaků na řádku Příklady programů obsluhy plotteru v textovém modu -------------------------------------------------- Za pomoci znaků shora uvedených, znaků z tabulky grafických znaků a obou uvedených rutin je nyní možné vytvářet různé funkce Program 1: LD A,0BH 26 znaků na řádku CALL 018FH rutina Monitoru k vyslání obsahu akumulátoru LD A,42H znak B CALL 018FH LD A,42H znak B CALL 018FH LD A,47H znak G CALL 18FH Tento krátký program přepne plotter na 26 znaků na řádku a potom vytiskne písmena BBG. Tentýž úkol lze realizovat také jiným způsobem a sice za použití druhé rutiny: Program 2: LD DE,A000H Počáteční adresa znakového řetězce CALL 01A5H rutina monitoru k vyslání řetězce Přitom musí být od adresy A000H uloženo: A000H 0BH řídící znak pro 26 znaků na řádku A001H 42H znak B A002H 42H znak B A003H 47H znak G A004H 0DH koncový znak řetězce Řízení plotteru v modu GRAPHIK ------------------------------ Následující program přepíná plotter z textového modu do modu GRAPHIK Program 3: LD A,02H řídící znak pro modus GRAPHIK CALL 018FH rutina monitoru pro vyslání obsahuakumulátoru Po vyvolání tohoto programu se nacházíme v modu GRAFIK. řízení plotteru se nyní provádí podobně jako v modu textovém. Používají se speciální řídící znaky a příkazy. Používají se k řízení obou rutin monitoru tedy 018FH i 01A5H. U některých příkazů však musíme současně s příkazem zadávat plotteru parametry. Všeobecně o hodnotách parametrů: Všechny parametry jsou dekadická čísla a mohou se skládat nejvýše ze tří číslic (stovky,desítky, jednotky). Jestliže u některého příkazu je třeba zadat více parametrů, pak se parametry oddělují čárkou (ASCII 2CH). Parametry mohou ležet v intervalu -999 až +999. U negativních hodnot se před parametrem uvádí znaménko minus (ASCII 2DH). Jednotlivé číslice parametrů lze také zadávat v ASCII formátu. Příkazy v grafickém modu ------------------------ a) Příkazy bez parametrů Příkaz: ASCII: Význam: A 41H Návrat do textového modu H 48H Zvedá pisátko a přesouvá hlavu plotteru do výchozí pozice I 49H Aktuální pozice hlavy plotteru je definována jako výchozí b)Příkazy s jedním parametrem: ------------------------------ Příkaz: ASCII: Význam: C 43H Změna barvy v hlavičce Tento příkaz musí být následován parametrem jehož hodnota je mezi 0 a 3 (ASCII od 30H do 33H) 0 = černá ASCII 30H 1 = modrá ASCII 31H 2 = zelená ASCII 32H 3 = červená ASCII 33H Následující program provede změnu barvy na červenou: LD A,43H příkaz C CALL 018FH rutina monitoru LD A,33H parametr určující červenou barvu CALL 018FH rutina monitoru L 4CH Určuje typ linií - souvislé nebo tečkované Tento příkaz musí být následován hodnotou parametru mezi 0 a 15 (v ASCII formátu) 0 = souvislé linie 1-15 = tečkované linie Následující program určuje typ linií 15 LD A,4CH L příkaz CALL 018FH LD A,31H Dekadická hodnota parametru 15 v ASCII formátu CALL 018FH LD A,35H Jednotková část parametru 15 v ASCII formátu CALL 018FH (tento řádek není v knize uveden ale logicky sem patří - pozn.překl) Q 51H Určuje směr, ve kterém má být znak zobrazen Tento příkaz musí být následován parametrem,jehož hodnota je mezi 0 a 3 (ASCII 30H až 33H) 0 = přímo 1 = otočený doprava 2 = hlavou dolů 3 = otočený doleva S 53H Určuje veliost znaku Tento příkaz musí být následován parametrem o hodnotě mezi 0 a 63 (v ASCII formátu) Následující program změní velikost znaků na 60: LD A,53H příkaz S CALL 018FH LD A,36H Dekadická část parametru 60 CALL 018FH LD A,30H Jednotková část parametru 60 CALL 018FH c)Příkazy se dvěma parametry Příkaz: ASCII: Význam: D 44H Zobrazí čáru počínaje aktuálnípozicí hlavy až k bodu zadanému koordinátami (Xn,Yn) DX1,Y1,X2,Y2,...,Xn,Yn zobrazí čáru od aktuální pozice k X1,Y1 odtud kX2,Y2 až ke konečnému bodu Xn,Yn. Prvý parametr (X) může nabývat hodnot -999 až +999, druhý parametr (pozice Y) hodnot -480 až +480. Hodnoty parametrů musejí být odděleny čárkou ( ASCII 2CH) Po posledním parametru musí následovat koncový znak (ODH) Následující program zobrazí linii od aktuální pozice hlavy plotteru k bodu (-20,20) LD A,44H Příkaz D CALL 018FH LD A,2DH znak - v ASCII CALL 018FH LD A,32H desítková hodnota parametru X v ASCII formátu CALL 018FH LD A,30H jednotková hodnota parametru X v ASCII formátu CALL 018FH LD A,2CH čárka (oddělující oba parametry) CALL 018FH LD A,32H desítková část parametru Y v ASCII formátu CALL 018FH LD A,30H jednotková část parametru Y v ASCII formátu CALL 018FH LD A,0DH označení konce dat CALL 018FH J 4AH Zobrazí linii, počínaje aktuální pozicí pisátka až k bodu, jehož pozice je určena relativními koordinátami X1,Y1 až k bodu Xn,Yn. Příkaz J je identický s příkazem D až na to, že v příkazu J zadáváme adresy relativní. Hodnota parametru X může bý od -999 až po +999. Hodnota parametru Y musí být v rozmezí -480 až +480. Parametry musejí být odděleny čárkou ( 2CH) a ukončeny musejí být znakem 0DH. Jinak viz příkaz D. M 4DH Zvedá pisátko a přesouvá je k bodu (X,Y). Příkaz vyžaduje dva parametry,které musejí být odděleny čárkou. Přitom parametr X může nabývat hodnot -999 až +999 a parametr Y -480 až +480. hodnoty parametrů musejí být ukončeny koncovým znakem 0DH. Následující program přesouvá pisátko na pozici (-1,123) LD A,4DH Příkaz M CALL 018FH LD A,2DH Znak minus v ASCII CALL 018FH LD A,31H Jednotková hodnota parametru X CALL 018FH LD A,2CH čárka (oddělující parametry) CALL 018FH LD A,31H stovková hodnota parametru Y CALL 018FH LD A,32H desítková hodnota parametru Y CALL 018FH LD A,33H jednotkováhodnota parametru Y CALL 018FH LD A,0DH Koncový znak dat CALL 018FH R 52H Zvedá pisátko a přesouvá je k bodu (X,Y). Příkaz R vykonává totéž jako příkaz M, ovšem v příkazu M zadáváme absolutní adresu a v příkaz R relativní. Hodnota parametru X může být od -999 až po +999. Hodnota parametru Y musí být v rozmezí -480 až +480. Parametry musejí být odděleny čárkou ( 2CH) a ukončeny musejí být znakem 0DH. Jinak viz příkaz M. d)Příkazy se třemi parametry Příkaz: ASCII: Význam: X 58H Tento příkaz zobrazuje kartesiánské souřadnice. Prvá hodnota parametru může být buď 0 nabo 1. Je-li 0, zobrazí se osa Y, je-li 1, zobrazí se osa X. Druhý parametr určuje škálu zobrazení a musí být mezi -999 a +999. Třetí parametr určuje počet značek na ose a musí být mezi 1 a 255. Tento příkaz jinak odpovídá příkazu AXIS v BASICu. V dalších podrobnostech viz tam. Jednotlivé parametry musejí být odděleny čárkou ( 2CH) a ukončeny znakem 0D. e)Příkazy s různým počtemparametrů Příkaz: ASCII: Význam: P 50H Tento příkazvytiskne znak. Příkaz musí být následován nejméně jedním parametrem.> Požadovaný znak musí být uveden jako parametr v ASCII formátu. Jednotlivé parametry nemusejí být odděleny. Poslední znak ovšem musí být následován znakem 0DH jako znakem ukončení. Následující program vytiskne písmena BBG: LD A,50H Příkaz P CALL 018FH LD A,42H B CALL 018FH LD A,42H B CALL 018FH LD A,47H G CALL 018FH LD A,0DH koncový znak CALL 018FH Kombinace více příkazů v textovém a grafickém modu a)textový modus V textovém modu jednotlivé příkazy zadáváme bez oddělení čárkou Příklad programu: LD A,01H nastavení textového modu CALL 018FH LD A,0FH posun stránky CALL 018FH LD A,09H CALL 018FH LD A,09H CALL 018FH LD A,09H přepnutí na 80 znaků na řádku CALL 018FH LD A,42H B CALL 018FH LD A,42H B CALL 018FH LD A,47H G CALL 018FH LD A,0DH koncový znak CALL 018FH b)Grafický modus V grafickém modu musejí být příkazy zakončené ODH odděleny čárkou. Mezi nimi se 0DH nezadává. Na konci však, tedy jako poslední příkaz, musí 0DH uvedeno být. Příklad programu: LD A,02H modus GRAFIK CALL 018FH LD A,49H Příkaz I CALL 018FH LD A,4CH Příkaz L CALL 018FH LD A,30H souvislé linie CALL 018FH LD A,43H Příkaz C CALL 018FH LD A,32H zelená barva CALL 018FH LD A,4AH Příkaz J CALL 018FH LD A,31H 1 CALL 018FH LD A,30H 0 CALL 018FH LD A,30H 0 CALL 018FH LD A,2CH čárka CALL 018FH LD A,2DH znak minus CALL 018FH LD A,32H 2 CALL 018FH LD A,30H 0 CALL 018FH LD A,31H 1 CALL 018FH LD A,2CH čárka CALL 018FH LD A,30H 0 CALL 018FH LD A,2CH čárka CALL 018FH LD A,30H 0 CALL 018FH LD A,2CH čárka (oddělení posledního parametru a příkazu H) CALL 018FH LD A,48H Příkaz H CALL 018FH LD A,41H Příkaz A CALL 018FH LD A,0DH Koncový znak CALL 018FH Tento program přepne plotter do modu GRAFIK. Potom určí momentální pozici pisátka jako výchozí. Další příkaz nastaví typ souvislých linií. Další příkaz určí barvu. Potom se zobrazí linie od relativního bodu (100,-201) k bodu (0,0). Nakonec se pisátko přemístí do posice HOME a plotter se přepne do modu textového. Je přirozené, te za pomocí druhé rutiny monitoru 01A5H by bylo možno tyto programy napsat kratší. Pro přehlednost byly však tyto programy napsány s použitím rutiny 018FH. ***** JOYSTICK ········ Tato kapitola je věnována obsluze joysticku. Joystick se připojuje vzadu na liště pro příslušenství. Instrukcí IN A,(F0H) je do akumulátoru uložena instrukce o tom,zda je joystick připojen nebo ne. Lze zjistit, do kterého z osmi směrů je joystick nasměrován. Není-li stisknuta klávesa ( Schusstaste = střílecí klávesa), pak poskytuje joystick tyto hodnoty: nahoru FAH FEH F6H doleva FBH FFH F7H doprava F9H FDH F5H dolů Při stisknuté klávese pro střelbu: nahoru EAH EEH E6H doleva EBH EFH E7H doprava E9H EDH E5H dolů Do akumulátoru se naklíčuje bitový vzorec,který zjišťuje, zda je joystick obsluhován nebo ne: bit 0: Obsahuje 0,jestliže joystick směřuje nahoru bit 1: obsahuje 0, jestliže joystick směruje dolů bit 2 obsahuje 0, jestliže joystick je směrován doleva bit 3 obsahuje 0, jestliže joystick směřuje doprava bit 4 obsahuje 0,jestliže je stlačena klávesa bit 5-7 obsahují vždy 1. Jestliže je tedy stisknuta klávesa a joystick směřuje doleva, pak bity 2 a 4 obsahují 0 a ostatní 1. Dostaneme tedy vzorec 111101011 = EB hexadecimálně viz tabulka. Nyní napíšeme program, který analyzuje joystick zBASICu. Vyvolává se pomocí USR($5700). Následující adresy obsahují hodnoty kláves joysticku: 5800H: Hodnota joystick nahoru 1=nahoru,0 není obloužen 5801H: Hodnota joystick dolů 1=dolů,0 není obsloužen 5802H: Hodnota joystick doleva 1=doleva, 0 není obsloužen 5803H: Hodnota joystick doprava 1=doprava, 0 není obsloužen 5804H: Hodnota pro klávesu 1 stlačena, 0 není obsloužena Nyní tedy příslušný program, který musí být vyvolán jako strojová subrutina: 5700 DB F0 IN A,(F0H) Hodnota pro joystick 1 5702 2F CPL komplementace hodnoty 5703 21 FF 57 LD HL,57FFH 5706 06 05 LD B,06 smyčka pro 5 hodnot 5708 23 INC HL 5709 F5 PUSH AF 570A E6 01 AND 01 ulož akumulátor 570C 77 LD (HL),A 570D F1 POP AF 570E 0F RRCA rotace akumulátoru 570F 10 F7 DJNZ 5708 5711 C9 RET Přirozeně mohou být obsluhovány 2 joysticky. Princip pro obsluhu druhého joysticku je analogický jako obsluha prvního joysticku, ovšem namísto PORT F0H je nutno použít F1H. RAMDISK MZ-1R18 --------------- Ramdisk je hardwarový doplněk, který připojuje desku o 64 kB. Není dosažitelná přímo, je nutné ji adresovat přes porty. Procesor Z-80 tedy nemůže tuto oblast adresovat. Je k tomupotřeba napsat podprogramy,které na určitou adresou RAM disku uloží hodnotu popřípadě hodnotu přečtou. Adresa musí být uložena v HL registru, příslušnáhodnota musí být uložena v akumulátoru. Malý příklad: 1200 F6 PUSH AF 1201 C5 PUSH BC 1202 6F LD A,L 1203 44 LD B,H 1204 0E EB LD C,EBH 1206 ED 79 OUT (C),A 1208 C1 POP BC 1209 F1 POP AF 120A D3 EA OUT (D3H),A 120B RET A nyní program ke čtení z RAM disku 1210 F5 PUSH AF 1211 C5 PUSH BC 1212 6F LD A,L 1213 44 LD B,H 1214 0E EB LD C,(EBH) 1216 ED 79 OUT (C),A 1218 C1 POP BC 1219 F1 POP AF 121A DB EA IN A,(EAH) 1219 C9 RET Významný je program, který určitou oblast paměti přesouvá do libovolné oblasti RAM disku K tomu je potřeba tří hodnot a)Počáteční adresa bloku v paměti ( v HL registru) b)Počáteční adresa bloku na RAM disku ( v DE registru) c)Délka bloku Použijeme již uvedené rutiny, který zapisuje jeden byte na určitou adresu na RAM disku. Chceme například zapsat oblast 2000H-3000H na RAM disk od adresy 0000H K tomu slouží tento program: 2000 21 00 20 LD HL,2000H Počátešní adresa v paměti 2003 11 00 00 LD DE,0000H Počáteční adresa na RAM disku 2006 01 00 10 LD BC,1000H Délka bloku 2009 1A LD A,(HL) 200A E5 PUSH HL ulož HL 200B D5 PUSH DE HL=DE 200C E1 POP HL 200D CD 00 12 CALL 1200H zápis obsahu akumulátoru na RAM disk 2010 E1 POP HL 2011 23 INC HL 2012 0B DEC BC 2013 13 INC DE 2014 78 LD A, BC= 0? 2015 B1 OR C 2016 C2 09 2D JP NZ,2009H 2019 C3 AD00 JP 00ADH skok do monitoru Nyní chceme tento blok z RAM disku zase převést do paměti. Potřebujeme nyní tytéž tři parametry. Nyní se ovšem bude transferovat blok na adresou 7000H. Použijeme tentokrát zase subrutinu, která čte z RAM Disku jeden bajt. 2020 11 00 79 LD DE,7000H Počáteční adresa v paměti 2023 21 00 00 LD HL,0000H Počáteční adresa na RAM disku 2026 01 00 10 LD BC,1000H Délka programového bloku 2029 CD 10 12 CALL 1210H Čtení bajtu z RAM disku 202C 12 LD (DE),A 202D 23 INC HL 202E 13 INC DE 202F 0B DEC BC 2030 78 LD A,B BC = 0 ? 2031 B1 OR C 2032 C2 29 20 JP NZ,2029H Jestliže ne, čti dál 2035 C3 AD 00 JP 00ADH Skok do monitoru Tyto rutiny můžete bez dalších úprav začlenit do svého programu. Musíte ovšem v každé rutině upravit výchozí adresy. MAPOVÁNÍ PAMĚTI (MEMORY MAPPING) -------------------------------- MZ-800 má různé paměti, které leží paralelně. Mohou být k pam!ti připojeny nebo odpojeny. Protoře CPU může adresouvat pouze 64 kB, je znalost mapovánívelmi důležitá. Provádí se příkazy IN a OUT. Důležité je, že při mapování nesmí být v oblasti, ve které se mapování provádí uložen program. Důsledkem by bylo jeho vymazání. Nyní ukážeme,jaký mají význam jednotlivé příkazy IN a OUT. a)OUT (CEH),A Je-lipředem do akumulátoruuložena hodnota 8H, pak se MZ-800 přepne do modu MZ-700. Je-li akumulátor naplněn jinou hodnotou ( od 0 do 7), pak se MZ-800 přepíná do specifického grafického modu. K tomu blíže kapitola o grafice. b)OUT (E0H),A Při tomto příkazu je oblast paměti od 0000H do 8000H připojena jako RAM. Zbytek paměti se nemění. c)OUT (E1H),A Zde jsou možné dva mody: 1)MZ 700 modus (přes LD A,08H / OUT (CEH),A Oblast od D000H po FFFFH je připojena jako RAM 2)MZ 800 modus Oblast od E000H po FFFFH je připojena jako RAM d) OUT (E2H),A Oblast od 0000H po 1000H je připojena jako ROM MONITOR. e) OUT (E3H),A 1)MZ-700 modus Oblast od D000H po DFFH je připojena jako VRAM 2)MZ-800 modus Aktivuje se jen horní ROM monitor F) OUT (E4H),A 1) MZ-700 modus Oblast od 0000H po 1000H a E000H po FFFFH jsou připojeny jako ROM Je aktivována video RAM od D000H po DFFFH 2) MZ-800 modus Oblast od 0000H po 1000H a E000H po FFFFH jsou připojeny jako ROM Oblast od 1000H po 1FFFH je aktivována jako CG ROM High Res VRAM od 8000H nahoru ( podle stavby grafické paměti) se aktivuje Zbytek paměti je RAM. g) OUT (E5H),A Jako OUT (E1H), ovšm nyní jsou tytooblasti odpojeny h) OUT (E6H),A Jako OUT (E5H), ovšem návrat ke stavu před tímto příkazem i) IN (E0H),A Aktivuje v OUT (E4H) modus grafiky j) IN (E1H),A Vypíná v OUT (E4H) modus grafiky Nyní uvedeme příklad. ROM monitor MZ-800 má být uložen z ROM do paralelní RAM> Získáme tak softwarový monitor,který pak podle libosti můžeme obměňovat. Nejprve program: 1200 21 00 00 LD HL, 0000H Počáteční adresa ROM monitoru 1203 11 00 20 LD DE, 2000H volná oblast paměti 1206 01 00 10 LD BC, 1000H Délka ROM monitoru 1209 E5 PUSH HL ulož HL 120A C5 PUSH BC ulož BC 120B D5 PUSH DE ulož DE 120C ED B0 LDIR transfer do volné paměti 120E E1 POP HL HL =2000H 120F C1 POP BC BC =1000H 1210 D1 POP DE DE =0000H 1211 D3 E0 OUT (E0H),A Přepojení 000H-1000H jako RAM 1213 ED B0 LDIR Transfer do RAM monitoru 1215 C3 AD 00 JP 00ADH teplý start RAM monitoru K vysvětlení: Nejprve transferujeme ROM monitor, který leží v oblasti od 000H po 1000H do volné oblasti RAM od adresy 2000H. Potom přepneme oblast od 0000H po 1000H jako RAM a transferujeme sem program ROM monitoru a startujeme jej. Obtíž vzniká, jtestliže chceme z oblasti od 0000H po 1000H a od E000H po FFFH volat rutinu monitoru 0015, jestliže je oblast přepojena na RAM,tato rutina totiž vyžaduje obslužný systém MZ-80 K. Je možno ji buď připojit k softwarovému monitoru nebo vytvořit speciální subrutinu. Jestliže nyní chceme manipulovat s RAM monitorem, pak je možno každý řádek v oblasti od 0000H po 1000H měnit příkazem M. HARDWARE -------- Součástí MZ-800 je integrovaný obvod 8255.Je určen k obsluze magnetofonu a klávesnice. Dolní obrázek ukazuje adresování a způsob obsluhy portů obvodu. ---- ---------- C5EO -----| |-----\ PA | |-----/ 0...7 A0 -----| | | | A1 -----| | | |/----- PB | |\----- 0...7 | 8255 | | | | |-----\ PC D ----\| |-----/ 0...3 0...7 ----/| | ---- | | MW -----| |/----- PC ---- | |\----- 4...7 EMR -----| | | | ---------- Způsob použití v MZ-800 ukazujeobrázek 1. Port A slouží pro výstup, port B pro vstup, u portu C jsou čtyři nižší pro výstup a čtyři vyšší pro vstup. Provádí se to pomocí řídícího slova 8AH. Tímto řídícím slovem musí být modus ( zplsob obsluhy)nastaven dříve, než je práse s 8255 zahájena. V monitoru ROM se toho dosáhne za pomoci rutiny 073EH. Úplnou představu o možnýchzpůsobech použití najdete v následující tabulce: Tabulka 1 - řídící slova pro 8255 v modu 0 (adresa E003H) O výstup, I vstup ------------------------------------------------------------ |HEX|7 6 5 4 3 2 1 0 |port A |port B |port C |port C | +---+------------------+--------+--------+--------+--------+ | | | 0-7 | 0-7 | 4-7 | 0-3 | +---+------------------+--------+--------+--------+--------+ |80 |1 0 0 0 0 0 0 0 | O | O | O | O | +---+------------------+--------+--------+--------+--------+ |81 |1 0 0 0 0 0 0 1 | O | O | O | I | +---+------------------+--------+--------+--------+--------+ |82 |1 0 0 0 0 0 1 0 | O | I | O | O | +---+------------------+--------+--------+--------+--------+ |83 |1 0 0 0 0 0 1 1 | O | I | O | I | +---+------------------+--------+--------+--------+--------+ |88 |1 0 0 0 1 0 0 0 | O | O | I | O | +---+------------------+--------+--------+--------+--------+ |89 |1 0 0 0 1 0 0 1 | O | O | I | I | +---+------------------+--------+--------+--------+--------+ |8A |1 0 0 0 1 0 1 0 | O | I | I | O | +---+------------------+--------+--------+--------+--------+ |8B |1 0 0 0 1 0 1 1 | O | I | I | I | +---+------------------+--------+--------+--------+--------+ |90 |1 0 0 1 0 0 0 0 | I | O | O | O | +---+------------------+--------+--------+--------+--------+ |91 |1 0 0 1 0 0 0 1 | I | O | O | I | +---+------------------+--------+--------+--------+--------+ |92 |1 0 0 1 0 0 1 0 | I | I | O | O | +---+------------------+--------+--------+--------+--------+ |93 |1 0 0 1 0 0 1 1 | I | I | O | I | +---+------------------+--------+--------+--------+--------+ |98 |1 0 0 1 1 0 0 0 | I | O | I | O | +---+------------------+--------+--------+--------+--------+ |99 |1 0 0 1 1 0 0 1 | I | O | I | I | +---+------------------+--------+--------+--------+--------+ |9A |1 0 0 1 1 0 1 0 | I | I | I | O | +---+------------------+--------+--------+--------+--------+ |9B |1 0 0 1 1 0 1 1 | I | I | I | I | ------------------------------------------------------------ Nyní musíme naše řídící slovo zadat obvodu 8255. K tomu si musíme blíže všimnout adres tohoto integrovaného obvodu. Adresuje se pomocí CSEO,A0 a A1.Tomu odpovídají adresy E000H až E003H. Každá z těchto adres má určitý význam (CS = CHIP SELECT) E000H Adresa pro port A E001H Adresa pro port B E002H Adresa pro port C E003H Adresa pro řídící slovo Tyto adresy pracují současně se WM pro zápis a EMR pro čtení. Zápis znamená výstup, čtení znamená vstup. OBSLUHA KLÁVESNICE ------------------ Porty A a B slouží k obsluze klávesnice. Přitom pro výstup na portu A je určeno potenciálem L na sloupci 1-10 klávesnicové matrice a na řádcích 11-18 rovněž potenciálem L, která klávesa byla stisknuta ( viz obrázek rozložení kláves v dodatku). Klávesa je určena zkříženímsloupce a řádku. Tento způsob obsluhy klávesnice se označuje také SCANNEN. Není přitom přirozeně nutné prohledávat celou klávesnici ale je možné zjistit, zda určitá klávesa je nebo není stisknuta, jako například v monitoru programová rutina 001EH . Na krátkém programu ukážeme součinnost hard a software. Je ovšem třeba uvažovat, že zde uváděné možnosti obsluhy klávesnice jsou realizovatelné jen tehdy,jestliže E oblast není připojena jako RAM ale jako KEY TIMER v oblasti E000H až E070H (modus MZ-80 K) Nejprve na portu A nastavíme číslo dotazovaného sloupce (=8) LD A,F8H 3E F8 LD (KEYPA),A 32 01 E0 Ke stabilizaci se přidává NOP. Potom se přes port B zavede informace o řádku (11-18) sloupce 8 NOP 00 LD A,(KEYPB) 3A 01 E0 Nastavení bitu CARRY a dotazna bit 0 (SHIFT) OR A B7 RRA IF JP C,?BRK2 DA 80 09 Jestliže je stlačena klávesa SHIFT, pak se příznak CARRY nastaví na 0 a dvojitým posunem doleva se bit BREAK transportuje do příznaku CARRY a nastaví se BREAK. RLA 17 RLA 17 JR NC,?BRK1 30 04 SHIFT&BREAK dává CZ = 0 Jestliže není BREAK stisknuto, pak se doakumulátoru nastaví SHIFT (bit 6= 1), nastaví se příznak CARRY a provede se návrat. LD A,40H 3E 40 SCF 37 RET C9 Jestliže je BREAK stisknut, pak se CARRY vymaže, nastaví se příznak Z a provede se návrat. XOR A AF RET C9 Tento program tedy poskytne jako výsledek prohledávání stav příznaků a bity 4-6 v akumulátoru. a)Z=1 Je stisknuto SHIFT a BREAK b)D6=1 CY=1 Je stisknuto SHIFT c)D5=1 CY=1 Je stisknuto CTRL (CONTROL) d)D4=1 CY=1 Je stisknuto SHIFT a CONTROl V předcházející části se jednalo o dotaz na speciální klávesy, napřklad SHIFT a BREAk za pomocí speciálnírutiny. Výsledek prohledávání se zobrazí pomocí příznaků. Ve většině případů se ale prohledává celá klávesnice a výsledek prohledávání se ukládá do registru. Zde používá SHARP speciálního kódu klávesnice, display kódu. Tabulka tohoto kódu však v obsluženém manuálu není uvedena. V doplňku této knihy najdete tabulku display kódu. Vlastní prohledávání klávesnice se provádí pomocí monitorové rutiny 0A50H. Výsledek prohledávání je uložen do registru BC. Přitom registr B obsahuje stav speciálníchkláves, tedy určuje, zda byly použity klávesy SHIFT, BREAK, CTRL atd. Toto představuje předchozí program, tedy jestliže Z=1, pak byla stisknuta klávesa SHIFT a BREAK atd. Registr C odpovídá bodu křížení,tedy řádku a sloupce, na kterém se nachází stisknutá klávesa. Obsah C odpovídá interpretaci dále uvedené. X X S S S Z Z Z X - není použito SSS - číslo sloupce ZZZ - číslo řádku Například při stisku klávesy A dostaneme v registru C hodnotu 20H nebo při stiskuklávesy B hodnotu 21H. Program obsluhy klávesnice v monitoru nebere zřetel na skoupec 10 = F9H. Proto nemohou být funkční klávesy obsluhovány z monitoru. Následující strojový program zjišťuje stav funkčních kláves F1 - F5 a provádí pak skok na před programovanou adresu. FTASTE LD A,F9H LD (KEYPA),A NOP LD A,(KEYPB) CPL OR A RET Z EXX LD D,00H LD B,00H FT1 INC B RLCA JR NC,FT1 LD A,B RLCA LD E,A LD HL,FLEI-2 Od adresy FLEI leží škála skoků pro F1 až F5. ? Tuto adresu a další údaje skoku si můžete zvolit sami ADD HL,DE LD C,(HL) INC HL LD B,(HL) POP AF PUSH BC EXX RET Uvažte jen prosím, že tento program má při dotazu klávesnice funkci GET, probíhátedy pouze jednou, to znamená, že na stlačení klávesy nečeká. Jestliže není zmáčknuta žádná F-klávesa,pak se vrací do hlavního programu s příznakem Z = 0. ŘÍZENÍ MAGNETOFONU ------------------ Kazetovýmagnetofon je řízen přes C port obvodu 8255, má tedy adresu E002H. Port C je vybírán řídícím slovem 8AH. pro 8255. Bity 0 až 3 pracují jako výstupní, bity 4-7 jako vstupní. Před výstupem dat na magnetofon popřípadě před čtením musí být v chodu motor. To je možné provést pouze stlačením klávesy PLAY nebo RECORD-PLAY.Procesor provádí v monitorovém programu MOTOR dotaz, zda motor běží. Tento monitorový program pak zkouší vyslat spouštěcí impuls na bit 3 portu C ke startu motoru. Tento pokus je ovšem úspěšný jen tehdy, jestliže PLAY neboRECORD PLAY je ještě stisknuto a motor byl zastaven podprogrameme MSTOP z 0700H. Motor je proto možno startovat a zastavovat softwarově. Má to význam zejména tehdy, jestliže části programu popřípadě bloky dat musejí být před čtením dalších dat nejprve zpracovány. Vlastní obsah bitů se pak provádí vždy přes bi1 1 portu C na magnetofon. Záznam programu se pak člení na dvě části, informace a data. Data jsou vlastním obsahem programu, informace (označovaná též jako HEAD čili hlavička) sestává z: 1.Kód souboru l bajt pro označení typu programu 2.Název programu 16 bajtů +1 bajt koncový 3.Délka dat 2 bajty 4.Počáteční adresa dat 2 bajty 5.Startovací adresa 2 bajty 6.Komentář 104 bajty (bez praktického významu) Program pro zápis z pracovní oblasti sestává proto vždy ze dvoučástí. 1. Zápis informace (hlavičky). Tento příkaz se vykonává monitorovým programem WRI z adresy 0021H. 2. Zápis dat. Tento úkon se provede z monitorového programu WRD z adresy 0024H Před odstartováním programu pro zápis tedy musejí být v paměti od 10F0H po 116FH uloženy všechny nutné informacepro hlavišku. Tato data se pak zapíšou programem WRI jako hlavička na pásku. Při čtení z kazety přes bit 5 portu C se nejprve informace ( hlavička) uloží do paměti zpět a tím se určí řídící data pro čtení dat. 1 2 3 4 5 6 7 8 9 10 F0 F1 F2 F3 F4 F5 F6 F7 F8 +-----+ +-+ +-+ +-+ +-+ +-+ +-+ +----+ +-----+ +--+ D7 11| | |Y| |Q| |I| |A| |1| |\| |INST| |BREAK| |F1| +-----+ +-+ +-+ +-+ +-+ +-+ +-+ +----+ +-----+ +--+ +-----+ +-+ +-+ +-+ +-+ +-+ +-+ +----+ +-----+ +--+ D6 12|GRAPH| |Z| |R| |J| |B| |2| |~| |DEL | |CTRL | |F2| +-----+ +-+ +-+ +-+ +-+ +-+ +-+ +----+ +-----+ +--+ +-----+ +-+ +-+ +-+ +-+ +-+ +-+ +----+ +--+ D5 13| | |@| |S| |K| |C| |3| |-| | | |F3| +-----+ +-+ +-+ +-+ +-+ +-+ +-+ +----+ +--+ +-----+ +-+ +-+ +-+ +-+ +-+ +-+ +----+ +--+ D4 14|ALPHA| |[| |T| |L| |D| |4| |SP| | | |F4| +-----+ +-+ +-+ +-+ +-+ +-+ +-+ +----+ +--+ +-----+ +-+ +-+ +-+ +-+ +-+ +-+ +----+ +--+ D3 15| | |[| |U| |M| |E| |5| |0| | | |F5| +-----+ +-+ +-+ +-+ +-+ +-+ +-+ +----+ +--+ +-----+ +-+ +-+ +-+ +-+ +-+ +----+ D2 16| : | |V| |N| |F| |6| |9| | | +-----+ +-+ +-+ +-+ +-+ +-+ +----+ +-----+ +-+ +-+ +-+ +-+ +-+ +----+ D1 17| ; | |W| |O| |G| |7| |.| | ? | +-----+ +-+ +-+ +-+ +-+ +-+ +----+ +-----+ +-+ +-+ +-+ +-+ +-+ +----+ +------+ D0 18| CR | |X| |P| |H| |8| |.| | / | |SHIFT | +-----+ +-+ +-+ +-+ +-+ +-+ +----+ +------+