]> matita.cs.unibo.it Git - pkg-cerco/acc.git/blob - src/ASM/Pretty.ml
Imported Upstream version 0.2
[pkg-cerco/acc.git] / src / ASM / Pretty.ml
1 open BitVectors;;
2 open ASM;;
3
4 let pp_arg =
5  function
6     `A -> "A"
7   | `B -> "B"
8   | `C -> "C"
9   | `DPTR -> "DPTR"
10   | `ADDR11 x -> hex_string_of_vect x
11   | `ADDR16 x -> hex_string_of_vect x
12   | `DATA x -> "#0" ^ hex_string_of_vect x ^ "h"
13   | `DATA16 x -> "#0" ^ hex_string_of_vect x ^ "h"
14   | `BIT x -> "bit " ^ hex_string_of_vect (x: byte)
15   | `NBIT x -> "nbit " ^ hex_string_of_vect (x: byte)
16   | `REG (r1, r2, r3) -> "R" ^ string_of_int (int_of_vect (mk_nibble false r1 r2 r3))
17   | `REL x -> hex_string_of_vect x
18   | `A_DPTR -> "@DPTR"
19   | `A_PC -> "@PC"
20   | `DIRECT x -> "0" ^ (hex_string_of_vect (x: byte)) ^ "h"
21   | `EXT_INDIRECT x -> "ext_indirect " ^ string_of_bool x
22   | `EXT_IND_DPTR -> "@DPTR"
23 (* DPM: weird: this seems to be reversed in mcu8051ide: change made. *)
24   | `INDIRECT x -> if not x then "@R0" else "@R1"
25   | `IND_DPTR -> "@DPTR"
26   | `Label s -> s
27 ;;
28
29 let pp_jump =
30  function
31     `CJNE (`U1 (a1,a2),a3) -> "cjne  " ^ pp_arg a1 ^ ", " ^ pp_arg a2 ^ ", " ^ pp_arg a3
32   | `CJNE (`U2 (a1,a2),a3) -> "cjne  " ^ pp_arg a1 ^ ", " ^ pp_arg a2 ^ ", " ^ pp_arg a3
33   | `DJNZ (a1,a2) -> "djnz  " ^ pp_arg a1 ^ ", " ^ pp_arg a2
34   | `JB (a1,a2) -> "jb    " ^ pp_arg a1 ^ ", " ^ pp_arg a2
35   | `JBC (a1,a2) -> "jbc   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
36   | `JC a1 -> "jc    " ^ pp_arg a1
37   | `JNB (a1,a2) -> "jnb   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
38   | `JNC a1 -> "jnc   " ^ pp_arg a1
39   | `JNZ a1 -> "jnz   " ^ pp_arg a1
40   | `JZ a1 -> "jz    " ^ pp_arg a1
41
42 let pp_instruction =
43  function
44     `Label l -> l ^ ":"
45   | `Cost l -> l ^ ":"
46   | `Jmp j -> "ljmp  " ^ j
47   | `Call j -> "lcall " ^ j
48   | `WithLabel i -> pp_jump i
49   |  (#jump as i) -> pp_jump i
50   | `Mov (a1,a2) -> "mov   " ^ pp_arg a1 ^ ", " ^ a2
51   | `ACALL a1 -> "acall " ^ pp_arg a1
52   | `ADD (a1,a2) -> "add   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
53   | `ADDC (a1,a2) -> "addc  " ^ pp_arg a1 ^ ", " ^ pp_arg a2
54   | `AJMP a1 -> "ajmp  " ^ pp_arg a1
55   | `ANL (`U1 (a1,a2)) -> "anl   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
56   | `ANL (`U2 (a1,a2)) -> "anl   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
57   | `ANL (`U3 (a1,a2)) -> "anl   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
58   | `CLR a1 -> "clr   " ^ pp_arg a1
59   | `CPL a1 -> "cpl   " ^ pp_arg a1
60   | `DA a1 -> "da    " ^ pp_arg a1
61   | `DEC a1 -> "dec   " ^ pp_arg a1
62   | `DIV (a1,a2) -> "div   AB"
63   | `INC a1 -> "inc   " ^ pp_arg a1
64   | `JMP a1 -> "jmp   " ^ pp_arg a1
65   | `LCALL a1 -> "lcall " ^ pp_arg a1
66   | `LJMP a1 -> "ljmp  " ^ pp_arg a1
67   | `MOV (`U1 (a1,a2)) -> "mov   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
68   | `MOV (`U2 (a1,a2)) -> "mov   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
69   | `MOV (`U3 (a1,a2)) -> "mov   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
70   | `MOV (`U4 (a1,a2)) -> "mov   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
71   | `MOV (`U5 (a1,a2)) -> "mov   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
72   | `MOV (`U6 (a1,a2)) -> "mov   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
73   | `MOVC (a1,a2) -> "movc  " ^ pp_arg a1 ^ ", " ^ pp_arg a2
74   | `MOVX (`U1 (a1,a2)) -> "movx  " ^ pp_arg a1 ^ ", " ^ pp_arg a2
75   | `MOVX (`U2 (a1,a2)) -> "movx  " ^ pp_arg a1 ^ ", " ^ pp_arg a2
76   | `MUL(a1, a2) -> "mul   AB"
77   | `NOP -> "nop"
78   | `ORL (`U1(a1,a2)) -> "orl   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
79   | `ORL (`U2(a1,a2)) -> "orl   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
80   | `ORL (`U3(a1,a2)) -> "orl   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
81   | `POP a1 -> "pop   " ^ pp_arg a1
82   | `PUSH a1 -> "push  " ^ pp_arg a1
83   | `RET -> "ret"
84   | `RETI -> "reti"
85   | `RL a1 -> "rl    " ^ pp_arg a1
86   | `RLC a1 -> "rlc   " ^ pp_arg a1
87   | `RR a1 -> "rr    " ^ pp_arg a1
88   | `RRC a1 -> "rrc   " ^ pp_arg a1
89   | `SETB a1 -> "setb  " ^ pp_arg a1
90   | `SJMP a1 -> "sjmp  " ^ pp_arg a1
91   | `SUBB (a1,a2) -> "subb  " ^ pp_arg a1 ^ ", " ^ pp_arg a2
92   | `SWAP a1 -> "swap  " ^ pp_arg a1
93   | `XCH (a1,a2) -> "xch   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
94   | `XCHD(a1,a2) -> "xchd  " ^ pp_arg a1 ^ ", " ^ pp_arg a2
95   | `XRL(`U1(a1,a2)) -> "xrl   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
96   | `XRL(`U2(a1,a2)) -> "xrl   " ^ pp_arg a1 ^ ", " ^ pp_arg a2
97
98 let print_program p =
99   let eformat = Eformat.create () in
100   let printf = Eformat.printf eformat in
101   let mem = ASMInterpret.load_code_memory p.ASM.code in
102   let f pc _ =
103     let (inst, new_pc, cost) = ASMInterpret.fetch mem pc in
104     printf "% 6X:  %- 18s ;; %d  %s\n"
105       (BitVectors.int_of_vect pc)
106       (pp_instruction inst)
107       cost
108       (if BitVectors.WordMap.mem pc p.ASM.cost_labels then
109           (BitVectors.WordMap.find pc p.ASM.cost_labels)
110        else "") ;
111     new_pc in
112   let _ = List.fold_left f (BitVectors.zero `Sixteen) p.ASM.code in
113   Eformat.get eformat