Fejlesztés Development | CPU | Számítógép Computer | Assembler | Monitor | Függvények Library


Parancsok: Commands: help | ver | mem | dump | load | go | reg | rX,sp,lr,pc,f

Melléklet Appendix


Lang: Nyelv: HU EN

PMon monitor program

A monitor program egy egyszerű firmware, amely lehetővé teszi az alkalmazói programnak a betöltését a számítógép memóriájába. Mivel a PMon a p2223 CPU utasításait felhasználva íródott, és a felhasználóval az UART periférián keresztül tartja a kapcsolatot, ezért csak a p2223 típusú CPU-t tartalmazó, v2 típusú számítógépen használható.

Felhasználói felület

A számítógép UART perifériájához az FPGA kártyán egy USB-UART átalakító van kapcsolva, amelynek az USB portját összeköthetjük egy PC-vel. Az átalakító a PC operációs rendszere számára egy VCP (Virtual COM Port) eszközként látszik, amely aszinkron soros perifériaként használható. A PC-n indítsunk el egy terminál emulátor programot (pl. TeraTerm, putty, stb.) és nyissuk meg az FPGA kártya csatlakoztatásakor létrejövő COM portot. Állítsuk be a 115200,N,8,1 paramétereket.

A PMon egy parancssoros program, amely a prompt kiírása után egy parancs begépelését várja. Az ENTER lenyomása után értelmezi a beírt utasítást és végrehajtja a megfelelő műveletet.

A parancsok egy szóból állnak, amelyet szóközzel elválasztva paraméter(ek) követhet(nek). A paramétereket szóközzel kell elválasztani.

A parancsok a legtöbb esetben rövidíthetőek a szó első betűjével. A paraméterek általában számok, amelyeket hexadecimális számrendszerben kell beírni, 0x, H, $ és egyéb jelek nélkül. Tagolásként a beírt hexadecimális számokba írhatunk . vagy _ jeleket, ezeket a monitor figyelmen kívül hagyja. Az A..F értékű jegyeket kis és nagybetűvel is beírhatjuk.

A monitor által kiírt adatok mindig hexadecimális számrendszerben, nagybetűvel íródnak ki. A könnyebb olvashatóság érdekében a monitor által kiírt 32 bites értékek hexadecimális alakjában négy jegyenként egy _ jel van.

Parancsok

h[elp],?

Kiírja a használható parancsok listáját és a szükséges, illetve lehetséges paramétereket.

PMonitor v1.1 (cpu: v2.2.7) :help m[em] addr [val] Get/set memory d[ump] start end Dump memory content l[oad] Load hex file to memory g[o]|run [addr] Run from address r[eg[s]] Print registers rX [val] Get/set RX sp [val] Get/set R13 lr [val] Get/set R14 pc [val] Get/set R15 f [val] Get/set flags v[er] Print pmon and cpu version h[elp],? Help :

v[er]

Kiírja a monitor program és a CPU verzióját, valamint a CPU feature regisztereinek az értékét:

:ver pmon: 1.4 cpu: 2.2.10 feat1: 0000000F feat2: 00000000 :

m[em] addr [val]

Memória egy adott című rekeszének vizsgálata, vagy módosítása. Az első paraméter a vizsgált rekesz címe (hexadecimálisan). Ha a második paramétert nem adjuk meg, akkor a parancs a megadott című szót írja ki (a címmel együtt), ha megadjuk a második paramétert, akkor először az érték a memóriába kerül, majd ezután íródik ki (a már módosított) memória tartalom.

:m 1 0000_0001 01D2_0093 :m 1 deadbeef 0000_0001 DEAD_BEEF :

d[ump] start [end]

Egy adott memóriaterület tartalmát listázza ki. A kezdőcímet kötelező megadni. Ha a vég címet nem adjuk meg, akkor 17 egymás utáni szó értéke íródik ki.

