Obsah
ULA Plus
ULA Plus je upravený zákaznický čip, starající se v ZX Spectrum mimo jiné o grafické funkce. V ZX Spectru oficiálně nikdy nasazen nebyl, jedná se o čip vyvinutý komunitou nadšenců. Podobných nápadů i s lepšími výsledky je víc, například Spec256, rozdíl je však v tom že ULA Plus je myšlena jako reálně vyměnitelný čip za původní čip ULA v originálním ZX Spectrum. Nevím jestli se to někdy zrealizovalo, nebo jestli to skončilo jen u testů ve FPGA / CPLD. Z mého pohledu by se mi moc líbilo, kdyby ULA Plus byla oficiálně ve své době montována do ZX Spectrum 128, protože by si takové rozšíření zasloužila.
ULA Plus rozšiřuje počet barev zobrazených současně na obrazovce z 16ti (originál ZX) na 64, a každá z těchto barev je vybrána z palety 256 barev. Na výběr jsou tyto barvy:
ZX Spectrum toto rozšíření nijak nezatěžuje, protože ULA Plus nemá žádné paměťové nároky navíc, ani pro svou funkci nepotřebuje asistenci procesoru. Systémové nároky jsou stejné jako u originálního ULA čipu.
Ukázka, vlevo originál, vpravo stejný obrázek, jen s jinou paletou:
Ukázka několika pěkných konverzí obrázků z C64:
ULA Plus funkce a ovládání
Porty
ULA Plus se ovládá přes dva porty, podobně, jako AY čip:
48955 | zápis | Výběr registeru (0-64) |
65339 | zápis/čtení | Obsah registru |
Registrů má ULA Plus 65. Od 0 do 63 je to nastavování a čtení obsahu indexových barev, ve 64 registru se prvním bitem povolují funkce ULA Plus. Hodnota barvy je obsažená v jednom bajtu:
0xGGGRRRBB | |
bity 0-1 | modrá složka (0-3) |
bity 2-4 | červená složka (0-7) |
bity 5-7 | zelená složka (0-7) |
Atributy ve videoram
ULA Plus interpretuje atributy barev (22528-23295) následovně:
bity | originální ULA | ULA Plus |
---|---|---|
0-2 | barva inkoustu | barva inkoustu |
3-5 | barva podkladu | barva podkladu |
6-7 | Bright 1, Flash 1 | výběr alternativní palety (0-3) |
Barevný register se vybere podle následujícího vzorce:
vybraná paleta | Spectrum barva | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|---|
0 | Ink | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
0 | Paper | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
1 | Ink | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
1 | Paper | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
2 | Ink | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
2 | Paper | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
3 | Ink | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
3 | Paper | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
Takže pokud budeme chtít například z BASICu vybrat barvu inkoustu nastavenou v registru 50, napíšeme:
FLASH 1: BRIGHT 1: INK 2
Příkazem FLASH a BRIGHT tedy vybíráme alternativní paletu (0-3), INK pak vybírá barvu z registrů 0-7, PAPER pak z registrů 8-15. Funkce FLASH blikání ani BRIGHT zvýšení jasu v režimu ULA Plus nefunguje.
Border barva
Border barva se výbírá vždy z registrů 8-15. BORDER 0 je tedy barva v registru 8, BORDER 7 je barva v registru 15.
ULA Plus Verze 1.1
Ve verzi 1.0 došlo k rozšíření registru o možnost měnit grafické režimy alá Timex. Od verze 1.1 můžeme přímo při výběru registru 64 nastavit grafický režim. Už to také není registr. Bit 6 určuje zda se aktivuje Palette group (0) nebo mode group (1).
Inicializace by měla probíhat následovně. Na port 48955 pošleme hodnotu 64 (mode group) + screen mode. Následně pošleme 1 na port 65339, tím ULA+ aktivujeme.
Screen mode
1 byte (01cccmmm)
mmm | Screen mode |
---|---|
000 | screen 0 (original Timex) |
001 | screen 1 (original Timex) |
010 | hi-colour (original Timex) |
011 | hi-colour (bank 7) |
100 | screen 0 (bank 7) |
101 | screen 1 (bank 7) |
110 | hi-res (original Timex) |
111 | hi-res (bank 7) |
V případě použití HiRes režimu, je k dispozici 8 barevných kombinací (Ink on Paper).
ccc | Color |
---|---|
000 | Black on White |
001 | Blue on Yellow |
010 | Red on Cyan |
011 | Magenta on Green |
100 | Green on Magenta |
101 | Cyan on Red |
110 | Yellow on Blue |
111 | White on Black |
Inicializace
Po resetu ZX Spectra jsou všechny barvy nastavené na 0 - černou. Pokud tedy jen zapneme funkce ULA Plus, obrazovka bude černá. Je potřeba nastavit barvy.
Aktualizace: Ve verzi 1.1 a HW SLAM se již nastavují defaultní barvy. Nejsou tedy jen černé.
Inicializace a nastavení barev může v ASM vypadat takhle:
; LnxSpectrum ASM editor (www.ilnx.cz) org 50000 ld a,64 ; Zapneme funkce ULA Plus ld bc,$bf3b out (c),a ld a,1 ld b,$ff out (c),a ld hl,barvy ; a nahrajeme 64 indexových barev ld d,0 ulaplus: ld a,(hl) inc hl ld b,$bf out (c),d ld b,$ff out (c),a inc d ld a,d cp 64 jr nz,ulaplus ret ; a vrátíme se do BASICu ;Zde jsou definice nejpodobnějších barev ke standardním barvám originální ULY: barvy: defb $00, $02, $18, $1b, $c0, $c3, $d8, $db ; INK defb $00, $02, $18, $1b, $c0, $c3, $d8, $db ; PAPER defb $00, $03, $1c, $1f, $e0, $e3, $fc, $ff ; +BRIGHT defb $00, $03, $1c, $1f, $e0, $e3, $fc, $ff defb $db, $d8, $c3, $c0, $1b, $18, $02, $00 ; +FLASH defb $db, $d8, $c3, $c0, $1b, $18, $02, $00 ; defb $ff, $fc, $e3, $e0, $1f, $1c, $03, $00 ; +BRIGHT/+FLASH defb $ff, $fc, $e3, $e0, $1f, $1c, $03, $00