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.
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ý |
| 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 |
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ě.
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 +-------------+
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)
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
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).
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.
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ů.
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).
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):
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
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.
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.
V MZ-700 režimu (DMD3=1) barvy z atributu obchazeji paletový obvod — viz dokument 08.
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) |
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)
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í.
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
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.
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 |
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.
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.
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).
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.
Bit: 7 6 5 4 3 2 1 0
WMD2 WMD1 WMD0 B/A IV III II I
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.
Určují, do kterých rovin se zapisuje: - Bit 0 = Rovina I - Bit 1 = Rovina II - Bit 2 = Rovina III - Bit 3 = Rovina IV
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 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 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.
GDG provádí všechny zápisy jako read-modify-write cyklus (Service Manual strana 15-16, 19):
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.
Bit: 7 6 5 4 3 2 1 0
SRCH/SING X X B/A IV III II I
Č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
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.
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 |
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).
| 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 |
| 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 |
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.
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.
| 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.
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".
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.
; 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
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á)
; 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
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.