GDG dekóduje chip-select pro klávesnicový PPI 8255 (/KEY, pin 82)
a časovač 8253 (/C53, pin 99). Tyto periferie jsou v MZ-800
dostupné dvěma způsoby:
nIORQnMREQ
(dědictví MZ-700, kde I/O dekodér neexistoval)Klíčová otázka: Jsou obě cesty aktivní současně, nebo se přepínají?
Odpověď: Přepínají se, jsou vzájemně exkluzivní. O tom, která cesta je živá, rozhoduje jediný latchovaný bit — DMD(3) (Display Mode Register, bit 3 = příznak režimu MZ-700):
| Režim | DMD(3) | I/O cesta D0-D7 | MMIO cesta E000-E007 |
|---|---|---|---|
| MZ-800 (DMD = 00/02/04H ...) | 0 | aktivní | zablokovaná |
| MZ-700 (DMD = 08H-0BH) | 1 | zablokovaná | aktivní |
To znamená, že v režimu MZ-700 nelze 8255/8253 oslovit přes I/O porty D0-D7 — fungují výhradně přes E000-E007. A naopak v režimu MZ-800 je memory-mapped cesta mrtvá a fungují jen I/O porty.
Pozor: nejde o pin MOD7 (pin 85). Ten je čistě pasivní status bit a režim GDG neřídí — viz 23-mod7-pin.md. Přepínání dělá softwarový bit DMD(3) zapsaný na port CEH.
-- radek 3468: vystupni buffer
xF111_155_22: F111_Buffer PORT MAP (I => net_F424_111_4_out, O => o_nKEY);
-- radek 7220: dva paralelni clenu (MMIO OR IORQ)
net_F424_111_4_out <= NOT ( ( net_F424_111_4_in1 AND net_F101_30_4_out ) -- MMIO clen
OR ( net_F102_82_3_out AND net_F203_117_4_out ) ); -- IORQ clen
-- radek 7223: MMIO adresni vetev (E000-E003)
net_F424_111_4_in1 <= net_F306_9_3_out NOR net_F203_117_4_in1;
-- radek 7208: IORQ adresni vetev (D0-D3)
net_F203_117_4_out <= NOT ( net_F203_117_4_in1 OR net_F303_12_7_in2 OR net_F304_121_3_out );
-- radek 7652: vystupni buffer
xF111_148_2: F111_Buffer PORT MAP (I => net_F111_148_2_in, O => o_nC53);
-- radek 7467: dva paralelni clenu
net_F111_148_2_in <= NOT ( ( net_F101_30_4_out AND net_F424_111_3_in2 ) -- MMIO clen
OR ( net_F102_82_3_out AND net_F203_114_3_out ) ); -- IORQ clen
-- radek 7477: MMIO adresni vetev (E004-E007)
net_F424_111_3_in2 <= net_F306_9_3_out NOR net_F202_118_3_in1;
-- radek 7464: IORQ adresni vetev (D4-D7)
net_F203_114_3_out <= NOT ( net_F202_118_3_in1 OR net_F303_12_7_in2 OR net_F304_121_3_out );
Struktura obou výstupů je symetrická: každý má MMIO člen (gateovaný
net_F101_30_4_out) a IORQ člen (gateovaný net_F102_82_3_out),
spojené přes OR.
-- radek 7511, 7414, 7417: I/O cyklus
net_F102_82_3_out <= NOT net_F202_6_2_in2;
net_F202_6_2_in2 <= i_nM1 NAND net_F302_2_4_in2;
net_F302_2_4_in2 <= NOT i_nIORQ;
-- => net_F102_82_3_out = i_nM1 AND NOT(i_nIORQ) (IORQ=0, M1=1)
-- radek 7362, 7862, 8076: pametovy cyklus
net_F101_30_4_out <= NOT net_F302_1_2_out;
net_F302_1_2_out <= i_nRFSH NAND net_F101_1_1_out;
net_F101_1_1_out <= NOT i_nMREQ;
-- => net_F101_30_4_out = NOT(i_nMREQ) AND i_nRFSH (MREQ=0, RFSH=1)
IORQ člen je tedy živý jen při I/O cyklu (ne IntAck), MMIO člen jen při skutečném paměťovém přístupu (ne DRAM refresh).
Oba členy závisí na signálu net_F306_9_3_in2, což je latchovaná
kopie bus_DMD(3):
-- radek 7106: flip-flop latchujici DMD(3)
xF612_20_5: F612_D_Type_Flip_Flop_Reset PORT MAP (
I => bus_DMD(3), -- vstup = Display Mode bit 3
CLK => net_F612_20_2_clk,
RES => net_F102_32_2_out, -- reset -> 0 (vychozi MZ-800 dekod)
O => net_F306_9_3_in2, -- = DMD(3) po zaclockovani
nO => net_F433_87_16_in4
);
MMIO člen používá net_F306_9_3_in2 jako AND-vstup dekódu oblasti
E00x:
-- radek 7632:
net_F306_9_3_out <= NOT ( net_F111_5_2_out AND net_F306_9_3_in2
AND net_F204_7_1_out AND net_F306_9_3_in4
AND net_F306_9_3_in5 AND net_F306_9_3_in6 );
net_F306_9_3_out může jít do 0 (= shoda E00x) jen když
net_F306_9_3_in2 = 1 (MZ-700). Teprve pak net_F424_111_4_in1
(NOR) může být 1 a MMIO člen aktivovat /KEY.
IORQ člen používá tentýž bit přes net_F303_12_7_in2:
-- radek 5709:
net_F303_12_7_in2 <= NOT ( NOT net_F306_9_3_in2 ); -- = net_F306_9_3_in2
net_F303_12_7_in2 je OR-vstup v net_F203_117_4_out (:7208)
i net_F203_114_3_out (:7464). Aby IORQ člen mohl aktivovat
chip-select, musí být net_F306_9_3_in2 = 0 (MZ-800), jinak je
net_F203_xxx_out = NOT(... OR 1 OR ...) = 0.
net_F306_9_3_in2 (DMD3) |
MMIO člen (E00x) | IORQ člen (Dxh) |
|---|---|---|
| 0 (MZ-800) | net_F306_9_3_out = 1 → net_F424_111_4_in1 = 0 → OFF |
net_F203_xxx_out může být 1 → ON |
| 1 (MZ-700) | dekód E00x povolen → ON | net_F203_xxx_out = 0 → OFF |
Stejný bit současně povoluje jednu cestu a zakazuje druhou — proto se nemohou překrývat.
MMIO oblast E000-E007 (net_F306_9_3_out, :7632):
| Komponenta | Řádek | Význam |
|---|---|---|
net_F204_7_1_out |
8064 | A11-A8 = 0 |
net_F306_9_3_in5 |
7141 | A12 = 0 |
net_F306_9_3_in4 |
7671 | A7-A4 = 0 |
net_F306_9_3_in6 ← net_F202_8_6_in2 |
6896, 5894 | A15-A13 = 111 (oblast E000-FFFF) |
net_F306_9_3_in2 |
7106 | DMD(3) = 1 (režim MZ-700) |
Rozlišení 8255 vs 8253 v MMIO (dolní bity A3:A2):
- net_F203_117_4_in1 (:7205) = A2 OR A3 → /KEY pro E000-E003
- net_F202_118_3_in1 (:7452) = NOT(A2 AND NOT A3) → /C53 pro E004-E007
I/O oblast Dxh sdílí horní dekód net_F304_121_3_out (:7445, kontroluje
A7 a horní bity D-rozsahu); dolní bity A3:A2 rozlišují D0-D3 vs D4-D7
stejnými signály net_F203_117_4_in1 / net_F202_118_3_in1.
E818: LD A,08H / OUT (CEH)
pro MZ-700, viz 23-mod7-pin.md) i napříč
dokumentací portů.xF612_20_5 má aktivní reset → po power-on je
net_F306_9_3_in2 = 0 (výchozí MZ-800 dekód), dokud software
nezapíše DMD = 08H.net_F612_20_2_clk, přesné časování clocku zde netraceováno
[neověřeno]).Toto chování bylo dílčím způsobem zachyceno už dříve:
doc-mz800emu/01-hlavni-smycka.md — porty D0-D7 označeny jako
„jen v MZ-800 módu"; v MZ-700 jsou neaktivní a periferie jsou
na E000-E007.docs/popis-rom/horni_monitor_E000-F3FF.txt (řádek 134) — dobový
ROM komentář „Sem se mapuji v MZ-700 modu porty D0-D7" (na E000).Naopak docs-ai/14_io_dekodovani.md původně popisoval obě cesty jako
souběžné („8255 přístupný i přes E000-E003", „GDG generuje /KEY
i při MREQ") — což je nesprávné. Opraveno na exkluzivní přepínání.
HDL analýza: Kompletní trasování obou chip-select dekodérů
v GDG_core.vhd. Potvrzeno:
- /KEY i /C53 mají dva členy (MMIO přes MREQ, IORQ přes IORQ).
- Oba členy gateuje latchovaná kopie DMD(3) (net_F306_9_3_in2):
MMIO vyžaduje =1 (MZ-700), IORQ vyžaduje =0 (MZ-800).
- Cesty jsou tím vzájemně exkluzivní.
C model: Logika je věrně přítomna i v c-whid-0/:
- gdg_seq.c (net_F306_9_3_in2 = s->f612[8].data)
- gdg_comb.c (net_F303_12_7_in2 = net_F306_9_3_in2,
net_F306_9_3_out = NAND6(... net_F306_9_3_in2 ...)).
Všech 55 testů C modelu prochází.
Neověřeno: Přesné časování clocku FF xF612_20_5
(net_F612_20_2_clk) — tj. v jakém okamžiku po zápisu DMD se přepnutí
dekódování projeví.