source: Deliverables/D4.1/IntelHex.ml @ 128

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

Some utility functions useful across modules moved into new file Util.
Started working on parser for Intel hex file format. Moved
physical.ml*' to Physical.ml*' for naming consistency across modules.

File size: 2.0 KB
Line 
1open BitVectors;;
2open ASM;;
3open Util;;
4
5type intel_hex_entry_type =
6    Data
7  | End
8  | ExtendedSeg
9  | ExtendedLinear
10
11type intel_hex_entry =
12{
13  record_length: byte * byte;
14  record_type: intel_hex_entry_type;
15  data_field: byte list;
16  data_checksum: byte * byte
17};;
18
19let hex_string_of_int i =
20  let digit_lookup =
21    function
22      0 -> "0" | 1 -> "1" | 2 -> "2"
23    | 3 -> "3" | 4 -> "4" | 5 -> "5"
24    | 6 -> "6" | 7 -> "7" | 8 -> "8"
25    | 9 -> "9" | 10 -> "A" | 11 -> "B"
26    | 12 -> "C" | 13 -> "D" | 14 -> "E"
27    | 15 -> "F" | _ -> assert false in
28
29  let rec aux i =
30    if i < 16 then
31      digit_lookup i
32    else
33      let div = i / 16 in
34      let rem = i mod 16 in
35         aux div ^ digit_lookup rem
36  in
37    aux i
38
39let int_of_hex_string h =
40  let digit_lookup =
41    function
42      '0' -> 0 | '1' -> 1 | '2' -> 2
43    | '3' -> 3 | '4' -> 4 | '5' -> 5
44    | '6' -> 6 | '7' -> 7 | '8' -> 8
45    | '9' -> 9 | 'A' -> 10 | 'B' -> 11
46    | 'C' -> 12 | 'D' -> 13 | 'E' -> 14
47    | 'F' -> 15 | _ -> assert false in
48
49  let rec aux l p =
50    match l with
51      [] -> 0
52    | hd::tl ->
53        digit_lookup hd * p + aux tl (p * 16)
54  in
55    aux (List.rev $ char_list_of_string h) 1
56
57let hex_string_of_vect v =
58  let vect_int = int_of_vect v in
59    hex_string_of_int vect_int
60
61let string_of_intel_hex_entry entry =
62  let record_length_l, record_length_r = entry.record_length in
63  let data_checksum_l, data_checksum_r = entry.data_checksum in
64  let length_string = hex_string_of_vect record_length_l ^ 
65                      hex_string_of_vect record_length_l in
66  let checksum_string = hex_string_of_vect data_checksum_l ^ 
67                        hex_string_of_vect data_checksum_r in
68  let type_string =
69    match entry.record_type with
70      Data -> "00"
71    | End -> "01"
72    | ExtendedSeg -> "02"
73    | ExtendedLinear -> "04" in
74  let data_string = String.concat "" (List.map hex_string_of_vect entry.data_field) in
75    ":" ^ length_string ^ type_string ^ data_string ^ checksum_string
Note: See TracBrowser for help on using the repository browser.