10 — MZ-800 grafický video systém

Základní informace

Tento dokument popisuje kompletní mechanismus generování obrazu v MZ-800 grafických režimech (DMD bit 3 = 0). Vysvětluje, jak GDG z obsahu VRAM (bitmapove roviny I-IV) přes paletový obvod produkuje barevný video výstup.

Pro MZ-700 textový režim (DMD bit 3 = 1) viz 08-mz700-video-systém.md.

Prehled grafických režimu

Display Mode Register (DMD, port CEH — zápis)

Bit:  7    6    5    4    3      2      1      0
      X    X    X    X    DMD3   DMD2   DMD1   DMD0

DMD3 a DMD2 určují zobrazovaci metodu (rozlišení):

DMD3 DMD2 Režim
0 0 320x200 bitmapa
0 1 640x200 bitmapa
1 X MZ-700 znakový režim (viz doc 08)

DMD1 a DMD0 určují použité roviny a framy:

DMD1 DMD0 320x200 640x200
0 0 4 barvy, Frame A (I+II) 2 barvy, Frame A (I)
0 1 4 barvy, Frame B (III+IV) 2 barvy, Frame B (III)
1 0 16 barev (I+II+III+IV) 4 barvy (I+III)
1 1 nedokumentovaný nedokumentovaný

Kompletní tabulka

DMD Režim Barvy Roviny Pixel CLK Frame ExVRAM
00H 320x200 4 I, II CLK0/2 A Ne
01H 320x200 4 III, IV CLK0/2 B Ano
02H 320x200 16 I-IV CLK0/2 A+B Ano
04H 640x200 2 I CLK0 A Ne
05H 640x200 2 III CLK0 B Ano
06H 640x200 4 I, III CLK0 A+B Ano

Fyzická organizace VRAM

Dva DRAM busy

MZ-800 používá dva 8-bitové datove busy pro VRAM, každý obsluhovany 8 čipy 4164C-3 (64Kx1 bit):

VA bus (piny 55-62): Zakladni VRAM — vzdy pritomna
  Rovina I:   8 KB (8000H-9FFFH z pohledu CPU)
  Rovina II:  8 KB (A000H-BFFFH z pohledu CPU)

VC bus (piny 63-70): Rozsirena VRAM — volitelna (prazdne sockety)
  Rovina III: 8 KB (pristup pres WF/RF registr, B/A bit)
  Rovina IV:  8 KB (pristup pres WF/RF registr, B/A bit)

Oba busy sdili adresovou sbernici VAD[7:0] a řídící signály (/VRAS, /VCAS, /VRWR, /VOE). Při každém DRAM cyklů jsou ctena data z obou busu současně.

Interní DRAM adresy

DRAM adresy (RAS/ČAS) pro video fetch se liší podle režimu (Service Manual strany 18-19):

320x200 (VA bus):

$0000 +-------------+
      | Rovina I    |  8000 bajtu (0-7999)
      | (0-39 na    |
      |  radek)     |
$1F3F +-------------+
      | Nepouzito   |
$2000 +-------------+
      | Rovina II   |  8000 bajtu (0-7999)
      |             |
$3F3F +-------------+
      | Nepouzito   |
$3FFF +-------------+

640x200 (VA bus):

$0000 +-------------+
      | Rovina I    |
      | (0-79 na    |  Sude bajty
      |  radek)     |
$1F3F +-------------+  15988 bajtu
      | Nepouzito   |
$2000 +-------------+
      | Rovina I    |
      | (pokracovani)|  Liche bajty
$3F3F +-------------+  15999 bajtu
      | Nepouzito   |
$3FFF +-------------+

Rozlozeni pixelů na obrazovce (CRT display position)

320x200 — 40 bajtů na řádek:

        Sloupec
        1    2    3    ...  40
Radek 1:  0    1    2    ...  39
Radek 2: 40   41   42    ...  79
  ...
Radek 200: 7960 7961 7962 ... 7999

Každý bajt = 8 pixelů. Bit 7 = levy pixel, bit 0 = pravy pixel. Adresa pixelů v rovině:

Adresa_v_rovine = Y * 40 + X / 8
CPU_adresa_I    = 8000H + Adresa_v_rovine
CPU_adresa_II   = A000H + Adresa_v_rovine
Bit_v_bajtu     = 7 - (X MOD 8)

