23 — Pin MOD7 (pin 85) — MZ-700/MZ-800 přepínač

Základní informace

Pin MOD7 (pin 85) je vstup GDG čipu. V aplikaci MZ-800 je připojen k DIP prepinaci SW1 na zadni strane počítače. Stav pinu: '0' = MZ-700 režim, '1' = MZ-800.

Klíčová otazka: Řídí MOD7 přímo přepnutí GDG do MZ-700 režimu?

Odpoved: Ne. Přepnutí do MZ-700 režimu je ryze softwarová operace — zápis DMD=08H na port CEH.

Chování GDG čipu

Signál i_MOD7 se v celem netlistu GDG_core.vhd (~8000 řádku) vyskytuje na 4 místech. Z toho 3 jsou součástí TEST režimu a 1 je Status Register readback.

1. Status Register bit 1

-- radek 6120: AND-NOR mux pro DT bus vystup
net_F100_115_9_in <= NOT ( ( bus_Data(1) AND sel_write )
    OR ( i_MOD7 AND sel_read ) );
-- radek 6382: inverze na vystup
o_DT(1) <= NOT net_F100_115_9_in;

Při čtení portů CEH (IN A,(CEH)) se na bitu 1 přímo objevi stav pinu MOD7. CPU tak může detekovat stav vstupu.

Vzorec: DT(1) = (bus_Data(1) AND sel_write) OR (i_MOD7 AND sel_read)

Kde sel_write = net_F102_30_6_out (data write enable) a sel_read = net_F112_122_8_out (status read enable). Při čtení Status Registru je sel_read=1, sel_write=0, takže DT(1) = i_MOD7.

2–4. Tri NAND3 brány — TEST režim

Všechny tri brány mají i_TEST jako třetí vstup:

-- F303_154_11 (radek 6065):
NOT ( NOT(i_TEMP) AND NOT(i_MOD7) AND i_TEST )
-- F303_150_11 (radek 6072):
NOT ( i_TEMP AND i_MOD7 AND i_TEST )
-- F303_148_11 (radek 6075):
NOT ( NOT(i_MOD7) AND i_TEMP AND i_TEST )

Při TEST='0' je výstup všech tri bran vždy '1', nezavisle na MOD7 a TEMP (vlastnost NAND: jakykoli vstup '0' → výstup '1').

Brány řídí flip-flopy pro output-enable signály:

Brána Vstupy (krome TEST) Flip-flop Výstup
F303_154_11 NOT TEMP, NOT MOD7 F631_150_17 AD bus output-enable
F303_150_11 TEMP, MOD7 F631_150_19 o_CPU_oe (CPU clock OE)
F303_148_11 NOT MOD7, TEMP F631_150_18 o_CPU_oe (přes F111)

Při TEST='1' slouzi MOD7 a TEMP jako 2-bitový selektor testovaciho modu:

MOD7 TEMP Efekt (pouze při TEST='1')
0 0 Všechny OE aktivní (jako normal)
0 1 CPU OE deaktivovano
1 0 AD bus OE deaktivovano
1 1 CPU clock OE deaktivovano

Toto umožňuje při vyrobnim testovani GDG čipu selektivne deaktivovat výstupy a testovat čip po castech.

Co MOD7 neridi (na úrovni čipu)

MOD7 přímo neovlivnuje žádnou z následujících funkci GDG:

Jediný způsob jak GDG pozna "MZ-700 režim" je hodnota DMD registru (bit 3 = 1), který se nastavuje softwarové zápisem na port CEH. MOD7 pin na toto nastavení nemá žádný vliv.

Aplikace v MZ-800

Zapojeni na desce

Protože TEST je trvale '0' bez možnosti odpojeni, tri NAND3 brány (F303_154_11, F303_150_11, F303_148_11) mají výstupy permanentne '1'. MOD7 a TEMP do těchto bran nikdy neproniknou — v aplikaci MZ-800 jsou tyto brány zcela irelevantni.

