1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
#include <stdint.h>
typedef enum {
BIT_MOVEP_IMMED = 0,
MOVE_BYTE,
MOVE_LONG,
MOVE_WORD,
MISC,
QUICK_ARITH_LOOP,
BRANCH,
MOVEQ,
OR_DIV_SBCD,
SUB_SUBX,
RESERVED,
CMP_XOR,
AND_MUL_ABCD_EXG,
ADD_ADDX,
SHIFT_ROTATE,
COPROC
} m68k_optypes;
typedef enum {
M68K_ABCD,
M68K_ADD,
M68K_ADDX,
M68K_AND,
M68K_ANDI_CCR,
M68K_ANDI_SR,
M68K_ASL,
M68K_ASR,
M68K_BCC,
M68K_BCHG,
M68K_BCLR,
M68K_BSET,
M68K_BSR,
M68K_BTST,
M68K_CHK,
M68K_CLR,
M68K_CMP,
M68K_DBCC,
M68K_DIVS,
M68K_DIVU,
M68K_EOR,
M68K_EORI_CCR,
M68K_EORI_SR,
M68K_EXG,
M68K_EXT,
M68K_ILLEGAL,
M68K_JMP,
M68K_JSR,
M68K_LEA,
M68K_LINK
M68K_LSL,
M68K_LSR,
M68K_MOVE,
M68K_MOVE_CCR,
M68K_MOVE_FROM_SR,
M68K_MOVE_SR,
M68K_MOVE_USP,
M68K_MOVEM,
M68K_MOVEP,
M68K_MULS,
M68K_MULU,
M68K_NBCD,
M68K_NEG,
M68K_NEGX,
M68K_NOP,
M68K_NOT,
M68K_OR,
M68K_ORI_CCR,
M68K_ORI_SR,
M68K_PEA,
M68K_RESET,
M68K_ROL,
M68K_ROR,
M68K_ROXL,
M68K_ROXR,
M68K_RTE,
M68K_RTR,
M68K_RTS,
M68K_SBCD,
M68K_SCC,
M68K_STOP,
M68K_SUB,
M68K_SUBX,
M68K_SWAP,
M68K_TAS,
M68K_TRAP,
M68k_TRAPV
M68K_TST,
M68K_UNLNK
} m68K_op;
typedef enum {
VAR_NORMAL,
VAR_QUICK
} m68K_variant;
typedef enum {
OPSIZE_BYTE=0,
OPSIZE_WORD,
OPSIZE_LONG
} m68K_opsizes;
typedef enum {
MODE_REG = 0,
MODE_AREG,
MODE_AREG_INDIRECT,
MODE_AREG_POSTINC,
MODE_AREG_PREDEC,
MODE_AREG_DISPLACE,
MODE_AREG_INDEX_MEM, //bunch of relatively complicated modes
MODE_PC_INDIRECT_ABS_IMMED //Modes that use the program counter, an absolute address or immediate value
} m68k_addr_modes;
typedef enum {
MODE_ABSOLUTE=0,
MODE_PC_DISPLACE,
MODE_PC_INDEX,
MODE_IMMEDIATE
} m68k_addr_extended;
typedef struct {
uint8_t addr_mode;
union {
struct {
uint8_t pri;
uint8_t sec;
int32_t displacement;
} regs;
uint8_t u8;
uint16_t u16;
uint32_t u32;
} params;
} m68k_op_info;
typedef struct {
uint8_t op;
uint8_t variant;
union {
uint8_t size;
uint8_t cond;
} extra;
m68k_op_info src;
m68k_op_info dst;
} m68kinst;
uint16_t * m68K_decode(uint16_t * istream, m68kinst * dst);
uint32_t m68k_cycles(m68kinst * inst);
|