25 — Přepínání IORQ vs MMIO dekódování (8255/8253) podle DMD režimu

Základní informace

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:

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.

HDL analýza

Výstup /KEY (8255)

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

Výstup /C53 (8253)

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

Kvalifikátory typu sběrnicového cyklu

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

Společný mód-bit — jádro přepínání

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.

Důkaz exkluzivity

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.

Adresní dekódy (pro úplnost)

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

Polarita DMD(3) a reset

Souvislost s emulací a dobovou dokumentací

Toto chování bylo dílčím způsobem zachyceno už dříve:

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

Stav ověření

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