~~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|INCLUDE]] |1.0.8 |připojí obsah souboru nebo knihovnu | |[[asm_direktivy#INCBIN|INCBIN]] |1.0.8 |připojí obsah souboru | |[[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#MB03_RAMPAGE|#MB03_RAMPAGE]] |1.7.6 |přepíná RAM stránky v zařízení MB03+ | |[[asm_direktivy#ELEMENT_RAMPAGE|#ELEMENT_RAMPAGE]] |1.9.0 |přepíná RAM stránky v zařízení Element | |[[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 ==== Syntax: INCLUDE "soubor.asm" INCLUDE "soubor.bin" INCLUDE "knihovna.lib" INCLUDE "obrazek.png" INCLUDE vloží obsah souboru nebo knihovnu. INCLUDE připojuje soubory a pokud je rozezná, kompiluje. Podporuje RAW, BIN, BINC, SCR, SCRC, RAM, LIB, SLB, ASM, PNG a JPG. Příklad použití: INCLUDE "zvuk.asm" INCLUDE "obrazek.bin" ----- ==== INCBIN ==== Syntax: INCLUDE "soubor.bin" INCBIN "soubor.raw" INCBIN vloží obsah souboru. INCBIN připojí jakýkoliv soubor jako data do projektu, bez ohledu na jejich koncovku. Příklad použití: INCLUDE "zvuk.asm" INCLUDE "obrazek.bin" INCBIN "soubor.raw" === Vkládání velkých souborů do zařízení Element === Pokud používáme Element zařízení a chceme do URAM připojit data o velké velikosti (například 1 MB soubor WAV), můžeme použít právě Incbin. #ELEMENT_RAMPAGE p0+ 10 ORG 0 INCBIN "sample.bin" ;pro příklad 128 KB soubor Definice p0+ právě kompileru říká že se bude vkládat velký soubor dat. Musí začínat vždy v Area 0. Poté se data nahrají do URAM začínající na adrese definovanou RamPage. Náš příklad nahraje 128 KB soubor do paměti URAM. Zaplní konkrétně RamPage 10-25. Pokud potřebujeme znát Absolutní adresu v URAM, například pro sDMA, ta se vypočítá: ABS=RamPage*8192 v našem případě ABS=10*8192, tedy 81920. ----- ==== #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 ----- ==== #ELEMENT_RAMPAGE ==== Syntax: #ELEMENT_RAMPAGE pN NN Říká kompileru do které URAM je určen a bude se ukládat následující kód. Funguje pouze v režimu Element. Element obsahuje 2 nebo 4 MB rozšířené URAM, rozdělené po 8 KB. jsou to tedy stránky 0-175, v případě rozšířené paměti 0-431. Při použití této direktívy je potřeba znovu definovat ORG. Parametr "p" ("Protected") znamená že se jedná o chráněnou paměť Elementu. Číslo definuje Zónu a Area kde se bude URAM mapovat. Číslo Area může být v rozsahu 0-7. Paměť Elementu ze rozděluje na 4 zóny o velikosti 16384 B, každá z nich je rozdělená na dvě Area. V Zóně 0 je to například Nižší (0-8191) a Vyšší (8192-16383): Zóna 0 (adresa 0-16383) obsahuje Area 0 a Area 1.\\ Zóna 1 (adresa 16384-32767) obsahuje Area 2 a Area 3.\\ Zóna 2 (adresa 32768-49151) obsahuje Area 4 a Area 5.\\ Zóna 3 (adresa 49152-65535) obsahuje Area 6 a Area 7. Příklad použití: #ELEMENT_RAMPAGE p0 500 ;nastaví Zone na 0 Area 0, URAM Page 500 org 0 di ;zapíše do URAM Page 500 halt Jiný příklad: #ELEMENT_RAMPAGE p6 500 ;nastaví Zone na 3 Area 0, RamPage 500 #ELEMENT_RAMPAGE p7 501 ;nastaví Zone na 3 Area 1, RamPage 501 org 49152 di ;zapíše do RamPage 500 halt ----- ==== #MB03_RAMPAGE ==== Syntax: #MB03_RAMPAGE pN NN Říká kompileru do které části URAM je určen a bude se ukládat následující kód. Funguje pouze s připojeným interface MB03+ který obsahuje 16 MB URAM. URAM je rozdělena po 8 KB RamPages. RamPage může být tedy v rozsahu 0-1919. Při použití této direktívy je potřeba znovu definovat ORG. Paměť MB03+ se může mapovat jen na adresu 0-16383 místo ROM. Adresa 0-8191 je Area0, 8192-16383 je Area1. Příklad použití: #MB03_RAMPAGE p0 10 ;nastaví RamPage 10 do Area 0 #MB03_RAMPAGE p1 11 ;nastaví RamPage 11 do Area 1 org 0 di ;zapíše do RamPage 10 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 -----