Izvajalnik ukazov
Obravnava težav
Pri izvajanju ukazov lahko pride do različnih težav. Napišite metode (v razredu Machine
), ki obravnavajo morebitne težave. V primeru težave naj se na standardni izhod za napake izpiše ustrezno obvestilo.
Primeri metod:
// Ni ravno težava stroja, bolj težava programerja. :)
void notImplemented(String mnemonic)
// Izvajalnik je naletel na operacijsko kodo ukaza, ki ni veljavna.
void invalidOpcode(int opcode)
// Neveljavno naslavljanje.
void invalidAddressing()
Po potrebi boste podobne metod kasneje še dodali za obravno drugih težav.
Izvajalnik
Napišite metodo
int fetch()
ki naloži in vrne en bajt z naslova v PC
ter ga poveča za ena.
Napišite metodo
void execute()
ki dekodira ukaz in morebitne operande z naslova v PC
ter ga izvede.
Potrebovali bomo metode za izvajalnike ukazov posameznih formatov:
boolean execF1(int opcode)
boolean execF2(int opcode, int operand)
boolean execSICF3F4(int opcode, int ni, int operand)
Vse tri metode prejmejo operacijsko kodo (angl. opcode) ukaza, morebitni operand, zadnja pa še bita ni
, da lahko ugotovimo vrsto naslavljanja.
Simulacija procesorjeve ure
Dodajte podpora za simulacijo procesorjeve ure, t.j. za samodejno izvajanje ukazov. Pri tem lahko uporabite Javin razred Timer
. Napišite metode
// Zažene oz. nadaljuje samodejno izvajanje.
void start()
// Zaustavi samodejno izvajanje.
void stop()
// Pove, ali je samodejno izvajanje trenutno v teku.
boolean isRunning()
Timer
nastavite na npr. eno milisekundo. Razmislite, koliko kHz to pravzaprav predstavlja. Da pohitrite izvajanje, lahko uporabite naslednji preprosti trik.
Ob vsaki aktivaciji časovnika, izvedete npr. deset ukazov namesto enega. Podprite branje in nastavljanje hitrosti z metodama
void getSpeed()
void setSpeed(int kHz)