11 — Paletový systém a barvy

Paletový registr (port F0H, zápis)

Bit:  7    6    5    4    3    2    1    0
      X    SW   S1   S0   I    G    R    B

Čtení z F0H vrací stav joysticku 1 (nesouvisí s paletou).

Výchozí paleta po resetu

Po resetu (studeném i teplém) jsou paletové registry nulové: všechny 4 palety → IGRB = 0000 (černá).

ROM monitor na adrese E8E1H inicializuje paletu. Typické nastavení:

Paleta IGRB Barva
0 0000 černá
1 0101 azurová
2 0110 žlutá
3 0111 bílá

Signálový řetězec v GDG_core

bus_inPAL[0-3]     paletové registry (F601 latche)
    ↓
bus_outPAL[0-3]    NAND mux (výběr palety podle bus_PALET)
    ↓
bus_BRGI[3:0]      4× NAND: BRGI(n) = NAND(outPAL_n[3:0])
    ↓
bus_INK_BKG[3:0]   MUX: MZ-800 grafika (BRGI) vs MZ-700 text (INK)
    ↓                   *** BIT SWAP: INK_BKG(3)↔RBGI(0), INK_BKG(0)↔RBGI(3) ***
bus_RBGI[3:0]      MUX: border (BORDER) vs obsah (INK_BKG)
    ↓
F666 flip-flop     výstupní registr, nO (invertovaný výstup)
    ↓
výstupní piny      YITN, GREEN, RED, BLUE

Mapování BRGI → výstupní piny

bus_BRGI bit Význam → bus_RBGI → Pin
BRGI(3) B (blue) RBGI(0) o_BLUE
BRGI(2) G (green) RBGI(2) o_GREEN
BRGI(1) R (red) RBGI(1) o_RED
BRGI(0) I (intensity) RBGI(3) o_YITN

Pozn.: V BORDER muxu se prohazují bity 0↔3 (bus_INK_BKG(3) → bus_RBGI(0) a naopak). To je záměrné — BORDER sběrnice má jiné pořadí bitů.

Opravené bugy (viz 04-opravy-netlistu.md)

Bug 1: Write CLK — prohození S0↔S1 (OPRAVENO v GDG_core.vhd)

Při zápisu palety (port F0H) byly bity S0 a S1 (index palety) prohozeny v CLK dekodéru. Palety 1↔2 se zapisovaly do špatných registrů. Opraveno záměnou výrazů v řádcích 3763 a 4027.

Bug 2: VramModel — chybějící page-mode DRAM (OPRAVENO)

Původně popsáno jako "SEL_B navždy 0 — plane II se nepropaguje". Příčina NEBYLA v netlistu — signálové cesty v GDG_core.vhd jsou korektní. Problém byl v simulačním modelu VRAM, který nepodporoval page-mode přístup (více ČAS cyklů v jednom RAS).

GDG čte plane I a plane II sekvenčně v oddělených ČAS cyklech (flip-flop xF635_20_20 alternuje latch clock pro každý plane).

Stav po opravách

Oba bugy opravený. Palety fungují správně v 4-barevném režimu. Coldstart obraz: černo-bílé pruhy (správně, jako reálný HW).

Původní analýza bus_INK (historická, před opravou VramModel)

bus_INK chování v 4-bar. režimu (před opravou VramModel — bus_INK(0) a bus_INK(1) byly stuck kvůli chybějícímu page-mode):

bus_INK chování v 4-bar. režimu:

bus_INK bit Zdroj FF Výstup Závislost Stav
INK(0) xF631_15_4 O 0 (stuck) NEFUNKČNÍ
INK(1) xF631_96_24 O 0 (stuck) NEFUNKČNÍ
INK(2) xF631_54_21 nO variabilní VC bus (planes III/IV) OK
INK(3) xF631_98_25 nO variabilní VA[3:0] (plane I) OK

Důsledek: SEL_B = bus_INK(1) = 0 vždy → při renderování se nikdy nevyberou palety s SEL_B=1 (tj. inPAL0 a inPAL2).

Bug 3: Omezený výběr — jen 2 z 4 palet

Select signály v 4-barevném režimu: - SEL_A = bus_INK(3) = NOT(plane I bit) — závisí na VRAM - SEL_B = bus_INK(1) = 0 — trvale

Mapování NAND muxu:

SEL_A SEL_B Vybraný registr Skutečný obsah (s bug 1)
1 0 inPAL1 data palety 2
0 0 inPAL3 data palety 3
1 1 inPAL0 data palety 0 — NEDOSTUPNÉ
0 1 inPAL2 data palety 1 — NEDOSTUPNÉ

V praxi: plane I = 0 → zobrazí paletu 2, plane I = 1 → zobrazí paletu 3. Plane II je ignorován. Palety 0 a 1 se nikdy nepoužijí.