640x200 — 80 bajtů na řádek:

        Sloupec
        1    2    3    4    ...  80
Radek 1:  0    1    2    3    ...  79
Radek 2: 80   81   82   83   ... 159
  ...
Radek 200: 15920 ...              15999

Adresa:

Adresa_v_rovine = Y * 80 + X / 8
CPU_adresa_I    = 8000H + Adresa_v_rovine
Bit_v_bajtu     = 7 - (X MOD 8)

Kompozice barvy pixelů

320x200, 4 barvy (DMD=00H, Frame A)

Každý pixel je tvoren 2 bity ze dvou rovin:

Palette index = (bit_rovina_II * 2) + bit_rovina_I
  0 = palette 0 (typicky cerna)
  1 = palette 1
  2 = palette 2
  3 = palette 3 (typicky bila)

Service manual (strana 25) potvrzuje: - Pallet output select A = Plane I data - Pallet output select B = Plane II data

320x200, 4 barvy (DMD=01H, Frame B)

Stejně jako Frame A, ale používá roviny III+IV (VC bus):

Palette index = (bit_rovina_IV * 2) + bit_rovina_III

Vyžaduje rozšiřovací VRAM. Bez ni: VC=0xFF → všechny pixely = palette 3 (viz dokument 20).

640x200, 2 barvy (DMD=04H)

Každý pixel je tvoren 1 bitem z jedne roviny:

Palette index = bit_rovina_I
  0 = palette 0
  1 = palette 1

Pixel clock = CLK0 (17.73 MHz) — dvojnasobny oproti 320x200. Proto je každý bajt VRAM zobrazen jako 8 po sobe jdoucich pixelů při vyšší frekvenci.

640x200, 4 barvy (DMD=06H)

Každý pixel je tvoren 2 bity ze dvou rovin na různých busech:

Palette index = (bit_rovina_III * 2) + bit_rovina_I

Plane I je na VA busu, Plane III na VC busu. Oba se čtou současně při každém DRAM cyklů.

320x200, 16 barev (DMD=02H)

Každý pixel je tvoren 4 bity ze všech čtyř rovin:

4-bit barva = (bit_rovina_IV * 8) + (bit_rovina_III * 4)
            + (bit_rovina_II * 2) + bit_rovina_I
  Rozsah: 0-15

Service manual (strana 25) uvádí přiřazení rovin k barevnym slozkami: Plane I = B (modra), Plane II = R (červená), Plane III = G (zelená), Plane IV = I (intenzita).

Paletový systém

Paletový registr (port F0H — zápis)

Bit:  7    6    5    4    3    2       1       0
      X    S2   S1   S0   Ii   Gi   Ri/SW1  Bi/SW0

Registr ma dva režimy, rozlisene bitem S2 (bit 6):

Nastavení barvy palety (S2 = 0)

Zapise 4-bitovou IGRB barvu do jednoho ze 4 paletovych registru:

S1:S0 (bity 5:4) = cislo palety (0-3)
  00 = PLT 0
  01 = PLT 1
  10 = PLT 2
  11 = PLT 3
Bity 3:0 = barva IGRB
  Bit 3 = I (intenzita)
  Bit 2 = G (zelena)
  Bit 1 = R (cervena)
  Bit 0 = B (modra)

Příklad:

; PLT0 = cerna (0000), PLT1 = azurova (0101)
; PLT2 = zluta (0110), PLT3 = bila (0111)
LD A, 00000000B : OUT (0F0H), A   ; PLT0 = cerna
LD A, 00010101B : OUT (0F0H), A   ; PLT1 = azurova
LD A, 00100110B : OUT (0F0H), A   ; PLT2 = zluta
LD A, 00110111B : OUT (0F0H), A   ; PLT3 = bila

Aktivace skupiny palet (S2 = 1) — jen pro 16-barevný režim

V 16-barevném režimu (DMD=02H) je k dispozici 16 barev, ale pouze 4 paletové registry v HW. Barvy jsou proto rozdělený do 4 skupin po 4. Skupina se vybírá bity SW0 a SW1:

S2 = 1 (bit 6)
Bity 1:0 = SW1, SW0 — vyber aktivni skupiny

Skupina je určena bity rovin III a IV:

SW0 = bit roviny III (Plane III data)
SW1 = bit roviny IV (Plane IV data)

Rozdělení 16 barev do skupin:

