======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!