Uživatelské nástroje

Nástroje pro tento web


lnxspectrum:asm_direktivy

Direktivy kompileru

Kompiler a jeho rozšířené funkce se ovládají pomocí direktív přímo ve zdrojovém kódu.

N = číslo o velikosti 1 bajtu, rozsah 0-255
NN = číslo o velikosti 2 bajtů, rozsah 0-65535

Direktíva od verze popis
ORG 1.0.8 definuje adresu v paměti, kam se bude ukládat následující generovaný strojový kód
ENT 1.0.8 definuje startovací adresu generovaného strojového kódu
EQU1.0.8 vytvoří nové návěstí a přiřadí mu konkrétní hodnotu
PUT 1.3.4 definuje adresu, kam se bude ukládat generovaný kód. Kód je ale spustitelný pouze pokud je na adrese definovanou ORG
ORGT 1.3.4 následující generovaný kód bude sice ukládán dle definice ORG, ale spustitelný bude pouze na adrese ORGT
ORGB 1.3.4 ruší definici ORGT
DEFB 1.0.8 uloží do paměti posloupnost bajtů, nebo text, každé písmeno jako jeden bajt
DEFW 1.0.8 uloží do paměti posloupnost čísel ve dvojbajtovém WORD formátu, nebo text, každé písmeno jako dva bajty.
DEFG 1.0.8 Jako DEFW, ale na rozdíl od DEFW ukládá data v big-endian formátu, tedy nejprve vyšší byte, a až potom nižší byte.
DEFM 1.0.8 jako defb, u textu změní u posledního písmena znaménko na zápornou hodnotu
DEFS 1.0.8 zapíše do paměti blok bajtů v určeném počtu
FILL 1.0.8 zapíše do paměti blok bajtů, dokud adresa nedosáhne nastavené hodnoty
HFILL 1.0.8 zapíše do paměti blok bajtů, dokud nižší bajt adresy nebude 0
INCLUDE, INCBIN 1.0.8 připojí obsah souboru nebo knihovnu
#MODEL 1.0.8 říká kompileru pro jaký model (ZX 48 / ZX 128 / Didaktik Gama) je náš projekt určen
#ROMPAGE 1.0.8 přepíná ROM stránky, pokud system obsahuje více ROM stran (například ZX 128)
#RAMPAGE 1.0.8 přepíná RAM stránky, pokud system obsahuje více RAM stran (například ZX 128, Didaktik Gama)
#ROM_WRITE_ENABLED 1.0.8 povoluje přepsat obsah ROM paměti generovaným strojovým kódem
#DIVIDE_RAMPAGE 1.6.5 přepíná RAM stránky v zařízení DivIDE
#region 1.3.0 slouží k usnadnění vyhledávání ve zdrojovém kódu
#endregion 1.3.5 slouží k usnadnění vyhledávání ve zdrojovém kódu
#color 1.3.5 slouží k barevnému označení částí kódu
#endcolor 1.3.5 slouží ke zrušení barevného označení kódu
#Macro 1.3.1 umožnuje vytvářet vlastní kódové sekvence
#Watch 1.6.1 Měří čas procesoru Z80
#WatchRes 1.6.1 Resetuje měřený čas procesoru Z80
#WatchReg 1.6.1 Zobrazuje aktuální hodnoty v určených registrech procesoru Z80
#IfUsed 1.6.7 Označuje začátek bloku, který se bude kompilovat jen v případě jeho použití.
#EndIf 1.6.7 Označuje konec bloku, který se bude kompilovat jen v případě jeho použití.
#Open, #Write 1.6.4a Umožňuje exportovat hodnoty návěstí do externího souboru
#Overlap_protect 1.7.9 Umožňuje vypnout ochranu kódu
#LnxBlitter_ram 1.7.2 Umožňuje vložit data při kompilaci do Interní paměti LnxBlitteru.
$minute, $hour, $day, $month, $year 1.8.4g Uloží aktuální datum nebo čas v textovém formátu.
#minute, #hour, #day, #month, #year 1.8.4g Uloží aktuální datum nebo čas v bytovém formátu.
!<návěstí> 1.3.0a slouží k usnadnění vyhledávání ve zdrojovém kódu

ORG

Syntax:

		ORG	adresa nebo návěstí

od této adresy se bude ukládat do RAM Spectra vygenerovaný strojový kód. Bez nastavení této adresy není možné zkompilovat projekt.

Příklad použití:

		ORG	50000

ENT

Syntax:

		ENT
		ENT	NN nebo návěstí

Tento příkaz nastaví adresu v RAM, odkud se bude náš projekt spouštět. Pokud není v našem assembleru nikde ENT definován, je automaticky nastaven na adresu prvního použití direktívy ORG.

Příklad použití:

		ENT	50000

