05 — HBLN (Horizontal Blanking)

Základní informace

Signál HBLN (Horizontal Blanking) není vyveden na žádný pin GDG. Je dostupný pouze přes Status Register (port CEH čtení) jako bit 7:

bus_Status(7) = HBLN

Polarita: 0 = blanking aktivní, 1 = viditelná oblast (stejná konvence jako u ostatních status bitu).

Signálový řetězec

bus_COLUMN[7:0]
    |
    ├── NOR4(COLUMN[7:4]) → porovnani vyssi nibble
    |       radek 3412: net = NOT(C7 OR C6 OR C5 OR C4)
    |       → '1' kdyz COLUMN[7:4] = 0x0
    |
    ├── NOR4(COLUMN[3:0]) → porovnani nizsi nibble
    |       radek 2399: net = NOT(C3 OR C2 OR C1 OR C0)
    |       → '1' kdyz COLUMN[3:0] = 0x0
    |
    ├── NAND → detektor COLUMN = 0xB0
    |       radek 2885: vyuziva inverted bity pro match na 0xB0
    |       (= 10110000 bin)
    |
    └── xF616_80_14 → preteceni COLUMN citace
            radek 5603-5612: zachycuje carry-out horni 4-bit ctc

            ↓

xF615_141_25 (D flip-flop, radek 2688-2694)
    D = NOT( (O AND R) OR S )
    CLK = CLK0
    nRES = aktivni (normalne '1')
    O = bus_Status(7) = HBLN
    nO = (nepouzito primo)

kde:
    R = detektor COLUMN = 0xB0
    S = signal preteceni citace (konec radku)
    O = vlastni vystup (zpetna vazba)

Logika flip-flopu: - Když COLUMN dosahne 0xB0: R='1', D = NOT(O AND 1 OR 0) = NOT(O). Pokud O=0 (blanking), D=1 → na další CLK0 O=1 → visible zacina. - Když čítač pretece (konec řádku): S='1', D = NOT(x OR 1) = 0. Na další CLK0 O=0 → blanking zacina. - Mezi prechody: R='0', S='0', D = NOT(O AND 0 OR 0) = NOT(0) = 1 (nebo NOT(1)=0 pokud uz jsme v blanking) → stav se drzi.

Měření ze simulace

PAL, CKSW=0 (výchozí konfigurace)

Reference: sestupna hrana nHSYN (HSYNC falling edge).

Udalost CLK0 COLUMN Čas od HSYNC
HSYNC falling edge 0 0 µs
Visible zacina 335 0xB0 18.89 µs
Blanking zacina 975 0x72 54.97 µs
Parametr Hodnota
Délka řádku 1136 CLK0 (64.05 µs)
Viditelná oblast 640 CLK0 (36.08 µs)
Blanking oblast 496 CLK0 (27.97 µs)
COLUMN rozsah 0x72–0xFF (142 hodnot × 8 CLK0)

Viditelná oblast 640 CLK0 ma stejnou šířku jako canvas, ale není s nim zarovnana — viz následující sekce.

Porovnání: HBLN vs canvas (video timing z 02-video-timing.md)

                    CLK0: 335      340              975  979
                           |        |                |    |
HBLN visible:       =======|========|================|
Canvas output:              |========|================|====|
                           |  5 CLK0                 | 5 CLK0
                           |  posun                  | posun

Přesně pozice (mereno od HSYNC falling edge):

HSYNC puls:   CLK0   0–79    (80 CLK0)
Back porch:   CLK0  80–183   (104 CLK0)
Levy border:  CLK0 184–339   (156 CLK0)
Canvas:       CLK0 340–979   (640 CLK0)
Pravy border: CLK0 980–1111  (132 CLK0)
Front porch:  CLK0 1112–1135 (24 CLK0)

HBLN visible: CLK0 335–974   (640 CLK0)
HBLN blank:   CLK0 0–334 + 975–1135 (496 CLK0)

HBLN NENÍ 1:1 s canvasem. Obe oblasti jsou 640 CLK0 siroke, ale HBLN je posunuty o 5 CLK0 dopredu oproti canvasu:

Důvod: HBLN indikuje kdy GDG přistupuje do VRAM (zahajeni čtení), ne kdy se pixely objevi na výstupu. Mezi prectenim dat z VRAM a jejich zobrazenim je pipeline zpozdeni ~5 CLK0 (VRAM fetch → shift register → paleta → barevný výstup).

Z pohledu CPU/VRAM kontence je HBLN správný indikator — přesně označuje dobu, kdy GDG přistupuje do VRAM, tedy kdy CPU do VRAM sahat nemá. Z pohledu emulatoru generujiciho obraz je třeba HBLN posunout o 5 CLK0 aby odpovidalo skutecnemu canvas výstupu.

Vliv DMD režimu na HBLN i VBLN

Testovano pro tri režimy:

HBLN (horizontální blanking)

DMD Režim Visible (CLK0) Blank (CLK0) Prechody
0x00 320×200, 4 barvy 640 496 2
0x04 640×200, 2 barvy 640 496 2
0x08 MZ-700 kompatibilni 640 496 2

DMD režim NEMÁ žádný vliv na HBLN timing. Všechny tri režimy mají identické prechody na CLK0=335 a CLK0=975.

VBLN (vertikální blanking)

