summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/ns32000/ns32000dasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/ns32000/ns32000dasm.cpp')
-rw-r--r--src/devices/cpu/ns32000/ns32000dasm.cpp47
1 files changed, 34 insertions, 13 deletions
diff --git a/src/devices/cpu/ns32000/ns32000dasm.cpp b/src/devices/cpu/ns32000/ns32000dasm.cpp
index 600e5f2dfb2..3f8315ec394 100644
--- a/src/devices/cpu/ns32000/ns32000dasm.cpp
+++ b/src/devices/cpu/ns32000/ns32000dasm.cpp
@@ -354,6 +354,10 @@ const char *const ns32000_disassembler::PR[] =
{
"UPSR", "DCR", "BPC", "DSR", "CAR", "", "", "", "FP", "SP", "SB", "USP", "CFG", "PSR", "INTBASE", "MOD"
};
+const char *const ns32000_disassembler::FP[] =
+{
+ "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7"
+};
int8_t ns32000_disassembler::short2int(uint8_t val)
{
@@ -508,7 +512,7 @@ inline std::string ns32000_disassembler::get_reg_list(offs_t &pc, const data_buf
return reg_list;
}
-void ns32000_disassembler::stream_gen(std::ostream &stream, u8 gen_addr, u8 op_len, operand_class op_class, offs_t &pc, const data_buffer &opcodes)
+void ns32000_disassembler::stream_gen(std::ostream &stream, u8 gen_addr, u8 op_len, operand_class op_class, offs_t &pc, const data_buffer &opcodes, bool fpreg)
{
uint8_t index_byte;
int32_t disp1, disp2;
@@ -518,7 +522,7 @@ void ns32000_disassembler::stream_gen(std::ostream &stream, u8 gen_addr, u8 op_l
case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:
/* Register */
if (op_class != operand_class::ADDRESS)
- util::stream_format(stream, "%s", R[gen_addr & 0x07]);
+ util::stream_format(stream, "%s", fpreg ? FP[gen_addr & 0x07] : R[gen_addr & 0x07]);
else
util::stream_format(stream, "(invalid)");
break;
@@ -541,20 +545,25 @@ void ns32000_disassembler::stream_gen(std::ostream &stream, u8 gen_addr, u8 op_l
/* Immediate */
if (op_class == operand_class::SOURCE || op_class == operand_class::BITPOS)
{
+ int64_t imm;
if (op_len == 0)
- disp1 = int8_t(opcodes.r8(pc));
+ imm = int8_t(opcodes.r8(pc));
else if (op_len == 1)
- disp1 = int16_t(swapendian_int16(opcodes.r16(pc)));
+ imm = int16_t(swapendian_int16(opcodes.r16(pc)));
+ else if (op_len == 3)
+ imm = int32_t(swapendian_int32(opcodes.r32(pc)));
else
- disp1 = swapendian_int32(opcodes.r32(pc));
+ imm = int64_t(swapendian_int64(opcodes.r64(pc)));
if (op_class == operand_class::BITPOS)
- util::stream_format(stream, "$%d", disp1);
+ util::stream_format(stream, "$%d", imm);
else if (op_len == 0)
- util::stream_format(stream, "$0x%02X", uint8_t(disp1));
+ util::stream_format(stream, "$0x%02X", uint8_t(imm));
else if (op_len == 1)
- util::stream_format(stream, "$0x%04X", uint16_t(disp1));
- else
- util::stream_format(stream, "$0x%08X", disp1);
+ util::stream_format(stream, "$0x%04X", uint16_t(imm));
+ else if (op_len == 3)
+ util::stream_format(stream, "$0x%08X", uint32_t(imm));
+ else if (op_len == 7)
+ util::stream_format(stream, "$0x%016X", imm);
pc += op_len + 1;
}
else
@@ -850,10 +859,22 @@ offs_t ns32000_disassembler::disassemble(std::ostream &stream, offs_t pc, const
mnemonic = mnemonic_index(Format9[Format9op(opcode)], iType[Format9i(opcode)], fType[Format9f(opcode)]);
switch (Format9op(opcode))
{
- case 0x00: case 0x02: case 0x03: case 0x04: case 0x05: case 0x07:
+ case 0x00:
util::stream_format(stream, "%-8s ", mnemonic);
stream_gen(stream, Format9gen1(opcode), Format9i(opcode), operand_class::SOURCE, pc, opcodes);
util::stream_format(stream, ", ");
+ stream_gen(stream, Format9gen2(opcode), Format9i(opcode), operand_class::DESTINATION, pc, opcodes, true);
+ break;
+ case 0x02: case 0x03:
+ util::stream_format(stream, "%-8s ", mnemonic);
+ stream_gen(stream, Format9gen1(opcode), Format9f(opcode) ? 7 : 3, operand_class::SOURCE, pc, opcodes, true);
+ util::stream_format(stream, ", ");
+ stream_gen(stream, Format9gen2(opcode), Format9f(opcode) ? 3 : 7, operand_class::DESTINATION, pc, opcodes, true);
+ break;
+ case 0x04: case 0x05: case 0x07:
+ util::stream_format(stream, "%-8s ", mnemonic);
+ stream_gen(stream, Format9gen1(opcode), Format9f(opcode) ? 3 : 7, operand_class::SOURCE, pc, opcodes, true);
+ util::stream_format(stream, ", ");
stream_gen(stream, Format9gen2(opcode), Format9i(opcode), operand_class::DESTINATION, pc, opcodes);
break;
case 0x01: case 0x06:
@@ -873,9 +894,9 @@ offs_t ns32000_disassembler::disassemble(std::ostream &stream, offs_t pc, const
{
case 0x00: case 0x01: case 0x02: case 0x04: case 0x05 : case 0x08: case 0x0c : case 0x0d:
util::stream_format(stream, "%-8s ", mnemonic);
- stream_gen(stream, Format11gen1(opcode), Format11f(opcode), operand_class::SOURCE, pc, opcodes);
+ stream_gen(stream, Format11gen1(opcode), Format11f(opcode) ? 3 : 7, operand_class::SOURCE, pc, opcodes, true);
util::stream_format(stream, ",");
- stream_gen(stream, Format11gen2(opcode), Format11f(opcode), operand_class::DESTINATION, pc, opcodes);
+ stream_gen(stream, Format11gen2(opcode), Format11f(opcode) ? 3 : 7, operand_class::DESTINATION, pc, opcodes, true);
break;
default: /* Trap */
util::stream_format(stream, "%-8s ", mnemonic);