Uživatelské nástroje

Nástroje pro tento web


hgfx:prvnigrafika2

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…example01.jpg

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

hgfx/prvnigrafika2.txt · Poslední úprava: 2022/10/22 22:59 autor: lanex

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki