summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/hpc/hpcdasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/hpc/hpcdasm.cpp')
-rw-r--r--src/devices/cpu/hpc/hpcdasm.cpp48
1 files changed, 24 insertions, 24 deletions
diff --git a/src/devices/cpu/hpc/hpcdasm.cpp b/src/devices/cpu/hpc/hpcdasm.cpp
index bbfa77b8eca..28e1941a3b5 100644
--- a/src/devices/cpu/hpc/hpcdasm.cpp
+++ b/src/devices/cpu/hpc/hpcdasm.cpp
@@ -5,21 +5,15 @@
National Semiconductor HPC disassembler
Note that though all 16-bit fields in instructions have the MSB first,
- the HPC's memory organization is in fact little-endian. This is why r16
- is not used to read them.
+ the HPC's memory organization is in fact little-endian (including
+ vector and JIDW tables). This is why r16 is always swapped here.
***************************************************************************/
#include "emu.h"
-#include "util/disasmintf.h"
#include "hpcdasm.h"
-#include "util/strformat.h"
-#include <ctype.h>
-
-using osd::u32;
-using util::BIT;
-using offs_t = u32;
+#include <cctype>
const char *const hpc16083_disassembler::s_regs[128] =
{
@@ -270,7 +264,7 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
if (BIT(opcode, 1))
imm = true;
- src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ src = swapendian_int16(opcodes.r16(pc + 1));
reg = opcodes.r8(pc + 3);
opcode = opcodes.r8(pc + 4);
bytes = 5;
@@ -284,7 +278,7 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
imm = true;
src = opcodes.r8(pc + 1);
- reg = (opcodes.r8(pc + 2) << 8) | opcodes.r8(pc + 3);
+ reg = swapendian_int16(opcodes.r16(pc + 2));
opcode = opcodes.r8(pc + 4);
bytes = 5;
break;
@@ -304,15 +298,15 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
if (BIT(opcode, 1))
imm = true;
- src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
- reg = (opcodes.r8(pc + 3) << 8) | opcodes.r8(pc + 4);
+ src = swapendian_int16(opcodes.r16(pc + 1));
+ reg = swapendian_int16(opcodes.r16(pc + 3));
opcode = opcodes.r8(pc + 5);
bytes = 6;
break;
case 0xa6:
idx = true;
- reg = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ reg = swapendian_int16(opcodes.r16(pc + 1));
src = opcodes.r8(pc + 3);
opcode = opcodes.r8(pc + 4);
bytes = 5;
@@ -389,8 +383,8 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
case 0xa7:
imm = true;
- src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
- reg = (opcodes.r8(pc + 3) << 8) | opcodes.r8(pc + 4);
+ src = swapendian_int16(opcodes.r16(pc + 1));
+ reg = swapendian_int16(opcodes.r16(pc + 3));
bytes = 5;
break;
@@ -403,33 +397,33 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
case 0xb0: case 0xb1: case 0xb2: case 0xb3:
imm = true;
reg = 0x00c8 | ((opcode & 0x03) << 1);
- src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ src = swapendian_int16(opcodes.r16(pc + 1));
bytes = 3;
break;
case 0xb8: case 0xb9: case 0xba: case 0xbb:
case 0xbc: case 0xbd: case 0xbe: case 0xbf:
imm = true;
- src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ src = swapendian_int16(opcodes.r16(pc + 1));
bytes = 3;
break;
case 0xb4: case 0xb5:
jmp = true;
- src = pc + 3 + ((opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2));
+ src = pc + 3 + swapendian_int16(opcodes.r16(pc + 1));
bytes = 3;
break;
case 0xb6:
indir = false;
- src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ src = swapendian_int16(opcodes.r16(pc + 1));
opcode = opcodes.r8(pc + 3);
bytes = 4;
break;
case 0xb7:
imm = true;
- src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ src = swapendian_int16(opcodes.r16(pc + 1));
reg = opcodes.r8(pc + 3);
bytes = 4;
break;
@@ -468,10 +462,12 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
case 0x06:
stream << "ifnc";
+ bytes |= STEP_COND;
break;
case 0x07:
stream << "ifc";
+ bytes |= STEP_COND;
break;
case 0x08: case 0x09: case 0x0a: case 0x0b:
@@ -482,6 +478,7 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
case 0x10: case 0x11: case 0x12: case 0x13:
case 0x14: case 0x15: case 0x16: case 0x17:
disassemble_bit_op(stream, "ifbit", opcode & 0x07, reg, src, indir, idx);
+ bytes |= STEP_COND;
break;
case 0x18: case 0x19: case 0x1a: case 0x1b:
@@ -521,6 +518,7 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
case 0x3a:
disassemble_op(stream, "ifbit", reg, src, imm, indir, idx, false);
+ bytes |= STEP_COND;
break;
case 0x3b:
@@ -595,7 +593,7 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
case 0x8a:
case 0xaa:
disassemble_unary_op(stream, "decsz", reg, src, indir, idx, BIT(opcode, 5));
- bytes |= STEP_OVER | (1 << OVERINSTSHIFT);
+ bytes |= STEP_COND;
break;
case 0x8b:
@@ -649,10 +647,12 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
case 0x9c: case 0xbc: case 0xdc: case 0xfc:
disassemble_op(stream, "ifeq", reg, src, imm, indir, idx, BIT(opcode, 5));
+ bytes |= STEP_COND;
break;
case 0x9d: case 0xbd: case 0xdd: case 0xfd:
disassemble_op(stream, "ifgt", reg, src, imm, indir, idx, BIT(opcode, 5));
+ bytes |= STEP_COND;
break;
case 0x9e: case 0xbe: case 0xde: case 0xfe:
@@ -697,7 +697,7 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
util::stream_format(stream, "%-8sA,[B%c].%c", "lds",
BIT(opcode, 1) ? '-' : '+',
BIT(opcode, 5) ? 'w' : 'b');
- bytes |= STEP_OVER | (1 << OVERINSTSHIFT);
+ bytes |= STEP_COND;
break;
case 0xd0: case 0xd2:
@@ -712,7 +712,7 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
util::stream_format(stream, "%-8sA,[B%c].%c", "xs",
BIT(opcode, 1) ? '-' : '+',
BIT(opcode, 5) ? 'w' : 'b');
- bytes |= STEP_OVER | (1 << OVERINSTSHIFT);
+ bytes |= STEP_COND;
break;
case 0xd1: case 0xd3: