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