Vaje - Stroj SIC/XE

Vaje - Stroj SIC/XE

Navidezni stroj

Zasnujte razred Machine, ki bo predstavljal osnovo vašega simulatorja stroja SIC/XE.

Registri

Podprite vse (programsko vidne) registre SIC/XE stroja: A, X, L, B, S, T, F.

  • Potrebujete 7 atributov.
  • Napišite tudi ustrezne getterje in setterje, npr. getA() in setA(int val).
  • Za register F lahko uporabite tip double, sicer pa se zaenkrat z njim ne obremenujte (za simulacijo večine programov ga ne potrebujemo).

Podprite tudi register PC (program counter).

  • Ta register implementirajte podobno kot programsko vidne registre.

Podprite tudi register SW (status word).

  • Potrebovali bomo samo njegov del CC (condition code), ki je namenjen ukazom COMP, JLT, JEQ, ...
  • Namesto hranjenja celotnega SW, lahko hranite le CC.
  • Vrednosti -1, 0, 1 v CC naj predstavljajo <, ==, >, t.j. rezultat operacije COMP.
  • Vseeno pa napišite getter in setter za SW. Torej getSW() naj vrne 0, 0x40, 0x80 glede na CC=-1, 0, 1. To bo npr. prišlo prav, pri izpisu oz. prikazu vrednosti SW registra.

Podprite še dostop do registrov po številki oz. indeksu registra.

  • Potrebujemo torej getter in setter glede na indeks, npr. getReg(int regno) in setReg(int regno, int val).
  • Številke registrov so od 0, ..., 5 za registre A, X, L, B, S, T zaporedoma.
  • Definirajte konstante za indekse registrov.
  • To bomo potrebovali pri implementaciji ukazov ADDR, SUBR, SHIFTL, itd.

Pomnilnik

Podprite pomnilnik z naključnim dostopom.

  • Kako velik je naslovni prostor stroja? Definirajte konstanto MAX_ADDRESS, ki predstavlja največji naslov.
  • Kako boste hranili pomnilniške celice? Definirajte ustrezno podatkovno strukturo.

Napišite getter in setter za dostop do pomnilnika po bajtih, npr.:

  • int getByte(int addr)
  • void setByte(int addr, int val)
  • Kaj stortiti, če addr ni znotraj naslovnega prostora?
  • Pozor! V javi je byte predznačeno število, mi pa želimo nepredznačena števila (zato vračamo int).

Enako naredite še za dostop do pomnilnika po besedah (wordih).

  • Kako velika je beseda v arhitekturi SIC/XE?
  • Namig: v getWord(int addr) lahko 3x kličete getByte(int addr).

*Enako naredite še za dostop do pomnilnka po float-ih.

  • Kako velik je float v SIC/XE?
  • Namig: koristne znata biti metodi Double.doubleToLongBits() in Double.longBitsToDouble(...).

Naprave

Podprite VI naprave.

a) Potrebujemo razred Device, ki vsebuje metode

  • boolean test() - za izvedbo ukaza TD
  • byte read() - ukaz RD
  • void write(byte value) - ukaz WD

Razred Device predstavlja primitivno napravo (ki ne dela nič), zato naj metode naredijo le najnujnejše, npr. test vrne true, read vrne 0, write ne zapiše nič.

Stroj SIC/XE podpira 256 naprav. Podprite jih v razredu Machine. Potrebujete tabelo naprav in metodi

  • Device getDevice(int num)
  • void setDevice(int num, Device device)

b) Napišite razred InputDevice, ki podpira bralno napravo. Naprava naj bere s pomočjo InputStream objekta, ki ga podamo konstruktorju. Potrebno je povoziti le metodo read(). S pomočjo te naprave bomo ustvarili napravo številka 0, ki bo povezana z standardnim vhodom.

c) Napišite razred OutputDevice, ki podpira pisalno napravo. Naprava naj zapisuje s pomočjo OutputStream objekta, ki ga podamo konstruktorju. Potrebno je povoziti le metodo write(). S pomočjo te naprave bomo ustvarili napravi številka 1 in 2, ki bosta povezani na standardni izhod in standardni izhod za napake.

d) Popravite Machine, da se ob inicializaciji ustvarijo naprave s številkami 0, 1, 2, ki predstavljajo standardni vhod, standardni izhod in standardni izhod za napake.

e) Napišite razred FileDevice, ki je vezana na datoteko (ime podamo v konstruktorju). Branje in pisanje v to napravo torej ustreza branju in pisanju v dano datoteko. Namig: RandomAccessFile. Popravite inicializacijo Machine, da naprave s številko večjo od 2 predstavljajo te vrste naprav.

Operacijske kode

Napišite razred Opcode, namenjen podpori (de-)kodiranja opercijskih kod (opcode) ukazov.

V njem definirajte konstante za vse operacije stroja SIC/XE. npr.

public static final int LDA = 0x00;
public static final int LDX = 0x04;
...

V programu tako enostavno pridete do operacijskih kod z npr. Opcode.LDA.

V ta razred boste kasneje lahko dodali tudi pomožne rutine za delo z posameznimi biti operacijskih kod.

Last modified: Monday, 3 November 2014, 1:45 PM