comparison 68kinst.h @ 0:2432d177e1ac

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