Skupina Plane IV Plane III Barvy (index) Paleta
1 0 0 0, 1, 2, 3 PLT0-PLT3 (pokud SW0=0, SW1=0)
2 0 1 4, 5, 6, 7 přímo BRGI z rovin I-IV
3 1 0 8, 9, 10, 11 přímo BRGI z rovin I-IV
4 1 1 12, 13, 14, 15 PLT0-PLT3 (pokud SW0=1, SW1=1)

Klíčové omezení: V jednom okamziku může byt přes paletu remapovana pouze jedna skupina (4 barvy). Zbytek skupin se zobrazuje přímo — data z rovin I-IV jdou přímo jako B, R, G, I na video výstup bez paletoveho prekladu.

Příklad (service manual strana 26):

PLT0 = Black, PLT1 = Cyan, PLT2 = Red, PLT3 = Magenta

Kdyz SW0=0, SW1=0 (skupina 1 aktivni):
  Barvy 0-3: mapovany pres paletu (Black, Cyan, Red, Magenta)
  Barvy 4-15: primo BRGI z rovin (Green, Cyan, Yellow, White,
              Gray, Light blue, Light red, Light magenta)

Kdyz SW0=1, SW1=1 (skupina 4 aktivni):
  Barvy 0-11: primo BRGI z rovin
  Barvy 12-15: mapovany pres paletu

Pro plně libovolne mapování všech 16 barev se mění SW0/SW1 během H-blank (rasterove efekty), nebo se používají prednastavene skupiny.

Paleta NE pro border

Service manual (strana 26): "Pallet is not applicable for the border color." Border color (port CF06H) jde přímo jako 4-bit IGRB na video výstup, obchazi paletové registry.

Paleta NE v MZ-700 režimu

V MZ-700 režimu (DMD3=1) barvy z atributu obchazeji paletový obvod — viz dokument 08.

Přiřazení rovin k barevnym slozkami

Service manual — Table na strane 25

Service manual explicitne uvádí přiřazení pro každý režim:

320x200, 4 barvy (Frame A):

Pallet select A Pallet select B Výstupy
Plane I data Plane II data B,R,G,I z vybranej PLT
A (Plane I) B (Plane II) Vybrana paleta Výstup
0 0 PLT 0 B0, R0, G0, I0
1 0 PLT 1 B1, R1, G1, I1
0 1 PLT 2 B2, R2, G2, I2
1 1 PLT 3 B3, R3, G3, I3

640x200, 2 barvy (Frame A):

A (Plane I) Vybrana paleta
0 PLT 0
1 PLT 1

640x200, 4 barvy:

A (Plane I) B (Plane III) Vybrana paleta
0 0 PLT 0
1 0 PLT 1
0 1 PLT 2
1 1 PLT 3

320x200, 16 barev — přiřazení přímo na BRGI:

Pro skupiny, které NEjsou aktivne přes SW0/SW1, data z rovin I-IV jdou přímo na barevné slozky:

Rovina Barevná slozka
Plane I B (modra)
Plane II R (červená)
Plane III G (zelená)
Plane IV I (intenzita)

Video pipeline — od DRAM k IGRB vystupum

Prehled signaloveho řetězce

DRAM cipy (4164C-3)
    |
VA bus [7:0] ------> Plane I latch, Plane II latch
VC bus [7:0] ------> Plane III latch, Plane IV latch
    |
bus_Plane_I[7:0]     8 bitu roviny I (z VA)
bus_Plane_II[7:0]    8 bitu roviny II (z VA)
bus_Plane_III[7:0]   8 bitu roviny III (z VC)
bus_Plane_IV[7:0]    8 bitu roviny IV (z VC)
    |
Shift registr        Serializace 8 bitu → 1 pixel/takt
    |
bus_PALET[1:0]       2-bitovy palette index pro aktualni pixel
    |
Paletovy NAND mux    Vyber jednoho ze 4 paletovych registru
    |
bus_outPAL[3:0]      Obsah vybraneho registru
    |
bus_BRGI[3:0]        4x NAND → barva z palety
    |
bus_INK_BKG[3:0]     MUX: MZ-800 (BRGI) vs MZ-700 (INK)
    |                     rideny DMD(3)
    | *** BIT SWAP: INK_BKG(3) <-> RBGI(0) ***
    v
bus_RBGI[3:0]        MUX: border vs obsah
    |
