Uživatelské nástroje

Nástroje pro tento web


lnxspectrum:novyprojekt

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
lnxspectrum/novyprojekt.txt · Poslední úprava: 2018/08/30 14:20 autor: lanex