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
|
// license:BSD-3-Clause
// copyright-holders:Sergey Svishchev
#include "emu.h"
#include "ie15dasm.h"
u32 ie15_disassembler::opcode_alignment() const
{
return 1;
}
offs_t ie15_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms)
{
uint32_t flags = 0;
uint8_t op;
unsigned PC = pc;
op = opcodes.r8(pc++);
switch (op & 0xf0)
{
case 0x00:
util::stream_format(stream, "add r%d", op & 0x0f);
break;
case 0x10:
util::stream_format(stream, "jmp $%04x", (((op & 0x0f) << 8) | params.r8(pc)) + 1);
pc+=1;
break;
case 0x20:
util::stream_format(stream, "ldc r%d, #$%02x", (op & 0x0f), params.r8(pc));
pc+=1;
break;
case 0x30: switch (op)
{
case 0x30:
util::stream_format(stream, "lca #$%02x", params.r8(pc));
pc+=1;
break;
case 0x33:
util::stream_format(stream, "ral");
break;
case 0x35:
util::stream_format(stream, "rar");
break;
default:
util::stream_format(stream, "illegal");
break;
};
break;
case 0x40:
util::stream_format(stream, "dsr r%d", op & 0x0f);
break;
case 0x50: switch (op)
{
case 0x50:
util::stream_format(stream, "isn");
break;
case 0x51:
util::stream_format(stream, "inc");
break;
case 0x52:
util::stream_format(stream, "dsn");
break;
case 0x58:
util::stream_format(stream, "ise");
break;
case 0x5a:
util::stream_format(stream, "dse");
break;
case 0x5b:
util::stream_format(stream, "dec");
break;
case 0x5d:
util::stream_format(stream, "com");
break;
case 0x5f:
util::stream_format(stream, "clr");
break;
default:
util::stream_format(stream, "illegal");
break;
};
break;
case 0x60:
util::stream_format(stream, "lla #$%02x", op & 0x0f);
break;
case 0x70:
util::stream_format(stream, "jmi r%d", op & 0x0f);
break;
case 0x80: switch (op)
{
case 0x80: case 0x81: case 0x82: case 0x83:
case 0x84: case 0x85: case 0x86:
util::stream_format(stream, "sfc #%d", op & 0x07);
break;
case 0x87:
util::stream_format(stream, "skp");
break;
case 0x88: case 0x89: case 0x8a: case 0x8b:
case 0x8c: case 0x8d: case 0x8e:
util::stream_format(stream, "sfs #%d", op & 0x07);
break;
case 0x8f:
util::stream_format(stream, "nop");
break;
};
break;
case 0x90:
util::stream_format(stream, "and r%d", op & 0x0f);
break;
case 0xa0:
util::stream_format(stream, "xor r%d", op & 0x0f);
break;
case 0xb0:
util::stream_format(stream, "cs r%d", op & 0x0f);
break;
case 0xc0:
util::stream_format(stream, "%s #%d", BIT(op, 3) ? "sfl" : "cfl", op & 0x07);
break;
case 0xd0:
util::stream_format(stream, "lda r%d", op & 0x0f);
break;
case 0xe0:
util::stream_format(stream, "sta r%d", op & 0x0f);
break;
case 0xf0:
util::stream_format(stream, "ota #$%02x", op & 0x0f);
break;
}
return (pc - PC) | flags | SUPPORTED;
}
|