Tento dokument popisuje kompletní mechanismus generování obrazu v MZ-700 textovém režimu (DMD bit 3 = 1). Vysvětluje, jak GDG z obsahu VRAM (znakové kody, atributy) a znakoveho generatoru (CG) produkuje barevný video výstup.
MZ-700 režim zobrazuje 40 x 25 znaků, každý 8x8 pixelů, celkové rozlišení 320 x 200 pixelů. K dispozici je 8 barev popredi a 8 barev pozadí pro každý znak, plus volba jedne ze dvou znakovych sad (2 x 256 znaků v CGRAM).
V MZ-700 režimu jsou video data mapovana na oblast D000H-DFFFH:
D000H +------------------------+
| Znakove kody (1000 B) | 40 x 25 = 1000 pozic
| D000H = pozice (0,0) |
| D027H = pozice (39,0) |
| D028H = pozice (0,1) |
| ... |
D3E7H | D3E7H = pozice (39,24) |
+------------------------+
| (mezera D3E8-D7FF) |
D800H +------------------------+
| Atributy (1000 B) | Barva pro kazdy znak
| D800H = atribut (0,0) |
| ... |
DBE7H | DBE7H = atribut (39,24)|
+------------------------+
Adresování:
Adresa_znaku = D000H + Y * 40 + X
Adresa_atributu = D800H + Y * 40 + X
kde X = 0-39 (sloupec), Y = 0-24 (radek)
GDG mapuje CPU adresy na DRAM adresy (RAS/ČAS) nelinearnim způsobem, aby umoznil efektivní page-mode přístup. Service manual (strana 16) ukazuje interní DRAM rozlozeni:
DRAM (VA bus) DRAM (VC bus)
$0000 +-------------+ $0000 +-------------+
| Nepouzito | | Nepouzito |
$2000 +-------------+ | (option) |
| CG oblast | | |
$3000 +-------------+ $3FFF +-------------+
| TEXT oblast |
$3400 +-------------+
| ATB oblast |
$3FFF +-------------+
Mapování CPU→DRAM (ověřeno simulací, viz dokument 07):
| CPU rozsah | Účel | ČAS základ |
|---|---|---|
| D000-D0FF | Text VRAM str. 0 | 0x20 |
| D100-D1FF | Text VRAM str. 1 | 0x22 |
| D200-D2FF | Text VRAM str. 2 | 0x24 |
| D300-D3FF | Text VRAM str. 3 | 0x26 |
| D800-D8FF | Color RAM str. 0 | 0x30 |
| D900-D9FF | Color RAM str. 1 | 0x32 |
| DA00-DAFF | Color RAM str. 2 | 0x34 |
Mapování je navrzeno tak, aby text a atribut jednoho znaků sdilely stejnou RAS adresu (= nizky bajt CPU adresy). Diky tomu je možné precist oba v jednom page-mode DRAM cyklů.
Kazda pozice na obrazovce obsahuje 8-bitový znakový kod (0-255), který indexuje jednu z 256 znakovych definic ve znakové sade.
CGROM je externí ROM čip na desce MZ-800 (4 KB, CPU adresa 1000H-1FFFH). Obsahuje 2 sady po 256 znacich:
1000H-17FFH: Sada 1 — 256 znaku x 8 bajtu = 2048 B
1800H-1FFFH: Sada 2 — 256 znaku x 8 bajtu = 2048 B
Každý znak je definovan 8 bajty — každý bajt = 1 řádek znaků (8 pixelů). Bit 7 = levy pixel, bit 0 = pravy pixel:
Priklad znaku "A" (z dokumentace Mon_graf_psg.txt):
Radek 0: *** = 00000111 = 07H
Radek 1: **** = 00001111 = 0FH
Radek 2: * * = 00010010 = 12H
Radek 3: * * = 00100010 = 22H
Radek 4: * * ** = 11010010 = D2H
Radek 5: ** **** = 11110110 = F6H
Radek 6: * ** ** = 01101101 = 6DH
Radek 7: ** = 00000110 = 06H
Adresa vzoru v CGROM:
Adresa = 1000H + znakovy_kod * 8 + radek_v_znaku (0-7)
Po zapnuti MZ-800 ROM monitor zkopiruje obsah CGROM do DRAM (oblast C000H-CFFFH), cimz vznikne CGRAM — programovatelna kopie znakové sady. Software může modifikovat jednotlive znaky (PCG — Programmable Character Generator).
Přístup k CGRAM přes bank switching:
OUT (E4H), A ; Vychozi konfigurace (CGROM na 1000H)
IN A, (E0H) ; Prepne CGRAM na C000-CFFF (cteni/zapis)
; Nyni lze cist/modifikovat znaky v C000-CFFF
IN A, (E1H) ; Vypne pristup ke CGRAM
Signál nCROM (pin 81) — chip-select pro externí CGROM — není nikdy aktivní během video generování v MZ-700 režimu (ověřeno v simulací, viz dokument 09).
GDG čte znakové vzory přímo z DRAM, ne z externiho CGROM čipu. Po inicializaci ROM monitorem je CG obsah v DRAM identický s CGROM, ale modifikace CGRAM se okamžitě projeví v zobrazení.
CG data jsou ulozena v DRAM na adresach $2000-$2FFF (interní DRAM adresování). Při video fetch používá GDG ČAS adresy 0x84 a 0xBE (viz dokument 07, řádek 139).
Každý znak ma prirazeny 1 bajt atributu urcujici jeho vizuální vlastnosti:
Bit: 7 6 5 4 3 2 1 0
CGSEL FG2 FG1 FG0 — BG2 BG1 BG0
| Bity | Funkce |
|---|---|
| 0-2 (BG2-BG0) | Barva pozadí (0-7) |
| 3 | Nepouzit (ignorovan) |
| 4-6 (FG2-FG0) | Barva popredi (0-7) |
| 7 (CGSEL) | Výběr znakové sady: 0 = první sada (CG 0-255), 1 = druhá sada (CG 256-511) |
OPRAVA (2026-03-30): Puvodni dokumentace (včetně scav-docs) mela FG a BG prohozene. Ověřeno z fungujiciho emulatoru mz800new (mz800_framebuffer.c) — bity 4-6 jsou popredi, bity 0-2 pozadí.
Pro každý pixel znaků: - bit CG vzoru = 1 (pixel zapnuty) → pouzije se barva popredi (FG2:FG0) - bit CG vzoru = 0 (pixel vypnuty) → pouzije se barva pozadí (BG2:BG0)
MZ-700 režim používá pouze 8 základních barev definovanych 3 bity (Green-Red-Blue). Bit intenzity (I) není k dispozici:
| Kod | GRB | Barva |
|---|---|---|
| 0 | 000 | Černá |
| 1 | 001 | Modra |
| 2 | 010 | Červená |
| 3 | 011 | Purpurova (magenta) |
| 4 | 100 | Zelená |
| 5 | 101 | Azurová (cyan) |
| 6 | 110 | Zluta |
| 7 | 111 | Bílá |
V MZ-800 grafických režimech (DMD bit 3 = 0) prochazi barvy přes paletový obvod (port F0H) — 2-bitový index pixelů vybere jeden ze 4 paletovych registru, každý obsahujici 4-bitovou IGRB barvu (16 moznych barev).
V MZ-700 textovém režimu paleta není použitá. 3-bitová barva z atributu jde přímo do barevneho výstupu (bus_INK), obchazi paletové registry (bus_BRGI).
Signálový řetězec pro generování barvy:
bus_inPAL[0-3] Paletove registry (F601 D-latche)
|
bus_outPAL[0-3] NAND mux (vyber palety podle pixel dat)
|
bus_BRGI[3:0] 4x NAND → MZ-800 barva (pres paletu)
|
+-----> bus_INK_BKG[3:0] MUX: BRGI (MZ-800) vs INK (MZ-700)
| rideny DMD(3)
bus_INK[3:0] MZ-700 barva (primo z atributu)
|
+-----> bus_INK_BKG[3:0]
|
| *** BIT SWAP: INK_BKG(3) <-> RBGI(0) ***
v
bus_RBGI[3:0] MUX: border (BORDER) vs obsah (INK_BKG)
|
F666 flip-flop Vystupni registr (clocked CLK0), nO vystup
|
Vystupni piny YITN(75), GREEN(74), RED(72), BLUE(73)
Přepínání zdroje barvy (GDG_core.vhd, řádek 4314-4327):
-- MUX rideny net_F101_116_19_in:
-- = 1 (MZ-800): bus_INK_BKG <= NOT(bus_BRGI) -- pres paletu
-- = 0 (MZ-700): bus_INK_BKG <= NOT(bus_INK) -- primo z atributu
bus_INK_BKG(3) <= NOT ( ( bus_BRGI(3) AND in2 ) OR ( bus_INK(3) AND in4 ) );
bus_INK_BKG(0) <= NOT ( ( bus_BRGI(0) AND in2 ) OR ( bus_INK(0) AND in4 ) );
bus_INK_BKG(2) <= NOT ( ( bus_BRGI(2) AND in2 ) OR ( bus_INK(2) AND in4 ) );
bus_INK_BKG(1) <= NOT ( ( bus_BRGI(1) AND in2 ) OR ( bus_INK(1) AND in4 ) );
-- Select signaly:
net_F424_126_19_in4 <= NOT net_F101_116_19_in; -- MZ-700 cesta
net_F424_126_19_in2 <= NOT ( NOT net_F101_116_19_in ); -- MZ-800 cesta
Rozhodovaci logika (řádek 4450):
net_F101_116_19_in <= NOT ( net_F302_34_18_out
AND net_F612_20_3_out
AND net_F302_80_19_in1 );
-- kde net_F302_80_19_in1 (radek 4213):
net_F302_80_19_in1 <= net_F612_20_4_out NOR net_F306_9_3_in2;
-- = NOT(DMD(2) OR DMD(3))
Když DMD(3)=1 (MZ-700 režim): net_F302_80_19_in1 = 0 →
NAND3 výstup = 1 → net_F101_116_19_in = 1 → in2=1, in4=0
→ výběr bus_BRGI (MZ-800 cesta).
Pozn.: Na první pohled to vypada, ze MZ-700 režim používá paletovou cestu (BRGI). Ve skutečnosti v MZ-700 režimu pipeline interne smeruje atributove barvy tak, ze prochazi paletovým obvodem, ale paletové registry jsou inicializovany ROM monitorem na hodnoty odpovídající MZ-700 barvam (paleta 0 = černá, paleta 3 = bílá). Přesný mechanismus smerovani 3-bitové barvy z atributu na paletový index vyžaduje další analyzu shift registru a bus_PALET generování.
Pro každý z 40 znaků na řádku GDG provádí následující sekvenci:
1. Precte znakovy kod z DRAM (text VRAM, D000+offset)
2. Precte atribut z DRAM (color RAM, D800+offset)
3. Precte CG vzor — bajt 1 z DRAM (znakovy generator)
4. Precte CG vzor — bajt 2 z DRAM (znakovy generator)
5. Nacte data do shift registru (LOAD puls)
6. Shift registr vysouva 8 pixelu (1 pixel/2 CLK0)
7. Pro kazdy pixel: vyber barva popredi nebo pozadi
Všechna 4 čtení probihaji v page-mode (společný RAS, 4 ČAS cykly). Kazde čtení je od predchoziho vzdaleno 4 CLK0:
| Čtení | CLK0 offset | Účel | ČAS základ |
|---|---|---|---|
| 1 | +0 | Znakový kod (text VRAM) | 0x22 |
| 2 | +4 | Barevný atribut (color RAM) | 0x32 |
| 3 | +8 | CG vzor — bajt 1 | 0x84 |
| 4 | +12 | CG vzor — bajt 2 | 0xBE |
Každý znakový sloupec trvá 16 CLK0 (~0.9 us). Celkem 40 sloupců = 640 CLK0 na řádek.
CLK0: 0 313 321 335 340 957 961 975 1135
| | | | | | | | |
| DRAM | |HBLN| | | |DRAM| |
| refresh| |vis.| | | |ref.| |
| | | | | | | | |
| | ch.0 | canvas ch.39 | | |
| | fetch | start fetch | | |
| | | 40 znaku x 16 CLK0| | |
| Udalost | CLK0 | Poznámka |
|---|---|---|
| DRAM refresh | 1-313 | 40 cyklů, addr=0000, gap=8 CLK0 |
| Prefetch char 0 | 321 | První DRAM čtení |
| HBLN visible | 335 | Status Register bit 7 = 1 |
| Canvas start | 340 | První pixel na výstupu |
| Char N fetch | 321 + N*16 | První DRAM čtení pro znak N |
| Char 39 fetch | 945-957 | Poslední znakový sloupec |
| DRAM refresh | 961-1129 | 22 cyklů |
| HBLN blank | 975 | Status Register bit 7 = 0 |
Od prvniho DRAM čtení (CLK0 321) k prvnimu pixelů na výstupu (CLK0 340) = 19 CLK0 (~1.07 us). Pipeline obsahuje ~1 znak prefetch.
To je vyrazne vice než u MZ-800 grafických režimu (8 CLK0), protože MZ-700 pipeline musí navíc provest CG lookup (čtení 3 a 4) a deserializaci přes shift registr.
Service manual zobrazuje časování jednoho znaků:
CLK: |_|-|_|-|_|-|_|-|_|-|_|-|_|-|_| 56.3 ns/perioda
<--------- 451 ns ----------> 8 CLK0 per RAS cycle
VRAS: |---| | |---| |
|___| |___|
VCAS: _|---|_|---|_ _|---|_|---|_
VOE:
VAD0-7: | ROW | COL | ATB.adr | ROW | COL | DUMMY |
text addr CG addr
VA 0-7: --------< text >< ATB >--------< CG ><invalid>
LOAD: _________________________________|---|___________
Sekvence: 1. První RAS cyklus: ROW adresa (číslo znaků) + dva ČAS - ČAS 1 → čtení znakoveho kodu na VA bus - ČAS 2 → čtení atributu na VA bus 2. Druhý RAS cyklus: ROW adresa (CG) + dva ČAS - ČAS 1 → čtení CG vzoru na VA bus - ČAS 2 → dummy čtení (nevalidni data) 3. LOAD puls načte data do shift registru
Po nacteni CG vzoru do shift registru jsou pixely vysunovany seriove — 1 pixel kazde 2 CLK0 (pixel clock = CLK0/2 = 8.867 MHz, stejně jako v režimu 320x200).
Pro každý vysunuty bit: - bit = 1 → na výstupu barva popredi (FG z atributu) - bit = 0 → na výstupu barva pozadí (BG z atributu)
Bit 7 atributoveho bajtů (CGSEL) nevyvolává blikání — přepíná mezi dvěma znakovymi sadami v CGRAM. Každá sada obsahuje 256 znaků (256 x 8 = 2048 bajtů), celkem 4 KB CGRAM.
Znakový kod (8 bitů, 0-255) vybere konkrétní znak uvnitř sady. CGSEL bit přidává 9. adresní bit při čtení CG vzoru z DRAM.
V MZ-700 režimu CPU přímo zapisuje na adresy D000H-DBFFH:
; Zapis znaku 'A' (kod 41H) na pozici (10, 5)
LD HL, D000H + 5*40 + 10 ; = D0D2H
LD (HL), 41H ; znakovy kod
; Zapis atributu: bila na cernem pozadi
LD HL, D800H + 5*40 + 10 ; = D8D2H
LD (HL), 07H ; FG=7 (bila), BG=0 (cerna)
Protože VRAM a CGRAM jsou v různých pameovych oblastech, je nutně správně nastavit bank switching:
| Port | Efekt v MZ-700 režimu |
|---|---|
| OUT (E4H) | 0-FFF: ROM, 1000-1FFF: CGROM, D000-DFFF: VRAM |
| IN (E0H) | 1000-1FFF: CGROM, C000-CFFF: CGRAM (RW) |
| IN (E1H) | 1000-1FFF: RAM, C000-CFFF: RAM |
| OUT (E3H) | D000-DFFF: VRAM + 8255/8253 mapovane porty |
V MZ-700 režimu (a po OUT E3H) jsou 8255 PPI a 8253 Timer pristupne přes paměťové adresy (ne I/O porty):
E000H-E003H: 8255 PPI (Port A, B, C, Control Word)
E004H-E007H: 8253 Timer (kanaly 0-2, Control)
Toto je dedicstvi z puvodniho MZ-700, který nemel I/O dekodér. Na MZ-800 jsou tyto periferie pristupne i přes I/O porty, ale MZ-700 kompatibilni software používá paměťové mapování.
| Vlastnost | MZ-700 text | MZ-800 320x200 | MZ-800 640x200 |
|---|---|---|---|
| Rozlišení | 320x200 (40x25 char) | 320x200 bitmap | 640x200 bitmap |
| Barvy | 8 (3-bit GRB) | 4-16 (přes paletu) | 2-4 (přes paletu) |
| VRAM čtení/řádek | 160 (40x4) | 80 (40x2) | 80 (40x2) |
| Čtení/sloupec | 4 | 2 | 2 |
| Prefetch CLK0 | 321 | 329 | 329 |
| Pipeline latence | 19 CLK0 | ~8 CLK0 | ~8 CLK0 |
| CG lookup | Ano (z DRAM) | Ne (přímo bitmap) | Ne |
| Paleta | Ne (přímo barva) | Ano (4 registry) | Ano |
| CG bank select | Ano (bit 7 ATB, 2x256 znaků) | Ne | Ne |
| Pixel clock | CLK0/2 | CLK0/2 | CLK0 |
MZ-700 režim vyžaduje 4 DRAM čtení na sloupec (vs. 2 v MZ-800), protože musí nacist: 1. Znakový kod — určuje, který CG vzor se pouzije 2. Atribut — určuje barvy popredi/pozadí 3. CG vzor (2 čtení) — 8 pixelů jednoho řádku znaků
MZ-800 grafické režimy čtou přímo pixelova data z VRAM — žádný lookup do znakoveho generatoru není potřeba.
ROM monitor při studenem startu provádí:
E816 LD A, 08H
E818 OUT (CEH), A ; DMD = 08H (MZ-700 textovy rezim)
E820 OUT (E4H), A ; Bank switch: ROM + CGROM + VRAM
Následně inicializuje palety (pro případ přepnutí do MZ-800): - Paleta 0 = černá (0000) - Paleta 1 = azurová (0101) - Paleta 2 = zluta (0110) - Paleta 3 = bílá (0111)
ROM rutina @CLR (096AH v dolnim monitoru) vyplni: - Znakovou VRAM (D000-D3E7) hodnotou 00H (mezera) - Atributovou VRAM (D800-DBE7) hodnotou 71H (FG=1 modra? nebo 70H=bílá na černém — závisí na verzi ROM)
Dokument uvádí CGRAM na C000-CFFF (4 KB). Ve skutečnosti je v DRAM oblast $2000-$2FFF (4 KB), ale z CPU je pristupna přes bank switching na C000-CFFF (po IN E0H).
Dokument chybně uvádí, že bit 7 atributu řídí blikání znaků. Ve skutečnosti bit 7 přepíná mezi dvěma znakovymi sadami v CGRAM (2 x 256 znaků). GDG žádnou blikací logiku neobsahuje.
HDL simulace: Časování a pipeline popsaný v tomto dokumentu
pochází z gate-level simulace (GDG_core.vhd + cocotb testbench
test_mz700_pipeline.py). Ověřeno:
- 4 DRAM čtení na sloupec, gap=4 CLK0, 16 CLK0/sloupec
- Prefetch char 0 na CLK0=321
- Pipeline latence 19 CLK0 (321→340)
- nCROM nikdy aktivní během video generování
- DRAM adresové mapování (ČAS zaklady pro text, ATB, CG)
- Propagace změn VRAM během blanking
Service manual: Potvrzuje VRAM layout ($2000=CG, $3000=TEXT, $3400=ATB), timing diagram (4 ČAS na znak).
Signálová analýza: Barevný pipeline (bus_INK vs bus_BRGI mux) analyzován v GDG_core.vhd. Přepínání rideno DMD(3) přes net_F302_80_19_in1. Přesný mechanismus smerovani 3-bitové barvy z atributu na barevný výstup vyžaduje další analyzu (shift registr → bus_INK generování).
Reálně HW: Ještě neověřeno.