EQU

Syntax:

NovéNávěstí	EQU	NN nebo návěstí

Vytvoří nové návěstí a přiřadí mu konkrétní hodnotu.

Příklad použití:

NoveNavesti:	EQU	65535

PUT

Syntax:

		PUT	adresa nebo návěstí

Někdy je potřeba vytvořit strojový kód spustitelný například ve videoram, ale uložit ho budeme chtít dočasně například od adresy 50000. ORG tedy nadefinuje kde má být kód spustitelný, a PUT definuje kam se bude kód ukládat. Kód se musí před spuštěním přemístit na adresu ORG.

Příklad použití:

		ORG	16384
		PUT	50000

ORGT

Syntax:

		ORGT	adresa nebo návěstí

Následující kód bude ukládán podle poslední definice ORG, ale uložený kód bude spustitelný pouze na adrese definovanou ORGT.

Příklad použití:

		ORG	50000
; kód spustitelný z adresy 50000
		ORGT	16384
; následující kód je spustitelný pouze po přenesení na adresu 16384

ORGB

Syntax:

		ORGB

ORGB ruší předchozí definici ORGT, následující kód bude opět spustitelný na aktuální adrese definovanou původně ORG.

Příklad použití:

		ORG	50000
; kód spustitelný z adresy 50000
		ORGT	16384
; následující kód je spustitelný pouze po přenesení na adresu 16384
		ORGB
; následující kód bude opět spustitelný z aktuální adresy, kam se kód ukládá

DEFB

Syntax:

		DEFB	N
		DEFB	N,N
		DEFB	"text"

nebo:

		DB	N
		DB	N,N
		DB	"text"

Uloží do RAM posloupnost bajtů, nebo text, každé písmeno jako jeden bajt.

Příklad použití:

		DEFB	0,7,255,13,"text text"
		DB	255,100,"text" 

Poznámka: Od verze 1.3.2 podporuje kódování znaků CP1250.


DEFW

Syntax:

		DEFW	NN
		DEFW	NN,NN
		DEFW	"text"

nebo:

		DW	NN
		DW	NN,NN
		DW	"text"

Uloží do RAM posloupnost čísel ve dvojbajtovém WORD formátu (0-65535), nebo text, každé písmeno jako dva bajty.

Příklad použití:

		DEFW	0,700,65535,13,"text text"
		DW	16,222,"text"

Poznámka: Od verze 1.3.2 podporuje kódování znaků CP1250.


DEFG

od verze 1.2.1 Syntax:

		DEFG	NN
		DEFG	NN,NN
		DEFG	"text"

nebo:

		DG	NN
		DG	NN,NN
		DG	"text"

Uloží do RAM posloupnost čísel ve dvojbajtovém WORD formátu (0-65535), nebo text, každé písmeno jako dva bajty. Na rozdíl od DEFW však ukládá data v big-endian formátu, tedy nejprve vyšší byte, a až potom nižší byte.

Příklad použití:

		DEFG	%1000000000000001 - uloží postupně bajty 128,1

DEFM

Syntax:

		DEFM	N
		DEFM	N,N
		DEFM	"text"

nebo:

		DM	N
		DM	N,N
		DM	"text"

Jako DEFB, uloží do RAM posloupnost bajtů, nebo text, každé písmeno jako jeden bajt. U posledního písmena je nastaven 7-bit na 1 (záporná hodnota). Bit se nastavuje u každého textu v uvozovkách. Využívají některé PRINT rutiny k identifikaci konce textu.

Příklad použití (u písmena „y“ ve slově „texty“ bude nastaven bit 7 na hodnotu 1):

		DEFM	0,"bubla",7,255,13,"texty"

DEFS

Syntax:

		DEFS	NN
		DEFS	NN,N

nebo:

		DS	NN
		DS	NN,N 

Vytvoří blok dat v RAM o délce NN. Nezapíše buď žádná data, nebo vyplní blok hodnotou N.

Příklad použití:

		ORG	50000
		DEFS	256,7

vyplní blok 256 bajtů hodnotou 7 od adresy 50000


FILL

Syntax:

		FILL	NN
		FILL	NN, N 

Zapíše do RAM nulové bajty až do zadané adresy NN. Zapisovaný bajt může mít i jinou hodnotu než nula, nastavenou N. V debugeru bude takto zapsaný blok dat označen jako DEFB.

Příklad použití:

		ORG	49000
		FILL	50000,255

vyplní blok od adresy 49000 až po 49999 hodnotou 255.


HFILL

Syntax:

		HFILL
		HFILL	N 

