Merge pull request #1690 from npwoods/dasmstream_g65816

Changed the G65816 disassembler to use 'std::ostream &' internally
This commit is contained in:
R. Belmont 2016-11-15 13:52:18 -05:00 committed by GitHub
commit 2d32045600
2 changed files with 37 additions and 29 deletions

View File

@ -241,11 +241,10 @@ static inline char* int_16_str(unsigned int val)
} }
unsigned g65816_disassemble(char* buff, unsigned int pc, unsigned int pb, const uint8_t *oprom, int m_flag, int x_flag) unsigned g65816_disassemble(std::ostream &stream, unsigned int pc, unsigned int pb, const uint8_t *oprom, int m_flag, int x_flag)
{ {
unsigned int instruction; unsigned int instruction;
const g65816_opcode_struct* opcode; const g65816_opcode_struct* opcode;
char* ptr;
int var; int var;
int length = 1; int length = 1;
unsigned int address; unsigned int address;
@ -260,8 +259,7 @@ unsigned g65816_disassemble(char* buff, unsigned int pc, unsigned int pb, const
instruction = read_8(address); instruction = read_8(address);
opcode = &g65816_opcode_struct::get(instruction); opcode = &g65816_opcode_struct::get(instruction);
strcpy(buff, opcode->name()); stream << opcode->name();
ptr = buff + strlen(buff);
if (opcode->is_call()) if (opcode->is_call())
dasm_flags = DASMFLAG_STEP_OVER; dasm_flags = DASMFLAG_STEP_OVER;
@ -275,108 +273,108 @@ unsigned g65816_disassemble(char* buff, unsigned int pc, unsigned int pb, const
case IMP : case IMP :
break; break;
case ACC : case ACC :
sprintf(ptr, "A"); util::stream_format(stream, "A");
break; break;
case RELB: case RELB:
var = (int8_t) read_8(address+1); var = (int8_t) read_8(address+1);
length++; length++;
sprintf(ptr, " %06x (%s)", pb | ((pc + length + var)&0xffff), int_8_str(var)); util::stream_format(stream, " %06x (%s)", pb | ((pc + length + var)&0xffff), int_8_str(var));
break; break;
case RELW: case RELW:
case PER : case PER :
var = read_16(address+1); var = read_16(address+1);
length += 2; length += 2;
sprintf(ptr, " %06x (%s)", pb | ((pc + length + var)&0xffff), int_16_str(var)); util::stream_format(stream, " %06x (%s)", pb | ((pc + length + var)&0xffff), int_16_str(var));
break; break;
case IMM : case IMM :
if((opcode->flag == M && !m_flag) || (opcode->flag == X && !x_flag)) if((opcode->flag == M && !m_flag) || (opcode->flag == X && !x_flag))
{ {
sprintf(ptr, " #$%04x", read_16(address+1)); util::stream_format(stream, " #$%04x", read_16(address+1));
length += 2; length += 2;
} }
else else
{ {
sprintf(ptr, " #$%02x", read_8(address+1)); util::stream_format(stream, " #$%02x", read_8(address+1));
length++; length++;
} }
break; break;
case A : case A :
case PEA : case PEA :
sprintf(ptr, " $%04x", read_16(address+1)); util::stream_format(stream, " $%04x", read_16(address+1));
length += 2; length += 2;
break; break;
case AI : case AI :
sprintf(ptr, " ($%04x)", read_16(address+1)); util::stream_format(stream, " ($%04x)", read_16(address+1));
length += 2; length += 2;
break; break;
case AL : case AL :
sprintf(ptr, " $%06x", read_24(address+1)); util::stream_format(stream, " $%06x", read_24(address+1));
length += 3; length += 3;
break; break;
case ALX : case ALX :
sprintf(ptr, " $%06x,X", read_24(address+1)); util::stream_format(stream, " $%06x,X", read_24(address+1));
length += 3; length += 3;
break; break;
case AX : case AX :
sprintf(ptr, " $%04x,X", read_16(address+1)); util::stream_format(stream, " $%04x,X", read_16(address+1));
length += 2; length += 2;
break; break;
case AXI : case AXI :
sprintf(ptr, " ($%04x,X)", read_16(address+1)); util::stream_format(stream, " ($%04x,X)", read_16(address+1));
length += 2; length += 2;
break; break;
case AY : case AY :
sprintf(ptr, " $%04x,Y", read_16(address+1)); util::stream_format(stream, " $%04x,Y", read_16(address+1));
length += 2; length += 2;
break; break;
case D : case D :
sprintf(ptr, " $%02x", read_8(address+1)); util::stream_format(stream, " $%02x", read_8(address+1));
length++; length++;
break; break;
case DI : case DI :
case PEI : case PEI :
sprintf(ptr, " ($%02x)", read_8(address+1)); util::stream_format(stream, " ($%02x)", read_8(address+1));
length++; length++;
break; break;
case DIY : case DIY :
sprintf(ptr, " ($%02x),Y", read_8(address+1)); util::stream_format(stream, " ($%02x),Y", read_8(address+1));
length++; length++;
break; break;
case DLI : case DLI :
sprintf(ptr, " [$%02x]", read_8(address+1)); util::stream_format(stream, " [$%02x]", read_8(address+1));
length++; length++;
break; break;
case DLIY: case DLIY:
sprintf(ptr, " [$%02x],Y", read_8(address+1)); util::stream_format(stream, " [$%02x],Y", read_8(address+1));
length++; length++;
break; break;
case DX : case DX :
sprintf(ptr, " $%02x,X", read_8(address+1)); util::stream_format(stream, " $%02x,X", read_8(address+1));
length++; length++;
break; break;
case DXI : case DXI :
sprintf(ptr, " ($%02x,X)", read_8(address+1)); util::stream_format(stream, " ($%02x,X)", read_8(address+1));
length++; length++;
break; break;
case DY : case DY :
sprintf(ptr, " $%02x,Y", read_8(address+1)); util::stream_format(stream, " $%02x,Y", read_8(address+1));
length++; length++;
break; break;
case S : case S :
sprintf(ptr, " %s,S", int_8_str(read_8(address+1))); util::stream_format(stream, " %s,S", int_8_str(read_8(address+1)));
length++; length++;
break; break;
case SIY : case SIY :
sprintf(ptr, " (%s,S),Y", int_8_str(read_8(address+1))); util::stream_format(stream, " (%s,S),Y", int_8_str(read_8(address+1)));
length++; length++;
break; break;
case SIG : case SIG :
sprintf(ptr, " #$%02x", read_8(address+1)); util::stream_format(stream, " #$%02x", read_8(address+1));
length++; length++;
break; break;
case MVN : case MVN :
case MVP : case MVP :
sprintf(ptr, " $%02x, $%02x", read_8(address+2), read_8(address+1)); util::stream_format(stream, " $%02x, $%02x", read_8(address+2), read_8(address+1));
length += 2; length += 2;
break; break;
} }
@ -384,6 +382,15 @@ unsigned g65816_disassemble(char* buff, unsigned int pc, unsigned int pb, const
return length | DASMFLAG_SUPPORTED | dasm_flags; return length | DASMFLAG_SUPPORTED | dasm_flags;
} }
unsigned g65816_disassemble(char *buffer, unsigned int pc, unsigned int pb, const uint8_t *oprom, int m_flag, int x_flag)
{
std::ostringstream stream;
unsigned result = g65816_disassemble(stream, pc, pb, oprom, m_flag, x_flag);
std::string stream_str = stream.str();
strcpy(buffer, stream_str.c_str());
return result;
}
CPU_DISASSEMBLE( g65816_generic ) CPU_DISASSEMBLE( g65816_generic )
{ {
return g65816_disassemble(buffer, (pc & 0x00ffff), (pc & 0xff0000) >> 16, oprom, 0, 0); return g65816_disassemble(buffer, (pc & 0x00ffff), (pc & 0xff0000) >> 16, oprom, 0, 0);

View File

@ -16,7 +16,8 @@ All rights reserved.
*/ */
unsigned g65816_disassemble(char* buff, unsigned int pc, unsigned int pb, const uint8_t *oprom, int m_flag, int x_flag); unsigned g65816_disassemble(std::ostream &stream, unsigned int pc, unsigned int pb, const uint8_t *oprom, int m_flag, int x_flag);
unsigned g65816_disassemble(char *buffer, unsigned int pc, unsigned int pb, const uint8_t *oprom, int m_flag, int x_flag);
#endif /* __G65816DS_H__ */ #endif /* __G65816DS_H__ */