======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 [[https://www.ilnx.cz/download/examples/example_01.7z|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...{{:hgfx:example01.jpg?nolink}}
... 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!