open BitVectors;; open ASM;; let pp_arg = function `A -> "A" | `B -> "B" | `C -> "C" | `DPTR -> "DPTR" | `ADDR11 x -> hex_string_of_vect x | `ADDR16 x -> hex_string_of_vect x | `DATA x -> "#" ^ hex_string_of_vect x | `DATA16 x -> "#" ^ hex_string_of_vect x | `BIT x -> "bit " ^ hex_string_of_vect (x: byte) | `NBIT x -> "nbit " ^ hex_string_of_vect (x: byte) | `REG (r1, r2, r3) -> "R" ^ string_of_int (int_of_vect (mk_nibble false r1 r2 r3)) | `REL x -> hex_string_of_vect x | `A_DPTR -> "@DPTR" | `A_PC -> "@PC" | `DIRECT x -> hex_string_of_vect (x: byte) | `EXT_INDIRECT x -> "ext_indirect " ^ string_of_bool x | `EXT_IND_DPTR -> "ext_indirect_dptr" (* DPM: weird: this seems to be reversed in mcu8051ide: change made. *) | `INDIRECT x -> if not x then "@R0" else "@R1" | `IND_DPTR -> "@DPTR" ;; let pp_instruction = function `Label l -> l ^ ":" | `Cost l -> l ^ ":" | `Jmp j -> "Jump: " ^ j | `Call j -> "Call: " ^ j | `ACALL a1 -> "acall " ^ pp_arg a1 | `ADD (a1,a2) -> "add " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `ADDC (a1,a2) -> "addc " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `AJMP a1 -> "ajmp " ^ pp_arg a1 | `ANL (`U1 (a1,a2)) -> "anl " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `ANL (`U2 (a1,a2)) -> "anl " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `ANL (`U3 (a1,a2)) -> "anl " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `CJNE (`U1 (a1,a2),a3) -> "cjne " ^ pp_arg a1 ^ " " ^ pp_arg a2 ^ " " ^ pp_arg a3 | `CJNE (`U2 (a1,a2),a3) -> "cjne " ^ pp_arg a1 ^ " " ^ pp_arg a2 ^ " " ^ pp_arg a3 | `CLR a1 -> "clr " ^ pp_arg a1 | `CPL a1 -> "cpl " ^ pp_arg a1 | `DA a1 -> "da " ^ pp_arg a1 | `DEC a1 -> "dec " ^ pp_arg a1 | `DIV (a1,a2) -> "div " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `DJNZ (a1,a2) -> "djnz " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `INC a1 -> "inc " ^ pp_arg a1 | `JB (a1,a2) -> "jb " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `JBC (a1,a2) -> "jbc " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `JC a1 -> "jc " ^ pp_arg a1 | `JMP a1 -> "jmp " ^ pp_arg a1 | `JNB (a1,a2) -> "jnb " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `JNC a1 -> "jnc " ^ pp_arg a1 | `JNZ a1 -> "jnz " ^ pp_arg a1 | `JZ a1 -> "jz " ^ pp_arg a1 | `LCALL a1 -> "lcall " ^ pp_arg a1 | `LJMP a1 -> "ljmp " ^ pp_arg a1 | `MOV (`U1 (a1,a2)) -> "mov " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `MOV (`U2 (a1,a2)) -> "mov " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `MOV (`U3 (a1,a2)) -> "mov " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `MOV (`U4 (a1,a2)) -> "mov " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `MOV (`U5 (a1,a2)) -> "mov " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `MOV (`U6 (a1,a2)) -> "mov " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `MOVC (a1,a2) -> "movc " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `MOVX (`U1 (a1,a2)) -> "movx " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `MOVX (`U2 (a1,a2)) -> "movx " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `MUL(a1, a2) -> "mul " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `NOP -> "nop" | `ORL (`U1(a1,a2)) -> "orl " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `ORL (`U2(a1,a2)) -> "orl " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `ORL (`U3(a1,a2)) -> "orl " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `POP a1 -> "pop " ^ pp_arg a1 | `PUSH a1 -> "push " ^ pp_arg a1 | `RET -> "ret" | `RETI -> "reti" | `RL a1 -> "rl " ^ pp_arg a1 | `RLC a1 -> "rlc " ^ pp_arg a1 | `RR a1 -> "rr " ^ pp_arg a1 | `RRC a1 -> "rrc " ^ pp_arg a1 | `SETB a1 -> "setb " ^ pp_arg a1 | `SJMP a1 -> "sjmp " ^ pp_arg a1 | `SUBB (a1,a2) -> "subb " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `SWAP a1 -> "swap " ^ pp_arg a1 | `XCH (a1,a2) -> "xch " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `XCHD(a1,a2) -> "xchd " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `XRL(`U1(a1,a2)) -> "xrl " ^ pp_arg a1 ^ " " ^ pp_arg a2 | `XRL(`U2(a1,a2)) -> "xrl " ^ pp_arg a1 ^ " " ^ pp_arg a2