V následujících příkladech předpokládám alespoň minimální znalost strojového kódu procesoru Z80.
V Assembler editoru otevřeme menu, vybereme File / New project
. Vyskočí okno Create project
, kde vybereme cestu kde bude projekt ukládán (například c:\dokumenty\ZXprojekty). Názvem souboru zvolíme automaticky název našeho projektu (například „Ahoj svete“). Po uložení se nám ve vybráné cestě vytvoří složka s názvem „Ahoj svete“, a v ní se vytvoří základní dokument main.asm
a jeho pomocný soubor .
main.tmp
TMP soubor je jen pomocný soubor editoru a dá se kdykoliv smazat. Při editaci si ho editor vytvoří znovu. Soubory nedoporučujeme editovat externím editorem, protože by mohlo dojít ke kolizím verzí. Pokud přesto editaci v externím editoru vyžadujete, vždy editujte jen soubor
*.ASM
, a vždy soubor *.TMP
smažte.
Od verze 1.6.0 se TMP soubory nepoužívají.
main.asm
je základní ASM soubor našeho projektu. Kompiler tento soubor kompiluje jako první. Na začátek našeho příkladu ještě doporučuju nastavit v menu Compiler
tyto položky:
AutoCheck
- automaticky nám bude kontrolovat syntax během psaní kóduAutoBuild
- automaticky nám během psaní bude vytvářet strojový kód do paměti emulátoru (pokud samozřejmně zdroj nebude obsahovat chyby)AutoReplace JR > JP
- při dlouhém relativním skoku nevypíše chybové hlášení, ale automaticky instrukci nahradí za absolutní skok JPA ted je čas napsat první části kódu. Pokud tomu tak není, přepněte emulátor do režimu ZX Spectrum 48K. Dále opište nebo zkopírujte:
; LnxSpectrum ASM editor (www.ilnx.cz) org 50000 ;program bude od adresy 50000 call PrintInit ;inicializace print rutiny v ZX ld hl,text call Print ;vytisknutí textu ret Print: ld a,(hl) ;vyzvedni znak and 127 rst 16 ;vytiskni ld a,(hl) ;znovu vyzvedni znak inc hl and 128 ;ověř zda to není poslední znak jr z,Print ret ;je poslední, takže exit do basicu Cls equ $d6b ;CLS rutina v originální ROM PrintInit: call Cls ;smazat obrazovku ld a,2 ;nastav výstup PRINT rutiny na obrazovku call $1601 ret ;konec inicializace text: defm 22,11,10,"Ahoj svete!" ;tisknutý text. 22 je BASIC příkaz "AT", ;následuje 11 (řádka) a 10 (sloupec). ;odpovídá BASICovému příkazu ;"PRINT AT 11,10;"Ahoj svete!"
Pokud máte kód v editoru, mělo by automaticky dojít k jeho kompilaci. V info okně bude napsáno „0 No errors“, a úplně dole se dočteme že náš program zabírá v ZX paměti 44 bajtů.
Nyní v BASICu napište příkaz RANDOMIZE USR 50000
a enter. Program vypíše zprávu „Ahoj svete!“.
program lze z BASICu zpustit i pohodlnějším způsobem. V Assembler editoru jsou uplně dole 4 tlačítka. Jedno z nich je Run from Basic
. Jeho stisknutím se ZXko v emulátor zrestartuje a sám napíše RANDOMIZE USR 50000
. Program se spustí.
Větší projekty je vhodné rozdělit na více částí, jinak se stávají nepřehledné. V Lnx assembleru je to řešeno rozdělením na moduly. Z hlavního souboru main.asm se přilinkovávají ostatní moduly, bud jiný soubor ASM, ale i BIN, BINC, SCR, SCRC, MSC a podobně. V našem příkladu si rozdělíme náš projekt Ahoj svete na 2 moduly.
V našem zdrojovém kódu označíme instrukce od řádky 10 až po řádku 24. Stiskneme Ctrl+X
a vyjmeme část kódu od návěstí Print:
až po návěstí text:
. A ted vytvoříme druhý modul. Vlevo nahoře je okno, ve kterém je zatím jediný modul main.asm
. Najeďte na něj myší a stiskněte pravé tlačítko. Ve vyvolaném menu můžete vytvořit nový ASM modul, nebo přiložit již připravený modul, přejmenovat či smazat modul. V našem příkladu vytvoříme nový modul položkou Create new ASM file
. Po stisknutí se nás zeptá, jaké jméno má nový modul mít. Zadejte PrintLib
a OK. Automaticky se nám otevřel nový ASM soubor a do něj pomocí Ctrl+V
vyjmutý zdrojový text vložíme.
Kompiler nám tentokrát ihned po vložení zdrojového kódu vyhodí chybu „0 5 label not defined“. Klikneme 2x na tuto oranžově zvýrazněnou chybu a ve zdrojovém kódu se označí řádka s instrukcí call PrintInit
. Je to proto že rutina PrintInit
byla přesunuta do jiného modulu, a ten ještě není přilinkován. Dopíšeme tedy do main.asm
za instrukci ret
instrukci include „PrintLib.asm“
. Ihned po přilinkování kompiler přestane hlásit chybu.
V seznamu nyní vidíme 2 moduly, main.asm
a PrintLib.asm
. Přepínat mezi nimi můžeme kliknutím. Při každem kliknutí se editovaný asm soubor uloží a otevře se označený.
Obsah modulu main.asm
:
; LnxSpectrum ASM editor (www.ilnx.cz) org 50000 ;program bude od adresy 50000 call PrintInit ;inicializace print rutiny v ZX ld hl,text call Print ;vytisknutí textu ret include "PrintLib.asm" ;přilinkuj druhý modul text: defm 22,11,10,"Ahoj svete!" ;tisknutý text. 22 je BASIC příkaz "AT", ;následuje 11 (řádka) a 10 (sloupec). ;odpovídá příkazu "PRINT AT 11,10;"Ahoj svete!"
Obsah modulu PrintLib.asm
:
; LnxSpectrum ASM editor (www.ilnx.cz) 6.6.2014 Print: ld a,(hl) ;vyzvedni znak and 127 rst 16 ;vytiskni ld a,(hl) ;znovu vyzvedni stejný znak inc hl ;další písmeno and 128 ;ověř zda to nebyl poslední znak jr z,Print ret ;je poslední, takže exit do basicu Cls equ $d6b ;CLS rutina v originální ROM PrintInit: call Cls ;smazat obrazovku ld a,2 ;nastav výstup PRINT rutiny na obrazovku call $1601 ret ;konec inicializace