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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
|
// license:BSD-3-Clause
// copyright-holders:Wilbert Pol, hap
/*
TMS0980/TMS1000-family disassembler
*/
#include "emu.h"
#include "tms1k_dasm.h"
// constructor
tms1000_base_disassembler::tms1000_base_disassembler(const u8 *lut_mnemonic, bool opcode_9bits, int pc_bits) :
m_lut_mnemonic(lut_mnemonic),
m_opcode_9bits(opcode_9bits),
m_pc_bits(pc_bits)
{
// init lfsr pc lut
const u32 len = 1 << pc_bits;
m_l2r = std::make_unique<u8[]>(len);
m_r2l = std::make_unique<u8[]>(len);
for (u32 i = 0, pc = 0; i < len; i++)
{
m_l2r[i] = pc;
m_r2l[pc] = i;
// see tms1k_base_device::next_pc()
u32 mask = (1 << pc_bits) - 1;
u32 high = 1 << (pc_bits - 1);
u32 fb = (pc << 1 & high) == (pc & high);
if (pc == (mask >> 1))
fb = 1;
else if (pc == mask)
fb = 0;
pc = (pc << 1 | fb) & mask;
}
}
tms1100_disassembler::tms1100_disassembler(const u8 *lut_mnemonic, bool opcode_9bits, int pc_bits) :
tms1000_base_disassembler(lut_mnemonic, opcode_9bits, pc_bits)
{ }
tms1000_disassembler::tms1000_disassembler() : tms1000_base_disassembler(tms1000_mnemonic, false, 6)
{ }
tms1100_disassembler::tms1100_disassembler() : tms1100_disassembler(tms1100_mnemonic, false, 6)
{ }
tms1400_disassembler::tms1400_disassembler() : tms1100_disassembler(tms1400_mnemonic, false, 6)
{ }
tms2100_disassembler::tms2100_disassembler() : tms1100_disassembler(tms2100_mnemonic, false, 6)
{ }
tms2400_disassembler::tms2400_disassembler() : tms1100_disassembler(tms2400_mnemonic, false, 6)
{ }
smc1102_disassembler::smc1102_disassembler() : tms1100_disassembler(smc1102_mnemonic, false, 6)
{ }
tms0980_disassembler::tms0980_disassembler() : tms1000_base_disassembler(tms0980_mnemonic, true, 7)
{ }
tp0320_disassembler::tp0320_disassembler() : tms1000_base_disassembler(tp0320_mnemonic, true, 7)
{ }
offs_t tms1000_base_disassembler::pc_linear_to_real(offs_t pc) const
{
const u32 mask = (1 << m_pc_bits) - 1;
return (pc & ~mask) | m_l2r[pc & mask];
}
offs_t tms1000_base_disassembler::pc_real_to_linear(offs_t pc) const
{
const u32 mask = (1 << m_pc_bits) - 1;
return (pc & ~mask) | m_r2l[pc & mask];
}
// common lookup tables
enum tms1000_base_disassembler::e_mnemonics : unsigned
{
mILL = 0,
mAC0AC, mAC1AC, mACACC, mACNAA, mALEC, mALEM, mAMAAC, mBRANCH,
mCALL, mCCLA, mCLA, mCLO, mCOMC, mCOMX, mCOMX8, mCPAIZ, mCTMDYN,
mDAN, mDMAN, mDMEA, mDNAA, mDYN, mHALT,
mIA, mIMAC, mINTDIS, mINTEN, mINTRTN, mIYC,
mKNEZ, mLDP, mLDX2, mLDX3, mLDX4, mMNEA, mMNEZ,
mNDMEA, mOFF, mRBIT, mREAC, mRETN, mRSTR,
mSAL, mSAMAN, mSBIT, mSBL, mSEAC, mSELIN, mSETR,
mTAC, mTADM, mTAM, mTAMACS, mTAMDYN, mTAMIY, mTAMIYC, mTAMZA,
mTASR, mTAX, mTAY, mTBIT, mTCA, mTCMIY, mTCY, mTDO, mTKA,
mTKM, mTMA, mTMSET, mTMY, mTPC, mTRA, mTSG, mTXA, mTYA,
mXDA, mXMA, mYMCY, mYNEA, mYNEC
};
const char *const tms1000_base_disassembler::s_mnemonic[] =
{
"?",
"AC0AC", "AC1AC", "ACACC", "ACNAA", "ALEC", "ALEM", "AMAAC", "BRANCH",
"CALL", "CCLA", "CLA", "CLO", "COMC", "COMX", "COMX8", "CPAIZ", "CTMDYN",
"DAN", "DMAN", "DMEA", "DNAA", "DYN", "HALT",
"IA", "IMAC", "INTDIS", "INTEN", "INTRTN", "IYC",
"KNEZ", "LDP", "LDX", "LDX", "LDX", "MNEA", "MNEZ",
"NDMEA", "OFF", "RBIT", "REAC", "RETN", "RSTR",
"SAL", "SAMAN", "SBIT", "SBL", "SEAC", "SELIN", "SETR",
"TAC", "TADM", "TAM", "TAMACS", "TAMDYN", "TAMIY", "TAMIYC", "TAMZA",
"TASR", "TAX", "TAY", "TBIT", "TCA", "TCMIY", "TCY", "TDO", "TKA",
"TKM", "TMA", "TMSET", "TMY", "TPC", "TRA", "TSG", "TXA", "TYA",
"XDA", "XMA", "YMCY", "YNEA", "YNEC"
};
const u32 tms1000_base_disassembler::s_flags[] =
{
0,
0, 0, 0, 0, 0, 0, 0, STEP_COND,
STEP_OVER | STEP_COND, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, STEP_OUT, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, STEP_OUT, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0
};
const u8 tms1000_base_disassembler::s_bits[] =
{
0,
4, 4, 4, 4, 4, 0, 0, 6,
6, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 4, 2, 3, 4, 0, 0,
0, 0, 2, 0, 0, 0,
0, 0, 2, 0, 0, 0, 0,
0, 0, 0, 4, 0, 0, 0, 0,
0, 0, 0, 2, 0, 4, 4, 0, 0,
0, 0, 0, 0, 0, 0, 2, 0, 0,
0, 0, 4, 0, 4
};
// opcode luts
const u8 tms1000_disassembler::tms1000_mnemonic[256] =
{
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
// 0x00
mCOMX, mAC0AC, mYNEA, mTAM, mTAMZA, mAC0AC, mAC0AC, mDAN, mTKA, mKNEZ, mTDO, mCLO, mRSTR, mSETR, mIA, mRETN, // 0
mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, // 1
mTAMIY, mTMA, mTMY, mTYA, mTAY, mAMAAC, mMNEZ, mSAMAN, mIMAC, mALEM, mDMAN, mIYC, mDYN, mCPAIZ, mXMA, mCLA, // 2
mSBIT, mSBIT, mSBIT, mSBIT, mRBIT, mRBIT, mRBIT, mRBIT, mTBIT, mTBIT, mTBIT, mTBIT, mLDX2, mLDX2, mLDX2, mLDX2, // 3
mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, // 4
mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, // 5
mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, // 6
mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, // 7
// 0x80
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 8
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 9
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // A
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // B
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // C
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // D
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // E
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL // F
};
const u8 tms1100_disassembler::tms1100_mnemonic[256] =
{
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
// 0x00
mMNEA, mALEM, mYNEA, mXMA, mDYN, mIYC, mAMAAC, mDMAN, mTKA, mCOMX, mTDO, mCOMC, mRSTR, mSETR, mKNEZ, mRETN, // 0
mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, // 1
mTAY, mTMA, mTMY, mTYA, mTAMDYN, mTAMIYC, mTAMZA, mTAM, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, // 2
mSBIT, mSBIT, mSBIT, mSBIT, mRBIT, mRBIT, mRBIT, mRBIT, mTBIT, mTBIT, mTBIT, mTBIT, mSAMAN, mCPAIZ, mIMAC, mMNEZ, // 3
mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, // 4
mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, // 5
mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, // 6
mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mCLA, // 7
// 0x80
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 8
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 9
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // A
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // B
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // C
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // D
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // E
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL // F
};
const u8 tms1400_disassembler::tms1400_mnemonic[256] =
{
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
// 0x00
mMNEA, mALEM, mYNEA, mXMA, mDYN, mIYC, mAMAAC, mDMAN, mTKA, mCOMX, mTDO, mTPC, mRSTR, mSETR, mKNEZ, mRETN, // 0
mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, // 1
mTAY, mTMA, mTMY, mTYA, mTAMDYN, mTAMIYC, mTAMZA, mTAM, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, // 2
mSBIT, mSBIT, mSBIT, mSBIT, mRBIT, mRBIT, mRBIT, mRBIT, mTBIT, mTBIT, mTBIT, mTBIT, mSAMAN, mCPAIZ, mIMAC, mMNEZ, // 3
mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, // 4
mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, // 5
mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, // 6
mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mCLA, // 7
// 0x80
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 8
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 9
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // A
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // B
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // C
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // D
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // E
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL // F
};
const u8 tms2100_disassembler::tms2100_mnemonic[256] =
{
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
// 0x00
mMNEA, mALEM, mYNEA, mXMA, mDYN, mIYC, mAMAAC, mDMAN, mTKA, mTAX, mTDO, mCOMC, mRSTR, mSETR, mTADM, mRETN, // 0
mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, // 1
mTAY, mTMA, mTMY, mTYA, mTAMDYN, mTAMIYC, mTAC, mTAM, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, // 2
mSBIT, mSBIT, mSBIT, mSBIT, mRBIT, mRBIT, mRBIT, mRBIT, mTBIT, mTBIT, mTBIT, mTBIT, mSAMAN, mCPAIZ, mIMAC, mMNEZ, // 3
mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, // 4
mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, // 5
mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, // 6
mAC1AC, mAC1AC, mAC1AC, mTCA, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mTRA, mAC1AC, mAC1AC, mAC1AC, mCLA, // 7
// 0x80
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 8
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 9
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // A
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // B
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // C
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // D
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // E
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL // F
};
const u8 tms2400_disassembler::tms2400_mnemonic[256] =
{
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
// 0x00
mMNEA, mALEM, mYNEA, mXMA, mDYN, mIYC, mAMAAC, mDMAN, mTKA, mTAX, mTDO, mTPC, mRSTR, mSETR, mTADM, mRETN, // 0
mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, // 1
mTAY, mTMA, mTMY, mTYA, mTAMDYN, mTAMIYC, mTAC, mTAM, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, // 2
mSBIT, mSBIT, mSBIT, mSBIT, mRBIT, mRBIT, mRBIT, mRBIT, mTBIT, mTBIT, mTBIT, mTBIT, mSAMAN, mCPAIZ, mIMAC, mMNEZ, // 3
mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, // 4
mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, // 5
mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, // 6
mAC1AC, mAC1AC, mAC1AC, mTCA, mAC1AC, mCOMX, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mAC1AC, mTRA, mAC1AC, mTXA, mAC1AC, mCLA, // 7
// 0x80
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 8
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 9
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // A
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // B
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // C
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // D
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // E
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL // F
};
const u8 smc1102_disassembler::smc1102_mnemonic[256] =
{
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
// 0x00
mMNEA, mALEM, mYNEA, mXMA, mDYN, mIYC, mAMAAC, mDMAN, mTKA, mCOMX, mTASR, mCOMC, mRSTR, mSETR, mKNEZ, mRETN, // 0
mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, // 1
mTAY, mTMA, mTMY, mTYA, mTAMDYN, mTAMIYC, mTAMZA, mTAM, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, mLDX3, // 2
mSBIT, mSBIT, mSBIT, mSBIT, mRBIT, mRBIT, mRBIT, mRBIT, mTBIT, mTBIT, mTBIT, mTBIT, mSAMAN, mCPAIZ, mIMAC, mMNEZ, // 3
mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, // 4
mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, // 5
mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, // 6
mAC1AC, mHALT, mTSG, mTSG, mINTEN, mINTDIS, mINTRTN, mAC1AC, mSELIN, mAC1AC, mAC1AC, mTMSET, mTSG, mTSG, mAC1AC, mCLA, // 7
// 0x80
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 8
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 9
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // A
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // B
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // C
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // D
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // E
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL // F
};
const u8 tms0980_disassembler::tms0980_mnemonic[512] =
{
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
// 0x000
mCOMX, mALEM, mYNEA, mXMA, mDYN, mIYC, mCLA, mDMAN, mTKA, mMNEA, mTKM, 0, 0, mSETR, mKNEZ, 0, // 0
mDMEA, mDNAA, mCCLA, mNDMEA, 0, mAMAAC, 0, 0, mCTMDYN, mXDA, 0, 0, 0, 0, 0, 0, // 1
mTBIT, mTBIT, mTBIT, mTBIT, 0, 0, 0, 0, mTAY, mTMA, mTMY, mTYA, mTAMDYN, mTAMIYC, mTAMZA, mTAM, // 2
mSAMAN, mCPAIZ, mIMAC, mMNEZ, 0, 0, 0, 0, mTCY, mYNEC, mTCMIY, mACACC, mACNAA, mTAMACS, mALEC, mYMCY, // 3
mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, // 4
mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, // 5
mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, // 6
mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, // 7
// 0x080
mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, // 8
mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, // 9
mSBIT, mSBIT, mSBIT, mSBIT, mRBIT, mRBIT, mRBIT, mRBIT, 0, 0, 0, 0, 0, 0, 0, 0, // A
mTDO, mSAL, mCOMX8, mSBL, mREAC, mSEAC, mOFF, 0, 0, 0, 0, 0, 0, 0, 0, mRETN, // B
mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, // C
mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, // D
mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, // E
mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, // F
// 0x100
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 0
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 1
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 2
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 3
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 4
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 5
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 6
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 7
// 0x180
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // 8
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // 9
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // A
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // B
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // C
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // D
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // E
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL // F
};
const u8 tp0320_disassembler::tp0320_mnemonic[512] =
{
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
// 0x000
0, mALEM, mYNEA, mXMA, mDYN, mIYC, mCLA, mDMAN, mTKA, mMNEA, mTKM, 0, 0, mSETR, mKNEZ, 0, // 0
mDMEA, mDNAA, mCCLA, mNDMEA, 0, mAMAAC, 0, 0, mCTMDYN, mXDA, 0, 0, 0, 0, 0, 0, // 1
mTBIT, mTBIT, mTBIT, mTBIT, 0, 0, 0, 0, mTAY, mTMA, mTMY, mTYA, mTAMDYN, mTAMIYC, mTAMZA, mTAM, // 2
mSAMAN, mCPAIZ, mIMAC, mMNEZ, 0, 0, mRSTR, mYMCY, mTCY, mYNEC, mTCMIY, mACACC, mACNAA, mTAMACS, mALEC, 0, // 3
mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, mTCY, // 4
mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, mYNEC, // 5
mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, mTCMIY, // 6
mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, mACACC, // 7
// 0x080
mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, mLDP, // 8
mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, mLDX4, // 9
mSBIT, mSBIT, mSBIT, mSBIT, mRBIT, mRBIT, mRBIT, mRBIT, 0, 0, 0, 0, 0, 0, 0, 0, // A
mTDO, mSAL, mCOMX8, mSBL, mREAC, mSEAC, mOFF, 0, 0, 0, 0, 0, 0, 0, 0, mRETN, // B
mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, mACNAA, // C
mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, mTAMACS, // D
mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, mALEC, // E
mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, mYMCY, // F
// 0x100
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 0
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 1
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 2
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 3
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 4
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 5
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 6
mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, mBRANCH, // 7
// 0x180
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // 8
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // 9
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // A
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // B
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // C
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // D
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, // E
mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL, mCALL // F
};
// disasm
const u8 tms1000_base_disassembler::i2_value[4] =
{
0, 2, 1, 3
};
const u8 tms1000_base_disassembler::i3_value[8] =
{
0, 4, 2, 6, 1, 5, 3, 7
};
const u8 tms1000_base_disassembler::i4_value[16] =
{
0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe, 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf
};
offs_t tms1000_base_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms)
{
u16 op = m_opcode_9bits ? opcodes.r16(pc) & 0x1ff : opcodes.r8(pc);
u16 instr = m_lut_mnemonic[op];
if (instr == mAC0AC || instr == mAC1AC)
{
// special case for AcAAC
u8 c = (i4_value[op & 0x0f] + ((instr == mAC1AC) ? 1 : 0)) & 0xf;
util::stream_format(stream, "A%dACC", c);
}
else
{
// convert to mnemonic/param
util::stream_format(stream, "%-8s", s_mnemonic[instr]);
switch (s_bits[instr])
{
case 2:
util::stream_format(stream, "%d", i2_value[op & 0x03]);
break;
case 3:
util::stream_format(stream, "%d", i3_value[op & 0x07]);
break;
case 4:
util::stream_format(stream, "%d", i4_value[op & 0x0f]);
break;
case 6:
util::stream_format(stream, "$%02X", op & (m_opcode_9bits ? 0x7f : 0x3f));
break;
default:
break;
}
}
return 1 | s_flags[instr] | SUPPORTED;
}
|