F666 flip-flop       Vystupni registr (clocked CLK0)
    |                invertovany vystup (nO)
    v
Piny: YITN(75), GREEN(74), RED(72), BLUE(73)

1. DRAM fetch — čtení dat z paměti

Každý ze 40 sloupců (320x200) nebo 80 sloupců (640x200) na řádku vyžaduje 2 DRAM čtení v page-mode (společný RAS, 2 ČAS cykly):

Čtení CLK0 offset Účel
1 +0 Plane I data (VA bus)
2 +4 Plane II data (VA bus), současně Plane III/IV (VC bus)

Každý sloupec trvá 16 CLK0 (320x200) nebo odpovídá 8 pixelum při CLK0 (640x200). Viz dokument 16 pro detailní časování.

2. Latch a plane separation

GDG čte data z VA a VC busu a uklada je do internich latchu. Flip-flop xF635_20_20 alternuje latch clock — první ČAS cyklus zachyti Plane I (VA) a Plane III (VC), druhý ČAS cyklus zachyti Plane II (VA) a Plane IV (VC).

V GDG_core.vhd jsou rovinova data ulozena jako:

bus_Plane_I[7:0]    — z VA busu, 1. CAS cyklus
bus_Plane_II[7:0]   — z VA busu, 2. CAS cyklus
bus_Plane_III[7:0]  — z VC busu, 1. CAS cyklus
bus_Plane_IV[7:0]   — z VC busu, 2. CAS cyklus

3. Shift registr — serializace

Každý bajt (8 bitu) se načte do shift registru signálem LOAD a je vysunovany po 1 bitu. Frekvence vysunu: - 320x200: 1 pixel / 2 CLK0 (pixel clock = CLK0/2 = 8.867 MHz) - 640x200: 1 pixel / 1 CLK0 (pixel clock = CLK0 = 17.73 MHz)

Pro každý pixel se vysune 1 bit z kazde aktivní roviny.

4. Paletový index (bus_PALET)

V GDG_core.vhd je paletový index 2-bitový signál bus_PALET[1:0]:

bus_PALET(0)  -- radek 5681: z F601 latche, zdroj zavisi na rezimu
bus_PALET(1)  -- radek 7090: z F601 latche
Režim bus_PALET(0) zdroj bus_PALET(1) zdroj
320x200/4c Frame A Plane I bit Plane II bit
320x200/4c Frame B Plane III bit Plane IV bit
640x200/2c Plane I bit 0 (neaktivní)
640x200/4c Plane I bit Plane III bit

5. Paletový NAND mux — výběr registru

Ctverici paletovych registru (bus_inPAL[0-3]) vybírá kombinace bus_PALET[1:0]:

PALET[1] (SEL_B) PALET[0] (SEL_A) Vybrany registr
0 0 PLT 0
0 1 PLT 1
1 0 PLT 2
1 1 PLT 3

Vybrany 4-bitový obsah registru (IGRB barva) projde přes NAND hradla na bus_BRGI.

6. Border vs. obsah MUX

V blanking oblastech (mimo viditelný canvas) se místo barev z palety zobrazuje border color (port CF06H, 4-bit IGRB):

-- GDG_core.vhd, radky 3522-4055:
bus_RBGI(0) <= NOT ( ( bus_BORDER(0) AND blanking )
                  OR ( bus_INK_BKG(3) AND visible ) );
-- (analogicky pro bity 1, 2, 3)

Border color jde přímo na výstup — obchazi paletové registry.

7. Výstupní F666 flip-flopy

Poslední stupeň pipeline jsou 4 flip-flopy F666, taktovane CLK0. Používají invertovaný výstup (nO), takže:

Pin YITN(75) = NOT(bus_RBGI(3))   — intenzita
Pin GREEN(74) = NOT(bus_RBGI(2))  — zelena
Pin RED(72)   = NOT(bus_RBGI(1))  — cervena
Pin BLUE(73)  = NOT(bus_RBGI(0))  — modra

Invertovaný výstup je kompenzovan v následujícím video obvodu (na desce MZ-800).

Pipeline latence

Od prvniho DRAM čtení k prvnimu pixelů na výstupu: - MZ-800 grafické režimy: ~8 CLK0 (~0.45 us) - MZ-700 textový režim: 19 CLK0 (~1.07 us)

Kratsi latence v MZ-800 režimu — není třeba CG lookup.

