Jak založit nový ASM projekt
V následujících příkladech předpokládám alespoň minimální znalost strojového kódu procesoru Z80.
První projekt
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:
- zaškrtnout
AutoCheck
- automaticky nám bude kontrolovat syntax během psaní kódu - zaškrtnout
AutoBuild
- automaticky nám během psaní bude vytvářet strojový kód do paměti emulátoru (pokud samozřejmně zdroj nebude obsahovat chyby) - zaškrtnout
AutoReplace JR > JP
- při dlouhém relativním skoku nevypíše chybové hlášení, ale automaticky instrukci nahradí za absolutní skok JP
A 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í.
Rozdělení projektu na moduly
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