diff options
Diffstat (limited to 'src/devices/cpu/ssp1601/ssp1601d.cpp')
-rw-r--r-- | src/devices/cpu/ssp1601/ssp1601d.cpp | 64 |
1 files changed, 26 insertions, 38 deletions
diff --git a/src/devices/cpu/ssp1601/ssp1601d.cpp b/src/devices/cpu/ssp1601/ssp1601d.cpp index 465dd657d90..5b9f3c6ac27 100644 --- a/src/devices/cpu/ssp1601/ssp1601d.cpp +++ b/src/devices/cpu/ssp1601/ssp1601d.cpp @@ -9,10 +9,10 @@ */ #include "emu.h" -#include "debugger.h" +#include "ssp1601d.h" -static const char *const reg[16] = +const char *const ssp1601_disassembler::reg[16] = { "-", "X", "Y", "A", "ST", "STACK", "PC", "P", @@ -20,22 +20,22 @@ static const char *const reg[16] = "EXT4", "EXT5", "EXT6", "AL" }; -static const char *const rij[8] = +const char *const ssp1601_disassembler::rij[8] = { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7" }; -static const char *const modifier[4] = +const char *const ssp1601_disassembler::modifier[4] = { "", "+!", "-", "+" }; -static const char *const modifier_sf[4] = +const char *const ssp1601_disassembler::modifier_sf[4] = { "|00", "|01", "|10", "|11" }; -static const char *const cond[16] = +const char *const ssp1601_disassembler::cond[16] = { "always", "RESERVED", "gpi0", "gpi1", "l", "z", "ov", "n", @@ -43,18 +43,18 @@ static const char *const cond[16] = "RESERVED", "RESERVED", "RESERVED", "RESERVED", }; -static const char *const acc_op[8] = +const char *const ssp1601_disassembler::acc_op[8] = { "ror", "rol", "shr", "shl", "inc", "dec", "neg", "abs" }; // pag. 81 uses different addresses! -static const char *const flag_op[16] = +const char *const ssp1601_disassembler::flag_op[16] = { "?", "?", "resl", "setl", "resie", "setie", "?", "?", "resop", "setop", "?", "?", "?", "?", "res", "set" }; -static const char *const arith_ops[8] = +const char *const ssp1601_disassembler::arith_ops[8] = { "", "add", "", "cmp", "add", "and", "or", "eor" }; @@ -68,27 +68,24 @@ static const char *const arith_ops[8] = #define MODIFIER_LOW MODIFIER((op >> 2) & 3, op&3) #define MODIFIER_HIGH MODIFIER((op >> 6) & 3, (op >> 4)&3) -#define READ_OP_DASM(p) ((base_oprom[p] << 8) | base_oprom[(p) + 1]) - -static char *get_cond(int op) +std::string ssp1601_disassembler::get_cond(int op) { - static char scond[16]; - if (op&0xf0) sprintf(scond, "%s=%i", cond[(op >> 4) & 0xf], BIT_B); - else sprintf(scond, "%s", cond[(op >> 4) & 0xf]); - return scond; + if (op&0xf0) return util::string_format("%s=%i", cond[(op >> 4) & 0xf], BIT_B); + else return util::string_format("%s", cond[(op >> 4) & 0xf]); } +u32 ssp1601_disassembler::opcode_alignment() const +{ + return 1; +} -static unsigned dasm_ssp1601(std::ostream &stream, unsigned pc, const uint8_t *oprom) +offs_t ssp1601_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { - const uint8_t *base_oprom; uint16_t op; int size = 1; int flags = 0; - base_oprom = oprom; - - op = READ_OP_DASM(0); + op = opcodes.r16(pc); switch (op >> 9) { @@ -102,7 +99,7 @@ static unsigned dasm_ssp1601(std::ostream &stream, unsigned pc, const uint8_t *o { // ret util::stream_format(stream, "ret"); - flags |= DASMFLAG_STEP_OUT; + flags |= STEP_OUT; } else { @@ -128,7 +125,7 @@ static unsigned dasm_ssp1601(std::ostream &stream, unsigned pc, const uint8_t *o // ldi d, imm case 0x04: - util::stream_format(stream, "ld %s, %X", reg[(op >> 4) & 0xf], READ_OP_DASM(2)); + util::stream_format(stream, "ld %s, %X", reg[(op >> 4) & 0xf], opcodes.r16(pc+1)); size = 2; break; @@ -139,7 +136,7 @@ static unsigned dasm_ssp1601(std::ostream &stream, unsigned pc, const uint8_t *o // ldi (ri), imm case 0x06: - util::stream_format(stream, "ld (%s%s), %X", RIJ, MODIFIER_LOW, READ_OP_DASM(2)); + util::stream_format(stream, "ld (%s%s), %X", RIJ, MODIFIER_LOW, opcodes.r16(pc+1)); size = 2; break; @@ -203,7 +200,7 @@ static unsigned dasm_ssp1601(std::ostream &stream, unsigned pc, const uint8_t *o case 0x54: case 0x64: case 0x74: - util::stream_format(stream, "%si A, %X", arith_ops[op >> 13], READ_OP_DASM(2)); + util::stream_format(stream, "%si A, %X", arith_ops[op >> 13], opcodes.r16(pc+1)); size = 2; break; @@ -244,8 +241,8 @@ static unsigned dasm_ssp1601(std::ostream &stream, unsigned pc, const uint8_t *o // call cond, addr case 0x24: - util::stream_format(stream, "call %s, %X", get_cond(op), READ_OP_DASM(2)); - flags |= DASMFLAG_STEP_OVER; + util::stream_format(stream, "call %s, %X", get_cond(op), opcodes.r16(pc+1)); + flags |= STEP_OVER; size = 2; break; @@ -256,7 +253,7 @@ static unsigned dasm_ssp1601(std::ostream &stream, unsigned pc, const uint8_t *o // bra cond, addr case 0x26: - util::stream_format(stream, "bra %s, %X", get_cond(op), READ_OP_DASM(2)); + util::stream_format(stream, "bra %s, %X", get_cond(op), opcodes.r16(pc+1)); size = 2; break; @@ -285,14 +282,5 @@ static unsigned dasm_ssp1601(std::ostream &stream, unsigned pc, const uint8_t *o break; } - return size | flags | DASMFLAG_SUPPORTED; -} - -// vim:ts=4 - -CPU_DISASSEMBLE( ssp1601 ) -{ - //ssp1601_state_t *ssp1601_state = get_safe_token(device); - - return dasm_ssp1601(stream, pc, oprom); + return size | flags | SUPPORTED; } |