summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/superfx
diff options
context:
space:
mode:
author Nathan Woods <npwoods@mess.org>2016-10-29 17:31:12 -0400
committer Nathan Woods <npwoods@mess.org>2016-10-29 17:31:12 -0400
commit95e8d76cd6d539ddebf1f2b365e8fcfb7ed63220 (patch)
tree284894854b68ec79adda7fd158310248c51797d7 /src/devices/cpu/superfx
parent2a7bf5ddeee7e73fdc7b3585e023a8beae4a9a05 (diff)
Changed the SuperFX disassembler to use 'std::ostream &' internally
Diffstat (limited to 'src/devices/cpu/superfx')
-rw-r--r--src/devices/cpu/superfx/sfx_dasm.cpp176
-rw-r--r--src/devices/cpu/superfx/superfx.cpp12
-rw-r--r--src/devices/cpu/superfx/superfx.h4
3 files changed, 95 insertions, 97 deletions
diff --git a/src/devices/cpu/superfx/sfx_dasm.cpp b/src/devices/cpu/superfx/sfx_dasm.cpp
index d0a3dc36b0d..a4e2855480f 100644
--- a/src/devices/cpu/superfx/sfx_dasm.cpp
+++ b/src/devices/cpu/superfx/sfx_dasm.cpp
@@ -3,92 +3,80 @@
#include "emu.h"
#include "superfx.h"
-static char *output;
-
-static void ATTR_PRINTF(1,2) print(const char *fmt, ...)
-{
- va_list vl;
-
- va_start(vl, fmt);
- output += vsprintf(output, fmt, vl);
- va_end(vl);
-}
-
-offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uint8_t param1, uint16_t alt)
+offs_t superfx_dasm_one(std::ostream &stream, offs_t pc, uint8_t op, uint8_t param0, uint8_t param1, uint16_t alt)
{
uint8_t bytes_consumed = 1;
- output = buffer;
switch(op)
{
case 0x00: // STOP
- print("STOP");
+ util::stream_format(stream, "STOP");
break;
case 0x01: // NOP
- print("NOP");
+ util::stream_format(stream, "NOP");
break;
case 0x02: // CACHE
- print("CACHE");
+ util::stream_format(stream, "CACHE");
break;
case 0x03: // LSR
- print("LSR");
+ util::stream_format(stream, "LSR");
break;
case 0x04: // ROL
- print("ROL");
+ util::stream_format(stream, "ROL");
break;
case 0x05: // BRA
- print("BRA %d", (int8_t)param0);
+ util::stream_format(stream, "BRA %d", (int)(int8_t)param0);
bytes_consumed = 2;
break;
case 0x06: // BLT
- print("BLT %d", (int8_t)param0);
+ util::stream_format(stream, "BLT %d", (int)(int8_t)param0);
bytes_consumed = 2;
break;
case 0x07: // BGE
- print("BGE %d", (int8_t)param0);
+ util::stream_format(stream, "BGE %d", (int)(int8_t)param0);
bytes_consumed = 2;
break;
case 0x08: // BNE
- print("BNE %d", (int8_t)param0);
+ util::stream_format(stream, "BNE %d", (int)(int8_t)param0);
bytes_consumed = 2;
break;
case 0x09: // BEQ
- print("BEQ %d", (int8_t)param0);
+ util::stream_format(stream, "BEQ %d", (int)(int8_t)param0);
bytes_consumed = 2;
break;
case 0x0a: // BPL
- print("BPL %d", (int8_t)param0);
+ util::stream_format(stream, "BPL %d", (int)(int8_t)param0);
bytes_consumed = 2;
break;
case 0x0b: // BMI
- print("BMI %d", (int8_t)param0);
+ util::stream_format(stream, "BMI %d", (int)(int8_t)param0);
bytes_consumed = 2;
break;
case 0x0c: // BCC
- print("BCC %d", (int8_t)param0);
+ util::stream_format(stream, "BCC %d", (int)(int8_t)param0);
bytes_consumed = 2;
break;
case 0x0d: // BCS
- print("BCS %d", (int8_t)param0);
+ util::stream_format(stream, "BCS %d", (int)(int8_t)param0);
bytes_consumed = 2;
break;
case 0x0e: // BVC
- print("BVC %d", (int8_t)param0);
+ util::stream_format(stream, "BVC %d", (int)(int8_t)param0);
bytes_consumed = 2;
break;
case 0x0f: // BVS
- print("BVS %d", (int8_t)param0);
+ util::stream_format(stream, "BVS %d", (int)(int8_t)param0);
bytes_consumed = 2;
break;
case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: // TO
- print("TO R%d", op & 0xf);
+ util::stream_format(stream, "TO R%d", op & 0xf);
break;
case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:
case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: // WITH
- print("WITH R%d", op & 0xf);
+ util::stream_format(stream, "WITH R%d", op & 0xf);
break;
case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35:
@@ -97,26 +85,26 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
{
case SUPERFX_SFR_ALT0:
case SUPERFX_SFR_ALT2:
- print("STW (R%d)", op & 0xf);
+ util::stream_format(stream, "STW (R%d)", op & 0xf);
break;
case SUPERFX_SFR_ALT1:
case SUPERFX_SFR_ALT3:
- print("STB (R%d)", op & 0xf);
+ util::stream_format(stream, "STB (R%d)", op & 0xf);
break;
}
break;
case 0x3c: // LOOP
- print("LOOP");
+ util::stream_format(stream, "LOOP");
break;
case 0x3d: // ALT1
- print("ALT1");
+ util::stream_format(stream, "ALT1");
break;
case 0x3e: // ALT2
- print("ALT2");
+ util::stream_format(stream, "ALT2");
break;
case 0x3f: // ALT3
- print("ALT3");
+ util::stream_format(stream, "ALT3");
break;
case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45:
@@ -125,11 +113,11 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
{
case SUPERFX_SFR_ALT0:
case SUPERFX_SFR_ALT2:
- print("LDW (R%d)", op & 0xf);
+ util::stream_format(stream, "LDW (R%d)", op & 0xf);
break;
case SUPERFX_SFR_ALT1:
case SUPERFX_SFR_ALT3:
- print("LDB (R%d)", op & 0xf);
+ util::stream_format(stream, "LDB (R%d)", op & 0xf);
break;
}
break;
@@ -139,17 +127,17 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
{
case SUPERFX_SFR_ALT0:
case SUPERFX_SFR_ALT2:
- print("PLOT");
+ util::stream_format(stream, "PLOT");
break;
case SUPERFX_SFR_ALT1:
case SUPERFX_SFR_ALT3:
- print("RPIX");
+ util::stream_format(stream, "RPIX");
break;
}
break;
case 0x4d: // SWAP
- print("SWAP");
+ util::stream_format(stream, "SWAP");
break;
case 0x4e: // COLOR / CMODE
@@ -157,17 +145,17 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
{
case SUPERFX_SFR_ALT0:
case SUPERFX_SFR_ALT2:
- print("COLOR");
+ util::stream_format(stream, "COLOR");
break;
case SUPERFX_SFR_ALT1:
case SUPERFX_SFR_ALT3:
- print("CMODE");
+ util::stream_format(stream, "CMODE");
break;
}
break;
case 0x4f: // NOT
- print("NOT");
+ util::stream_format(stream, "NOT");
break;
case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57:
@@ -175,16 +163,16 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
switch(alt)
{
case SUPERFX_SFR_ALT0:
- print("ADD R%d", op &0xf);
+ util::stream_format(stream, "ADD R%d", op &0xf);
break;
case SUPERFX_SFR_ALT1:
- print("ADC R%d", op &0xf);
+ util::stream_format(stream, "ADC R%d", op &0xf);
break;
case SUPERFX_SFR_ALT2:
- print("ADDI R%d", op &0xf);
+ util::stream_format(stream, "ADDI R%d", op &0xf);
break;
case SUPERFX_SFR_ALT3:
- print("ADCI R%d", op &0xf);
+ util::stream_format(stream, "ADCI R%d", op &0xf);
break;
}
break;
@@ -194,22 +182,22 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
switch(alt)
{
case SUPERFX_SFR_ALT0:
- print("SUB R%d", op &0xf);
+ util::stream_format(stream, "SUB R%d", op &0xf);
break;
case SUPERFX_SFR_ALT1:
- print("SBC R%d", op &0xf);
+ util::stream_format(stream, "SBC R%d", op &0xf);
break;
case SUPERFX_SFR_ALT2:
- print("SUBI R%d", op &0xf);
+ util::stream_format(stream, "SUBI R%d", op &0xf);
break;
case SUPERFX_SFR_ALT3:
- print("CMP R%d", op &0xf);
+ util::stream_format(stream, "CMP R%d", op &0xf);
break;
}
break;
case 0x70: // MERGE
- print("MERGE");
+ util::stream_format(stream, "MERGE");
break;
case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
@@ -217,16 +205,16 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
switch(alt)
{
case SUPERFX_SFR_ALT0:
- print("AND R%d", op &0xf);
+ util::stream_format(stream, "AND R%d", op &0xf);
break;
case SUPERFX_SFR_ALT1:
- print("BIC R%d", op &0xf);
+ util::stream_format(stream, "BIC R%d", op &0xf);
break;
case SUPERFX_SFR_ALT2:
- print("ANDI R%d", op &0xf);
+ util::stream_format(stream, "ANDI R%d", op &0xf);
break;
case SUPERFX_SFR_ALT3:
- print("BICI R%d", op &0xf);
+ util::stream_format(stream, "BICI R%d", op &0xf);
break;
}
break;
@@ -236,30 +224,30 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
switch(alt)
{
case SUPERFX_SFR_ALT0:
- print("MULT R%d", op &0xf);
+ util::stream_format(stream, "MULT R%d", op &0xf);
break;
case SUPERFX_SFR_ALT1:
- print("UMULT R%d", op &0xf);
+ util::stream_format(stream, "UMULT R%d", op &0xf);
break;
case SUPERFX_SFR_ALT2:
- print("MULTI R%d", op &0xf);
+ util::stream_format(stream, "MULTI R%d", op &0xf);
break;
case SUPERFX_SFR_ALT3:
- print("UMULTI R%d", op &0xf);
+ util::stream_format(stream, "UMULTI R%d", op &0xf);
break;
}
break;
case 0x90: // SBK
- print("SBK");
+ util::stream_format(stream, "SBK");
break;
case 0x91: case 0x92: case 0x93: case 0x94: // LINK
- print("LINK %d", op & 0xf);
+ util::stream_format(stream, "LINK %d", op & 0xf);
break;
case 0x95: // SEX
- print("SEX");
+ util::stream_format(stream, "SEX");
break;
case 0x96: // ASR / DIV2
@@ -267,17 +255,17 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
{
case SUPERFX_SFR_ALT0:
case SUPERFX_SFR_ALT2:
- print("ASR");
+ util::stream_format(stream, "ASR");
break;
case SUPERFX_SFR_ALT1:
case SUPERFX_SFR_ALT3:
- print("DIV2");
+ util::stream_format(stream, "DIV2");
break;
}
break;
case 0x97: // ROR
- print("ROR");
+ util::stream_format(stream, "ROR");
break;
case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: // JMP / LJMP
@@ -285,17 +273,17 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
{
case SUPERFX_SFR_ALT0:
case SUPERFX_SFR_ALT2:
- print("JMP R%d", op & 0xf);
+ util::stream_format(stream, "JMP R%d", op & 0xf);
break;
case SUPERFX_SFR_ALT1:
case SUPERFX_SFR_ALT3:
- print("LJMP R%d", op & 0xf);
+ util::stream_format(stream, "LJMP R%d", op & 0xf);
break;
}
break;
case 0x9e: // LOB
- print("LOB");
+ util::stream_format(stream, "LOB");
break;
case 0x9f: // FMULT / LMULT
@@ -303,11 +291,11 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
{
case SUPERFX_SFR_ALT0:
case SUPERFX_SFR_ALT2:
- print("FMULT");
+ util::stream_format(stream, "FMULT");
break;
case SUPERFX_SFR_ALT1:
case SUPERFX_SFR_ALT3:
- print("LMULT");
+ util::stream_format(stream, "LMULT");
break;
}
break;
@@ -317,14 +305,14 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
switch(alt)
{
case SUPERFX_SFR_ALT0:
- print("IBT R%d,0x%02x", op & 0xf, param0);
+ util::stream_format(stream, "IBT R%d,0x%02x", op & 0xf, param0);
break;
case SUPERFX_SFR_ALT2:
- print("SMS R%d,(0x%04x)", op & 0xf, param0 << 1);
+ util::stream_format(stream, "SMS R%d,(0x%04x)", op & 0xf, param0 << 1);
break;
case SUPERFX_SFR_ALT1:
case SUPERFX_SFR_ALT3:
- print("LMS R%d,(0x%04x)", op & 0xf, param0 << 1);
+ util::stream_format(stream, "LMS R%d,(0x%04x)", op & 0xf, param0 << 1);
break;
}
bytes_consumed = 2;
@@ -332,11 +320,11 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7:
case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf: // FROM
- print("FROM R%d", op & 0xf);
+ util::stream_format(stream, "FROM R%d", op & 0xf);
break;
case 0xc0: // HIB
- print("HIB");
+ util::stream_format(stream, "HIB");
break;
case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7:
@@ -344,23 +332,23 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
switch(alt)
{
case SUPERFX_SFR_ALT0:
- print("OR R%d", op &0xf);
+ util::stream_format(stream, "OR R%d", op &0xf);
break;
case SUPERFX_SFR_ALT1:
- print("XOR R%d", op &0xf);
+ util::stream_format(stream, "XOR R%d", op &0xf);
break;
case SUPERFX_SFR_ALT2:
- print("ORI R%d", op &0xf);
+ util::stream_format(stream, "ORI R%d", op &0xf);
break;
case SUPERFX_SFR_ALT3:
- print("XORI R%d", op &0xf);
+ util::stream_format(stream, "XORI R%d", op &0xf);
break;
}
break;
case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7:
case 0xd8: case 0xd9: case 0xda: case 0xdb: case 0xdc: case 0xdd: case 0xde: // INC
- print("INC R%d", op & 0xf);
+ util::stream_format(stream, "INC R%d", op & 0xf);
break;
case 0xdf: // GETC / RAMB / ROMB
@@ -368,36 +356,36 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
{
case SUPERFX_SFR_ALT0:
case SUPERFX_SFR_ALT1:
- print("GETC");
+ util::stream_format(stream, "GETC");
break;
case SUPERFX_SFR_ALT2:
- print("RAMB");
+ util::stream_format(stream, "RAMB");
break;
case SUPERFX_SFR_ALT3:
- print("ROMB");
+ util::stream_format(stream, "ROMB");
break;
}
break;
case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7:
case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: // DEC
- print("DEC R%d", op & 0xf);
+ util::stream_format(stream, "DEC R%d", op & 0xf);
break;
case 0xef: // GETB / GETBH / GETBL / GETBS
switch(alt)
{
case SUPERFX_SFR_ALT0:
- print("GETB");
+ util::stream_format(stream, "GETB");
break;
case SUPERFX_SFR_ALT1:
- print("GETBH");
+ util::stream_format(stream, "GETBH");
break;
case SUPERFX_SFR_ALT2:
- print("GETBL");
+ util::stream_format(stream, "GETBL");
break;
case SUPERFX_SFR_ALT3:
- print("GETBS");
+ util::stream_format(stream, "GETBS");
break;
}
break;
@@ -407,15 +395,15 @@ offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uin
switch(alt)
{
case SUPERFX_SFR_ALT0:
- print("IWT R%d,#%02x%02x", op & 0xf, param1, param0);
+ util::stream_format(stream, "IWT R%d,#%02x%02x", op & 0xf, param1, param0);
bytes_consumed = 3;
break;
case SUPERFX_SFR_ALT2:
- print("SM R%d", op & 0xf);
+ util::stream_format(stream, "SM R%d", op & 0xf);
break;
case SUPERFX_SFR_ALT1:
case SUPERFX_SFR_ALT3:
- print("LM R%d", op & 0xf);
+ util::stream_format(stream, "LM R%d", op & 0xf);
break;
}
break;
diff --git a/src/devices/cpu/superfx/superfx.cpp b/src/devices/cpu/superfx/superfx.cpp
index 2e01df5874a..9da3d9bd4c7 100644
--- a/src/devices/cpu/superfx/superfx.cpp
+++ b/src/devices/cpu/superfx/superfx.cpp
@@ -1438,15 +1438,21 @@ void superfx_device::execute_run()
}
}
-
offs_t superfx_device::disasm_disassemble(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
{
-extern offs_t superfx_dasm_one(char *buffer, offs_t pc, uint8_t op, uint8_t param0, uint8_t param1, uint16_t alt);
+ 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;
+}
+offs_t superfx_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+{
uint8_t op = *(uint8_t *)(opram + 0);
uint8_t param0 = *(uint8_t *)(opram + 1);
uint8_t param1 = *(uint8_t *)(opram + 2);
uint16_t alt = m_sfr & SUPERFX_SFR_ALT;
- return superfx_dasm_one(buffer, pc, op, param0, param1, alt);
+ return superfx_dasm_one(stream, pc, op, param0, param1, alt);
}
diff --git a/src/devices/cpu/superfx/superfx.h b/src/devices/cpu/superfx/superfx.h
index f5c14c7561e..ba62122eaf2 100644
--- a/src/devices/cpu/superfx/superfx.h
+++ b/src/devices/cpu/superfx/superfx.h
@@ -209,9 +209,13 @@ private:
inline void superfx_add_clocks_internal(uint32_t clocks);
void superfx_timing_reset();
inline void superfx_dreg_sfr_sz_update();
+
+ 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 SUPERFX;
+offs_t superfx_dasm_one(std::ostream &stream, offs_t pc, uint8_t op, uint8_t param0, uint8_t param1, uint16_t alt);
+
#endif /* __SUPERFX_H__ */