diff --git a/src/devices/cpu/score/score.h b/src/devices/cpu/score/score.h index be2456f3f59..5f4b2ec2c2b 100644 --- a/src/devices/cpu/score/score.h +++ b/src/devices/cpu/score/score.h @@ -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; diff --git a/src/devices/cpu/score/scoredsm.cpp b/src/devices/cpu/score/scoredsm.cpp index 0ca0ff77b5e..d4b5ddbf78a 100644 --- a/src/devices/cpu/score/scoredsm.cpp +++ b/src/devices/cpu/score/scoredsm.cpp @@ -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, "", 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, "", 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, "", GET_I_FUNC3(opcode)); + util::stream_format(stream, "", 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, "", GET_I_FUNC3(opcode)); + util::stream_format(stream, "", 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, "", GET_CR_OP(opcode) & 0x07); + util::stream_format(stream, "", GET_CR_OP(opcode) & 0x07); else - buffer += sprintf(buffer, "", GET_S_FUNC6(opcode)); + util::stream_format(stream, "", 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,"", opcode); + util::stream_format(stream, "", opcode); break; default: - buffer += sprintf(buffer, "", opcode); + util::stream_format(stream, "", 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, "", 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, "", 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, "", GET_I16_FUNC3(opcode)); + util::stream_format(stream, "", 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, "", GET_I16_FUNC3(opcode)); + util::stream_format(stream, "", 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,"", opcode); + util::stream_format(stream,"", 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); }