[98] | 1 | open BitVectors;; |
---|
| 2 | open ASM;; |
---|
| 3 | |
---|
[146] | 4 | let pp_arg = |
---|
| 5 | function |
---|
| 6 | `A -> "A" |
---|
| 7 | | `B -> "B" |
---|
| 8 | | `C -> "C" |
---|
| 9 | | `DPTR -> "DPTR" |
---|
[147] | 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 |
---|
[146] | 18 | | `A_DPTR -> "@DPTR" |
---|
| 19 | | `A_PC -> "@PC" |
---|
[147] | 20 | | `DIRECT x -> hex_string_of_vect (x: byte) |
---|
| 21 | | `EXT_INDIRECT x -> "ext_indirect " ^ string_of_bool x |
---|
[146] | 22 | | `EXT_IND_DPTR -> "ext_indirect_dptr" |
---|
[150] | 23 | (* DPM: weird: this seems to be reversed in mcu8051ide: change made. *) |
---|
| 24 | | `INDIRECT x -> if not x then "@R0" else "@R1" |
---|
[147] | 25 | | `IND_DPTR -> "@DPTR" |
---|
[146] | 26 | ;; |
---|
| 27 | |
---|
[98] | 28 | let pp_instruction = |
---|
| 29 | function |
---|
| 30 | `Label l -> l ^ ":" |
---|
| 31 | | `Cost l -> l ^ ":" |
---|
[121] | 32 | | `Jmp j -> "Jump: " ^ j |
---|
| 33 | | `Call j -> "Call: " ^ j |
---|
[146] | 34 | | `ACALL a1 -> "acall " ^ pp_arg a1 |
---|
| 35 | | `ADD (a1,a2) -> "add " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 36 | | `ADDC (a1,a2) -> "addc " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 37 | | `AJMP a1 -> "ajmp " ^ pp_arg a1 |
---|
| 38 | | `ANL (`U1 (a1,a2)) -> "anl " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 39 | | `ANL (`U2 (a1,a2)) -> "anl " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 40 | | `ANL (`U3 (a1,a2)) -> "anl " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 41 | | `CJNE (`U1 (a1,a2),a3) -> "cjne " ^ pp_arg a1 ^ " " ^ pp_arg a2 ^ " " ^ pp_arg a3 |
---|
| 42 | | `CJNE (`U2 (a1,a2),a3) -> "cjne " ^ pp_arg a1 ^ " " ^ pp_arg a2 ^ " " ^ pp_arg a3 |
---|
| 43 | | `CLR a1 -> "clr " ^ pp_arg a1 |
---|
| 44 | | `CPL a1 -> "cpl " ^ pp_arg a1 |
---|
| 45 | | `DA a1 -> "da " ^ pp_arg a1 |
---|
| 46 | | `DEC a1 -> "dec " ^ pp_arg a1 |
---|
| 47 | | `DIV (a1,a2) -> "div " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 48 | | `DJNZ (a1,a2) -> "djnz " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 49 | | `INC a1 -> "inc " ^ pp_arg a1 |
---|
| 50 | | `JB (a1,a2) -> "jb " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 51 | | `JBC (a1,a2) -> "jbc " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 52 | | `JC a1 -> "jc " ^ pp_arg a1 |
---|
| 53 | | `JMP a1 -> "jmp " ^ pp_arg a1 |
---|
| 54 | | `JNB (a1,a2) -> "jnb " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 55 | | `JNC a1 -> "jnc " ^ pp_arg a1 |
---|
| 56 | | `JNZ a1 -> "jnz " ^ pp_arg a1 |
---|
| 57 | | `JZ a1 -> "jz " ^ pp_arg a1 |
---|
| 58 | | `LCALL a1 -> "lcall " ^ pp_arg a1 |
---|
| 59 | | `LJMP a1 -> "ljmp " ^ pp_arg a1 |
---|
| 60 | | `MOV (`U1 (a1,a2)) -> "mov " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 61 | | `MOV (`U2 (a1,a2)) -> "mov " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 62 | | `MOV (`U3 (a1,a2)) -> "mov " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 63 | | `MOV (`U4 (a1,a2)) -> "mov " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 64 | | `MOV (`U5 (a1,a2)) -> "mov " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 65 | | `MOV (`U6 (a1,a2)) -> "mov " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 66 | | `MOVC (a1,a2) -> "movc " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 67 | | `MOVX (`U1 (a1,a2)) -> "movx " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 68 | | `MOVX (`U2 (a1,a2)) -> "movx " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 69 | | `MUL(a1, a2) -> "mul " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 70 | | `NOP -> "nop" |
---|
| 71 | | `ORL (`U1(a1,a2)) -> "orl " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 72 | | `ORL (`U2(a1,a2)) -> "orl " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 73 | | `ORL (`U3(a1,a2)) -> "orl " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 74 | | `POP a1 -> "pop " ^ pp_arg a1 |
---|
| 75 | | `PUSH a1 -> "push " ^ pp_arg a1 |
---|
| 76 | | `RET -> "ret" |
---|
| 77 | | `RETI -> "reti" |
---|
| 78 | | `RL a1 -> "rl " ^ pp_arg a1 |
---|
| 79 | | `RLC a1 -> "rlc " ^ pp_arg a1 |
---|
| 80 | | `RR a1 -> "rr " ^ pp_arg a1 |
---|
| 81 | | `RRC a1 -> "rrc " ^ pp_arg a1 |
---|
| 82 | | `SETB a1 -> "setb " ^ pp_arg a1 |
---|
| 83 | | `SJMP a1 -> "sjmp " ^ pp_arg a1 |
---|
| 84 | | `SUBB (a1,a2) -> "subb " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 85 | | `SWAP a1 -> "swap " ^ pp_arg a1 |
---|
| 86 | | `XCH (a1,a2) -> "xch " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 87 | | `XCHD(a1,a2) -> "xchd " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 88 | | `XRL(`U1(a1,a2)) -> "xrl " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|
| 89 | | `XRL(`U2(a1,a2)) -> "xrl " ^ pp_arg a1 ^ " " ^ pp_arg a2 |
---|