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

Last change on this file since 128 was 128, checked in by mulligan, 10 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.