Write Format Register (port CCH)

Format

Bit:  7      6      5      4    3     2    1    0
     WMD2   WMD1   WMD0   B/A   IV   III   II   I

B/A bit (bit 4)

Určuje, na kterou sadu rovin CPU přistupuje: - B/A = 0 (Frame A): Roviny I a II (VA bus) - B/A = 1 (Frame B): Roviny III a IV (VC bus)

B/A bit je společný pro WF i RF — musí byt konzistentni.

Výběr rovin (bity 3:0)

Určují, do kterých rovin se zapisuje: - Bit 0 = Rovina I - Bit 1 = Rovina II - Bit 2 = Rovina III - Bit 3 = Rovina IV

Zapisove mody (WMD2:WMD1:WMD0)

GDG implementuje 6 zapiosovych modu přes read-modify-write DRAM cyklus. Pro každý CPU zápis GDG nejdrive přečte aktualni obsah VRAM (VD = VRAM Data), pak aplikuje logickou operaci s zapisovanymi daty (WD = Write Data):

WMD Mod Operace Popis
000 SINGLE WD Přímo nahrazeni — data z CPU jdou do VRAM
001 EXOR WD XOR VD XOR s aktualnim obsahem
010 OR WD OR VD OR s aktualnim obsahem
011 RESET WD AND NOT(VD) Nulovani bitu (kde WD=1)
10x REPLACE viz nize Zápis barvy z WF na pozice kde WD=1, reset ostatních
11x PSET viz nize Zápis barvy z WF jen na pozice kde WD=1

REPLACE mod (WMD=10x)

REPLACE je určený pro zápis znakovych vzoru do grafické paměti:

Pro kazdy bit pozice:
  Kdyz WD bit = 1: VRAM bit = barva z WF registru (bity I-IV)
  Kdyz WD bit = 0: VRAM bit = 0 (RESET)

Service manual příklad (strana 24): zápis zluto-zeleneho textu na černém pozadí. WF = 10001110 (REPLACE, zeleno-zluta barva), Write Data = CG vzor znaků. Všechny roviny jsou zapsany jednim CPU zápisem.

PSET mod (WMD=11x)

PSET zapisuje pouze tam, kde WD=1 — ostatní pozice zustavaji nezmeneny:

Pro kazdy bit pozice:
  Kdyz WD bit = 1: VRAM bit = barva z WF registru (bity I-IV)
  Kdyz WD bit = 0: VRAM bit = beze zmeny (zachovan VD)

Uzitecne pro overlay — přidání barvy bez smazání existujiciho obsahu.

Read-modify-write v HW

GDG provádí všechny zápisy jako read-modify-write cyklus (Service Manual strana 15-16, 19):

  1. CPU zahaji zápis na VRAM adresu
  2. GDG aktivuje /VCAS s /VRWR=1 → DRAM čte aktualni data (VD)
  3. GDG zpracuje VD a WD přes WF logiku
  4. GDG aktivuje /VRWR → výsledek na VA/VC bus
  5. /VCAS se deaktivuje → data zapsána do DRAM

V 16-barevném režimu (320x200) jsou potřeba 2 CPU cykly na zápis jednoho bajtů — roviny I+II (VA) a roviny III+IV (VC) se zapisuji oddelene.

Read Format Register (port CDH)

Format

Bit:  7       6   5    4    3     2    1    0
   SRCH/SING   X   X   B/A   IV   III   II   I

Single color read (SRCH/SING = 0)

Čte data z jedne roviny určené bity I-IV: - Právě jeden bit (I, II, III, nebo IV) musí byt nastaven na 1 - Vraci 8-bitový obsah dane roviny na CPU adrese

Specified color search (SRCH/SING = 1)

Hledani konkrétní barvy ve VRAM: - Bity I-IV určují hledanou barvu - Vraci 8-bitovou masku: bit=1 kde pixel odpovídá hledane barve

Toto umožňuje rychle nalezeni všech pixelů určitě barvy — uzitecne pro kolizni detekci v hrach nebo barevné nahrazovani.

Časování video fetch

Časová osa jednoho řádku (PAL, CKSW=0)

CLK0:  0        329  340                       957   1135
       |         |    |                         |      |
       | refresh |    |    40 sloupcu x 16 CLK0 |      |
       |         |    |    = 640 CLK0           |      |
       |     prefetch | canvas start       prefetch    |
       |     col 0    |                    col 39 end   |
