Blog:Programovanie v assembleri i8080 pre PMD 85
Z PMD 85 Infoserver
Obsah |
Úvod
V niekoľkých článkoch sa tu pokúsim priniesť základné informácie o programovaní v assembleri i8080 pre PMD 85. Na webe sa síce v oblasti programovania i8080 nachádza množstvo "tutoriálov" (aj v českom jazyku), takže to možno bude miestami nosenie dreva do lesa (hlavne v prvých kapitolách), budem sa ale snažiť viazať výklad na špecifiká PMD 85.
Pri spisovaní týchto článkov som samozrejme nevysypal všetko z hlavy, naopak, čerpal som z mnohých zdrojov, prípadne som sa nimi inšpiroval. V prvom rade mi bola pomocníkom dvojica knižiek Assembler a ZX Spectrum od Tomáša Vilíma, ďalej príručka Programovanie v jazyku symbolických adries na PMD 85, kniha Porty, byty, osmibity od Martina Malého, ale i ďalšie podobné články na internete.
Začneme stručným popisom toho, čo je assembler, popisom mikroprocesora i8080, jeho programátorským modelom a jeho inštrukčnej sady, naučíme sa vypisovať znaky, texty i čísla, testovať klávesnicu, vydávať jednoduché zvuky, vyhodnocovať aritmetické výrazy, kresliť čiary, zobrazovať sprity a možno sa dostane aj na nejakú jednoduchú hru. V neposlednom rade si popíšeme kompilátor i ďalšie utility, ktoré budeme používať na skúšanie našich príkladov.
Ak pre vás už Assembler nie neznámy pojem a poznáte aj inštrukčnú sadu i8080, môžete hneď preskočiť na kapitolu, kde popisujem, ako si pripraviť projekt a rôzne nástroje pre kompiláciu. Pri nejasnostiach sa však vždy môžete vrátiť k týmto všeobecným kapitolám.
Čo je assembler?
Slovo Assembler sa používa v dvoch významoch:
- programovať v assembleri - assembler ako "nízkoúrovňový" jazyk (Jazyk symbolických adries (JSA) alebo Jazyk symbolických inštrukcií (JSI))
- používať assembler - assembler ako nástroj (kompilátor JSA/JSI)
Programovanie v assembleri je teda napísanie programu v JSA a jeho skompilovanie do výslednej "binárnej formy", alebo tiež do strojového kódu, ktorému už priamo mikroprocesor rozumie.
symbolická forma | číselná forma | význam | ||
---|---|---|---|---|
mov a,b | 01111000b | 78h | 120 | B <-- A |
Uvedená inštrukcia prenáša obsah registra B do registra A. Mnemonika (typ inštrukcie) - mov - hovorí, ČO sa má urobiť, a,b - operandy hovoria S ČÍM sa to má urobiť. Vo všeobecnosti, inštrukcia obsahuje mnemoniku vždy, operandy môžu byť jeden, dva alebo žiadne (v tom prípade operandy vyplývajú z mnemoniky alebo sú implicitné).
Popis všetkých inštrukcií i8080 i samotného assembleru (kompilátora) bude uvedený neskôr.
Mikroprocesor i8080
i8080 je 8 bitový mikroprocesor, ktorý bol uvedený na trh firmou Intel v roku 1974. Československá Tesla vyrábala tento mikroprocesor pod označením MHB 8080A.
Mikroprocesor komunikuje so svojim okolím prostredníctvom 8 bitovej dátovej zbernice a 16 bitovej adresovej zbernice za pomoci niekoľkých riadiacich signálov. Adresa vyberá bunku pamäte alebo periférne zariadenie, kam/odkiaľ sa bude zapisovať/čítať hodnota na dátovej zbernici. Po ôsmych bitoch dátovej zbernice môže prenášať hodnotu 0 až 255 (00h až 0FFh) a 16 bitová adresová zbernica umožňuje adresovať 65536 pamäťových buniek - 0 až 65535 (0000h až 0FFFFh). Mikroprocesor môže pristupovať k 256-tim vstupno/výstupným portom s adresami 0 až 255 (00h až 0FFh).
Registre mikroprocesora i8080
Mikroprocesor i8080 poskytuje pre programátora 7 všeobecných 8 bitových registrov (A, B, C, D, E, H, L), register príznakov F, 16 bitový programový čítač PC a 16 bitový ukazateľ zásobníka SP.
Registre mikroprocesora i8080 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Registrový pár |
A | F | PSW (Processor Status Word) | ||||||||||||||
B | C | B | ||||||||||||||
D | E | D | ||||||||||||||
H | L | H | ||||||||||||||
SP - Ukazateľ zásobníka | (Stack Pointer) | |||||||||||||||
PC - Programový čítač | (Program Counter) |
Príznakový register F | |||||||
---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
S | Z | 0 | AC | 0 | P | 1 | CY |
Register A - akumulátor - je najdôležitejší register, pretože sa zúčastňuje väčšiny aritmetických a logických operácií.
Dvojice registrov B a C, D a E, H a L možno používať ako 16 bitové registre v pároch B, D a H. Registrový pár H sa používa ako "pseudo-register" M (Memory) pri presunoch údajov medzi pamäťou a registrami - nepriame adresovanie. Akumulátor A a register príznakov F tvoria spolu 16 bitový register PSW.
Je dôležité si uvedomiť, že ak pracujeme s registrovým párom, menia sa aj jeho jednotlivé registre. A naopak, zmena hodnoty jednotlivého registra zmení hodnotu registrového páru.
K registrovým párom ešte zostáva doplniť, ako je v nich hodnota uložená. Ak je v registri HL hodnota 42841, tak v registri H (vyšší byte) je hodnota 167 (celá časť podielu 42841/256) a v registri L (nižší byte) je hodnota 89 (zbytok po delení 42841/256). Opačne, ak naplníme jednotlivé registre nejakými hodnotami, tak v registrovom páre bude hodnota HL=256*H+L. Toto samozrejme platí aj pre ostatné registrové páry.
Niekedy sa v texte nepoužíva slovné spojenie registrový pár, ale priamo sa hovorí napr. o registri HL, čo je v danom kontexte často zrozumiteľnejšie. Naopak, v samotných inštrukciách sa používa vždy ako operand iba označenie napr. H a či sa jedná o jednoduchý register alebo o registrový pár je dané mnemonikou inštrukcie.
Čo sa týka 16 bitových čísel a ich uloženia v pamäti, tak sa používa tzv. Little Endian, čo znamená, že 2 byty hodnoty sú v pamäti uložené v poradí najprv nižší byte a potom vyšší byte. Takto ukladajú a čítajú 16 bitové hodnoty do/z pamäte všetky inštrukcie pracujúce so 16 bitovými hodnotami.
Príznakový register F obsahuje 5 príznakov, na základe ktorých sa môže program vetviť - inštrukcie podmienených skokov, volaní podprogramov a návratov z podprogramu. Stav príznakov sa mení po vykonaní inštrukcie. Niektoré inštrukcie nemenia žiadne príznaky.
- S - Sign flag (znamienko) - Príznak záporného výsledku - kopíruje sa doň 7. bit výsledku v akumulátore. Čísla väčšie ako 127 sú chápané ako záporné. Príznak má hodnotu 0 (v podmienke sa označuje P (plus)) pre kladné číslo, alebo hodnotu 1 (v podmienke sa označuje M (minus)) pre záporné číslo.
- Z - Zero flag - Príznak nulového výsledku - má hodnotu 1 pre nulový výsledok (v podmienke sa označuje Z (zero)), alebo hodnotu 0 pre nenulový výsledok (v podmienke sa označuje NZ (not zero)).
- AC - Auxilliary Carry flag - Pomocný príznak prenosu z 3. bitu do 4. - nie je možné ho testovať priamo a využíva ho interne iba inštrukcia DAA pre desiatkovú korekciu.
- P - Parity flag - Príznak parity - má hodnotu 1, ak je počet jednotiek v akumulátore párny (v podmienke sa označuje PE (parity even)), alebo hodnotu 0, ak je počet jednotiek v akumulátore nepárny (v podmienke sa označuje PO (parity odd)).
- CY - Carry flag - Príznak pretečenia - má hodnotu 0, ak nedošlo k pretečeniu (v podmienke NC (No Carry)), alebo hodnotu 1, ak k pretečeniu došlo (v podmienke C (Carry)). K pretečeniu dôjde, ak sa sčítajú dve čísla, napr. 200 a 100. Výsledok by mal byť 300, avšak toto číslo sa nevojde do 8 bitov, výsledok teda bude 44 a bude nastavený príznak Carry. Obdobne je to pri odčítaní alebo pri sčítaní dvoj-registrov. Tento príznak možno individuálne nastaviť alebo jeho hodnotu zmeniť na opačnú. Je vhodný pri aritmetických operáciách s číslami väčšími ako 8/16 bitov. Príznak Carry tiež využívajú inštrukcie rotácií.
Čítač inštrukcií PC ukazuje vždy na inštrukciu, ktorá sa bude vykonávať. Jeho hodnota sa mení po vykonaní inštrukcie o 1 až 3, podľa dĺžky vykonanej inštrukcie. Ak sa jedná o inštrukciu skoku, volania podprogramu alebo návratu z podprogramu, PC nadobudne hodnotu v závislosti od konkrétnej inštrukcie, jej adresného argumentu alebo stavu príznakov.
Ukazateľ zásobníka SP obsahuje adresu vrcholu zásobníka. Zásobník slúži na uloženie návratovej adresy pri volaní podprogramu a dočasné odloženie údajov v registrových pároch. Zásobník "rastie" k nižším adresám, čo znamená, že pri vložení údaja do zásobníka sa adresa zásobníka zníži o 2 a pri vybraní údaja sa zvýši o 2.
Inštrukčná sada mikroprocesora - Inštrukcie pre presun dát >>