:d 10 0000_0010 0000_000A 0000_0011 0000_0000 0000_0012 01A4_0001 0000_0013 01F2_0003 0000_0014 0000_0000 0000_0015 0DED_0000 0000_0016 0D1D_0000 0000_0017 0D2D_0000 0000_0018 0D3D_0000 0000_0019 0710_0014 0000_001A 0720_FF20 0000_001B 001F_0000 0000_001C 002F_0000 0000_001D 0018_0200 0000_001E 11F2_0029 0000_001F 0710_0014 0000_0020 0030_0000 :d 10 14 0000_0010 0000_000A 0000_0011 0000_0000 0000_0012 01A4_0001 0000_0013 01F2_0003 0000_0014 0000_0000 :

l[oad]

Lefordított alkalmazói program betöltése a memóriába. A parancsnak nincs paramétere, a betöltéshez szükséges adatok a lefordított fájlban vannak. A parancs p2h formátumú fájl tartalmát várja, ezt az assembler segítségével állíthatjuk elő.

A parancs kiadása után várakozik, a fájl tartalmát a terminálon kell elküldeni. Erre használjuk a terminál emulátor megfelelő funkcióját. TeraTerm esetén pl. a File menü Send file pontja használható:

Válasszuk ki a lefordított programból készült .p2h kiterjesztésű fájlt:

A program a soros vonalon elküldi a fájl tartalmát. A load parancs értelmezi a fájlban lévő rekordokat, ezeknek a típusát kiírja a terminálra. A memória tartalmat meghatározó rekordoknak megfelelően módosítja a memóriát. A fájl végét jelző rekord után kilép, és újra megjelenik a monitor promptja:

g[o],run [addr]

Ez a parancs a felhasználói programot indítja el a megadott címtől. Ha a program visszalép a monitorhoz a megfelelő szubrutin meghívásával, akkor ettől a ponttól a programot lehet folytatni. Ehhez nem kell megadni a go parancsnak paramétert. Ez a módszer nem működik, ha még nem volt átlépés a programról a monitorra.

r[eg[s]]

Kiírja azokat a regiszter értékeket, amelyeket a program betölt a go parancs hatására a felhasználói program indítása előtt. Ezeket az értékeket akkor menti el a monitor program, amikor a felhasználó program visszatér a monitorhoz a megfelelő szubrutin hívással. Az első sor arról tájékoztat, hogy ilyen mentés történt-e már, vagy még nem:

:r Monitor not called by user R0 0000_0000 R1 0000_0000 R2 0000_0000 R3 0000_0000 R4 0000_0000 R5 0000_0000 R6 0000_0000 R7 0000_0000 R8 0000_0000 R9 0000_0000 R10 0000_0000 R11 0000_0000 R12 0000_0000 SP 0000_F7FF LR 0000_0000 PC 0000_0000 F 0000_0000 U0 P0 O0 Z0 C0 S0 :

Az utolsó sorban az egyes flag bitek értéke egyenként is látható. A monitor hívása után:

PMonitor v1.1 (cpu: v2.2.7) Stop at: 0000_0004 :r Monitor called from: 0000_0004 R0 0000_0000 R1 0000_F5E7 R2 0000_0012 ... SP 0000_0093 LR 0000_0004 PC 0000_0004 F 0000_0000 U0 P0 O0 Z0 C0 S0 :

A PC és az LR a hívás helyét követő utasításra mutat, ahonnan a felhasználói program folytatható. Ettől a címtől a programot a paraméter nélküli go parancs kiadásával folytathatjuk.

rX|sp|lr|pc|f [val]

Az egyes regiszterek elmentett értékeit megjelenítő, illetve megváltoztató parancsok. A regiszter névben (rX) 0 és 15 közötti számokat használhatunk, az r13 helyett írhatunk sp nevet, az r14 helyett lr-t, míg az r15 helyett a pc név is használható. A f név a Flag regiszter elmentett értékének kezelésére szolgál.

:r10 R10 0000_00D8 :r10 ab_45 R10 0000_AB45 :