V MZ-800 ma MOD7 jediný účel: je citatelny jako bit 1 Status Registru (port CEH). Žádný jiný efekt nemá.

Boot ROM — sekvence studeného startu

Boot ROM (horní monitor E800H) vždy startuje v MZ-700 textovém režimu, bez ohledu na polohu DIP přepínače:

; E800 COLD start:
E813  DI
E814  IM1
E816  LD A, 08H
E818  OUT (CEH), A       ; *** vzdy DMD=08H = MZ-700 mod ***
E81A  LD A, 1
E81C  OUT (CDH), A       ; RF = single color
E81E  OUT (CCH), A       ; WF = MZ-700 = DATA,ATB,CG
E820  OUT (E4H), A       ; namapovani ROM, VRAM
      ...
E849  CALL BRKEY          ; testuj CTRL
E84C  JR NC, JE862        ; CTRL nestisknut -> normalni boot v MZ-700
E84E  CP 20H
E850  JP NZ, JE862        ; jen SHIFT -> normalni boot
; *** sem se dostaneme jen pri CTRL+SHIFT: ***
E853  IN A, (CEH)         ; precti Status Register
E855  AND 2               ; testuj bit 1 = MOD7
E857  JR Z, JE85F         ; MOD7=0 (MZ-700 switch) -> zustaneme v MZ-700
E859  XOR A
E85A  OUT (CEH), A        ; MOD7=1 -> DMD=0 = MZ-800 graficky rezim
E85C  CALL @BLACK          ; display do cerna
E85F  JP GORAM             ; skok do RAM

MOD7 se během studeného startu čte POUZE při stisku CTRL+SHIFT. Bez těchto klaves se MZ-800 vždy spusti v MZ-700 textovém režimu a pokracuje do standardniho boot procesu (nacitani z CMT/QD).

Spousteni programu (GOPGM)

Druhé čtení MOD7 je v rutine GOPGM (ECFCH), která spousti program nacteny z CMT/QD:

; ECFC ]GOPGM:
ECFC  IN A, (CEH)         ; precti Status Register
ECFE  BIT 1, A            ; testuj bit 1 = MOD7
ED00  JR Z, JED08         ; MOD7=0 -> MZ-700, preskoc prepnuti
ED02  XOR A
ED03  OUT (CEH), A        ; MOD7=1 -> DMD=0 = MZ-800 rezim
ED05  CALL @BLACK          ; zcernit obrazovku
ED08  LD C, (HL)           ; pokracuj se spoustenim programu

Před predanim řízení nactene aplikaci ROM zkontroluje MOD7: - MOD7=1 (MZ-800 HW): nastaví DMD=0 (grafický režim 320x200/4c) - MOD7=0 (MZ-700 switch): ponecha DMD=08H (textový režim)

Shruti použití MOD7 v ROM

Místo Adresa Podminka Akce při MOD7=1
COLD start E853H CTRL+SHIFT drzeno DMD=0 (MZ-800), skok do RAM
GOPGM ECFCH vždy (při spousteni programu) DMD=0 (MZ-800), černá obrazovka

V obou případech ROM nastavuje DMD=0 (MZ-800 grafický režim), pouze pokud MOD7=1. DIP přepínač tedy neovlivnuje GDG přímo, ale řídí logiku boot ROM, která softwarové přepíná grafický režim.

Softwarová detekce režimu

Software může kdykoliv detekovat polohu DIP přepínače:

    IN A, (CEH)
    BIT 1, A
    JR Z, is_mz700      ; SW1 = ON (MZ-700 konfigurace)
    ; SW1 = OFF (MZ-800 konfigurace)

Pozn.: Toto nerika v jakem režimu GDG aktualne pracuje — to určuje DMD registr. Rika pouze jakou polohu ma fyzický přepínač. Software mohl nastavit DMD=08H (MZ-700) i při MOD7=1 (MZ-800 HW).

Emulace

