summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
author Vas Crabb <cuavas@users.noreply.github.com>2016-11-19 08:14:47 +1100
committer GitHub <noreply@github.com>2016-11-19 08:14:47 +1100
commit56b9b33f63c5a9fd16866315cc71aa34182cafab (patch)
tree4616cc650095feb429548a49c0cde4c2bb96e038 /src/devices/cpu
parente6dcacf9d086dd426d4c76e66767b5df20d1cd15 (diff)
parentbc17b9c08a53287ccb996fb197ce737fc3fa752f (diff)
Merge pull request #1739 from npwoods/dasmstream_upd7725
Changed the upd7725 disassembler to use 'std::ostream &' internally
Diffstat (limited to 'src/devices/cpu')
-rw-r--r--src/devices/cpu/upd7725/dasm7725.cpp294
1 files changed, 147 insertions, 147 deletions
diff --git a/src/devices/cpu/upd7725/dasm7725.cpp b/src/devices/cpu/upd7725/dasm7725.cpp
index 8edeb821e53..303a877e413 100644
--- a/src/devices/cpu/upd7725/dasm7725.cpp
+++ b/src/devices/cpu/upd7725/dasm7725.cpp
@@ -12,16 +12,13 @@
#include "emu.h"
#include "upd7725.h"
-CPU_DISASSEMBLE( upd7725 )
+static offs_t internal_disasm_upd7725(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options)
{
- static char output[256];
uint32_t opcode = oprom[2] | (oprom[1] << 8) | (oprom[0] << 16);
uint32_t type = (opcode >> 22);
// printf("dasm: PC %x opcode %08x\n", pc, opcode);
- memset(output, 0, sizeof(output));
-
if(type == 0 || type == 1) { //OP,RT
uint8_t pselect = (opcode >> 20)&0x3; //P select
uint8_t alu = (opcode >> 16)&0xf; //ALU operation mode
@@ -33,116 +30,116 @@ CPU_DISASSEMBLE( upd7725 )
uint8_t dst = (opcode >> 0)&0xf; //move destination
switch(alu) {
- case 0: strcat(output, "nop "); break;
- case 1: strcat(output, "or "); break;
- case 2: strcat(output, "and "); break;
- case 3: strcat(output, "xor "); break;
- case 4: strcat(output, "sub "); break;
- case 5: strcat(output, "add "); break;
- case 6: strcat(output, "sbb "); break;
- case 7: strcat(output, "adc "); break;
- case 8: strcat(output, "dec "); break;
- case 9: strcat(output, "inc "); break;
- case 10: strcat(output, "cmp "); break;
- case 11: strcat(output, "shr1 "); break;
- case 12: strcat(output, "shl1 "); break;
- case 13: strcat(output, "shl2 "); break;
- case 14: strcat(output, "shl4 "); break;
- case 15: strcat(output, "xchg "); break;
+ case 0: stream << "nop "; break;
+ case 1: stream << "or "; break;
+ case 2: stream << "and "; break;
+ case 3: stream << "xor "; break;
+ case 4: stream << "sub "; break;
+ case 5: stream << "add "; break;
+ case 6: stream << "sbb "; break;
+ case 7: stream << "adc "; break;
+ case 8: stream << "dec "; break;
+ case 9: stream << "inc "; break;
+ case 10: stream << "cmp "; break;
+ case 11: stream << "shr1 "; break;
+ case 12: stream << "shl1 "; break;
+ case 13: stream << "shl2 "; break;
+ case 14: stream << "shl4 "; break;
+ case 15: stream << "xchg "; break;
}
if(alu < 8) {
switch(pselect) {
- case 0: strcat(output, "ram,"); break;
- case 1: strcat(output, "idb,"); break;
- case 2: strcat(output, "m,"); break;
- case 3: strcat(output, "n,"); break;
+ case 0: stream << "ram,"; break;
+ case 1: stream << "idb,"; break;
+ case 2: stream << "m,"; break;
+ case 3: stream << "n,"; break;
}
}
switch(asl) {
- case 0: strcat(output, "a"); break;
- case 1: strcat(output, "b"); break;
+ case 0: stream << "a"; break;
+ case 1: stream << "b"; break;
}
if(dst) {
- strcat(output, " | mov ");
+ stream << " | mov ";
switch(src) {
- case 0: strcat(output, "trb,"); break;
- case 1: strcat(output, "a,"); break;
- case 2: strcat(output, "b,"); break;
- case 3: strcat(output, "tr,"); break;
- case 4: strcat(output, "dp,"); break;
- case 5: strcat(output, "rp,"); break;
- case 6: strcat(output, "ro,"); break;
- case 7: strcat(output, "sgn,"); break;
- case 8: strcat(output, "dr,"); break;
- case 9: strcat(output, "drnf,"); break;
- case 10: strcat(output, "sr,"); break;
- case 11: strcat(output, "sim,"); break;
- case 12: strcat(output, "sil,"); break;
- case 13: strcat(output, "k,"); break;
- case 14: strcat(output, "l,"); break;
- case 15: strcat(output, "mem,"); break;
+ case 0: stream << "trb,"; break;
+ case 1: stream << "a,"; break;
+ case 2: stream << "b,"; break;
+ case 3: stream << "tr,"; break;
+ case 4: stream << "dp,"; break;
+ case 5: stream << "rp,"; break;
+ case 6: stream << "ro,"; break;
+ case 7: stream << "sgn,"; break;
+ case 8: stream << "dr,"; break;
+ case 9: stream << "drnf,"; break;
+ case 10: stream << "sr,"; break;
+ case 11: stream << "sim,"; break;
+ case 12: stream << "sil,"; break;
+ case 13: stream << "k,"; break;
+ case 14: stream << "l,"; break;
+ case 15: stream << "mem,"; break;
}
switch(dst) {
- case 0: strcat(output, "non"); break;
- case 1: strcat(output, "a"); break;
- case 2: strcat(output, "b"); break;
- case 3: strcat(output, "tr"); break;
- case 4: strcat(output, "dp"); break;
- case 5: strcat(output, "rp"); break;
- case 6: strcat(output, "dr"); break;
- case 7: strcat(output, "sr"); break;
- case 8: strcat(output, "sol"); break;
- case 9: strcat(output, "som"); break;
- case 10: strcat(output, "k"); break;
- case 11: strcat(output, "klr"); break;
- case 12: strcat(output, "klm"); break;
- case 13: strcat(output, "l"); break;
- case 14: strcat(output, "trb"); break;
- case 15: strcat(output, "mem"); break;
+ case 0: stream << "non"; break;
+ case 1: stream << "a"; break;
+ case 2: stream << "b"; break;
+ case 3: stream << "tr"; break;
+ case 4: stream << "dp"; break;
+ case 5: stream << "rp"; break;
+ case 6: stream << "dr"; break;
+ case 7: stream << "sr"; break;
+ case 8: stream << "sol"; break;
+ case 9: stream << "som"; break;
+ case 10: stream << "k"; break;
+ case 11: stream << "klr"; break;
+ case 12: stream << "klm"; break;
+ case 13: stream << "l"; break;
+ case 14: stream << "trb"; break;
+ case 15: stream << "mem"; break;
}
}
if(dpl) {
switch(dpl) {
- case 0: strcat(output, " | dpnop"); break;
- case 1: strcat(output, " | dpinc"); break;
- case 2: strcat(output, " | dpdec"); break;
- case 3: strcat(output, " | dpclr"); break;
+ case 0: stream << " | dpnop"; break;
+ case 1: stream << " | dpinc"; break;
+ case 2: stream << " | dpdec"; break;
+ case 3: stream << " | dpclr"; break;
}
}
if(dphm) {
switch(dphm) {
- case 0: strcat(output, " | m0"); break;
- case 1: strcat(output, " | m1"); break;
- case 2: strcat(output, " | m2"); break;
- case 3: strcat(output, " | m3"); break;
- case 4: strcat(output, " | m4"); break;
- case 5: strcat(output, " | m5"); break;
- case 6: strcat(output, " | m6"); break;
- case 7: strcat(output, " | m7"); break;
- case 8: strcat(output, " | m8"); break;
- case 9: strcat(output, " | m9"); break;
- case 10: strcat(output, " | ma"); break;
- case 11: strcat(output, " | mb"); break;
- case 12: strcat(output, " | mc"); break;
- case 13: strcat(output, " | md"); break;
- case 14: strcat(output, " | me"); break;
- case 15: strcat(output, " | mf"); break;
+ case 0: stream << " | m0"; break;
+ case 1: stream << " | m1"; break;
+ case 2: stream << " | m2"; break;
+ case 3: stream << " | m3"; break;
+ case 4: stream << " | m4"; break;
+ case 5: stream << " | m5"; break;
+ case 6: stream << " | m6"; break;
+ case 7: stream << " | m7"; break;
+ case 8: stream << " | m8"; break;
+ case 9: stream << " | m9"; break;
+ case 10: stream << " | ma"; break;
+ case 11: stream << " | mb"; break;
+ case 12: stream << " | mc"; break;
+ case 13: stream << " | md"; break;
+ case 14: stream << " | me"; break;
+ case 15: stream << " | mf"; break;
}
}
if(rpdcr == 1) {
- strcat(output, " | rpdec");
+ stream << " | rpdec";
}
if(type == 1) {
- strcat(output, " | ret");
+ stream << " | ret";
}
}
@@ -151,84 +148,87 @@ CPU_DISASSEMBLE( upd7725 )
uint16_t na = (opcode >> 2) & 0x7ff; //next address
switch(brch) {
- case 0x000: strcat(output, "jmpso "); break;
- case 0x080: strcat(output, "jnca "); break;
- case 0x082: strcat(output, "jca "); break;
- case 0x084: strcat(output, "jncb "); break;
- case 0x086: strcat(output, "jcb "); break;
- case 0x088: strcat(output, "jnza "); break;
- case 0x08a: strcat(output, "jza "); break;
- case 0x08c: strcat(output, "jnzb "); break;
- case 0x08e: strcat(output, "jzb "); break;
- case 0x090: strcat(output, "jnova0 "); break;
- case 0x092: strcat(output, "jova0 "); break;
- case 0x094: strcat(output, "jnovb0 "); break;
- case 0x096: strcat(output, "jovb0 "); break;
- case 0x098: strcat(output, "jnova1 "); break;
- case 0x09a: strcat(output, "jova1 "); break;
- case 0x09c: strcat(output, "jnovb1 "); break;
- case 0x09e: strcat(output, "jovb1 "); break;
- case 0x0a0: strcat(output, "jnsa0 "); break;
- case 0x0a2: strcat(output, "jsa0 "); break;
- case 0x0a4: strcat(output, "jnsb0 "); break;
- case 0x0a6: strcat(output, "jsb0 "); break;
- case 0x0a8: strcat(output, "jnsa1 "); break;
- case 0x0aa: strcat(output, "jsa1 "); break;
- case 0x0ac: strcat(output, "jnsb1 "); break;
- case 0x0ae: strcat(output, "jsb1 "); break;
- case 0x0b0: strcat(output, "jdpl0 "); break;
- case 0x0b1: strcat(output, "jdpln0 "); break;
- case 0x0b2: strcat(output, "jdplf "); break;
- case 0x0b3: strcat(output, "jdplnf "); break;
- case 0x0b4: strcat(output, "jnsiak "); break;
- case 0x0b6: strcat(output, "jsiak "); break;
- case 0x0b8: strcat(output, "jnsoak "); break;
- case 0x0ba: strcat(output, "jsoak "); break;
- case 0x0bc: strcat(output, "jnrqm "); break;
- case 0x0be: strcat(output, "jrqm "); break;
- case 0x100: strcat(output, "ljmp "); break;
- case 0x101: strcat(output, "hjmp "); break;
- case 0x140: strcat(output, "lcall "); break;
- case 0x141: strcat(output, "hcall "); break;
- default: strcat(output, "?????? "); break;
+ case 0x000: stream << "jmpso "; break;
+ case 0x080: stream << "jnca "; break;
+ case 0x082: stream << "jca "; break;
+ case 0x084: stream << "jncb "; break;
+ case 0x086: stream << "jcb "; break;
+ case 0x088: stream << "jnza "; break;
+ case 0x08a: stream << "jza "; break;
+ case 0x08c: stream << "jnzb "; break;
+ case 0x08e: stream << "jzb "; break;
+ case 0x090: stream << "jnova0 "; break;
+ case 0x092: stream << "jova0 "; break;
+ case 0x094: stream << "jnovb0 "; break;
+ case 0x096: stream << "jovb0 "; break;
+ case 0x098: stream << "jnova1 "; break;
+ case 0x09a: stream << "jova1 "; break;
+ case 0x09c: stream << "jnovb1 "; break;
+ case 0x09e: stream << "jovb1 "; break;
+ case 0x0a0: stream << "jnsa0 "; break;
+ case 0x0a2: stream << "jsa0 "; break;
+ case 0x0a4: stream << "jnsb0 "; break;
+ case 0x0a6: stream << "jsb0 "; break;
+ case 0x0a8: stream << "jnsa1 "; break;
+ case 0x0aa: stream << "jsa1 "; break;
+ case 0x0ac: stream << "jnsb1 "; break;
+ case 0x0ae: stream << "jsb1 "; break;
+ case 0x0b0: stream << "jdpl0 "; break;
+ case 0x0b1: stream << "jdpln0 "; break;
+ case 0x0b2: stream << "jdplf "; break;
+ case 0x0b3: stream << "jdplnf "; break;
+ case 0x0b4: stream << "jnsiak "; break;
+ case 0x0b6: stream << "jsiak "; break;
+ case 0x0b8: stream << "jnsoak "; break;
+ case 0x0ba: stream << "jsoak "; break;
+ case 0x0bc: stream << "jnrqm "; break;
+ case 0x0be: stream << "jrqm "; break;
+ case 0x100: stream << "ljmp "; break;
+ case 0x101: stream << "hjmp "; break;
+ case 0x140: stream << "lcall "; break;
+ case 0x141: stream << "hcall "; break;
+ default: stream << "?????? "; break;
}
- char temp[16];
-
- sprintf(temp, "$%x", na);
- strcat(output, temp);
+ util::stream_format(stream, "$%x", na);
}
if(type == 3) { //LD
- strcat(output, "ld ");
+ stream << "ld ";
uint16_t id = opcode >> 6;
uint8_t dst = (opcode >> 0) & 0xf; //destination
- char temp[16];
- sprintf(temp, "$%x,", id);
- strcat(output, temp);
+ util::stream_format(stream, "$%x,", id);
switch(dst) {
- case 0: strcat(output, "non"); break;
- case 1: strcat(output, "a"); break;
- case 2: strcat(output, "b"); break;
- case 3: strcat(output, "tr"); break;
- case 4: strcat(output, "dp"); break;
- case 5: strcat(output, "rp"); break;
- case 6: strcat(output, "dr"); break;
- case 7: strcat(output, "sr"); break;
- case 8: strcat(output, "sol"); break;
- case 9: strcat(output, "som"); break;
- case 10: strcat(output, "k"); break;
- case 11: strcat(output, "klr"); break;
- case 12: strcat(output, "klm"); break;
- case 13: strcat(output, "l"); break;
- case 14: strcat(output, "trb"); break;
- case 15: strcat(output, "mem"); break;
+ case 0: stream << "non"; break;
+ case 1: stream << "a"; break;
+ case 2: stream << "b"; break;
+ case 3: stream << "tr"; break;
+ case 4: stream << "dp"; break;
+ case 5: stream << "rp"; break;
+ case 6: stream << "dr"; break;
+ case 7: stream << "sr"; break;
+ case 8: stream << "sol"; break;
+ case 9: stream << "som"; break;
+ case 10: stream << "k"; break;
+ case 11: stream << "klr"; break;
+ case 12: stream << "klm"; break;
+ case 13: stream << "l"; break;
+ case 14: stream << "trb"; break;
+ case 15: stream << "mem"; break;
}
}
- strcpy(buffer, output);
-
return 1 | DASMFLAG_SUPPORTED;
}
+
+
+CPU_DISASSEMBLE(upd7725)
+{
+ std::ostringstream stream;
+ offs_t result = internal_disasm_upd7725(device, stream, pc, oprom, opram, options);
+ std::string stream_str = stream.str();
+ strcpy(buffer, stream_str.c_str());
+ return result;
+}