comparison 68kinst.h @ 2:5df303bf72e6

Improve 68K instruction decoding. Add simple disassembler.
author Mike Pavone <pavone@retrodev.com>
date Sat, 03 Nov 2012 21:38:28 -0700
parents 2432d177e1ac
children 23b83d94c633
comparison
equal deleted inserted replaced
1:5a2c1da6dd0f 2:5df303bf72e6
47 M68K_EXT, 47 M68K_EXT,
48 M68K_ILLEGAL, 48 M68K_ILLEGAL,
49 M68K_JMP, 49 M68K_JMP,
50 M68K_JSR, 50 M68K_JSR,
51 M68K_LEA, 51 M68K_LEA,
52 M68K_LINK 52 M68K_LINK,
53 M68K_LSL, 53 M68K_LSL,
54 M68K_LSR, 54 M68K_LSR,
55 M68K_MOVE, 55 M68K_MOVE,
56 M68K_MOVE_CCR, 56 M68K_MOVE_CCR,
57 M68K_MOVE_FROM_SR, 57 M68K_MOVE_FROM_SR,
84 M68K_SUB, 84 M68K_SUB,
85 M68K_SUBX, 85 M68K_SUBX,
86 M68K_SWAP, 86 M68K_SWAP,
87 M68K_TAS, 87 M68K_TAS,
88 M68K_TRAP, 88 M68K_TRAP,
89 M68k_TRAPV 89 M68K_TRAPV,
90 M68K_TST, 90 M68K_TST,
91 M68K_UNLNK 91 M68K_UNLNK,
92 M68K_INVALID
92 } m68K_op; 93 } m68K_op;
93 94
94 typedef enum { 95 typedef enum {
95 VAR_NORMAL, 96 VAR_NORMAL,
96 VAR_QUICK 97 VAR_QUICK,
98 VAR_BYTE,
99 VAR_WORD,
100 VAR_LONG
97 } m68K_variant; 101 } m68K_variant;
98 102
99 typedef enum { 103 typedef enum {
100 OPSIZE_BYTE=0, 104 OPSIZE_BYTE=0,
101 OPSIZE_WORD, 105 OPSIZE_WORD,
102 OPSIZE_LONG 106 OPSIZE_LONG,
107 OPSIZE_INVALID
103 } m68K_opsizes; 108 } m68K_opsizes;
104 109
105 typedef enum { 110 typedef enum {
111 //actual addressing mode field values
106 MODE_REG = 0, 112 MODE_REG = 0,
107 MODE_AREG, 113 MODE_AREG,
108 MODE_AREG_INDIRECT, 114 MODE_AREG_INDIRECT,
109 MODE_AREG_POSTINC, 115 MODE_AREG_POSTINC,
110 MODE_AREG_PREDEC, 116 MODE_AREG_PREDEC,
111 MODE_AREG_DISPLACE, 117 MODE_AREG_DISPLACE,
112 MODE_AREG_INDEX_MEM, //bunch of relatively complicated modes 118 MODE_AREG_INDEX_MEM, //bunch of relatively complicated modes
113 MODE_PC_INDIRECT_ABS_IMMED //Modes that use the program counter, an absolute address or immediate value 119 MODE_PC_INDIRECT_ABS_IMMED, //Modes that use the program counter, an absolute address or immediate value
120 //expanded values
121 MODE_ABSOLUTE_SHORT,
122 MODE_ABSOLUTE,
123 MODE_PC_DISPLACE,
124 MODE_PC_INDEX,
125 MODE_IMMEDIATE,
126 MODE_UNUSED
114 } m68k_addr_modes; 127 } m68k_addr_modes;
115 128
116 typedef enum { 129 typedef enum {
117 MODE_ABSOLUTE=0, 130 COND_TRUE,
118 MODE_PC_DISPLACE, 131 COND_FALSE,
119 MODE_PC_INDEX, 132 COND_HIGH,
120 MODE_IMMEDIATE 133 COND_LOW_SAME,
121 } m68k_addr_extended; 134 COND_CARRY_CLR,
135 COND_CARRY_SET,
136 COND_NOT_EQ,
137 COND_EQ,
138 COND_OVERF_CLR,
139 COND_OVERF_SET,
140 COND_PLUS,
141 COND_MINUS,
142 COND_GREATER_EQ,
143 COND_LESS,
144 COND_GREATER,
145 COND_LESS_EQ
146 } m68K_condition;
122 147
123 typedef struct { 148 typedef struct {
124 uint8_t addr_mode; 149 uint8_t addr_mode;
125 union { 150 union {
126 struct { 151 struct {
145 m68k_op_info dst; 170 m68k_op_info dst;
146 } m68kinst; 171 } m68kinst;
147 172
148 uint16_t * m68K_decode(uint16_t * istream, m68kinst * dst); 173 uint16_t * m68K_decode(uint16_t * istream, m68kinst * dst);
149 uint32_t m68k_cycles(m68kinst * inst); 174 uint32_t m68k_cycles(m68kinst * inst);
175 int m68K_disasm(m68kinst * decoded, char * dst);
150 176