Udalost CLK0 Poznámka
Prefetch col 0 329 První DRAM čtení
HBLN visible 335 Status Register bit 7 = 1
Canvas start 340 První pixel na výstupu
Col N prefetch 329 + N*16 První čtení pro sloupec N
Col 39 prefetch 953 Poslední video sloupec
Col 39 konec 957 Poslední DRAM čtení
HBLN blank 975 Status Register bit 7 = 0

Mystery reads (jen DMD=00H a 02H)

V režimech 320x200 Frame A (DMD=00H) a 16-barevném (DMD=02H) jsou mezi každý video sloupec vlozena další DRAM čtení na adrese DRAM $0040 (RAS=0x00, ČAS=0x40):

CLK0 v ramci sloupce Operace
+0 Video read 1 (Plane I)
+4 Video read 2 (Plane II)
+8 (mezera)
+12 Mystery read (DRAM $0040)

Mystery reads obsazuji DRAM sbernici a prodluzuji latenci CPU zápisu v režimu 320x200 oproti 640x200 (viz dokument 16).

DRAM fetch dle režimu

DMD Režim Vid. čtení/řádek Mystery ČAS zaklady
00H 320/4c Frame A 78 206 1E, 5E
01H 320/4c Frame B 284 0 62, A2, BE, FE
02H 320/16c 78 206 0A, 4A
04H 640/2c Frame A 182 0 0A, 4A, FE
05H 640/2c Frame B 182 0 0A, 4A, FE
06H 640/4c 182 0 0A, 4A, FE

CPU write — latence a WAIT

Celkova latence CPU zápisu do DRAM

Situace CPU cyklus DRAM latence Celkem WAIT
Blanking, 320x200 19 CLK0 +10 CLK0 29 CLK0 0 TW
Blanking, 640x200 18 CLK0 +11 CLK0 29 CLK0 0 TW
Visible free, 320x200 18 CLK0 +20 CLK0 38 CLK0 0 TW
Visible free, 640x200 17 CLK0 +5 CLK0 22 CLK0 0 TW
Visible WAIT, 320x200 30 CLK0 +1 CLK0 31 CLK0 3 TW
Visible WAIT, 640x200 30 CLK0 +1 CLK0 31 CLK0 3 TW

Racing the beam

Pro změnu sloupce N na aktualnim řádku musí byt DRAM aktualizace dokoncena před CLK0 329 + N*16 (zacatek video fetch).

Bezpečné okno pro blanking zápisy: CLK0 957 až 329 = 508 CLK0 (~28.6 us, ~101 T-stavu CPU).

Detail viz 16-mz800-propagation.md.

Propagace změny registru — mid-scanline

Všechny I/O registry GDG se propagovany okamžitě — GDG nepoužívá žádný double-buffering:

Registr Port Latence Mid-scanline efekt
DMD CEH 6-14 CLK0 Změna rozlišení, pixel clock, režimu
Paleta F0H 10-14 CLK0 Změna barvy uprostřed řádku
Border CF06H 6 CLK0 Změna barvy okraje
SOF CF01H/02H ~18 CLK0 Torn line (diskontinuita DRAM adres)
WF CCH okamžitě Změna zápisu — neovlivnuje zobrazení
RF CDH okamžitě Změna čtení — neovlivnuje zobrazení

Detail viz 17-iorq-palette-border.md, 18-scroll-propagation.md, 19-dmd-propagation.md.

16 IGRB barev

IGRB Hex R G B Barva
0000 #000000 0 0 0 Černá
0001 #4040AC 64 64 172 Modra
0010 #D03400 208 52 0 Červená
0011 #B40C8C 180 12 140 Purpurova
0100 #406C00 64 108 0 Zelená
0101 #24CCFF 36 204 255 Azurová
0110 #E8D430 232 212 48 Zluta
0111 #D0D0D0 208 208 208 Bílá
1000 #848484 132 132 132 Seda
1001 #008CE8 0 140 232 Sv. modra
1010 #FF0000 255 0 0 Sv. červená
1011 #F054CC 240 84 204 Sv. purpurova
1100 #54FF54 84 255 84 Sv. zelená
1101 #80FFFF 128 255 255 Sv. azurová
1110 #FFFF28 255 255 40 Sv. zluta
1111 #FFFFFF 255 255 255 Jasne bílá

