source: Deliverables/D4.1/Physical.ml @ 442

Last change on this file since 442 was 442, checked in by mulligan, 9 years ago

Partial implementation of Nicolas' requested feature (extraction of code_memory) to Intel HEX format.

File size: 2.3 KB
Line 
1open BitVectors;;
2
3exception Byte7_conversion
4
5module type Map =
6 sig
7  type key
8  type map
9   val empty : map
10   val find : key -> map -> byte
11   val add : key -> byte -> map -> map
12   val fold : (key -> byte -> 'b -> 'b) -> map -> 'b -> 'b
13 end
14;;
15
16module Byte7Map : Map with type key = byte7 =
17struct
18  include Map.Make (struct type t = byte7 let compare = Pervasives.compare end)
19  type map = byte t
20  let find k m =
21    try
22      find k m
23    with Not_found -> zero `Eight
24  let fold = fold
25end;;
26
27module WordMap : Map with type key = word =
28struct
29  include Map.Make (struct type t = word let compare = Pervasives.compare end)
30  type map = byte t
31  let find k m =
32    try
33      find k m
34    with Not_found -> zero `Eight
35  let fold = fold
36end;;
37
38let int_of_bit =
39  function
40    false -> 0
41  | true -> 1
42
43let add8_with_c (b1 : [`Eight] vect) (b2 : [`Eight] vect) (c : bit) =
44 let n1 = int_of_vect b1 in
45 let n2 = int_of_vect b2 in
46 let c = int_of_bit c in
47 let res = n1 + n2 + c in
48 let ac = n1 mod 16 + n2 mod 16 + c >= 16 in
49 let c6 = n1 mod 128 + n2 mod 128 + c >= 128 in
50 let res,c = res mod 256, res >= 256 in
51 let ov = c <> c6 in
52   vect_of_int res `Eight,c,ac,ov
53;;
54
55let add16_with_c (b1 : [`Sixteen] vect) (b2 : [`Sixteen] vect) (c : bit) =
56 let n1 = int_of_vect b1 in
57 let n2 = int_of_vect b2 in
58 let c = int_of_bit c in
59 let res = n1 + n2 + c in
60 let ac = n1 mod 256 + n2 mod 256 + c >= 256 in
61 let c6 = n1 mod 2097152 + n2 mod 2097152 + c >= 2097152 in
62 let res,c = res mod 4194304, res >= 4194304 in
63 let ov = c <> c6 in
64   vect_of_int res `Sixteen,c,ac,ov
65;;
66
67let subb8_with_c (b1 : [`Eight] vect) (b2 : [`Eight] vect) (c : bit) =
68 let n1 = int_of_vect b1 in
69 let n2 = int_of_vect b2 in
70 let c = int_of_bit c in
71 let res = n1 - n2 - c in
72 let ac = n1 mod 16 - n2 mod 16 - c < 0 in
73 let c6 = n1 mod 128 - n2 mod 128 - c < 0 in
74 let res,c =
75  if res >= 0 then res,false
76  else n1 + 256 - n2 - c, true in
77 let ov = c <> c6 in
78  (vect_of_int res `Eight,c,ac,ov)
79;;
80
81let dec b =
82 let res = int_of_vect b - 1 in
83  if res < 0 then vect_of_int 255 `Eight
84  else vect_of_int res `Eight
85;;
86
87let inc b =
88 let res = int_of_vect b + 1 in
89  if res > 255 then (vect_of_int 0 `Eight : byte)
90  else (vect_of_int res `Eight : byte)
91;;
92
93let byte7_of_bit b =
94  [false;false;false;false;false;false;b]
95;;
96
97let byte_of_byte7 =
98 function
99    ([b1;b2;b3]::n) -> [false;b1;b2;b3]::n
100  | _ -> assert false
101;;
Note: See TracBrowser for help on using the repository browser.