Changed the cop410 disassembler to use 'std::ostream &' internally

This one actually had a change in behavior; I had to insert a 'break' somewhere.  Judging from the other cop4x0 disassemblers, this seems to be a bug in the existing disassembler
This commit is contained in:
Nathan Woods 2016-11-11 15:56:02 -05:00
parent dbd07cef38
commit ff91c7332d

View File

@ -10,7 +10,7 @@
#include "emu.h"
CPU_DISASSEMBLE( cop410 )
static offs_t internal_disasm_cop410(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options)
{
uint8_t opcode = oprom[0];
uint8_t next_opcode = oprom[1];
@ -23,130 +23,130 @@ CPU_DISASSEMBLE( cop410 )
if ((pc & 0x3E0) >= 0x80 && (pc & 0x3E0) < 0x100) //JP pages 2,3
{
address = (uint16_t)((pc & 0x380) | (opcode & 0x7F));
sprintf(buffer, "JP %x", address);
util::stream_format(stream, "JP %x", address);
}
else
{
if ((opcode & 0xC0) == 0xC0) //JP other pages
{
address = (uint16_t)((pc & 0x3C0) | (opcode & 0x3F));
sprintf(buffer, "JP %x", address);
util::stream_format(stream, "JP %x", address);
}
else //JSRP
{
address = (uint16_t)(0x80 | (opcode & 0x3F));
sprintf(buffer, "JSRP %x", address);
util::stream_format(stream, "JSRP %x", address);
flags = DASMFLAG_STEP_OVER;
}
}
}
else if (opcode >= 0x08 && opcode <= 0x0F)
{
sprintf(buffer, "LBI 0,%u", ((opcode & 0xF) + 1) & 0xF);
util::stream_format(stream, "LBI 0,%u", ((opcode & 0xF) + 1) & 0xF);
}
else if (opcode >= 0x18 && opcode <= 0x1F)
{
sprintf(buffer, "LBI 1,%u", ((opcode & 0xF) + 1) & 0xF);
util::stream_format(stream, "LBI 1,%u", ((opcode & 0xF) + 1) & 0xF);
}
else if (opcode >= 0x28 && opcode <= 0x2F)
{
sprintf(buffer, "LBI 2,%u", ((opcode & 0xF) + 1) & 0xF);
util::stream_format(stream, "LBI 2,%u", ((opcode & 0xF) + 1) & 0xF);
}
else if (opcode >= 0x38 && opcode <= 0x3F)
{
sprintf(buffer, "LBI 3,%u", ((opcode & 0xF) + 1) & 0xF);
util::stream_format(stream, "LBI 3,%u", ((opcode & 0xF) + 1) & 0xF);
}
else if (opcode >= 0x51 && opcode <= 0x5F)
{
sprintf(buffer, "AISC %u", opcode & 0xF);
util::stream_format(stream, "AISC %u", opcode & 0xF);
}
else if (opcode >= 0x60 && opcode <= 0x61)
{
address = ((opcode & 0x01) << 8) | next_opcode;
sprintf(buffer, "JMP %x", address);
util::stream_format(stream, "JMP %x", address);
bytes = 2;
}
else if (opcode >= 0x68 && opcode <= 0x69)
{
address = ((opcode & 0x01) << 8) | next_opcode;
sprintf(buffer, "JSR %x", address);
util::stream_format(stream, "JSR %x", address);
flags = DASMFLAG_STEP_OVER;
bytes = 2;
}
else if (opcode >= 0x70 && opcode <= 0x7F)
{
sprintf(buffer, "STII %u", opcode & 0xF);
util::stream_format(stream, "STII %u", opcode & 0xF);
}
else
{
switch (opcode)
{
case 0:
sprintf(buffer, "CLRA");
util::stream_format(stream, "CLRA");
break;
case 1:
sprintf(buffer, "SKMBZ 0");
util::stream_format(stream, "SKMBZ 0");
break;
case 2:
sprintf(buffer, "XOR");
util::stream_format(stream, "XOR");
break;
case 3:
sprintf(buffer, "SKMBZ 2");
util::stream_format(stream, "SKMBZ 2");
break;
case 4:
sprintf(buffer, "XIS 0");
util::stream_format(stream, "XIS 0");
break;
case 5:
sprintf(buffer, "LD 0");
util::stream_format(stream, "LD 0");
break;
case 6:
sprintf(buffer, "X 0");
util::stream_format(stream, "X 0");
break;
case 7:
sprintf(buffer, "XDS 0");
util::stream_format(stream, "XDS 0");
break;
case 0x11:
sprintf(buffer, "SKMBZ 1");
util::stream_format(stream, "SKMBZ 1");
break;
case 0x13:
sprintf(buffer, "SKMBZ 3");
util::stream_format(stream, "SKMBZ 3");
break;
case 0x14:
sprintf(buffer, "XIS 1");
util::stream_format(stream, "XIS 1");
break;
case 0x15:
sprintf(buffer, "LD 1");
util::stream_format(stream, "LD 1");
break;
case 0x16:
sprintf(buffer, "X 1");
util::stream_format(stream, "X 1");
break;
case 0x17:
sprintf(buffer, "XDS 1");
util::stream_format(stream, "XDS 1");
break;
case 0x20:
sprintf(buffer, "SKC");
util::stream_format(stream, "SKC");
break;
case 0x21:
sprintf(buffer, "SKE");
util::stream_format(stream, "SKE");
break;
case 0x22:
sprintf(buffer, "SC");
util::stream_format(stream, "SC");
break;
case 0x23:
@ -155,40 +155,40 @@ CPU_DISASSEMBLE( cop410 )
if (next_opcode >= 0x80 && next_opcode <= 0xbf)
{
address = (uint16_t)(next_opcode & 0x3F);
sprintf(buffer, "XAD %x,%x", ((address & 0x30) >> 4),address & 0x0F);
util::stream_format(stream, "XAD %x,%x", ((address & 0x30) >> 4),address & 0x0F);
}
else
{
sprintf(buffer, "Invalid");
util::stream_format(stream, "Invalid");
}
break;
case 0x24:
sprintf(buffer, "XIS 2");
util::stream_format(stream, "XIS 2");
break;
case 0x25:
sprintf(buffer, "LD 2");
util::stream_format(stream, "LD 2");
break;
case 0x26:
sprintf(buffer, "X 2");
util::stream_format(stream, "X 2");
break;
case 0x27:
sprintf(buffer, "XDS 2");
util::stream_format(stream, "XDS 2");
break;
case 0x30:
sprintf(buffer, "ASC");
util::stream_format(stream, "ASC");
break;
case 0x31:
sprintf(buffer, "ADD");
util::stream_format(stream, "ADD");
break;
case 0x32:
sprintf(buffer, "RC");
util::stream_format(stream, "RC");
break;
case 0x33:
@ -196,154 +196,165 @@ CPU_DISASSEMBLE( cop410 )
if (next_opcode >= 0x60 && next_opcode <= 0x6F)
{
sprintf(buffer, "LEI %x", next_opcode & 0xF);
util::stream_format(stream, "LEI %x", next_opcode & 0xF);
}
else
{
switch (next_opcode)
{
case 0x01:
sprintf(buffer, "SKGBZ 0");
util::stream_format(stream, "SKGBZ 0");
break;
case 0x03:
sprintf(buffer, "SKGBZ 2");
util::stream_format(stream, "SKGBZ 2");
break;
case 0x11:
sprintf(buffer, "SKGBZ 1");
util::stream_format(stream, "SKGBZ 1");
break;
case 0x13:
sprintf(buffer, "SKGBZ 3");
util::stream_format(stream, "SKGBZ 3");
break;
case 0x21:
sprintf(buffer, "SKGZ");
util::stream_format(stream, "SKGZ");
break;
case 0x2A:
sprintf(buffer, "ING");
util::stream_format(stream, "ING");
break;
case 0x2E:
sprintf(buffer, "INL");
util::stream_format(stream, "INL");
break;
case 0x38:
sprintf(buffer, "HALT");
util::stream_format(stream, "HALT");
break;
case 0x3A:
sprintf(buffer, "OMG");
util::stream_format(stream, "OMG");
break;
case 0x3C:
sprintf(buffer, "CAMQ");
util::stream_format(stream, "CAMQ");
break;
case 0x3E:
sprintf(buffer, "OBD");
util::stream_format(stream, "OBD");
break;
default:
sprintf(buffer, "Invalid");
util::stream_format(stream, "Invalid");
break;
}
break;
}
break;
case 0x34:
sprintf(buffer, "XIS 3");
util::stream_format(stream, "XIS 3");
break;
case 0x35:
sprintf(buffer, "LD 3");
util::stream_format(stream, "LD 3");
break;
case 0x36:
sprintf(buffer, "X 3");
util::stream_format(stream, "X 3");
break;
case 0x37:
sprintf(buffer, "XDS 3");
util::stream_format(stream, "XDS 3");
break;
case 0x40:
sprintf(buffer, "COMP");
util::stream_format(stream, "COMP");
break;
case 0x42:
sprintf(buffer, "RMB 2");
util::stream_format(stream, "RMB 2");
break;
case 0x43:
sprintf(buffer, "RMB 3");
util::stream_format(stream, "RMB 3");
break;
case 0x44:
sprintf(buffer, "NOP");
util::stream_format(stream, "NOP");
break;
case 0x45:
sprintf(buffer, "RMB 1");
util::stream_format(stream, "RMB 1");
break;
case 0x46:
sprintf(buffer, "SMB 2");
util::stream_format(stream, "SMB 2");
break;
case 0x47:
sprintf(buffer, "SMB 1");
util::stream_format(stream, "SMB 1");
break;
case 0x48:
sprintf(buffer, "RET");
util::stream_format(stream, "RET");
flags = DASMFLAG_STEP_OUT;
break;
case 0x49:
sprintf(buffer, "RETSK");
util::stream_format(stream, "RETSK");
flags = DASMFLAG_STEP_OUT;
break;
case 0x4B:
sprintf(buffer, "SMB 3");
util::stream_format(stream, "SMB 3");
break;
case 0x4C:
sprintf(buffer, "RMB 0");
util::stream_format(stream, "RMB 0");
break;
case 0x4D:
sprintf(buffer, "SMB 0");
util::stream_format(stream, "SMB 0");
break;
case 0x4E:
sprintf(buffer, "CBA");
util::stream_format(stream, "CBA");
break;
case 0x4F:
sprintf(buffer, "XAS");
util::stream_format(stream, "XAS");
break;
case 0x50:
sprintf(buffer, "CAB");
util::stream_format(stream, "CAB");
break;
case 0xBF:
sprintf(buffer, "LQID");
util::stream_format(stream, "LQID");
break;
case 0xFF:
sprintf(buffer, "JID");
util::stream_format(stream, "JID");
break;
default:
sprintf(buffer, "Invalid");
util::stream_format(stream, "Invalid");
break;
}
}
return bytes | flags | DASMFLAG_SUPPORTED;
}
CPU_DISASSEMBLE(cop410)
{
std::ostringstream stream;
offs_t result = internal_disasm_cop410(device, stream, pc, oprom, opram, options);
std::string stream_str = stream.str();
strcpy(buffer, stream_str.c_str());
return result;
}