Zapíše do RAM nulové bajty, dokud nižší bajt adresy nebude 0. Zapisovaný bajt může mít i jinou hodnotu než nula, nastavenou N. Když se příkaz objeví např. na adrese 254, zapíše 2 bajty a aktuální adresa bude 256. Když se objeví na adrese 252, zapíše 4 bajty a aktuální adresa bude opět 256. V debugeru bude takto zapsaný blok dat označen jako DEFB.

Příklad použití:

		ORG	$80F0
		HFILL	128

vyplní blok hodnotou 128, dokud nižší byte aktuální adresy nebude 0. V tomto příkladu tedy od adresy $80F0 až po $80FF.


INCLUDE, INCBIN

Syntax:

		INCLUDE	"soubor.asm"
		INCLUDE	"soubor.bin"
		INCLUDE	"knihovna.lib"
		INCLUDE	"obrazek.png"
		INCBIN	"soubor.raw"

INCLUDE vloží obsah souboru nebo knihovnu. Kvůli kompatibilitě můžeme použít i INCBIN, ten ale připojuje pouze soubory RAW, BIN, BINC, SCR, SCRC. INCLUDE připojuje všechny co INCBIN, navíc RAM, LIB, SLB, ASM, PNG a JPG.

Příklad použití:

		INCLUDE	"zvuk.asm"
		INCLUDE	"obrazek.bin"
		INCBIN	"soubor.raw"

#MODEL

Syntax:

		#MODEL	48
		#MODEL	128
		#MODEL	DG

Říká kompileru pro jaký model počítače je projekt určen. ZX Spectrum 48, ZX Spectrum 128 nebo Didaktik Gama.

Příklad použití:

		#MODEL	128

#ROMPAGE

Syntax:

		#ROMPAGE 0 nebo 1

Říká kompileru do které ROM-page patří a kam se bude ukládat následující kód. Funguje pouze v režimu ZX Spectrum 128, který obsahuje dvě 16KB ROM. Určeno pro vytváření vlastních ROM pro model ZX 128.

Příklad použití:

		#ROMPAGE 0

#RAMPAGE

Syntax:

		#RAMPAGE N

Říká kompileru do které RAM-page je určen a bude se ukládat následující kód. Funguje pouze v režimu ZX Spectrum 128 (stránky 0-7) nebo Didaktik Gama (0-1). Při použití této direktívy je potřeba znovu definovat ORG. Pro ZX 128 by ORG měl být vyšší nebo rovno 49152, u Didaktiku Gama pak vyšší nebo rovno jak 32768.

Příklad použití:

		#RAMPAGE 6

		org	49152

		di
		halt

#DIVIDE_RAMPAGE

Syntax:

		#DIVIDE_RAMPAGE N

Následující kod, pokud je ORG v rozsahu 8192-16383 bude ukládán do paměti RAM v zařízení DivIDE (pokud je jeho emulace zapnutá). DivIDE 32KB obsahuje RAM strany 0-3, DivIDE 128KB obsahuje strany 0-15 a DivIDE 512KB obsahuje strany 0-63. Při použití této direktívy je potřeba znovu definovat ORG. ORG měl být vyšší nebo rovno 8192.

Příklad použití:

		#DIVIDE_RAMPAGE 3

		org	8192

		di
		halt

#ROM_WRITE_ENABLE

Syntax:

		#ROM_WRITE_ENABLE

Povolí zápis do ROM (rozsah 0-16383)

Příklad použití:

		#ROM_WRITE_ENABLE

#region

Syntax:

#region	název

Slouží k usnadnění vyhledávání ve zdrojovém kódu. Regionem se může rozdělit kód na části, například oddělit grafické či zvukové rutiny od ostatních. V seznamu regionů poté stačí kliknout na název regionu, a automaticky se vyhledá pozice regionu ve zdrojovém kódu. Nebo je možné pro lepší přehlednost region barevně označit, v tom případě se do řádku přidá kód barvy ve formátu #RGB (každá složka v HEX 0-F), například červená je #F00, zelená #0F0.

Příklad použití, vytvoření regionu v seznamu regionů:

#region Grafická knihovna

