SPO_JakaFurlan/ass2/SICocaml/loader.ml
Jaka Furlan ad8728bdf4 done?
2025-11-30 13:53:18 +01:00

51 lines
1.9 KiB
OCaml

open Processor
open Printf
(* Convert hex string to int *)
let int_of_hex s = int_of_string ("0x" ^ s)
(* Convert two hex digits to a char *)
let char_of_hex s = Char.chr (int_of_hex s)
(* Write a list of bytes (chars) to memory at a given start address *)
let write_bytes state start bytes =
List.iteri (fun i byte -> Bytes.set state.memory (start + i) byte) bytes
(* Parse a T record line like: TAAAAAALL[BYTECODES...] *)
let parse_text_record line =
(* Skip leading 'T' *)
let line = String.sub line 1 (String.length line - 1) in
if String.length line < 8 then failwith "T record too short";
let start_str = String.sub line 0 6 in (*pridobi stolpce 2-7*)
let len_str = String.sub line 6 2 in (*pridobi stolpce 8-9*)
let start_addr = int_of_hex start_str in (*izračunaj star addr*)
let _ = int_of_hex len_str in (*izračunaj dolžino -> v bistvu je nikjer ne rabimo*)
let byte_str = String.sub line 8 (String.length line - 8) in (*pridobi stolpce 10-*)
(* Split the string into pairs of hex digits *)
let bytes =
let rec aux i acc =
if i >= String.length byte_str then List.rev acc (*ko si na koncu še obrni listo, ker si dodajal na začetek *)
else
let hex_pair = String.sub byte_str i 2 in (*pridobi par črk*)
aux (i + 2) (char_of_hex hex_pair :: acc) (*dodaj na začetek nov par*)
in
aux 0 []
in
(start_addr, bytes)
(* Load a SIC/XE object file into memory *)
let load_object_file (state : Processor.state) (filename : string) : unit =
let ic = open_in filename in
try
while true do
let line = input_line ic in
match line.[0] with
| 'T' ->
let addr, bytes = parse_text_record line in
write_bytes state addr bytes
| 'H' -> () (* header: can parse start addr/length if needed *)
| 'E' -> () (* end: can parse entry point if needed *)
| _ -> ()
done
with
| End_of_file -> close_in ic