Toto je starší verze dokumentu!
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 |
EQU | 1.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) |
#DIVIDE_RAMPAGE | 1.6.5 | přepíná RAM stránky v zařízení DivIDE |
#ROM_WRITE_ENABLED | 1.0.8 | povoluje přepsat obsah ROM paměti generovaným strojovým kódem |
#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 |
#LnxBlitter_ram | 1.7.2 | Umožňuje Vložit data při kompilaci do Interní paměti LnxBlitteru. |
!<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
!<návěstí>
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