Merge pull request #1593 from npwoods/dasmstream_score

Changed the score disassembler to use 'std::ostream &' internally
This commit is contained in:
R. Belmont 2016-10-29 20:59:02 -04:00 committed by GitHub
commit 9fc67cd17c
2 changed files with 125 additions and 120 deletions

View File

@ -55,7 +55,14 @@ protected:
// device_disasm_interface overrides
virtual uint32_t disasm_min_opcode_bytes() const override { return 2; }
virtual uint32_t disasm_max_opcode_bytes() const override { return 4; }
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override
{
std::ostringstream stream;
offs_t result = disasm_disassemble(stream, pc, oprom, opram, options);
std::string stream_str = stream.str();
strcpy(buffer, stream_str.c_str());
return result;
}
private:
// helpers
@ -72,9 +79,9 @@ private:
void check_irq();
void gen_exception(int cause, uint32_t param = 0);
offs_t disasm(char *buffer, offs_t pc, uint32_t opcode);
char *disasm32(char *buffer, offs_t pc, uint32_t opcode);
char *disasm16(char *buffer, offs_t pc, uint16_t opcode);
offs_t disasm(std::ostream &stream, offs_t pc, uint32_t opcode);
void disasm32(std::ostream &stream, offs_t pc, uint32_t opcode);
void disasm16(std::ostream &stream, offs_t pc, uint16_t opcode);
void unemulated_op(const char * op);
// 32-bit opcodes
@ -143,6 +150,8 @@ private:
static const char *const m_i1a_op[8];
static const char *const m_i1b_op[8];
static const char *const m_cr_op[2];
offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options);
};
extern const device_type SCORE7;

View File

