1 // license:BSD-3-Clause
2 // copyright-holders:David Haywood
3 /*********************************\
4 
5  ARCompact disassembler
6 
7 \*********************************/
8 
9 #include "emu.h"
10 #include "arcompactdasm.h"
11 
handle00_dasm(std::ostream & stream,offs_t pc,uint32_t op,const data_buffer & opcodes)12 int arcompact_disassembler::handle00_dasm(std::ostream &stream, offs_t pc, uint32_t op, const data_buffer &opcodes)
13 {
14 	int size = 4;
15 	uint8_t subinstr = (op & 0x00010000) >> 16;
16 	op &= ~0x00010000;
17 
18 	switch (subinstr)
19 	{
20 		case 0x00:size = handle00_00_dasm(stream, pc, op, opcodes); break; // Branch Conditionally
21 		case 0x01:size = handle00_01_dasm(stream, pc, op, opcodes); break; // Branch Unconditionally Far
22 	}
23 
24 	return size;
25 }
26 
handle01_dasm(std::ostream & stream,offs_t pc,uint32_t op,const data_buffer & opcodes)27 int arcompact_disassembler::handle01_dasm(std::ostream &stream, offs_t pc, uint32_t op, const data_buffer &opcodes)
28 {
29 	int size = 4;
30 	uint8_t subinstr = (op & 0x00010000) >> 16;
31 	op &= ~0x00010000;
32 
33 	switch (subinstr)
34 	{
35 		case 0x00:size = handle01_00_dasm(stream, pc, op, opcodes); break; // Branh & Link
36 		case 0x01:size = handle01_01_dasm(stream, pc, op, opcodes); break; // Branch on Compare
37 	}
38 
39 	return size;
40 }
41 
handle01_00_dasm(std::ostream & stream,offs_t pc,uint32_t op,const data_buffer & opcodes)42 int arcompact_disassembler::handle01_00_dasm(std::ostream &stream, offs_t pc, uint32_t op, const data_buffer &opcodes)
43 {
44 	int size = 4;
45 	uint8_t subinstr2 = (op & 0x00020000) >> 17;
46 	op &= ~0x00020000;
47 
48 	switch (subinstr2)
49 	{
50 		case 0x00:size = handle01_00_00dasm(stream, pc, op, opcodes); break; // Branch and Link Conditionally
51 		case 0x01:size = handle01_00_01dasm(stream, pc, op, opcodes); break; // Branch and Link Unconditional Far
52 	}
53 
54 	return size;
55 }
56 
handle01_01_dasm(std::ostream & stream,offs_t pc,uint32_t op,const data_buffer & opcodes)57 int arcompact_disassembler::handle01_01_dasm(std::ostream &stream, offs_t pc, uint32_t op, const data_buffer &opcodes)
58 {
59 	int size = 4;
60 
61 	uint8_t subinstr2 = (op & 0x00000010) >> 4;
62 	op &= ~0x00000010;
63 
64 	switch (subinstr2)
65 	{
66 		case 0x00:size = handle01_01_00_dasm(stream, pc, op, opcodes); break; // Branch on Compare Register-Register
67 		case 0x01:size = handle01_01_01_dasm(stream, pc, op, opcodes); break; // Branch on Compare/Bit Test Register-Immediate
68 	}
69 
70 	return size;
71 }
72 
handle01_01_00_dasm(std::ostream & stream,offs_t pc,uint32_t op,const data_buffer & opcodes)73 int arcompact_disassembler::handle01_01_00_dasm(std::ostream &stream, offs_t pc, uint32_t op, const data_buffer &opcodes)
74 {
75 	int size = 4;
76 	uint8_t subinstr3 = (op & 0x0000000f) >> 0;
77 	op &= ~0x0000000f;
78 
79 	switch (subinstr3)
80 	{
81 		case 0x00:size = handle01_01_00_00_dasm(stream, pc, op, opcodes); break; // BREQ (reg-reg)
82 		case 0x01:size = handle01_01_00_01_dasm(stream, pc, op, opcodes); break; // BRNE (reg-reg)
83 		case 0x02:size = handle01_01_00_02_dasm(stream, pc, op, opcodes); break; // BRLT (reg-reg)
84 		case 0x03:size = handle01_01_00_03_dasm(stream, pc, op, opcodes); break; // BRGE (reg-reg)
85 		case 0x04:size = handle01_01_00_04_dasm(stream, pc, op, opcodes); break; // BRLO (reg-reg)
86 		case 0x05:size = handle01_01_00_05_dasm(stream, pc, op, opcodes); break; // BRHS (reg-reg)
87 		case 0x06:size = handle01_01_00_06_dasm(stream, pc, op, opcodes); break; // reserved
88 		case 0x07:size = handle01_01_00_07_dasm(stream, pc, op, opcodes); break; // reserved
89 		case 0x08:size = handle01_01_00_08_dasm(stream, pc, op, opcodes); break; // reserved
90 		case 0x09:size = handle01_01_00_09_dasm(stream, pc, op, opcodes); break; // reserved
91 		case 0x0a:size = handle01_01_00_0a_dasm(stream, pc, op, opcodes); break; // reserved
92 		case 0x0b:size = handle01_01_00_0b_dasm(stream, pc, op, opcodes); break; // reserved
93 		case 0x0c:size = handle01_01_00_0c_dasm(stream, pc, op, opcodes); break; // reserved
94 		case 0x0d:size = handle01_01_00_0d_dasm(stream, pc, op, opcodes); break; // reserved
95 		case 0x0e:size = handle01_01_00_0e_dasm(stream, pc, op, opcodes); break; // BBIT0 (reg-reg)
96 		case 0x0f:size = handle01_01_00_0f_dasm(stream, pc, op, opcodes); break; // BBIT1 (reg-reg)
97 	}
98 
99 	return size;
100 }
101 
handle01_01_01_dasm(std::ostream & stream,offs_t pc,uint32_t op,const data_buffer & opcodes)102 int arcompact_disassembler::handle01_01_01_dasm(std::ostream &stream, offs_t pc, uint32_t op, const data_buffer &opcodes) //  Branch on Compare/Bit Test Register-Immediate
103 {
104 	int size = 4;
105 	uint8_t subinstr3 = (op & 0x0000000f) >> 0;
106 	op &= ~0x0000000f;
107 
108 	switch (subinstr3)
109 	{
110 		case 0x00:size = handle01_01_01_00_dasm(stream, pc, op, opcodes); break; // BREQ (reg-imm)
111 		case 0x01:size = handle01_01_01_01_dasm(stream, pc, op, opcodes); break; // BRNE (reg-imm)
112 		case 0x02:size = handle01_01_01_02_dasm(stream, pc, op, opcodes); break; // BRLT (reg-imm)
113 		case 0x03:size = handle01_01_01_03_dasm(stream, pc, op, opcodes); break; // BRGE (reg-imm)
114 		case 0x04:size = handle01_01_01_04_dasm(stream, pc, op, opcodes); break; // BRLO (reg-imm)
115 		case 0x05:size = handle01_01_01_05_dasm(stream, pc, op, opcodes); break; // BRHS (reg-imm)
116 		case 0x06:size = handle01_01_01_06_dasm(stream, pc, op, opcodes); break; // reserved
117 		case 0x07:size = handle01_01_01_07_dasm(stream, pc, op, opcodes); break; // reserved
118 		case 0x08:size = handle01_01_01_08_dasm(stream, pc, op, opcodes); break; // reserved
119 		case 0x09:size = handle01_01_01_09_dasm(stream, pc, op, opcodes); break; // reserved
120 		case 0x0a:size = handle01_01_01_0a_dasm(stream, pc, op, opcodes); break; // reserved
121 		case 0x0b:size = handle01_01_01_0b_dasm(stream, pc, op, opcodes); break; // reserved
122 		case 0x0c:size = handle01_01_01_0c_dasm(stream, pc, op, opcodes); break; // reserved
123 		case 0x0d:size = handle01_01_01_0d_dasm(stream, pc, op, opcodes); break; // reserved
124 		case 0x0e:size = handle01_01_01_0e_dasm(stream, pc, op, opcodes); break; // BBIT0 (reg-imm)
125 		case 0x0f:size = handle01_01_01_0f_dasm(stream, pc, op, opcodes); break; // BBIT1 (reg-imm)
126 	}
127 
128 	return size;
129 }
130 
handle04_dasm(std::ostream & stream,offs_t pc,uint32_t op,const data_buffer & opcodes)131 int arcompact_disassembler::handle04_dasm(std::ostream &stream, offs_t pc, uint32_t op, const data_buffer &opcodes)
132 {
133 	int size = 4;
134 	// General Operations
135 
136 	// bitpos
137 	// 11111 111 11 111111 0 000 000000 0 00000
138 	// fedcb a98 76 543210 f edc ba9876 5 43210
139 	//
140 	// 00100 bbb 00 iiiiii F BBB CCCCCC A AAAAA   General Operations *UN*Conditional Register to Register
141 	// 00100 bbb 01 iiiiii F BBB UUUUUU A AAAAA   General Operations *UN*Conditional Register (Unsigned 6-bit IMM)
142 	// 00100 bbb 10 iiiiii F BBB ssssss S SSSSS   General Operations *UN*Conditional Register (Signed 12-bit IMM)
143 
144 	// 00100 bbb 11 iiiiii F BBB CCCCCC 0 QQQQQ   General Operations Conditional Register
145 	// 00100 bbb 11 iiiiii F BBB UUUUUU 1 QQQQQ   General Operations Conditional Register (Unsigned 6-bit IMM)
146 	uint8_t subinstr = (op & 0x003f0000) >> 16;
147 	op &= ~0x003f0000;
148 
149 	switch (subinstr)
150 	{
151 		case 0x00:size = handle04_00_dasm(stream, pc, op, opcodes); break; // ADD
152 		case 0x01:size = handle04_01_dasm(stream, pc, op, opcodes); break; // ADC
153 		case 0x02:size = handle04_02_dasm(stream, pc, op, opcodes); break; // SUB
154 		case 0x03:size = handle04_03_dasm(stream, pc, op, opcodes); break; // SBC
155 		case 0x04:size = handle04_04_dasm(stream, pc, op, opcodes); break; // AND
156 		case 0x05:size = handle04_05_dasm(stream, pc, op, opcodes); break; // OR
157 		case 0x06:size = handle04_06_dasm(stream, pc, op, opcodes); break; // BIC
158 		case 0x07:size = handle04_07_dasm(stream, pc, op, opcodes); break; // XOR
159 		case 0x08:size = handle04_08_dasm(stream, pc, op, opcodes); break; // MAX
160 		case 0x09:size = handle04_09_dasm(stream, pc, op, opcodes); break; // MIN
161 		case 0x0a:size = handle04_0a_dasm(stream, pc, op, opcodes); break; // MOV
162 		case 0x0b:size = handle04_0b_dasm(stream, pc, op, opcodes); break; // TST
163 		case 0x0c:size = handle04_0c_dasm(stream, pc, op, opcodes); break; // CMP
164 		case 0x0d:size = handle04_0d_dasm(stream, pc, op, opcodes); break; // RCMP
165 		case 0x0e:size = handle04_0e_dasm(stream, pc, op, opcodes); break; // RSUB
166 		case 0x0f:size = handle04_0f_dasm(stream, pc, op, opcodes); break; // BSET
167 		case 0x10:size = handle04_10_dasm(stream, pc, op, opcodes); break; // BCLR
168 		case 0x11:size = handle04_11_dasm(stream, pc, op, opcodes); break; // BTST
169 		case 0x12:size = handle04_12_dasm(stream, pc, op, opcodes); break; // BXOR
170 		case 0x13:size = handle04_13_dasm(stream, pc, op, opcodes); break; // BMSK
171 		case 0x14:size = handle04_14_dasm(stream, pc, op, opcodes); break; // ADD1
172 		case 0x15:size = handle04_15_dasm(stream, pc, op, opcodes); break; // ADD2
173 		case 0x16:size = handle04_16_dasm(stream, pc, op, opcodes); break; // ADD3
174 		case 0x17:size = handle04_17_dasm(stream, pc, op, opcodes); break; // SUB1
175 		case 0x18:size = handle04_18_dasm(stream, pc, op, opcodes); break; // SUB2
176 		case 0x19:size = handle04_19_dasm(stream, pc, op, opcodes); break; // SUB3
177 		case 0x1a:size = handle04_1a_dasm(stream, pc, op, opcodes); break; // MPY *
178 		case 0x1b:size = handle04_1b_dasm(stream, pc, op, opcodes); break; // MPYH *
179 		case 0x1c:size = handle04_1c_dasm(stream, pc, op, opcodes); break; // MPYHU *
180 		case 0x1d:size = handle04_1d_dasm(stream, pc, op, opcodes); break; // MPYU *
181 		case 0x1e:size = handle04_1e_dasm(stream, pc, op, opcodes); break; // illegal
182 		case 0x1f:size = handle04_1f_dasm(stream, pc, op, opcodes); break; // illegal
183 		case 0x20:size = handle04_20_dasm(stream, pc, op, opcodes); break; // Jcc
184 		case 0x21:size = handle04_21_dasm(stream, pc, op, opcodes); break; // Jcc.D
185 		case 0x22:size = handle04_22_dasm(stream, pc, op, opcodes); break; // JLcc
186 		case 0x23:size = handle04_23_dasm(stream, pc, op, opcodes); break; // JLcc.D
187 		case 0x24:size = handle04_24_dasm(stream, pc, op, opcodes); break; // illegal
188 		case 0x25:size = handle04_25_dasm(stream, pc, op, opcodes); break; // illegal
189 		case 0x26:size = handle04_26_dasm(stream, pc, op, opcodes); break; // illegal
190 		case 0x27:size = handle04_27_dasm(stream, pc, op, opcodes); break; // illegal
191 		case 0x28:size = handle04_28_dasm(stream, pc, op, opcodes); break; // LPcc
192 		case 0x29:size = handle04_29_dasm(stream, pc, op, opcodes); break; // FLAG
193 		case 0x2a:size = handle04_2a_dasm(stream, pc, op, opcodes); break; // LR
194 		case 0x2b:size = handle04_2b_dasm(stream, pc, op, opcodes); break; // SR
195 		case 0x2c:size = handle04_2c_dasm(stream, pc, op, opcodes); break; // illegal
196 		case 0x2d:size = handle04_2d_dasm(stream, pc, op, opcodes); break; // illegal
197 		case 0x2e:size = handle04_2e_dasm(stream, pc, op, opcodes); break; // illegal
198 		case 0x2f:size = handle04_2f_dasm(stream, pc, op, opcodes); break; // Sub Opcode
199 		case 0x30:size = handle04_30_dasm(stream, pc, op, opcodes); break; // LD r-r
200 		case 0x31:size = handle04_31_dasm(stream, pc, op, opcodes); break; // LD r-r
201 		case 0x32:size = handle04_32_dasm(stream, pc, op, opcodes); break; // LD r-r
202 		case 0x33:size = handle04_33_dasm(stream, pc, op, opcodes); break; // LD r-r
203 		case 0x34:size = handle04_34_dasm(stream, pc, op, opcodes); break; // LD r-r
204 		case 0x35:size = handle04_35_dasm(stream, pc, op, opcodes); break; // LD r-r
205 		case 0x36:size = handle04_36_dasm(stream, pc, op, opcodes); break; // LD r-r
206 		case 0x37:size = handle04_37_dasm(stream, pc, op, opcodes); break; // LD r-r
207 		case 0x38:size = handle04_38_dasm(stream, pc, op, opcodes); break; // illegal
208 		case 0x39:size = handle04_39_dasm(stream, pc, op, opcodes); break; // illegal
209 		case 0x3a:size = handle04_3a_dasm(stream, pc, op, opcodes); break; // illegal
210 		case 0x3b:size = handle04_3b_dasm(stream, pc, op, opcodes); break; // illegal
211 		case 0x3c:size = handle04_3c_dasm(stream, pc, op, opcodes); break; // illegal
212 		case 0x3d:size = handle04_3d_dasm(stream, pc, op, opcodes); break; // illegal
213 		case 0x3e:size = handle04_3e_dasm(stream, pc, op, opcodes); break; // illegal
214 		case 0x3f:size = handle04_3f_dasm(stream, pc, op, opcodes); break; // illegal
215 	}
216 
217 	return size;
218 }
219 
handle04_2f_dasm(std::ostream & stream,offs_t pc,uint32_t op,const data_buffer & opcodes)220 int arcompact_disassembler::handle04_2f_dasm(std::ostream &stream, offs_t pc, uint32_t op, const data_buffer &opcodes)
221 {
222 	int size = 4;
223 	uint8_t subinstr2 = (op & 0x0000003f) >> 0;
224 	op &= ~0x0000003f;
225 
226 	switch (subinstr2)
227 	{
228 		case 0x00:size = handle04_2f_00_dasm(stream, pc, op, opcodes); break; // ASL
229 		case 0x01:size = handle04_2f_01_dasm(stream, pc, op, opcodes); break; // ASR
230 		case 0x02:size = handle04_2f_02_dasm(stream, pc, op, opcodes); break; // LSR
231 		case 0x03:size = handle04_2f_03_dasm(stream, pc, op, opcodes); break; // ROR
232 		case 0x04:size = handle04_2f_04_dasm(stream, pc, op, opcodes); break; // RCC
233 		case 0x05:size = handle04_2f_05_dasm(stream, pc, op, opcodes); break; // SEXB
234 		case 0x06:size = handle04_2f_06_dasm(stream, pc, op, opcodes); break; // SEXW
235 		case 0x07:size = handle04_2f_07_dasm(stream, pc, op, opcodes); break; // EXTB
236 		case 0x08:size = handle04_2f_08_dasm(stream, pc, op, opcodes); break; // EXTW
237 		case 0x09:size = handle04_2f_09_dasm(stream, pc, op, opcodes); break; // ABS
238 		case 0x0a:size = handle04_2f_0a_dasm(stream, pc, op, opcodes); break; // NOT
239 		case 0x0b:size = handle04_2f_0b_dasm(stream, pc, op, opcodes); break; // RLC
240 		case 0x0c:size = handle04_2f_0c_dasm(stream, pc, op, opcodes); break; // EX
241 		case 0x0d:size = handle04_2f_0d_dasm(stream, pc, op, opcodes); break; // illegal
242 		case 0x0e:size = handle04_2f_0e_dasm(stream, pc, op, opcodes); break; // illegal
243 		case 0x0f:size = handle04_2f_0f_dasm(stream, pc, op, opcodes); break; // illegal
244 		case 0x10:size = handle04_2f_10_dasm(stream, pc, op, opcodes); break; // illegal
245 		case 0x11:size = handle04_2f_11_dasm(stream, pc, op, opcodes); break; // illegal
246 		case 0x12:size = handle04_2f_12_dasm(stream, pc, op, opcodes); break; // illegal
247 		case 0x13:size = handle04_2f_13_dasm(stream, pc, op, opcodes); break; // illegal
248 		case 0x14:size = handle04_2f_14_dasm(stream, pc, op, opcodes); break; // illegal
249 		case 0x15:size = handle04_2f_15_dasm(stream, pc, op, opcodes); break; // illegal
250 		case 0x16:size = handle04_2f_16_dasm(stream, pc, op, opcodes); break; // illegal
251 		case 0x17:size = handle04_2f_17_dasm(stream, pc, op, opcodes); break; // illegal
252 		case 0x18:size = handle04_2f_18_dasm(stream, pc, op, opcodes); break; // illegal
253 		case 0x19:size = handle04_2f_19_dasm(stream, pc, op, opcodes); break; // illegal
254 		case 0x1a:size = handle04_2f_1a_dasm(stream, pc, op, opcodes); break; // illegal
255 		case 0x1b:size = handle04_2f_1b_dasm(stream, pc, op, opcodes); break; // illegal
256 		case 0x1c:size = handle04_2f_1c_dasm(stream, pc, op, opcodes); break; // illegal
257 		case 0x1d:size = handle04_2f_1d_dasm(stream, pc, op, opcodes); break; // illegal
258 		case 0x1e:size = handle04_2f_1e_dasm(stream, pc, op, opcodes); break; // illegal
259 		case 0x1f:size = handle04_2f_1f_dasm(stream, pc, op, opcodes); break; // illegal
260 		case 0x20:size = handle04_2f_20_dasm(stream, pc, op, opcodes); break; // illegal
261 		case 0x21:size = handle04_2f_21_dasm(stream, pc, op, opcodes); break; // illegal
262 		case 0x22:size = handle04_2f_22_dasm(stream, pc, op, opcodes); break; // illegal
263 		case 0x23:size = handle04_2f_23_dasm(stream, pc, op, opcodes); break; // illegal
264 		case 0x24:size = handle04_2f_24_dasm(stream, pc, op, opcodes); break; // illegal
265 		case 0x25:size = handle04_2f_25_dasm(stream, pc, op, opcodes); break; // illegal
266 		case 0x26:size = handle04_2f_26_dasm(stream, pc, op, opcodes); break; // illegal
267 		case 0x27:size = handle04_2f_27_dasm(stream, pc, op, opcodes); break; // illegal
268 		case 0x28:size = handle04_2f_28_dasm(stream, pc, op, opcodes); break; // illegal
269 		case 0x29:size = handle04_2f_29_dasm(stream, pc, op, opcodes); break; // illegal
270 		case 0x2a:size = handle04_2f_2a_dasm(stream, pc, op, opcodes); break; // illegal
271 		case 0x2b:size = handle04_2f_2b_dasm(stream, pc, op, opcodes); break; // illegal
272 		case 0x2c:size = handle04_2f_2c_dasm(stream, pc, op, opcodes); break; // illegal
273 		case 0x2d:size = handle04_2f_2d_dasm(stream, pc, op, opcodes); break; // illegal
274 		case 0x2e:size = handle04_2f_2e_dasm(stream, pc, op, opcodes); break; // illegal
275 		case 0x2f:size = handle04_2f_2f_dasm(stream, pc, op, opcodes); break; // illegal
276 		case 0x30:size = handle04_2f_30_dasm(stream, pc, op, opcodes); break; // illegal
277 		case 0x31:size = handle04_2f_31_dasm(stream, pc, op, opcodes); break; // illegal
278 		case 0x32:size = handle04_2f_32_dasm(stream, pc, op, opcodes); break; // illegal
279 		case 0x33:size = handle04_2f_33_dasm(stream, pc, op, opcodes); break; // illegal
280 		case 0x34:size = handle04_2f_34_dasm(stream, pc, op, opcodes); break; // illegal
281 		case 0x35:size = handle04_2f_35_dasm(stream, pc, op, opcodes); break; // illegal
282 		case 0x36:size = handle04_2f_36_dasm(stream, pc, op, opcodes); break; // illegal
283 		case 0x37:size = handle04_2f_37_dasm(stream, pc, op, opcodes); break; // illegal
284 		case 0x38:size = handle04_2f_38_dasm(stream, pc, op, opcodes); break; // illegal
285 		case 0x39:size = handle04_2f_39_dasm(stream, pc, op, opcodes); break; // illegal
286 		case 0x3a:size = handle04_2f_3a_dasm(stream, pc, op, opcodes); break; // illegal
287 		case 0x3b:size = handle04_2f_3b_dasm(stream, pc, op, opcodes); break; // illegal
288 		case 0x3c:size = handle04_2f_3c_dasm(stream, pc, op, opcodes); break; // illegal
289 		case 0x3d:size = handle04_2f_3d_dasm(stream, pc, op, opcodes); break; // illegal
290 		case 0x3e:size = handle04_2f_3e_dasm(stream, pc, op, opcodes); break; // illegal
291 		case 0x3f:size = handle04_2f_3f_dasm(stream, pc, op, opcodes); break; // ZOPs (Zero Operand Opcodes)
292 	}
293 
294 	return size;
295 }
296 
297 
handle05_2f_dasm(std::ostream & stream,offs_t pc,uint32_t op,const data_buffer & opcodes)298 int arcompact_disassembler::handle05_2f_dasm(std::ostream &stream, offs_t pc, uint32_t op, const data_buffer &opcodes)
299 {
300 	int size = 4;
301 	uint8_t subinstr2 = (op & 0x0000003f) >> 0;
302 	op &= ~0x0000003f;
303 
304 	switch (subinstr2)
305 	{
306 		case 0x00:size = handle05_2f_00_dasm(stream, pc, op, opcodes); break; // SWAP
307 		case 0x01:size = handle05_2f_01_dasm(stream, pc, op, opcodes); break; // NORM
308 		case 0x02:size = handle05_2f_02_dasm(stream, pc, op, opcodes); break; // SAT16
309 		case 0x03:size = handle05_2f_03_dasm(stream, pc, op, opcodes); break; // RND16
310 		case 0x04:size = handle05_2f_04_dasm(stream, pc, op, opcodes); break; // ABSSW
311 		case 0x05:size = handle05_2f_05_dasm(stream, pc, op, opcodes); break; // ABSS
312 		case 0x06:size = handle05_2f_06_dasm(stream, pc, op, opcodes); break; // NEGSW
313 		case 0x07:size = handle05_2f_07_dasm(stream, pc, op, opcodes); break; // NEGS
314 		case 0x08:size = handle05_2f_08_dasm(stream, pc, op, opcodes); break; // NORMW
315 		case 0x09:size = handle05_2f_09_dasm(stream, pc, op, opcodes); break; // illegal
316 		case 0x0a:size = handle05_2f_0a_dasm(stream, pc, op, opcodes); break; // illegal
317 		case 0x0b:size = handle05_2f_0b_dasm(stream, pc, op, opcodes); break; // illegal
318 		case 0x0c:size = handle05_2f_0c_dasm(stream, pc, op, opcodes); break; // illegal
319 		case 0x0d:size = handle05_2f_0d_dasm(stream, pc, op, opcodes); break; // illegal
320 		case 0x0e:size = handle05_2f_0e_dasm(stream, pc, op, opcodes); break; // illegal
321 		case 0x0f:size = handle05_2f_0f_dasm(stream, pc, op, opcodes); break; // illegal
322 		case 0x10:size = handle05_2f_10_dasm(stream, pc, op, opcodes); break; // illegal
323 		case 0x11:size = handle05_2f_11_dasm(stream, pc, op, opcodes); break; // illegal
324 		case 0x12:size = handle05_2f_12_dasm(stream, pc, op, opcodes); break; // illegal
325 		case 0x13:size = handle05_2f_13_dasm(stream, pc, op, opcodes); break; // illegal
326 		case 0x14:size = handle05_2f_14_dasm(stream, pc, op, opcodes); break; // illegal
327 		case 0x15:size = handle05_2f_15_dasm(stream, pc, op, opcodes); break; // illegal
328 		case 0x16:size = handle05_2f_16_dasm(stream, pc, op, opcodes); break; // illegal
329 		case 0x17:size = handle05_2f_17_dasm(stream, pc, op, opcodes); break; // illegal
330 		case 0x18:size = handle05_2f_18_dasm(stream, pc, op, opcodes); break; // illegal
331 		case 0x19:size = handle05_2f_19_dasm(stream, pc, op, opcodes); break; // illegal
332 		case 0x1a:size = handle05_2f_1a_dasm(stream, pc, op, opcodes); break; // illegal
333 		case 0x1b:size = handle05_2f_1b_dasm(stream, pc, op, opcodes); break; // illegal
334 		case 0x1c:size = handle05_2f_1c_dasm(stream, pc, op, opcodes); break; // illegal
335 		case 0x1d:size = handle05_2f_1d_dasm(stream, pc, op, opcodes); break; // illegal
336 		case 0x1e:size = handle05_2f_1e_dasm(stream, pc, op, opcodes); break; // illegal
337 		case 0x1f:size = handle05_2f_1f_dasm(stream, pc, op, opcodes); break; // illegal
338 		case 0x20:size = handle05_2f_20_dasm(stream, pc, op, opcodes); break; // illegal
339 		case 0x21:size = handle05_2f_21_dasm(stream, pc, op, opcodes); break; // illegal
340 		case 0x22:size = handle05_2f_22_dasm(stream, pc, op, opcodes); break; // illegal
341 		case 0x23:size = handle05_2f_23_dasm(stream, pc, op, opcodes); break; // illegal
342 		case 0x24:size = handle05_2f_24_dasm(stream, pc, op, opcodes); break; // illegal
343 		case 0x25:size = handle05_2f_25_dasm(stream, pc, op, opcodes); break; // illegal
344 		case 0x26:size = handle05_2f_26_dasm(stream, pc, op, opcodes); break; // illegal
345 		case 0x27:size = handle05_2f_27_dasm(stream, pc, op, opcodes); break; // illegal
346 		case 0x28:size = handle05_2f_28_dasm(stream, pc, op, opcodes); break; // illegal
347 		case 0x29:size = handle05_2f_29_dasm(stream, pc, op, opcodes); break; // illegal
348 		case 0x2a:size = handle05_2f_2a_dasm(stream, pc, op, opcodes); break; // illegal
349 		case 0x2b:size = handle05_2f_2b_dasm(stream, pc, op, opcodes); break; // illegal
350 		case 0x2c:size = handle05_2f_2c_dasm(stream, pc, op, opcodes); break; // illegal
351 		case 0x2d:size = handle05_2f_2d_dasm(stream, pc, op, opcodes); break; // illegal
352 		case 0x2e:size = handle05_2f_2e_dasm(stream, pc, op, opcodes); break; // illegal
353 		case 0x2f:size = handle05_2f_2f_dasm(stream, pc, op, opcodes); break; // illegal
354 		case 0x30:size = handle05_2f_30_dasm(stream, pc, op, opcodes); break; // illegal
355 		case 0x31:size = handle05_2f_31_dasm(stream, pc, op, opcodes); break; // illegal
356 		case 0x32:size = handle05_2f_32_dasm(stream, pc, op, opcodes); break; // illegal
357 		case 0x33:size = handle05_2f_33_dasm(stream, pc, op, opcodes); break; // illegal
358 		case 0x34:size = handle05_2f_34_dasm(stream, pc, op, opcodes); break; // illegal
359 		case 0x35:size = handle05_2f_35_dasm(stream, pc, op, opcodes); break; // illegal
360 		case 0x36:size = handle05_2f_36_dasm(stream, pc, op, opcodes); break; // illegal
361 		case 0x37:size = handle05_2f_37_dasm(stream, pc, op, opcodes); break; // illegal
362 		case 0x38:size = handle05_2f_38_dasm(stream, pc, op, opcodes); break; // illegal
363 		case 0x39:size = handle05_2f_39_dasm(stream, pc, op, opcodes); break; // illegal
364 		case 0x3a:size = handle05_2f_3a_dasm(stream, pc, op, opcodes); break; // illegal
365 		case 0x3b:size = handle05_2f_3b_dasm(stream, pc, op, opcodes); break; // illegal
366 		case 0x3c:size = handle05_2f_3c_dasm(stream, pc, op, opcodes); break; // illegal
367 		case 0x3d:size = handle05_2f_3d_dasm(stream, pc, op, opcodes); break; // illegal
368 		case 0x3e:size = handle05_2f_3e_dasm(stream, pc, op, opcodes); break; // illegal
369 		case 0x3f:size = handle05_2f_3f_dasm(stream, pc, op, opcodes); break; // ZOPs (Zero Operand Opcodes)
370 	}
371 
372 	return size;
373 }
374 
handle04_2f_3f_dasm(std::ostream & stream,offs_t pc,uint32_t op,const data_buffer & opcodes)375 int arcompact_disassembler::handle04_2f_3f_dasm(std::ostream &stream, offs_t pc, uint32_t op, const data_buffer &opcodes)
376 {
377 	int size = 4;
378 	uint8_t subinstr3 = (op & 0x07000000) >> 24;
379 	subinstr3 |= ((op & 0x00007000) >> 12) << 3;
380 
381 	op &= ~0x07007000;
382 
383 	switch (subinstr3)
384 	{
385 		case 0x00:size = handle04_2f_3f_00_dasm(stream, pc, op, opcodes); break; // illegal
386 		case 0x01:size = handle04_2f_3f_01_dasm(stream, pc, op, opcodes); break; // SLEEP
387 		case 0x02:size = handle04_2f_3f_02_dasm(stream, pc, op, opcodes); break; // SWI / TRAP9
388 		case 0x03:size = handle04_2f_3f_03_dasm(stream, pc, op, opcodes); break; // SYNC
389 		case 0x04:size = handle04_2f_3f_04_dasm(stream, pc, op, opcodes); break; // RTIE
390 		case 0x05:size = handle04_2f_3f_05_dasm(stream, pc, op, opcodes); break; // BRK
391 		case 0x06:size = handle04_2f_3f_06_dasm(stream, pc, op, opcodes); break; // illegal
392 		case 0x07:size = handle04_2f_3f_07_dasm(stream, pc, op, opcodes); break; // illegal
393 		case 0x08:size = handle04_2f_3f_08_dasm(stream, pc, op, opcodes); break; // illegal
394 		case 0x09:size = handle04_2f_3f_09_dasm(stream, pc, op, opcodes); break; // illegal
395 		case 0x0a:size = handle04_2f_3f_0a_dasm(stream, pc, op, opcodes); break; // illegal
396 		case 0x0b:size = handle04_2f_3f_0b_dasm(stream, pc, op, opcodes); break; // illegal
397 		case 0x0c:size = handle04_2f_3f_0c_dasm(stream, pc, op, opcodes); break; // illegal
398 		case 0x0d:size = handle04_2f_3f_0d_dasm(stream, pc, op, opcodes); break; // illegal
399 		case 0x0e:size = handle04_2f_3f_0e_dasm(stream, pc, op, opcodes); break; // illegal
400 		case 0x0f:size = handle04_2f_3f_0f_dasm(stream, pc, op, opcodes); break; // illegal
401 		case 0x10:size = handle04_2f_3f_10_dasm(stream, pc, op, opcodes); break; // illegal
402 		case 0x11:size = handle04_2f_3f_11_dasm(stream, pc, op, opcodes); break; // illegal
403 		case 0x12:size = handle04_2f_3f_12_dasm(stream, pc, op, opcodes); break; // illegal
404 		case 0x13:size = handle04_2f_3f_13_dasm(stream, pc, op, opcodes); break; // illegal
405 		case 0x14:size = handle04_2f_3f_14_dasm(stream, pc, op, opcodes); break; // illegal
406 		case 0x15:size = handle04_2f_3f_15_dasm(stream, pc, op, opcodes); break; // illegal
407 		case 0x16:size = handle04_2f_3f_16_dasm(stream, pc, op, opcodes); break; // illegal
408 		case 0x17:size = handle04_2f_3f_17_dasm(stream, pc, op, opcodes); break; // illegal
409 		case 0x18:size = handle04_2f_3f_18_dasm(stream, pc, op, opcodes); break; // illegal
410 		case 0x19:size = handle04_2f_3f_19_dasm(stream, pc, op, opcodes); break; // illegal
411 		case 0x1a:size = handle04_2f_3f_1a_dasm(stream, pc, op, opcodes); break; // illegal
412 		case 0x1b:size = handle04_2f_3f_1b_dasm(stream, pc, op, opcodes); break; // illegal
413 		case 0x1c:size = handle04_2f_3f_1c_dasm(stream, pc, op, opcodes); break; // illegal
414 		case 0x1d:size = handle04_2f_3f_1d_dasm(stream, pc, op, opcodes); break; // illegal
415 		case 0x1e:size = handle04_2f_3f_1e_dasm(stream, pc, op, opcodes); break; // illegal
416 		case 0x1f:size = handle04_2f_3f_1f_dasm(stream, pc, op, opcodes); break; // illegal
417 		case 0x20:size = handle04_2f_3f_20_dasm(stream, pc, op, opcodes); break; // illegal
418 		case 0x21:size = handle04_2f_3f_21_dasm(stream, pc, op, opcodes); break; // illegal
419 		case 0x22:size = handle04_2f_3f_22_dasm(stream, pc, op, opcodes); break; // illegal
420 		case 0x23:size = handle04_2f_3f_23_dasm(stream, pc, op, opcodes); break; // illegal
421 		case 0x24:size = handle04_2f_3f_24_dasm(stream, pc, op, opcodes); break; // illegal
422 		case 0x25:size = handle04_2f_3f_25_dasm(stream, pc, op, opcodes); break; // illegal
423 		case 0x26:size = handle04_2f_3f_26_dasm(stream, pc, op, opcodes); break; // illegal
424 		case 0x27:size = handle04_2f_3f_27_dasm(stream, pc, op, opcodes); break; // illegal
425 		case 0x28:size = handle04_2f_3f_28_dasm(stream, pc, op, opcodes); break; // illegal
426 		case 0x29:size = handle04_2f_3f_29_dasm(stream, pc, op, opcodes); break; // illegal
427 		case 0x2a:size = handle04_2f_3f_2a_dasm(stream, pc, op, opcodes); break; // illegal
428 		case 0x2b:size = handle04_2f_3f_2b_dasm(stream, pc, op, opcodes); break; // illegal
429 		case 0x2c:size = handle04_2f_3f_2c_dasm(stream, pc, op, opcodes); break; // illegal
430 		case 0x2d:size = handle04_2f_3f_2d_dasm(stream, pc, op, opcodes); break; // illegal
431 		case 0x2e:size = handle04_2f_3f_2e_dasm(stream, pc, op, opcodes); break; // illegal
432 		case 0x2f:size = handle04_2f_3f_2f_dasm(stream, pc, op, opcodes); break; // illegal
433 		case 0x30:size = handle04_2f_3f_30_dasm(stream, pc, op, opcodes); break; // illegal
434 		case 0x31:size = handle04_2f_3f_31_dasm(stream, pc, op, opcodes); break; // illegal
435 		case 0x32:size = handle04_2f_3f_32_dasm(stream, pc, op, opcodes); break; // illegal
436 		case 0x33:size = handle04_2f_3f_33_dasm(stream, pc, op, opcodes); break; // illegal
437 		case 0x34:size = handle04_2f_3f_34_dasm(stream, pc, op, opcodes); break; // illegal
438 		case 0x35:size = handle04_2f_3f_35_dasm(stream, pc, op, opcodes); break; // illegal
439 		case 0x36:size = handle04_2f_3f_36_dasm(stream, pc, op, opcodes); break; // illegal
440 		case 0x37:size = handle04_2f_3f_37_dasm(stream, pc, op, opcodes); break; // illegal
441 		case 0x38:size = handle04_2f_3f_38_dasm(stream, pc, op, opcodes); break; // illegal
442 		case 0x39:size = handle04_2f_3f_39_dasm(stream, pc, op, opcodes); break; // illegal
443 		case 0x3a:size = handle04_2f_3f_3a_dasm(stream, pc, op, opcodes); break; // illegal
444 		case 0x3b:size = handle04_2f_3f_3b_dasm(stream, pc, op, opcodes); break; // illegal
445 		case 0x3c:size = handle04_2f_3f_3c_dasm(stream, pc, op, opcodes); break; // illegal
446 		case 0x3d:size = handle04_2f_3f_3d_dasm(stream, pc, op, opcodes); break; // illegal
447 		case 0x3e:size = handle04_2f_3f_3e_dasm(stream, pc, op, opcodes); break; // illegal
448 		case 0x3f:size = handle04_2f_3f_3f_dasm(stream, pc, op, opcodes); break; // illegal
449 	}
450 
451 	return size;
452 }
453 
454 
handle05_2f_3f_dasm(std::ostream & stream,offs_t pc,uint32_t op,const data_buffer & opcodes)455 int arcompact_disassembler::handle05_2f_3f_dasm(std::ostream &stream, offs_t pc, uint32_t op, const data_buffer &opcodes) // useless ZOP group, no actual opcodes
456 {
457 	int size = 4;
458 	uint8_t subinstr3 = (op & 0x07000000) >> 24;
459 	subinstr3 |= ((op & 0x00007000) >> 12) << 3;
460 
461 	op &= ~0x07007000;
462 
463 	switch (subinstr3)
464 	{
465 		case 0x00:size = handle05_2f_3f_00_dasm(stream, pc, op, opcodes); break; // illegal
466 		case 0x01:size = handle05_2f_3f_01_dasm(stream, pc, op, opcodes); break; // illegal
467 		case 0x02:size = handle05_2f_3f_02_dasm(stream, pc, op, opcodes); break; // illegal
468 		case 0x03:size = handle05_2f_3f_03_dasm(stream, pc, op, opcodes); break; // illegal
469 		case 0x04:size = handle05_2f_3f_04_dasm(stream, pc, op, opcodes); break; // illegal
470 		case 0x05:size = handle05_2f_3f_05_dasm(stream, pc, op, opcodes); break; // illegal
471 		case 0x06:size = handle05_2f_3f_06_dasm(stream, pc, op, opcodes); break; // illegal
472 		case 0x07:size = handle05_2f_3f_07_dasm(stream, pc, op, opcodes); break; // illegal
473 		case 0x08:size = handle05_2f_3f_08_dasm(stream, pc, op, opcodes); break; // illegal
474 		case 0x09:size = handle05_2f_3f_09_dasm(stream, pc, op, opcodes); break; // illegal
475 		case 0x0a:size = handle05_2f_3f_0a_dasm(stream, pc, op, opcodes); break; // illegal
476 		case 0x0b:size = handle05_2f_3f_0b_dasm(stream, pc, op, opcodes); break; // illegal
477 		case 0x0c:size = handle05_2f_3f_0c_dasm(stream, pc, op, opcodes); break; // illegal
478 		case 0x0d:size = handle05_2f_3f_0d_dasm(stream, pc, op, opcodes); break; // illegal
479 		case 0x0e:size = handle05_2f_3f_0e_dasm(stream, pc, op, opcodes); break; // illegal
480 		case 0x0f:size = handle05_2f_3f_0f_dasm(stream, pc, op, opcodes); break; // illegal
481 		case 0x10:size = handle05_2f_3f_10_dasm(stream, pc, op, opcodes); break; // illegal
482 		case 0x11:size = handle05_2f_3f_11_dasm(stream, pc, op, opcodes); break; // illegal
483 		case 0x12:size = handle05_2f_3f_12_dasm(stream, pc, op, opcodes); break; // illegal
484 		case 0x13:size = handle05_2f_3f_13_dasm(stream, pc, op, opcodes); break; // illegal
485 		case 0x14:size = handle05_2f_3f_14_dasm(stream, pc, op, opcodes); break; // illegal
486 		case 0x15:size = handle05_2f_3f_15_dasm(stream, pc, op, opcodes); break; // illegal
487 		case 0x16:size = handle05_2f_3f_16_dasm(stream, pc, op, opcodes); break; // illegal
488 		case 0x17:size = handle05_2f_3f_17_dasm(stream, pc, op, opcodes); break; // illegal
489 		case 0x18:size = handle05_2f_3f_18_dasm(stream, pc, op, opcodes); break; // illegal
490 		case 0x19:size = handle05_2f_3f_19_dasm(stream, pc, op, opcodes); break; // illegal
491 		case 0x1a:size = handle05_2f_3f_1a_dasm(stream, pc, op, opcodes); break; // illegal
492 		case 0x1b:size = handle05_2f_3f_1b_dasm(stream, pc, op, opcodes); break; // illegal
493 		case 0x1c:size = handle05_2f_3f_1c_dasm(stream, pc, op, opcodes); break; // illegal
494 		case 0x1d:size = handle05_2f_3f_1d_dasm(stream, pc, op, opcodes); break; // illegal
495 		case 0x1e:size = handle05_2f_3f_1e_dasm(stream, pc, op, opcodes); break; // illegal
496 		case 0x1f:size = handle05_2f_3f_1f_dasm(stream, pc, op, opcodes); break; // illegal
497 		case 0x20:size = handle05_2f_3f_20_dasm(stream, pc, op, opcodes); break; // illegal
498 		case 0x21:size = handle05_2f_3f_21_dasm(stream, pc, op, opcodes); break; // illegal
499 		case 0x22:size = handle05_2f_3f_22_dasm(stream, pc, op, opcodes); break; // illegal
500 		case 0x23:size = handle05_2f_3f_23_dasm(stream, pc, op, opcodes); break; // illegal
501 		case 0x24:size = handle05_2f_3f_24_dasm(stream, pc, op, opcodes); break; // illegal
502 		case 0x25:size = handle05_2f_3f_25_dasm(stream, pc, op, opcodes); break; // illegal
503 		case 0x26:size = handle05_2f_3f_26_dasm(stream, pc, op, opcodes); break; // illegal
504 		case 0x27:size = handle05_2f_3f_27_dasm(stream, pc, op, opcodes); break; // illegal
505 		case 0x28:size = handle05_2f_3f_28_dasm(stream, pc, op, opcodes); break; // illegal
506 		case 0x29:size = handle05_2f_3f_29_dasm(stream, pc, op, opcodes); break; // illegal
507 		case 0x2a:size = handle05_2f_3f_2a_dasm(stream, pc, op, opcodes); break; // illegal
508 		case 0x2b:size = handle05_2f_3f_2b_dasm(stream, pc, op, opcodes); break; // illegal
509 		case 0x2c:size = handle05_2f_3f_2c_dasm(stream, pc, op, opcodes); break; // illegal
510 		case 0x2d:size = handle05_2f_3f_2d_dasm(stream, pc, op, opcodes); break; // illegal
511 		case 0x2e:size = handle05_2f_3f_2e_dasm(stream, pc, op, opcodes); break; // illegal
512 		case 0x2f:size = handle05_2f_3f_2f_dasm(stream, pc, op, opcodes); break; // illegal
513 		case 0x30:size = handle05_2f_3f_30_dasm(stream, pc, op, opcodes); break; // illegal
514 		case 0x31:size = handle05_2f_3f_31_dasm(stream, pc, op, opcodes); break; // illegal
515 		case 0x32:size = handle05_2f_3f_32_dasm(stream, pc, op, opcodes); break; // illegal
516 		case 0x33:size = handle05_2f_3f_33_dasm(stream, pc, op, opcodes); break; // illegal
517 		case 0x34:size = handle05_2f_3f_34_dasm(stream, pc, op, opcodes); break; // illegal
518 		case 0x35:size = handle05_2f_3f_35_dasm(stream, pc, op, opcodes); break; // illegal
519 		case 0x36:size = handle05_2f_3f_36_dasm(stream, pc, op, opcodes); break; // illegal
520 		case 0x37:size = handle05_2f_3f_37_dasm(stream, pc, op, opcodes); break; // illegal
521 		case 0x38:size = handle05_2f_3f_38_dasm(stream, pc, op, opcodes); break; // illegal
522 		case 0x39:size = handle05_2f_3f_39_dasm(stream, pc, op, opcodes); break; // illegal
523 		case 0x3a:size = handle05_2f_3f_3a_dasm(stream, pc, op, opcodes); break; // illegal
524 		case 0x3b:size = handle05_2f_3f_3b_dasm(stream, pc, op, opcodes); break; // illegal
525 		case 0x3c:size = handle05_2f_3f_3c_dasm(stream, pc, op, opcodes); break; // illegal
526 		case 0x3d:size = handle05_2f_3f_3d_dasm(stream, pc, op, opcodes); break; // illegal
527 		case 0x3e:size = handle05_2f_3f_3e_dasm(stream, pc, op, opcodes); break; // illegal
528 		case 0x3f:size = handle05_2f_3f_3f_dasm(stream, pc, op, opcodes); break; // illegal
529 	}
530 
531 	return size;
532 }
533 
534 
535 // this is an Extension ALU group, maybe optional on some CPUs?
handle05_dasm(std::ostream & stream,offs_t pc,uint32_t op,const data_buffer & opcodes)536 int arcompact_disassembler::handle05_dasm(std::ostream &stream, offs_t pc, uint32_t op, const data_buffer &opcodes)
537 {
538 	int size = 4;
539 	uint8_t subinstr = (op & 0x003f0000) >> 16;
540 	op &= ~0x003f0000;
541 
542 	switch (subinstr)
543 	{
544 		case 0x00:size = handle05_00_dasm(stream, pc, op, opcodes); break; // ASL
545 		case 0x01:size = handle05_01_dasm(stream, pc, op, opcodes); break; // LSR
546 		case 0x02:size = handle05_02_dasm(stream, pc, op, opcodes); break; // ASR
547 		case 0x03:size = handle05_03_dasm(stream, pc, op, opcodes); break; // ROR
548 		case 0x04:size = handle05_04_dasm(stream, pc, op, opcodes); break; // MUL64
549 		case 0x05:size = handle05_05_dasm(stream, pc, op, opcodes); break; // MULU64
550 		case 0x06:size = handle05_06_dasm(stream, pc, op, opcodes); break; // ADDS
551 		case 0x07:size = handle05_07_dasm(stream, pc, op, opcodes); break; // SUBS
552 		case 0x08:size = handle05_08_dasm(stream, pc, op, opcodes); break; // DIVAW
553 		case 0x09:size = handle05_09_dasm(stream, pc, op, opcodes); break; // illegal
554 		case 0x0a:size = handle05_0a_dasm(stream, pc, op, opcodes); break; // ASLS
555 		case 0x0b:size = handle05_0b_dasm(stream, pc, op, opcodes); break; // ASRS
556 		case 0x0c:size = handle05_0c_dasm(stream, pc, op, opcodes); break; // illegal
557 		case 0x0d:size = handle05_0d_dasm(stream, pc, op, opcodes); break; // illegal
558 		case 0x0e:size = handle05_0e_dasm(stream, pc, op, opcodes); break; // illegal
559 		case 0x0f:size = handle05_0f_dasm(stream, pc, op, opcodes); break; // illegal
560 		case 0x10:size = handle05_10_dasm(stream, pc, op, opcodes); break; // illegal
561 		case 0x11:size = handle05_11_dasm(stream, pc, op, opcodes); break; // illegal
562 		case 0x12:size = handle05_12_dasm(stream, pc, op, opcodes); break; // illegal
563 		case 0x13:size = handle05_13_dasm(stream, pc, op, opcodes); break; // illegal
564 		case 0x14:size = handle05_14_dasm(stream, pc, op, opcodes); break; // illegal
565 		case 0x15:size = handle05_15_dasm(stream, pc, op, opcodes); break; // illegal
566 		case 0x16:size = handle05_16_dasm(stream, pc, op, opcodes); break; // illegal
567 		case 0x17:size = handle05_17_dasm(stream, pc, op, opcodes); break; // illegal
568 		case 0x18:size = handle05_18_dasm(stream, pc, op, opcodes); break; // illegal
569 		case 0x19:size = handle05_19_dasm(stream, pc, op, opcodes); break; // illegal
570 		case 0x1a:size = handle05_1a_dasm(stream, pc, op, opcodes); break; // illegal
571 		case 0x1b:size = handle05_1b_dasm(stream, pc, op, opcodes); break; // illegal
572 		case 0x1c:size = handle05_1c_dasm(stream, pc, op, opcodes); break; // illegal
573 		case 0x1d:size = handle05_1d_dasm(stream, pc, op, opcodes); break; // illegal
574 		case 0x1e:size = handle05_1e_dasm(stream, pc, op, opcodes); break; // illegal
575 		case 0x1f:size = handle05_1f_dasm(stream, pc, op, opcodes); break; // illegal
576 		case 0x20:size = handle05_20_dasm(stream, pc, op, opcodes); break; // illegal
577 		case 0x21:size = handle05_21_dasm(stream, pc, op, opcodes); break; // illegal
578 		case 0x22:size = handle05_22_dasm(stream, pc, op, opcodes); break; // illegal
579 		case 0x23:size = handle05_23_dasm(stream, pc, op, opcodes); break; // illegal
580 		case 0x24:size = handle05_24_dasm(stream, pc, op, opcodes); break; // illegal
581 		case 0x25:size = handle05_25_dasm(stream, pc, op, opcodes); break; // illegal
582 		case 0x26:size = handle05_26_dasm(stream, pc, op, opcodes); break; // illegal
583 		case 0x27:size = handle05_27_dasm(stream, pc, op, opcodes); break; // illegal
584 		case 0x28:size = handle05_28_dasm(stream, pc, op, opcodes); break; // ADDSDW
585 		case 0x29:size = handle05_29_dasm(stream, pc, op, opcodes); break; // SUBSDW
586 		case 0x2a:size = handle05_2a_dasm(stream, pc, op, opcodes); break; // illegal
587 		case 0x2b:size = handle05_2b_dasm(stream, pc, op, opcodes); break; // illegal
588 		case 0x2c:size = handle05_2c_dasm(stream, pc, op, opcodes); break; // illegal
589 		case 0x2d:size = handle05_2d_dasm(stream, pc, op, opcodes); break; // illegal
590 		case 0x2e:size = handle05_2e_dasm(stream, pc, op, opcodes); break; // illegal
591 		case 0x2f:size = handle05_2f_dasm(stream, pc, op, opcodes); break; // SOPs
592 		case 0x30:size = handle05_30_dasm(stream, pc, op, opcodes); break; // illegal
593 		case 0x31:size = handle05_31_dasm(stream, pc, op, opcodes); break; // illegal
594 		case 0x32:size = handle05_32_dasm(stream, pc, op, opcodes); break; // illegal
595 		case 0x33:size = handle05_33_dasm(stream, pc, op, opcodes); break; // illegal
596 		case 0x34:size = handle05_34_dasm(stream, pc, op, opcodes); break; // illegal
597 		case 0x35:size = handle05_35_dasm(stream, pc, op, opcodes); break; // illegal
598 		case 0x36:size = handle05_36_dasm(stream, pc, op, opcodes); break; // illegal
599 		case 0x37:size = handle05_37_dasm(stream, pc, op, opcodes); break; // illegal
600 		case 0x38:size = handle05_38_dasm(stream, pc, op, opcodes); break; // illegal
601 		case 0x39:size = handle05_39_dasm(stream, pc, op, opcodes); break; // illegal
602 		case 0x3a:size = handle05_3a_dasm(stream, pc, op, opcodes); break; // illegal
603 		case 0x3b:size = handle05_3b_dasm(stream, pc, op, opcodes); break; // illegal
604 		case 0x3c:size = handle05_3c_dasm(stream, pc, op, opcodes); break; // illegal
605 		case 0x3d:size = handle05_3d_dasm(stream, pc, op, opcodes); break; // illegal
606 		case 0x3e:size = handle05_3e_dasm(stream, pc, op, opcodes); break; // illegal
607 		case 0x3f:size = handle05_3f_dasm(stream, pc, op, opcodes); break; // illegal
608 	}
609 
610 	return size;
611 }
612 
handle0c_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)613 int arcompact_disassembler::handle0c_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
614 {
615 	int size = 2;
616 	uint8_t subinstr = (op & 0x0018) >> 3;
617 	op &= ~0x0018;
618 
619 	switch (subinstr)
620 	{
621 		case 0x00:size = handle0c_00_dasm(stream, pc, op, opcodes); break; // LD_S
622 		case 0x01:size = handle0c_01_dasm(stream, pc, op, opcodes); break; // LDB_S
623 		case 0x02:size = handle0c_02_dasm(stream, pc, op, opcodes); break; // LDW_S
624 		case 0x03:size = handle0c_03_dasm(stream, pc, op, opcodes); break; // ADD_S
625 	}
626 	return size;
627 }
628 
handle0d_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)629 int arcompact_disassembler::handle0d_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
630 {
631 	int size = 2;
632 	uint8_t subinstr = (op & 0x0018) >> 3;
633 	op &= ~0x0018;
634 
635 	switch (subinstr)
636 	{
637 		case 0x00:size = handle0d_00_dasm(stream, pc, op, opcodes); break; // ADD_S
638 		case 0x01:size = handle0d_01_dasm(stream, pc, op, opcodes); break; // SUB_S
639 		case 0x02:size = handle0d_02_dasm(stream, pc, op, opcodes); break; // ASL_S
640 		case 0x03:size = handle0d_03_dasm(stream, pc, op, opcodes); break; // ASR_S
641 	}
642 	return size;
643 }
644 
handle0e_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)645 int arcompact_disassembler::handle0e_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
646 {
647 	int size = 2;
648 	uint8_t subinstr = (op & 0x0018) >> 3;
649 	op &= ~0x0018;
650 
651 	switch (subinstr)
652 	{
653 		case 0x00:size = handle0e_00_dasm(stream, pc, op, opcodes); break; // ADD_S
654 		case 0x01:size = handle0e_01_dasm(stream, pc, op, opcodes); break; // MOV_S
655 		case 0x02:size = handle0e_02_dasm(stream, pc, op, opcodes); break; // CMP_S
656 		case 0x03:size = handle0e_03_dasm(stream, pc, op, opcodes); break; // MOV_S
657 	}
658 	return size;
659 }
660 
handle0f_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)661 int arcompact_disassembler::handle0f_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
662 {
663 	int size = 2;
664 	// General Register Instructions (16-bit)
665 	// 0111 1bbb ccci iiii
666 	uint8_t subinstr = (op & 0x01f) >> 0;
667 	op &= ~0x001f;
668 
669 	switch (subinstr)
670 	{
671 		case 0x00:size = handle0f_00_dasm(stream, pc, op, opcodes); break; // SOPs
672 		case 0x01:size = handle0f_01_dasm(stream, pc, op, opcodes); break; // 0x01 <illegal>
673 		case 0x02:size = handle0f_02_dasm(stream, pc, op, opcodes); break; // SUB_S
674 		case 0x03:size = handle0f_03_dasm(stream, pc, op, opcodes); break; // 0x03 <illegal>
675 		case 0x04:size = handle0f_04_dasm(stream, pc, op, opcodes); break; // AND_S
676 		case 0x05:size = handle0f_05_dasm(stream, pc, op, opcodes); break; // OR_S
677 		case 0x06:size = handle0f_06_dasm(stream, pc, op, opcodes); break; // BIC_S
678 		case 0x07:size = handle0f_07_dasm(stream, pc, op, opcodes); break; // XOR_S
679 		case 0x08:size = handle0f_08_dasm(stream, pc, op, opcodes); break; // 0x08 <illegal>
680 		case 0x09:size = handle0f_09_dasm(stream, pc, op, opcodes); break; // 0x09 <illegal>
681 		case 0x0a:size = handle0f_0a_dasm(stream, pc, op, opcodes); break; // 0x0a <illegal>
682 		case 0x0b:size = handle0f_0b_dasm(stream, pc, op, opcodes); break; // TST_S
683 		case 0x0c:size = handle0f_0c_dasm(stream, pc, op, opcodes); break; // MUL64_S
684 		case 0x0d:size = handle0f_0d_dasm(stream, pc, op, opcodes); break; // SEXB_S
685 		case 0x0e:size = handle0f_0e_dasm(stream, pc, op, opcodes); break; // SEXW_S
686 		case 0x0f:size = handle0f_0f_dasm(stream, pc, op, opcodes); break; // EXTB_S
687 		case 0x10:size = handle0f_10_dasm(stream, pc, op, opcodes); break; // EXTW_S
688 		case 0x11:size = handle0f_11_dasm(stream, pc, op, opcodes); break; // ABS_S
689 		case 0x12:size = handle0f_12_dasm(stream, pc, op, opcodes); break; // NOT_S
690 		case 0x13:size = handle0f_13_dasm(stream, pc, op, opcodes); break; // NEG_S
691 		case 0x14:size = handle0f_14_dasm(stream, pc, op, opcodes); break; // ADD1_S
692 		case 0x15:size = handle0f_15_dasm(stream, pc, op, opcodes); break; // ADD2_S
693 		case 0x16:size = handle0f_16_dasm(stream, pc, op, opcodes); break; // ADD3_S
694 		case 0x17:size = handle0f_17_dasm(stream, pc, op, opcodes); break; // 0x17 <illegal>
695 		case 0x18:size = handle0f_18_dasm(stream, pc, op, opcodes); break; // ASL_S (multiple)
696 		case 0x19:size = handle0f_19_dasm(stream, pc, op, opcodes); break; // LSR_S (multiple)
697 		case 0x1a:size = handle0f_1a_dasm(stream, pc, op, opcodes); break; // ASR_S (multiple)
698 		case 0x1b:size = handle0f_1b_dasm(stream, pc, op, opcodes); break; // ASL_S (single)
699 		case 0x1c:size = handle0f_1c_dasm(stream, pc, op, opcodes); break; // LSR_S (single)
700 		case 0x1d:size = handle0f_1d_dasm(stream, pc, op, opcodes); break; // ASR_S (single)
701 		case 0x1e:size = handle0f_1e_dasm(stream, pc, op, opcodes); break; // TRAP (not a5?)
702 		case 0x1f:size = handle0f_1f_dasm(stream, pc, op, opcodes); break; // BRK_S ( 0x7fff only? )
703 
704 	}
705 	return size;
706 }
707 
handle0f_00_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)708 int arcompact_disassembler::handle0f_00_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
709 {
710 	int size = 2;
711 	uint8_t subinstr = (op & 0x00e0) >> 5;
712 	op &= ~0x00e0;
713 
714 	switch (subinstr)
715 	{
716 		case 0x00:size = handle0f_00_00_dasm(stream, pc, op, opcodes); break; // J_S
717 		case 0x01:size = handle0f_00_01_dasm(stream, pc, op, opcodes); break; // J_S.D
718 		case 0x02:size = handle0f_00_02_dasm(stream, pc, op, opcodes); break; // JL_S
719 		case 0x03:size = handle0f_00_03_dasm(stream, pc, op, opcodes); break; // JL_S.D
720 		case 0x04:size = handle0f_00_04_dasm(stream, pc, op, opcodes); break; // 0x04 <illegal>
721 		case 0x05:size = handle0f_00_05_dasm(stream, pc, op, opcodes); break; // 0x05 <illegal>
722 		case 0x06:size = handle0f_00_06_dasm(stream, pc, op, opcodes); break; // SUB_S.NE
723 		case 0x07:size = handle0f_00_07_dasm(stream, pc, op, opcodes); break; // ZOPs
724 
725 	}
726 
727 	return size;
728 }
729 
handle0f_00_07_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)730 int arcompact_disassembler::handle0f_00_07_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
731 {
732 	int size = 2;
733 	// General Operations w/o Register
734 	// 01111 iii 111 00000
735 	uint8_t subinstr3 = (op & 0x0700) >> 8;
736 	op &= ~0x0700;
737 
738 	switch (subinstr3)
739 	{
740 		case 0x00:size = handle0f_00_07_00_dasm(stream, pc, op, opcodes); break; // NOP_S
741 		case 0x01:size = handle0f_00_07_01_dasm(stream, pc, op, opcodes); break; // UNIMP_S
742 		case 0x02:size = handle0f_00_07_02_dasm(stream, pc, op, opcodes); break; // 0x02 <illegal>
743 		case 0x03:size = handle0f_00_07_03_dasm(stream, pc, op, opcodes); break; // 0x03 <illegal>
744 		case 0x04:size = handle0f_00_07_04_dasm(stream, pc, op, opcodes); break; // JEQ_S [BLINK]
745 		case 0x05:size = handle0f_00_07_05_dasm(stream, pc, op, opcodes); break; // JNE_S [BLINK]
746 		case 0x06:size = handle0f_00_07_06_dasm(stream, pc, op, opcodes); break; // J_S [BLINK]
747 		case 0x07:size = handle0f_00_07_07_dasm(stream, pc, op, opcodes); break; // J_S.D [BLINK]
748 
749 	}
750 	return size;
751 }
752 
handle17_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)753 int arcompact_disassembler::handle17_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
754 {
755 	int size = 2;
756 	uint8_t subinstr = (op & 0x00e0) >> 5;
757 	op &= ~0x00e0;
758 
759 	switch (subinstr)
760 	{
761 		case 0x00:size = handle17_00_dasm(stream, pc, op, opcodes); break; // ASL_S
762 		case 0x01:size = handle17_01_dasm(stream, pc, op, opcodes); break; // LSR_S
763 		case 0x02:size = handle17_02_dasm(stream, pc, op, opcodes); break; // ASR_S
764 		case 0x03:size = handle17_03_dasm(stream, pc, op, opcodes); break; // SUB_S
765 		case 0x04:size = handle17_04_dasm(stream, pc, op, opcodes); break; // BSET_S
766 		case 0x05:size = handle17_05_dasm(stream, pc, op, opcodes); break; // BCLR_S
767 		case 0x06:size = handle17_06_dasm(stream, pc, op, opcodes); break; // BMSK_S
768 		case 0x07:size = handle17_07_dasm(stream, pc, op, opcodes); break; // BTST_S
769 	}
770 
771 	return size;
772 }
773 
handle18_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)774 int arcompact_disassembler::handle18_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
775 {
776 	int size = 2;
777 	// Stack Pointer Based Instructions (16-bit)
778 	// 11000 bbb iii uuuuu
779 	uint8_t subinstr = (op & 0x00e0) >> 5;
780 	op &= ~0x00e0;
781 
782 	switch (subinstr)
783 	{
784 		case 0x00:size = handle18_00_dasm(stream, pc, op, opcodes); break; // LD_S (SP)
785 		case 0x01:size = handle18_01_dasm(stream, pc, op, opcodes); break; // LDB_S (SP)
786 		case 0x02:size = handle18_02_dasm(stream, pc, op, opcodes); break; // ST_S (SP)
787 		case 0x03:size = handle18_03_dasm(stream, pc, op, opcodes); break; // STB_S (SP)
788 		case 0x04:size = handle18_04_dasm(stream, pc, op, opcodes); break; // ADD_S (SP)
789 		case 0x05:size = handle18_05_dasm(stream, pc, op, opcodes); break; // subtable 18_05
790 		case 0x06:size = handle18_06_dasm(stream, pc, op, opcodes); break; // subtable 18_06
791 		case 0x07:size = handle18_07_dasm(stream, pc, op, opcodes); break; // subtable 18_07
792 	}
793 
794 	return size;
795 }
796 
handle18_05_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)797 int arcompact_disassembler::handle18_05_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
798 {
799 	int size = 2;
800 	uint8_t subinstr2 = (op & 0x0700) >> 8;
801 	op &= ~0x0700;
802 
803 	switch (subinstr2)
804 	{
805 		case 0x00:size = handle18_05_00_dasm(stream, pc, op, opcodes); break; // ADD_S (SP)
806 		case 0x01:size = handle18_05_01_dasm(stream, pc, op, opcodes); break; // SUB_S (SP)
807 		case 0x02:size = handle18_05_02_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_05_02>
808 		case 0x03:size = handle18_05_03_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_05_03>
809 		case 0x04:size = handle18_05_04_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_05_04>
810 		case 0x05:size = handle18_05_05_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_05_05>
811 		case 0x06:size = handle18_05_06_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_05_06>
812 		case 0x07:size = handle18_05_07_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_05_07>
813 	}
814 
815 	return size;
816 }
817 
handle18_06_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)818 int arcompact_disassembler::handle18_06_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
819 {
820 	int size = 2;
821 	uint8_t subinstr2 = (op & 0x001f) >> 0;
822 	op &= ~0x001f;
823 
824 	switch (subinstr2)
825 	{
826 		case 0x00:size = handle18_06_00_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_00>
827 		case 0x01:size = handle18_06_01_dasm(stream, pc, op, opcodes); break; // POP_S b
828 		case 0x02:size = handle18_06_02_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_02>
829 		case 0x03:size = handle18_06_03_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_03>
830 		case 0x04:size = handle18_06_04_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_04>
831 		case 0x05:size = handle18_06_05_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_05>
832 		case 0x06:size = handle18_06_06_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_06>
833 		case 0x07:size = handle18_06_07_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_07>
834 		case 0x08:size = handle18_06_08_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_08>
835 		case 0x09:size = handle18_06_09_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_09>
836 		case 0x0a:size = handle18_06_0a_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_0a>
837 		case 0x0b:size = handle18_06_0b_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_0b>
838 		case 0x0c:size = handle18_06_0c_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_0c>
839 		case 0x0d:size = handle18_06_0d_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_0d>
840 		case 0x0e:size = handle18_06_0e_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_0e>
841 		case 0x0f:size = handle18_06_0f_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_0f>
842 		case 0x10:size = handle18_06_10_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_10>
843 		case 0x11:size = handle18_06_11_dasm(stream, pc, op, opcodes); break; // POP_S blink
844 		case 0x12:size = handle18_06_12_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_12>
845 		case 0x13:size = handle18_06_13_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_13>
846 		case 0x14:size = handle18_06_14_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_14>
847 		case 0x15:size = handle18_06_15_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_15>
848 		case 0x16:size = handle18_06_16_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_16>
849 		case 0x17:size = handle18_06_17_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_17>
850 		case 0x18:size = handle18_06_18_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_18>
851 		case 0x19:size = handle18_06_19_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_19>
852 		case 0x1a:size = handle18_06_1a_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_1a>
853 		case 0x1b:size = handle18_06_1b_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_1b>
854 		case 0x1c:size = handle18_06_1c_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_1c>
855 		case 0x1d:size = handle18_06_1d_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_1d>
856 		case 0x1e:size = handle18_06_1e_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_1e>
857 		case 0x1f:size = handle18_06_1f_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_06_1f>
858 	}
859 
860 	return size;
861 }
862 
handle18_07_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)863 int arcompact_disassembler::handle18_07_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
864 {
865 	int size = 2;
866 	uint8_t subinstr2 = (op & 0x001f) >> 0;
867 	op &= ~0x001f;
868 
869 	switch (subinstr2)
870 	{
871 		case 0x00:size = handle18_07_00_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_00>
872 		case 0x01:size = handle18_07_01_dasm(stream, pc, op, opcodes); break; // PUSH_S b
873 		case 0x02:size = handle18_07_02_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_02>
874 		case 0x03:size = handle18_07_03_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_03>
875 		case 0x04:size = handle18_07_04_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_04>
876 		case 0x05:size = handle18_07_05_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_05>
877 		case 0x06:size = handle18_07_06_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_06>
878 		case 0x07:size = handle18_07_07_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_07>
879 		case 0x08:size = handle18_07_08_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_08>
880 		case 0x09:size = handle18_07_09_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_09>
881 		case 0x0a:size = handle18_07_0a_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_0a>
882 		case 0x0b:size = handle18_07_0b_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_0b>
883 		case 0x0c:size = handle18_07_0c_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_0c>
884 		case 0x0d:size = handle18_07_0d_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_0d>
885 		case 0x0e:size = handle18_07_0e_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_0e>
886 		case 0x0f:size = handle18_07_0f_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_0f>
887 		case 0x10:size = handle18_07_10_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_10>
888 		case 0x11:size = handle18_07_11_dasm(stream, pc, op, opcodes); break; // PUSH_S blink
889 		case 0x12:size = handle18_07_12_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_12>
890 		case 0x13:size = handle18_07_13_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_13>
891 		case 0x14:size = handle18_07_14_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_14>
892 		case 0x15:size = handle18_07_15_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_15>
893 		case 0x16:size = handle18_07_16_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_16>
894 		case 0x17:size = handle18_07_17_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_17>
895 		case 0x18:size = handle18_07_18_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_18>
896 		case 0x19:size = handle18_07_19_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_19>
897 		case 0x1a:size = handle18_07_1a_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_1a>
898 		case 0x1b:size = handle18_07_1b_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_1b>
899 		case 0x1c:size = handle18_07_1c_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_1c>
900 		case 0x1d:size = handle18_07_1d_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_1d>
901 		case 0x1e:size = handle18_07_1e_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_1e>
902 		case 0x1f:size = handle18_07_1f_dasm(stream, pc, op, opcodes); break; // <illegal 0x18_07_1f>
903 	}
904 
905 	return size;
906 }
907 
handle19_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)908 int arcompact_disassembler::handle19_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
909 {
910 	int size = 2;
911 	uint8_t subinstr = (op & 0x0600) >> 9;
912 	op &= ~0x0600;
913 
914 	switch (subinstr)
915 	{
916 		case 0x00:size = handle19_00_dasm(stream, pc, op, opcodes); break; // LD_S (GP)
917 		case 0x01:size = handle19_01_dasm(stream, pc, op, opcodes); break; // LDB_S (GP)
918 		case 0x02:size = handle19_02_dasm(stream, pc, op, opcodes); break; // LDW_S (GP)
919 		case 0x03:size = handle19_03_dasm(stream, pc, op, opcodes); break; // ADD_S (GP)
920 	}
921 	return size;
922 }
923 
handle1c_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)924 int arcompact_disassembler::handle1c_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
925 {
926 	int size = 2;
927 	uint8_t subinstr = (op & 0x0080) >> 7;
928 	op &= ~0x0080;
929 
930 	switch (subinstr)
931 	{
932 		case 0x00:size = handle1c_00_dasm(stream, pc, op, opcodes); break; // ADD_S
933 		case 0x01:size = handle1c_01_dasm(stream, pc, op, opcodes); break; // CMP_S
934 	}
935 	return size;
936 }
937 
handle1d_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)938 int arcompact_disassembler::handle1d_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
939 {
940 	int size = 2;
941 	uint8_t subinstr = (op & 0x0080) >> 7;
942 	op &= ~0x0080;
943 
944 	switch (subinstr)
945 	{
946 		case 0x00:size = handle1d_00_dasm(stream, pc, op, opcodes); break; // BREQ_S
947 		case 0x01:size = handle1d_01_dasm(stream, pc, op, opcodes); break; // BRNE_S
948 	}
949 	return size;
950 }
951 
handle1e_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)952 int arcompact_disassembler::handle1e_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
953 {
954 	int size = 2;
955 	uint8_t subinstr = (op & 0x0600) >> 9;
956 	op &= ~0x0600;
957 
958 	switch (subinstr)
959 	{
960 		case 0x00:size = handle1e_00_dasm(stream, pc, op, opcodes); break; // B_S
961 		case 0x01:size = handle1e_01_dasm(stream, pc, op, opcodes); break; // BEQ_S
962 		case 0x02:size = handle1e_02_dasm(stream, pc, op, opcodes); break; // BNE_S
963 		case 0x03:size = handle1e_03_dasm(stream, pc, op, opcodes); break; // Bcc_S
964 	}
965 	return size;
966 }
967 
handle1e_03_dasm(std::ostream & stream,offs_t pc,uint16_t op,const data_buffer & opcodes)968 int arcompact_disassembler::handle1e_03_dasm(std::ostream &stream, offs_t pc, uint16_t op, const data_buffer &opcodes)
969 {
970 	int size = 2;
971 	uint8_t subinstr2 = (op & 0x01c0) >> 6;
972 	op &= ~0x01c0;
973 
974 	switch (subinstr2)
975 	{
976 		case 0x00:size = handle1e_03_00_dasm(stream, pc, op, opcodes); break; // BGT_S
977 		case 0x01:size = handle1e_03_01_dasm(stream, pc, op, opcodes); break; // BGE_S
978 		case 0x02:size = handle1e_03_02_dasm(stream, pc, op, opcodes); break; // BLT_S
979 		case 0x03:size = handle1e_03_03_dasm(stream, pc, op, opcodes); break; // BLE_S
980 		case 0x04:size = handle1e_03_04_dasm(stream, pc, op, opcodes); break; // BHI_S
981 		case 0x05:size = handle1e_03_05_dasm(stream, pc, op, opcodes); break; // BHS_S
982 		case 0x06:size = handle1e_03_06_dasm(stream, pc, op, opcodes); break; // BLO_S
983 		case 0x07:size = handle1e_03_07_dasm(stream, pc, op, opcodes); break; // BLS_S
984 	}
985 	return size;
986 
987 }
988