Diagnostický test (ověřeno simulací)

Palety: 0=azurová(0101), 1=žlutá(0110), 2=sv.modrá(1001), 3=sv.červená(1010)

Pixel index VA VC INK SEL Výstup IGRB Očekáváno
0 (00) 0x00 0x00 1100 1,0 1001 0101 BUG
1 (01) 0x0F 0x00 0100 0,0 0011 0110 BUG
2 (10) 0xF0 0x00 1100 1,0 1001 1001 OK (náhoda)
3 (11) 0xFF 0x00 0100 0,0 0011 1010 BUG

Pixel 2 je "správný" jen náhodou — SEL vybere inPAL1, kde je palette 2 data (kvůli write swap).

Interní datové cesty (trasováno v netlistu)

bus_AB sběrnice (8 bitů, invertovaná kopie DT):

bus_AB DT bit Význam Cíl
AB(0) DT(0) B inPAL0(0), inPAL1(0)
AB(1) DT(1) R inPAL0(1), inPAL1(1)
AB(2) DT(2) G inPAL0(2), inPAL1(2)
AB(3) DT(0) B inPAL2(0), inPAL3(0)
AB(4) DT(1) R inPAL2(1), inPAL3(1)
AB(5) DT(2) G inPAL2(2), inPAL3(2)
AB(6) DT(3) I inPAL2(3), inPAL3(3)
AB(7) DT(3) I inPAL0(3), inPAL1(3)

Pozn.: bus_AB(0:2,7) a bus_AB(3:6) jsou dvě paralelní skupiny se stejnými IGRB daty, každá pro 2 paletové registry.

outPAL NAND mux — bitové mapování:

BRGI bit Význam outPAL index Čte z inPAL bit
BRGI(3) B outPAL3 inPAL_x(0)
BRGI(2) G outPAL2 inPAL_x(2)
BRGI(1) R outPAL1 inPAL_x(1)
BRGI(0) I outPAL0 inPAL_x(3)

Select signály v 4-bar. režimu (DMD=0x00):

SEL_A = net_F105_137_19_in
      = NOT((xF631_98_25.O AND 1) OR (0 AND pixel_bit))
      = NOT(xF631_98_25.O)
      = bus_INK(3)     ← plane I bit (invertovaný)

SEL_B = net_F105_126_18_in
      = NOT(0 OR net_F302_42_21_out)
      = NOT(NOT(bus_INK(1)))
      = bus_INK(1)     ← stuck at 0!

Dopad na obraz

S VRAM coldstart vzorem (FF 00 FF 00...) a ROM paletou (0=černá, 3=bílá):

Očekávaný obraz (reálný HW) Simulace
Pruhy černo-bílé červeno-bílé
Border černý černý ✓

Pravděpodobná příčina

Všechny tři bugy jsou konzistentní s chybami extrakce netlistu nástrojem gdg2vhdl: - Bug 1: Prohození dvou vstupních signálů v CLK dekodéru - Bug 2: Chybějící propojení plane II dat do shift registru/muxu - Bug 3: Důsledek bugu 2 (SEL_B nemá data)

VRAM coldstart vzor

Obsah DRAM po zapnutí (pozorováno na reálném HW):

Základní VRAM (roviny I+II, VA bus)

FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00  (perioda 2)

Externí VRAM (roviny III+IV, VC bus)

FF FF 00 00 FF FF 00 00 FF FF 00 00 FF FF 00 00  ×8 řádků (128 B)
00 00 FF FF 00 00 FF FF 00 00 FF FF 00 00 FF FF  ×8 řádků (128 B)

Perioda 4 bajty, fáze se překlápí každých 128 bajtů.

Pozn.: Adresy jsou z pohledu Z80 CPU. Mapování CPU → fyzické DRAM adresy (RAS/ČAS) zatím není ověřeno.

16 IGRB barev

RGB hodnoty z Barvy.htm (Pavel Brázda), NE CGA aproximace:

IGRB Hex R G B Barva
0000 #000000 0 0 0 černá
0001 #4040AC 64 64 172 modrá
0010 #D03400 208 52 0 červená
0011 #B40C8C 180 12 140 purpurová
0100 #406C00 64 108 0 zelená
0101 #24CCFF 36 204 255 azurová
0110 #E8D430 232 212 48 žlutá
0111 #D0D0D0 208 208 208 bílá
1000 #848484 132 132 132 šedá
1001 #008CE8 0 140 232 sv. modrá
1010 #FF0000 255 0 0 sv. červená
1011 #F054CC 240 84 204 sv. purpurová
1100 #54FF54 84 255 84 sv. zelená
1101 #80FFFF 128 255 255 sv. azurová
1110 #FFFF28 255 255 40 sv. žlutá
1111 #FFFFFF 255 255 255 jasně bílá

Testovací soubory