@ -23,7 +23,7 @@ const char *const score7_cpu_device::m_i1b_op[8] = { "lwp", "lhp", "", "lbup",
const char *const score7_cpu_device::m_cr_op[2] = { "mtcr", "mfcr" };
char *score7_cpu_device::disasm32(char *buffer, offs_t pc, uint32_t opcode)
void score7_cpu_device::disasm32(std::ostream &stream, offs_t pc, uint32_t opcode)
{
switch((opcode >> 25) & 0x1f)
{
@ -37,68 +37,68 @@ char *score7_cpu_device::disasm32(char *buffer, offs_t pc, uint32_t opcode)
switch(GET_S_FUNC6(opcode))
{
case 0x00: buffer += sprintf(buffer, "nop"); break;
case 0x01: buffer += sprintf(buffer, "syscall 0x%04x", (rd<<10) | (ra << 5) | rb); break;
case 0x02: buffer += sprintf(buffer, "trap%s 0x%02x", m_cond[rb & 0x0f], ra); break;
case 0x03: buffer += sprintf(buffer, "sdbbp 0x%02x", ra); break;
case 0x04: buffer += sprintf(buffer, "br%s%s r%d", m_cond[rb & 0x0f], lk, ra); break;
case 0x05: buffer += sprintf(buffer, "pflush"); break;
case 0x08: buffer += sprintf(buffer, "add%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x09: buffer += sprintf(buffer, "addc%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x0a: buffer += sprintf(buffer, "sub%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x0b: buffer += sprintf(buffer, "subc%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x0c: buffer += sprintf(buffer, "cmp%s%s r%d, r%d", m_tcs[rd & 3], cu, ra, rb); break;
case 0x0d: buffer += sprintf(buffer, "cmpz%s%s r%d, r%d", m_tcs[rd & 3], cu, ra, rb); break;
case 0x0f: buffer += sprintf(buffer, "neg%s r%d, r%d", cu, rd, rb); break;
case 0x10: buffer += sprintf(buffer, "and%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x11: buffer += sprintf(buffer, "or%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x12: buffer += sprintf(buffer, "not%s r%d, r%d", cu, rd, ra); break;
case 0x13: buffer += sprintf(buffer, "xor%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x14: buffer += sprintf(buffer, "bitclr%s r%d, %d", cu, ra, rb); break;
case 0x15: buffer += sprintf(buffer, "bitset%s r%d, %d", cu, ra, rb); break;
case 0x16: buffer += sprintf(buffer, "bittst%s r%d, %d", cu, ra, rb); break;
case 0x17: buffer += sprintf(buffer, "bittgl%s r%d, %d", cu, ra, rb); break;
case 0x18: buffer += sprintf(buffer, "sll%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x1a: buffer += sprintf(buffer, "srl%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x1b: buffer += sprintf(buffer, "sra%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x1c: buffer += sprintf(buffer, "ror%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x1d: buffer += sprintf(buffer, "rorc%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x1e: buffer += sprintf(buffer, "rol%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x1f: buffer += sprintf(buffer, "rolc%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x20: buffer += sprintf(buffer, "mul r%d, r%d", ra, rb); break;
case 0x21: buffer += sprintf(buffer, "mulu r%d, r%d", ra, rb); break;
case 0x22: buffer += sprintf(buffer, "div r%d, r%d", ra, rb); break;
case 0x23: buffer += sprintf(buffer, "divu r%d, r%d", ra, rb); break;
case 0x00: util::stream_format(stream, "nop"); break;
case 0x01: util::stream_format(stream, "syscall 0x%04x", (rd<<10) | (ra << 5) | rb); break;
case 0x02: util::stream_format(stream, "trap%s 0x%02x", m_cond[rb & 0x0f], ra); break;
case 0x03: util::stream_format(stream, "sdbbp 0x%02x", ra); break;
case 0x04: util::stream_format(stream, "br%s%s r%d", m_cond[rb & 0x0f], lk, ra); break;
case 0x05: util::stream_format(stream, "pflush"); break;
case 0x08: util::stream_format(stream, "add%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x09: util::stream_format(stream, "addc%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x0a: util::stream_format(stream, "sub%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x0b: util::stream_format(stream, "subc%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x0c: util::stream_format(stream, "cmp%s%s r%d, r%d", m_tcs[rd & 3], cu, ra, rb); break;
case 0x0d: util::stream_format(stream, "cmpz%s%s r%d, r%d", m_tcs[rd & 3], cu, ra, rb); break;
case 0x0f: util::stream_format(stream, "neg%s r%d, r%d", cu, rd, rb); break;
case 0x10: util::stream_format(stream, "and%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x11: util::stream_format(stream, "or%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x12: util::stream_format(stream, "not%s r%d, r%d", cu, rd, ra); break;
case 0x13: util::stream_format(stream, "xor%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x14: util::stream_format(stream, "bitclr%s r%d, %d", cu, ra, rb); break;
case 0x15: util::stream_format(stream, "bitset%s r%d, %d", cu, ra, rb); break;
case 0x16: util::stream_format(stream, "bittst%s r%d, %d", cu, ra, rb); break;
case 0x17: util::stream_format(stream, "bittgl%s r%d, %d", cu, ra, rb); break;
case 0x18: util::stream_format(stream, "sll%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x1a: util::stream_format(stream, "srl%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x1b: util::stream_format(stream, "sra%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x1c: util::stream_format(stream, "ror%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x1d: util::stream_format(stream, "rorc%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x1e: util::stream_format(stream, "rol%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x1f: util::stream_format(stream, "rolc%s r%d, r%d, r%d", cu, rd, ra, rb); break;
case 0x20: util::stream_format(stream, "mul r%d, r%d", ra, rb); break;
case 0x21: util::stream_format(stream, "mulu r%d, r%d", ra, rb); break;
case 0x22: util::stream_format(stream, "div r%d, r%d", ra, rb); break;
case 0x23: util::stream_format(stream, "divu r%d, r%d", ra, rb); break;
case 0x24:
buffer += sprintf(buffer, "mfce%s%s r%d", rb & 2 ? "h" : "", rb & 1 ? "l" : "", rd);
if ((rb & 3) == 3) buffer += sprintf(buffer, ", r%d", ra);
util::stream_format(stream, "mfce%s%s r%d", rb & 2 ? "h" : "", rb & 1 ? "l" : "", rd);
if ((rb & 3) == 3) util::stream_format(stream, ", r%d", ra);
break;
case 0x25:
buffer += sprintf(buffer, "mtce%s%s r%d", rb & 2 ? "h" : "", rb & 1 ? "l" : "", rd);
if ((rb & 3) == 3) buffer += sprintf(buffer, ", r%d", ra);
util::stream_format(stream, "mtce%s%s r%d", rb & 2 ? "h" : "", rb & 1 ? "l" : "", rd);
if ((rb & 3) == 3) util::stream_format(stream, ", r%d", ra);
break;
case 0x28: buffer += sprintf(buffer, "mfsr sr%d, r%d", rb, ra); break;
case 0x29: buffer += sprintf(buffer, "mtsr r%d, sr%d", ra, rb); break;
case 0x2a: buffer += sprintf(buffer, "t%s r%d", m_cond[rb & 0x0f], rb); break;
case 0x2b: buffer += sprintf(buffer, "mv%s r%d, r%d", m_cond[rb & 0x0f], rd, ra); break;
case 0x2c: buffer += sprintf(buffer, "extsb%s r%d, r%d", cu, rd, ra); break;
case 0x2d: buffer += sprintf(buffer, "extsh%s r%d, r%d", cu, rd, ra); break;
case 0x2e: buffer += sprintf(buffer, "extzb%s r%d, r%d", cu, rd, ra); break;
case 0x2f: buffer += sprintf(buffer, "extzh%s r%d, r%d", cu, rd, ra); break;
case 0x30: buffer += sprintf(buffer, "lcb [r%d]+", ra); break;
case 0x31: buffer += sprintf(buffer, "lcw r%d, [r%d]+", rd, ra); break;
case 0x33: buffer += sprintf(buffer, "lce r%d, [r%d]+", rd, ra); break;
case 0x34: buffer += sprintf(buffer, "scb r%d, [r%d]+", rd, ra); break;
case 0x35: buffer += sprintf(buffer, "scw r%d, [r%d]+", rd, ra); break;
case 0x37: buffer += sprintf(buffer, "sce [r%d]+", ra); break;
case 0x38: buffer += sprintf(buffer, "slli r%d, r%d, %d", rd, ra, rb); break;
case 0x3a: buffer += sprintf(buffer, "srli r%d, r%d, %d", rd, ra, rb); break;
case 0x3b: buffer += sprintf(buffer, "srai r%d, r%d, %d", rd, ra, rb); break;
case 0x3c: buffer += sprintf(buffer, "rori%s r%d, r%d, %d", cu, rd, ra, rb); break;
case 0x3d: buffer += sprintf(buffer, "roric%s r%d, r%d, %d", cu, rd, ra, rb); break;
case 0x3e: buffer += sprintf(buffer, "roli%s r%d, r%d, %d", cu, rd, ra, rb); break;
case 0x3f: buffer += sprintf(buffer, "rolic%s r%d, r%d, %d", cu, rd, ra, rb); break;
default: buffer += sprintf(buffer, "<undefined special-form 0x%02x>", GET_S_FUNC6(opcode));
case 0x28: util::stream_format(stream, "mfsr sr%d, r%d", rb, ra); break;
case 0x29: util::stream_format(stream, "mtsr r%d, sr%d", ra, rb); break;
case 0x2a: util::stream_format(stream, "t%s r%d", m_cond[rb & 0x0f], rb); break;
case 0x2b: util::stream_format(stream, "mv%s r%d, r%d", m_cond[rb & 0x0f], rd, ra); break;
case 0x2c: util::stream_format(stream, "extsb%s r%d, r%d", cu, rd, ra); break;
case 0x2d: util::stream_format(stream, "extsh%s r%d, r%d", cu, rd, ra); break;
case 0x2e: util::stream_format(stream, "extzb%s r%d, r%d", cu, rd, ra); break;
case 0x2f: util::stream_format(stream, "extzh%s r%d, r%d", cu, rd, ra); break;
case 0x30: util::stream_format(stream, "lcb [r%d]+", ra); break;
case 0x31: util::stream_format(stream, "lcw r%d, [r%d]+", rd, ra); break;
case 0x33: util::stream_format(stream, "lce r%d, [r%d]+", rd, ra); break;
case 0x34: util::stream_format(stream, "scb r%d, [r%d]+", rd, ra); break;
case 0x35: util::stream_format(stream, "scw r%d, [r%d]+", rd, ra); break;
case 0x37: util::stream_format(stream, "sce [r%d]+", ra); break;
case 0x38: util::stream_format(stream, "slli r%d, r%d, %d", rd, ra, rb); break;
case 0x3a: util::stream_format(stream, "srli r%d, r%d, %d", rd, ra, rb); break;
case 0x3b: util::stream_format(stream, "srai r%d, r%d, %d", rd, ra, rb); break;
case 0x3c: util::stream_format(stream, "rori%s r%d, r%d, %d", cu, rd, ra, rb); break;
case 0x3d: util::stream_format(stream, "roric%s r%d, r%d, %d", cu, rd, ra, rb); break;
case 0x3e: util::stream_format(stream, "roli%s r%d, r%d, %d", cu, rd, ra, rb); break;
case 0x3f: util::stream_format(stream, "rolic%s r%d, r%d, %d", cu, rd, ra, rb); break;
default: util::stream_format(stream, "<undefined special-form 0x%02x>", GET_S_FUNC6(opcode));
}
break;
}
@ -106,81 +106,79 @@ char *score7_cpu_device::disasm32(char *buffer, offs_t pc, uint32_t opcode)
switch(GET_I_FUNC3(opcode))
{
case 0x00:
buffer += sprintf(buffer, "%s%s r%d, %d", m_i1_op[GET_I_FUNC3(opcode)], GET_I_CU(opcode) ? ".c": "", GET_I_RD(opcode), sign_extend(GET_I_IMM16(opcode), 16));
util::stream_format(stream, "%s%s r%d, %d", m_i1_op[GET_I_FUNC3(opcode)], GET_I_CU(opcode) ? ".c": "", GET_I_RD(opcode), sign_extend(GET_I_IMM16(opcode), 16));
break;
case 0x02: case 0x04: case 0x05: case 0x06:
buffer += sprintf(buffer, "%s%s r%d, 0x%04x", m_i1_op[GET_I_FUNC3(opcode)], GET_I_CU(opcode) ? ".c": "", GET_I_RD(opcode), GET_I_IMM16(opcode));
util::stream_format(stream, "%s%s r%d, 0x%04x", m_i1_op[GET_I_FUNC3(opcode)], GET_I_CU(opcode) ? ".c": "", GET_I_RD(opcode), GET_I_IMM16(opcode));
break;
default:
buffer += sprintf(buffer, "<undefined i-form-1 0x%02x>", GET_I_FUNC3(opcode));
util::stream_format(stream, "<undefined i-form-1 0x%02x>", GET_I_FUNC3(opcode));
}
break;
case 0x02:
buffer += sprintf(buffer, "j%s 0x%08x", GET_J_LK(opcode) ? "l": "", (pc & 0xfc000000) | (GET_J_DISP24(opcode) << 1));
util::stream_format(stream, "j%s 0x%08x", GET_J_LK(opcode) ? "l": "", (pc & 0xfc000000) | (GET_J_DISP24(opcode) << 1));
break;
case 0x03: // RIX-form-1
buffer += sprintf(buffer, "%s r%d, [R%d, %d]+", m_rix1_op[GET_RIX_FUNC3(opcode)], GET_RIX_RD(opcode), GET_RIX_RA(opcode), sign_extend(GET_RIX_IMM12(opcode), 12));
util::stream_format(stream, "%s r%d, [R%d, %d]+", m_rix1_op[GET_RIX_FUNC3(opcode)], GET_RIX_RD(opcode), GET_RIX_RA(opcode), sign_extend(GET_RIX_IMM12(opcode), 12));
break;
case 0x04:
buffer += sprintf(buffer, "b%s%s 0x%08x", m_cond[GET_BC_BC(opcode) & 0x0f], GET_BC_LK(opcode) ? "l": "", pc + (sign_extend(GET_BC_DISP19(opcode), 19) << 1));
util::stream_format(stream, "b%s%s 0x%08x", m_cond[GET_BC_BC(opcode) & 0x0f], GET_BC_LK(opcode) ? "l": "", pc + (sign_extend(GET_BC_DISP19(opcode), 19) << 1));
break;
case 0x05: // I-form-2
switch(GET_I_FUNC3(opcode))
{
case 0x00: case 0x02:
case 0x04: case 0x05: case 0x06:
buffer += sprintf(buffer, "%s%s r%d, 0x%04x", m_i2_op[GET_I_FUNC3(opcode)], GET_I_CU(opcode) ? ".c": "", GET_I_RD(opcode), GET_I_IMM16(opcode));
util::stream_format(stream, "%s%s r%d, 0x%04x", m_i2_op[GET_I_FUNC3(opcode)], GET_I_CU(opcode) ? ".c": "", GET_I_RD(opcode), GET_I_IMM16(opcode));
break;
default:
buffer += sprintf(buffer, "<undefined i-form-2 0x%02x>", GET_I_FUNC3(opcode));
util::stream_format(stream, "<undefined i-form-2 0x%02x>", GET_I_FUNC3(opcode));
}
break;
case 0x06: // CR-form
switch(GET_CR_OP(opcode))
{
case 0x00: case 0x01:
buffer += sprintf(buffer, "%s r%d, cr%d", m_cr_op[GET_CR_OP(opcode)], GET_CR_RD(opcode), GET_CR_CR(opcode));
util::stream_format(stream, "%s r%d, cr%d", m_cr_op[GET_CR_OP(opcode)], GET_CR_RD(opcode), GET_CR_CR(opcode));
break;
case 0x84:
buffer += sprintf(buffer, "rte");
util::stream_format(stream, "rte");
break;
default:
if ((GET_CR_OP(opcode) & 0xc0) == 0)
buffer += sprintf(buffer, "<coprocessor instruction 0x%02x>", GET_CR_OP(opcode) & 0x07);
util::stream_format(stream, "<coprocessor instruction 0x%02x>", GET_CR_OP(opcode) & 0x07);
else
buffer += sprintf(buffer, "<undefined cr-form 0x%02x>", GET_S_FUNC6(opcode));
util::stream_format(stream, "<undefined cr-form 0x%02x>", GET_S_FUNC6(opcode));
}
break;
case 0x07: // RIX-form-2
buffer += sprintf(buffer, "%s r%d, [R%d]+, %d", m_rix2_op[GET_RIX_FUNC3(opcode)], GET_RIX_RD(opcode), GET_RIX_RA(opcode), sign_extend(GET_RIX_IMM12(opcode), 12));
util::stream_format(stream, "%s r%d, [R%d]+, %d", m_rix2_op[GET_RIX_FUNC3(opcode)], GET_RIX_RD(opcode), GET_RIX_RA(opcode), sign_extend(GET_RIX_IMM12(opcode), 12));
break;
case 0x08:
buffer += sprintf(buffer, "addri%s r%d, r%d, %d", GET_RI_CU(opcode) ? ".c": "", GET_RI_RD(opcode), GET_RI_RA(opcode), sign_extend(GET_RI_IMM14(opcode), 14));
util::stream_format(stream, "addri%s r%d, r%d, %d", GET_RI_CU(opcode) ? ".c": "", GET_RI_RD(opcode), GET_RI_RA(opcode), sign_extend(GET_RI_IMM14(opcode), 14));
break;
case 0x0c:
buffer += sprintf(buffer, "andri%s r%d, r%d, 0x%04x", GET_RI_CU(opcode) ? ".c": "", GET_RI_RD(opcode), GET_RI_RA(opcode), GET_RI_IMM14(opcode));
util::stream_format(stream, "andri%s r%d, r%d, 0x%04x", GET_RI_CU(opcode) ? ".c": "", GET_RI_RD(opcode), GET_RI_RA(opcode), GET_RI_IMM14(opcode));
break;
case 0x0d:
buffer += sprintf(buffer, "orri%s r%d, r%d, 0x%04x", GET_RI_CU(opcode) ? ".c": "", GET_RI_RD(opcode), GET_RI_RA(opcode), GET_RI_IMM14(opcode));
util::stream_format(stream, "orri%s r%d, r%d, 0x%04x", GET_RI_CU(opcode) ? ".c": "", GET_RI_RD(opcode), GET_RI_RA(opcode), GET_RI_IMM14(opcode));
break;
case 0x10: case 0x11: case 0x12: case 0x13:
case 0x14: case 0x15: case 0x16: case 0x17:
buffer += sprintf(buffer, "%s r%d, [r%d, %d]", m_ls_op[(opcode >> 25) & 0x07], GET_LS_RD(opcode), GET_LS_RA(opcode), sign_extend(GET_LS_IMM15(opcode), 15));
util::stream_format(stream, "%s r%d, [r%d, %d]", m_ls_op[(opcode >> 25) & 0x07], GET_LS_RD(opcode), GET_LS_RA(opcode), sign_extend(GET_LS_IMM15(opcode), 15));
break;
case 0x18:
buffer += sprintf(buffer, "cache 0x%02x, [r%d, %d]", GET_LS_RD(opcode), GET_LS_RA(opcode), sign_extend(GET_LS_IMM15(opcode), 15));
util::stream_format(stream, "cache 0x%02x, [r%d, %d]", GET_LS_RD(opcode), GET_LS_RA(opcode), sign_extend(GET_LS_IMM15(opcode), 15));
break;
case 0x1c:
sprintf(buffer,"<CENew op: 0x%x>", opcode);
util::stream_format(stream, "<CENew op: 0x%x>", opcode);
break;
default:
buffer += sprintf(buffer, "<undefined 32-bit opcode 0x%08x>", opcode);
util::stream_format(stream, "<undefined 32-bit opcode 0x%08x>", opcode);
}
}
return buffer;
}
char *score7_cpu_device::disasm16(char *buffer, offs_t pc, uint16_t opcode)
void score7_cpu_device::disasm16(std::ostream &stream, offs_t pc, uint16_t opcode)
{
switch((opcode >> 12) & 0x07)
{
@ -191,18 +189,18 @@ char *score7_cpu_device::disasm16(char *buffer, offs_t pc, uint16_t opcode)
switch(GET_R_FUNC4(opcode))
{
case 0x00: buffer += sprintf(buffer, "nop!"); break;
case 0x01: buffer += sprintf(buffer, "mlfh! r%d, r%d", rd, 0x10 + ra); break;
case 0x02: buffer += sprintf(buffer, "mhfl! r%d, r%d", 0x10 + rd, ra); break;
case 0x03: buffer += sprintf(buffer, "mv! r%d, r%d", rd, ra); break;
case 0x04: buffer += sprintf(buffer, "br%s! r%d", m_cond[rd & 0x0f], ra); break;
case 0x05: buffer += sprintf(buffer, "t%s!", m_cond[rd & 0x0f]); break;
case 0x08: buffer += sprintf(buffer, "sll! r%d, r%d", rd, ra); break;
case 0x09: buffer += sprintf(buffer, "addc! r%d, r%d", rd, ra); break;
case 0x0a: buffer += sprintf(buffer, "srl! r%d, r%d", rd, ra); break;
case 0x0b: buffer += sprintf(buffer, "sra! r%d, r%d", rd, ra); break;
case 0x0c: buffer += sprintf(buffer, "br%sl! r%d", m_cond[rd & 0x0f], ra); break;
default: buffer += sprintf(buffer, "<undefined r-form-1 0x%02x>", GET_R_FUNC4(opcode));
case 0x00: util::stream_format(stream, "nop!"); break;
case 0x01: util::stream_format(stream, "mlfh! r%d, r%d", rd, 0x10 + ra); break;
case 0x02: util::stream_format(stream, "mhfl! r%d, r%d", 0x10 + rd, ra); break;
case 0x03: util::stream_format(stream, "mv! r%d, r%d", rd, ra); break;
case 0x04: util::stream_format(stream, "br%s! r%d", m_cond[rd & 0x0f], ra); break;
case 0x05: util::stream_format(stream, "t%s!", m_cond[rd & 0x0f]); break;
case 0x08: util::stream_format(stream, "sll! r%d, r%d", rd, ra); break;
case 0x09: util::stream_format(stream, "addc! r%d, r%d", rd, ra); break;
case 0x0a: util::stream_format(stream, "srl! r%d, r%d", rd, ra); break;
case 0x0b: util::stream_format(stream, "sra! r%d, r%d", rd, ra); break;
case 0x0c: util::stream_format(stream, "br%sl! r%d", m_cond[rd & 0x0f], ra); break;
default: util::stream_format(stream, "<undefined r-form-1 0x%02x>", GET_R_FUNC4(opcode));
}
break;
}
@ -211,69 +209,67 @@ char *score7_cpu_device::disasm16(char *buffer, offs_t pc, uint16_t opcode)
{
case 0: case 1: case 2: case 3:
case 4: case 5: case 6: case 7:
buffer += sprintf(buffer, "%s! r%d, r%d", m_r2_op[GET_R_FUNC4(opcode)], GET_R_RD(opcode), GET_R_RA(opcode));
util::stream_format(stream, "%s! r%d, r%d", m_r2_op[GET_R_FUNC4(opcode)], GET_R_RD(opcode), GET_R_RA(opcode));
break;
case 0x0a: case 0x0e:
buffer += sprintf(buffer, "%s! r%d, [r%d]", m_r2_op[GET_R_FUNC4(opcode)], GET_P_RDG(opcode), GET_P_RAG(opcode));
util::stream_format(stream, "%s! r%d, [r%d]", m_r2_op[GET_R_FUNC4(opcode)], GET_P_RDG(opcode), GET_P_RAG(opcode));
break;
default:
buffer += sprintf(buffer, "%s! r%d, [r%d]", m_r2_op[GET_R_FUNC4(opcode)], GET_R_RD(opcode), GET_R_RA(opcode));
util::stream_format(stream, "%s! r%d, [r%d]", m_r2_op[GET_R_FUNC4(opcode)], GET_R_RD(opcode), GET_R_RA(opcode));
}
break;
case 0x03:
buffer += sprintf(buffer, "j%s! 0x%08x", GET_J_LK(opcode) ? "l": "", (pc & 0xfffff000) | (GET_J_DISP11(opcode) << 1));
util::stream_format(stream, "j%s! 0x%08x", GET_J_LK(opcode) ? "l": "", (pc & 0xfffff000) | (GET_J_DISP11(opcode) << 1));
break;
case 0x04:
buffer += sprintf(buffer, "b%s! 0x%08x", m_cond[GET_BX_EC(opcode)], pc + sign_extend(GET_BX_DISP8(opcode) << 1, 9));
util::stream_format(stream, "b%s! 0x%08x", m_cond[GET_BX_EC(opcode)], pc + sign_extend(GET_BX_DISP8(opcode) << 1, 9));
break;
case 0x05:
buffer += sprintf(buffer, "ldiu! r%d, 0x%02x", GET_I2_RD(opcode), GET_I2_IMM8(opcode));
util::stream_format(stream, "ldiu! r%d, 0x%02x", GET_I2_RD(opcode), GET_I2_IMM8(opcode));
break;
case 0x06: // I-form-1a
if (GET_I16_FUNC3(opcode) != 7)
buffer += sprintf(buffer, "%s! r%d, %d", m_i1a_op[GET_I16_FUNC3(opcode)], GET_I16_RD(opcode), GET_I16_IMM5(opcode));
util::stream_format(stream, "%s! r%d, %d", m_i1a_op[GET_I16_FUNC3(opcode)], GET_I16_RD(opcode), GET_I16_IMM5(opcode));
else
buffer += sprintf(buffer, "<undefined i-form-1a 0x%02x>", GET_I16_FUNC3(opcode));
util::stream_format(stream, "<undefined i-form-1a 0x%02x>", GET_I16_FUNC3(opcode));
break;
case 0x07: // I-form-1b
switch(GET_I16_FUNC3(opcode))
{
case 0: case 4:
buffer += sprintf(buffer, "%s! r%d, %d", m_i1b_op[GET_I16_FUNC3(opcode)], GET_I16_RD(opcode), GET_I16_IMM5(opcode)<<2);
util::stream_format(stream, "%s! r%d, %d", m_i1b_op[GET_I16_FUNC3(opcode)], GET_I16_RD(opcode), GET_I16_IMM5(opcode)<<2);
break;
case 1: case 5:
buffer += sprintf(buffer, "%s! r%d, %d", m_i1b_op[GET_I16_FUNC3(opcode)], GET_I16_RD(opcode), GET_I16_IMM5(opcode)<<1);
util::stream_format(stream, "%s! r%d, %d", m_i1b_op[GET_I16_FUNC3(opcode)], GET_I16_RD(opcode), GET_I16_IMM5(opcode)<<1);
break;
case 3: case 7:
buffer += sprintf(buffer, "%s! r%d, %d", m_i1b_op[GET_I16_FUNC3(opcode)], GET_I16_RD(opcode), GET_I16_IMM5(opcode));
util::stream_format(stream, "%s! r%d, %d", m_i1b_op[GET_I16_FUNC3(opcode)], GET_I16_RD(opcode), GET_I16_IMM5(opcode));
break;
default:
buffer += sprintf(buffer, "<undefined i-form-1b 0x%02x>", GET_I16_FUNC3(opcode));
util::stream_format(stream, "<undefined i-form-1b 0x%02x>", GET_I16_FUNC3(opcode));
}
break;
}
return buffer;
}
offs_t score7_cpu_device::disasm(char *buffer, offs_t pc, uint32_t opcode)
offs_t score7_cpu_device::disasm(std::ostream &stream, offs_t pc, uint32_t opcode)
{
uint8_t p = (pc & 0x02) ? 0 : (((opcode>>30) & 2) | ((opcode>>15) & 1));
switch(p)
{
case 0: // 16-bit + 16-bit instruction
buffer = disasm16(buffer, pc, opcode & 0x7fff);
disasm16(stream, pc, opcode & 0x7fff);
break;
case 1: // undefined
buffer += sprintf(buffer,"<undefined parity-check 0x%08x>", opcode);
util::stream_format(stream,"<undefined parity-check 0x%08x>", opcode);
break;
case 2: // parallel conditional execution
buffer = disasm16(buffer, pc, opcode & 0x7fff);
buffer += sprintf(buffer, " ||");
disasm16(stream, pc, opcode & 0x7fff);
util::stream_format(stream, " ||");
break;
case 3: // 32-bit instruction
buffer = disasm32(buffer, pc, (opcode & 0x7fff) | ((opcode >> 1) & 0x3fff8000));
disasm32(stream, pc, (opcode & 0x7fff) | ((opcode >> 1) & 0x3fff8000));
break;
}
@ -286,9 +282,9 @@ offs_t score7_cpu_device::disasm(char *buffer, offs_t pc, uint32_t opcode)
// helper function
//-------------------------------------------------
offs_t score7_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
offs_t score7_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
{
uint32_t opcode = oprom[0] | (oprom[1] << 8) | (oprom[2] << 16) | (oprom[3] << 24);
return disasm(buffer, pc, opcode);
return disasm(stream, pc, opcode);
}