07 — DRAM adresové mapování (CPU → DRAM)

Základní princip

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

Adresové mapování

RAS (radkova adresa)

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.

ČAS (sloupcova adresa)

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

Prehled ČAS hodnot dle CPU rozsahu

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)

Vztah k video fetch pipeline

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

CG adresy

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.

Důležité: WF registr (CCH) musí byt nastaven

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.

DRAM zápis — read-modify-write cyklus

GDG používá read-modify-write (late write) pro CPU zápisy:

  1. nVCAS padne s nVRWR=1 → DRAM čte data (read fáze)
  2. GDG zpracuje data přes Write Format logiku
  3. nVRWR padne → GDG vysle upravena data na VA/VC (write fáze)
  4. nVCAS stoupne → konec ČAS cyklů

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)

Video fetch ČAS adresy dle DMD režimu

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)

Stav ověření

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.