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).
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.
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.
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.
Testovano pro tri režimy:
| 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.
| 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.
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ý.
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.
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
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
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)
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
| 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 |