open Instr;; open Memory;; (* l'état de la machine est restreint à ses registres *) type machine = { mutable reg : int array } (* initialisation de la machine *) let machine = { reg = [||] } (* féquence de levée de Signal pour rendre la main au système *) let frequence = 10 (* décompte des ticks d'horloge *) let tick = ref 0 (* l'interprète *) let process code = while true do incr tick; if !tick mod frequence = 0 then raise Signal; let reg = machine.reg in if reg.(pc) >= Array.length code then raise Segmentation_fault; let instr = code.(reg.(pc)) in if !verbose then Printf.eprintf "pc=%d %s\n%!" machine.reg.(pc) (string_of_code reg instr); begin match instr with | Bin (Mod, r1, r2, r3) -> reg.(r3) <- reg.(r1) mod reg.(r2) | Bin (Add, r1, r2, r3) -> reg.(r3) <- reg.(r1) + reg.(r2) | Bin (Sub, r1, r2, r3) -> reg.(r3) <- reg.(r1) - reg.(r2) | If (cmp, r1, r2, lab) -> let op = match cmp with Lt -> (<) | Le -> (<=) | Eq -> (=) in if op reg.(r1) reg.(r2) then reg.(pc) <- lab | Const (v, r) -> reg.(r) <- v | Label int -> () | Move (r1, r2) -> reg.(r2) <- reg.(r1) | Goto lab -> reg.(pc) <- lab | System -> reg.(pc) <- reg.(pc) + 1; raise Trap | Load (addr,r) -> reg.(r) <- get reg.(pt) addr | Store (r,addr) -> set reg.(pt) addr reg.(r) end; reg.(pc) <- reg.(pc) + 1 done