TTK-91 simulaattori ohtu-projektina
Yleiskuva
Tehdä uusi ttk-91 –koneen simulaattori, joka korvaa Koksi-simulaattorin tito-kurssin apuvälineenä.
Ryhmät: MALAN (Antti Tevanlinna), KOSKI (Raine Kauppinen)
Asiakas: Teemu Kerola
Vaillinaisista määrittelyistä pyydetään ottamaan yhteyttä asiakkaaseen, joka sitten molempia ryhmiä konsultoituaan tekee muutokset tähän dokumenttiin.
Perustavoitteet
- sopii hyvin tito-kurssin tarpeisiin (päätavoite)
- suorittaa kaikki vanhat, olemassa olevat ttk-91 ohjelmat
- konekäskyjen syntaksi ja semantiikka Häkkisen prujun ja Pascal-koodin mukaisesti
- toimii sekä Windows että Linux ympäristössä (erityisesti myös Windows XP:ssä)
- useampi palikka
- ohjelman valinta (lue levyltä) (nimeltään siis valinta, ei lataus kuten Koksissa)
- assembler kääntäjä (plus implisiittinen ”linkittäjä”)
- lue ohjelma levyltä (prog.k91)
- talleta binääri levylle (prog.b91)
- lataus (binäärin kopiointi ttk-91 koneen muistiin, rekistereiden alustus)
- suoritus (simulointi) erilaisten optioiden mukaisesti
- esim. käsky kerrallaan, seuraavaan I/O:hon asti, …
- debugger ympäristö (optioiden mukaisesti)
- debugger-käyttöliittymä englanniksi
- vähintään: helppoa lisätä uusi kieli (suomi, ruotsi) myöhemmin
- puhdas käännös ja suoritus -käyttöliittymä trainer2:sta varten (ks. alla) englanniksi
- vähintään: helppoa lisätä uusi kieli (suomi, ruotsi) myöhemmin
- graafinen suoritusaikainen suorituksen emulointi debuggerissa
- näytä kunkin käskyn jälkeen rekistereiden (mitkä kaikki?) ja muistin sisältö
- muistin näytössä (myös?) erikseen koodi ja datasegmentit
- ttk-91 ohjelmien editoinnin voi jättää pois
- dokumentointi englanniksi (tai suomeksi ja englanniksi)
- ttk-91 koneen speksit
- käyttöohje
- erillinen (voidaan linkata omalla www-linkillä)
- myös on-line (simulaattorin sisältä aktivoitavissa)
- liitteet (operaatiokoodit, jne)
- simulointikoodi helposti luettavissa
- tunnukset ja kommentit englanniksi
- koko koodi näytetään/esitellään tito-kurssilla
- helppo ylläpitää ja päivittää (esim. konekäskyn lisäys)
- mahdollisuus käyttää automaattisesti tarkistettavien harjoitustöiden yhteydessä
- myöhemmin tehtävä (ohtu K05?) trainer2 liitäntä
- sekä kääntäjässä että simulaattorissa sopiva ydin, jota voidaan ajaa serverillä
- syötteet merkkijonoja (ei tiedostonimiä): koodi, data
- tuloste merkkijonona (voi olla html:ää)
- kääntäjän ja simulaattorin ytimet string-arvoisia funktioita
- toinen käyttöliittymä (ks. Kuva 1) vain suoritusta ja tulostusta varten
- ytimet voidaan ajaa serverillä
- sama rajapinta (pinnat?) molemmilla ryhmillä (Tevanlinna & Kauppinen)
- ryhmät suunnittelevat ja sopivat
- poikkeustilanteet huomioitu (esim. käännös ei onnistunut)
Kuva 1. Pelkkä ohjelmien käännös ja suoritus (esim.)
Lisätavoitteet
- toimii myös itseään muuttaville ohjelmille
- koodisegmenttiä saa manipuloida load/store-käskyillä
- muutettu konekäsky tulostuu debuggerissa oikein (konekäskynä, jos laillinen)
- muistista näkyy rinnakkain sekä source code että numeerinen arvo (hex, kentittäin?)
- nykyhakemiston käsite mukaan
- optiot (esim. muistin koko)
- SHRA-käsky (aritmeettinen siirto oikealle)
- levy I/O
- tiedostonimi default (input/output) tai käyttöliittymästä?
- toteutus IN/OUT -käskyillä, laitetunnukset STDIN ja STDOUT
Optionaalisia tavoitteita
- graafinen käskyn suoritussyklin animointi (haluttaessa, ei aina)
- näytä käskyn suorituksen aikana
- mitä suorittimella tapahtuu (PC, IR, TR, MAR, MBR, …)?
- siirrä PC MAR:iin, odota, siirrä MBR IR:ään, …
- mitä väylällä tapahtuu (karkealla tasolla, leikkiprotokollan mukaisesti)
- ei tikra-kurssin tasolla (todellinen väyläprotokolla)
- laiteajurin toiminnan animointi laiterekisteritasolla
- mukana olevat (automaattisesti linkitetyt) laiteajurit kuten luennolla 9?
- suora I/O?
- epäsuora I/O?
- DMA I/O?
- vaatinee uuden konekäskyn (IEXIT) määrittelyn ja toteutuksen
- vrt. EXIT-käsky
- vaatinee SVC:n kunnon määrittelyn ja toteutuksen
- vrt CALL-käsky
- toimisi "vanhoille" SVC-komennoille kuten ennenkin
- ainoastaan
uudet SVC-käskyt tulisi toteuttaa kunnolla
- SVC SP, =DIR_OUT
- SVC SP, =INDIR_OUT
- SVC SP, =DMA_OUT
Standardeja
Binääritiedosto prog.b91
- tekstitiedosto
- välierottimena blanko, tab-merkkejä 1 tai useampi
- rivierottimena "\r\n" "\r", tai "\n"
- koodi: kokonaisluku per rivi
- data-alue: alkuosoite
- pinon alkuosoite (SP:n alkuarvo, eli ens. vapaan muistipaikan alkuosoite)
- symbolitaulu: symbolin nimi, arvo
- Sum.dmp (vanha memory dumppi käännöksen jälkeen)
0: |
52428801 |
3:1:0:0:1 |
SUM | IN R1, =KBD ; ohjelma alkaa |
1: |
18874378 |
1:1:0:0:10 |
STORE R1, LUKU | |
2: |
572522503 |
34:1:0:0:7 |
JZER R1, DONE ; luvut loppu? | |
3: |
36175883 |
2:1:1:0:11 |
load R1, SUMMA | |
4: |
287834122 |
17:1:1:0:10 |
ADD R1, LUKU | |
5: |
18874379 |
1:1:0:0:11 |
STORE R1, SUMMA | |
6: |
538968064 |
32:1:0:0:0 |
JUMP SUM | |
7: |
36175883 |
2:1:1:0:11 |
DONE | LOAD R1, SUMMA |
8: |
69206016 |
4:1:0:0:0 |
OUT R1, =CRT | |
9: |
1891631115 |
112:6:0:0:11 |
SVC SP, =HALT | |
10: |
0 |
0:0:0:0:0 |
||
11: |
0 |
0:0:0:0:0 |
Uusi binääriformaatti
___b91___ (varattu sana, 3 alaviivaa molemmin puolin )
___code___ (varattu sana)
0 9 (koodialueen alku ja loppu eli init FP)
52428801 (koodialue)
18874378
572522503
36175883
287834122
18874379
538968064
36175883
69206016
1891631115
___ data___ (varattu sana)
10 11 (data-alueen alku ja loppu eli init SP)
0 (data-alue)
0
___symboltable___ (varattu sana)
luku 10 (symbolitaulu, vain koodissa määritellyt paikalliset symbolit)
summa 11 (kääntäjän määrittelemät symbolit mukana oletusarvoisesti)
___end___ (varattu sana )
Rajapinta Trainer2:sta varten
- int compileAndRun (string prog, string data)
- palauttaa 0, jos OK
- palauttaa 1, jos käännösvirhe
- palauttaa 2, jos ajoaikainen virhe
- lisäksi systeemin suorituksen päättymishetken tila on tallessa kyselyjä varten
- int compileOnly (string prog)
- palauttaa 0, jos OK
- palauttaa 1, jos käännösvirhe
- lisäksi systeemin käännöksen jälkeinen tila
on tallessa kyselyjä varten
- binääri, jossa koodi ja symbolitaulu
- int InputKBD(string data), int InputSTDIN(string data)
- palauttaa 0, jos OK
- palauttaa 1, jos virhe
- määrittelee datavirran jatkossa tuleville execOnly-kutsuille
- int execOnly (int nrInstr)
- palauttaa 0, jos OK
- palauttaa 1, jos ajoaikainen virhe
- suorittaa nrInstr konekäskyä
- kutsun voi tehdä ainostaan, jos ohjelma on käännetty OK
- lisäksi systeemin suorituksen päättymishetken tila on
tallessa kyselyjä varten
- execOnly (1) suorittaa yhden käskyn kerrallaan
- execOnly (0) suorittaa ohjelman sen päättymiseen tai virhetilanteeseen asti
Syötteet:
- ohjelma: merkkijono .k91 formaatissa
- symbolisen konekielen avainsanoissa pienillä/isoilla kirjaimilla ei väliä
- pienillä/isoilla kirjaimilla ei ole väliä
- rivinvaihtona kelpaa "\r\n" "\r", tai "\n".
- esim. luettuna prog.k91
- esim. luettuna käyttöliittymäikkunasta
- ei tarvita prog.b91 formaatin mukaista sopivuutta
- dataKBD, dataSTDIN: merkkijono lukuja (rajoitin blanko, NL, LF, tab..)
- luettu käyttöliittymäikkunasta
- luettu käyttöliittymän valitsemasta syötetiedostosta (esim "stdin")
Kännöksen/suorituksen tilakyselyt :
- kääntäjän tulosteet
- string compilerOutput()
- virheilmoitukset tai OK
- string getB91()
- binääri tiedosto merkkijonona
- symbolitaulu symboltable
getSymbolTable(), int getSymbol(string S)
- hashtable symboltable
- alkiot: string, int
- hashtable symboltable
- string compilerOutput()
- ohjelman tulosteet string outputCRT(), string outputSTDOUT()
- merkkijono lukuja, jotka voi tulostaa ikkunassa (tai tallettaa tiedostoon "stdout")
- rajoittimena NL, LF
- järjestelmän tila lopuksi
- rekistereiden arvot
int [] getDevRegs()
- rekistereiden R0.. R7 nykyarvot kokonaislukuina
- int getReg(string R)
- tulos laiterekisterin arvo kokonaislukuna
- R: R0, R1, ..., R7, SP, FP, TR, PC (seuraava), IR (nykyinen),
PCcurr
Kun debugger pysähtyy käskyn suorituksen jälkeen, PC osoittaa seuraavaksi suoritettavaan käskyyn ja getReg(IR) näyttää sen käskyn (jos PC on laillinen), vaikka sitä ei oikeastaan ole vielä haettu muistiin. Virhetilanteissa PC osoittaa seuraavana vuorossa olleeseen käskyyn ja virheen aiheuttanut käsky löytyy rekisterin PCprev avulla.
- muistin sisältö
- koodialue dumppi varten int
[] getMem, int getMemLoc(int i)
- tulostetaan tekstimuotoisena, jossa kukin muistipaikka
- palauttaa: {osoite, kokonaisluku, kentät kokonaislukuina, käsky} (hex vai desimaali?)
- data-alue dumppia varten int
[] getData, int getDataLoc(int i)
- tekstimuotoinen tulostus
- palauttaa: {osoite, arvo}
- koodialue dumppi varten int
[] getMem, int getMemLoc(int i)
- suorituksen tila
- int getStatus()
( suoritustila tällä hetkellä)- 0 ohjelman suoritus vielä kesken, kaikki OK
- 1 SVC SP, =exit, eli ohjelma päättyi normaalisti
- 2 bad SVC call
- 3 device interrupt
- 11 integer overflow
- 12 divide by zero
- 13 unknown instruction (bad opcode)
- 14 unknown instruction (bad data access mode M)
- 15 forbidden memory address
- 21 bad device number
- 22 cannot read KBD
- 23 cannot read STDIN
- 24 cannot write CRT
- 25 cannot write STDOUT
- onko muita?
- int getInterruptsDisabledState()
- 0 not disabled
- 1 disabled
- int getComparisonStatus()
- -1 less
- 0 equal
- 1 greater
- int getLimit()
- palauttaa muistin koon
- int getStatus()
- rekistereiden arvot
int [] getDevRegs()
Muut metodit käännös- ja simulointikoneelle?
- string executeOneInstruction(...)
- etc
Levy I/O
- IN Rj,=STDIN
- OUT Rj, =STDOUT
- STDIN on oletusarvoisesti ”stdin” nykyhakemistossa. Sitä voidaan vaihtaa käyttöliittymässä. Sama STDOUT:ille.
- parametreja nykyhakemisto, STDIN, STDOUT voi myös vaihtaa uusilla valekäskyillä
- HOMEDIR DEF MyHomeDir
- STDIN DEF MyInputFileName
- STDOUT DEF MyOutputFileName
- MEMSIZE DEF MyTTK91MemSize (default 512)
- ….?????....
Uusien vakiosymbolien arvoja
SHRA 0x1B eli 27
STDIN 6
STDOUT 7
KBD 1 (vanhoja, mutta ei kunnolla dokumentoituja)
CRT 0
muut vakiosymbolit löytää .dmp tiedostojen avulla...
Vielä auki ja päättämättä
- Pitääkö käännöksessä olla myös
optiot, kuten nyky-Koksissa?
- käännä riveittäin?
- käännä riveittäin kommentoinnin kera?
- onko vielä muita virhekoodeja ohjelman päättymiselle/keskeytymiselle?