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.
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.
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.
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
);
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)
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é.
Čí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.
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.
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í probehlo s CLK0 = 17.7344 MHz (PAL krystal) přes
probe_4combos.c. Všechny 4 kombinace NTPL × CKSW.
Hodnoty v tučném písmu se mění s CKSW.
| 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 |
| 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 |
| 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é.
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)
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).
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í timing — NEMĚNÍ počet řádků ani polohu VSYNC. 3. CKMS frekvence — NEMĚ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.