working...
This commit is contained in:
parent
d836b3955d
commit
0332001ef8
75 changed files with 427 additions and 1081 deletions
81
ass2/SICocaml/processor.ml
Normal file
81
ass2/SICocaml/processor.ml
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
type registers = {
|
||||
mutable a : int;
|
||||
mutable x : int;
|
||||
mutable l : int;
|
||||
mutable b : int;
|
||||
mutable s : int;
|
||||
mutable t : int;
|
||||
mutable f : float;
|
||||
mutable pc : int;
|
||||
mutable sw : int
|
||||
}
|
||||
(*tip state predstavlja stanje SIC/XE, z pomnilnikom in registri*)
|
||||
type state = {
|
||||
regs : registers;
|
||||
memory : Bytes.t
|
||||
}
|
||||
|
||||
(*beri 1 byte in povisaj PC*)
|
||||
let fetch (state : state) : char =
|
||||
let byte = Bytes.get state.memory state.regs.pc in
|
||||
state.regs.pc <- state.regs.pc + 1;
|
||||
byte
|
||||
|
||||
(*beri 1 byte za offset in ne povecaj PC*)
|
||||
let readMem (state : state) (offset : int) : char =
|
||||
Bytes.get state.memory (state.regs.pc + offset)
|
||||
|
||||
|
||||
(*beri 3 byte iz address*)
|
||||
let readMemAddr (state : state) (address : int) : int =
|
||||
let byte1 = Char.code (Bytes.get state.memory address) in
|
||||
let byte2 = Char.code (Bytes.get state.memory (address + 1)) in
|
||||
let byte3 = Char.code (Bytes.get state.memory (address + 2)) in
|
||||
let value = (byte1 lsl 16) lor (byte2 lsl 8) lor byte3 in
|
||||
value
|
||||
|
||||
|
||||
(*napiši 3 byte inta na address*)
|
||||
let writeMemAddr (state : state) (address : int) (value : int) : unit =
|
||||
(* Mask and shift each byte *)
|
||||
let byte1 = Char.chr ((value lsr 16) land 0xFF) in
|
||||
let byte2 = Char.chr ((value lsr 8) land 0xFF) in
|
||||
let byte3 = Char.chr (value land 0xFF) in
|
||||
|
||||
(* Write bytes into memory *)
|
||||
Bytes.set state.memory address byte1;
|
||||
Bytes.set state.memory (address+1) byte2;
|
||||
Bytes.set state.memory (address+2) byte3
|
||||
|
||||
(*povečaj pc za i*)
|
||||
let pcIncrement (state : state) (i : int) : unit =
|
||||
state.regs.pc <- state.regs.pc + i;
|
||||
()
|
||||
|
||||
(*beri register glede na reg_code*)
|
||||
|
||||
let read_register_int (state: state) (reg_code : int) : int =
|
||||
match reg_code with
|
||||
| 0 -> state.regs.a
|
||||
| 1 -> state.regs.x
|
||||
| 2 -> state.regs.l
|
||||
| 3 -> state.regs.b
|
||||
| 4 -> state.regs.s
|
||||
| 5 -> state.regs.t
|
||||
| 6 -> int_of_float state.regs.f
|
||||
| 8 -> state.regs.pc
|
||||
| 9 -> state.regs.sw
|
||||
| _ -> failwith "Invalid register code"
|
||||
|
||||
let write_register_int (state : state) (reg_code : int) (value : int) : unit=
|
||||
match reg_code with
|
||||
| 0 -> state.regs.a <- value
|
||||
| 1 -> state.regs.x <- value
|
||||
| 2 -> state.regs.l <- value
|
||||
| 3 -> state.regs.b <- value
|
||||
| 4 -> state.regs.s <- value
|
||||
| 5 -> state.regs.t <- value
|
||||
| 6 -> state.regs.f <- float_of_int value
|
||||
| 8 -> state.regs.pc <- value
|
||||
| 9 -> state.regs.sw <- value
|
||||
| _ -> failwith "Invalid register code"
|
||||
Loading…
Add table
Add a link
Reference in a new issue