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 -> "#0" ^ hex_string_of_vect x ^ "h" | `DATA16 x -> "#0" ^ hex_string_of_vect x ^ "h" | `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 -> "0" ^ (hex_string_of_vect (x: byte)) ^ "h" | `EXT_INDIRECT x -> "ext_indirect " ^ string_of_bool x | `EXT_IND_DPTR -> "@DPTR" (* DPM: weird: this seems to be reversed in mcu8051ide: change made. *) | `INDIRECT x -> if not x then "@R0" else "@R1" | `IND_DPTR -> "@DPTR" | `Label s -> s ;; let pp_jump = function `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 | `DJNZ (a1,a2) -> "djnz " ^ pp_arg a1 ^ ", " ^ pp_arg a2 | `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 | `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 let pp_instruction = function `Label l -> l ^ ":" | `Cost l -> l ^ ":" | `Jmp j -> "ljmp " ^ j | `Call j -> "lcall " ^ j | `WithLabel i -> pp_jump i | (#jump as i) -> pp_jump i | `Mov (a1,a2) -> "mov " ^ pp_arg a1 ^ ", " ^ a2 | `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 | `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 AB" | `INC a1 -> "inc " ^ pp_arg a1 | `JMP a1 -> "jmp " ^ 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 AB" | `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 let print_program p = let eformat = Eformat.create () in let printf = Eformat.printf eformat in let mem = ASMInterpret.load_code_memory p.ASM.code in let f pc _ = let (inst, new_pc, cost) = ASMInterpret.fetch mem pc in printf "% 6X: %- 18s ;; %d %s\n" (BitVectors.int_of_vect pc) (pp_instruction inst) cost (if BitVectors.WordMap.mem pc p.ASM.cost_labels then (BitVectors.WordMap.find pc p.ASM.cost_labels) else "") ; new_pc in let _ = List.fold_left f (BitVectors.zero `Sixteen) p.ASM.code in Eformat.get eformat