<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="https://pmd85.borik.net/w/skins/common/feed.css?240204"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sk">
		<id>https://pmd85.borik.net/wiki/Blog:Programovanie_v_assembleri_i8080_pre_PMD_85_%288%29&amp;limit=100&amp;action=history&amp;feed=atom</id>
		<title>Blog:Programovanie v assembleri i8080 pre PMD 85 (8) - História úprav</title>
		<link rel="self" type="application/atom+xml" href="https://pmd85.borik.net/wiki/Blog:Programovanie_v_assembleri_i8080_pre_PMD_85_%288%29&amp;limit=100&amp;action=history&amp;feed=atom"/>
		<link rel="alternate" type="text/html" href="https://pmd85.borik.net/wiki/Blog:Programovanie_v_assembleri_i8080_pre_PMD_85_%288%29&amp;action=history"/>
		<updated>2026-04-25T16:44:30Z</updated>
		<subtitle>História úprav pre túto stránku na wiki</subtitle>
		<generator>MediaWiki 1.11.1</generator>

	<entry>
		<id>https://pmd85.borik.net/wiki/Blog:Programovanie_v_assembleri_i8080_pre_PMD_85_%288%29&amp;diff=1881&amp;oldid=prev</id>
		<title>Rombor: Nový Blogový článok</title>
		<link rel="alternate" type="text/html" href="https://pmd85.borik.net/wiki/Blog:Programovanie_v_assembleri_i8080_pre_PMD_85_%288%29&amp;diff=1881&amp;oldid=prev"/>
				<updated>2021-08-31T18:43:28Z</updated>
		
		<summary type="html">&lt;p&gt;Nový Blogový článok&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{VelkyNadpis|Programovanie v assembleri i8080 pre PMD 85 (8)}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
Máme za sebou rýchly prehľad inštrukcií a aj pripravené prostredie pre editáciu zdrojových textov, tak sa môžeme konečne pustiť do praktických príkladov.&lt;br /&gt;
&lt;br /&gt;
Každá kapitola bude zrejme ako jeden projekt, sem tam budeme niečo navzájom medzi projektami zdieľať a vždy tu bude celý projekt na stiahnutie.&lt;br /&gt;
&lt;br /&gt;
Keď si stiahnete daný balíček a budete ho chcieť použiť u seba, nezabudnite si zmeniť absolútne cesty v nasledujúcich súboroch:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;build.bat&amp;#039;&amp;#039;&amp;#039; - Dávkový súbor - &amp;#039;&amp;#039;&amp;#039;PROJPATH&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;XYZ.ppr&amp;#039;&amp;#039;&amp;#039; - Projektový súbor PSPADu - &amp;#039;&amp;#039;&amp;#039;Compilator.FileName&amp;#039;&amp;#039;&amp;#039; a &amp;#039;&amp;#039;&amp;#039;DefaultDir&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;.vscode\XYZ.code-workspace&amp;#039;&amp;#039;&amp;#039; - Projektový súbor VS Code - oba atribúty &amp;#039;&amp;#039;&amp;#039;path&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ako bolo spomenuté v súvislosti so šablónou Snapu, budeme pracovať s [[PMD 85#PMD 85-2A|PMD 85-2A]]. Sú na to tieto dôvody:&lt;br /&gt;
* ROM Monitor je štandardne od adresy {{Kbd|8000h}}&lt;br /&gt;
* je omnoho lepší, ako ten pôvodný na [[PMD 85#PMD 85-1|PMD 85-1]]&lt;br /&gt;
* [[VideoRAM|Video RAM]] sa neprekrýva s ROM Monitorom, ako je to u [[PMD 85#PMD 85-3|PMD 85-3]] (na PMD 85-3 táto skutočnosť prináša menšie nepríjemnosti so stránkovaním pri potrebe používať rutiny Monitora a aj pracovať s Video RAM po vlastnej osi)&lt;br /&gt;
* ak by sme to potrebovali, môžeme využiť rozšírenú pamäť a [[AllRAM]] režim&lt;br /&gt;
Ak sa teda budeme odkazovať na rutiny v Monitore alebo systémové premenné, vždy sa to bude týkať &amp;quot;dvojkovej verzie&amp;quot; Monitora. Rovnako tak názvy rutín a systémových premenných budú vychádzať z [[download:5|komentovaného výpisu Monitora PMD 85-2]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A ešte na záver musím spomenúť jednu dôležitú vec a to rozloženie pamäte PMD 85-2A:&lt;br /&gt;
* {{Kbd| 0000h}} - {{Kbd| 7FFFh}} : Užívateľská RAM 32 kB - v tejto oblasti budú bežať naše programy&lt;br /&gt;
* {{Kbd| 8000h}} - {{Kbd| 8FFFh}} : Monitor ROM 4 kB&lt;br /&gt;
* {{Kbd| 9000h}} - {{Kbd| 9FFFh}} : Užívateľská RAM 4 kB - táto pamäť nie je na PMD 85-1 a -2 a pri našich pokusoch ju nevyužijeme&lt;br /&gt;
* {{Kbd|0A000h}} - {{Kbd|0AFFFh}} : Monitor ROM 4 kB (zrkadlo z adresy {{Kbd|8000h}})&lt;br /&gt;
* {{Kbd|0B000h}} - {{Kbd|0BFFFh}} : Užívateľská RAM 4 kB - táto pamäť nie je na PMD 85-1 a -2 a pri našich pokusoch ju nevyužijeme&lt;br /&gt;
* {{Kbd|0C000h}} - {{Kbd|0FFFFh}} : [[VideoRAM|Video RAM]] a zápisník systému (systémové premenné)&lt;br /&gt;
Ak je zapnutý [[AllRAM]] režim, tak je ROM odpojená a v celom adresnom priestore je RAM.&lt;br /&gt;
&lt;br /&gt;
== Zdrojový text ==&lt;br /&gt;
Ešte malá odbočka, než sa dostaneme k prvému príkladu. Hlavný zdrojový súbor musí začínať pseudoinštrukciou &amp;#039;&amp;#039;&amp;#039;cpu&amp;#039;&amp;#039;&amp;#039;, ktorá definuje mikroprocesor, ktorého sa nasledujúci kód týka, inak bude kompilátor hlásiť desiatky, podľa brata stovky, chýb.&lt;br /&gt;
&lt;br /&gt;
Ak som napísal &amp;#039;&amp;#039;Hlavný zdrojový súbor&amp;#039;&amp;#039;, mal som na mysli to, že v projekte môže byť viac zdrojových súborov a tie budeme vkladať do hlavného zdrojového súboru osobitne pomocou pseudoinštrukcie &amp;#039;&amp;#039;&amp;#039;include&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Je to na každého osobnej ľubovôli a vkuse, ale ja osobne preferujem nasledujúce konvencie pri písaní programu v assembleri:&lt;br /&gt;
* editor je nastavený tak, že sa vkladajú skutočné tabulátory a ich veľkosť je nastavená na 8 znakov&lt;br /&gt;
* prázdne polia inštrukčného riadku sa teda &amp;quot;preskakujú&amp;quot; tabulátorom, nie medzerami&lt;br /&gt;
* kompilátor &amp;#039;&amp;#039;&amp;#039;AS&amp;#039;&amp;#039;&amp;#039; spúšťam s prepínačom {{Kbd|U}}, čím sa prepne do &amp;#039;&amp;#039;&amp;#039;case-sensitive&amp;#039;&amp;#039;&amp;#039; režimu, kedy sa prihliada na veľkosť písmen symbolov&lt;br /&gt;
* inštrukcie a pseudoinštrukcie sa píšu malými písmenami&lt;br /&gt;
* pre pole návestia je vyhradených 16 znakov, teda 2 tabulátory&lt;br /&gt;
* návestie je ukončené dvojbodkou a teda môže mať maximálne 14 znakov, aby zostala aspoň jedna medzera pred inštrukciou&lt;br /&gt;
* výnimkou je návestie pred pseudoinštrukciou {{Príkaz|equ}} alebo {{Príkaz|macro}}, kde sa dvojbodka nepíše&lt;br /&gt;
* názvy návestí sú v štýle &amp;#039;&amp;#039;&amp;#039;CamelCase&amp;#039;&amp;#039;&amp;#039; s veľkým písmenom na začiatku&lt;br /&gt;
* poznámka za inštrukciou začína na znaku 41 (ak parametre inštrukcie náhodou presahujú cez stĺpec 41, tak sa poznámka oddelí jednou medzerou)&lt;br /&gt;
Nie je to nemeniteľná doktrína, ale zvoliť si jednotnú &amp;quot;štábnu kultúru&amp;quot; je veľmi dôležité, aby potom zdrojové súbory neboli &amp;#039;&amp;#039;Každej pes, jiná ves&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 		cpu	8080		; definícia cieľového mikroprocesora&lt;br /&gt;
 		page	0		; nechceme stránkovať listing programu&lt;br /&gt;
 		title	&amp;quot;ASM Program 1&amp;quot;	; nepodstatný titulok programu ;-)&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 		org	0		; program začína od adresy 0&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 Start:		...&lt;br /&gt;
 		tu bude náš hlavný program&lt;br /&gt;
 		...&lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 ; ďalšie zdrojové súbory sa budú pripájať osobitne takto&lt;br /&gt;
 		include &amp;quot;subor2.a8080&amp;quot;&lt;br /&gt;
 		include &amp;quot;subor3.a8080&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 		end			; označenie konca programu&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
== Vypisujeme znaky na obrazovku ==&lt;br /&gt;
Na PMD 85 nie je typický textový režim zobrazovania. Všetko, čo sa zobrazuje, je v &amp;quot;grafickom režime&amp;quot;, teda sa priamo zapisuje do [[VideoRAM|Video RAM]](ďalej VRAM), čo ale prináša výhodu v možnosti zobrazovať &amp;quot;akékoľvek&amp;quot; znaky. Je to ale samozrejme náročnejšie na čas procesora, lebo si to musí sám &amp;quot;odmakať&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Organizácia VRAM je popísaná v [[VideoRAM|príslušnom článku]], tak len v krátkosti. Rozlíšenie je 288 x 256 bodov, z jedného bytu je zobrazovaných 6 bodov a aj preto má obvykle jeden znak na šírku 6 bodov. Z toho potom vidíme, že na riadok sa vojde 288 / 6 = 48 znakov. Výška predlohy znaku je 8 bodov - 8 bytov na znak. Počet riadkov na obrazovke v štandardnej rutine pre vypísanie znaku závisí od veľkosti riadkovania v systémových premenných a štandardne je to 9 mikroriadkov. Takto sa na obrazovku vojde 25 riadkov mimo dialógového riadku.&lt;br /&gt;
=== Výpis znaku rutinami Monitora ===&lt;br /&gt;
V Monitore PMD 85 je štandardná rutina {{Príkaz|PRTOUT}} pre výpis znaku na adrese {{Kbd|8500h}}. Táto rutina sa postará o &amp;quot;odriadkovanie&amp;quot; na konci riadku, ale aj o rolovanie obrazu, ak je kurzor na poslednom znaku posledného riadku obrazovky. Zároveň akceptuje jediný &amp;quot;riadiaci kód&amp;quot; {{Kbd|1Ch}} pre zmazanie celej obrazovky a nastavenie kurzora vľavo hore. Kód znaku, ktorý sa má vypísať, sa predáva do rutiny v registri {{Kbd|A}} a mení iba register {{Kbd|AF}}. Rutina používa mnoho systémových premenných, ale my nateraz využijeme iba tieto dve:&lt;br /&gt;
* {{Príkaz|CURSOR}} / {{Kbd|0C03Eh}} - adresa vo VRAM kam sa vypíše znak - presnejšie ukazuje 2 mikroriadky pod znakom&lt;br /&gt;
* {{Príkaz|COLOR}} / {{Kbd|0C03Ah}} - &amp;quot;farba&amp;quot; vypisovaného znaku - horné dva bity predstavujú farbové atribúty; dolných 6 bitov určuje, či sa znak vypíše normálne ({{Kbd|00h}}) alebo invertovane ({{Kbd|3Fh}})&lt;br /&gt;
S výpisom textu súvisí &amp;#039;&amp;#039;&amp;#039;znaková sada&amp;#039;&amp;#039;&amp;#039;, alebo tiež znakový generátor alebo znakový font, skrátene iba &amp;#039;&amp;#039;&amp;#039;font&amp;#039;&amp;#039;&amp;#039;. Font je v Monitore 2 a ďalších &amp;quot;rozkúskovaný&amp;quot; na viac častí a adresy fontu sú v systémových premenných ako tabuľka adries od adresy {{Príkaz|TASCII}} / {{Kbd|0C0B0h}} (v Monitore 1 je iba jediná systémová premenná pre adresu fontu {{Príkaz|TAS00}} / {{Kbd|0C03Ch}}, tá je ale v Monitore 2 nevyužitá).&lt;br /&gt;
* {{Kbd|0C0B0h}} : kódy {{Kbd|00h}} až {{Kbd|1Fh}} - nevyužité&lt;br /&gt;
* {{Kbd|0C0B2h}} : kódy {{Kbd|20h}} až {{Kbd|3Fh}} - medzera až otáznik&lt;br /&gt;
* {{Kbd|0C0B4h}} : kódy {{Kbd|40h}} až {{Kbd|5Fh}} - veľké písmená&lt;br /&gt;
* {{Kbd|0C0B6h}} : kódy {{Kbd|60h}} až {{Kbd|7Fh}} - malé písmená&lt;br /&gt;
* {{Kbd|0C0B8h}} : kódy {{Kbd|80h}} až {{Kbd|9Fh}} - nevyužité&lt;br /&gt;
* {{Kbd|0C0BAh}} : kódy {{Kbd|0A0h}} až {{Kbd|0BFh}} - nevyužité&lt;br /&gt;
* {{Kbd|0C0BCh}} : kódy {{Kbd|0C0h}} až {{Kbd|0DFh}} - nevyužité (na PMD 85-3 malé písmená s diakritikou)&lt;br /&gt;
* {{Kbd|0C0BEh}} : kódy {{Kbd|0E0h}} až {{Kbd|0FFh}} - nevyužité (na PMD 85-3 veľké písmená s diakritikou)&lt;br /&gt;
Pre získanie adresy predlohy konkrétneho znaku slúži rutina {{Príkaz|ADRAS}} / {{Kbd|84CEh}}, ktorej vstupným parametrom je kód znaku v registri {{Kbd|A}}. Adresa predlohy znaku +8 sa vráti v registri {{Kbd|HL}}. Ak taký znak nie je definovaný, vráti sa adresa &amp;quot;štvorčeka&amp;quot;, ktorý určite poznáte napr. z príkazu {{Príkaz|DUMP}} v Monitore. Rutina mení všetky registre. My túto rutinu ale nebudeme teraz potrebovať, lebo je volaná už samotnou rutinou {{Príkaz|PRTOUT}}.&lt;br /&gt;
 &lt;br /&gt;
Druhou užitočnou rutinou pre výpis znaku je rutina {{Príkaz|WRCHAR}} / {{Kbd|854Ah}}. Na rozdiel od rutiny {{Príkaz|PRTOUT}}, {{Príkaz|WRCHAR}} skutočne iba vypíše znak, ktorého kód je v registri {{Kbd|A}} a to do VRAM od adresy, ktorá je v registri {{Kbd|HL}} (systémová premenná {{Príkaz|CURSOR}} sa tu nepoužíva). Systémová premenná {{Príkaz|COLOR}} sa uplatní rovnako, ako pri rutine {{Príkaz|PRTOUT}}. Rutina {{Príkaz|WRCHAR}} nemení okrem {{Kbd|AF}} žiadne iné registre (a teda ani {{Kbd|HL}}!).&lt;br /&gt;
&lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 		cpu	8080&lt;br /&gt;
 		page	0&lt;br /&gt;
 		title	&amp;quot;ASM Program 1A&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 		org	0		; program začne od adresy 0&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 ; definícia adries rutín v Monitore&lt;br /&gt;
 PRTOUT		equ	8500h&lt;br /&gt;
 WRCHAR		equ	854Ah&lt;br /&gt;
 MONIT		equ	8C40h&lt;br /&gt;
 &lt;br /&gt;
 ; systémové premenné&lt;br /&gt;
 COLOR		equ	0C03Ah&lt;br /&gt;
 CURSOR		equ	0C03Eh&lt;br /&gt;
 TASCII5		equ	0C0BAh		; adresa ukazateľa na znaky s kódmi 0A0h až 0BFh&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 Start:		di			; zakázanie prerušení&lt;br /&gt;
 		lxi	sp,8000h	; nastav zásobník na koniec RAM&lt;br /&gt;
 &lt;br /&gt;
 		; výpis pomocou PRTOUT&lt;br /&gt;
 		mvi	a,1Ch		; riadiaci kód pre vymazanie obrazovky&lt;br /&gt;
 					; do akumulátora&lt;br /&gt;
 		call	PRTOUT		; zavolaj rutinu pre výpis znaku&lt;br /&gt;
 					; v tomto prípade dôjde k vymazaniu&lt;br /&gt;
 					; obrazovky&lt;br /&gt;
 &lt;br /&gt;
 		mvi	a,&amp;#039;A&amp;#039;		; vypíšeme znak &amp;#039;A&amp;#039; - keďže sme zmazali&lt;br /&gt;
 		call	PRTOUT		; obrazovku, vypíše sa do ľavého horného&lt;br /&gt;
 					; rohu obrazovky&lt;br /&gt;
 &lt;br /&gt;
 		lxi	h,0D110h	; do HL ulož adresu pozície vo VRAM&lt;br /&gt;
 					; približne do druhej štvrtiny obrazovky&lt;br /&gt;
 		shld	CURSOR		; ulož ako pozíciu kurzora&lt;br /&gt;
 		mvi	a,3Fh		; nastav inverzný výpis&lt;br /&gt;
 		sta	COLOR&lt;br /&gt;
 		mvi	a,&amp;#039;X&amp;#039;		; vypíšeme písmeno &amp;#039;X&amp;#039;&lt;br /&gt;
 		call	PRTOUT&lt;br /&gt;
 &lt;br /&gt;
 		; výpis pomocou WRCHAR&lt;br /&gt;
 		mvi	a,40h		; nastav výpis &amp;quot;zníženým jasom&amp;quot;&lt;br /&gt;
 		sta	COLOR&lt;br /&gt;
 		lhld	CURSOR		; do HL ulož aktuálnu adresu kurzora&lt;br /&gt;
 		mvi	a,&amp;#039;Y&amp;#039;		; vypíš &amp;#039;Y&amp;#039;&lt;br /&gt;
 		call	WRCHAR&lt;br /&gt;
 		mvi	a,80h		; nastav výpis &amp;quot;blikaním&amp;quot;&lt;br /&gt;
 		sta	COLOR&lt;br /&gt;
 		inx	h		; posun na ďalšiu pozíciu za &amp;#039;Y&amp;#039;&lt;br /&gt;
 		mvi	a,&amp;#039;W&amp;#039;		; a vypíšeme blikajúce &amp;#039;W&amp;#039;&lt;br /&gt;
 		call	WRCHAR&lt;br /&gt;
 &lt;br /&gt;
 		xra	a		; nastav normálny výpis&lt;br /&gt;
 		sta	COLOR&lt;br /&gt;
 		lxi	h,CharsA0+8	; nastav adresu &amp;quot;fontu&amp;quot; pre znaky&lt;br /&gt;
 		shld	TASCII5		; od 0A0h do 0BFh - v našom prípade&lt;br /&gt;
 					; je to iba 5 znakov&lt;br /&gt;
 					; adresa musí byť zvýšená o 8&lt;br /&gt;
 		lxi	h,0E014h	; do HL ulož adresu pozície vo VRAM&lt;br /&gt;
 					; približne v strede obrazovky&lt;br /&gt;
 		lxi	b,5*256+0A0h	; vypíšeme našich 5 znakov&lt;br /&gt;
 PrintRomX:	mov	a,c		; vypisovaný znak do A&lt;br /&gt;
 		call	WRCHAR		; vypíš ho&lt;br /&gt;
 		inx	h		; posuň adresu VRAM&lt;br /&gt;
 		mvi	a,&amp;#039; &amp;#039;		; vypíš medzeru&lt;br /&gt;
 		call	WRCHAR&lt;br /&gt;
 		inx	h		; posuň adresu VRAM&lt;br /&gt;
 		inr	c		; inkrementuj kód znaku&lt;br /&gt;
 		dcr	b		; zníž počítadlo znakov&lt;br /&gt;
 		jnz	PrintRomX	; a opakuj&lt;br /&gt;
 &lt;br /&gt;
 		; návrat do Monitora (Os ready)&lt;br /&gt;
 		jmp	MONIT&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 ; predloha znakov&lt;br /&gt;
 CharsA0:	db	0,20,20,0,8,34,28,0	; &amp;quot;Smajlik&amp;quot;&lt;br /&gt;
 		db	0,4,14,14,31,14,14,4	; karo&lt;br /&gt;
 		db	0,10,31,31,31,14,4,0	; srdce&lt;br /&gt;
 		db	0,4,14,31,31,31,4,4	; pika&lt;br /&gt;
 		db	0,14,4,21,31,21,4,4	; kriz&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 		end&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
Pár poznámok k programu. Na začiatku sme zakázali prerušenia, aj keď to teraz nie je veľmi dôležité, ale je dobrý zvyk to urobiť. Zároveň sme si nastavili adresu zásobníka na koniec pamäte (Pamätáte sa? Zásobník &amp;quot;rastie&amp;quot; k nižším adresám.). Na konci programu máme skok na návestie {{Príkaz|MONIT}}, čo je bezpečný návrat do Monitora, kde sa vypíše obligátne &amp;quot;++ Os ready ++&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ďalej upozorním na definíciu adries rutín a systémových premenných Monitora pomocou pseudoinštrukcie {{Príkaz|equ}} (equation). V kóde tak potom používame tieto zadefinované symboly, kód je zrozumiteľnejší a čitateľnejší a keby sme potrebovali z nejakých dôvodov zmeniť niektorú z tých adries, tak to urobíme iba na jednom mieste. Za pseudoinštrukciou {{Príkaz|equ}} nemusí byť iba číselná konštanta, ale aj číselný výraz.&lt;br /&gt;
&lt;br /&gt;
Asi je to jasné, ale pripomeniem, že pseudoinštrukcia {{Príkaz|org}} (origin) určuje adresu, na ktorú sa budú ukladať nasledujúce inštrukcie. V kóde môže byť zmena adresy cieľového kódu neobmedzene, kompilátor tieto &amp;quot;roztrhané&amp;quot; bloky kódu potom pospája a prázdne miesta vyplní nulami. V našom prípade nám to stačí na začiatku programu.&lt;br /&gt;
&lt;br /&gt;
Ďalšou novinkou je pseudoinštrukcia {{Príkaz|db}} (define byte), ktorou sme si &amp;quot;zadefinovali&amp;quot; naše nové znaky (8 bytov na znak). Za pseudoinštrukciou {{Príkaz|db}} môže nasledovať zoznam čiarkami oddelených výrazov, ktorých výsledná hodnota je 8 bitová, alebo reťazec znakov v úvodzovkách (použijeme v ďalších príkladoch). Podobne existuje aj pseudoinštrukcia {{Príkaz|dw}} (define word) pre vloženie 16 bitových hodnôt do pamäte. Opäť to môžu byť výrazy, ktorých výsledkom je ale 16 bitová hodnota. Podľa očakávania sa hodnoty do pamäte ukladajú v poradí najprv nižší byte a potom vyšší byte.&lt;br /&gt;
&lt;br /&gt;
=== Výpis znaku vlastnými rutinami ===&lt;br /&gt;
Nie vždy ale chceme, alebo môžeme, využívať rutiny z ROM, preto si teraz vytvoríme vlastné rutiny na vykreslenie znaku. K tomu zároveň použijeme vlastný font. Ten si môžeme pripraviť v [[8bitSpriteEditor|8bit Strite Editore]]. V projekte je v adresári &amp;#039;&amp;#039;&amp;#039;data&amp;#039;&amp;#039;&amp;#039; zdrojový &amp;quot;spritový&amp;quot; súbor &amp;#039;&amp;#039;&amp;#039;font.sprite&amp;#039;&amp;#039;&amp;#039; (môžete ho otvoriť v Sprite editore a znakovú sadu si upraviť) a aj exportovaný binárny súbor &amp;#039;&amp;#039;&amp;#039;font.bin&amp;#039;&amp;#039;&amp;#039; s čistými dátami fontu. Tento súbor si pomocou pseudoinštrukcie {{Príkaz|binclude}} vložíme do kódu.&lt;br /&gt;
&lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 		cpu	8080&lt;br /&gt;
 		page	0&lt;br /&gt;
 		title	&amp;quot;ASM Program 1B&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 		org	0		; program začne od adresy 0&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 ; definícia adries rutín v Monitore&lt;br /&gt;
 MONIT		equ	8C40h&lt;br /&gt;
 &lt;br /&gt;
 ; adresa VRAM&lt;br /&gt;
 VRAM		equ	0C000h&lt;br /&gt;
 AV		function row,col,VRAM+row*300h+col&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 Start:		di			; zakázanie prerušení&lt;br /&gt;
 		lxi	sp,8000h	; nastav zásobník na koniec RAM&lt;br /&gt;
 &lt;br /&gt;
 ; Ukážka výpisu znakov vlastnými rutinami&lt;br /&gt;
 		call	Cls		; zmaž obrazovku&lt;br /&gt;
 &lt;br /&gt;
 		; vypísanie tabuľky znakov&lt;br /&gt;
 		lxi	h,AV(5,8)	; 5. riadok, 8. stĺpec&lt;br /&gt;
 		lxi	b,6*256+&amp;#039; &amp;#039;	; 6 skupín, začneme medzerou&lt;br /&gt;
 		mvi	e,0		; atribút&lt;br /&gt;
 PrtChrTblL2:	mvi	d,16		; 16 znakov v riadku&lt;br /&gt;
 		mov	a,e		; atribút pre tento riadok&lt;br /&gt;
 		sta	PrintCharC+1	; ulož do inštrukcie&lt;br /&gt;
 PrtChrTblL1:	mov	a,c		; vypisovaný znak do A&lt;br /&gt;
 		call	PrintChar	; vypíš ho&lt;br /&gt;
 		mvi	a,&amp;#039; &amp;#039;		; medzi znakmi budú medzery&lt;br /&gt;
 		call	PrintChar&lt;br /&gt;
 		inr	c		; inkrementuj kód znaku&lt;br /&gt;
 		dcr	d		; zníž počítadlo znakov v riadku&lt;br /&gt;
 		jnz	PrtChrTblL1	; opakuj pre celý riadok&lt;br /&gt;
 		call	PrintCharCRLF	; odriadkuj&lt;br /&gt;
 		call	PrintCharCRLF	; a ešte raz&lt;br /&gt;
 		mvi	l,8		; opäť 8. stĺpec&lt;br /&gt;
 		mov	a,e		; ďalšia &amp;quot;farba&amp;quot;&lt;br /&gt;
 		adi	40h&lt;br /&gt;
 		mov	e,a&lt;br /&gt;
 		jnz	PrtChrTblR	; prvé 4 riadky neinvertovane&lt;br /&gt;
 		mvi	e,3Fh		; ďalšie riadky invertovane&lt;br /&gt;
 PrtChrTblR:	dcr	b		; zníž počítadlo skupín&lt;br /&gt;
 		jnz	PrtChrTblL2	; opakuj pre všetky skupiny&lt;br /&gt;
 &lt;br /&gt;
 		; návrat do Monitora (Os ready)&lt;br /&gt;
 		jmp	MONIT&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 ; Vypísanie znaku, ktorého kód je v A do VRAM od adresy v HL.&lt;br /&gt;
 ; Rutina využíva vlastný font, kde sú znaky vysoké 8 bodov (mikroriadkov).&lt;br /&gt;
 ; Riadok je ale vysoký 12 mikroriadkov a horné 4 mikroriadky budú slúžiť pre&lt;br /&gt;
 ; diakritické znamienka.&lt;br /&gt;
 ; I: HL=adresa VRAM, A=znak &amp;lt;32, 127&amp;gt;&lt;br /&gt;
 ; O: HL=adresa VRAM +1&lt;br /&gt;
 ; M: AF, HL&lt;br /&gt;
 PrintChar:	sui	32		; uprav kód znaku na rozsah od 0 do 95&lt;br /&gt;
 		rc			; neplatný kód znaku, ihneď sa vráť&lt;br /&gt;
 		cpi	(127+1-32)	; maximálny kód znaku je 127&lt;br /&gt;
 		rnc			; ak je to mimo, vráť sa&lt;br /&gt;
 		push	h		; odpamätaj registre&lt;br /&gt;
 		push	d&lt;br /&gt;
 		push	b&lt;br /&gt;
 		xchg			; adresa VRAM do DE&lt;br /&gt;
 		add	a		; kód znaku x2&lt;br /&gt;
 		mov	l,a		; x2 ulož do HL&lt;br /&gt;
 		mvi	h,0&lt;br /&gt;
 		dad	h		; x4&lt;br /&gt;
 		dad	h		; x8; HL = (kód_znaku - 32) * 8&lt;br /&gt;
 		lxi	b,Font		; BC=bázová adresa fontu&lt;br /&gt;
 		dad	b		; pripočítaj k offsetu znaku&lt;br /&gt;
 		xchg			; DE=predloha znaku, HL=adresa VRAM&lt;br /&gt;
 PrintCharC:	mvi	c,0		; atribút do C&lt;br /&gt;
 &lt;br /&gt;
 		mvi	b,4		; 4 mikroriadky nad znakom budú nateraz prázdne&lt;br /&gt;
 PrintCharK:	mov	m,c		; do VRAM ulož iba atribút&lt;br /&gt;
 		mov	a,l		; posun na nasledujúci mikroriadok&lt;br /&gt;
 		adi	40h&lt;br /&gt;
 		mov	l,a&lt;br /&gt;
 		jnc	PrintCharK0	; skoč, ak nedošlo k pretečeniu&lt;br /&gt;
 		inr	h		; inak inkrementuj ešte H&lt;br /&gt;
 PrintCharK0:	dcr	b		; opakuj 4x&lt;br /&gt;
 		jnz	PrintCharK&lt;br /&gt;
 &lt;br /&gt;
 		mvi	b,8		; výška znaku 8 mikroriadkov&lt;br /&gt;
 PrintCharL:	ldax	d		; vezmi byte predlohy&lt;br /&gt;
 		inx	d		; posun na ďalší byte predlohy&lt;br /&gt;
 		xra	c		; pridaj atribút&lt;br /&gt;
 		mov	m,a		; ulož do VRAM&lt;br /&gt;
 		mov	a,l		; posun na nasledujúci mikroriadok&lt;br /&gt;
 		adi	40h&lt;br /&gt;
 		mov	l,a&lt;br /&gt;
 		jnc	PrintCharL0	; skoč, ak nedošlo k pretečeniu&lt;br /&gt;
 		inr	h		; inak inkrementuj ešte H&lt;br /&gt;
 PrintCharL0:	dcr	b		; opakuj pre celý znak&lt;br /&gt;
 		jnz	PrintCharL&lt;br /&gt;
 		pop	b		; obnov registre&lt;br /&gt;
 		pop	d&lt;br /&gt;
 		pop	h&lt;br /&gt;
 		inx	h		; posun na ďalšiu znakovú pozíciu VRAM&lt;br /&gt;
 		mov	a,l		; opustili sme textový riadok?&lt;br /&gt;
 		ani	3Fh&lt;br /&gt;
 		cpi	48		; 48 znakov na riadok&lt;br /&gt;
 		rc			; nie, návrat&lt;br /&gt;
 PrintCharCRLF:	mov	a,l		; áno, prejdi na ďalší textový riadok&lt;br /&gt;
 		ani	0C0h		; CR - návrat na začiatok riadku&lt;br /&gt;
 		mov	l,a&lt;br /&gt;
 		inr	h		; LF - ďalší riadok (12 mikroriadkov)&lt;br /&gt;
 		inr	h&lt;br /&gt;
 		inr	h&lt;br /&gt;
 		ret&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 ; Zmazanie obrazovky.&lt;br /&gt;
 ; I: -&lt;br /&gt;
 ; O: -&lt;br /&gt;
 ; M: všetky&lt;br /&gt;
 Cls:		lxi	h,VRAM		; adresa VRAM do HL&lt;br /&gt;
 		lxi	d,48*256+0	; D=48 - šírka obrazovky,&lt;br /&gt;
 					; E=0 - 256 mikroriadkov&lt;br /&gt;
 		lxi	b,16		; BC=offset na prechod na ďalší mikroriadok&lt;br /&gt;
 ClsK:		mov	a,d		; A=48 - počítadlo stĺpcov&lt;br /&gt;
 ClsL:		mov	m,b		; vymaž byte vo VRAM&lt;br /&gt;
 		inx	h		; posuň sa na ďalší byte obrazovky&lt;br /&gt;
 		dcr	a		; zníž počítadlo šírky&lt;br /&gt;
 		jnz	ClsL		; opakuj pre celú šírku&lt;br /&gt;
 		dad	b		; prejdi na ďalší mikroriadok&lt;br /&gt;
 		dcr	e		; zníž počítadlo mikroriadkov&lt;br /&gt;
 		jnz	ClsK		; opakuj pre všetky mikroriadky&lt;br /&gt;
 		ret&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 Font:		binclude &amp;quot;../data/font.bin&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 		end&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
V uvedenom príklade máme opäť niekoľko nových vecí. Na začiatku máme zadefinovanú funkciu {{Príkaz|AV}} (Adresa vo VRAM), ktorá nám z riadku a stĺpca uvedených ako parametre funkcie, vypočíta skutočnú adresu VRAM. V našom prípade sme si zadefinovali, že riadok bude mať 12 mikroriadkov (12*40h=300h), k čomu sa ešte dostaneme. Zadefinovanie takýchto funkcií nám sprehľadňuje kód a opäť pri potrebe zmeniť nejakú drobnosť, stačí túto zmenu urobiť na jednom mieste. Použitie funkcie v kóde sa správa podobne ako {{Príkaz|macro}}, to znamená, že dôjde k &amp;quot;rozvinutiu&amp;quot; funkcie v danom mieste použitia a až následne dôjde ku kompilácii daného riadku. My sme použili funkciu {{Príkaz|AV}} na začiatku pri nastavení adresy VRAM, odkiaľ sa bude vypisovať tabuľka znakov.&lt;br /&gt;
&lt;br /&gt;
Pre zmazanie obrazovky sme si vytvorili vlastnú rutinu {{Príkaz|Cls}}. Všimnite si, že pri nulovaní bytov VRAM zapisujeme iba do prvých 48 bytov v mikroriadku a 16 bytov &amp;quot;vedľa&amp;quot; VRAM preskakujeme. To je dôležité buď preto, že ak chceme naďalej používať nejaké rutiny z ROM, tie môžu byť závislé od systémových premenných, ktoré sú pravé &amp;quot;vedľa&amp;quot; VRAM, a tak ich nesmieme zmazať. Druhá možnosť je, že my sami si uložíme nejaký vlastný kód alebo dáta &amp;quot;vedľa&amp;quot; VRAM a tak určite nebudeme chcieť, aby sme si ich zmazali.&lt;br /&gt;
&lt;br /&gt;
Naša rutina {{Príkaz|PrintChar}} sa chová podobne, ako rutina {{Príkaz|WRCHAR}} z Monitora. Znak, ktorý sa má vytlačiť, vstupuje do rutiny v registri {{Kbd|A}} a adresa VRAM v registri {{Kbd|HL}}. Na rozdiel od rutiny v ROM, naša rutina spôsobuje aj prechod na začiatok ďalšieho riadku, ak sa dosiahne pravý okraj obrazovky. Druhou odlišnosťou je, že výška riadku je 12 mikroriadkov. Znak má síce na výšku 8 mikroriadkov, ale 4 mikroriadky nad znakom využijeme pre diakritické znamienka, čo si ukážeme neskôr. Teraz bude tento priestor nad znakom vyplnený hodnotou atribútu.&lt;br /&gt;
&lt;br /&gt;
Rutina {{Príkaz|PrintChar}} na začiatku overuje, či je kód znaku v povolenom rozsahu 32 až 127. Ak je kód mimo, prevedie sa ihneď návrat z rutiny. Pre nájdenie predlohy znaku sa kód znaku najprv upraví na rozsah 0 až 95, vynásobí sa ôsmimi (jeden znak zaberá vo fonte 8 bytov) a pripočíta sa bázová adresa fontu. Pri zapisovaní jednotlivých bytov predlohy znaku do VRAM sa každý byte predlohy spojí pomocou inštrukcie {{Príkaz|xra c}} s atribútom. Inštrukcia {{Príkaz|xor}} je použitá preto, aby mohla byť urobená inverzia znaku, ak má dolných 6 bitov atribútu hodnotu 3Fh. Pri horných dvoch farbových bitoch prakticky dôjde iba ku spojeniu, keďže predloha znaku má tieto bity vždy nulové.&lt;br /&gt;
&lt;br /&gt;
Za zmienku ešte stojí poukázať na spôsob prechodu na ďalší mikroriadok. Keďže v danom mieste máme okrem akumulátora &amp;quot;obsadené&amp;quot; všetky registre, použili sme konštrukciu, ktorá je rýchlejšia, ako použitie zásobníka pre dočasné odloženie niektorého registra. V danom prípade k registru {{Kbd|L}} pripočítame 40h, čo je rozdiel medzi dvoma mikroriadkami. Ak však {{Kbd|L}} &amp;quot;pretečie&amp;quot;, inkrementujeme ešte {{Kbd|H}}. &lt;br /&gt;
&lt;br /&gt;
Na záver rutiny sa ešte obnovia všetky registre uložené na zásobník a inkrementuje sa {{Kbd|HL}} ako prechod na ďalšiu znakovú pozíciu. Ak sa ale zistí, že sme dosiahli pravú stranu obrazovky, tak sa v nižšom byte {{Kbd|L}} adresy VRAM vynulujú bity určujúce pozíciu v radku a vyšší byte {{Kbd|H}} sa zvýši o 3, čo je práve 12 mikroriadkov (12 * 40h = 3 * 100h).&lt;br /&gt;
&lt;br /&gt;
Upozorním ešte na popis pri oboch rutinách, ktorý obsahuje &amp;quot;legendu&amp;quot; (&amp;#039;&amp;#039;&amp;#039;I:&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;O:&amp;#039;&amp;#039;&amp;#039; a &amp;#039;&amp;#039;&amp;#039;M:&amp;#039;&amp;#039;&amp;#039;) informujúcu o vstupných a výstupných parametroch a zmenených registroch. Je to veľmi užitočný zvyk písať si k rutinám tieto informácie a mať tak neskôr okamžitý prehľad o používaných registroch v danej rutine. Samozrejme, nie vždy to má zmysel, ale mnoho &amp;quot;pomocných&amp;quot; rutín si to priam žiada.&lt;br /&gt;
&lt;br /&gt;
Na konci programu je už iba skôr spomenuté vloženie fontu do kódu pomocou pseudoinštrukcie {{Príkaz|binclude}}.&lt;br /&gt;
&lt;br /&gt;
=== Výpis znaku s diakritikou ===&lt;br /&gt;
Pre zobrazovanie znakov s diakritikou by sme si mohli jednoducho vytvoriť font, ktorý by priamo obsahoval okrem základnej sady znakov aj znaky s diakritikou. Prakticky by sa v našej rutine zmenil iba test povoleného rozsahu kódov znakov a výpočet adresy predlohy daného znaku. Toto riešenie má len to negatívum, že by font zaberal omnoho viac miesta.&lt;br /&gt;
&lt;br /&gt;
Skúsime ísť inou cestou, na ktorú sme sa už čiastočne pripravovali. Font použijeme ten základný a pri vykresľovaní znaku s diakritikou, nad základný znak vykreslíme príslušné diakritické znamienko. Samozrejme, samotná rutina na vykreslenie znaku sa mierne skomplikuje a predĺži, ale určite bude spolu so základným fontom zaberať menej miesta, ako by zaberal úplný font so znakmi s diakritikou. A na druhej strane to možno bude pekné programátorské cvičenie.&lt;br /&gt;
&lt;br /&gt;
Nebudeme ale veľmi vymýšľať a použijeme algoritmus, ktorý je v rozšírenom Monitore Zbrojováčka pre CP/M BIOS. Len si ho prispôsobíme pre naše potreby. Z toho teda vyplýva, že znaky s diakritikou budú v kódovaní KOI-8čs - kódy 0C0h až 0FFh (v rovnakom kódovaní sú znaky s diakritikou aj na PMD 85-3, viď návod k PMD 85-3). A ako dosiahneme, aby texty napísané v PC editore boli nakoniec v tom správnom kódovaní, si povieme v ďalšej kapitole.&lt;br /&gt;
&lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 		cpu	8080&lt;br /&gt;
 		page	0&lt;br /&gt;
 		title	&amp;quot;ASM Program 1C&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 		org	0		; program začne od adresy 0&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 ; definícia adries rutín v Monitore&lt;br /&gt;
 MONIT		equ	8C40h&lt;br /&gt;
 &lt;br /&gt;
 ; adresa VRAM&lt;br /&gt;
 VRAM		equ	0C000h&lt;br /&gt;
 AV		function row,col,VRAM+row*300h+col&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 Start:		di			; zakázanie prerušení&lt;br /&gt;
 		lxi	sp,8000h	; nastav zásobník na koniec RAM&lt;br /&gt;
 &lt;br /&gt;
 ; Ukážka výpisu znakov vlastnými rutinami&lt;br /&gt;
 		call	Cls		; zmaž obrazovku&lt;br /&gt;
 &lt;br /&gt;
 		; vypísanie tabuľky znakov&lt;br /&gt;
 		lxi	h,AV(1,8)	; 1. riadok, 8. stĺpec&lt;br /&gt;
 		lxi	b,10*256+&amp;#039; &amp;#039;	; 10 skupín, začneme medzerou&lt;br /&gt;
 		mvi	e,0		; atribút&lt;br /&gt;
 PrtChrTblDiaL2:	mvi	d,16		; 16 znakov v riadku&lt;br /&gt;
 		mov	a,e		; atribút pre tento riadok&lt;br /&gt;
 		sta	PrtCharDiaC+1	; ulož do inštrukcie&lt;br /&gt;
 PrtChrTblDiaL1:	mov	a,c		; vypisovaný znak do A&lt;br /&gt;
 		call	PrtCharDia	; vypíš ho&lt;br /&gt;
 		mvi	a,&amp;#039; &amp;#039;		; medzi znakmi budú medzery&lt;br /&gt;
 		call	PrtCharDia&lt;br /&gt;
 		inr	c		; inkrementuj kód znaku&lt;br /&gt;
 		dcr	d		; zníž počítadlo znakov v riadku&lt;br /&gt;
 		jnz	PrtChrTblDiaL1	; opakuj pre celý riadok&lt;br /&gt;
 		call	PrtCharDiaCRLF	; odriadkuj&lt;br /&gt;
 		call	PrtCharDiaCRLF	; a ešte raz&lt;br /&gt;
 		mov	a,c&lt;br /&gt;
 		cpi	128&lt;br /&gt;
 		jnz	PrtChrTblDiaC&lt;br /&gt;
 		mvi	c,192&lt;br /&gt;
 PrtChrTblDiaC:	mvi	l,8		; opäť 8. stĺpec&lt;br /&gt;
 		mov	a,e		; ďalšia &amp;quot;farba&amp;quot;&lt;br /&gt;
 		adi	40h&lt;br /&gt;
 		mov	e,a&lt;br /&gt;
 		jnz	PrtChrTblDiaR	; prvé 4 riadky neinvertovane&lt;br /&gt;
 		mvi	e,3Fh		; ďalšie riadky invertovane&lt;br /&gt;
 PrtChrTblDiaR:	dcr	b		; zníž počítadlo skupín&lt;br /&gt;
 		jnz	PrtChrTblDiaL2	; opakuj pre všetky skupiny&lt;br /&gt;
 &lt;br /&gt;
 		; návrat do Monitora (Os ready)&lt;br /&gt;
 		jmp	MONIT&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 ; Vypísanie znaku, ktorého kód je v A do VRAM od adresy v HL.&lt;br /&gt;
 ; Rutina využíva vlastný font, kde sú znaky vysoké 8 bodov (mikroriadkov).&lt;br /&gt;
 ; Riadok je ale vysoký 12 mikroriadkov a horné 4 mikroriadky slúžia pre&lt;br /&gt;
 ; diakritické znamienka.&lt;br /&gt;
 ; I: HL=adresa VRAM, A=znak &amp;lt;32, 127&amp;gt; a &amp;lt;192, 255&amp;gt;&lt;br /&gt;
 ; O: HL=adresa VRAM +1&lt;br /&gt;
 ; M: AF, HL&lt;br /&gt;
 PrtCharDia:	cpi	32		; ak je to riadiaci kód, navrat&lt;br /&gt;
 		rc			; neplatný kód znaku, ihneď sa vrat&lt;br /&gt;
 		cpi	127+1		; ak je to znak zo základného ASCII&lt;br /&gt;
 		jc	PrtCharDiaN	; skoč ďalej s CY=1&lt;br /&gt;
 		cpi	192		; kód znaku medzi &amp;lt;128, 191&amp;gt;&lt;br /&gt;
 		rc			; nie je podporovaný, vráť sa&lt;br /&gt;
 PrtCharDiaN:	push	h		; odpamataj registre&lt;br /&gt;
 		push	d&lt;br /&gt;
 		push	b&lt;br /&gt;
 		push	psw		; odpamataj kod znaku aj CY&lt;br /&gt;
 		xchg			; adresa VRAM do DE&lt;br /&gt;
 		jc	PrtCharDiaN1	; skoč, ak je to znak bez diakritiky&lt;br /&gt;
 		ani	3Fh		; odmaskuj poradie znaku s diakritkou&lt;br /&gt;
 		mov	c,a		; v tabuľke a ulož do BC&lt;br /&gt;
 		mvi	b,0&lt;br /&gt;
 		lxi	h,CsChar	; tabuľka zodpovedajúcich znakov bez diakritiky&lt;br /&gt;
 		dad	b		; pripočítaj offset&lt;br /&gt;
 		mov	a,m		; a ulož do A základný znak&lt;br /&gt;
 PrtCharDiaN1:	sui	32		; uprav kód znaku na rozsah od 0&lt;br /&gt;
 		add	a		; kód znaku x2&lt;br /&gt;
 		mov	l,a		; ulož do HL&lt;br /&gt;
 		mvi	h,0&lt;br /&gt;
 		dad	h		; x4&lt;br /&gt;
 		dad	h		; x8; HL = (kód_znaku - 32) * 8&lt;br /&gt;
 		lxi	b,Font		; BC=bázová adresa fontu&lt;br /&gt;
 		dad	b		; pripočítaj k offsetu znaku&lt;br /&gt;
 		pop	psw		; obnov kód znaku a CY&lt;br /&gt;
 		push	h		; adresu predlohy znaku na zásobník&lt;br /&gt;
 		mvi	l,NN		; bez diakritického znamienka&lt;br /&gt;
 		jc	PrtCharDiaN2	; pre základné znaky skoč&lt;br /&gt;
 		ani	3Fh		; odmaskuj poradie znaku s diakritikou&lt;br /&gt;
 		mov	c,a		; v tabuľke a ulož do BC&lt;br /&gt;
 		mvi	b,0&lt;br /&gt;
 		lxi	h,CsDiaChar	; nájdi v tabuľke nižší byte predlohy&lt;br /&gt;
 		dad	b		; diakritického znamienka&lt;br /&gt;
 		mov	l,m		; a ulož do L&lt;br /&gt;
 PrtCharDiaN2:	mvi	h,FontDia/256	; vyšší byte adresy predlohy diakr. znamienka&lt;br /&gt;
 &lt;br /&gt;
 		xchg			; DE=predloha dia, HL=adresa VRAM&lt;br /&gt;
 PrtCharDiaC:	mvi	c,0		; atribut do C&lt;br /&gt;
 &lt;br /&gt;
 		mvi	b,4		; 4 mikroriadky nad znakom diakr. zn.&lt;br /&gt;
 PrtCharDiaK:	ldax	d		; vezmi byte predlohy diakr. zn.&lt;br /&gt;
 		inx	d		; posun na ďalší byte predlohy&lt;br /&gt;
 		xra	c		; pridaj atribút&lt;br /&gt;
 		mov	m,a		; ulož do VRAM&lt;br /&gt;
 		mov	a,l		; posun na nasledujúci mikroriadok&lt;br /&gt;
 		adi	40h&lt;br /&gt;
 		mov	l,a&lt;br /&gt;
 		jnc	PrtCharDiaK0	; skoč, ak nedošlo k pretečeniu&lt;br /&gt;
 		inr	h		; inak inkrementuj ešte H&lt;br /&gt;
 PrtCharDiaK0:	dcr	b		; opakuj pre celé diakritické znamienko&lt;br /&gt;
 		jnz	PrtCharDiaK&lt;br /&gt;
 &lt;br /&gt;
 		pop	d		; obnov predlohu základného znaku&lt;br /&gt;
 		mvi	b,8		; výška znaku 8 mikroriadkov&lt;br /&gt;
 PrtCharDiaL:	ldax	d		; vezmi byte predlohy&lt;br /&gt;
 		inx	d		; posun na další byte predlohy&lt;br /&gt;
 		xra	c		; pridaj atribút&lt;br /&gt;
 		mov	m,a		; ulož do VRAM&lt;br /&gt;
 		mov	a,l		; posun na nasledujúci mikroriadok&lt;br /&gt;
 		adi	40h&lt;br /&gt;
 		mov	l,a&lt;br /&gt;
 		jnc	PrtCharDiaL0	; skoč, ak nedošlo k pretečeniu&lt;br /&gt;
 		inr	h		; inak inkrementuj ešte H&lt;br /&gt;
 PrtCharDiaL0:	dcr	b		; opakuj pre celý znak&lt;br /&gt;
 		jnz	PrtCharDiaL&lt;br /&gt;
 		pop	b		; obnov registre&lt;br /&gt;
 		pop	d&lt;br /&gt;
 		pop	h&lt;br /&gt;
 		inx	h		; posun na ďalšiu znakovú pozíciu VRAM&lt;br /&gt;
 		mov	a,l		; opustili sme textový riadok?&lt;br /&gt;
 		ani	3Fh&lt;br /&gt;
 		cpi	48		; 48 znakov na riadok&lt;br /&gt;
 		rc			; nie, návrat&lt;br /&gt;
 PrtCharDiaCRLF:	mov	a,l		; áno, prejdi na ďalší textový riadok&lt;br /&gt;
 		ani	0C0h		; CR - návrat na začiatok riadku&lt;br /&gt;
 		mov	l,a&lt;br /&gt;
 		inr	h		; LF - ďalší riadok (12 mikroriadkov)&lt;br /&gt;
 		inr	h&lt;br /&gt;
 		inr	h&lt;br /&gt;
 		ret&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 ; tabuľka základných znakov, ktoré korešpondujú so znakmi s diakritikou podľa&lt;br /&gt;
 ; kódovania v KOI-8čs&lt;br /&gt;
 CsChar:		db	&amp;quot; a cder uiullonooarstu e yz     &amp;quot;&lt;br /&gt;
 		db	&amp;quot; A CDER UIULLONOOARSTU E YZ     &amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ; tabuľka nižších bytov adresy predlohy diakritického znamienka&lt;br /&gt;
 CsDiaChar:	db	NN,D1,NN,M1,M1,M1,D1,NN&lt;br /&gt;
 		db	P1,D1,K1,D2,M3,P1,M1,D1&lt;br /&gt;
 		db	V1,P1,M1,M1,M3,D1,NN,D1&lt;br /&gt;
 		db	NN,D1,M1,NN,NN,NN,NN,NN&lt;br /&gt;
 		db	NN,D2,NN,M2,M2,M2,D2,NN&lt;br /&gt;
 		db	P2,D2,K2,D2,M3,P2,M2,D2&lt;br /&gt;
 		db	V2,P2,M2,M2,M2,D2,NN,D2&lt;br /&gt;
 		db	NN,D2,M2,NN,NN,NN,NN,NN&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 ; dáta fontu&lt;br /&gt;
 Font:		binclude &amp;quot;../data/font.bin&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ; dáta diakritických znamienok&lt;br /&gt;
 ; Potrebujeme, aby predlohy diakritických znamienok neprekročili 256 bytovú&lt;br /&gt;
 ; &amp;quot;stránku&amp;quot;, teda aby mali všetky predlohy rovnaký vyšší byte adresy.&lt;br /&gt;
 	if (($ / 256) &amp;lt;&amp;gt; (($ + 48) / 256))&lt;br /&gt;
 		align	256		; zarovnanie na adresu MOD 256&lt;br /&gt;
 	endif&lt;br /&gt;
 FontDia:	binclude &amp;quot;../data/font-dia.bin&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ; definícia návestí na nižší byte adresy predlohy diakritických znamienok&lt;br /&gt;
 NN		equ	(FontDia+0)&amp;amp;255	 ; nič&lt;br /&gt;
 D1		equ	(FontDia+4)&amp;amp;255	 ; dĺžeň nad malým písmenom&lt;br /&gt;
 M1		equ	(FontDia+8)&amp;amp;255	 ; mäkčen nad malým písmenom&lt;br /&gt;
 M3		equ	(FontDia+12)&amp;amp;255 ; mäkčen pre malé/veľké L a malé T&lt;br /&gt;
 P1		equ	(FontDia+16)&amp;amp;255 ; prehláska nad malým písmenom&lt;br /&gt;
 K1		equ	(FontDia+20)&amp;amp;255 ; krúžok nad malým U&lt;br /&gt;
 V1		equ	(FontDia+24)&amp;amp;255 ; vokáň nad malým O&lt;br /&gt;
 D2		equ	(FontDia+28)&amp;amp;255 ; dĺžeň nad veľkým písmenom&lt;br /&gt;
 M2		equ	(FontDia+32)&amp;amp;255 ; mäkčen nad veľkým písmenom&lt;br /&gt;
 P2		equ	(FontDia+36)&amp;amp;255 ; prehláska nad veľkým písmenom&lt;br /&gt;
 K2		equ	(FontDia+40)&amp;amp;255 ; krúžok nad veľkým U&lt;br /&gt;
 V2		equ	(FontDia+44)&amp;amp;255 ; vokáň nad veľkým O&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 		end&lt;br /&gt;
 &lt;br /&gt;
 ;------------------------------------------------------------------------------&lt;br /&gt;
Výpis tabuľky znakov sa od predošlej verzie líši iba v tom, že vypisujeme až 10 skupín znakov, aby sme zahrnuli aj znaky s diakritikou a hlavne, po dosiahnutí kódu znaku 128 prejdeme priamo na kód 192, čo je začiatočný kód znakov s diakritikou.&lt;br /&gt;
&lt;br /&gt;
Samotná rutina pre výpis znaku {{Príkaz|PrtCharDia}} má už trošku viac odlišností. Na úvod sa opäť overuje rozsah podporovaných kódov znakov a pri nepodporovaných kódoch sa z rutiny hneď vrátime a daný kód sa odignoruje. Pre znaky bez diakritiky sa nastaví príznak {{Kbd|CY}} a odpamätá sa. Podľa tohto príznaku sa potom riešia odlišnosti medzi znakom bez diakritiky a s diakritikou.&lt;br /&gt;
&lt;br /&gt;
Pre znaky s diakritikou sú zadefinované dve tabuľky: Prvá tabuľka {{Príkaz|CsChar}} definuje základné znaky korešpondujúce so znakom s diakritikou. Ak sa z kódu znaku s diakritikou odmaskuje 6 spodných bitov, dostaneme offset (0 až 63) do tejto tabuľky a tak príslušný základný znak, nad ktorý sa pripojí dané diakritické znamienko.&amp;lt;br&amp;gt;Druhá tabuľka {{Príkaz|CsDiaChar}} obsahuje nižšie byty adresy predlohy príslušného diakritického znamienka. Tabuľka má opäť 64 položiek a zoznam obsahuje iba neskôr zadefinované symboly pomocou pseudoinštrukcie {{Príkaz|equ}}, aby sa zápis sprehľadnil. Predlohy diakritických znamienok sú, rovnako ako základný font, vložené do kódu pomocou pseudoinštrukcie {{Príkaz|binclude}} - návestie {{Príkaz|FontDia}}.&lt;br /&gt;
&lt;br /&gt;
Odlišnosti medzi znakom s diakritikou a bez sa riešia na dvoch miestach. Pred návestím {{Príkaz|PrtCharDiaN1}} sa vyhľadá základný znak zodpovedajúci znaku s diakritikou v tabuľke {{Príkaz|CsChar}}. Druhý prípad je za inštrukciou {{Príkaz|pop psw}}, kde sa pre znaky bez diakritiky pripraví do registra {{Kbd|L}} hodnota {{Príkaz|NN}}, čo je nižší byte predlohy &amp;quot;bez znamienka&amp;quot;. Pre znaky s diakritikou sa v tabuľke {{Príkaz|CsDiaChar}} nájde nižší byte predlohy daného diakritického znamienka a uloží do registra {{Kbd|L}}. Nakoniec sa do registra {{Kbd|H}} uloží vyšší byte adresy predlôh diakritických znamienok {{Príkaz|FontDia/256}}.&lt;br /&gt;
&lt;br /&gt;
Ako je vidieť, kód predpokladá, že predlohy diakritických znamienok neprekračujú &amp;quot;stránku&amp;quot; pamäte, teda že u všetkých diakritických znamienok je vyšší byte adresy rovnaký. To je zabezpečené podmienenou kompiláciou pomocou pseudoinštrukcie {{Príkaz|if/endif}}. Podmienka {{Príkaz|($&amp;amp;nbsp;/&amp;amp;nbsp;256)&amp;amp;nbsp;&amp;lt;&amp;gt;&amp;amp;nbsp;(($&amp;amp;nbsp;+&amp;amp;nbsp;48)&amp;amp;nbsp;/&amp;amp;nbsp;256)}} overuje, či sa celý font s diakritickými znamienkami vojde do &amp;quot;stránky&amp;quot; - font diakritických znamienok má veľkosť 48 bytov a symbol {{Kbd|$}} označuje aktuálnu ukladaciu adresu. Ak je podmienka splnená (font diakritických znamienok sa do &amp;quot;stránky&amp;quot; nevojde), pseudoinštrukciou {{Príkaz|align 256}} sa prevedie &amp;quot;zarovnanie&amp;quot; adresy &amp;#039;&amp;#039;&amp;#039;modulo 256&amp;#039;&amp;#039;&amp;#039;, čím sa dosiahne, že vyšší byte adresy pre každé diakritické znamienko bude rovnaký.&lt;br /&gt;
&lt;br /&gt;
Využívanie skutočnosti, že sú nejaké dáta konkrétne &amp;quot;zarovnané&amp;quot;, je veľmi užitočné, pretože to často skracuje kód. Napríklad, ak by sme mali nejakú tabuľku adries, kde by sme predpokladali, že každá adresa začína na párnej adrese, tak by sme pred tú tabuľku adries vložili pseudoinštrukciu {{Príkaz|align 2}}. Ak by sa kód pred tabuľkou akokoľvek menil, prekladač nám vďaka pseudoinštrukcii {{Príkaz|align}} zabezpečí, že tá tabuľka bude vždy začínať na párnej adrese.&lt;br /&gt;
&lt;br /&gt;
Podobne užitočná je aj podmienená kompilácia pomocou pseudoinštrukcií {{Príkaz|if/else/endif}} (existujú aj iné podmienené pseudoinštrukcie, viď dokumentácia k makroassembleru AS). Okrem toho, že počas vývoja môžeme pomocou podmienenej kompilácie jednoducho &amp;quot;odstaviť&amp;quot; niektoré časti kódu, umožňuje to aj vytvárať kód, ktorý sa prekladá pre nejakú konkrétnu &amp;quot;konfiguráciu&amp;quot;. Symbol, ktorý sa bude testovať v danej podmienke, môže byť zadaný aj v príkazovom riadku, ako parameter kompilátora. Tým môžeme mať jeden zdrojový kód, z ktorého sa na základe hodnoty nejakého symbolu môže vygenerovať rozdielny výsledný binárny kód.&lt;br /&gt;
== Na stiahnutie ==&lt;br /&gt;
ZIP archív obsahuje celý projekt, ako bolo popísané v minulej kapitole. V tejto kapitole sme mali 3 príklady, ktoré boli prezentované, ako osobitné súbory, avšak v projekte sú súčasťou jediného zdrojového súboru, kde sú v &amp;quot;hlavnom programe&amp;quot; volané postupne 3 rutiny s uvedenými troma príkladmi.&lt;br /&gt;
* [[download:141|ASM Program 1]]&lt;br /&gt;
----&lt;br /&gt;
[[Blog:Programovanie_v_assembleri_i8080_pre_PMD_85_(7)|&amp;amp;lt;&amp;amp;lt; Príprava projektu a nástrojov na editáciu zdrojového textu a jeho kompilovanie]]&lt;br /&gt;
&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[Blog:Programovanie_v_assembleri_i8080_pre_PMD_85_(9)|Píšeme texty &amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rombor</name></author>	</entry>

	</feed>