nebo jen barevně zvýraznit (stejná funkce jako #color):

#region #f60

nebo vytvořit region v seznamu regionů s barevným zvýrazněním:

#region Grafická knihovna #f60

nebo vytvořit nový region v seznamu regionů se stejnou barvou, jak byla definována v předchozí definici regionu:

#region Grafická knihovna #

#endregion

Syntax:

#endregion

Nepovinné. Ukončuje barevné zvýraznění regionu vytvořený direktivou #region jméno #barva.

Příklad použití:

#endregion

#color

Syntax:

#color #barva

Slouží k zvýšení přehlednosti zdrojového kódu. Části kódu si pomocí #color můžeme barevně zvýraznit. Kód barvy je ve formátu #RGB (každá složka v HEX 0-F), například červená je #F00, zelená #0F0.

Příklad použití:

#color #af0

#endcolor

Syntax:

#endcolor

Nepovinné. Ukončuje zvýraznění kódu vytvořeného direktivou #color #barva

Příklad použití:

#endcolor

#Watch

Syntax:

#watch nazev

Direktíva měří uplynulý čas procesoru Z80. Při průchodu programu touto direktívou se v okně Watch aktualizuje informace o tom, kolik času proběhlo od začátku běhu programu, nebo od poslední direktivy WatchRes (Watch Reset). Každý Watch má své jméno, můžeme měřit i více časů současně.

Příklad použití:

#watch rutina1

#WatchRes (Watch Reset)

Syntax:

#watchres nazev

Direktíva při průchodu programu vynuluje počítadlo času pro konkrétní měřič času.

Příklad použití:

#watchres rutina1
............
............
#watch rutina1

#WatchReg (Watch Register)

Syntax:

#watchreg register nazev 

Direktíva při průchodu programu vypíše v okně Watch obsah registru v daný čas.

Příklad použití:

#watchreg HL pozice 

#IfUsed, #EndIf

Syntax:

	#ifused

	#endif

Direktíva #ifused označí začátek bloku, který se bude kompilovat pouze v případě, že je volán z jiné části programu. Direktíva #endif označuje jeho konec.

Příklad použití:

		org	50000

		call	knihovna1
		di
		halt

#ifused
knihovna1:	ld	a,1
		ret
#endif

nebo také

		org	50000

		call	knihovna1
		di
		halt

{
knihovna1:	ld	a,1
		ret
}

#open, #write

Syntax:

	#open	#K,Path
	#write	#K,návěstí

Direktíva #open otevře možnost exportovat hodnoty vybraných Návěstí do externího souboru ASM (*.asm pro include do jiného projektu). Souborů může být maximálně otevřených 10. #K je číslo jednoho z 10 kanálů v rozsahu 0-9. Path je cesta, kam se bude soubor ukládat. Do takto otevřeného souboru se zapisuje pomocí direktívy #write.

Příklad použití:

		org	50000

navesti1:	di
		halt

		#open	#1,"c:/projekt/export.asm"
		#write	#1,navesti1

Po kompilaci se ve složce c:/projekt vytvoří soubor export.asm, ve kterém bude:

navesti1	equ	50000

#LnxBlitter_ram

Syntax:

	#LnxBlitter_ram enable
	#LnxBlitter_ram disable

Direktíva #LnxBlitter_ram přesměruje zapisovaná data do Interní paměti LnxBlitteru. Můžeme tedy při kompilování naplnit grafickou pamět Blitteru grafickými daty již při psaní našeho programu určeného pro LnxBlitter.

Příklad použití:

#LnxBlitter_ram enable

		org	50000


		include	"grafika.png"

#Overlap_protect

Syntax:

#overlap_protect_on
#overlap_protect_off

Direktíva zapíná nebo vypíná ochranu paměti proti přepsání samo sebou při kompilaci. Defaultně je zapnutá.

Pokud chceme uložit následující kód bez ochrany, Overlap vypneme, uložíme kód a ochranu opět zapneme. Uložený kód bude možné kompilerem přepsat, bez varování.

Příklad použití:

	org	32768

	#overlap_protect_off
	include "data.bin"
	#overlap_protect_on

	org	32768
	di
	halt

V našem případě se na adresu 32768 uloží soubor „data.bin“ v nechráněném režimu. Nasledující instrukce Di a Halt obsah vloženého souboru přepíší bez chybové hlášky.


Syntax:

!<návěstí>

Vykřičník před návěstím definuje vyšší důležitost návěstí, takže bude vidět v seznamu návěstí (Labels) bez zaškrtnutého „Show all labels“. Pro větší přehlednost se nebudou zobrazovat ostatní návěstí s nižší prioritou.

Příklad použití:

!Start		ret

zviditelní návěstí v záložce Labels

$minute, $hour, $day, $month, $year

Syntax:

$minute, $hour, $day, $month, $year

Vloží aktuální čas, nebo datum v textovém formátu. Funguje pouze s DEFB a DEFM.

Příklad použití:

	defb	"Created date: ",$day,".",$month,".20",$year

Zkompilovaná data v paměti budou „Created date: 16.11.2021“


#minute, #hour, #day, #month, #year

Syntax:

#minute, #hour, #day, #month, #year

Vloží aktuální čas, nebo datum v bajtovém formátu. Funguje pouze s DEFB a DEFM.

Příklad použití:

	defb	$day,$month,$year

Do paměti se zkompilují 3 bajty: 16,11,21


lnxspectrum/asm_direktivy.txt · Poslední úprava: 2021/11/16 21:44 autor: lanex

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki