1  MODE_ARM        = 0 
  2  MODE_THUMB      = 1 
  3  MODE_JAZELLE    = 2 
  4   
  5   
  6  IF_PSR_S     = 1<<8      
  7  IF_B         = 1<<9      
  8  IF_H         = 1<<11     
  9  IF_S         = 1<<12     
 10  IF_D         = 1<<13     
 11  IF_L         = 1<<14     
 12  IF_T         = 1<<15     
 13  IF_W         = 1<<16     
 14  IF_UM        = 1<<17     
 15  IF_DAIB_MASK = 0x3800000 
 16  IF_DAIB_SHFT = 23 
 17  IF_DA        = 0x0800000   
 18  IF_IA        = 0x1800000   
 19  IF_DB        = 0x2800000   
 20  IF_IB        = 0x3800000   
 21  IF_DAIB_B    = 0x2800000   
 22  IF_DAIB_I    = 0x1800000   
 23   
 24   
 25  OF_W         = 1<<8      
 26  OF_UM        = 1<<9      
 27   
 28   
 29  OSZFMT_BYTE = "B" 
 30  OSZFMT_HWORD = "<H"   
 31  OSZFMT_WORD = "<L" 
 32  OSZ_BYTE = 1 
 33  OSZ_HWORD = 2 
 34  OSZ_WORD = 4 
 35   
 36  fmts = [None, OSZ_BYTE, OSZ_HWORD, None, OSZ_WORD] 
 37   
 38  COND_EQ     = 0x0         
 39  COND_NE     = 0x1         
 40  COND_CS     = 0x2         
 41  COND_CC     = 0x3         
 42  COND_MI     = 0x4         
 43  COND_PL     = 0x5         
 44  COND_VS     = 0x6         
 45  COND_VC     = 0x7         
 46  COND_HI     = 0x8         
 47  COND_LO     = 0x9         
 48  COND_GE     = 0xA         
 49  COND_LT     = 0xB         
 50  COND_GT     = 0xC         
 51  COND_LE     = 0xD         
 52  COND_AL     = 0xE         
 53  COND_EXTENDED = 0xF         
 54   
 55  cond_codes = { 
 56  COND_EQ:"eq",  
 57  COND_NE:"ne",  
 58  COND_CS:"cs",  
 59  COND_CC:"cc",  
 60  COND_MI:"mi",  
 61  COND_PL:"pl",  
 62  COND_VS:"vs",  
 63  COND_VC:"vc",  
 64  COND_HI:"hi",  
 65  COND_LO:"lo",  
 66  COND_GE:"ge",  
 67  COND_LT:"lt",  
 68  COND_GT:"gt",  
 69  COND_LE:"le",  
 70  COND_AL:"",  
 71  COND_EXTENDED:"2",  
 72  } 
 73   
 74  PM_usr = 0b10000 
 75  PM_fiq = 0b10001 
 76  PM_irq = 0b10010 
 77  PM_svc = 0b10011 
 78  PM_abt = 0b10111 
 79  PM_und = 0b11011 
 80  PM_sys = 0b11111 
 81   
 82   
 83  REG_OFFSET_USR = 17 * (PM_usr&0xf) 
 84  REG_OFFSET_FIQ = 17 * (PM_fiq&0xf) 
 85  REG_OFFSET_IRQ = 17 * (PM_irq&0xf) 
 86  REG_OFFSET_SVC = 17 * (PM_svc&0xf) 
 87  REG_OFFSET_ABT = 17 * (PM_abt&0xf) 
 88  REG_OFFSET_UND = 17 * (PM_und&0xf) 
 89  REG_OFFSET_SYS = 17 * (PM_sys&0xf) 
 90   
 91  REG_OFFSET_CPSR = 16                     
 92   
 93  REG_SPSR_usr = REG_OFFSET_USR + 16 
 94  REG_SPSR_fiq = REG_OFFSET_FIQ + 16 
 95  REG_SPSR_irq = REG_OFFSET_IRQ + 16 
 96  REG_SPSR_svc = REG_OFFSET_SVC + 16 
 97  REG_SPSR_abt = REG_OFFSET_ABT + 16 
 98  REG_SPSR_und = REG_OFFSET_UND + 16 
 99  REG_SPSR_sys = REG_OFFSET_SYS + 16 
100   
101  REG_PC = 0xf 
102  REG_SP = 0xd 
103  REG_BP = None 
104  REG_CPSR = REG_OFFSET_CPSR 
105  REG_FLAGS = REG_OFFSET_CPSR     
106   
107  proc_modes = {  
108      PM_usr: ("User Processor Mode", "usr", "Normal program execution mode", REG_OFFSET_USR, 15, REG_SPSR_usr), 
109      PM_fiq: ("FIQ Processor Mode", "fiq", "Supports a high-speed data transfer or channel process", REG_OFFSET_FIQ, 8, REG_SPSR_fiq), 
110      PM_irq: ("IRQ Processor Mode", "irq", "Used for general-purpose interrupt handling", REG_OFFSET_IRQ, 13, REG_SPSR_irq), 
111      PM_svc: ("Supervisor Processor Mode", "svc", "A protected mode for the operating system", REG_OFFSET_SVC, 13, REG_SPSR_svc), 
112      PM_abt: ("Abort Processor Mode", "abt", "Implements virtual memory and/or memory protection", REG_OFFSET_ABT, 13, REG_SPSR_abt), 
113      PM_und: ("Undefined Processor Mode", "und", "Supports software emulation of hardware coprocessor", REG_OFFSET_UND, 13, REG_SPSR_und), 
114      PM_sys: ("System Processor Mode", "sys", "Runs privileged operating system tasks (ARMv4 and above)", REG_OFFSET_SYS, 15, REG_SPSR_sys), 
115  } 
116   
117  INST_ENC_DP_IMM = 0  
118  INST_ENC_MISC   = 1  
119   
120   
121  IENC_DP_IMM_SHIFT = 0  
122  IENC_MISC         = 1  
123  IENC_MISC1        = 2  
124  IENC_DP_REG_SHIFT = 3  
125  IENC_MULT         = 4  
126  IENC_UNDEF        = 5  
127  IENC_MOV_IMM_STAT = 6  
128  IENC_DP_IMM       = 7  
129  IENC_LOAD_IMM_OFF = 8  
130  IENC_LOAD_REG_OFF = 9  
131  IENC_ARCH_UNDEF   = 10  
132  IENC_MEDIA        = 11  
133  IENC_LOAD_MULT    = 12  
134  IENC_BRANCH       = 13  
135  IENC_COPROC_RREG_XFER = 14   
136  IENC_COPROC_LOAD  = 15  
137  IENC_COPROC_DP    = 16  
138  IENC_COPROC_REG_XFER = 17  
139  IENC_SWINT        = 18  
140  IENC_UNCOND       = 19  
141  IENC_EXTRA_LOAD   = 20  
142   
143   
144  IENC_MEDIA_PARALLEL = ((IENC_MEDIA << 8) + 1) << 8 
145  IENC_MEDIA_SAT      = ((IENC_MEDIA << 8) + 2) << 8 
146  IENC_MEDIA_REV      = ((IENC_MEDIA << 8) + 3) << 8 
147  IENC_MEDIA_SEL      = ((IENC_MEDIA << 8) + 4) << 8 
148  IENC_MEDIA_USAD8    = ((IENC_MEDIA << 8) + 5) << 8 
149  IENC_MEDIA_USADA8   = ((IENC_MEDIA << 8) + 6) << 8 
150  IENC_MEDIA_EXTEND   = ((IENC_MEDIA << 8) + 7) << 8 
151  IENC_UNCOND_CPS     = ((IENC_UNCOND << 8) + 1) << 8 
152  IENC_UNCOND_SETEND  = ((IENC_UNCOND << 8) + 2) << 8 
153  IENC_UNCOND_PLD     = ((IENC_UNCOND << 8) + 3) << 8 
154  IENC_UNCOND_BLX     = ((IENC_UNCOND << 8) + 4) << 8 
155   
156   
157   
158  S_LSL = 0 
159  S_LSR = 1 
160  S_ASR = 2 
161  S_ROR = 3 
162  S_RRX = 4  
163   
164  shift_names = ("lsl", "lsr", "asr", "ror", "rrx") 
165   
166  SOT_REG = 0 
167  SOT_IMM = 1 
168   
169  daib = ("da","ia","db","ib") 
170