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