DMD Režim Visible (řádku) Blank (řádku) Total
0x00 320×200, 4 barvy 200 112 312
0x04 640×200, 2 barvy 200 112 312
0x08 MZ-700 kompatibilni 200 112 312

DMD režim NEMÁ žádný vliv ani na VBLN timing. Všechny tri režimy mají identický počet viditelnych (200) a blanking (112) řádku.

Důvod nezavislosti

Oba blanking signály jsou odvozeny výhradně z čítačů: - HBLN ← COLUMN čítač (horizontální pozice) - VBLN ← ROW čítač (vertikální pozice)

DMD registr ovlivňuje jen způsob čtení VRAM dat (počet rovin, šířku pixelů), ale ne COLUMN ani ROW čítač. Blanking timing je proto na grafickém režimu zcela nezávislý.

Vliv CKSW bitu (Superimpose / Clock Switch)

CKSW (port 07CFH, bit 7) mění předvolbu COLUMN čítače.

CKSW Délka řádku Visible start Blank start Visible Blank
0 (výchozí) 1136 CLK0 CLK0=335 CLK0=975 640 496
1 (60 Hz) 1120 CLK0 CLK0=335 CLK0=975 640 480

CKSW=1 zkracuje řádek o 16 CLK0 (2 hodnoty COLUMN čítače). Pozice HBLN přechodu vuci HSYNC se nemění — zkracuje se pouze blanking oblast (front porch).

Viditelná oblast zůstává 640 CLK0 v obou případech.

Vliv NTPL propojky (PAL/NTSC)

NTPL (pin 83) kompletne mění horizontální timing.

NTPL Systém Délka řádku Visible start Blank start Visible Blank
0 PAL 1136 CLK0 CLK0=335 (COL=0xB0) CLK0=975 (COL=0x72) 640 496
1 NTSC 912 CLK0 CLK0=191 (COL=0xB0) CLK0=831 (COL=0x8E) 640 272

V NTSC režimu: - Řádek je kratsi o 224 CLK0 (1136→912) - HBLN prechody se posouvaji — visible zacina driv (CLK0=191 vs 335) - Viditelná oblast je stále 640 CLK0 (80 hodnot COLUMN × 8 CLK0) - Blanking se zkracuje z 496 na 272 CLK0 - COLUMN při visible startu je stále 0xB0 — HBLN flip-flop reaguje na stejnou COLUMN hodnotu v obou režimech - COLUMN při blank startu se liší: 0x72 (PAL) vs 0x8E (NTSC) — to odpovídá ruznym COLUMN preset hodnotam

Prevod na pixely

HBLN pracuje na úrovni COLUMN čítače (granularita 8 CLK0):

Režim Pixel clock CLK0/pixel HBLN granularita
320×200 8.867 MHz 2 4 pixely
640×200 17.734 MHz 1 8 pixelů

Přesně pixelove pozice přechodu:

320×200 režim (2 CLK0/pixel): - HBLN visible: pixel 167 (CLK0 335 / 2) — tj. 167 pixelů před canvasem (ale canvas zacina až na pixelů 170, viz poznámka výše o 5 CLK0 posunu) - HBLN blank: pixel 487 (CLK0 975 / 2) — 487 = 167 + 320

640×200 režim (1 CLK0/pixel): - HBLN visible: pixel 335 - HBLN blank: pixel 975 — 975 = 335 + 640

Praktické využití

Pro software MZ-800 (VRAM přístup)

HBLN indikuje dobu, kdy GDG aktivne přistupuje do VRAM. CPU může bezpečné pristupovat do VRAM když HBLN=0 (blanking).

Typické použití:

cteni_statusu:
    IN A,(0CEH)     ; cteni Status Registru
    BIT 7,A         ; test HBLN bitu
    JR NZ,cteni_statusu  ; cekej dokud HBLN=1 (GDG cte VRAM)
    ; zde je HBLN=0 → bezpecny pristup do VRAM

Čas dostupný pro CPU během blanking: - PAL: 496 CLK0 = 27.97 µs (~99 T-stavu CPU při 3.547 MHz) - NTSC: 272 CLK0 = 15.34 µs (~54 T-stavu CPU)

Pro emulator (generování obrazu)

HBLN neoznacuje presnou pozici canvas pixelů na výstupu. HBLN vede o 5 CLK0 před skutecnym canvas vystupem.

Pro správně generování obrazu v emulatoru: - Canvas zacatek = HBLN visible + 5 CLK0 = CLK0 340 (PAL) - Canvas konec = HBLN blank + 5 CLK0 = CLK0 980 (PAL) - Alternativne: použít přímo COLUMN hodnoty z 02-video-timing.md

Shrnutí

Vlastnost Hodnota
Signál bus_Status(7)
Polarita 0=blank, 1=visible
Zdroj COLUMN čítač (flip-flop xF615_141_25)
Visible start COLUMN = 0xB0 (vždy, nezavisle na konfiguraci)
Blank start přetečení COLUMN čítače (závisí na presetu)
Visible šířka 640 CLK0 = 80 COLUMN hodnot (vždy)
Posun vuci canvasu 5 CLK0 dopredu (VRAM read pipeline)
Vliv DMD žádný
Vliv CKSW mění délku řádku (blank se zkrati), visible nezmenena
Vliv NTPL mění délku řádku a pozici přechodu, visible nezmenena