Monitor szolgáltatások

A monitor programban található egyes szubrutinok a felhasználói programok fejlesztése során is hasznosak lehetnek, a megfelelő CALL utasításokkal meghívhatók. Az alábbiakban megadjuk a meghívható szubrutinok címeit és a funkciókat.

Az egyes szubrutinok a bemenő és kimenő paraméterek átadására használt regisztereken, és a Flag regiszteren kívül egyéb regisztereket nem módosítanak, az esetleges ettől eltérő eseteket külön jelezzük.

A monitor meghívása

0xf005 _pm_cold_start

Végleges kilépés az alkalmazói programból a monitor újraindításával. Kezdeti értékre állítja a monitor állapotát, így a felhasználói program a paraméterek nélküli go paranccsal nem folytatható. Ezt a funkciót szubrutinhívás mellett ugró utasításokkal is meghívhatjuk. A funkciónak nincsenek paraméterei.

0xf000 _pm_callin

Visszatérés a monitor programba a felhasználó program állapotának az elmentésével. Ezután a program folytatható a paraméter nélküli go paranccsal. A funkciónak nincsenek paraméterei.

0xf001 _pm_enter_by_uart

Feltételes visszatérés a monitor programhoz. A szubrutin ellenőrzi, hogy van-e olvasható vett karakter az UART áramkörben. Ha igen, kiüríti az UART-ot és meghívja a callin funkciót, vagyis visszatér a monitorhoz. Olyan program esetében használhatjuk, amely nem végez adat beolvasást a terminálról az UART-on keresztül. A funkciónak nincsenek paraméterei.

0xf003 _pm_version

A monitor program verziószámának lekérdezése. A függvény az R0 regiszter 1. bájtjában helyezi el a fő verziószámot, a 0. bájtban pedig az al verziószámot.

Sztring kezelés

0xf017 _pm_strunpack

Normál vagy pakolt sztring átalakítása normál formátumra. A megfelelő méretű kimeneti bufferről a hívás előtt kell gondoskodni.

Bemenő paraméterek:

Eredmény:

Az átalakított sztring az R1-ben megadott memóriacímtől kezdeve.

0xf018 _pm_strpack

Normál vagy pakolt sztring átalakítása pakolt formátumra. A megfelelő méretű kimeneti bufferről a hívás előtt kell gondoskodni.

Bemenő paraméterek:

Eredmény:

Az átalakított sztring az R1-ben megadott memóriacímtől kezdeve.

0xf006 _pm_strchr

Karakter első előfordulásának keresése egy szövegben.

Bemenő paraméterek:

Eredmény:

0xf007 _pm_streq

Sztringek összehasonlítása, a kis- és nagybetűk különbözőnek számítanak.

Bemenő paraméterek:

Eredmény:

0xf00c _pm_strieq

Sztringek összehasonlítása, a kis- és nagybetűk egyezőnek számítanak.

Bemenő paraméterek:

Eredmény:

0xf009 _pm_hexchar2value

Egy hexadecimális számjegy karakter kódjának szám értékre való átalakítása.

Bemenet:

Eredmény:

0xf00a _pm_value2hexchar

Egy 0-15 közötti számérték átalakítása a megfelelő hexadecimális számjegy ASCII kódjára.

Bemenet:

Eredmény:

0xf00b _pm_htoi

Hexadecimális szám jegyeit tartalmazó sztring átalakítása számértékké. A szövegben kis- és nagybetűk is használhatók (a-f, A-F), a tagolásra használt . (pont) vagy _ (aláhúzás) karakterek figyelmen kívül maradnak. Érvénytelen karakter esetén a feldolgozás megáll, az eredmény az addig feldolgozott sztring részletnek megfelelő lesz.

Bemenet:

Eredmény:

Bemeneti adatok kezelése

0xf008 _pm_check_uart

Az UART vevő állapotának vizsgálata. Azt mutatja meg, hogy van-e az UART-ban beolvasható vett karakter. A funkciónak nincs bemeneti paramétere.

