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