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