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
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ää tavoitteita
- 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ä?
- laiteajurin kutsu SVC:n avulla kuten luennolla 9
- 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?
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 ; Summa <- Summ | |
4: |
287834122 |
17:1:1:0:10 |
ADD R1, LUKU | |
5: |
18874379 |
1:1:0:0:11 |
STORE R1, SUMMA ; summa muuttuj | |
6: |
538968064 |
32:1:0:0:0 |
JUMP SUM | |
7: |
36175883 |
2:1:1:0:11 |
DONE | LOAD R1, SUMMA ; tulosta 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
___code___ (varattu sana, 3 alaviivaa molemmin puolin )
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)
summa 11
___end___ (varattu sana )
Rajapinta Trainer2:sta varten
- int string compileAndRun (string prog, string data)
- palauttaa 0, jos OK
- palauttaa 1, jos käännösvirhe
- palauttaa 2, jos ajoaikainen virhe
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
- data: merkkijono lukuja (rajoitin blanko, NL, LF, tab..)
- luettu käyttöliittymäikkunasta
- luettu syötetiedostosta
Tuloste:
- kääntäjän tulosteet (virheilmoitukset tai OK) string getCompOutput()
- ohjelman tulosteet string getOutput()
- merkkijono lukuja, jotka voi tulostaa ikkunassa
- 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, IR, TR, PC, PCprev, IRprev
- muistin sisältö
- koodialue dumppi int []
getMem: int getMemLoc(int i)
- tekstimuotoinen
- osoite kokonaisluku kentät käsky tekstinä
- data-alue dumppi int
[] getData, int getDataLoc(int i)
- tekstimuotoinen
- osoite arvo
- koodialue dumppi int []
getMem: int getMemLoc(int i)
- symbolitaulu symboltable
getSymbolTable(), int getSymbol(string S)
- hashtable symboltable
- alkiot: string, int
- hashtable symboltable
- 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
- syiden koodaus vielä kesken??
- 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 voisi 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...
">Teemu Kerola