Ignore:
Timestamp:
Mar 2, 2011, 3:27:41 PM (9 years ago)
Author:
ayache
Message:

Update of D2.2 from Paris.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Deliverables/D2.2/8051/src/ASM/ASMPrinter.ml

    r486 r619  
    1 open BitVectors;;
    2 open ASM;;
    31
    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   | `Begin_fun -> "\n; Begin function"
    50   | `End_fun -> "; End function\n"
    51   |  (#jump as i) -> pp_jump i
    52   | `Mov (a1,a2) -> "mov " ^ pp_arg a1 ^ ", " ^ a2
    53   | `ACALL a1 -> "acall " ^ pp_arg a1
    54   | `ADD (a1,a2) -> "add " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    55   | `ADDC (a1,a2) -> "addc " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    56   | `AJMP a1 -> "ajmp " ^ pp_arg a1
    57   | `ANL (`U1 (a1,a2)) -> "anl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    58   | `ANL (`U2 (a1,a2)) -> "anl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    59   | `ANL (`U3 (a1,a2)) -> "anl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    60   | `CLR a1 -> "clr " ^ pp_arg a1
    61   | `CPL a1 -> "cpl " ^ pp_arg a1
    62   | `DA a1 -> "da " ^ pp_arg a1
    63   | `DEC a1 -> "dec " ^ pp_arg a1
    64   | `DIV (a1,a2) -> "div AB"
    65   | `INC a1 -> "inc " ^ pp_arg a1
    66   | `JMP a1 -> "jmp " ^ pp_arg a1
    67   | `LCALL a1 -> "lcall " ^ pp_arg a1
    68   | `LJMP a1 -> "ljmp " ^ pp_arg a1
    69   | `MOV (`U1 (a1,a2)) -> "mov " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    70   | `MOV (`U2 (a1,a2)) -> "mov " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    71   | `MOV (`U3 (a1,a2)) -> "mov " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    72   | `MOV (`U4 (a1,a2)) -> "mov " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    73   | `MOV (`U5 (a1,a2)) -> "mov " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    74   | `MOV (`U6 (a1,a2)) -> "mov " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    75   | `MOVC (a1,a2) -> "movc " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    76   | `MOVX (`U1 (a1,a2)) -> "movx " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    77   | `MOVX (`U2 (a1,a2)) -> "movx " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    78   | `MUL(a1, a2) -> "mul AB"
    79   | `NOP -> "nop"
    80   | `ORL (`U1(a1,a2)) -> "orl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    81   | `ORL (`U2(a1,a2)) -> "orl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    82   | `ORL (`U3(a1,a2)) -> "orl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    83   | `POP a1 -> "pop " ^ pp_arg a1
    84   | `PUSH a1 -> "push " ^ pp_arg a1
    85   | `RET -> "ret"
    86   | `RETI -> "reti"
    87   | `RL a1 -> "rl " ^ pp_arg a1
    88   | `RLC a1 -> "rlc " ^ pp_arg a1
    89   | `RR a1 -> "rr " ^ pp_arg a1
    90   | `RRC a1 -> "rrc " ^ pp_arg a1
    91   | `SETB a1 -> "setb " ^ pp_arg a1
    92   | `SJMP a1 -> "sjmp " ^ pp_arg a1
    93   | `SUBB (a1,a2) -> "subb " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    94   | `SWAP a1 -> "swap " ^ pp_arg a1
    95   | `XCH (a1,a2) -> "xch " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    96   | `XCHD(a1,a2) -> "xchd " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    97   | `XRL(`U1(a1,a2)) -> "xrl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
    98   | `XRL(`U2(a1,a2)) -> "xrl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
     2(** This module provides a function to print [ASM] programs. *)
    993
    1004let print_program p =
    101   let f s i = Printf.sprintf "%s%s\n" s (pp_instruction i) in
    102   "Org 0\n\n" ^ (List.fold_left f "" p.ASM.code) ^ "\nEND\n"
     5  let code_memory = ASMInterpret.load_code_memory p.ASM.code in
     6  let intel_hex = IntelHex.pack_exported_code_memory 16 65536 code_memory in
     7  IntelHex.string_of_intel_hex_format intel_hex
Note: See TracChangeset for help on using the changeset viewer.