Assembler
V LnxSpectrum assembleru si vytvoříme nový projekt, a začneme psát náš první HGFX kód. Nebo protože jsme lenoši si jej stáhneme již hotový jako LnxAssembler project do LnxSpectrum. Odkaz zde. Nezapomeňte také LnxSpectrum aktualizovat. Ve starších verzích emulátoru HGFX ještě obsažené ve finální podobě nebylo.
Kód není nijak optimalizovaný, je psaný pro pochopení, ne na rychlost nebo efektivitu.
Hlavní kód
Projekt budeme mít na adrese 32768. Jako první si nadefinujeme gZXi port pro zapnutí HGFX. Následně HGFX aktivujeme.
; LnxSpectrum ASM editor (www.ilnx.cz) 28.07.2022 ; Example 1 org 32768 gZXi equ 0x7C3B ;General ZXI port ;HGFX Init Start ld bc,gZXi ld a,1 ;Zapneme režim HGFX LowRes out (c),a inc b ld a,3 out (c),a dec b
Nyní nastavíme Linearní režim, Border v barvě indexu 0 a vypneme Transparenci.
ld a,32 ;HGFX - general settings out (c),a inc b ld a,7 ;b0=Linear, b1=Border Index (dle portu 254), b2=Transparency Off out (c),a dec b xor a ;Border Index 0 out (254),a
Nyní nastavíme adresy Videoram, barevné palety a adresu registru, které budeme mít připravené na konci souboru.
ld a,33 ;Videoram out (c),a inc b ld a,(h)HGFX.vid ;(highbyte)Videoram (16384/256) out (c),a dec b ld a,34 ;Registers out (c),a inc b ld a,(h)HGFX.VParam ;(highbyte)Registers out (c),a dec b ld a,35 ;Paleta out (c),a inc b ld a,(h)HGFX.Colors ;(highbyte)Color table (22528/256) out (c),a
Nyní, když HGFX ví kde má registry, paletu a videoram, můžeme do ní nahrát připravenou paletu barev co máme na konci souboru. Jedná se pouze o 4 barvy. 4x 3 Bajty (Blue, Green, Red).
ld hl,paleta ;zde máme připravené barvy ld de,HGFX.Colors ;adresa HGFX palety ld bc,12 ;4 barvy po třech složkách, to máme 12 B ldir
Nastavení portů a paletu máme hotovou. Nyní budeme nastavovat registry. Buffer budeme využívat jen první, tedy „A“.
ld a,0b000 ;b0=Visible Buffer A, b1=Destination Buffer A, b2=Source Buffer A ld (HGFX.VParam),a
Protože nevíme, jak jsou nastaveny Offsety, všechny vynulujeme.
ld hl,0 ld (HGFX.D_OffX),hl ld (HGFX.D_OffY),hl ld (HGFX.S_OffX),hl ld (HGFX.S_OffY),hl
Také nevíme co v Bufferu zůstalo z minula. Proto ho vymažeme. Vymazat znamená všude nastavit Indexovanou barvu 0. Aby se změna projevila všude ve všech vrstvách, nastavíme aktivní všech 8 vrstev pomocí PMask. Co bit v registru, to jedna vrstva. Mazat budeme pomocí režimu INK.
Vzorec je takový, že všude tam, kde zapisujeme do Videoram procesorem hodnotu 255 (tedy 8 pixelů vedle sebe), se nastaví Indexová barva 0.
ld a,0 ;Nastavíme INK Mode. ld (HGFX.PMode),a ld a,0 ;Nastavíme Indexovou barvu 0. ld (HGFX.SColor),a ld a,255 ;Zápis se bude týkat všech planar vrstev. ld (HGFX.PMask),a ;(každý bit zastupuje jednu vrstvu) ld hl,HGFX.vid ;CLS ld de,HGFX.vid+1 ld bc,6143 ld (hl),255 ;Změna se týká všech 8 pixelů ldir ;Vyplníme indexem 0
Nyní vykreslíme první obdelník. Je to primitivní rutina, která vyplní ve videoram 14 bajtů hodnotou 255 a 18 následně přeskočí. Tohle 80x zopakuje. Tím na obrazovce vykreslí obdelník. Budeme ho kreslit barvou 1, a jen do první vrstvy (PMask = 1).
ld a,1 ;Nastavíme Indexovou barvu 1. ld (HGFX.SColor),a ld a,1 ;Zápis se bude týkat první planar vrstvy. ld (HGFX.PMask),a ld c,80 ;Výška obdelníku v px ld hl,HGFX.vid+1028 ;Adresa levého horního pixlu ve videoram ld a,255 ;tímhle budeme vyplňovat ld de,18 ;tolik B vždy přeskočíme .obd1_1 ld b,14 ;tolik vždy vykreslíme .obd1_2 ld (hl),a inc hl djnz .obd1_2 add hl,de dec c ;další linka jr nz,.obd1_1
Nyní vykreslíme druhý obdelník, úplně stejnou metodou, jen na jiné místo na obrazovce. A pro změnu barvou č. 2 a jen do druhé vrstvy (PMask = 2).
ld a,2 ;Nastavíme Indexovou barvu 2. ld (HGFX.sColor),a ld a,2 ;Zápis se bude týkat druhé planar vrstvy. ld (HGFX.pMask),a ld c,80 ;Výška obdelníku v px ld hl,HGFX.vid+2060 ;Adresa levého horního pixlu ve videoram ld a,255 ;tímhle budeme vyplňovat ld de,18 ;tolik B vždy přeskočíme .obd2_1 ld b,14 ;tolik vždy vykreslíme .obd2_2 ld (hl),a inc hl djnz .obd2_2 add hl,de dec c ;další linka jr nz,.obd2_1
Oba obdelníky jsou vykresleny. Zastavíme procesor.
di ;Stop Processor halt ;======================================================================================
Registry a data
Na samotný konec programu přidáme připravené hodnoty barev a registry, na které se na začátku odkazujeme.
;Paleta barev paleta defb 0,0,0 ;Index 0 (B,G,R) defb 0,180,222 ;Index 1 defb 222,0,150 ;Index 2 defb 222,180,255 ;Index 3
Nyní připojíme vlastní registry. Musíme zajistit, aby registry HGFX začínali na adrese dělitelné 256. Je to proto, že do HGFX posíláme pouze nejvyšší Byte adresy. Nižší je vždy 0.
;HGFX registers hfill 0 ;Musí začínat na xx00h, vyplníme 0.
A následně vložíme registry. Také zde definujeme kde se bude nacházet Videoram a kde budou barevné registry. Defaultní hodnoty není možné zapisovat přímo v defb / defw. System HGFX hodnoty přebírá pouze při zápisu do nich. Takže zde se jen rezervuje prostor pro registry a je potřeba do nich softwerově aktuální hodnoty zapsat. To děláme při inicializaci / spuštění našeho programu.
!HGFX .vid equ 16384 ;Videoram .colors equ 22528 ;Color palette .VParam defb 0 ;Video parameters .PMode defb 0 ;Ink/Copy mode .ACommand defb 0 ;Advanced commands .SColor defb 0 ;Selected Color Index .PMask defb 0 ;Planar Mask .D_OffX defw 0 ;Destination OffsetX (W) .D_OffY defw 0 ;Destination OffsetY (W) .S_OffX defw 0 ;Source OffsetX (W) .S_OffY defw 0 ;Source OffsetY (W) .AGF defb 0 ;Advanced Graphics Feature .SPColor defb 0 ;Paper Color .FPMask defb 0 ;Fill Plannar Mask
Nyní ještě zajistíme, aby za registry bylo volné místo. Je to z důvodů budoucí kompatibility software s HGFX. HGFX je stále ve vývoji a registry se můžou rozšířit. Necháme jim tedy prostor celkem 32 bajtů.
fill HGFX+32,0 ;Fill to 32
Hotovo. Spustíme program tlačítkem Start. A pokud vidíme na obrazovce toto…
… je vše vpořádku. První obdelník je ve vrstvě 1 (binárně 00000001), druhý je ve vrstvě 2 (binárně 00000010). Takže tam kde došlo k prolnutí obdelníků, vznikla binárně barva 00000011. A to je právě ta barva na indexu 3.
Blahopřeju. Váš první příklad v HGFX jste zvládl!