Eredmény:

0xf00d _pm_read

Az UART vevő áramkörének kiolvasása. A szubrutin nem vár új karakterre, a vevő állapotát előzőleg a _pm_check_uart funkcióval kell vizsgálni. Nincs bemenő paramétere.

Eredmény:

0xf002 _pm_getchar

Várakozás egy karakter vételére, majd a karakter kiolvasása az UART áramkörből.

Eredmény:

Kimenet előállítása a terminálon

0xf00e _pm_putchar

Egy karakter kiírása a terminálra (küldése UART-on). A szubrutin először megvárja, hogy az UART küldő áramköre szabad legyen, tehát az előző karakter küldése befejeződjön. Ezután átadja a küldendő karaktert az UART-nak.

Bemenet:

0xf00f _pm_prints

Egy 0 végződésű karaktertömb (sztring) kiírása a terminálra. A szubrutin a sztring tartalmát nem értelmezi, így abban ú.n. escape szekvenciák nem használhatók.

Bemenet:

0xf010 _pm_printsnl

Egy 0 végződésű karaktertömb, majd egy újsor karakter (\n) kiírása a terminálra. Escape szekvenciák nem használhatók.

Bemenet:

0xf011 _pm_print_vhex

Egy 32 bites érték kiírása a terminálon hexadecimális számrendszerben, 8 jegyen, bevezető nullákkal. A szubrutin a számjegyek között _ (aláhúzás) karaktert használ tagolásra. Az a-f értékek nagybetűvel íródnak ki.

Bemenet:

0xf013 _pm_printd

Egy 32 bites, előjel nélküli (bináris) szám kiírása a terminálra tízes számrendszerben, az értéktől függő számú számjeggyel, bevezető nullák nélkül.

Bemenet:

0xf012 _pm_pes

Beágyazott, 0 végződésű karaktertömb kiírása a terminálra. A sztringnek a program kódjában közvetlenül a szubrutint meghívó CALL utasítás után kell lennie. A szubrutin a sztring záró nullája utáni címre fog visszatérni. A funkciónak sem bemeneti, sem kimeneti paraméterei nincsenek. Helyes használatára egy példa:

_pm_pes equ 0xf012 nop

call _pm_pes db ”Hello World” mvzl r0,12 ...

A sztringet a CALL-t követő DB direktívával kell létrehozni, kettős idézőjelek között, ami biztosítja a záró 0 érték elhelyezését.

0xf014 _pm_printf

Formázott szöveg kiírása a terminálra. A szövegben elhelyezhetők formázó utasítások (% jellel kezdve), amelyek egy adat megfelelő formátumban való kiírását eredményezik. Az adatokat az R1..R12 regiszterekben adhatjuk át, amelyekből sorban annyit használ fel a szubrutin, amennyi formázó utasítás van a szövegben.

Bemenetek:

A szubrutin által kezelt formázó utasítások a következők:

Utasítás Formátum Példa, megjegyzés
%% Százalékjel %
%u, %d Előjel nélküli decimális 12345
%x 32 bites hexadecimális 1A2B3C5D
%s Szöveg az adat regiszternek a beillesztendő szöveg címét kell tartalmaznia
%c Karakter az adat regiszterben lévő ASCII kódot írja ki

0xf015 _pm_pesf

Beágyazott, 0 végződésű formázó szöveg kiírása a terminálra. A formázó szövegnek közvetlenül a CALL utasítás után kell lennie, a további paraméterek a printf szubrutinéval egyeznek (ez a funkció az R0 regiszterben nem vár bemenő adatot).

UART_CPB = 0xff44 _pm_pesf = 0xf015 ld r1,UART_CPB mov r2,r1 call _pm_pesf db ”Uart cpb= %d (0x%x)\n” nop ...

Egyéb függvények

0xf004 _pm_itobcd

