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).
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á |
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
| 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ů.
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.
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).
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).
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).
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í.
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).
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!
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ý ✓ |
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)
Obsah DRAM po zapnutí (pozorováno na reálném HW):
FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 (perioda 2)
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.
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á |
sim/test_video.py — test test_coldstart_vramsim/vram_model.py — vzor "coldstart"