Vše o MZ-800 - Grafika

 

Zpět Nahoru Další

 

 

        Obsah této stránky:

bullet

Grafika s vysokou rozlišitelností

bullet

PCG  grafika.

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í.

 

Úvod | Sharp MZ-800 | 8 bit klub Brno | Download | Kniha návštěv | Vyhledání na těchto stránkách | Mapa stránek

 

Tyto stránky byly naposledy aktualizovány dne 08. 02. 2014      Copyright © 05/2006 - SCAV - Pavel Brázda webmaster(c)scav.cz

 

 

Google