Előjel nélküli bináris kódolású szám átalakítása BCD kódolásúra. Az R0 regiszterben megadott bemeneti adat maximum 99999999 lehet, az eredmény az R0 regiszterben keletkezik.

0xf016 _pm_ascii2seg

ASCII kód átalakítása hét szegmenses kódra, amelyet a megadott karakter kijelzőn való megjelenítéséhez használhatunk.

Bemenet:

Eredmény:

Megjegyezzük, hogy a kijelzőn nem minden karakter jeleníthető meg, ezek esetében a kimenet 0 lesz. Néhány esetben a kis- és a nagybetűkhöz ugyanazt az eredményt kapjuk (pl e, E), ha csak a karakter egyik formája jeleníthető meg.

Melléklet

Monitor szubrutinok abc sorrendben

név cím paraméterek eredmény
_pm_ascii2seg 0xf016 R0 ascii kód R4 szegmens kód
_pm_callin 0xf000 - -
_pm_check_uart 0xf008 - F.C van adat
_pm_cold_start 0xf005 - -
_pm_enter_by_uart 0xf001 - -
_pm_getchar 0xf002 - R0 karakter
_pm_hexchar2value 0xf009 R0 karakter R0 érték, F.C helyes
_pm_htoi 0xf00b R0 sztring R1 érték, F.C helyes
_pm_itobcd 0xf004 R0 érték R0 érték
_pm_pes 0xf012 R0 sztring, R1..R12 -
_pm_pesf 0xf015 R1..R12 -
_pm_print_vhex 0xf011 R0 érték, R1 tagolás -
_pm_printd 0xf013 R0 érték -
_pm_printf 0xf014 R0 sztring, R1..R12 -
_pm_prints 0xf00f R0 sztring -
_pm_printsnl 0xf010 R0 sztring -
_pm_putchar 0xf00e R0 karakter -
_pm_read 0xf00d - R0 karakter
_pm_strchr 0xf006 R0 sztring, R1 karakter R1 cím, F.C van találat
_pm_streq 0xf007 R0, R1 sztringek F.C egyezés
_pm_strieq 0xf00c R0, R1 sztringek F.C egyezés
_pm_strpack 0xf018 R0 sztring, R1 buffer -
_pm_strunpack 0xf017 R0 sztring, R1 buffer -
_pm_value2hexchar 0xf00a R0 érték R1 karakter
_pm_version 0xf003 - R0 verzió

Monitor szubrutinok cím szerinti sorrendben

cím név paraméterek eredmény
0xf000 _pm_callin - -
0xf001 _pm_enter_by_uart - -
0xf002 _pm_getchar - R0 karakter
0xf003 _pm_version - R0 verzió
0xf004 _pm_itobcd R0 érték R0 érték
0xf005 _pm_cold_start - -
0xf006 _pm_strchr R0 sztring, R1 karakter R1 cím, F.C van találat
0xf007 _pm_streq R0, R1 sztringek F.C egyezés
0xf008 _pm_check_uart - F.C van adat
0xf009 _pm_hexchar2value R0 karakter R0 érték, F.C helyes
0xf00a _pm_value2hexchar R0 érték R1 karakter
0xf00b _pm_htoi R0 sztring R1 érték, F.C helyes
0xf00c _pm_strieq R0, R1 sztringek F.C egyezés
0xf00d _pm_read - R0 karakter
0xf00e _pm_putchar R0 karakter -
0xf00f _pm_prints R0 sztring -
0xf010 _pm_printsnl R0 sztring -
0xf011 _pm_print_vhex R0 érték, R1 tagolás -
0xf012 _pm_pes R0 sztring, R1..R12 -
0xf013 _pm_printd R0 érték -
0xf014 _pm_printf R0 sztring, R1..R12 -
0xf015 _pm_pesf R1..R12 -
0xf016 _pm_ascii2seg R0 ascii kód R4 szegmens kód
0xf017 _pm_strunpack R0 sztring, R1 buffer -
0xf018 _pm_strpack R0 sztring, R1 buffer -