RGB hodnoty z Barvy.htm (Pavel Brazda), NE CGA aproximace. Barvy MZ-800 prochazi analogovymi video obvody a mají specifický charakter.

Nedokumentované režimy

DMD=03H (320x200, bits[1:0]=11)

Hybridni režim ctouci z obou framu (ČAS 0x0A, 0x4A, 0xBE, 0xFE). Používá VC bus (roviny III+IV) pro barevný výstup, VA bus je ignorovan. 284 video čtení, 0 mystery reads. Efektivně "16-barevný režim Frame B".

DMD=07H (640x200, bits[1:0]=11)

Shodný DRAM fetch s DMD=06H, ale používá VC bus (plane III) pro oba bity paletoveho indexu. Plane I (VA) je ignorovan. Výsledek: 640x200 mono režim přes Frame B, palety 0 a 3.

Detail viz 13-dmd-undocumented.md.

Praktické programování

Inicializace grafickeho režimu

; Prepnuti do 320x200, 4 barvy
LD A, 00H
OUT (0CEH), A          ; DMD = 320x200/4c Frame A

; Nastaveni palet
LD A, 00000000B        ; PLT0 = cerna
OUT (0F0H), A
LD A, 00010101B        ; PLT1 = azurova
OUT (0F0H), A
LD A, 00100110B        ; PLT2 = zluta
OUT (0F0H), A
LD A, 00110111B        ; PLT3 = bila
OUT (0F0H), A

; WF: SINGLE write, roviny I+II, Frame A
LD A, 00000011B
OUT (0CCH), A

; RF: Single read, rovina I, Frame A
LD A, 00000001B
OUT (0CDH), A

; Border = cerna
LD BC, 06CFH
LD A, 00H
OUT (C), A

Příklad: REPLACE write v 16-barevném režimu

Service manual (strana 24) — zápis znakoveho vzoru svetle zlutou barvou na grafickou obrazovku:

; WF = REPLACE mod, barva svetle zluta (IGRB = 1110)
; Plane I=B=0, II=R=1, III=G=1, IV=I=1
LD A, 10001110B        ; WMD=100 (REPLACE), B/A=0, IGRI=1110
OUT (0CCH), A

; Zapis CG vzoru znaku na VRAM adresu
LD HL, 8000H           ; cilova adresa ve VRAM
LD A, 01010101B        ; CG pattern (kazdy druhy pixel)
LD (HL), A             ; GDG provede REPLACE do vsech rovin

Po tomto zápisu: - Kde CG bit = 1: všechny 4 roviny nastaveny na barvu z WF - Kde CG bit = 0: všechny 4 roviny vymazany (černá)

Double buffering

; Kreslit do Frame B zatimco je zobrazen Frame A
LD A, 00H              ; DMD = Frame A zobrazen
OUT (0CEH), A

LD A, 00010011B        ; WF: SINGLE, Frame B (B/A=1), roviny I+II
OUT (0CCH), A
; ... kreslit do VRAM ...

; Prepnout zobrazeni na Frame B
LD A, 01H              ; DMD = Frame B zobrazen
OUT (0CEH), A

Stav ověření

Service manual: Detailní popis VRAM organizace (strany 16-19), paletoveho systému (strany 25-26), WF/RF registru (strany 21-24), timing diagramy (strany 17-19). Přiřazení rovin k barevnym slozkami potvrzeno v Table na strane 25.

HDL simulace: Všechny hodnoty časování a DRAM fetch pochází z gate-level simulace (GDG_core.vhd + cocotb testbenche). Ověřeno: - Pipeline latence ~8 CLK0 (dokument 16) - DRAM fetch pattern pro všech 16 DMD režimu (dokument 13) - Paletový signálový řetězec (dokument 11) - Propagace změny palety, DMD, SOF (dokumenty 14-16) - Chování bez rozšířené VRAM (dokument 20)

Částečně ověřeno: - Přesně přiřazení bus_PALET generování ke zdrojovym rovinam v HDL (trasovani přes F601 latche a shift registr v GDG_core) - SW0/SW1 skupinovy mechanismus v 16-barevném režimu (popsano z SM, ale zatim nesimulovan s explicitnim nastavenim SW) - Přesně chování REPLACE a PSET modu v simulací

Reálně HW: Ještě neověřeno.