source: Deliverables/D4.1/Test2.ml @ 573

Last change on this file since 573 was 573, checked in by ricciott, 9 years ago

Added round-trip tests.

File size: 8.7 KB
Line 
1open BitVectors;;
2open ASMInterpret;;
3open Util;;
4open IntelHex;;
5open Pretty;;
6
7let iter f = 
8  let rec aux1 i =
9    if i > 0xFF
10      then ()
11      else 
12        let rec aux2 j =
13          if j > 0xFF 
14            then ()
15            else 
16              let rec aux3 k =
17                if k > 0xFF
18                  then ()
19                  else (f i j k ; aux3 (k+1))
20              in (aux3 0; aux2 (j+1)) 
21        in (aux2 0; aux1 (i+1))
22  in aux1 0
23;;
24
25exception RTExc of int list;;
26
27let test () =
28  let f i j k =
29    if i = 0xA5 
30    then () (* the only undefined opcode *)
31    else
32    (* let _ = prerr_endline (Printf.sprintf "testing %x %x %x" i j k) in*)
33    let bv = [ (vect_of_int i `Eight : byte)
34             ; (vect_of_int j `Eight : byte)
35             ; (vect_of_int k `Eight : byte) ]
36    in
37    let mem = load_code_memory bv in 
38    let inst,_,_ = fetch mem (vect_of_int 0x0 `Sixteen : word) in
39    let mem_out = assembly1 inst in
40    let rec mem_cmp m1 m2 =
41      match m1,m2 with
42      | [],_ -> ()
43      | h1::t1, h2::t2 when h1 = h2 -> mem_cmp t1 t2
44      | _ -> raise (RTExc [i;j;k])
45    in
46    mem_cmp mem_out bv
47  in
48  try
49    iter f;
50    prerr_endline "RT1: TEST OK!!!"
51  with
52  | RTExc [i;j;k] -> 
53      prerr_endline (Printf.sprintf "RT1: FAILURE ON %x %x %x" i j k)
54;;
55
56let iter_bit f =
57  f true; f false
58;;
59
60let iter_3bit f =
61  f false false false;
62  f false false true;
63  f false true false;
64  f false true true;
65  f true false false;
66  f true false true;
67  f true true false;
68  f true true true
69;;
70
71let iter_byte f =
72  let rec aux k =
73    if k > 0xFF
74    then ()
75    else (f (vect_of_int k `Eight : byte); aux (k+1))
76  in aux 0
77;;
78
79let iter_word11 f =
80  iter_3bit (fun a b c -> 
81    iter_byte (fun x -> 
82      f (mk_word11 a b c x)))
83;;
84
85let iter_word f =
86  iter_byte (fun a ->
87    iter_byte (fun b ->
88      f (mk_word a b)))
89;;
90
91let test2 () =
92  let check i =
93    let mem = assembly1 i in
94    let i',_,_ = fetch (load_code_memory mem) (vect_of_int 0x0 `Sixteen : word) in
95    if i = i'
96      then ()
97      else raise (RTExc (List.map int_of_vect mem))
98  in
99 
100  try (
101    iter_3bit (fun a b c -> check (`ADD (`A, `REG (a,b,c))));
102    iter_byte (fun x -> check (`ADD (`A, `DIRECT x)));
103    iter_bit (fun x -> check (`ADD (`A, `INDIRECT x)));
104    iter_byte (fun x -> check (`ADD (`A, `DATA x)));
105 
106    iter_3bit (fun a b c -> check (`ADDC (`A, `REG (a,b,c))));
107    iter_byte (fun x -> check (`ADDC (`A, `DIRECT x)));
108    iter_bit (fun x -> check (`ADDC (`A, `INDIRECT x)));
109    iter_byte (fun x -> check (`ADDC (`A, `DATA x)));
110   
111    iter_3bit (fun a b c -> check (`SUBB (`A, `REG (a,b,c))));
112    iter_byte (fun x -> check (`SUBB (`A, `DIRECT x)));
113    iter_bit (fun x -> check (`SUBB (`A, `INDIRECT x)));
114    iter_byte (fun x -> check (`SUBB (`A, `DATA x)));
115 
116    check (`INC `A);
117    check (`INC `DPTR);
118    iter_3bit (fun a b c -> check (`INC (`REG (a,b,c))));
119    iter_byte (fun x -> check (`INC (`DIRECT x)));
120    iter_bit (fun x -> check (`INC (`INDIRECT x)));
121 
122    check (`DEC `A);
123    iter_3bit (fun a b c -> check (`DEC (`REG (a,b,c))));
124    iter_byte (fun x -> check (`DEC (`DIRECT x)));
125    iter_bit (fun x -> check (`DEC (`INDIRECT x)));
126 
127    check (`MUL (`A,`B));
128    check (`DIV (`A,`B));
129    check (`DA `A);
130 
131    iter_3bit (fun a b c -> check (`ANL (`U1 (`A, `REG (a,b,c)))));
132    iter_byte (fun x -> check (`ANL (`U1 (`A, `DIRECT x))));
133    iter_bit (fun x -> check (`ANL (`U1 (`A, `INDIRECT x))));
134    iter_byte (fun x -> check (`ANL (`U1 (`A, `DATA x))));
135    iter_byte (fun x -> check (`ANL (`U2 (`DIRECT x, `A))));
136    iter_byte (fun x -> 
137      iter_byte (fun y -> check (`ANL (`U2 (`DIRECT x, `DATA y)))));
138    iter_byte (fun x -> check (`ANL (`U3 (`C, `BIT x))));
139    iter_byte (fun x -> check (`ANL (`U3 (`C, `NBIT x))));
140   
141    iter_3bit (fun a b c -> check (`ORL (`U1 (`A, `REG (a,b,c)))));
142    iter_byte (fun x -> check (`ORL (`U1 (`A, `DIRECT x))));
143    iter_bit (fun x -> check (`ORL (`U1 (`A, `INDIRECT x))));
144    iter_byte (fun x -> check (`ORL (`U1 (`A, `DATA x))));
145    iter_byte (fun x -> check (`ORL (`U2 (`DIRECT x, `A))));
146    iter_byte (fun x -> 
147      iter_byte (fun y -> check (`ORL (`U2 (`DIRECT x, `DATA y)))));
148    iter_byte (fun x -> check (`ORL (`U3 (`C, `BIT x))));
149    iter_byte (fun x -> check (`ORL (`U3 (`C, `NBIT x))));
150 
151    iter_3bit (fun a b c -> check (`XRL (`U1 (`A, `REG (a,b,c)))));
152    iter_byte (fun x -> check (`XRL (`U1 (`A, `DIRECT x))));
153    iter_bit (fun x -> check (`XRL (`U1 (`A, `INDIRECT x))));
154    iter_byte (fun x -> check (`XRL (`U1 (`A, `DATA x))));
155    iter_byte (fun x -> check (`XRL (`U2 (`DIRECT x, `A))));
156    iter_byte (fun x -> 
157      iter_byte (fun y -> check (`XRL (`U2 (`DIRECT x, `DATA y)))));
158 
159    check (`CLR `A);
160    check (`CLR `C);
161    iter_byte (fun x -> check (`CLR (`BIT x)));
162 
163    check (`CPL `A);
164    check (`CPL `C);
165    iter_byte (fun x -> check (`CPL (`BIT x)));
166 
167    check (`RL `A);
168 
169    check (`RLC `A);
170 
171    check (`RR `A);
172 
173    check (`RRC `A);
174 
175    check (`SWAP `A);
176 
177    iter_3bit (fun a b c -> check (`MOV (`U1 (`A, `REG (a,b,c)))));
178    iter_byte (fun x -> check (`MOV (`U1 (`A, `DIRECT x))));
179    iter_bit (fun x -> check (`MOV (`U1 (`A, `INDIRECT x))));
180    iter_byte (fun x -> check (`MOV (`U1 (`A, `DATA x))));
181    iter_3bit (fun a b c -> check (`MOV (`U2 (`REG (a,b,c),`A))));
182    iter_3bit (fun a b c -> 
183      iter_byte (fun x ->
184        check (`MOV (`U2 (`REG (a,b,c),`DIRECT x)))));
185    iter_3bit (fun a b c -> 
186      iter_byte (fun x ->
187        check (`MOV (`U2 (`REG (a,b,c),`DATA x)))));
188    iter_bit (fun y -> check (`MOV (`U2 (`INDIRECT y, `A))));
189    iter_bit (fun y -> iter_byte (fun x ->
190      check (`MOV (`U2 (`INDIRECT y,`DIRECT x)))));
191    iter_bit (fun y -> iter_byte (fun x ->
192      check (`MOV (`U2 (`INDIRECT y,`DATA x)))));
193    iter_byte (fun x ->
194      (check (`MOV (`U3 (`DIRECT x, `A))));
195       iter_3bit (fun a b c ->
196         check (`MOV (`U3 (`DIRECT x, `REG (a,b,c)))));
197       iter_byte (fun y ->
198         check (`MOV (`U3 (`DIRECT x, `DIRECT y))));
199       iter_bit (fun y ->
200         check (`MOV (`U3 (`DIRECT x, `INDIRECT y))));
201       iter_byte (fun y ->
202         check (`MOV (`U3 (`DIRECT x, `DATA y)))));
203    iter_word (fun x -> check (`MOV (`U4 (`DPTR, `DATA16 x))));
204    iter_byte (fun x -> check (`MOV (`U5 (`C, `BIT x))));
205    iter_byte (fun x -> check (`MOV (`U6 (`BIT x, `C))));
206 
207    check (`MOVC (`A, `A_DPTR));
208    check (`MOVC (`A, `A_PC));
209 
210    iter_bit (fun x -> check (`MOVX (`U1 (`A, `EXT_INDIRECT x))));
211    check (`MOVX (`U1 (`A, `EXT_IND_DPTR)));
212    iter_bit (fun x -> check (`MOVX (`U2 (`EXT_INDIRECT x, `A))));
213    check (`MOVX (`U2 (`EXT_IND_DPTR,`A)));
214 
215    check (`SETB `C);
216    iter_byte (fun x -> check (`SETB (`BIT x)));
217 
218    iter_byte (fun x -> check (`PUSH (`DIRECT x)));
219 
220    iter_byte (fun x -> check (`POP (`DIRECT x)));
221 
222    iter_3bit (fun a b c -> check (`XCH (`A, `REG (a,b,c))));
223    iter_byte (fun x -> check (`XCH (`A, `DIRECT x)));
224    iter_bit (fun x -> check (`XCH (`A, `INDIRECT x)));
225 
226    iter_bit (fun x -> check (`XCHD (`A, `INDIRECT x)));
227
228    iter_byte (fun x -> check (`JC (`REL x)));
229    iter_byte (fun x -> check (`JNC (`REL x)));
230    iter_byte (fun x -> 
231            iter_byte (fun y -> check (`JB (`BIT x, `REL y))));
232    iter_byte (fun x -> 
233            iter_byte (fun y -> check (`JNB (`BIT x, `REL y))));
234    iter_byte (fun x -> 
235            iter_byte (fun y -> check (`JBC (`BIT x, `REL y))));
236    iter_byte (fun x -> check (`JZ (`REL x)));
237    iter_byte (fun x -> check (`JNZ (`REL x)));
238    iter_byte (fun x ->
239      iter_byte (fun y -> check (`CJNE (`U1 (`A, `DIRECT y), `REL x)));
240      iter_byte (fun y -> check (`CJNE (`U1 (`A, `DATA y), `REL x)));
241      iter_byte (fun y -> 
242        iter_3bit (fun a b c -> 
243          check (`CJNE (`U2 (`REG (a,b,c), `DATA y), `REL x)));
244        iter_bit (fun z -> 
245          check (`CJNE (`U2 (`INDIRECT z, `DATA y), `REL x)))));
246    iter_3bit (fun a b c -> 
247            iter_byte (fun x ->
248                    (check (`DJNZ (`REG (a,b,c), `REL x)))));
249    iter_byte (fun x -> 
250            iter_byte (fun y ->
251                    (check (`DJNZ (`DIRECT x, `REL y)))));
252
253    iter_word11 (fun x -> check (`ACALL (`ADDR11 x)));
254   
255    iter_word (fun x -> check (`LCALL (`ADDR16 x)));
256 
257    check `RET;
258 
259    check `RETI;
260
261    iter_word11 (fun x -> check (`AJMP (`ADDR11 x)));
262   
263    iter_word (fun x -> check (`LJMP (`ADDR16 x)));
264 
265    iter_byte (fun x -> check (`SJMP (`REL x)));
266 
267    check (`JMP `IND_DPTR);
268 
269    check `NOP;
270    prerr_endline "RT2: TEST OK!!!"
271    )
272  with
273  | RTExc [i] -> 
274      prerr_endline (Printf.sprintf "RT2: FAILURE ON %x" i)
275  | RTExc [i;j] -> 
276      prerr_endline (Printf.sprintf "RT2: FAILURE ON %x %x" i j)
277  | RTExc [i;j;k] -> 
278      prerr_endline (Printf.sprintf "RT2: FAILURE ON %x %x %x" i j k)
279;;
280       
281
282test ();; 
283test2 ();;
Note: See TracBrowser for help on using the repository browser.