Obsah této stránky: |
GRAFIKA S VYSOKOU ROZLIŠITELNOSTÍ
U MZ-800 jsou dvě rozlišitelnosti obrazovky.
a)
320 x 200 bodů = 64000 bodů/bitů = 8 kBytů
b) 640 x 200 bodů = 128000 bodů/bitů = 16 kBytů
Již v základním modulu je možné použít obě rozlišitelnosti, ale opravdu
efektivní je teprve přídavná grafická paměť, která umožňuje určení 128000 bodů
ve 4 ze 16-ti barev. Ale již se základní verzí MZ-800 máte možnost si vyzkoušet
práci s barvami. Máte následující možnosti:
a) Základní verze MZ-800
V-RAM velikost barev rozlišitelnost část DMD
----------------------------------------------------------------
2x8 kByte 4 320 x 200 00H
16 kByte 2 640 x 200 04H
b) MZ-800 s grafickým rozšířením (+16 kByte)
2x8 kByte 4 320 x 200 00H
použita stará V-RAM (Frame A)
2x8 kByte 4 320 x 200 01H
použita přídavná V-RAM (Frame B)
4x8 kByte 16 320 x 200 02H
obě V-RAM
1x16 kByte 2 640 x 200 04H
použita stará V-RAM (Frame A)
1x16 kByte 2 640 x 200 05H
použita přídavná V-RAM (Frame B)
2x16 kByte 4 640 x 200 06H
obě V-RAM
MZ-700 systém 8 40 x 25 08H
1/2 staré V-RAM
Jistě jste se již zajímali o to, co znamená DMD. DMD znamená Display mode
registr a slouží pro výběr druhu grafického zobrazení. Přes port CEH se vydává
odpovídající hodnota v akumulátoru.
Příklad:
6000 3E 00 LD A,00H
6002 D3 CE OUT (CEH),A
Příslušná grafická paměť leží od adresy 8000H až po maximálně BFFFH, když je
grafická paměť plně otevřena. Při tom leží všechny paměti paralelně s výjimkou
módu 640 x 200 ve 2 barvách. To znamená, že při způsobu zobrazení DMD 00H leží 2
paměti paralelně u sebe od adresy 8000H po 9FFFH. Vždy jsou 2 barvy paměti.
Jestliže tedy leží paralelně 4 paměti, můžeme použít současně 2^4 => 16 barev.
Proč současně? Nyní přecházíme ke zvláštnosti v druhu a způsobu, jakým musí být
barvy použity. Barvy musí být kódovány přes palety. Zásadně se každé paletě
přiřadí jedna ze 16-ti barev. Zde bychom se chtěli zabývat možnostmi, které
poskytuje základní verze MZ-800. Jak již bylo jasné z předcházejícího přehledu,
mohou se použít 4 barvy. Nyní tedy nejprve přiřadíme každé paletě jednu barvu. K
dispozici jsou následující barvy:
0H ... černá
1H ... modrá
2H ... červená
3H ... fialová
4H ... zelená
5H ... zelenomodrá
6H ... žlutá
7H ... bílá
8H ... šedá
9H ... světle modrá
AH ... sv. červená
BH ... sv. fialová
CH ... sv. zelená
DH ... sv. zelenomodrá
EH ... sv. žlutá
FH ... sv. bílá
V
základním vybavení máme nyní k dispozici 4 barevné palety. Můžeme tedy říci:
paleta 0 = sv. červená, paleta 1 = zelená atd. Toto přiřazení se provádí pomocí
povelu OUT. Hodnota, která se bude přes port F0H vydávat, se rozdělí na nižší a
vyšší 4 bitové slovo. Do vyššího 4 bitového slova se potom napíše číslo palety,
do nižšího slova barva. Například chceme paletě 2 přiřadit šedou barvu (šedá =
08H). Na to musí být napsán následující program:
1200 3E 28 LD A,28H 2=paleta;8=barva
1202 D3 F0 OUT (F0H),A inicializace palety 2 šedou barvou
Pozn.: Platí pouze pro 2 a 4 barevný režim (ne pro 16 bar. režim)
Velice důležité je ještě aktivování grafiky všeobecně. To se provádí povelem IN
A,(E0H). Grafika se znovu deaktivuje povelem IN A,(E1H). Tento způsob zakódování
palet má výhody, ale i nevýhody. Nevýhoda je zakódování jako takové; nejdříve se
musí inicializovat, což může stát nervy. Naproti tomu se ale musí říci, že se
pomocí nového přiřazení dají okamžitě změnit např. všechny zelené body na
červené. Důležité je ještě, že při použití grafického rozšíření máte možnost
kreslit dva obrazy přes sebe a tím míchat barevné tóny. Pomocí části DMD se
potom může vybrat, který obraz má být zobrazen. Nyní se dostáváme k další
kapitole, čtení dat. To se provádí s pomocí RF(READ - format register). Nižší
čtyřbitové slovo obsahuje specifikaci detekovaného grafického plann a nebo
definici kódu palety, který je potřebný pro READ (čtecí) 0perace.¨Existují dva
způsoby čtení:
1. Single
RF=|0|x|x|1/0|1/0|1/0|1/0|
{ p l a n y }
Čte z planů specifikovaných jako 1. Je-li nalezeno více planů provádí operaci
AND. Není-li specifikován žadný plan vrací hodnotu FFH.(Při čtení z VRAM).
2. Search
RF=|1|x|x|A/B|1/0|1/0|1/0|1/0|
| {číslo palety}
|
|
FRAME A=0;B=1
Vrací bit 1 tam, kde se vyskytuje specifikovaná paleta. (Jinak 0).
Výsledná kontrola pro RF registr se vydává přes port CDH. Podobně jako pro čtení
platí též pro psaní. Zde se používá tomu odpovídající Writhe Format Register.
Jako u RF registru odpovídají nižší čtyři bity paletě,kterou se má psát. Bit 4
se používá opět jen tehdy, když chceme současně zpracovávat dva obrazy. (Má vliv
pouze na REPLACE a PSET). Bit 5-7 ale představují něco jako mód způsobu provozu.
Je 6 způsobů, jak se dá použít.
a) Single Write (0H)
Při tomto způsobu se zeptá na specifikované plany; jiné plany se nemění.
b)
Exor (1H)
Zde se programem ukládaná data spojují pomocí logické operace exklusivní nebo
(XOR), a to v nižším 4 bitovém slově stojící hodnoty; ostatní se nemění.
c) Or (2H)
Funguje jako EXOR, ale s logickou operací nebo.
d) Reset (3H)
Ve specifikovaných grafických planech se obnoví počáteční stav těch bodů,
které byly nastaveny daty.
e) Replace (4H)
Ukládá data do specifikovaných grafických planů(desek); ostatní grafické
plany obdrží hodnotu 0. REPLACE umožňuje psaní v jedné určené barvě palety.
f) Pset (6H)
PSET je pro nás nejzajímavější povel, protože se s ním mohou barevně nastavit
jednotlivé body. Mód palety daný nižším čtyřbitovým slovem se dosadí na
definovanou adresu v grafické paměti.
Je vidět, že není jednoduché se s grafikou s velkou rozlišitelností spřátelit, a
proto napíšeme krátký příklad, který nastaví bod na obrazovce na libovolnou
barvu. Ještě se musí dát pozor na to, že programy pro grafiku s vysokou
rozlišitelností se nikdy nesmí psát od oblasti paměti 8000H a výše, protože při
stránkování paměti by se program zhroutil, neboť by najednou pracoval ve špatné
paměti. Jako příklad chceme nastavit bod ve středu obrazovky-červený. Přitom
pozadí má být černé.
6000 DB E0 IN A,(E0H) aktivace grafiky
6002 3E 00 LD A,00H aktivace graf. provozu 320x200 pixel
6004 D3 CE OUT (CEH),A aktivace
6006 3E 00 LD A,00H paleta 0=černá
6008 D3 F0 OUT (F0H),A
600A 3E 00 LD A,00H mód single write s paletou 0
600C D3 CC OUT (CCH),A paleta 0
600E 21 00 80 LD HL,8000H zač. RAM s vys. rozlišitelností
6011 01 00 20 LD BC,2000H délka RAM ----------"----------
6014 AF XOR A akumulátor=0
6015 77 LD (HL),A vymaž paměť pro grafiku s vysokou rozlišitelností
6016 23 INC HL
6017 0B DEC BC
6018 78 LD A,B
6019 B1 OR C
601A C2 14 60 JP NZ,6014H maž dál, když BC není 0
601D 3E 32 LD A,32H přiřazuje paletě 3 červenou
601F D3 F0 OUT (F0H),A
6021 3E C3 LD A,C3H zpracovávat módem PSET s pale-
6023 D3 F0 OUT (F0H),A tou 3
6025 3E 01 LD A,01H 1 pixel přidat do středu
6027 32 00 90 LD (9000H),A obrazovky
6029 DB E1 IN A,(E1H) obnovení počátečního stavu obrazovky
602B 76 HALT
Tento program se může odstartovat z monitoru pomocí J 6000, ale potom se musí
udělat RESET, protože byl použit povel HALT (STOP). V tomto módu není možné
používat jednoduše písmo i grafiku. Na to se musí vytvořit balík podprogramů.
Definice módu WRITE se provádí pomocí vyššího čtyřbitového slova hodnoty, která
se vydává přes port CCH.
PCG
grafika.
V této kapitole se budeme zabývat PCG grafikou. PCG znamená Programmable
Charackter Generator (programovatelný generátor znaků). Je schopen sám si
naprogramovat každý znak sady znaků a tím vytvářet například sadu ozdobných
písmen pro psaní a mnohem více jiných věcí. PCG nedělá v principu nic jiného,
než povel Basicu PATTERN, ale PCG může být mnohem účiněji, protože znaky mohou
být uloženy do paměti a používány místo původních znaků.
Abychom toho dosáhli, nejprve si vysvětlíme hardwarovou funkci PCG. MZ-800 má
vnitřní paměť, která leží u 1000H paralelně k hlavní paměti. V této leží sada
znaků (tedy 512 znaků), která je uložena v 8 bytovém řádu. MZ-800 má, jak jsme
se již zmínili v kapitole MZ-700 Basic, 2 sady po 256 znacích. Tyto znaky
tabulky zobrazovacích kódů jsou také všechny ještě jednou vytištěny v dodatku
této knihy. Pro PCG grafiku je rozhodující tabulka zobrazovacích kódů, ne ASCII
tabulka, která je i v SHARP příručce. Každý znak potřebuje tedy 8 bytů, protože
se skládá z 8x8 jednotlivých bodů, takže z 64 jednotlivých bodů. S 8 byty máte k
dispozici přesně 64 bitů, takže každý ze 64 bitů odpovídá jednomu bodu.
Písmeno "A" se podle toho skládá z následujících bitů, které přímo vyplývají z
nastavených:
Hexadecimální Dvojkový kód zobrazení znaku
18 00011000 11
24 00100100 1 1
42 01000010 1 1
7E 01111110 111111
42 01000010 1 1
42 01000010 1 1
42 01000010 1 1
00 00000000 1 1
1 znamená, že příslušný světelný bod je nastaven
0 znamená, že příslušný světelný bod není nastaven
Uložení v paměti je tedy takové, že každý znak obsazuje v PCG paměti 8 bytů. Pro
celou sadu znaků je tedy třeba 8x512 bytů a přitom se musí rozlišovat mezi
pevnou a dynamickou PCG pamětí. Při inicializaci se sada znaků přenese z pevné
(ROM) PCG paměti do dynamické (RAM) pomocí blokového přenosu. Tento postup je
bezpodmínečně nutný, protože základní znaky někde definovány být musí, aby
počítač po zapnutí vůbec mohl zobrazit písmena a znaky.
Dynamická PCG paměť leží u C000H. Tato skutečnost vás ale vůbec nemusí
znepokojovat, protože PCG paměť neovlivňuje celkové rozdělení paměti MZ-800 a vy
jako uživatel si toho vůbec nevšimnete. Tohoto bychom chtěli využít a vytvořit
program, kterým můžeme sadu sadu znaků měnit. Přitom si musíme být vědomi,ze
přímo nemůžeme psát do pevné, ani do dynamické PCG paměti, ale jen do naší
normální paměti. Do ostatních oblastí se musíme dostávat pomocí
IN(přepínat).Takže tedy program.
Program pro nahrání sady znaků na adresu A800H.
Adresa Opkód Mnemon. kód Poznámka
A000 D3 E4 OUT (E4H),A
A002 DB E0 IN A,(E0H) ;zapnutí PCG módu
A004 21 00 C0 LD HL,C000H ;adresa PCG dynamické paměti
A007 01 00 10 LD BC,1000h ;délka dat
A00A 11 00 A8 LD DE,A800H ;adresa naší paměti
A00D ED B0 LDIR ;přenos dat
A00F DB E1 IN A,(E1H) ;obnovení počátečního stavu PCG módu
A011 C3 AD 00 JP 00ADH ;skok do monitoru
Program pro inicializaci PCG sady znaků do dynamické PCG paměti.
A014 D3 E4 OUT (E4H),A ;
A016 DB E0 IN A,(E0H) ;zapnutí PCG módu
A018 21 00 A8 LD HL,A800H ;adresa naší paměti
A01B 01 00 10 LD BC,1000H ;délka dat(4096 bytů)
A01E 11 00 C0 LD DE,C000H ;adresa PCG paměti
A021 ED B0 LDIR ;přenos dat
A023 DB E1 IN A,(E1H) ;obnovení počáteční stavu PCG mód
A025 C3 AD 00 JP 00ADH ;skok do monitoru
Oba tyto programy můžete vložit z monitoru (jednoduše - opcode s pomocí povelu
M, a s JA000 resp. JA014 odstartovat). Od adresy A800H leží tedy data sady znaků
v hexadecimálním formátu. Když vložíme J A014, přeneseme data na A800H. Nyní
můžeme sadu znaků měnit.
Příklad pro změnu znaku SPACE:
Protože každý znak zabírá 8 bytů, je znak 0 (SPACE) nyní uložen v paměti od
A800H do A807H. Znak 1 (A) je uložen v paměťových buňkách A808H až A80FH.
a) JA000
b) MA800 00 FF (CR)
c) JA014
Ihned po vložení se změní vzhled obrazovky. Objeví se černé pruhy, které téměř
představují FFH. Chtěli bychom ještě provést takovou změnu pro každý znak.
Následující vzorec výpočet adresy v paměti, na které je libovolný znak,
respektive kde jsou uloženy jeho hodnoty.
Adresa=A800H + 8 x číslo měněného znaku
Pro znak DFH (223 decimálně) tedy platí
Adresa=A800H + 8 x DFH = AEF8H
Nyní se dostáváme ke zvláštnosti v uložení PCG hodnot. Tyto jsou totiž v paměti
napsány zrcadlově obráceně. Hned to prakticky vyzkoušíme tím,že znak DFH což
původně byla zmije, nyní změníme na třešni. Musíme tedy nejdříve definovat
třešni.
12345678 bitový vzor(zrcadlově obráceně) hexadecimálně
*** 1 00000111 07 H
**** 2 00001111 0F H
* * 3 00010010 12 H
* * 4 00100010 22 H
* * ** 5 11010010 D2 H
** **** 6 11110110 F6 H
* ** ** 7 01101101 6D H
** 8 00000110 06 H
Nyní vložíme z monitoru:
MAEF8
AEF8 00 07 (CR)
AEF9 03 0F (CR)
AEFA 13 12 (CR)
AEFB 2A 22 (CR)
AEFC 2A D2 (CR)
AEFD AA F6 (CR)
AEFE 44 6D (CR)
AEFF 00 06 (CR)
SHIFT&BREAK
JA014
Když necháme znak DF objevit na obrazovce vidíme naši třešni.
MD000
D000 00 DF (CR) (Objevení se třešně na obrazovce)
SHIFT & BREAK
Vypočítat, kde se od A800H nachází správná adresa, je ale relativně těžké.
Nechme to proto prostě dělat počítat. Napíšeme program, který nahrazuje naši
rovnici. Adresa = A800H+znak*8.
A100 3E xx LD A,xx ;xx=hodnota znaku
A102 6F LD L,A ;uloží se do HL
A103 26 00 LD H,00 ;
A114 29 ADD HL,HL ;
A115 29 ADD HL,HL ;x8
A116 29 ADD HL,HL ;
A117 01 00 A8 LD BC,A800H ;naše PCG paměť
A11A 09 ADD HL,BC ;
A11B CD BA 03 CALL 03BAH ;zobrazení adresy
A11E C3 AD 00 JP 00ADH ;skok do monitoru
Napíšeme tedy na adresu A101H náš znak, který chceme změnit a odstartujeme
program pomocí J A100. Potom se na obrazovce objeví adresa, kde je v paměti
uložen znak s číslem xx (v zobrazovacím kódu). Při vložení by se potom objevilo
A800H. Ještě něco všeobecného. PCG znaky nejsou jednotlivě, tedy bod po bodu,
barevně nastavitelné. Je tedy možné nastavit jen barvu a barvu pozadí pro celý
znak. Toho dosáhneme pomocí grafiky s vysokou rozlišitelností. Zde PCG grafika
imponuje svojí rychlostí a relativně jednoduchou použitelností.