summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/e132xs/32xsdasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/e132xs/32xsdasm.cpp')
-rw-r--r--src/devices/cpu/e132xs/32xsdasm.cpp930
1 files changed, 397 insertions, 533 deletions
diff --git a/src/devices/cpu/e132xs/32xsdasm.cpp b/src/devices/cpu/e132xs/32xsdasm.cpp
index f385e5fd4f7..286ef747dde 100644
--- a/src/devices/cpu/e132xs/32xsdasm.cpp
+++ b/src/devices/cpu/e132xs/32xsdasm.cpp
@@ -30,9 +30,9 @@ const char *const G_REG[] =
const char *const SETxx[] =
{
- "SETADR", "Reserved", "SET1", "SET0", "SETLE", "SETGT", "SETLT", "SETGE",
+ "SETADR", nullptr, "SET1", "SET0", "SETLE", "SETGT", "SETLT", "SETGE",
"SETSE", "SETHT", "SETST", "SETHE", "SETE", "SETNE", "SETV", "SETNV",
- "Reserved", "Reserved", "SET1M", "Reserved", "SETLEM", "SETGTM", "SETLTM", "SETGEM",
+ nullptr, nullptr, "SET1M", nullptr, "SETLEM", "SETGTM", "SETLTM", "SETGEM",
"SETSEM", "SETTHM", "SETSTM", "SETHEM", "SETEM", "SETNEM", "SETVM", "SETNVM"
};
@@ -392,56 +392,56 @@ offs_t hyperstone_disassembler::disassemble(std::ostream &stream, offs_t pc, con
std::string_view source, dest;
uint32_t flags = 0;
- uint16_t op = opcodes.r16(pc);
+ const uint16_t op = opcodes.r16(pc);
size = 2;
- uint8_t source_code = SOURCECODE(op);
- uint8_t dest_code = DESTCODE(op);
- uint8_t source_bit = SOURCEBIT(op);
- uint8_t dest_bit = DESTBIT(op);
+ const uint8_t source_code = SOURCECODE(op);
+ const uint8_t dest_code = DESTCODE(op);
+ const uint8_t source_bit = SOURCEBIT(op);
+ const uint8_t dest_bit = DESTBIT(op);
- int h_flag = m_config->get_h();
+ const int h_flag = m_config->get_h();
- uint8_t op_num = (op & 0xff00) >> 8;
+ const uint8_t op_num = (op & 0xff00) >> 8;
- switch( op_num )
+ switch (op_num)
{
// CHK - CHKZ - NOP
case 0x00: case 0x01: case 0x02: case 0x03:
-
- if( source_bit && dest_bit && source_code == 0 && dest_code == 0 )
+ if (source_bit && dest_bit && !source_code && !dest_code)
{
util::stream_format(stream, "NOP");
}
else
{
RR_format(source, dest, op, 0);
-
- if( !source_bit && source_code == SR_REGISTER )
- {
+ if (!source_bit && (source_code == SR_REGISTER))
util::stream_format(stream, "CHKZ %s, 0", dest);
- }
else
- {
util::stream_format(stream, "CHK %s, %s", dest, source);
- }
}
-
break;
// MOVD - RET
case 0x04: case 0x05: case 0x06: case 0x07:
-
RR_format(source, dest, op, 0);
- if( dest_code == PC_REGISTER && !dest_bit )
+ if (!dest_bit && (dest_code == PC_REGISTER))
{
- RR_format(source, dest, op, 0);
- util::stream_format(stream, "RET PC, %s", source);
- flags = STEP_OUT;
+ if (!source_bit && ((source_code == PC_REGISTER) || (source_code == SR_REGISTER)))
+ {
+ // RET with PC or SR as source is reserved for future expansion
+ util::stream_format(stream, "D.HU $%04x", op);
+ }
+ else
+ {
+ RR_format(source, dest, op, 0);
+ util::stream_format(stream, "RET PC, %s", source);
+ flags = STEP_OUT;
+ }
}
- else if( source_code == SR_REGISTER && !source_bit )
+ else if (!source_bit && (source_code == SR_REGISTER))
{
util::stream_format(stream, "MOVD %s, 0", dest);
}
@@ -449,692 +449,573 @@ offs_t hyperstone_disassembler::disassemble(std::ostream &stream, offs_t pc, con
{
util::stream_format(stream, "MOVD %s, %s", dest, source);
}
-
break;
- // DIVU
- // DIVS
- case 0x08: case 0x09: case 0x0a: case 0x0b:
- case 0x0c: case 0x0d: case 0x0e: case 0x0f:
-
+ case 0x08: case 0x09: case 0x0a: case 0x0b: // DIVU
+ case 0x0c: case 0x0d: case 0x0e: case 0x0f: // DIVS
RR_format(source, dest, op, 0);
util::stream_format(stream, "DIV%c %s, %s", (op_num & 0x4) ? 'S' : 'U', dest, source);
-
break;
// XMx - XXx
case 0x10: case 0x11: case 0x12: case 0x13:
- {
- RR_format(source, dest, op, 0);
-
- size = 4;
+ {
+ RR_format(source, dest, op, 0);
- pc += 2;
- op = opcodes.r16(pc);
+ size = 4;
- const int xcode = X_CODE(op);
+ pc += 2;
+ const uint16_t ilm1 = opcodes.r16(pc);
- if( xcode < 4 )
- {
- uint16_t lim;
+ const int xcode = X_CODE(ilm1);
- if( E_BIT(op) )
+ if (xcode < 4)
{
- uint16_t next_op;
+ uint16_t lim;
- size = 6;
+ if (E_BIT(ilm1))
+ {
+ size = 6;
+
+ pc += 2;
+ const uint16_t ilm2 = opcodes.r16(pc);
- pc += 2;
- next_op = opcodes.r16(pc);
+ lim = ((ilm1 & 0xfff) << 16) | ilm2;
+ }
+ else
+ {
+ lim = ilm1 & 0xfff;
+ }
- lim = ((op & 0xfff) << 16) | next_op;
+ util::stream_format(stream, "XM%x %s, %s, $%x", 1 << xcode, dest, source, lim);
}
else
{
- lim = op & 0xfff;
+ util::stream_format(stream, "XX%x %s, %s, 0", 1 << (xcode & 0x3), dest, source);
}
-
- util::stream_format(stream, "XM%x %s, %s, $%x", 1 << xcode, dest, source, lim);
}
- else
- {
- util::stream_format(stream, "XX%x %s, %s, 0", 1 << (xcode - 4), dest, source);
- }
-
break;
- }
// MASK
case 0x14: case 0x15: case 0x16: case 0x17:
- {
- uint32_t const_val = RRconst_format(source, dest, op, pc, opcodes);
- util::stream_format(stream, "MASK %s, %s, $%x", dest, source, const_val);
- if (!source_bit && (source_code == PC_REGISTER))
- util::stream_format(stream, " ; $%x", uint32_t((pc + size) & const_val));
-
+ {
+ const uint32_t const_val = RRconst_format(source, dest, op, pc, opcodes);
+ util::stream_format(stream, "MASK %s, %s, $%x", dest, source, const_val);
+ if (!source_bit && (source_code == PC_REGISTER))
+ util::stream_format(stream, " ; $%x", uint32_t((pc + size) & const_val));
+ }
break;
- }
-
- // SUM
- // SUMS
- case 0x18: case 0x19: case 0x1a: case 0x1b:
- case 0x1c: case 0x1d: case 0x1e: case 0x1f:
- {
- uint32_t const_val = RRconst_format(source, dest, op, pc, opcodes);
- util::stream_format(stream, "SUM%c %s, %s, $%x",
- (op_num & 0x4) ? 'S' : ' ',
- dest,
- (!source_bit && (source_code == SR_REGISTER)) ? "C" : source,
- const_val);
- if (!source_bit && (source_code == PC_REGISTER))
- util::stream_format(stream, " ; $%x", uint32_t(pc + size + const_val));
+ case 0x18: case 0x19: case 0x1a: case 0x1b: // SUM
+ case 0x1c: case 0x1d: case 0x1e: case 0x1f: // SUMS
+ {
+ const uint32_t const_val = RRconst_format(source, dest, op, pc, opcodes);
+ util::stream_format(stream, "SUM%c %s, %s, $%x",
+ (op_num & 0x4) ? 'S' : ' ',
+ dest,
+ (!source_bit && (source_code == SR_REGISTER)) ? "C" : source,
+ const_val);
+ if (!source_bit && (source_code == PC_REGISTER))
+ util::stream_format(stream, " ; $%x", uint32_t(pc + size + const_val));
+ }
break;
- }
// CMP
case 0x20: case 0x21: case 0x22: case 0x23:
-
RR_format(source, dest, op, 0);
format_addsub(stream, "CMP", dest, source, source_bit, source_code);
-
break;
// MOV
case 0x24: case 0x25: case 0x26: case 0x27:
-
RR_format(source, dest, op, h_flag);
util::stream_format(stream, "MOV %s, %s", dest, source);
-
break;
- // ADD
- // ADDS
- case 0x28: case 0x29: case 0x2a: case 0x2b:
- case 0x2c: case 0x2d: case 0x2e: case 0x2f:
-
+ case 0x28: case 0x29: case 0x2a: case 0x2b: // ADD
+ case 0x2c: case 0x2d: case 0x2e: case 0x2f: // ADDS
RR_format(source, dest, op, 0);
format_addsub(stream, (op_num & 0x4) ? "ADDS" : "ADD", dest, source, source_bit, source_code);
-
break;
// CMPB
case 0x30: case 0x31: case 0x32: case 0x33:
-
RR_format(source, dest, op, 0);
util::stream_format(stream, "CMPB %s, %s", dest, source);
-
break;
// ANDN
case 0x34: case 0x35: case 0x36: case 0x37:
-
RR_format(source, dest, op, 0);
util::stream_format(stream, "ANDN %s, %s", dest, source);
-
break;
// OR
case 0x38: case 0x39: case 0x3a: case 0x3b:
-
RR_format(source, dest, op, 0);
util::stream_format(stream, "OR %s, %s", dest, source);
-
break;
// XOR
case 0x3c: case 0x3d: case 0x3e: case 0x3f:
-
RR_format(source, dest, op, 0);
util::stream_format(stream, "XOR %s, %s", dest, source);
-
break;
// SUBC
case 0x40: case 0x41: case 0x42: case 0x43:
-
RR_format(source, dest, op, 0);
format_addsub(stream, "SUBC", dest, source, source_bit, source_code);
-
break;
// NOT
case 0x44: case 0x45: case 0x46: case 0x47:
-
RR_format(source, dest, op, 0);
-
util::stream_format(stream, "NOT %s, %s", dest, source);
-
break;
- // SUB
- // SUBS
- case 0x48: case 0x49: case 0x4a: case 0x4b:
- case 0x4c: case 0x4d: case 0x4e: case 0x4f:
-
+ case 0x48: case 0x49: case 0x4a: case 0x4b: // SUB
+ case 0x4c: case 0x4d: case 0x4e: case 0x4f: // SUBS
RR_format(source, dest, op, 0);
format_addsub(stream, (op_num & 0x4) ? "SUBS" : "SUB", dest, source, source_bit, source_code);
-
break;
// ADDC
case 0x50: case 0x51: case 0x52: case 0x53:
-
RR_format(source, dest, op, 0);
format_addsub(stream, "ADDC", dest, source, source_bit, source_code);
-
break;
// AND
case 0x54: case 0x55: case 0x56: case 0x57:
-
RR_format(source, dest, op, 0);
util::stream_format(stream, "AND %s, %s", dest, source);
-
break;
- // NEG
- // NEGS
- case 0x58: case 0x59: case 0x5a: case 0x5b:
- case 0x5c: case 0x5d: case 0x5e: case 0x5f:
-
+ case 0x58: case 0x59: case 0x5a: case 0x5b: // NEG
+ case 0x5c: case 0x5d: case 0x5e: case 0x5f: // NEGS
RR_format(source, dest, op, 0);
format_addsub(stream, (op_num & 0x4) ? "NEGS" : "NEG", dest, source, source_bit, source_code);
-
break;
// CMPI
case 0x60: case 0x61: case 0x62: case 0x63:
- {
- uint32_t imm = Rimm_format(dest, op, pc, opcodes, 0);
-
- util::stream_format(stream, "CMPI %s, $%x", dest, imm);
-
+ {
+ const uint32_t imm = Rimm_format(dest, op, pc, opcodes, 0);
+ util::stream_format(stream, "CMPI %s, $%x", dest, imm);
+ }
break;
- }
// MOVI
case 0x64: case 0x65: case 0x66: case 0x67:
- {
- uint32_t imm = Rimm_format(dest, op, pc, opcodes, h_flag);
-
- util::stream_format(stream, "MOVI %s, $%x", dest, imm);
-
- break;
- }
-
- // ADDI
- case 0x68: case 0x69: case 0x6a: case 0x6b:
- {
- uint32_t imm = Rimm_format(dest, op, pc, opcodes, 0);
-
- if (!DASM_N_VALUE(op))
{
- util::stream_format(stream, "ADDI %s, CZ", dest);
+ const uint32_t imm = Rimm_format(dest, op, pc, opcodes, h_flag);
+ util::stream_format(stream, "MOVI %s, $%x", dest, imm);
}
- else
- {
- util::stream_format(stream, "ADDI %s, $%x", dest, imm);
- if (!dest_bit && (dest_code == PC_REGISTER))
- util::stream_format(stream, " ; $%x", uint32_t(pc + size + imm));
- }
-
break;
- }
-
- // ADDSI
- case 0x6c: case 0x6d: case 0x6e: case 0x6f:
- {
- uint32_t imm = Rimm_format(dest, op, pc, opcodes, 0);
+ case 0x68: case 0x69: case 0x6a: case 0x6b: // ADDI
+ case 0x6c: case 0x6d: case 0x6e: case 0x6f: // ADDSI
if (!DASM_N_VALUE(op))
{
- util::stream_format(stream, "ADDSI %s, CZ", dest);
+ util::stream_format(stream, "%-7s %s, CZ", (op_num & 0x4) ? "ADDSI" : "ADDI", dest);
}
else
{
- util::stream_format(stream, "ADDSI %s, $%x", dest, imm);
+ const uint32_t imm = Rimm_format(dest, op, pc, opcodes, 0);
+ util::stream_format(stream, "%-7s %s, $%x", (op_num & 0x4) ? "ADDSI" : "ADDI", dest, imm);
if (!dest_bit && (dest_code == PC_REGISTER))
util::stream_format(stream, " ; $%x", uint32_t(pc + size + imm));
}
-
break;
- }
// CMPBI
case 0x70: case 0x71: case 0x72: case 0x73:
- {
- uint32_t imm = Rimm_format(dest, op, pc, opcodes, 0);
-
if (!DASM_N_VALUE(op))
{
util::stream_format(stream, "CMPBI %s, ANYBZ", dest);
}
else
{
+ uint32_t imm = Rimm_format(dest, op, pc, opcodes, 0);
if (DASM_N_VALUE(op) == 31)
imm = 0x7fffffff; //bit 31 = 0, others = 1
util::stream_format(stream, "CMPBI %s, $%x", dest, imm);
}
-
break;
- }
// ANDNI
case 0x74: case 0x75: case 0x76: case 0x77:
- {
- uint32_t imm = Rimm_format(dest, op, pc, opcodes, 0);
-
- if (DASM_N_VALUE(op) == 31)
- imm = 0x7fffffff; //bit 31 = 0, others = 1
-
- util::stream_format(stream, "ANDNI %s, $%x", dest, imm);
- if (!dest_bit && (dest_code == PC_REGISTER))
- util::stream_format(stream, " ; $%x", uint32_t((pc + size) & ~imm));
+ {
+ uint32_t imm = Rimm_format(dest, op, pc, opcodes, 0);
+ if (DASM_N_VALUE(op) == 31)
+ imm = 0x7fffffff; //bit 31 = 0, others = 1
+ util::stream_format(stream, "ANDNI %s, $%x", dest, imm);
+ if (!dest_bit && (dest_code == PC_REGISTER))
+ util::stream_format(stream, " ; $%x", uint32_t((pc + size) & ~imm));
+ }
break;
- }
// ORI
case 0x78: case 0x79: case 0x7a: case 0x7b:
- {
- uint32_t imm = Rimm_format(dest, op, pc, opcodes, 0);
-
- util::stream_format(stream, "ORI %s, $%x", dest, imm);
- if (!dest_bit && (dest_code == PC_REGISTER))
- util::stream_format(stream, " ; $%x", uint32_t((pc + size) | imm));
+ {
+ const uint32_t imm = Rimm_format(dest, op, pc, opcodes, 0);
+ util::stream_format(stream, "ORI %s, $%x", dest, imm);
+ if (!dest_bit && (dest_code == PC_REGISTER))
+ util::stream_format(stream, " ; $%x", uint32_t((pc + size) | imm));
+ }
break;
- }
// XORI
case 0x7c: case 0x7d: case 0x7e: case 0x7f:
- {
- uint32_t imm = Rimm_format(dest, op, pc, opcodes, 0);
-
- util::stream_format(stream, "XORI %s, $%x", dest, imm);
- if (!dest_bit && (dest_code == PC_REGISTER))
- util::stream_format(stream, " ; $%x", uint32_t((pc + size) ^ imm));
+ {
+ const uint32_t imm = Rimm_format(dest, op, pc, opcodes, 0);
+ util::stream_format(stream, "XORI %s, $%x", dest, imm);
+ if (!dest_bit && (dest_code == PC_REGISTER))
+ util::stream_format(stream, " ; $%x", uint32_t((pc + size) ^ imm));
+ }
break;
- }
-
- // SHRDI
- // SARDI
- case 0x80: case 0x81:
- case 0x84: case 0x85:
- {
- uint8_t n = Ln_format(dest, op);
-
- util::stream_format(stream, "S%cRDI %s, $%x", (op_num & 0x4) ? 'A' : 'H', dest, n);
+ case 0x80: case 0x81: // SHRDI
+ case 0x84: case 0x85: // SARDI
+ {
+ const uint8_t n = Ln_format(dest, op);
+ util::stream_format(stream, "S%cRDI %s, $%x", (op_num & 0x4) ? 'A' : 'H', dest, n);
+ }
break;
- }
-
- case 0x82: // SHRD
- case 0x83: // SHR
- case 0x86: // SARD
- case 0x87: // SAR
+ case 0x82: // SHRD
+ case 0x83: // SHR
+ case 0x86: // SARD
+ case 0x87: // SAR
LL_format(source, dest, op);
util::stream_format(stream, "S%cR%c %s, %s",
(op_num & 0x4) ? 'A' : 'H',
(op_num & 0x1) ? ' ' : 'D',
dest,
source);
-
break;
// SHLDI
case 0x88: case 0x89:
- {
- uint8_t n = Ln_format(dest, op);
-
- util::stream_format(stream, "SHLDI %s, $%x", dest, n);
-
+ {
+ const uint8_t n = Ln_format(dest, op);
+ util::stream_format(stream, "SHLDI %s, $%x", dest, n);
+ }
break;
- }
-
- // SHLD
- // SHL
- case 0x8a:
- case 0x8b:
+ case 0x8a: // SHLD
+ case 0x8b: // SHL
LL_format(source, dest, op);
util::stream_format(stream, "SHL%c %s, %s", (op_num & 0x1) ? ' ' : 'D', dest, source);
-
break;
// RESERVED
case 0x8c: case 0x8d:
case 0xac: case 0xad: case 0xae: case 0xaf:
-
- util::stream_format(stream, "Reserved");
-
+ util::stream_format(stream, "D.HU $%04x", op);
break;
// TESTLZ
case 0x8e:
-
LL_format(source, dest, op);
util::stream_format(stream, "TESTLZ %s, %s", dest, source);
-
break;
// ROL
case 0x8f:
-
LL_format(source, dest, op);
util::stream_format(stream, "ROL %s, %s", dest, source);
-
break;
- // LDxx.D/A/IOD/IOA
- // STxx.D/A/IOD/IOA
- case 0x90: case 0x91: case 0x92: case 0x93:
- case 0x98: case 0x99: case 0x9a: case 0x9b:
- {
- const uint16_t next_op = opcodes.r16(pc + 2);
- const uint32_t dis = RRdis_format(source, dest, op, next_op, pc, opcodes);
-
- if (size == 2)
- size = 4;
+ case 0x90: case 0x91: case 0x92: case 0x93: // LDxx.D/A/IOD/IOA
+ case 0x98: case 0x99: case 0x9a: case 0x9b: // STxx.D/A/IOD/IOA
+ {
+ const uint16_t next_op = opcodes.r16(pc + 2);
+ const uint32_t dis = RRdis_format(source, dest, op, next_op, pc, opcodes);
- if ((op_num & 0x8) && !source_bit && (source_code == SR_REGISTER))
- source = "0";
+ if (size == 2)
+ size = 4;
- if (!dest_bit && (dest_code == SR_REGISTER))
- dest = "0";
+ if ((op_num & 0x8) && !source_bit && (source_code == SR_REGISTER))
+ source = "0";
- const std::string_view inst = (op_num & 0x8) ? "ST" : "LD";
- const char mode = (!dest_bit && (dest_code == SR_REGISTER)) ? 'A' : 'D';
+ if (!dest_bit && (dest_code == SR_REGISTER))
+ dest = "0";
- switch (DD(next_op))
- {
- case 0:
- // LD/STBS.D/A
- util::stream_format(stream, "%sBS.%c %s, %s, $%x", inst, mode, dest, source, dis);
- if (!dest_bit && (dest_code == PC_REGISTER))
- util::stream_format(stream, " ; $%x", uint32_t(pc + size + dis));
- break;
+ const std::string_view inst = (op_num & 0x8) ? "ST" : "LD";
+ const char mode = (!dest_bit && (dest_code == SR_REGISTER)) ? 'A' : 'D';
- case 1:
- // LD/STBU.D/A
- util::stream_format(stream, "%sBU.%c %s, %s, $%x", inst, mode, dest, source, dis);
- if (!dest_bit && (dest_code == PC_REGISTER))
- util::stream_format(stream, " ; $%x", uint32_t(pc + size + dis));
- break;
-
- case 2:
- // LD/STHU.D/A
- // LD/STHS.D/A
- util::stream_format(stream, "%sH%c.%c %s, %s, $%x", inst, (dis & 1) ? 'S' : 'U', mode, dest, source, dis & ~1);
- if (!dest_bit && (dest_code == PC_REGISTER))
- util::stream_format(stream, " ; $%x", uint32_t(pc + size + (dis & ~1)) & ~1);
- break;
-
- case 3:
- if (dis & 2)
- {
- // LD/STW.IOD/A
- // LD/STD.IOD/A
- util::stream_format(stream, "%s%c.IO%c %s, %s, $%x", inst, (dis & 1) ? 'D' : 'W', mode, dest, source, dis & ~3);
- }
- else
- {
- // LD/STW.D/A
- // LD/STD.D/A
- util::stream_format(stream, "%s%c.%c %s, %s, $%x", inst, (dis & 1) ? 'D' : 'W', mode, dest, source, dis & ~3);
- }
- if (!dest_bit && (dest_code == PC_REGISTER))
- util::stream_format(stream, " ; $%x", uint32_t(pc + size + (dis & ~3)) & ~3);
- break;
+ switch (DD(next_op))
+ {
+ case 0:
+ // LD/STBS.D/A
+ util::stream_format(stream, "%sBS.%c %s, %s, $%x", inst, mode, dest, source, dis);
+ if (!dest_bit && (dest_code == PC_REGISTER))
+ util::stream_format(stream, " ; $%x", uint32_t(pc + size + dis));
+ break;
+
+ case 1:
+ // LD/STBU.D/A
+ util::stream_format(stream, "%sBU.%c %s, %s, $%x", inst, mode, dest, source, dis);
+ if (!dest_bit && (dest_code == PC_REGISTER))
+ util::stream_format(stream, " ; $%x", uint32_t(pc + size + dis));
+ break;
+
+ case 2:
+ // LD/STHU.D/A
+ // LD/STHS.D/A
+ util::stream_format(stream, "%sH%c.%c %s, %s, $%x", inst, (dis & 1) ? 'S' : 'U', mode, dest, source, dis & ~1);
+ if (!dest_bit && (dest_code == PC_REGISTER))
+ util::stream_format(stream, " ; $%x", uint32_t(pc + size + (dis & ~1)) & ~1);
+ break;
+
+ case 3:
+ if (dis & 2)
+ {
+ // LD/STW.IOD/A
+ // LD/STD.IOD/A
+ util::stream_format(stream, "%s%c.IO%c %s, %s, $%x", inst, (dis & 1) ? 'D' : 'W', mode, dest, source, dis & ~3);
+ }
+ else
+ {
+ // LD/STW.D/A
+ // LD/STD.D/A
+ util::stream_format(stream, "%s%c.%c %s, %s, $%x", inst, (dis & 1) ? 'D' : 'W', mode, dest, source, dis & ~3);
+ }
+ if (!dest_bit && (dest_code == PC_REGISTER))
+ util::stream_format(stream, " ; $%x", uint32_t(pc + size + (dis & ~3)) & ~3);
+ break;
+ }
}
break;
- }
- // LDxx.N/S
- // STxx.N/S
- case 0x94: case 0x95: case 0x96: case 0x97:
- case 0x9c: case 0x9d: case 0x9e: case 0x9f:
- {
- const uint16_t next_op = opcodes.r16(pc + 2);
- const uint32_t dis = RRdis_format(source, dest, op, next_op, pc, opcodes);
-
- if (size == 2)
- size = 4;
-
- if (!dest_bit && ((dest_code == PC_REGISTER) || (dest_code == SR_REGISTER)))
+ case 0x94: case 0x95: case 0x96: case 0x97: // LDxx.N/S
+ case 0x9c: case 0x9d: case 0x9e: case 0x9f: // STxx.N/S
{
- util::stream_format(stream, "Reserved");
- break;
- }
+ const uint16_t next_op = opcodes.r16(pc + 2);
+ const uint32_t dis = RRdis_format(source, dest, op, next_op, pc, opcodes);
- if ((op_num & 0x8) && !source_bit && (source_code == SR_REGISTER))
- source = "0";
+ if (size == 2)
+ size = 4;
- const std::string_view inst = (op_num & 0x8) ? "ST" : "LD";
-
- switch (DD(next_op))
- {
- case 0:
- // LD/STBS.N
- util::stream_format(stream, "%sBS.N %s, %s, $%x", inst, dest, source, dis);
+ if (!dest_bit && ((dest_code == PC_REGISTER) || (dest_code == SR_REGISTER)))
+ {
+ util::stream_format(stream, "Reserved");
break;
+ }
- case 1:
- // LD/STBU.N
- util::stream_format(stream, "%sBU.N %s, %s, $%x", inst, dest, source, dis);
- break;
+ if ((op_num & 0x8) && !source_bit && (source_code == SR_REGISTER))
+ source = "0";
- case 2:
- // LD/STHU.N
- // LD/STHS.N
- util::stream_format(stream, "%sH%c.N %s, %s, $%x", inst, (dis & 1) ? 'S' : 'U', dest, source, dis & ~1);
- break;
+ const std::string_view inst = (op_num & 0x8) ? "ST" : "LD";
- case 3:
- if ((dis & 3) == 3)
- {
- // LD/STW.S
- util::stream_format(stream, "%sW.S %s, %s, $%x", inst, dest, source, dis & ~3);
- }
- else if ((dis & 3) == 2)
- {
- // Reserved
- util::stream_format(stream, "Reserved");
- }
- else
- {
- // LD/STW.N
- // LD/STD.N
- util::stream_format(stream, "%s%c.N %s, %s, $%x", inst, (dis & 1) ? 'D' : 'W', dest, source, dis & ~3);
- }
- break;
+ switch (DD(next_op))
+ {
+ case 0:
+ // LD/STBS.N
+ util::stream_format(stream, "%sBS.N %s, %s, $%x", inst, dest, source, dis);
+ break;
+
+ case 1:
+ // LD/STBU.N
+ util::stream_format(stream, "%sBU.N %s, %s, $%x", inst, dest, source, dis);
+ break;
+
+ case 2:
+ // LD/STHU.N
+ // LD/STHS.N
+ util::stream_format(stream, "%sH%c.N %s, %s, $%x", inst, (dis & 1) ? 'S' : 'U', dest, source, dis & ~1);
+ break;
+
+ case 3:
+ if ((dis & 3) == 3)
+ {
+ // LD/STW.S
+ util::stream_format(stream, "%sW.S %s, %s, $%x", inst, dest, source, dis & ~3);
+ }
+ else if ((dis & 3) == 2)
+ {
+ // Reserved
+ util::stream_format(stream, "Reserved");
+ }
+ else
+ {
+ // LD/STW.N
+ // LD/STD.N
+ util::stream_format(stream, "%s%c.N %s, %s, $%x", inst, (dis & 1) ? 'D' : 'W', dest, source, dis & ~3);
+ }
+ break;
+ }
}
break;
- }
-
- // SHRI
- // SARI
- case 0xa0: case 0xa1: case 0xa2: case 0xa3:
- case 0xa4: case 0xa5: case 0xa6: case 0xa7:
- {
- uint8_t n = Rn_format(dest, op);
-
- util::stream_format(stream, "S%cRI %s, $%x", (op_num & 0x4) ? 'A' : 'H', dest, n);
+ case 0xa0: case 0xa1: case 0xa2: case 0xa3: // SHRI
+ case 0xa4: case 0xa5: case 0xa6: case 0xa7: // SARI
+ {
+ const uint8_t n = Rn_format(dest, op);
+ util::stream_format(stream, "S%cRI %s, $%x", (op_num & 0x4) ? 'A' : 'H', dest, n);
+ }
break;
- }
// SHLI
case 0xa8: case 0xa9: case 0xaa: case 0xab:
- {
- uint8_t n = Rn_format(dest, op);
-
- util::stream_format(stream, "SHLI %s, $%x", dest, n);
-
+ {
+ const uint8_t n = Rn_format(dest, op);
+ util::stream_format(stream, "SHLI %s, $%x", dest, n);
+ }
break;
- }
-
- // MULU
- // MULS
- case 0xb0: case 0xb1: case 0xb2: case 0xb3:
- case 0xb4: case 0xb5: case 0xb6: case 0xb7:
+ case 0xb0: case 0xb1: case 0xb2: case 0xb3: // MULU
+ case 0xb4: case 0xb5: case 0xb6: case 0xb7: // MULS
RR_format(source, dest, op, 0);
-
util::stream_format(stream, "MUL%c %s, %s", (op_num & 0x4) ? 'S' : 'U', dest, source);
-
break;
// SETxx - SETADR - FETCH
case 0xb8: case 0xb9: case 0xba: case 0xbb:
- {
- uint8_t n = Rn_format(dest, op);
-
- if( dest_code == PC_REGISTER && !dest_bit )
{
- util::stream_format(stream, "Illegal PC: $%x OP: $%x", pc, op);
- }
- else if( dest_code == SR_REGISTER && !dest_bit )
- {
- util::stream_format(stream, "FETCH $%x", (n / 2) + 1);
- }
- else
- {
- util::stream_format(stream, "%-7s %s", SETxx[n], dest);
- }
+ const uint8_t n = Rn_format(dest, op);
+ if (!dest_bit && (dest_code == PC_REGISTER))
+ {
+ // SETxx with PC as destination is reserved for future use
+ util::stream_format(stream, "D.HU $%04x", op);
+ }
+ else if (!dest_bit && (dest_code == SR_REGISTER))
+ {
+ util::stream_format(stream, "FETCH $%x", (n / 2) + 1);
+ }
+ else
+ {
+ char const *const inst = SETxx[n];
+ if (inst)
+ util::stream_format(stream, "%-7s %s", inst, dest);
+ else
+ util::stream_format(stream, "D.HU $%04x", op);
+ }
+ }
break;
- }
// MUL
case 0xbc: case 0xbd: case 0xbe: case 0xbf:
-
RR_format(source, dest, op, 0);
util::stream_format(stream, "MUL %s, %s", dest, source);
-
break;
- case 0xc0: // FADD
- case 0xc1: // FADDD
- case 0xc2: // FSUB
- case 0xc3: // FSUBD
- case 0xc4: // FMUL
- case 0xc5: // FMULD
- case 0xc6: // FDIV
- case 0xc7: // FDIVD
- case 0xc8: // FCMP
- case 0xc9: // FCMPD
- case 0xca: // FCMPU
- case 0xcb: // FCMPUD
- case 0xcc: // FCVT
- case 0xcd: // FCVTD
-
+ case 0xc0: // FADD
+ case 0xc1: // FADDD
+ case 0xc2: // FSUB
+ case 0xc3: // FSUBD
+ case 0xc4: // FMUL
+ case 0xc5: // FMULD
+ case 0xc6: // FDIV
+ case 0xc7: // FDIVD
+ case 0xc8: // FCMP
+ case 0xc9: // FCMPD
+ case 0xca: // FCMPU
+ case 0xcb: // FCMPUD
+ case 0xcc: // FCVT
+ case 0xcd: // FCVTD
LL_format(source, dest, op);
util::stream_format(stream, "%-7s %s, %s", Fxxx[op_num & 0xf], dest, source);
-
break;
// EXTEND
case 0xce:
- {
- uint16_t extended_op;
-
- LL_format(source, dest, op);
+ {
+ LL_format(source, dest, op);
- pc += 2;
- extended_op = opcodes.r16(pc);
+ pc += 2;
+ const uint16_t extended_op = opcodes.r16(pc);
- size = 4;
+ size = 4;
- switch( extended_op )
- {
- case 0x100:
- case EMUL:
- util::stream_format(stream, "EMUL %s, %s", dest, source);
- break;
-
- case EMULU:
- util::stream_format(stream, "EMULU %s, %s", dest, source);
- break;
-
- case EMULS:
- util::stream_format(stream, "EMULS %s, %s", dest, source);
- break;
-
- case EMAC:
- util::stream_format(stream, "EMAC %s, %s", dest, source);
- break;
-
- case EMACD:
- util::stream_format(stream, "EMACD %s, %s", dest, source);
- break;
-
- case EMSUB:
- util::stream_format(stream, "EMSUB %s, %s", dest, source);
- break;
-
- case EMSUBD:
- util::stream_format(stream, "EMSUBD %s, %s", dest, source);
- break;
-
- case EHMAC:
- util::stream_format(stream, "EHMAC %s, %s", dest, source);
- break;
-
- case EHMACD:
- util::stream_format(stream, "EHMACD %s, %s", dest, source);
- break;
-
- case EHCMULD:
- util::stream_format(stream, "EHCMULD %s, %s", dest, source);
- break;
-
- case EHCMACD:
- util::stream_format(stream, "EHCMACD %s, %s", dest, source);
- break;
-
- case EHCSUMD:
- util::stream_format(stream, "EHCSUMD %s, %s", dest, source);
- break;
-
- case EHCFFTD:
- util::stream_format(stream, "EHCFFTD %s, %s", dest, source);
- break;
-
- case EHCFFTSD:
- util::stream_format(stream, "EHCFFTSD %s, %s", dest, source);
- break;
-
- default:
- util::stream_format(stream, "Ext. OP $%X @ %X", extended_op, pc);
- osd_printf_verbose("Illegal Extended Opcode: %X @ %X\n", extended_op, pc);
- break;
+ switch (extended_op)
+ {
+ case 0x100:
+ case EMUL:
+ util::stream_format(stream, "EMUL %s, %s", dest, source);
+ break;
+
+ case EMULU:
+ util::stream_format(stream, "EMULU %s, %s", dest, source);
+ break;
+
+ case EMULS:
+ util::stream_format(stream, "EMULS %s, %s", dest, source);
+ break;
+
+ case EMAC:
+ util::stream_format(stream, "EMAC %s, %s", dest, source);
+ break;
+
+ case EMACD:
+ util::stream_format(stream, "EMACD %s, %s", dest, source);
+ break;
+
+ case EMSUB:
+ util::stream_format(stream, "EMSUB %s, %s", dest, source);
+ break;
+
+ case EMSUBD:
+ util::stream_format(stream, "EMSUBD %s, %s", dest, source);
+ break;
+
+ case EHMAC:
+ util::stream_format(stream, "EHMAC %s, %s", dest, source);
+ break;
+
+ case EHMACD:
+ util::stream_format(stream, "EHMACD %s, %s", dest, source);
+ break;
+
+ case EHCMULD:
+ util::stream_format(stream, "EHCMULD %s, %s", dest, source);
+ break;
+
+ case EHCMACD:
+ util::stream_format(stream, "EHCMACD %s, %s", dest, source);
+ break;
+
+ case EHCSUMD:
+ util::stream_format(stream, "EHCSUMD %s, %s", dest, source);
+ break;
+
+ case EHCFFTD:
+ util::stream_format(stream, "EHCFFTD %s, %s", dest, source);
+ break;
+
+ case EHCFFTSD:
+ util::stream_format(stream, "EHCFFTSD %s, %s", dest, source);
+ break;
+
+ default:
+ util::stream_format(stream, "Ext. OP $%X @ %X", extended_op, pc);
+ osd_printf_verbose("Illegal Extended Opcode: %X @ %X\n", extended_op, pc);
+ break;
+ }
}
-
break;
- }
// DO
case 0xcf:
-
LL_format(source, dest, op);
util::stream_format(stream, "DO %s, %s", dest, source);
-
break;
- case 0xd0: case 0xd1: // LDW.R
- case 0xd2: case 0xd3: // LDD.R
- case 0xd4: case 0xd5: // LDW.P
- case 0xd6: case 0xd7: // LDD.P
- case 0xd8: case 0xd9: // STW.R
- case 0xda: case 0xdb: // STD.R
- case 0xdc: case 0xdd: // STW.P
- case 0xde: case 0xdf: // STD.P
-
+ case 0xd0: case 0xd1: // LDW.R
+ case 0xd2: case 0xd3: // LDD.R
+ case 0xd4: case 0xd5: // LDW.P
+ case 0xd6: case 0xd7: // LDD.P
+ case 0xd8: case 0xd9: // STW.R
+ case 0xda: case 0xdb: // STD.R
+ case 0xdc: case 0xdd: // STW.P
+ case 0xde: case 0xdf: // STD.P
LR_format(source, dest, op);
util::stream_format(stream, "%s%c.%c %s, %s",
(op_num & 0x8) ? "ST" : "LD",
@@ -1142,98 +1023,81 @@ offs_t hyperstone_disassembler::disassemble(std::ostream &stream, offs_t pc, con
(op_num & 0x4) ? 'P' : 'R',
dest,
((op_num & 0x8) && !source_bit && (source_code == SR_REGISTER)) ? "0" : source);
-
break;
- case 0xe0: // DBV
- case 0xe1: // DBNV
- case 0xe2: // DBE
- case 0xe3: // DBNE
- case 0xe4: // DBC
- case 0xe5: // DBNC
- case 0xe6: // DBSE
- case 0xe7: // DBHT
- case 0xe8: // DBN
- case 0xe9: // DBNN
- case 0xea: // DBLE
- case 0xeb: // DBGT
- case 0xec: // DBR
- {
- int32_t rel = PCrel_format(op, pc, opcodes) + 2;
-
- util::stream_format(stream, "D%-6s $%x", Bxx[op_num & 0xf], rel);
- if (op_num != 0xec)
+ case 0xe0: // DBV
+ case 0xe1: // DBNV
+ case 0xe2: // DBE
+ case 0xe3: // DBNE
+ case 0xe4: // DBC
+ case 0xe5: // DBNC
+ case 0xe6: // DBSE
+ case 0xe7: // DBHT
+ case 0xe8: // DBN
+ case 0xe9: // DBNN
+ case 0xea: // DBLE
+ case 0xeb: // DBGT
+ case 0xec: // DBR
{
- flags = STEP_COND | step_over_extra(1);
+ const int32_t rel = PCrel_format(op, pc, opcodes) + 2;
+ util::stream_format(stream, "D%-6s $%x", Bxx[op_num & 0xf], rel);
+ if (op_num != 0xec)
+ flags = STEP_COND | step_over_extra(1);
}
-
break;
- }
// FRAME
case 0xed:
LL_format(source, dest, op);
-
util::stream_format(stream, "FRAME %s, %s", dest, source);
-
break;
// CALL
case 0xee: case 0xef:
- {
- uint32_t const_val = LRconst_format(source, dest, op, pc, opcodes);
-
- util::stream_format(stream, "CALL %s, %s, $%x", dest, (!source_bit && (source_code == SR_REGISTER)) ? "0" : source, const_val);
- if (!source_bit && (source_code == PC_REGISTER))
- util::stream_format(stream, " ; $%x", uint32_t(pc + size + const_val));
- flags = STEP_OVER;
+ {
+ const uint32_t const_val = LRconst_format(source, dest, op, pc, opcodes);
+ util::stream_format(stream, "CALL %s, %s, $%x", dest, (!source_bit && (source_code == SR_REGISTER)) ? "0" : source, const_val);
+ if (!source_bit && (source_code == PC_REGISTER))
+ util::stream_format(stream, " ; $%x", uint32_t(pc + size + const_val));
+ flags = STEP_OVER;
+ }
break;
- }
-
- case 0xf0: // BV
- case 0xf1: // BNV
- case 0xf2: // BE
- case 0xf3: // BNE
- case 0xf4: // BC
- case 0xf5: // BNC
- case 0xf6: // BSE
- case 0xf7: // BHT
- case 0xf8: // BN
- case 0xf9: // BNN
- case 0xfa: // BLE
- case 0xfb: // BGT
- case 0xfc: // BR
- {
- int32_t rel = PCrel_format(op, pc, opcodes) + 2;
- util::stream_format(stream, "%-7s $%x", Bxx[op_num & 0xf], rel);
- if (op_num != 0xfc)
+ case 0xf0: // BV
+ case 0xf1: // BNV
+ case 0xf2: // BE
+ case 0xf3: // BNE
+ case 0xf4: // BC
+ case 0xf5: // BNC
+ case 0xf6: // BSE
+ case 0xf7: // BHT
+ case 0xf8: // BN
+ case 0xf9: // BNN
+ case 0xfa: // BLE
+ case 0xfb: // BGT
+ case 0xfc: // BR
{
- flags = STEP_COND;
+ const int32_t rel = PCrel_format(op, pc, opcodes) + 2;
+ util::stream_format(stream, "%-7s $%x", Bxx[op_num & 0xf], rel);
+ if (op_num != 0xfc)
+ flags = STEP_COND;
}
-
break;
- }
// TRAPxx - TRAP
case 0xfd: case 0xfe: case 0xff:
- {
- uint8_t code = ((op & 0x300) >> 6) | (op & 0x03);
- uint8_t trapno = (op & 0xfc) >> 2;
-
- util::stream_format(stream, "%-7s %d", TRAPxx[code], trapno);
- if (code == TRAP)
{
- flags = STEP_OVER;
- }
- else
- {
- flags = STEP_OVER | STEP_COND;
- }
+ const uint8_t code = ((op & 0x300) >> 6) | (op & 0x03);
+ const uint8_t trapno = (op & 0xfc) >> 2;
+ util::stream_format(stream, "%-7s %d", TRAPxx[code], trapno);
+ if (code == TRAP)
+ flags = STEP_OVER;
+ else
+ flags = STEP_OVER | STEP_COND;
+ }
break;
- }
}
return size | flags | SUPPORTED;