Pro emulatory je MOD7 trivialni — staci ho vracet jako bit 1 Status Registru. Žádná jiná logika není potřeba. Typicky: - MOD7=1 pro emulaci MZ-800 - MOD7=0 pro emulaci MZ-700 kompatibility (pokud emulator podporuje oboji)

Status Register — kompletní bit mapa z HDL

Analýza DT bus vystupnich muxu v GDG_core potvrzuje Verzi A dokumentace (z HTML GDG dokumentace a Porty.txt):

Bit Název Zdroj v HDL Popis
0 MELO i_TEMP (pin 100) Tempo signál z NE556 (~35 Hz)
1 SW1 i_MOD7 (pin 85) DIP přepínač (0=MZ-700)
2 bus_Status(2) (neurceno*)
3 0 (hardwired) Vždy 0 při čtení
4 VSYN bus_Status(4) Snimkova synchronizace
5 HSYN bus_Status(5) Radkova synchronizace
6 VBLN bus_Status(6) Snimkove zatemeni
7 HBLN bus_Status(7) Řádkové zatemneni

(*) bus_Status(2) pravděpodobně odpovídá HBLN v alternativnim mapování — přesně přiřazení vyžaduje další analyzu časování.

DT bus výstupní logika pro každý bit:

Bit 0: o_DT(0) = (sel_read NAND TEMP) NAND NOT((Data(0) AND sel_write) OR (sel_read2 AND TEMP))
Bit 1: o_DT(1) = (Data(1) AND sel_write) OR (MOD7 AND sel_read)
Bit 2: o_DT(2) = (Data(2) AND sel_write) OR (Status(2) AND sel_read)
Bit 3: o_DT(3) = Data(3) AND sel_write                    [pri cteni = 0]
Bit 4: o_DT(4) = (Data(4) AND sel_write) OR (Status(4) AND sel_read)
Bit 5: o_DT(5) = (Data(5) AND sel_write) OR (Status(5) AND sel_read)
Bit 6: o_DT(6) = (Data(6) AND sel_write) OR (Status(6) AND sel_read)
Bit 7: o_DT(7) = (sel_read NAND Status(7)) NAND NOT((Data(7) AND sel_write) OR (sel_read2 AND Status(7)))

Pozn.: Bity 0 a 7 používají odlisnou strukturu (dva NAND místo AND-NOR) a druhý select signál sel_read2 (net_F203_117_10_in2). Bit 3 nemá žádnou status-read vetev — při čtení vraci vždy 0.

Porovnání s Verzi B (scav-docs)

Verze B uklada HBLK na bit 0 a VBLK na bit 1. HDL analýza toto vylucuje: bit 0 = TEMP (pin), bit 1 = MOD7 (pin) — přímo propojené na fyzické vstupy, žádná interní logika.

Verze A je správná.

Analog: pin TEMP (pin 100)

TEMP pin ma identickou strukturu jako MOD7: - Je citatelny jako Status Register bit 0 (MELO/tempo) - Figuruje ve stejnych 3 NAND3 branach (TEST režim) - V normalnim provozu neovlivnuje žádnou vnitřní logiku GDG

TEMP je připojen k casovaci NE556, který generuje ~35 Hz tempo signál pro melodicky systém. Software může pollovanim bitu 0 portů CEH detekovat stav tempa pro synchronizaci prehravani melodii.

Stav ověření

HDL analýza: Kompletní prohledani GDG_core.vhd (8081 řádku). Signál i_MOD7 se vyskytuje na 4 místech: - Řádek 6078: NOT i_MOD7 (vstup do NAND3 F303_154_11) - Řádek 6079: NOT(NOT i_MOD7) (vstup do NAND3 F303_150_11) - Řádek 6120: AND-NOR mux pro o_DT(1) (Status Register bit 1) - Port deklarace (řádek 65)

Potvrzeno: žádné další reference na MOD7 v celem netlistu.

Simulace: MOD7 se v cocotb testech nastavuje na '1' (MZ-800) v reset_gdg() funkci. Testy s MOD7='0' nebyly systematicky provadeny — chování je trivialni (pouze změna bitu 1 Status Reg).