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
|
// license:BSD-3-Clause
// copyright-holders:AJR
/***************************************************************************
DEC RX01 microcode disassembler
***************************************************************************/
#include "emu.h"
#include "rx01dasm.h"
rx01_disassembler::rx01_disassembler()
: util::disasm_interface()
{
}
const char *const rx01_disassembler::s_0_or_1[2] = {
"ZERO",
"ONE"
};
const char *const rx01_disassembler::s_conditions[16] = {
"RUN",
"IOB3DT",
"DATAIN",
"INDX",
"SR7",
"COFL",
"CRC16",
"HOME",
"WRTEN",
"SEPCLK",
"XIIBIT",
"DEQSR7",
"BAROFL",
"MCEQSH",
"BDATAO",
"FLAGO"
};
const char *const rx01_disassembler::s_flag_control[4] = {
"NOP",
"OFF",
"ON",
"TOG"
};
u32 rx01_disassembler::opcode_alignment() const
{
return 1;
}
offs_t rx01_disassembler::disassemble(std::ostream &stream, offs_t pc, const rx01_disassembler::data_buffer &opcodes, const rx01_disassembler::data_buffer ¶ms)
{
u8 opcode = opcodes.r8(pc);
if (BIT(opcode, 6))
{
// Branch instructions
util::stream_format(stream, "%sBR %s ",
BIT(opcode, 7) ? "W" : "",
s_conditions[(opcode & 074) >> 2]);
if ((opcode & 074) == 020)
stream << s_0_or_1[BIT(opcode, 1)];
else
stream << (BIT(opcode, 1) ? "T" : "F");
if (BIT(opcode, 0))
{
stream << " IND";
return 1 | (BIT(opcode, 7) ? STEP_OVER : 0) | SUPPORTED;
}
else
{
util::stream_format(stream, " %04o", ((pc + 2) & 07400) | opcodes.r8(pc + 1));
return 2 | (BIT(opcode, 7) ? STEP_OVER : 0) | SUPPORTED;
}
}
else if (BIT(opcode, 7))
{
if (BIT(opcode, 1))
{
stream << "JUMP ";
if (BIT(opcode, 0))
{
util::stream_format(stream, "F%d IND", (opcode & 074) >> 2);
return 1 | SUPPORTED;
}
else
{
util::stream_format(stream, "%04o", u16(opcode & 074) << 6 | opcodes.r8(pc + 1));
return 2 | SUPPORTED;
}
}
else
{
// Clock scratchpad address register
util::stream_format(stream, "OPEN R%d", (opcode & 074) >> 2);
return 1 | SUPPORTED;
}
}
else switch (opcode & 074)
{
case 000: case 004: case 010: case 014: case 020: case 024: case 030:
// IOB flip-flops for drive or interface
util::stream_format(stream, "%s IOB%d", BIT(opcode, 1) ? "SET" : "CLR", (opcode & 074) >> 2);
return 1 | SUPPORTED;
case 034:
// Drive select
util::stream_format(stream, "UNIT %s", s_0_or_1[BIT(opcode, 1)]);
return 1 | SUPPORTED;
case 040:
// Head load/unload
util::stream_format(stream, "%sHD", BIT(opcode, 1) ? "LD" : "UN");
return 1 | SUPPORTED;
case 044:
// Clock buffer address register
if (BIT(opcode, 1))
stream << "INCR BAR";
else
util::stream_format(stream, "CLR BAR %s", BIT(opcode, 0) ? "LONG" : "SHORT");
return 1 | SUPPORTED;
case 050:
// Sector data buffer write
util::stream_format(stream, "%s WRTBUF", BIT(opcode, 0) ? "START" : "FIN");
return 1 | SUPPORTED;
case 054:
// Shift/preset CRC
if (BIT(opcode, 0))
util::stream_format(stream, "%sCRC", BIT(opcode, 1) ? "PRE" : "DAT");
else
util::stream_format(stream, "CRC %s", s_0_or_1[BIT(opcode, 1)]);
return 1 | SUPPORTED;
case 060:
// Clock flag flip-flop (J/K)
util::stream_format(stream, "%s FLAG", s_flag_control[opcode & 3]);
return 1 | SUPPORTED;
case 064:
// Write to scratchpad
stream << "LSP";
return 1 | SUPPORTED;
case 070:
// Clock counter
if (BIT(opcode, 1))
{
stream << "ICT";
return 1 | SUPPORTED;
}
else if (BIT(opcode, 0))
{
stream << "ESP";
return 1 | SUPPORTED;
}
else
{
util::stream_format(stream, "LCT %03o", opcodes.r8(pc + 1));
return 2 | SUPPORTED;
}
case 074:
// Clock shift register
if (!BIT(opcode, 0))
util::stream_format(stream, "ROTATE %s", s_0_or_1[BIT(opcode, 1)]);
else if (BIT(opcode, 1))
stream << "DATSR";
else
stream << "LSR";
return 1 | SUPPORTED;
default:
// This should never happen
util::stream_format(stream, ".BYTE %03o", opcode);
return 1 | SUPPORTED;
}
}
|