GDG multiplexuje 16-bitovou CPU adresu do 8-bit RAS + 8-bit ČAS pro přístup k 4164C-3 DRAM cipum (64K x 1 bit).
Mapování NENÍ lineární — CPU adresní bity jsou přeuspořádány tak, aby video fetch pipeline mohl číst všechna data jednoho znaků v jednom page-mode DRAM cyklů (společný RAS, různě ČAS).
RAS[7:0] = CPU[7:0]
Nizky bajt CPU adresy jde přímo do řádkové adresy DRAM. Kazda CPU adresa se sudym offsetem v ramci stranky sdili RAS s odpovídající lichou adresou.
CAS[0] = CPU[0] A0 — sdileno s RAS[0]!
CAS[1] = CPU[8] A8
CAS[2] = CPU[9] A9
CAS[3] = CPU[10] A10
CAS[4] = CPU[11] A11
CAS[5] = CPU[12] A12
CAS[6] = CPU[13]? A13 — predpoklad, neovereno
CAS[7] = ? — neovereno
Bity A0 se mapuji do OBOU RAS[0] a ČAS[0]. To znamená, ze sude a liche CPU adresy jdou do různých DRAM řádku I sloupců.
| CPU rozsah | Účel v MZ-700 | ČAS základ | ČAS vzorec |
|---|---|---|---|
| C000-C0FF | — | 0x00 | 0x00 | (addr & 1) |
| C100-C1FF | — | 0x02 | 0x02 | (addr & 1) |
| C200-C2FF | — | 0x04 | 0x04 | (addr & 1) |
| D000-D0FF | text VRAM str. 0 | 0x20 | 0x20 | (addr & 1) |
| D100-D1FF | text VRAM str. 1 | 0x22 | 0x22 | (addr & 1) |
| D200-D2FF | text VRAM str. 2 | 0x24 | 0x24 | (addr & 1) |
| D300-D3FF | text VRAM str. 3 | 0x26 | 0x26 | (addr & 1) |
| D400-D4FF | (CG data?) | 0x28 | 0x28 | (addr & 1) |
| D800-D8FF | color RAM str. 0 | 0x30 | 0x30 | (addr & 1) |
| D900-D9FF | color RAM str. 1 | 0x32 | 0x32 | (addr & 1) |
| DA00-DAFF | color RAM str. 2 | 0x34 | 0x34 | (addr & 1) |
| DE00-DEFF | — | 0x3C | 0x3C | (addr & 1) |
| DF00-DFFF | — | 0x3E | 0x3E | (addr & 1) |
Mapování je navrzeno pro efektivní page-mode DRAM přístup. Pro každý znak na obrazovce GDG čte 4 hodnoty v jednom RAS cyklů:
Znak N (CPU D000+N):
RAS = N
1. cteni: CAS = 0x20|(N&1) → znakovy kod (text VRAM)
2. cteni: CAS = 0x30|(N&1) → barevny atribut (color RAM)
3. cteni: CAS = CG adresa 1 → vzor znakoveho generatoru
4. cteni: CAS = CG adresa 2 → vzor znakoveho generatoru
Všechna 4 čtení sdili stejný RAS = pozice znaků. Diky tomu staci jeden RAS cyklus (page-mode) pro kompletní nacteni dat jednoho znaků.
Znakový generator (CG) čte vzory z DRAM (ne z externiho CGROM — nCROM není nikdy aktivní, viz dokument 09). CG adresy používají jiné ČAS hodnoty:
| Typ sloupce | CG RAS | CG ČAS |
|---|---|---|
| Sudy (N&1=0) | viz poznámka | 0x1A, 0x90 |
| Lichy (N&1=1) | viz poznámka | 0x1A, 0x90 |
CG RAS alternuje mezi 0x32 a 0x3A (rozdíl v bitu 3) v závislosti na znakoven kodu. Přesně mapování CG adres na CPU adresy vyžaduje další analyzu.
CPU zápisy do VRAM vyzaduji nastaveny Write Format registr!
Po resetu je WF=0x00 (žádné roviny vybrane). V tomto stavu GDG provede DRAM cyklus, ale na VA/VC bus vystavi nuly — data se efektivně nezapisi.
io_write(0xCC, 0x0F) ; WF = SINGLE mode, vsechny roviny
io_write(0xCC, 0x03) ; WF = SINGLE mode, roviny I+II (VA bus)
Ověřeno simulací: - WF=0x00: o_VA=0x00 během late-write (data se nezapisi) - WF=0x03: o_VA=správná data (zápis funguje pro VA bus) - WF=0x0F: o_VA i o_VC=správná data (zápis funguje pro oba busy)
MZ-800 BIOS (IPL) pravděpodobně nastavuje WF před inicializaci VRAM.
GDG používá read-modify-write (late write) pro CPU zápisy:
Důležité pro emulaci: - Data z DT bus se zachyti přes D-latch chain uvnitř GDG - DT bus musí zustat stabilní ~50 ns PO nWR/nMREQ (data hold) - Konecna data na VA/VC závisí na WF registru (mod zápisu, výběr rovin)
Každý grafický režim používá jiné základní ČAS adresy pro video fetch (čtení VRAM dat pro generování obrazu):
| DMD | Režim | ČAS zaklady (bez bit 0) | Čtení/řádek |
|---|---|---|---|
| 00H | 320/4c Frame A | 0x1E, 0x5E | 78 vid + 206 mystery |
| 01H | 320/4c Frame B | 0x62, 0xA2, 0xBE, 0xFE | 284 vid |
| 02H | 320/16c | 0x0A, 0x4A | 78 vid + 206 mystery |
| 03H | 320/nedok. | 0x0A, 0x4A, 0xBE, 0xFE | 284 vid |
| 04H | 640/2c Frame A | 0x0A, 0x4A, 0xFE | 182 vid |
| 05H | 640/2c Frame B | 0x0A, 0x4A, 0xFE | 182 vid |
| 06H | 640/4c | 0x0A, 0x4A, 0xFE | 182 vid |
| 07H | 640/nedok. | 0x0A, 0x4A, 0xFE | 182 vid |
| 08H+ | MZ-700 text | 0x22, 0x32, 0x84, 0xBE | 222 vid |
Poznámky: - DMD=0x03 kombinuje ČAS zaklady z 16c (0x0A, 0x4A) a Frame B (0xBE, 0xFE) — čte z obou oblasti DRAM - DMD=0x07 ma identický ČAS pattern jako 0x06 — liší se jen v interpretaci dat (VC bus pro oba bity palety) - Mystery reads (RAS=0x00, ČAS=0x40) se vyskytuji pouze v DMD=0x00 a 0x02 (Frame A režimy v 320x200)
Simulace (HDL): Všechny hodnoty pochází z gate-level simulace
(test_mz700_pipeline.py::test_mz700_dram_address_map,
test_dmd_undocumented.py::test_all_dmd_overview).
Overene rozsahy: - C000-C2FF: ČAS základ 0x00-0x04 - D000-D3FF: ČAS základ 0x20-0x26 (text VRAM) - D400-D4FF: ČAS základ 0x28 - D800-DAFF: ČAS základ 0x30-0x34 (color RAM) - DE00-DFFF: ČAS základ 0x3C-0x3E - Video fetch ČAS pro všech 16 DMD režimu (test_all_dmd_overview)
Reálně HW: Ještě neověřeno.