04 — Superimpose / CKSW bit

Popis

Bit CKSW (Clock Switch) je bit 7 portu 07CFH. Často byl uváděn jako přepínač 50/60 Hz vertikální frekvence — měření na C modelu (1:1 prepis VHDL netlistu) ukázalo, že CKSW v této implementaci nepřepíná vertikální frekvenci, jen drobně zkracuje H periodu o 16 CLK0 ticků (viz měření níže). V Service Manual MZ-800 strucne zminen jako "Superimpose" — v kontextu TV techniky to znamená prekryti pocitacoveho obrazu s externim video signálem.

Na MZ-800 se tato funkce běžně nepouzivala.

Terminologie

V kódu jsou dva související signály: - CKSW (software bit) — bit 7 zapsaný do CF07H, odpovídá f615[11].data (= s->f615[11].data v C modelu) - net_F961_61_7_in2 — interní GDG signál = NOT(f615[11].data) = NOT(CKSW)

Polarita signálů:

Software CKSW (CF07H bit 7) f615[11].data net_F961_61_7_in2
0 (výchozí) 0 1
1 1 0

V této dokumentaci znamená "CKSW=1" stav, kdy software zapsal hodnotu s bit 7 = 1 do CF07H.

Zápis (port 07CFH, bit 7)

Dekódování adresy

Port CF je dekodovan NAND branou na řádku 6174:

bus_CS_0nCF(7) <= NOT ( net_F102_9_4_out AND net_F101_6_9_out2
    AND net_F304_8_10_in3 AND net_F101_9_9_out2 );

Adresové bity: - net_F101_6_9_out2 = buffer i_AD(10) (řádek 6461) - net_F304_8_10_in3 = buffer i_AD(9) (řádek 6318) - net_F101_9_9_out2 = buffer i_AD(8) (řádek 6454)

Dekóduje AD[10:8] = 111 → port 07CFH.

Uložení do flip-flopu

Flip-flop xF615_17_16 (řádek 5229–5235):

xF615_17_16: F615_D_Type_Flip_Flop_Inv_Reset PORT MAP (
    I => bus_DT(7),
    CLK => bus_CS_0nCF(7),
    nRES => net_F302_39_3_in1,
    O => net_F961_61_7_in2,
    nO => open
);

Signálové cesty CKSW bitu

bus_DT(7) → xF615_17_16 (F615, radek 5229)
    |
    v
net_F961_61_7_in2 = NOT(CKSW)
    |
    ├──► xF961_61_7 vstup I2 (radek 6604)
    |    4-bit citac → bus_COLUMN(3:0)
    |        ↓
    |    bus_COLUMN(0) → xF612_131_7 (radek 6631)
    |        ↓
    |    o_CKMS (pin 97, radek 6620)
    |
    ├──► XOR-like logika s i_NTPL (radky 6545–6548)
    |    → xF961_61_7 vstup I3
    |
    └──► bus_Status(2) = NOT(net_F961_61_7_in2) = CKSW (radek 6140)

Kombinace s NTPL (PAL/NTSC)

CKSW se kombinuje s pinem NTPL přes XOR-like logiku:

-- radek 6548:
net_F100_88_7_in <= i_NTPL NAND net_F961_61_7_in2;

-- radek 6545:
net_F431_89_8_out <= NOT ( ( i_NTPL OR net_F961_61_7_in2 )
    AND net_F100_88_7_in );

Rozklad: NOT((A OR B) AND NOT(A AND B)) = NOT(A XOR B) = XNOR

NTPL CKSW net_F961_61_7_in2 net_F431_89_8_out (I3)
0 0 1 0
0 1 0 1
1 0 1 1
1 1 0 0

Vstup I3 čítače dostane '1' když NTPL a software CKSW jsou různé.

4-bit čítač xF961_61_7

Čítač (řádek 6596–6610) generuje bus_COLUMN(3:0):

xF961_61_7: F961_4_bit_counter PORT MAP (
    CLK0 => net_nCLK0_F2,
    I0 => net_F961_61_7_in0,
    I1 => net_F961_61_7_in1,
    I2 => net_F961_61_7_in2,    -- NOT(CKSW)
    I3 => net_F431_89_8_out,    -- XOR(NTPL, CKSW)
    O0 => bus_COLUMN(0),
    O1 => bus_COLUMN(1),
    O2 => bus_COLUMN(2),
    O3 => bus_COLUMN(3),
    ...
);

CKSW na vstupu I2 mění předvolbu čítače COLUMN(3:0). Měření na C modelu ukázalo, že tato změna zkracuje H period přesně o 16 CLK0 ticků v obou variantách NTPL.

Výstup CKMS (pin 97)

CKMS (Character Clock) je odvozen z bus_COLUMN(0):

-- radek 6631–6637:
xF612_131_7: F612_D_Type_Flip_Flop_Reset PORT MAP (
    I => bus_COLUMN(0),
    CLK => net_nCLK0_F4,
    RES => net_F612_131_7_rst,
    O => open,
    nO => net_F100_145_7_in
);

-- radek 6620:
o_CKMS <= NOT net_F100_145_7_in;

CKMS = bus_COLUMN(0) zpozden o pul CLK0 periody a invertovan. Frekvence CKMS = CLK0/16 = 1.108 MHz nezavisle na CKSW i NTPL (ověřeno měřením v diag_ntsc_timing.c). Důvod: COLUMN counter je inkrementovan 3-bitovou děličkou s periodou 8 CLK0, takže COLUMN(0) překlápí každých 8 CLK0 nezávisle na presetu.

Čtení zpět (Status Register)

CKSW je čitelný na bitu 2 status registru (port CEH):

