35 lines
No EOL
1.5 KiB
OCaml
35 lines
No EOL
1.5 KiB
OCaml
(*naloga encoderja je, da pretvarja iz lineSemantic tipa v stringe ki jih appendamo v object file*)
|
|
|
|
open SemanticAnalyzer
|
|
(*vrne H vrstico*)
|
|
let getZaglavjeAndStart (prviUkaz : lineSemantic) (lenProg : int) : string list * int =
|
|
let name = match prviUkaz.label with
|
|
| None -> "MOJPROG" (*default ime*)
|
|
| Some s -> if String.length s > 6 then "MOJPROG" else String.make (6 - String.length s) '0' ^ s (*paddamo z 0 če je < 6*)
|
|
in
|
|
let startAddr = match prviUkaz.mnem with
|
|
| MnemonicDn s -> (*preverimo ali je pravilne dolzine in naredimo string dolzine 6*)
|
|
let n = int_of_string s in
|
|
if n < 0 || n > 0xFFFFFF then
|
|
invalid_arg "getZaglavje: zacetni naslov out of range"
|
|
else
|
|
Printf.sprintf "%06X" n
|
|
| _ -> failwith "getZaglavje: invalid mnemonic_type"
|
|
in
|
|
let lenObjectCode = Printf.sprintf "%06X" lenProg in
|
|
["H" ^ name ^ startAddr ^ lenObjectCode], int_of_string startAddr (*vrnemo concatiniran string in startAddr*)
|
|
|
|
|
|
(*vrne T vrstico*)
|
|
let instructionList_to_objectCode (instructionList : string list) (startAddr : int) : string =
|
|
|
|
let startAddr = Printf.sprintf "%06X" startAddr in
|
|
let objectCode = String.concat "" instructionList in
|
|
let len = (String.length objectCode) / 2 in (*delimo z dva ker hočemo dolžino v bytih ne nibblih*)
|
|
let lenString = Printf.sprintf "%02X" len in
|
|
"T" ^ startAddr ^ lenString ^ objectCode (*vrnemo concatiniran T zapis*)
|
|
|
|
(*vrne E vrstico*)
|
|
let getEnd (start : int) : string =
|
|
let start = Printf.sprintf "%06X" start in
|
|
"E" ^ start |