08 — MZ-700 znakový video systém

Základní informace

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

Paměti pro video

CPU adresní prostor

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)

Fyzická organizace v DRAM

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

Znakové kody a znakový generator

Znakové kody

Kazda pozice na obrazovce obsahuje 8-bitový znakový kod (0-255), který indexuje jednu z 256 znakovych definic ve znakové sade.

CGROM (Character Generator ROM)

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)

CGRAM (Programmable Character Generator)

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

Klíčové zjištění z HDL simulace: CG data z DRAM, ne z CGROM

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

Atributovy bajt

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

Jak atribut řídí barvu

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)

Barevný systém

8 barev MZ-700 — 3-bitové GRB

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á

Porovnání s MZ-800 paletovým systémem

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 v GDG — přepínání MZ-700 vs MZ-800

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

Video pipeline — generování obrazu

Prehled

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

4 DRAM čtení na znak (page-mode)

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.

Časová osa jednoho řádku

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

Pipeline latence: 19 CLK0

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.

Timing diagram z Service Manualu (strana 17)

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

Shift registr

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)

Výběr znakové sady (bit 7 atributu)

Mechanismus

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.

Přístup CPU k VRAM

Zapisovani do VRAM

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)

Bank switching

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

Memory-mapped periferie

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

Porovnání s MZ-800 grafickymi režimy

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

Proč je MZ-700 pipeline delsi

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.

Priprava obrazu — inicializace

Boot sekvence ROM monitoru

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)

Čištění obrazovky

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)

Korekce dokumentace

docs-ai/12_mz700_rezim.md — CGRAM adresní rozsah

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

docs-ai/12_mz700_rezim.md — blikání

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.

Stav ověření

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.