diff options
Diffstat (limited to 'src/mame/drivers/vgmplay.cpp')
-rw-r--r-- | src/mame/drivers/vgmplay.cpp | 232 |
1 files changed, 120 insertions, 112 deletions
diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp index 0a5b117c45c..ed094c13dbe 100644 --- a/src/mame/drivers/vgmplay.cpp +++ b/src/mame/drivers/vgmplay.cpp @@ -37,6 +37,16 @@ #define AS_IO16 1 #define MCFG_CPU_IO16_MAP MCFG_CPU_DATA_MAP +class vgmplay_disassembler : public util::disasm_interface +{ +public: + vgmplay_disassembler() = default; + virtual ~vgmplay_disassembler() = default; + + virtual uint32_t opcode_alignment() const override; + virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; +}; + class vgmplay_device : public cpu_device { public: @@ -90,9 +100,7 @@ public: virtual void state_export(const device_state_entry &entry) override; virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; - virtual uint32_t disasm_min_opcode_bytes() const override; - virtual uint32_t disasm_max_opcode_bytes() const override; - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; READ8_MEMBER(segapcm_rom_r); READ8_MEMBER(ymf271_rom_r); @@ -580,104 +588,104 @@ void vgmplay_device::state_string_export(const device_state_entry &entry, std::s { } -uint32_t vgmplay_device::disasm_min_opcode_bytes() const +util::disasm_interface *vgmplay_device::create_disassembler() { - return 1; + return new vgmplay_disassembler; } -uint32_t vgmplay_device::disasm_max_opcode_bytes() const +uint32_t vgmplay_disassembler::opcode_alignment() const { - return 9; + return 1; } -offs_t vgmplay_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { - switch(oprom[0]) { + switch(opcodes.r8(pc)) { case 0x4f: - util::stream_format(stream, "psg r06 = %02x", oprom[1]); - return 2 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "psg r06 = %02x", opcodes.r8(pc+1)); + return 2 | SUPPORTED; case 0x50: - util::stream_format(stream, "psg write %02x", oprom[1]); - return 2 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "psg write %02x", opcodes.r8(pc+1)); + return 2 | SUPPORTED; case 0x51: - util::stream_format(stream, "ym2413 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ym2413 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x52: - util::stream_format(stream, "ym2612.0 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ym2612.0 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x53: - util::stream_format(stream, "ym2612.1 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ym2612.1 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x54: - util::stream_format(stream, "ym2151 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ym2151 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x55: - util::stream_format(stream, "ym2203a r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ym2203a r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x56: - util::stream_format(stream, "ym2608.0 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ym2608.0 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x57: - util::stream_format(stream, "ym2608.1 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ym2608.1 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x58: - util::stream_format(stream, "ym2610.0 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ym2610.0 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x59: - util::stream_format(stream, "ym2610.1 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ym2610.1 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x5a: - util::stream_format(stream, "ym3812 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ym3812 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x5b: - util::stream_format(stream, "ym3526 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ym3526 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x5c: - util::stream_format(stream, "y8950 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "y8950 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x5d: - util::stream_format(stream, "ymz280b r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ymz280b r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x5e: - util::stream_format(stream, "ymf262.0 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ymf262.0 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x5f: - util::stream_format(stream, "ymf262.1 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ymf262.1 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0x61: { - uint32_t duration = oprom[1] | (oprom[2] << 8); + uint32_t duration = opcodes.r8(pc+1) | (opcodes.r8(pc+2) << 8); util::stream_format(stream, "wait %d", duration); - return 3 | DASMFLAG_SUPPORTED; + return 3 | SUPPORTED; } case 0x62: util::stream_format(stream, "wait 735"); - return 1 | DASMFLAG_SUPPORTED; + return 1 | SUPPORTED; case 0x63: util::stream_format(stream, "wait 882"); - return 1 | DASMFLAG_SUPPORTED; + return 1 | SUPPORTED; case 0x66: util::stream_format(stream, "end"); - return 1 | DASMFLAG_SUPPORTED; + return 1 | SUPPORTED; case 0x67: { static const char *const basic_types[8] = { @@ -725,8 +733,8 @@ offs_t vgmplay_device::disasm_disassemble(std::ostream &stream, offs_t pc, const "es5503 ram" }; - uint8_t type = oprom[2]; - uint32_t size = oprom[3] | (oprom[4] << 8) | (oprom[5] << 16) | (oprom[6] << 24); + uint8_t type = opcodes.r8(pc+2); + uint32_t size = opcodes.r8(pc+3) | (opcodes.r8(pc+4) << 8) | (opcodes.r8(pc+5) << 16) | (opcodes.r8(pc+6) << 24); if(type < 0x8) util::stream_format(stream, "data-block %x, %s", size, basic_types[type]); else if(type < 0x40) @@ -736,7 +744,7 @@ offs_t vgmplay_device::disasm_disassemble(std::ostream &stream, offs_t pc, const else if(type < 0x7f) util::stream_format(stream, "data-block %x comp., %02x", size, type & 0x3f); else if(type < 0x80) - util::stream_format(stream, "decomp-table %x, %02x/%02x", size, oprom[7], oprom[8]); + util::stream_format(stream, "decomp-table %x, %02x/%02x", size, opcodes.r8(pc+7), opcodes.r8(pc+8)); else if(type < 0x94) util::stream_format(stream, "data-block %x, %s", size, rom_types[type & 0x7f]); else if(type < 0xc0) @@ -749,135 +757,135 @@ offs_t vgmplay_device::disasm_disassemble(std::ostream &stream, offs_t pc, const util::stream_format(stream, "data-block %x, %s", size, ram2_types[type & 0x1f]); else util::stream_format(stream, "data-block %x, ram %02x", size, type); - return (7+size) | DASMFLAG_SUPPORTED; + return (7+size) | SUPPORTED; } case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: - util::stream_format(stream, "wait %d", 1+(oprom[0] & 0x0f)); - return 1 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "wait %d", 1+(opcodes.r8(pc) & 0x0f)); + return 1 | SUPPORTED; case 0x80: util::stream_format(stream, "ym2612.0 r2a = rom++"); - return 1 | DASMFLAG_SUPPORTED; + return 1 | SUPPORTED; case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f: - util::stream_format(stream, "ym2612.0 r2a = rom++; wait %d", oprom[0] & 0xf); - return 1 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ym2612.0 r2a = rom++; wait %d", opcodes.r8(pc) & 0xf); + return 1 | SUPPORTED; case 0xa0: - util::stream_format(stream, "ay8910 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ay8910 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0xa5: - util::stream_format(stream, "ym2203b r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ym2203b r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0xb0: - util::stream_format(stream, "rf5c68 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "rf5c68 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0xb1: - util::stream_format(stream, "rf5c164 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "rf5c164 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0xb2: - util::stream_format(stream, "pwm r%x = %03x", oprom[1] >> 4, oprom[2] | ((oprom[1] & 0xf) << 8)); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "pwm r%x = %03x", opcodes.r8(pc+1) >> 4, opcodes.r8(pc+2) | ((opcodes.r8(pc+1) & 0xf) << 8)); + return 3 | SUPPORTED; case 0xb3: - util::stream_format(stream, "dmg r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "dmg r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0xb4: - util::stream_format(stream, "nesapu r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "nesapu r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0xb5: - util::stream_format(stream, "multipcm r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "multipcm r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0xb6: - util::stream_format(stream, "upd7759 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "upd7759 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0xb7: - util::stream_format(stream, "okim6258 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "okim6258 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0xb8: - util::stream_format(stream, "okim6295 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "okim6295 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0xb9: - util::stream_format(stream, "huc6280 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "huc6280 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0xba: - util::stream_format(stream, "k053260 r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "k053260 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0xbb: - util::stream_format(stream, "pokey r%02x = %02x", oprom[1], oprom[2]); - return 3 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "pokey r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + return 3 | SUPPORTED; case 0xc0: - util::stream_format(stream, "segapcm %04x = %02x", oprom[1] | (oprom[2] << 8), oprom[3]); - return 4 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "segapcm %04x = %02x", opcodes.r8(pc+1) | (opcodes.r8(pc+2) << 8), opcodes.r8(pc+3)); + return 4 | SUPPORTED; case 0xc1: - util::stream_format(stream, "rf5c68 %04x = %02x", oprom[1] | (oprom[2] << 8), oprom[3]); - return 4 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "rf5c68 %04x = %02x", opcodes.r8(pc+1) | (opcodes.r8(pc+2) << 8), opcodes.r8(pc+3)); + return 4 | SUPPORTED; case 0xc2: - util::stream_format(stream, "rf5c163 %04x = %02x", oprom[1] | (oprom[2] << 8), oprom[3]); - return 4 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "rf5c163 %04x = %02x", opcodes.r8(pc+1) | (opcodes.r8(pc+2) << 8), opcodes.r8(pc+3)); + return 4 | SUPPORTED; case 0xc3: - util::stream_format(stream, "multipcm c%02x.off = %04x", oprom[1], oprom[2] | (oprom[3] << 8)); - return 4 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "multipcm c%02x.off = %04x", opcodes.r8(pc+1), opcodes.r8(pc+2) | (opcodes.r8(pc+3) << 8)); + return 4 | SUPPORTED; case 0xc4: - util::stream_format(stream, "qsound %02x = %04x", oprom[3], oprom[2] | (oprom[1] << 8)); - return 4 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "qsound %02x = %04x", opcodes.r8(pc+3), opcodes.r8(pc+2) | (opcodes.r8(pc+1) << 8)); + return 4 | SUPPORTED; case 0xd0: - util::stream_format(stream, "ymf278b r%02x.%02x = %02x", oprom[1], oprom[2], oprom[3]); - return 4 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ymf278b r%02x.%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2), opcodes.r8(pc+3)); + return 4 | SUPPORTED; case 0xd1: - util::stream_format(stream, "ymf271 r%02x.%02x = %02x", oprom[1], oprom[2], oprom[3]); - return 4 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "ymf271 r%02x.%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2), opcodes.r8(pc+3)); + return 4 | SUPPORTED; case 0xd2: - util::stream_format(stream, "scc1 r%02x.%02x = %02x", oprom[1], oprom[2], oprom[3]); - return 4 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "scc1 r%02x.%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2), opcodes.r8(pc+3)); + return 4 | SUPPORTED; case 0xd3: - util::stream_format(stream, "k054539 r%02x.%02x = %02x", oprom[1], oprom[2], oprom[3]); - return 4 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "k054539 r%02x.%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2), opcodes.r8(pc+3)); + return 4 | SUPPORTED; case 0xd4: - util::stream_format(stream, "c140 r%02x.%02x = %02x", oprom[1], oprom[2], oprom[3]); - return 4 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "c140 r%02x.%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2), opcodes.r8(pc+3)); + return 4 | SUPPORTED; case 0xe0: { - uint32_t off = oprom[1] | (oprom[2] << 8) | (oprom[3] << 16) | (oprom[4] << 24); + uint32_t off = opcodes.r8(pc+1) | (opcodes.r8(pc+2) << 8) | (opcodes.r8(pc+3) << 16) | (opcodes.r8(pc+4) << 24); util::stream_format(stream, "ym2612 offset = %x", off); - return 5 | DASMFLAG_SUPPORTED; + return 5 | SUPPORTED; } case 0xe1: { - uint16_t addr = (oprom[1] << 8) | oprom[2]; - uint16_t data = (oprom[3] << 8) | oprom[4]; + uint16_t addr = (opcodes.r8(pc+1) << 8) | opcodes.r8(pc+2); + uint16_t data = (opcodes.r8(pc+3) << 8) | opcodes.r8(pc+4); util::stream_format(stream, "c352 r%04x = %04x", addr, data); - return 5 | DASMFLAG_SUPPORTED; + return 5 | SUPPORTED; } default: - util::stream_format(stream, "?? %02x", oprom[0]); - return 1 | DASMFLAG_SUPPORTED; + util::stream_format(stream, "?? %02x", opcodes.r8(pc)); + return 1 | SUPPORTED; } } |