-- radek 6140:
bus_Status(2) <= NOT net_F961_61_7_in2;

Protože net_F961_61_7_in2 = NOT(CKSW), tak bus_Status(2) = CKSW (přímo, bez inverze):

Software CKSW (CF07H bit 7) bus_Status(2)
0 (výchozí) 0
1 1

(Ověřeno na C modelu: OUT (CF07H), 80H → IN (CEH) bit 2 = 1.)

Měření CKSW efektu na C modelu

Měření probehlo s CLK0 = 17.7344 MHz (PAL krystal) přes probe_4combos.c. Všechny 4 kombinace NTPL × CKSW.

Plná srovnávací tabulka

Hodnoty v tučném písmu se mění s CKSW.

Horizontální (CLK0 ticks na řádek)

Parametr NTPL=0, CKSW=0 NTPL=0, CKSW=1 NTPL=1, CKSW=0 NTPL=1, CKSW=1
HSYNC 80 80 64 64
BACK_PORCH 104 104 72 72
LEFT_BORDER 156 156 60 60
CANVAS_WIDTH 640 640 640 640
RIGHT_BORDER 132 116 52 36
FRONT_PORCH 24 24 24 24
DISPLAY_WIDTH 928 912 752 736
SCREEN_WIDTH 1136 1120 912 896

Vertikální (řádky na snímek)

Parametr NTPL=0, CKSW=0 NTPL=0, CKSW=1 NTPL=1, CKSW=0 NTPL=1, CKSW=1
TOP_BORDER 45 45 24 24
CANVAS_HEIGHT 200 200 200 200
BOTTOM_BORDER 42 42 18 18
POST_CANVAS_PORCH 3 3 3 3
VSYNC 3 3 3 3
PRE_CANVAS_PORCH 19 19 14 14
DISPLAY_HEIGHT 287 287 242 242
SCREEN_HEIGHT 312 312 262 262

Časování (při CLK0 = 17.7344 MHz)

Parametr NTPL=0, CKSW=0 NTPL=0, CKSW=1 NTPL=1, CKSW=0 NTPL=1, CKSW=1
Line period 64.06 µs 63.16 µs 51.43 µs 50.52 µs
Frame period 19.99 ms 19.70 ms 13.47 ms 13.24 ms
Frame rate 50.04 Hz 50.75 Hz 74.22 Hz 75.55 Hz
CPU clock divider CLK0/5 CLK0/5 CLK0/4 CLK0/4
CPU frequency 3.547 MHz 3.547 MHz 4.434 MHz 4.434 MHz

Pozn.: Hraniční detekce v probe může mít off-by-1 chybu (1-2 ticky horizontálně, 1 řádek vertikálně). Sumy (DISPLAY, SCREEN) jsou přesné.

Pozorovaný efekt CKSW=1

Vůči CKSW=0 (při zachování NTPL): - line_ticks: -16 CLK0 ticků - RIGHT_BORDER: -16 CLK0 ticků (přesně tam, kde se ubere) - HSYNC, BACK_PORCH, LEFT_BORDER, CANVAS, FRONT_PORCH: beze změny - total_lines: beze změny (312 zůstává 312, 262 zůstává 262) - TOP_BORDER, BOTTOM_BORDER, VSYNC: beze změny - frame rate: zvýšení o ~1.4 % (50.04 → 50.75 Hz, 74.22 → 75.55 Hz)

CKSW není 50/60 Hz přepínač

Tradiční výklad CKSW jako "PAL 50/60 Hz" přepínače v C modelu neplatí. Pro skutečný 60 Hz (59.94) framerate by bylo potřeba: - NTPL=1 (912 nebo 896 ticků/řádek, 262 řádků) - CLK0 ≈ 14.318 MHz (NTSC krystal)

Kombinace NTPL=1 + CKSW=0 + CLK0=14.318 MHz = 59.93 Hz ✓ Kombinace NTPL=1 + CKSW=1 + CLK0=14.318 MHz = 60.99 Hz

V evropském MZ-800 (CLK0 = 17.7344 MHz) software CKSW přepínač přes OUT (CF07H), 80H jen drobně zrychlí frame rate (50.04 → 50.75 Hz), což pravděpodobně nestačí pro skutečný NTSC TV norem.

Otázka co dělá CKSW na reálném HW zůstává otevřená — možné varianty: 1. C model/HDL netlist je věrný a CKSW skutečně dělá jen tuto drobnou H úpravu (a NTPL je hlavní 50/60 Hz přepínač). 2. HDL netlist (reverse-engineered) vynechává nějakou cestu, která by měla vertikální timing přepnout.

Bez měření na fyzickém GDG čipu nelze určit. Pro účely emulace je třeba implementovat to, co dělá HDL netlist (konzistentně s referenčním modelem).

Shrnutí

CKSW bit má v C modelu/HDL netlistu tyto efekty: 1. Horizontální timing — zkracuje line_ticks o 16 CLK0 (mění preset COLUMN(3:0) čítače). Všech 16 ticků se ubírá z RIGHT_BORDER. 2. Vertikální timingNEMĚNÍ počet řádků ani polohu VSYNC. 3. CKMS frekvenceNEMĚNÍ (zůstává CLK0/16 = 1.108 MHz). 4. Status bit 2 — zrcadlí CKSW (bus_Status(2) = software CKSW bit). 5. Frame rate — drobně zvýší (~1.4 %), nepřepíná na NTSC normu.

V normálním provozu MZ-800 (NTPL='0', CKSW='0'): PAL 50.04 Hz, CKMS = 1.108 MHz, line = 1136 CLK0, 312 řádků/snímek.