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 -> "#" ^ hex_string_of_vect x |
---|
13 | | `DATA16 x -> "#" ^ hex_string_of_vect x |
---|
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 -> hex_string_of_vect (x: byte) |
---|
21 | | `EXT_INDIRECT x -> "ext_indirect " ^ string_of_bool x |
---|
22 | | `EXT_IND_DPTR -> "ext_indirect_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 -> "Jump " ^ j |
---|
47 | | `Call j -> "Call " ^ 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 " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
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 " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
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 |
---|