diff --git a/FA.dev b/FA.dev index 960da49..68125c5 100644 --- a/FA.dev +++ b/FA.dev @@ -4,4 +4,5 @@ 4 5 6 +7 0 \ No newline at end of file diff --git a/ass1/insertion_sort.asm b/ass1/insertion_sort.asm new file mode 100644 index 0000000..db83692 --- /dev/null +++ b/ass1/insertion_sort.asm @@ -0,0 +1,66 @@ +.program prebere iz spomina seznam števil dolžine len +.in jih uredi z insertion sortom +.pustimo prvi element paddan, da lažje rečunamo premike +prog START 0 + LDX #6 + +loop LDB #len + COMPR X, B .i < len + JEQ halt .zaključi + + LDA arr, X .A = arr[i] + RMO X, S .S <- i + LDT #3 .T <- 3 + SUBR T, X .X <- j= i - 1 + +loop2 LDT #3 + COMPR X, T .j >= 1 + JLT insert .ko je j = 0 skoči + J next .skoči na preverjanje naslednjega pogoja + + .shranimo S nazaj v X in ga zmanjšamo za ena + .nato skočimo nazaj v loop +exit2 RMO S, X .X <- i + LDT #3 + ADDR T, X .X <- i + 1 + J loop + +next LDB arr, X + COMPR B, A .arr[j] > arr[i] + JGT swap + J insert .če pogoj ni izpolnjen + + .sicer zamenjamo elementa +swap LDT #3 + ADDR T, X .X <- j + 1 + STB arr, X. arr[j+1] = arr[j] + + LDT #6 + SUBR T, X .x <- x-1 + J loop2 + +insert LDT #3 + ADDR T, X .j = j+1 + STA arr, X .arr[j+1] = arr[i] + SUBR T, X .j = j + J exit2 + +halt J halt + +arr WORD 0 + WORD 5 + WORD 3 + WORD 8 + WORD 1 + WORD 4 + WORD 7 + WORD 2 + WORD 9 +arrEnd WORD 6 + +len EQU arrEnd - arr + 3 + + + + + END prog \ No newline at end of file diff --git a/ass2/SICocaml/decoder.cmi b/ass2/SICocaml/decoder.cmi new file mode 100644 index 0000000..86f3866 Binary files /dev/null and b/ass2/SICocaml/decoder.cmi differ diff --git a/ass2/SICocaml/decoder.cmo b/ass2/SICocaml/decoder.cmo new file mode 100644 index 0000000..df363d3 Binary files /dev/null and b/ass2/SICocaml/decoder.cmo differ diff --git a/ass2/SICocaml/decoder.cmx b/ass2/SICocaml/decoder.cmx new file mode 100644 index 0000000..7f81fc7 Binary files /dev/null and b/ass2/SICocaml/decoder.cmx differ diff --git a/ass2/SICocaml/decoder.ml b/ass2/SICocaml/decoder.ml new file mode 100644 index 0000000..7955cc3 --- /dev/null +++ b/ass2/SICocaml/decoder.ml @@ -0,0 +1,10 @@ +(*decoderjeva naloga je pridobiti mnemonic in tip ukaza iz prvega byta z pogledom v hash-table*) +let table = OpcodeTable.table + +let decoder (byte1 : char) : OpcodeTable.info = + let opcode = (Char.code byte1) land 0xFC in + try + Hashtbl.find OpcodeTable.table opcode + with + | Not_found -> failwith "invalid opcode" + diff --git a/ass2/SICocaml/decoder.o b/ass2/SICocaml/decoder.o new file mode 100644 index 0000000..01fa090 Binary files /dev/null and b/ass2/SICocaml/decoder.o differ diff --git a/ass2/SICocaml/izvajalnik.cmi b/ass2/SICocaml/izvajalnik.cmi new file mode 100644 index 0000000..bbd21d4 Binary files /dev/null and b/ass2/SICocaml/izvajalnik.cmi differ diff --git a/ass2/SICocaml/izvajalnik.cmo b/ass2/SICocaml/izvajalnik.cmo new file mode 100644 index 0000000..18e5067 Binary files /dev/null and b/ass2/SICocaml/izvajalnik.cmo differ diff --git a/ass2/SICocaml/izvajalnik.ml b/ass2/SICocaml/izvajalnik.ml new file mode 100644 index 0000000..47588d7 --- /dev/null +++ b/ass2/SICocaml/izvajalnik.ml @@ -0,0 +1,124 @@ +type registers = { + mutable a : int; + mutable x : int; + mutable l : int; + mutable b : int; + mutable s : int; + mutable t : int; + mutable f : int; + mutable pc : int; + mutable sw : int +} +(*tip state predstavlja stanje SIC/XE, z pomnilnikom in registri*) +type state = { + regs : registers; + memory : Bytes.t +} + +type nixbpe = { + n : int; + i : int; + x : int; + b : int; + p : int; + e : int +} + +(*kreiramo začetno stanje*) +let regs = {a = 0; x = 0; l = 0; b = 0; s = 0; t = 0; f = 0; pc = 0; sw = 0} +let memSize = 1 lsl 20 (*2^20*) +let memory = Bytes.make memSize '\x00' (*mutbale kos pomnilnika velikosti memSize*) +let state = {regs; memory} + + +(*----Funkcije izvajalnika----*) +(*TODO - brali bomo vedno relativno od začetka instrukcije, PC bomo na koncu ukaza povečali za pravo velikost!*) + +(*funkcije za javljanje napak*) +let notImplemented (mnemonic : string) = Printf.printf "mnemonic %s is not implemented!\n" mnemonic +let invalidOpcode (opcode : int) = Printf.printf "opcode %d is invalid!\n" opcode +let invalidAdressing () = Printf.printf "invalid adressing!\n" + +(*beri 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 za offset in ne povecaj PC*) +let readMem (state : state) (offset : int) : char = + Bytes.get state.memory (state.regs.pc + offset) + + +(*beri drugi byte ukaza formata 2 in vrni r1 in r2, kot int njunih vrednosti (reg a -> 1, reg x -> 2 ...)*) +let readFormat2Byte2 (state : state) : (int * int) = + let byte2 = Char.code (readMem state 1) in + let highNibble = (byte2 land 0xF0) lsr 4 in (*pridobi prvi nibble*) + let lowNibble = byte2 land 0x0F in (*pridobi drugi nibble*) + (highNibble, lowNibble) + +(*preberi byta 1 in 2 in dobi nixbpe bite*) +let getNIXBPE (state : state) : nixbpe = + let byte1 = Char.code (readMem state 0) in + let byte2 = Char.code (readMem state 1) in + {n = (byte1 lsr 1) land 1; + i = byte1 land 1; + x = (byte2 lsr 7) land 1; + b = (byte2 lsr 6) land 1; + p = (byte2 lsr 5) land 1; + e = (byte2 lsr 4) land 1;} + + +(*execute format 1*) +let executeFormat1 (state : state) (mnemonic : OpcodeTable.mnemonic) : unit = + match mnemonic with + | FIX -> notImplemented "FIX" + | FLOAT -> notImplemented "FLOAT" + | HIO -> notImplemented "HIO" + | NORM -> notImplemented "NORM" + | SIO -> notImplemented "SIO" + | TIO -> notImplemented "TIO" + | _ -> Printf.printf "Mnemonic %s falsely flaged as format 1" (OpcodeTable.string_of_mnemonic mnemonic) + + +(*execute format 2*) +let executeFormat2 (state: state) (mnemonic : OpcodeTable.mnemonic) : unit = + let (r1, r2) = readFormat2Byte2 state in + match mnemonic with + | ADDR -> notImplemented "ADD" (*when implemented: -> add state r1 r2*) + | CLEAR -> notImplemented "CLEAR" + | COMPR -> notImplemented "F2" + | DIVR -> notImplemented "F2" + | MULR -> notImplemented "F2" + | RMO -> notImplemented "F2" + | SHIFTL -> notImplemented "F2" + | SHIFTR -> notImplemented "F2" + | SUBR -> notImplemented "F2" + | SVC -> notImplemented "F2" + | TIXR -> notImplemented "F2" + |_ -> Printf.printf "Mnemonic %s falsely flaged as format 1" (OpcodeTable.string_of_mnemonic mnemonic) + + +let executeFormat3 (state : state) (nixbpe : nixbpe) : unit + + +(*execute format 3*) +let executeFormat3_4 (state : state) (mnemonic : OpcodeTable.mnemonic) : unit = + let nixbpe = getNIXBPE state in + match nixbpe.e with + | 0 -> executeFormat3 state + | 1 -> executeFormat4 state + | _ -> failwith "invalid computation of nxbpe" + + +(*execute ukaza*) +let execute (state : state) : unit = + let byte1 = readMem state 0 in (*read the 1st byte of the instruction*) + try + let {OpcodeTable.mnemonic; OpcodeTable.format} = Decoder.decoder byte1 in (*determen the format of the instruction from the 1st byte*) + match format with + | F1 -> executeFormat1 state mnemonic + | F2 -> executeFormat2 state mnemonic + | F3_4 -> executeFormat3_4 state mnemonic + with + | Failure msg -> byte1 |> Char.code |> invalidOpcode \ No newline at end of file diff --git a/ass2/SICocaml/opcodeTable.cmi b/ass2/SICocaml/opcodeTable.cmi new file mode 100644 index 0000000..c7ab3a0 Binary files /dev/null and b/ass2/SICocaml/opcodeTable.cmi differ diff --git a/ass2/SICocaml/opcodeTable.cmo b/ass2/SICocaml/opcodeTable.cmo new file mode 100644 index 0000000..83783ff Binary files /dev/null and b/ass2/SICocaml/opcodeTable.cmo differ diff --git a/ass2/SICocaml/opcodeTable.cmx b/ass2/SICocaml/opcodeTable.cmx new file mode 100644 index 0000000..1452d54 Binary files /dev/null and b/ass2/SICocaml/opcodeTable.cmx differ diff --git a/ass2/SICocaml/opcodeTable.ml b/ass2/SICocaml/opcodeTable.ml new file mode 100644 index 0000000..4c4544c --- /dev/null +++ b/ass2/SICocaml/opcodeTable.ml @@ -0,0 +1,159 @@ +(*opcode hash table, formati ukazov in mnemoniki*) +type mnemonic = + (* Format 1 *) + | FIX | FLOAT | HIO | NORM | SIO | TIO + + (* Format 2 *) + | ADDR | CLEAR | COMPR | DIVR | MULR | RMO + | SHIFTL | SHIFTR | SUBR | SVC | TIXR + + (* Format 3/4 *) + | ADD | ADDF | AND | COMP | COMPF | DIV + | J | JEQ | JGT | JLT | JSUB | LDA | LDB | LDCH | LDF + | LDL | LDS | LDT | LDX | LPS | MUL | OR | RD + | RSUB | STA | STB | STCH | STF | STL | STS | STSW + | STT | STX | SUB | SUBF | TD | TIX | WD + +type format = + | F1 + | F2 + | F3_4 + +type info = { + mnemonic : mnemonic; + format : format; +} + +(* Opcode table *) + +let table : (int, info) Hashtbl.t = Hashtbl.create 128 + +let () = + let add op mnemonic format = + Hashtbl.add table op { mnemonic; format } + in + + (*Format 1 Instructions*) + add 0xC4 FIX F1; + add 0xC0 FLOAT F1; + add 0xC8 HIO F1; + add 0xC1 NORM F1; + add 0xF0 SIO F1; + add 0xF8 TIO F1; + + (*Format 2 Instructions*) + add 0x90 ADDR F2; + add 0xB4 CLEAR F2; + add 0xA0 COMPR F2; + add 0x9C DIVR F2; + add 0x98 MULR F2; + add 0xAC RMO F2; + add 0xA4 SHIFTL F2; + add 0xA8 SHIFTR F2; + add 0x94 SUBR F2; + add 0xB0 SVC F2; + add 0xB8 TIXR F2; + + (*Format 3/4 Instructions*) + add 0x18 ADD F3_4; + add 0x58 ADDF F3_4; + add 0x40 AND F3_4; + add 0x28 COMP F3_4; + add 0x88 COMPF F3_4; + add 0x24 DIV F3_4; + add 0x3C J F3_4; + add 0x30 JEQ F3_4; + add 0x34 JGT F3_4; + add 0x38 JLT F3_4; + add 0x48 JSUB F3_4; + add 0x00 LDA F3_4; + add 0x68 LDB F3_4; + add 0x50 LDCH F3_4; + add 0x70 LDF F3_4; + add 0x08 LDL F3_4; + add 0x6C LDS F3_4; + add 0x74 LDT F3_4; + add 0x04 LDX F3_4; + add 0xD0 LPS F3_4; + add 0x20 MUL F3_4; + add 0x44 OR F3_4; + add 0xD8 RD F3_4; + add 0x4C RSUB F3_4; + add 0x0C STA F3_4; + add 0x78 STB F3_4; + add 0x54 STCH F3_4; + add 0x80 STF F3_4; + add 0x14 STL F3_4; + add 0x7C STS F3_4; + add 0xE8 STSW F3_4; + add 0x84 STT F3_4; + add 0x10 STX F3_4; + add 0x1C SUB F3_4; + add 0x5C SUBF F3_4; + add 0xE0 TD F3_4; + add 0x2C TIX F3_4; + add 0xDC WD F3_4; +() + +(*mnemonic to string*) +let string_of_mnemonic = function + (* Format 1 *) + | FIX -> "FIX" + | FLOAT -> "FLOAT" + | HIO -> "HIO" + | NORM -> "NORM" + | SIO -> "SIO" + | TIO -> "TIO" + + (* Format 2 *) + | ADDR -> "ADDR" + | CLEAR -> "CLEAR" + | COMPR -> "COMPR" + | DIVR -> "DIVR" + | MULR -> "MULR" + | RMO -> "RMO" + | SHIFTL -> "SHIFTL" + | SHIFTR -> "SHIFTR" + | SUBR -> "SUBR" + | SVC -> "SVC" + | TIXR -> "TIXR" + + (* Format 3/4 *) + | ADD -> "ADD" + | ADDF -> "ADDF" + | AND -> "AND" + | COMP -> "COMP" + | COMPF -> "COMPF" + | DIV -> "DIV" + | J -> "J" + | JEQ -> "JEQ" + | JGT -> "JGT" + | JLT -> "JLT" + | JSUB -> "JSUB" + | LDA -> "LDA" + | LDB -> "LDB" + | LDCH -> "LDCH" + | LDF -> "LDF" + | LDL -> "LDL" + | LDS -> "LDS" + | LDT -> "LDT" + | LDX -> "LDX" + | LPS -> "LPS" + | MUL -> "MUL" + | OR -> "OR" + | RD -> "RD" + | RSUB -> "RSUB" + | STA -> "STA" + | STB -> "STB" + | STCH -> "STCH" + | STF -> "STF" + | STL -> "STL" + | STS -> "STS" + | STSW -> "STSW" + | STT -> "STT" + | STX -> "STX" + | SUB -> "SUB" + | SUBF -> "SUBF" + | TD -> "TD" + | TIX -> "TIX" + | WD -> "WD" diff --git a/ass2/SICocaml/opcodeTable.o b/ass2/SICocaml/opcodeTable.o new file mode 100644 index 0000000..45d6f59 Binary files /dev/null and b/ass2/SICocaml/opcodeTable.o differ diff --git a/ass2/SICocaml/program b/ass2/SICocaml/program new file mode 100644 index 0000000..38cd6e3 Binary files /dev/null and b/ass2/SICocaml/program differ