Mercurial > repos > blastem
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 |