diff options
author | 2015-06-04 21:42:58 +0200 | |
---|---|---|
committer | 2015-06-24 08:43:34 +0200 | |
commit | 88949a5b47798b3c82851c31b6f801e4fb8ca06f (patch) | |
tree | 7929d5f4beb47f8f6b61fe2a2b89f2302f3df19c | |
parent | d1583b9850d9fb45470648a515eb734e05fd926f (diff) |
memory: Remove support for decrypted bases, use an address space instead [O. Galibert]
276 files changed, 3441 insertions, 3018 deletions
diff --git a/docs/m6502.txt b/docs/m6502.txt index c4517a4329a..d09954719bd 100644 --- a/docs/m6502.txt +++ b/docs/m6502.txt @@ -233,8 +233,8 @@ subclass has been created. It's called memory_interface, declared in m6502_device, and provides the following accessors: - UINT8 read(UINT16 adr) - normal read -- UINT8 read_direct(UINT16 adr) - direct read -- UINT8 read_decrypted(UINT16 adr) - decrypted data read +- UINT8 read_sync(UINT16 adr) - opcode read with sync active (first byte of opcode) +- UINT8 read_arg(UINT16 adr) - opcode read with sync inactive (rest of opcode) - void write(UINT16 adr, UINT8 val) - normal write - UINT8 read_9(UINT16 adr) - special y-indexed 6509 read, defaults to read() diff --git a/src/emu/cpu/8x300/8x300.c b/src/emu/cpu/8x300/8x300.c index 0bbc7eec3d6..bf6a5148ca5 100644 --- a/src/emu/cpu/8x300/8x300.c +++ b/src/emu/cpu/8x300/8x300.c @@ -12,7 +12,7 @@ #include "debugger.h" #include "8x300.h" -#define FETCHOP(a) (m_direct->read_decrypted_word(a)) +#define FETCHOP(a) (m_direct->read_word(a)) #define CYCLES(x) do { m_icount -= (x); } while (0) #define READPORT(a) (m_io->read_byte(a)) #define WRITEPORT(a,v) (m_io->write_byte((a), (v))) diff --git a/src/emu/cpu/adsp2100/adsp2100.c b/src/emu/cpu/adsp2100/adsp2100.c index 3c3a5e7049c..8142a6a7a34 100644 --- a/src/emu/cpu/adsp2100/adsp2100.c +++ b/src/emu/cpu/adsp2100/adsp2100.c @@ -811,7 +811,7 @@ inline void adsp21xx_device::program_write(UINT32 addr, UINT32 data) inline UINT32 adsp21xx_device::opcode_read() { - return m_direct->read_decrypted_dword(m_pc << 2); + return m_direct->read_dword(m_pc << 2); } diff --git a/src/emu/cpu/alph8201/alph8201.h b/src/emu/cpu/alph8201/alph8201.h index 3431627a6ee..16555803988 100644 --- a/src/emu/cpu/alph8201/alph8201.h +++ b/src/emu/cpu/alph8201/alph8201.h @@ -72,8 +72,8 @@ protected: UINT8 M_RDMEM(UINT16 A) { return m_program->read_byte(A); } void M_WRMEM(UINT16 A,UINT8 V) { m_program->write_byte(A, V); } - UINT8 M_RDOP(UINT16 A) { return m_direct->read_decrypted_byte(A); } - UINT8 M_RDOP_ARG(UINT16 A) { return m_direct->read_raw_byte(A); } + UINT8 M_RDOP(UINT16 A) { return m_direct->read_byte(A); } + UINT8 M_RDOP_ARG(UINT16 A) { return m_direct->read_byte(A); } UINT8 RD_REG(UINT8 x) { return m_RAM[(m_regPtr<<3)+(x)]; } void WR_REG(UINT8 x, UINT8 d) { m_RAM[(m_regPtr<<3)+(x)]=(d); } diff --git a/src/emu/cpu/am29000/am29000.c b/src/emu/cpu/am29000/am29000.c index ee0dd825a60..27924fa163f 100644 --- a/src/emu/cpu/am29000/am29000.c +++ b/src/emu/cpu/am29000/am29000.c @@ -479,7 +479,7 @@ UINT32 am29000_cpu_device::read_program_word(UINT32 address) { /* TODO: ROM enable? */ if (m_cps & CPS_PI || m_cps & CPS_RE) - return m_direct->read_decrypted_dword(address); + return m_direct->read_dword(address); else { fatalerror("Am29000 instruction MMU translation enabled!\n"); @@ -626,7 +626,7 @@ void am29000_cpu_device::execute_run() if (m_cfg & CFG_VF) { UINT32 vaddr = m_vab | m_exception_queue[0] * 4; - UINT32 vect = m_datadirect->read_decrypted_dword(vaddr); + UINT32 vect = m_datadirect->read_dword(vaddr); m_pc = vect & ~3; m_next_pc = m_pc; diff --git a/src/emu/cpu/arm/arm.c b/src/emu/cpu/arm/arm.c index 3b2b410bf58..8d9b420486d 100644 --- a/src/emu/cpu/arm/arm.c +++ b/src/emu/cpu/arm/arm.c @@ -345,7 +345,7 @@ void arm_cpu_device::execute_run() /* load instruction */ pc = R15; - insn = m_direct->read_decrypted_dword( pc & ADDRESS_MASK ); + insn = m_direct->read_dword( pc & ADDRESS_MASK ); switch (insn >> INSN_COND_SHIFT) { diff --git a/src/emu/cpu/arm7/arm7.c b/src/emu/cpu/arm7/arm7.c index 65125f265f6..65cae0871ac 100644 --- a/src/emu/cpu/arm7/arm7.c +++ b/src/emu/cpu/arm7/arm7.c @@ -641,7 +641,7 @@ void arm7_cpu_device::execute_run() } } - insn = m_direct->read_decrypted_word(raddr); + insn = m_direct->read_word(raddr); (this->*thumb_handler[(insn & 0xffc0) >> 6])(pc, insn); } @@ -672,7 +672,7 @@ void arm7_cpu_device::execute_run() } #endif - insn = m_direct->read_decrypted_dword(raddr); + insn = m_direct->read_dword(raddr); /* process condition codes for this instruction */ switch (insn >> INSN_COND_SHIFT) diff --git a/src/emu/cpu/arm7/arm7drc.inc b/src/emu/cpu/arm7/arm7drc.inc index fc97e35da1f..c30ee7a6de4 100644 --- a/src/emu/cpu/arm7/arm7drc.inc +++ b/src/emu/cpu/arm7/arm7drc.inc @@ -1203,12 +1203,12 @@ void arm7_cpu_device::generate_checksum_block(drcuml_block *block, compiler_stat if (!(seqhead->flags & OPFLAG_VIRTUAL_NOOP)) { UINT32 sum = seqhead->opptr.l[0]; - void *base = m_direct->read_decrypted_ptr(seqhead->physpc); + void *base = m_direct->read_ptr(seqhead->physpc); UML_LOAD(block, uml::I0, base, 0, uml::SIZE_DWORD, uml::SCALE_x4); // load i0,base,0,dword if (seqhead->delay.first() != NULL && seqhead->physpc != seqhead->delay.first()->physpc) { - base = m_direct->read_decrypted_ptr(seqhead->delay.first()->physpc); + base = m_direct->read_ptr(seqhead->delay.first()->physpc); UML_LOAD(block, uml::I1, base, 0, uml::SIZE_DWORD, uml::SCALE_x4); // load i1,base,dword UML_ADD(block, uml::I0, uml::I0, uml::I1); // add i0,i0,i1 @@ -1224,20 +1224,20 @@ void arm7_cpu_device::generate_checksum_block(drcuml_block *block, compiler_stat else { UINT32 sum = 0; - void *base = m_direct->read_decrypted_ptr(seqhead->physpc); + void *base = m_direct->read_ptr(seqhead->physpc); UML_LOAD(block, uml::I0, base, 0, uml::SIZE_DWORD, uml::SCALE_x4); // load i0,base,0,dword sum += seqhead->opptr.l[0]; for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next()) if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP)) { - base = m_direct->read_decrypted_ptr(curdesc->physpc); + base = m_direct->read_ptr(curdesc->physpc); UML_LOAD(block, uml::I1, base, 0, uml::SIZE_DWORD, uml::SCALE_x4); // load i1,base,dword UML_ADD(block, uml::I0, uml::I0, uml::I1); // add i0,i0,i1 sum += curdesc->opptr.l[0]; if (curdesc->delay.first() != NULL && (curdesc == seqlast || (curdesc->next() != NULL && curdesc->next()->physpc != curdesc->delay.first()->physpc))) { - base = m_direct->read_decrypted_ptr(curdesc->delay.first()->physpc); + base = m_direct->read_ptr(curdesc->delay.first()->physpc); UML_LOAD(block, uml::I1, base, 0, uml::SIZE_DWORD, uml::SCALE_x4); // load i1,base,dword UML_ADD(block, uml::I0, uml::I0, uml::I1); // add i0,i0,i1 sum += curdesc->delay.first()->opptr.l[0]; diff --git a/src/emu/cpu/asap/asap.c b/src/emu/cpu/asap/asap.c index 1402ef8e442..21133e46975 100644 --- a/src/emu/cpu/asap/asap.c +++ b/src/emu/cpu/asap/asap.c @@ -343,7 +343,7 @@ offs_t asap_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *opr inline UINT32 asap_device::readop(offs_t pc) { - return m_direct->read_decrypted_dword(pc); + return m_direct->read_dword(pc); } diff --git a/src/emu/cpu/ccpu/ccpu.c b/src/emu/cpu/ccpu/ccpu.c index a06ac8e003e..e8893580f0c 100644 --- a/src/emu/cpu/ccpu/ccpu.c +++ b/src/emu/cpu/ccpu/ccpu.c @@ -22,7 +22,7 @@ const device_type CCPU = &device_creator<ccpu_cpu_device>; MACROS ***************************************************************************/ -#define READOP(a) (m_direct->read_decrypted_byte(a)) +#define READOP(a) (m_direct->read_byte(a)) #define RDMEM(a) (m_data->read_word((a) * 2) & 0xfff) #define WRMEM(a,v) (m_data->write_word((a) * 2, (v))) diff --git a/src/emu/cpu/cop400/cop400.c b/src/emu/cpu/cop400/cop400.c index c52c1d18299..eca60705b2c 100644 --- a/src/emu/cpu/cop400/cop400.c +++ b/src/emu/cpu/cop400/cop400.c @@ -97,7 +97,7 @@ const device_type COP445 = &device_creator<cop445_cpu_device>; MACROS ***************************************************************************/ -#define ROM(a) m_direct->read_decrypted_byte(a) +#define ROM(a) m_direct->read_byte(a) #define RAM_R(a) m_data->read_byte(a) #define RAM_W(a, v) m_data->write_byte(a, v) diff --git a/src/emu/cpu/cosmac/cosmac.c b/src/emu/cpu/cosmac/cosmac.c index f33e5869725..f011e37a47a 100644 --- a/src/emu/cpu/cosmac/cosmac.c +++ b/src/emu/cpu/cosmac/cosmac.c @@ -533,7 +533,7 @@ offs_t cdp1802_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 * inline UINT8 cosmac_device::read_opcode(offs_t pc) { - return m_direct->read_decrypted_byte(pc); + return m_direct->read_byte(pc); } diff --git a/src/emu/cpu/cubeqcpu/cubeqcpu.c b/src/emu/cpu/cubeqcpu/cubeqcpu.c index 7b79940c998..2e263b6bac4 100644 --- a/src/emu/cpu/cubeqcpu/cubeqcpu.c +++ b/src/emu/cpu/cubeqcpu/cubeqcpu.c @@ -520,7 +520,7 @@ void cquestsnd_cpu_device::execute_run() do { /* Decode the instruction */ - UINT64 inst = m_direct->read_decrypted_qword(SND_PC << 3); + UINT64 inst = m_direct->read_qword(SND_PC << 3); UINT32 inslow = inst & 0xffffffff; UINT32 inshig = inst >> 32; @@ -776,7 +776,7 @@ void cquestrot_cpu_device::execute_run() do { /* Decode the instruction */ - UINT64 inst = m_direct->read_decrypted_qword(ROT_PC << 3); + UINT64 inst = m_direct->read_qword(ROT_PC << 3); UINT32 inslow = inst & 0xffffffff; UINT32 inshig = inst >> 32; @@ -1196,7 +1196,7 @@ void cquestlin_cpu_device::execute_run() int prog = (m_clkcnt & 3) ? BACKGROUND : FOREGROUND; m_curpc = LINE_PC; - UINT64 inst = m_direct->read_decrypted_qword(LINE_PC << 3); + UINT64 inst = m_direct->read_qword(LINE_PC << 3); UINT32 inslow = inst & 0xffffffff; UINT32 inshig = inst >> 32; diff --git a/src/emu/cpu/dsp16/dsp16.c b/src/emu/cpu/dsp16/dsp16.c index 565377eb714..9f1de0c79f6 100644 --- a/src/emu/cpu/dsp16/dsp16.c +++ b/src/emu/cpu/dsp16/dsp16.c @@ -373,7 +373,7 @@ inline void dsp16_device::data_write(const UINT16& addr, const UINT16& data) inline UINT32 dsp16_device::opcode_read(const UINT8 pcOffset) { const UINT16 readPC = m_pc + pcOffset; - return m_direct->read_decrypted_dword(readPC << 1); + return m_direct->read_dword(readPC << 1); } diff --git a/src/emu/cpu/dsp32/dsp32.c b/src/emu/cpu/dsp32/dsp32.c index 2de5e6f50d6..21de1f18a74 100644 --- a/src/emu/cpu/dsp32/dsp32.c +++ b/src/emu/cpu/dsp32/dsp32.c @@ -437,7 +437,7 @@ offs_t dsp32c_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *o inline UINT32 dsp32c_device::ROPCODE(offs_t pc) { - return m_direct->read_decrypted_dword(pc); + return m_direct->read_dword(pc); } inline UINT8 dsp32c_device::RBYTE(offs_t addr) diff --git a/src/emu/cpu/dsp56k/dsp56k.c b/src/emu/cpu/dsp56k/dsp56k.c index 408521ea8fc..6855b46a97d 100644 --- a/src/emu/cpu/dsp56k/dsp56k.c +++ b/src/emu/cpu/dsp56k/dsp56k.c @@ -144,7 +144,7 @@ DIRECT_UPDATE_MEMBER( dsp56k_device::dsp56k_direct_handler ) /*************************************************************************** MEMORY ACCESSORS ***************************************************************************/ -#define ROPCODE(pc) cpustate->direct->read_decrypted_word(pc) +#define ROPCODE(pc) cpustate->direct->read_word(pc) /*************************************************************************** diff --git a/src/emu/cpu/e132xs/e132xs.h b/src/emu/cpu/e132xs/e132xs.h index f10c9983d50..c8f43641ff5 100644 --- a/src/emu/cpu/e132xs/e132xs.h +++ b/src/emu/cpu/e132xs/e132xs.h @@ -199,7 +199,7 @@ extern unsigned dasm_hyperstone(char *buffer, unsigned pc, const UINT8 *oprom, u #define IO_WRITE_W(addr, data) m_io->write_dword(((addr) >> 11) & 0x7ffc, data) -#define READ_OP(addr) m_direct->read_decrypted_word((addr), m_opcodexor) +#define READ_OP(addr) m_direct->read_word((addr), m_opcodexor) //************************************************************************** // TYPE DEFINITIONS diff --git a/src/emu/cpu/esrip/esrip.c b/src/emu/cpu/esrip/esrip.c index 22570346fc8..482a1ddec8d 100644 --- a/src/emu/cpu/esrip/esrip.c +++ b/src/emu/cpu/esrip/esrip.c @@ -1901,7 +1901,7 @@ void esrip_device::execute_run() m_pl7 = m_l7; /* Latch instruction */ - inst = m_direct->read_decrypted_qword(RIP_PC << 3); + inst = m_direct->read_qword(RIP_PC << 3); in_h = inst >> 32; in_l = inst & 0xffffffff; diff --git a/src/emu/cpu/f8/f8.c b/src/emu/cpu/f8/f8.c index 0199c54b743..182638543d7 100644 --- a/src/emu/cpu/f8/f8.c +++ b/src/emu/cpu/f8/f8.c @@ -96,7 +96,7 @@ void f8_cpu_device::ROMC_00(int insttim) /* SKR - added parameter to tell if */ * of PC0. */ - m_dbus = m_direct->read_decrypted_byte(m_pc0); + m_dbus = m_direct->read_byte(m_pc0); m_pc0 += 1; m_icount -= insttim; /* SKR - ROMC00 is usually short, not short+long, */ /* but DS is long */ @@ -110,7 +110,7 @@ void f8_cpu_device::ROMC_01() * location addressed by PC0; then all devices add the 8-bit value * on the data bus as signed binary number to PC0. */ - m_dbus = m_direct->read_raw_byte(m_pc0); + m_dbus = m_direct->read_byte(m_pc0); m_pc0 += (INT8)m_dbus; m_icount -= cL; } @@ -134,7 +134,7 @@ void f8_cpu_device::ROMC_03(int insttim) /* SKR - added parameter to tell if */ * Similiar to 0x00, except that it is used for immediate operands * fetches (using PC0) instead of instruction fetches. */ - m_dbus = m_io = m_direct->read_raw_byte(m_pc0); + m_dbus = m_io = m_direct->read_byte(m_pc0); m_pc0 += 1; m_icount -= insttim; } @@ -228,7 +228,7 @@ void f8_cpu_device::ROMC_0C() * by PC0 into the data bus; then all devices move the value that * has just been placed on the data bus into the low order byte of PC0. */ - m_dbus = m_direct->read_raw_byte(m_pc0); + m_dbus = m_direct->read_byte(m_pc0); m_pc0 = (m_pc0 & 0xff00) | m_dbus; m_icount -= cL; } @@ -251,7 +251,7 @@ void f8_cpu_device::ROMC_0E() * The value on the data bus is then moved to the low order byte * of DC0 by all devices. */ - m_dbus = m_direct->read_raw_byte(m_pc0); + m_dbus = m_direct->read_byte(m_pc0); m_dc0 = (m_dc0 & 0xff00) | m_dbus; m_icount -= cL; } @@ -289,7 +289,7 @@ void f8_cpu_device::ROMC_11() * data bus. All devices must then move the contents of the * data bus to the upper byte of DC0. */ - m_dbus = m_direct->read_raw_byte(m_pc0); + m_dbus = m_direct->read_byte(m_pc0); m_dc0 = (m_dc0 & 0x00ff) | (m_dbus << 8); m_icount -= cL; } diff --git a/src/emu/cpu/h6280/h6280.c b/src/emu/cpu/h6280/h6280.c index 0740ba7e8ad..f92e0520a12 100644 --- a/src/emu/cpu/h6280/h6280.c +++ b/src/emu/cpu/h6280/h6280.c @@ -2388,7 +2388,7 @@ void h6280_device::pull(UINT8 &value) ***************************************************************/ UINT8 h6280_device::read_opcode() { - return m_direct->read_decrypted_byte(translated(PCW)); + return m_direct->read_byte(translated(PCW)); } /*************************************************************** @@ -2396,7 +2396,7 @@ UINT8 h6280_device::read_opcode() ***************************************************************/ UINT8 h6280_device::read_opcode_arg() { - return m_direct->read_raw_byte(translated(PCW)); + return m_direct->read_byte(translated(PCW)); } diff --git a/src/emu/cpu/h8/h8.c b/src/emu/cpu/h8/h8.c index fb6b9875fd0..9084c0b76fa 100644 --- a/src/emu/cpu/h8/h8.c +++ b/src/emu/cpu/h8/h8.c @@ -511,7 +511,7 @@ offs_t h8_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom UINT16 h8_device::read16i(UINT32 adr) { icount--; - return direct->read_decrypted_word(adr & ~1); + return direct->read_word(adr & ~1); } UINT16 h8_device::fetch() diff --git a/src/emu/cpu/hphybrid/hphybrid.c b/src/emu/cpu/hphybrid/hphybrid.c index 691e7d56711..dad427a5f0c 100644 --- a/src/emu/cpu/hphybrid/hphybrid.c +++ b/src/emu/cpu/hphybrid/hphybrid.c @@ -831,7 +831,7 @@ UINT16 hp_hybrid_cpu_device::RM(UINT16 addr) return 0; } } else { - return m_direct->read_decrypted_word((offs_t)addr << 1); + return m_direct->read_word((offs_t)addr << 1); } } diff --git a/src/emu/cpu/i386/i386priv.h b/src/emu/cpu/i386/i386priv.h index c7bb5d6ffb5..138079a5fae 100644 --- a/src/emu/cpu/i386/i386priv.h +++ b/src/emu/cpu/i386/i386priv.h @@ -543,7 +543,7 @@ UINT8 i386_device::FETCH() if(!translate_address(m_CPL,TRANSLATE_FETCH,&address,&error)) PF_THROW(error); - value = m_direct->read_decrypted_byte(address & m_a20_mask); + value = m_direct->read_byte(address & m_a20_mask); #ifdef DEBUG_MISSING_OPCODE m_opcode_bytes[m_opcode_bytes_length] = value; m_opcode_bytes_length = (m_opcode_bytes_length + 1) & 15; @@ -564,7 +564,7 @@ UINT16 i386_device::FETCH16() if(!translate_address(m_CPL,TRANSLATE_FETCH,&address,&error)) PF_THROW(error); address &= m_a20_mask; - value = m_direct->read_decrypted_word(address); + value = m_direct->read_word(address); m_eip += 2; m_pc += 2; } @@ -585,7 +585,7 @@ UINT32 i386_device::FETCH32() PF_THROW(error); address &= m_a20_mask; - value = m_direct->read_decrypted_dword(address); + value = m_direct->read_dword(address); m_eip += 4; m_pc += 4; } diff --git a/src/emu/cpu/i4004/i4004.c b/src/emu/cpu/i4004/i4004.c index 23b1721df3a..c6e65cb27ee 100644 --- a/src/emu/cpu/i4004/i4004.c +++ b/src/emu/cpu/i4004/i4004.c @@ -36,7 +36,7 @@ i4004_cpu_device::i4004_cpu_device(const machine_config &mconfig, const char *ta UINT8 i4004_cpu_device::ROP() { - UINT8 retVal = m_direct->read_decrypted_byte(GET_PC.w.l); + UINT8 retVal = m_direct->read_byte(GET_PC.w.l); GET_PC.w.l = (GET_PC.w.l + 1) & 0x0fff; m_PC = GET_PC; return retVal; @@ -44,7 +44,7 @@ UINT8 i4004_cpu_device::ROP() UINT8 i4004_cpu_device::READ_ROM() { - return m_direct->read_decrypted_byte((GET_PC.w.l & 0x0f00) | m_R[0]); + return m_direct->read_byte((GET_PC.w.l & 0x0f00) | m_R[0]); } void i4004_cpu_device::WPM() @@ -56,7 +56,7 @@ void i4004_cpu_device::WPM() UINT8 i4004_cpu_device::ARG() { - UINT8 retVal = m_direct->read_raw_byte(GET_PC.w.l); + UINT8 retVal = m_direct->read_byte(GET_PC.w.l); GET_PC.w.l = (GET_PC.w.l + 1) & 0x0fff; m_PC = GET_PC; return retVal; diff --git a/src/emu/cpu/i8008/i8008.c b/src/emu/cpu/i8008/i8008.c index 2bb5b9cf4b7..551c2d09006 100644 --- a/src/emu/cpu/i8008/i8008.c +++ b/src/emu/cpu/i8008/i8008.c @@ -620,7 +620,7 @@ inline void i8008_device::pop_stack() inline UINT8 i8008_device::rop() { - UINT8 retVal = m_direct->read_decrypted_byte(GET_PC.w.l); + UINT8 retVal = m_direct->read_byte(GET_PC.w.l); GET_PC.w.l = (GET_PC.w.l + 1) & 0x3fff; m_PC = GET_PC; return retVal; @@ -658,7 +658,7 @@ inline void i8008_device::set_reg(UINT8 reg, UINT8 val) inline UINT8 i8008_device::arg() { - UINT8 retVal = m_direct->read_raw_byte(GET_PC.w.l); + UINT8 retVal = m_direct->read_byte(GET_PC.w.l); GET_PC.w.l = (GET_PC.w.l + 1) & 0x3fff; m_PC = GET_PC; return retVal; diff --git a/src/emu/cpu/i8085/i8085.c b/src/emu/cpu/i8085/i8085.c index 904c4d3771d..3e278f64d6c 100644 --- a/src/emu/cpu/i8085/i8085.c +++ b/src/emu/cpu/i8085/i8085.c @@ -293,20 +293,20 @@ void i8085a_cpu_device::break_halt_for_interrupt() UINT8 i8085a_cpu_device::ROP() { set_status(0xa2); // instruction fetch - return m_direct->read_decrypted_byte(m_PC.w.l++); + return m_direct->read_byte(m_PC.w.l++); } UINT8 i8085a_cpu_device::ARG() { - return m_direct->read_raw_byte(m_PC.w.l++); + return m_direct->read_byte(m_PC.w.l++); } UINT16 i8085a_cpu_device::ARG16() { UINT16 w; - w = m_direct->read_raw_byte(m_PC.d); + w = m_direct->read_byte(m_PC.d); m_PC.w.l++; - w += m_direct->read_raw_byte(m_PC.d) << 8; + w += m_direct->read_byte(m_PC.d) << 8; m_PC.w.l++; return w; } diff --git a/src/emu/cpu/i86/i186.c b/src/emu/cpu/i86/i186.c index 9bc8c222fa5..072d70a95bb 100644 --- a/src/emu/cpu/i86/i186.c +++ b/src/emu/cpu/i86/i186.c @@ -155,14 +155,14 @@ i80186_cpu_device::i80186_cpu_device(const machine_config &mconfig, device_type UINT8 i80186_cpu_device::fetch_op() { - UINT8 data = m_direct->read_decrypted_byte(pc(), m_fetch_xor); + UINT8 data = m_direct->read_byte(pc(), m_fetch_xor); m_ip++; return data; } UINT8 i80186_cpu_device::fetch() { - UINT8 data = m_direct->read_raw_byte(pc(), m_fetch_xor); + UINT8 data = m_direct->read_byte(pc(), m_fetch_xor); m_ip++; return data; } diff --git a/src/emu/cpu/i86/i286.c b/src/emu/cpu/i86/i286.c index 0c45370255b..e6314b9cf83 100644 --- a/src/emu/cpu/i86/i286.c +++ b/src/emu/cpu/i86/i286.c @@ -965,7 +965,7 @@ UINT8 i80286_cpu_device::fetch_op() if(m_ip > m_limit[CS]) throw TRAP(FAULT_GP, 0); - data = m_direct->read_decrypted_byte( pc() & m_amask, m_fetch_xor ); + data = m_direct->read_byte( pc() & m_amask, m_fetch_xor ); m_ip++; return data; } @@ -976,7 +976,7 @@ UINT8 i80286_cpu_device::fetch() if(m_ip > m_limit[CS]) throw TRAP(FAULT_GP, 0); - data = m_direct->read_raw_byte( pc() & m_amask, m_fetch_xor ); + data = m_direct->read_byte( pc() & m_amask, m_fetch_xor ); m_ip++; return data; } diff --git a/src/emu/cpu/i86/i86.c b/src/emu/cpu/i86/i86.c index 9ded05705f1..9c8d5a75465 100644 --- a/src/emu/cpu/i86/i86.c +++ b/src/emu/cpu/i86/i86.c @@ -116,7 +116,7 @@ i8086_cpu_device::i8086_cpu_device(const machine_config &mconfig, device_type ty UINT8 i8086_cpu_device::fetch_op() { UINT8 data; - data = m_direct->read_decrypted_byte(pc(), m_fetch_xor); + data = m_direct->read_byte(pc(), m_fetch_xor); m_ip++; return data; } @@ -124,7 +124,7 @@ UINT8 i8086_cpu_device::fetch_op() UINT8 i8086_cpu_device::fetch() { UINT8 data; - data = m_direct->read_raw_byte(pc(), m_fetch_xor); + data = m_direct->read_byte(pc(), m_fetch_xor); m_ip++; return data; } diff --git a/src/emu/cpu/i960/i960.c b/src/emu/cpu/i960/i960.c index 4dd29e45940..8b00a58d4c6 100644 --- a/src/emu/cpu/i960/i960.c +++ b/src/emu/cpu/i960/i960.c @@ -109,22 +109,22 @@ UINT32 i960_cpu_device::get_ea(UINT32 opcode) return m_r[abase] + (m_r[index] << scale); case 0xc: - ret = m_direct->read_decrypted_dword(m_IP); + ret = m_direct->read_dword(m_IP); m_IP += 4; return ret; case 0xd: - ret = m_direct->read_decrypted_dword(m_IP) + m_r[abase]; + ret = m_direct->read_dword(m_IP) + m_r[abase]; m_IP += 4; return ret; case 0xe: - ret = m_direct->read_decrypted_dword(m_IP) + (m_r[index] << scale); + ret = m_direct->read_dword(m_IP) + (m_r[index] << scale); m_IP += 4; return ret; case 0xf: - ret = m_direct->read_decrypted_dword(m_IP) + m_r[abase] + (m_r[index] << scale); + ret = m_direct->read_dword(m_IP) + m_r[abase] + (m_r[index] << scale); m_IP += 4; return ret; @@ -1932,7 +1932,7 @@ void i960_cpu_device::execute_run() m_bursting = 0; - opcode = m_direct->read_decrypted_dword(m_IP); + opcode = m_direct->read_dword(m_IP); m_IP += 4; execute_op(opcode); diff --git a/src/emu/cpu/ie15/ie15.c b/src/emu/cpu/ie15/ie15.c index c2e3356432b..7843eb428a5 100644 --- a/src/emu/cpu/ie15/ie15.c +++ b/src/emu/cpu/ie15/ie15.c @@ -414,14 +414,14 @@ inline void ie15_device::execute_one(int opcode) inline UINT8 ie15_device::rop() { - UINT8 retVal = m_direct->read_decrypted_byte(m_PC.w.l); + UINT8 retVal = m_direct->read_byte(m_PC.w.l); m_PC.w.l = (m_PC.w.l + 1) & 0x0fff; return retVal; } inline UINT8 ie15_device::arg() { - UINT8 retVal = m_direct->read_raw_byte(m_PC.w.l); + UINT8 retVal = m_direct->read_byte(m_PC.w.l); return retVal; } diff --git a/src/emu/cpu/jaguar/jaguar.c b/src/emu/cpu/jaguar/jaguar.c index 6c1dd97b821..976ab4f5983 100644 --- a/src/emu/cpu/jaguar/jaguar.c +++ b/src/emu/cpu/jaguar/jaguar.c @@ -137,7 +137,7 @@ const jaguar_cpu_device::op_func jaguar_cpu_device::dsp_op_table[64] = MEMORY ACCESSORS ***************************************************************************/ -#define ROPCODE(pc) (m_direct->read_decrypted_word(pc, WORD_XOR_BE(0))) +#define ROPCODE(pc) (m_direct->read_word(pc, WORD_XOR_BE(0))) const device_type JAGUARGPU = &device_creator<jaguargpu_cpu_device>; diff --git a/src/emu/cpu/lc8670/lc8670.c b/src/emu/cpu/lc8670/lc8670.c index ac1fd1960d1..96bcfaa0348 100644 --- a/src/emu/cpu/lc8670/lc8670.c +++ b/src/emu/cpu/lc8670/lc8670.c @@ -1071,7 +1071,7 @@ WRITE8_MEMBER(lc8670_cpu_device::regs_w) inline UINT8 lc8670_cpu_device::fetch() { - UINT8 data = m_direct->read_decrypted_byte(m_pc); + UINT8 data = m_direct->read_byte(m_pc); set_pc(m_pc + 1); diff --git a/src/emu/cpu/lh5801/5801tbl.inc b/src/emu/cpu/lh5801/5801tbl.inc index 352e0d64d05..98a8d7b1d02 100644 --- a/src/emu/cpu/lh5801/5801tbl.inc +++ b/src/emu/cpu/lh5801/5801tbl.inc @@ -26,8 +26,8 @@ UINT8 lh5801_cpu_device::lh5801_add_generic(int left, int right, int carry) UINT16 lh5801_cpu_device::lh5801_readop_word() { UINT16 r; - r=m_direct->read_decrypted_byte(P++)<<8; - r|=m_direct->read_decrypted_byte(P++); + r=m_direct->read_byte(P++)<<8; + r|=m_direct->read_byte(P++); return r; } @@ -221,7 +221,7 @@ void lh5801_cpu_device::lh5801_jmp(UINT16 adr) void lh5801_cpu_device::lh5801_branch_plus(int doit) { - UINT8 t=m_direct->read_decrypted_byte(P++); + UINT8 t=m_direct->read_byte(P++); if (doit) { m_icount-=3; P+=t; @@ -230,7 +230,7 @@ void lh5801_cpu_device::lh5801_branch_plus(int doit) void lh5801_cpu_device::lh5801_branch_minus(int doit) { - UINT8 t=m_direct->read_decrypted_byte(P++); + UINT8 t=m_direct->read_byte(P++); if (doit) { m_icount-=3; P-=t; @@ -239,7 +239,7 @@ void lh5801_cpu_device::lh5801_branch_minus(int doit) void lh5801_cpu_device::lh5801_lop() { - UINT8 t=m_direct->read_decrypted_byte(P++); + UINT8 t=m_direct->read_byte(P++); m_icount-=8; if (UL--) { m_icount-=3; @@ -355,7 +355,7 @@ void lh5801_cpu_device::lh5801_instruction_fd() int oper; int adr; - oper=m_direct->read_decrypted_byte(P++); + oper=m_direct->read_byte(P++); switch (oper) { case 0x01: lh5801_sbc(m_io->read_byte(X)); m_icount-=11;break; case 0x03: lh5801_adc(m_io->read_byte(X)); m_icount-=11;break; @@ -396,29 +396,29 @@ void lh5801_cpu_device::lh5801_instruction_fd() case 0x40: lh5801_inc(&XH);m_icount-=9;break; case 0x42: lh5801_dec(&XH);m_icount-=9;break; case 0x48: X=S;m_icount-=11;break; - case 0x49: lh5801_and_mem(*m_io, X, m_direct->read_decrypted_byte(P++)); m_icount-=17;break; + case 0x49: lh5801_and_mem(*m_io, X, m_direct->read_byte(P++)); m_icount-=17;break; case 0x4a: X=X;m_icount-=11;break; //!!! - case 0x4b: lh5801_ora_mem(*m_io, X, m_direct->read_decrypted_byte(P++)); m_icount-=17;break; + case 0x4b: lh5801_ora_mem(*m_io, X, m_direct->read_byte(P++)); m_icount-=17;break; case 0x4c: m_bf=0;/*off !*/ m_icount-=8;break; - case 0x4d: lh5801_bit(m_io->read_byte(X), m_direct->read_decrypted_byte(P++));m_icount-=14;break; + case 0x4d: lh5801_bit(m_io->read_byte(X), m_direct->read_byte(P++));m_icount-=14;break; case 0x4e: S=X;m_icount-=11;break; - case 0x4f: lh5801_add_mem(*m_io, X, m_direct->read_decrypted_byte(P++)); m_icount-=17;break; + case 0x4f: lh5801_add_mem(*m_io, X, m_direct->read_byte(P++)); m_icount-=17;break; case 0x50: lh5801_inc(&YH);m_icount-=9;break; case 0x52: lh5801_dec(&YH);m_icount-=9;break; case 0x58: X=P;m_icount-=11;break; - case 0x59: lh5801_and_mem(*m_io, Y, m_direct->read_decrypted_byte(P++)); m_icount-=17;break; + case 0x59: lh5801_and_mem(*m_io, Y, m_direct->read_byte(P++)); m_icount-=17;break; case 0x5a: Y=X;m_icount-=11;break; - case 0x5b: lh5801_ora_mem(*m_io, Y, m_direct->read_decrypted_byte(P++)); m_icount-=17;break; - case 0x5d: lh5801_bit(m_io->read_byte(Y), m_direct->read_decrypted_byte(P++));m_icount-=14;break; + case 0x5b: lh5801_ora_mem(*m_io, Y, m_direct->read_byte(P++)); m_icount-=17;break; + case 0x5d: lh5801_bit(m_io->read_byte(Y), m_direct->read_byte(P++));m_icount-=14;break; case 0x5e: lh5801_jmp(X);m_icount-=11;break; // P=X - case 0x5f: lh5801_add_mem(*m_io, Y, m_direct->read_decrypted_byte(P++)); m_icount-=17;break; + case 0x5f: lh5801_add_mem(*m_io, Y, m_direct->read_byte(P++)); m_icount-=17;break; case 0x60: lh5801_inc(&UH);m_icount-=9;break; case 0x62: lh5801_dec(&UH);m_icount-=9;break; - case 0x69: lh5801_and_mem(*m_io, U, m_direct->read_decrypted_byte(P++)); m_icount-=17;break; + case 0x69: lh5801_and_mem(*m_io, U, m_direct->read_byte(P++)); m_icount-=17;break; case 0x6a: U=X;m_icount-=11;break; - case 0x6b: lh5801_ora_mem(*m_io, U, m_direct->read_decrypted_byte(P++)); m_icount-=17;break; - case 0x6d: lh5801_bit(m_io->read_byte(X), m_direct->read_decrypted_byte(P++));m_icount-=14;break; - case 0x6f: lh5801_add_mem(*m_io, U, m_direct->read_decrypted_byte(P++)); m_icount-=17;break; + case 0x6b: lh5801_ora_mem(*m_io, U, m_direct->read_byte(P++)); m_icount-=17;break; + case 0x6d: lh5801_bit(m_io->read_byte(X), m_direct->read_byte(P++));m_icount-=14;break; + case 0x6f: lh5801_add_mem(*m_io, U, m_direct->read_byte(P++)); m_icount-=17;break; case 0x81: m_t|=IE; /*sie !*/m_icount-=8;break; case 0x88: lh5801_push_word(X); m_icount-=14;break; case 0x8a: lh5801_pop(); m_icount-=12; break; @@ -454,20 +454,20 @@ void lh5801_cpu_device::lh5801_instruction_fd() case 0xea: lh5801_adr(&m_u);m_icount-=11;break; case 0xe9: adr=lh5801_readop_word(); - lh5801_and_mem(*m_io, adr, m_direct->read_decrypted_byte(P++)); m_icount-=23; + lh5801_and_mem(*m_io, adr, m_direct->read_byte(P++)); m_icount-=23; break; case 0xeb: adr=lh5801_readop_word(); - lh5801_ora_mem(*m_io, adr, m_direct->read_decrypted_byte(P++)); m_icount-=23; + lh5801_ora_mem(*m_io, adr, m_direct->read_byte(P++)); m_icount-=23; break; case 0xec: m_t=m_a; m_icount-=9;break; case 0xed: adr=lh5801_readop_word(); - lh5801_bit(m_io->read_byte(adr), m_direct->read_decrypted_byte(P++)); + lh5801_bit(m_io->read_byte(adr), m_direct->read_byte(P++)); m_icount-=20;break; case 0xef: adr=lh5801_readop_word(); - lh5801_add_mem(*m_io, adr, m_direct->read_decrypted_byte(P++)); m_icount-=23; + lh5801_add_mem(*m_io, adr, m_direct->read_byte(P++)); m_icount-=23; break; default: @@ -480,7 +480,7 @@ void lh5801_cpu_device::lh5801_instruction() int oper; int adr; - oper=m_direct->read_decrypted_byte(P++); + oper=m_direct->read_byte(P++); switch (oper) { case 0x00: lh5801_sbc(XL); m_icount-=6;break; case 0x01: lh5801_sbc(m_program->read_byte(X)); m_icount-=7;break; @@ -539,14 +539,14 @@ void lh5801_cpu_device::lh5801_instruction() case 0x45: lh5801_lin(&m_x);m_icount-=6;break; case 0x46: X--;m_icount-=5;break; case 0x47: lh5801_lde(&m_x);m_icount-=6;break; - case 0x48: XH=m_direct->read_decrypted_byte(P++);m_icount-=6;break; - case 0x49: lh5801_and_mem(*m_program, X, m_direct->read_decrypted_byte(P++)); m_icount-=13;break; - case 0x4a: XL=m_direct->read_decrypted_byte(P++);m_icount-=6;break; - case 0x4b: lh5801_ora_mem(*m_program, X, m_direct->read_decrypted_byte(P++)); m_icount-=13;break; - case 0x4c: lh5801_cpa(XH, m_direct->read_decrypted_byte(P++)); m_icount-=7;break; - case 0x4d: lh5801_bit(m_program->read_byte(X), m_direct->read_decrypted_byte(P++));m_icount-=10;break; - case 0x4e: lh5801_cpa(XL, m_direct->read_decrypted_byte(P++)); m_icount-=7;break; - case 0x4f: lh5801_add_mem(*m_program, X, m_direct->read_decrypted_byte(P++)); m_icount-=13;break; + case 0x48: XH=m_direct->read_byte(P++);m_icount-=6;break; + case 0x49: lh5801_and_mem(*m_program, X, m_direct->read_byte(P++)); m_icount-=13;break; + case 0x4a: XL=m_direct->read_byte(P++);m_icount-=6;break; + case 0x4b: lh5801_ora_mem(*m_program, X, m_direct->read_byte(P++)); m_icount-=13;break; + case 0x4c: lh5801_cpa(XH, m_direct->read_byte(P++)); m_icount-=7;break; + case 0x4d: lh5801_bit(m_program->read_byte(X), m_direct->read_byte(P++));m_icount-=10;break; + case 0x4e: lh5801_cpa(XL, m_direct->read_byte(P++)); m_icount-=7;break; + case 0x4f: lh5801_add_mem(*m_program, X, m_direct->read_byte(P++)); m_icount-=13;break; case 0x50: lh5801_inc(&YL);m_icount-=5;break; case 0x51: lh5801_sin(&m_y); m_icount-=6;break; case 0x52: lh5801_dec(&YL);m_icount-=5;break; @@ -555,14 +555,14 @@ void lh5801_cpu_device::lh5801_instruction() case 0x55: lh5801_lin(&m_y);m_icount-=6;break; case 0x56: Y--;m_icount-=5;break; case 0x57: lh5801_lde(&m_y);m_icount-=6;break; - case 0x58: YH=m_direct->read_decrypted_byte(P++);m_icount-=6;break; - case 0x59: lh5801_and_mem(*m_program, Y, m_direct->read_decrypted_byte(P++)); m_icount-=13;break; - case 0x5a: YL=m_direct->read_decrypted_byte(P++);m_icount-=6;break; - case 0x5b: lh5801_ora_mem(*m_program, Y, m_direct->read_decrypted_byte(P++)); m_icount-=13;break; - case 0x5c: lh5801_cpa(YH, m_direct->read_decrypted_byte(P++)); m_icount-=7;break; - case 0x5d: lh5801_bit(m_program->read_byte(Y), m_direct->read_decrypted_byte(P++));m_icount-=10;break; - case 0x5e: lh5801_cpa(YL, m_direct->read_decrypted_byte(P++)); m_icount-=7;break; - case 0x5f: lh5801_add_mem(*m_program, Y, m_direct->read_decrypted_byte(P++)); m_icount-=13;break; + case 0x58: YH=m_direct->read_byte(P++);m_icount-=6;break; + case 0x59: lh5801_and_mem(*m_program, Y, m_direct->read_byte(P++)); m_icount-=13;break; + case 0x5a: YL=m_direct->read_byte(P++);m_icount-=6;break; + case 0x5b: lh5801_ora_mem(*m_program, Y, m_direct->read_byte(P++)); m_icount-=13;break; + case 0x5c: lh5801_cpa(YH, m_direct->read_byte(P++)); m_icount-=7;break; + case 0x5d: lh5801_bit(m_program->read_byte(Y), m_direct->read_byte(P++));m_icount-=10;break; + case 0x5e: lh5801_cpa(YL, m_direct->read_byte(P++)); m_icount-=7;break; + case 0x5f: lh5801_add_mem(*m_program, Y, m_direct->read_byte(P++)); m_icount-=13;break; case 0x60: lh5801_inc(&UL);m_icount-=5;break; case 0x61: lh5801_sin(&m_u); m_icount-=6;break; case 0x62: lh5801_dec(&UL);m_icount-=5;break; @@ -571,14 +571,14 @@ void lh5801_cpu_device::lh5801_instruction() case 0x65: lh5801_lin(&m_u);m_icount-=6;break; case 0x66: U--;m_icount-=5;break; case 0x67: lh5801_lde(&m_u);m_icount-=6;break; - case 0x68: UH=m_direct->read_decrypted_byte(P++);m_icount-=6;break; - case 0x69: lh5801_and_mem(*m_program, U, m_direct->read_decrypted_byte(P++)); m_icount-=13;break; - case 0x6a: UL=m_direct->read_decrypted_byte(P++);m_icount-=6;break; - case 0x6b: lh5801_ora_mem(*m_program, U, m_direct->read_decrypted_byte(P++)); m_icount-=13;break; - case 0x6c: lh5801_cpa(UH, m_direct->read_decrypted_byte(P++)); m_icount-=7;break; - case 0x6d: lh5801_bit(m_program->read_byte(U), m_direct->read_decrypted_byte(P++));m_icount-=10;break; - case 0x6e: lh5801_cpa(UL, m_direct->read_decrypted_byte(P++)); m_icount-=7;break; - case 0x6f: lh5801_add_mem(*m_program, U, m_direct->read_decrypted_byte(P++)); m_icount-=13;break; + case 0x68: UH=m_direct->read_byte(P++);m_icount-=6;break; + case 0x69: lh5801_and_mem(*m_program, U, m_direct->read_byte(P++)); m_icount-=13;break; + case 0x6a: UL=m_direct->read_byte(P++);m_icount-=6;break; + case 0x6b: lh5801_ora_mem(*m_program, U, m_direct->read_byte(P++)); m_icount-=13;break; + case 0x6c: lh5801_cpa(UH, m_direct->read_byte(P++)); m_icount-=7;break; + case 0x6d: lh5801_bit(m_program->read_byte(U), m_direct->read_byte(P++));m_icount-=10;break; + case 0x6e: lh5801_cpa(UL, m_direct->read_byte(P++)); m_icount-=7;break; + case 0x6f: lh5801_add_mem(*m_program, U, m_direct->read_byte(P++)); m_icount-=13;break; case 0x80: lh5801_sbc(XH); m_icount-=6;break; case 0x81: lh5801_branch_plus(!(m_t&C)); m_icount-=8; break; case 0x82: lh5801_adc(XH); m_icount-=6;break; @@ -626,25 +626,25 @@ void lh5801_cpu_device::lh5801_instruction() case 0xad: lh5801_eor(m_program->read_byte(lh5801_readop_word())); m_icount-=13;break; case 0xae: m_program->write_byte(lh5801_readop_word(),m_a); m_icount-=12;break; case 0xaf: lh5801_bit(m_program->read_byte(lh5801_readop_word()),m_a); m_icount-=13;break; - case 0xb1: lh5801_sbc(m_direct->read_decrypted_byte(P++)); m_icount-=7;break; - case 0xb3: lh5801_adc(m_direct->read_decrypted_byte(P++)); m_icount-=7;break; - case 0xb5: lh5801_lda(m_direct->read_decrypted_byte(P++)); m_icount-=6;break; - case 0xb7: lh5801_cpa(m_a, m_direct->read_decrypted_byte(P++)); m_icount-=7;break; + case 0xb1: lh5801_sbc(m_direct->read_byte(P++)); m_icount-=7;break; + case 0xb3: lh5801_adc(m_direct->read_byte(P++)); m_icount-=7;break; + case 0xb5: lh5801_lda(m_direct->read_byte(P++)); m_icount-=6;break; + case 0xb7: lh5801_cpa(m_a, m_direct->read_byte(P++)); m_icount-=7;break; case 0xb8: m_pv=0;/*rpv!*/ m_icount-=4; break; - case 0xb9: lh5801_and(m_direct->read_decrypted_byte(P++)); m_icount-=7;break; + case 0xb9: lh5801_and(m_direct->read_byte(P++)); m_icount-=7;break; case 0xba: lh5801_jmp(lh5801_readop_word()); m_icount-=12;break; - case 0xbb: lh5801_ora(m_direct->read_decrypted_byte(P++)); m_icount-=7;break; - case 0xbd: lh5801_eor(m_direct->read_decrypted_byte(P++)); m_icount-=7;break; + case 0xbb: lh5801_ora(m_direct->read_byte(P++)); m_icount-=7;break; + case 0xbd: lh5801_eor(m_direct->read_byte(P++)); m_icount-=7;break; case 0xbe: lh5801_sjp(); m_icount-=19; break; - case 0xbf: lh5801_bit(m_a, m_direct->read_decrypted_byte(P++));m_icount-=7;break; - case 0xc1: lh5801_vector(!(m_t&C), m_direct->read_decrypted_byte(P++)); m_icount-=8;break; - case 0xc3: lh5801_vector(m_t&C, m_direct->read_decrypted_byte(P++)); m_icount-=8;break; - case 0xc5: lh5801_vector(!(m_t&H), m_direct->read_decrypted_byte(P++)); m_icount-=8;break; - case 0xc7: lh5801_vector(m_t&H, m_direct->read_decrypted_byte(P++)); m_icount-=8;break; - case 0xc9: lh5801_vector(!(m_t&Z), m_direct->read_decrypted_byte(P++)); m_icount-=8;break; - case 0xcb: lh5801_vector(m_t&Z, m_direct->read_decrypted_byte(P++)); m_icount-=8;break; - case 0xcd: lh5801_vector(1, m_direct->read_decrypted_byte(P++)); m_icount-=7;break; - case 0xcf: lh5801_vector(m_t&V, m_direct->read_decrypted_byte(P++)); m_icount-=8;break; + case 0xbf: lh5801_bit(m_a, m_direct->read_byte(P++));m_icount-=7;break; + case 0xc1: lh5801_vector(!(m_t&C), m_direct->read_byte(P++)); m_icount-=8;break; + case 0xc3: lh5801_vector(m_t&C, m_direct->read_byte(P++)); m_icount-=8;break; + case 0xc5: lh5801_vector(!(m_t&H), m_direct->read_byte(P++)); m_icount-=8;break; + case 0xc7: lh5801_vector(m_t&H, m_direct->read_byte(P++)); m_icount-=8;break; + case 0xc9: lh5801_vector(!(m_t&Z), m_direct->read_byte(P++)); m_icount-=8;break; + case 0xcb: lh5801_vector(m_t&Z, m_direct->read_byte(P++)); m_icount-=8;break; + case 0xcd: lh5801_vector(1, m_direct->read_byte(P++)); m_icount-=7;break; + case 0xcf: lh5801_vector(m_t&V, m_direct->read_byte(P++)); m_icount-=8;break; case 0xd1: lh5801_ror(); m_icount-=6; break; case 0xd3: lh5801_drr(*m_program, X); m_icount-=12; break; case 0xd5: lh5801_shr(); m_icount-=6; break; @@ -656,17 +656,17 @@ void lh5801_cpu_device::lh5801_instruction() case 0xe1: m_pu=1;/*spu!*/ m_icount-=4; break; case 0xe3: m_pu=0;/*rpu!*/ m_icount-=4; break; case 0xe9: - adr=lh5801_readop_word();lh5801_and_mem(*m_program, adr, m_direct->read_decrypted_byte(P++)); + adr=lh5801_readop_word();lh5801_and_mem(*m_program, adr, m_direct->read_byte(P++)); m_icount-=19;break; case 0xeb: - adr=lh5801_readop_word();lh5801_ora_mem(*m_program, adr, m_direct->read_decrypted_byte(P++)); + adr=lh5801_readop_word();lh5801_ora_mem(*m_program, adr, m_direct->read_byte(P++)); m_icount-=19;break; case 0xed: - adr=lh5801_readop_word();lh5801_bit(m_program->read_byte(adr), m_direct->read_decrypted_byte(P++)); + adr=lh5801_readop_word();lh5801_bit(m_program->read_byte(adr), m_direct->read_byte(P++)); m_icount-=16;break; case 0xef: adr=lh5801_readop_word(); - lh5801_add_mem(*m_program, adr, m_direct->read_decrypted_byte(P++)); m_icount-=19; + lh5801_add_mem(*m_program, adr, m_direct->read_byte(P++)); m_icount-=19; break; case 0xf1: lh5801_aex(); m_icount-=6; break; case 0xf5: m_program->write_byte(Y++, m_program->read_byte(X++)); m_icount-=7; break; //tin diff --git a/src/emu/cpu/m37710/m37710cm.h b/src/emu/cpu/m37710/m37710cm.h index 8c784b9ca05..aa691b2e9aa 100644 --- a/src/emu/cpu/m37710/m37710cm.h +++ b/src/emu/cpu/m37710/m37710cm.h @@ -23,10 +23,10 @@ #define M37710_CALL_DEBUGGER(x) debugger_instruction_hook(this, x) #define m37710_read_8(addr) m_program->read_byte(addr) #define m37710_write_8(addr,data) m_program->write_byte(addr,data) -#define m37710_read_8_immediate(A) m_direct->read_decrypted_byte(A, BYTE_XOR_LE(0)) +#define m37710_read_8_immediate(A) m_direct->read_byte(A, BYTE_XOR_LE(0)) #define m37710_read_16(addr) m_program->read_word_unaligned(addr) #define m37710_write_16(addr,data) m_program->write_word_unaligned(addr,data) -#define m37710_read_16_immediate(A) m_direct->read_decrypted_word(A) +#define m37710_read_16_immediate(A) m_direct->read_word(A) /* ======================================================================== */ diff --git a/src/emu/cpu/m6502/deco16.c b/src/emu/cpu/m6502/deco16.c index 681ae5dcc42..a500b287d7a 100644 --- a/src/emu/cpu/m6502/deco16.c +++ b/src/emu/cpu/m6502/deco16.c @@ -41,7 +41,13 @@ void deco16_device::device_start() const address_space_config *deco16_device::memory_space_config(address_spacenum spacenum) const { - return spacenum == AS_PROGRAM ? &program_config : spacenum == AS_IO ? &io_config : NULL; + switch(spacenum) + { + case AS_PROGRAM: return &program_config; + case AS_IO: return &io_config; + case AS_DECRYPTED_OPCODES: return has_configured_map(AS_DECRYPTED_OPCODES) ? &sprogram_config : NULL; + default: return NULL; + } } #include "cpu/m6502/deco16.inc" diff --git a/src/emu/cpu/m6502/m4510.c b/src/emu/cpu/m6502/m4510.c index 329734f692e..65c59280b29 100644 --- a/src/emu/cpu/m6502/m4510.c +++ b/src/emu/cpu/m6502/m4510.c @@ -19,6 +19,9 @@ m4510_device::m4510_device(const machine_config &mconfig, const char *tag, devic program_config.m_addrbus_width = 20; program_config.m_logaddr_width = 16; program_config.m_page_shift = 13; + sprogram_config.m_addrbus_width = 20; + sprogram_config.m_logaddr_width = 16; + sprogram_config.m_page_shift = 13; } offs_t m4510_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) @@ -71,14 +74,14 @@ UINT8 m4510_device::mi_4510_normal::read(UINT16 adr) return program->read_byte(base->map(adr)); } -UINT8 m4510_device::mi_4510_normal::read_direct(UINT16 adr) +UINT8 m4510_device::mi_4510_normal::read_sync(UINT16 adr) { - return direct->read_raw_byte(base->map(adr)); + return sdirect->read_byte(base->map(adr)); } -UINT8 m4510_device::mi_4510_normal::read_decrypted(UINT16 adr) +UINT8 m4510_device::mi_4510_normal::read_arg(UINT16 adr) { - return direct->read_decrypted_byte(base->map(adr)); + return direct->read_byte(base->map(adr)); } void m4510_device::mi_4510_normal::write(UINT16 adr, UINT8 val) @@ -90,14 +93,14 @@ m4510_device::mi_4510_nd::mi_4510_nd(m4510_device *_base) : mi_4510_normal(_base { } -UINT8 m4510_device::mi_4510_nd::read_direct(UINT16 adr) +UINT8 m4510_device::mi_4510_nd::read_sync(UINT16 adr) { - return read(adr); + return program->read_byte(base->map(adr)); } -UINT8 m4510_device::mi_4510_nd::read_decrypted(UINT16 adr) +UINT8 m4510_device::mi_4510_nd::read_arg(UINT16 adr) { - return read(adr); + return sprogram->read_byte(base->map(adr)); } #include "cpu/m6502/m4510.inc" diff --git a/src/emu/cpu/m6502/m4510.h b/src/emu/cpu/m6502/m4510.h index 46a95a1eb72..90bba4d0262 100644 --- a/src/emu/cpu/m6502/m4510.h +++ b/src/emu/cpu/m6502/m4510.h @@ -37,8 +37,8 @@ protected: mi_4510_normal(m4510_device *base); virtual ~mi_4510_normal() {} virtual UINT8 read(UINT16 adr); - virtual UINT8 read_direct(UINT16 adr); - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); + virtual UINT8 read_arg(UINT16 adr); virtual void write(UINT16 adr, UINT8 val); }; @@ -46,8 +46,8 @@ protected: public: mi_4510_nd(m4510_device *base); virtual ~mi_4510_nd() {} - virtual UINT8 read_direct(UINT16 adr); - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); + virtual UINT8 read_arg(UINT16 adr); }; virtual void device_start(); diff --git a/src/emu/cpu/m6502/m6502.c b/src/emu/cpu/m6502/m6502.c index c1a84b2fd9c..01b2b8f0f98 100644 --- a/src/emu/cpu/m6502/m6502.c +++ b/src/emu/cpu/m6502/m6502.c @@ -17,7 +17,8 @@ const device_type M6502 = &device_creator<m6502_device>; m6502_device::m6502_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : cpu_device(mconfig, M6502, "M6502", tag, owner, clock, "m6502", __FILE__), sync_w(*this), - program_config("program", ENDIANNESS_LITTLE, 8, 16) + program_config("program", ENDIANNESS_LITTLE, 8, 16), + sprogram_config("decrypted_opcodes", ENDIANNESS_LITTLE, 8, 16) { direct_disabled = false; } @@ -25,7 +26,8 @@ m6502_device::m6502_device(const machine_config &mconfig, const char *tag, devic m6502_device::m6502_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source), sync_w(*this), - program_config("program", ENDIANNESS_LITTLE, 8, 16) + program_config("program", ENDIANNESS_LITTLE, 8, 16), + sprogram_config("decrypted_opcodes", ENDIANNESS_LITTLE, 8, 16) { direct_disabled = false; } @@ -42,8 +44,11 @@ void m6502_device::device_start() void m6502_device::init() { - mintf->program = &space(AS_PROGRAM); - mintf->direct = &mintf->program->direct(); + mintf->program = &space(AS_PROGRAM); + mintf->sprogram = has_space(AS_DECRYPTED_OPCODES) ? &space(AS_DECRYPTED_OPCODES) : mintf->program; + + mintf->direct = &mintf->program->direct(); + mintf->sdirect = &mintf->sprogram->direct(); sync_w.resolve_safe(); @@ -402,7 +407,12 @@ void m6502_device::execute_set_input(int inputnum, int state) const address_space_config *m6502_device::memory_space_config(address_spacenum spacenum) const { - return (spacenum == AS_PROGRAM) ? &program_config : NULL; + switch(spacenum) + { + case AS_PROGRAM: return &program_config; + case AS_DECRYPTED_OPCODES: return has_configured_map(AS_DECRYPTED_OPCODES) ? &sprogram_config : NULL; + default: return NULL; + } } @@ -621,7 +631,7 @@ void m6502_device::prefetch() sync = true; sync_w(ASSERT_LINE); NPC = PC; - IR = mintf->read_decrypted(PC); + IR = mintf->read_sync(PC); sync = false; sync_w(CLEAR_LINE); @@ -637,7 +647,7 @@ void m6502_device::prefetch_noirq() sync = true; sync_w(ASSERT_LINE); NPC = PC; - IR = mintf->read_decrypted(PC); + IR = mintf->read_sync(PC); sync = false; sync_w(CLEAR_LINE); PC++; @@ -674,31 +684,33 @@ UINT8 m6502_device::mi_default_normal::read(UINT16 adr) return program->read_byte(adr); } -UINT8 m6502_device::mi_default_normal::read_direct(UINT16 adr) +UINT8 m6502_device::mi_default_normal::read_sync(UINT16 adr) { - return direct->read_raw_byte(adr); + return sdirect->read_byte(adr); } -UINT8 m6502_device::mi_default_normal::read_decrypted(UINT16 adr) +UINT8 m6502_device::mi_default_normal::read_arg(UINT16 adr) { - return direct->read_decrypted_byte(adr); + return direct->read_byte(adr); } + void m6502_device::mi_default_normal::write(UINT16 adr, UINT8 val) { program->write_byte(adr, val); } -UINT8 m6502_device::mi_default_nd::read_direct(UINT16 adr) +UINT8 m6502_device::mi_default_nd::read_sync(UINT16 adr) { - return read(adr); + return sprogram->read_byte(adr); } -UINT8 m6502_device::mi_default_nd::read_decrypted(UINT16 adr) +UINT8 m6502_device::mi_default_nd::read_arg(UINT16 adr) { - return read(adr); + return program->read_byte(adr); } + WRITE_LINE_MEMBER( m6502_device::irq_line ) { set_input_line( M6502_IRQ_LINE, state ); diff --git a/src/emu/cpu/m6502/m6502.h b/src/emu/cpu/m6502/m6502.h index 240509f21ea..1dbed7710de 100644 --- a/src/emu/cpu/m6502/m6502.h +++ b/src/emu/cpu/m6502/m6502.h @@ -42,14 +42,14 @@ public: protected: class memory_interface { public: - address_space *program; - direct_read_data *direct; + address_space *program, *sprogram; + direct_read_data *direct, *sdirect; virtual ~memory_interface() {} virtual UINT8 read(UINT16 adr) = 0; virtual UINT8 read_9(UINT16 adr); - virtual UINT8 read_direct(UINT16 adr) = 0; - virtual UINT8 read_decrypted(UINT16 adr) = 0; + virtual UINT8 read_sync(UINT16 adr) = 0; + virtual UINT8 read_arg(UINT16 adr) = 0; virtual void write(UINT16 adr, UINT8 val) = 0; virtual void write_9(UINT16 adr, UINT8 val); }; @@ -58,16 +58,16 @@ protected: public: virtual ~mi_default_normal() {} virtual UINT8 read(UINT16 adr); - virtual UINT8 read_direct(UINT16 adr); - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); + virtual UINT8 read_arg(UINT16 adr); virtual void write(UINT16 adr, UINT8 val); }; class mi_default_nd : public mi_default_normal { public: virtual ~mi_default_nd() {} - virtual UINT8 read_direct(UINT16 adr); - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); + virtual UINT8 read_arg(UINT16 adr); }; struct disasm_entry { @@ -151,7 +151,7 @@ protected: virtual UINT32 disasm_max_opcode_bytes() const; virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options); - address_space_config program_config; + address_space_config program_config, sprogram_config; UINT16 PPC; /* previous program counter */ UINT16 NPC; /* next start-of-instruction program counter */ @@ -179,9 +179,9 @@ protected: UINT8 read_9(UINT16 adr) { return mintf->read_9(adr); } void write(UINT16 adr, UINT8 val) { mintf->write(adr, val); } void write_9(UINT16 adr, UINT8 val) { mintf->write_9(adr, val); } - UINT8 read_direct(UINT16 adr) { return mintf->read_direct(adr); } - UINT8 read_pc() { return mintf->read_direct(PC++); } - UINT8 read_pc_noinc() { return mintf->read_direct(PC); } + UINT8 read_arg(UINT16 adr) { return mintf->read_arg(adr); } + UINT8 read_pc() { return mintf->read_arg(PC++); } + UINT8 read_pc_noinc() { return mintf->read_arg(PC); } void prefetch(); void prefetch_noirq(); void set_nz(UINT8 v); diff --git a/src/emu/cpu/m6502/m6502make.py b/src/emu/cpu/m6502/m6502make.py index 514af0e8fb8..591d01268ca 100755 --- a/src/emu/cpu/m6502/m6502make.py +++ b/src/emu/cpu/m6502/m6502make.py @@ -68,7 +68,7 @@ FULL_EAT_ALL="""\ """ FULL_MEMORY="""\ -\tif(icount <= 0) { inst_substate = %(substate)s; return; } +\tif(icount == 0) { inst_substate = %(substate)s; return; } %(ins)s \ticount--; """ @@ -97,7 +97,7 @@ case %(substate)s:; """ PARTIAL_MEMORY="""\ -\tif(icount <= 0) { inst_substate = %(substate)s; return; } +\tif(icount == 0) { inst_substate = %(substate)s; return; } case %(substate)s: %(ins)s \ticount--; diff --git a/src/emu/cpu/m6502/m6504.c b/src/emu/cpu/m6502/m6504.c index 383d0f1fecd..f2ae2c4b6d9 100644 --- a/src/emu/cpu/m6502/m6504.c +++ b/src/emu/cpu/m6502/m6504.c @@ -17,6 +17,7 @@ m6504_device::m6504_device(const machine_config &mconfig, const char *tag, devic m6502_device(mconfig, M6504, "M6504", tag, owner, clock, "m6504", __FILE__) { program_config.m_addrbus_width = 13; + sprogram_config.m_addrbus_width = 13; } void m6504_device::device_start() @@ -34,14 +35,14 @@ UINT8 m6504_device::mi_6504_normal::read(UINT16 adr) return program->read_byte(adr & 0x1fff); } -UINT8 m6504_device::mi_6504_normal::read_direct(UINT16 adr) +UINT8 m6504_device::mi_6504_normal::read_sync(UINT16 adr) { - return direct->read_raw_byte(adr & 0x1fff); + return sdirect->read_byte(adr & 0x1fff); } -UINT8 m6504_device::mi_6504_normal::read_decrypted(UINT16 adr) +UINT8 m6504_device::mi_6504_normal::read_arg(UINT16 adr) { - return direct->read_decrypted_byte(adr & 0x1fff); + return direct->read_byte(adr & 0x1fff); } void m6504_device::mi_6504_normal::write(UINT16 adr, UINT8 val) @@ -49,12 +50,12 @@ void m6504_device::mi_6504_normal::write(UINT16 adr, UINT8 val) program->write_byte(adr & 0x1fff, val); } -UINT8 m6504_device::mi_6504_nd::read_direct(UINT16 adr) +UINT8 m6504_device::mi_6504_nd::read_sync(UINT16 adr) { - return read(adr); + return sprogram->read_byte(adr & 0x1fff); } -UINT8 m6504_device::mi_6504_nd::read_decrypted(UINT16 adr) +UINT8 m6504_device::mi_6504_nd::read_arg(UINT16 adr) { - return read(adr); + return program->read_byte(adr & 0x1fff); } diff --git a/src/emu/cpu/m6502/m6504.h b/src/emu/cpu/m6502/m6504.h index e325240d8e9..de6ca847b25 100644 --- a/src/emu/cpu/m6502/m6504.h +++ b/src/emu/cpu/m6502/m6504.h @@ -22,16 +22,16 @@ protected: public: virtual ~mi_6504_normal() {} virtual UINT8 read(UINT16 adr); - virtual UINT8 read_direct(UINT16 adr); - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); + virtual UINT8 read_arg(UINT16 adr); virtual void write(UINT16 adr, UINT8 val); }; class mi_6504_nd : public mi_6504_normal { public: virtual ~mi_6504_nd() {} - virtual UINT8 read_direct(UINT16 adr); - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); + virtual UINT8 read_arg(UINT16 adr); }; virtual void device_start(); diff --git a/src/emu/cpu/m6502/m6509.c b/src/emu/cpu/m6502/m6509.c index 3c8c3436e25..77af9e8f1f7 100644 --- a/src/emu/cpu/m6502/m6509.c +++ b/src/emu/cpu/m6502/m6509.c @@ -18,6 +18,8 @@ m6509_device::m6509_device(const machine_config &mconfig, const char *tag, devic { program_config.m_addrbus_width = 20; program_config.m_logaddr_width = 20; + sprogram_config.m_addrbus_width = 20; + sprogram_config.m_logaddr_width = 20; } void m6509_device::device_start() @@ -71,9 +73,9 @@ UINT8 m6509_device::mi_6509_normal::read(UINT16 adr) return res; } -UINT8 m6509_device::mi_6509_normal::read_direct(UINT16 adr) +UINT8 m6509_device::mi_6509_normal::read_sync(UINT16 adr) { - UINT8 res = direct->read_raw_byte(base->adr_in_bank_i(adr)); + UINT8 res = sdirect->read_byte(base->adr_in_bank_i(adr)); if(adr == 0x0000) res = base->bank_i_r(); else if(adr == 0x0001) @@ -81,9 +83,9 @@ UINT8 m6509_device::mi_6509_normal::read_direct(UINT16 adr) return res; } -UINT8 m6509_device::mi_6509_normal::read_decrypted(UINT16 adr) +UINT8 m6509_device::mi_6509_normal::read_arg(UINT16 adr) { - UINT8 res = direct->read_decrypted_byte(base->adr_in_bank_i(adr)); + UINT8 res = direct->read_byte(base->adr_in_bank_i(adr)); if(adr == 0x0000) res = base->bank_i_r(); else if(adr == 0x0001) @@ -123,9 +125,9 @@ m6509_device::mi_6509_nd::mi_6509_nd(m6509_device *_base) : mi_6509_normal(_base { } -UINT8 m6509_device::mi_6509_nd::read_direct(UINT16 adr) +UINT8 m6509_device::mi_6509_nd::read_sync(UINT16 adr) { - UINT8 res = program->read_byte(base->adr_in_bank_i(adr)); + UINT8 res = sprogram->read_byte(base->adr_in_bank_i(adr)); if(adr == 0x0000) res = base->bank_i_r(); else if(adr == 0x0001) @@ -133,7 +135,7 @@ UINT8 m6509_device::mi_6509_nd::read_direct(UINT16 adr) return res; } -UINT8 m6509_device::mi_6509_nd::read_decrypted(UINT16 adr) +UINT8 m6509_device::mi_6509_nd::read_arg(UINT16 adr) { UINT8 res = program->read_byte(base->adr_in_bank_i(adr)); if(adr == 0x0000) diff --git a/src/emu/cpu/m6502/m6509.h b/src/emu/cpu/m6502/m6509.h index 561a31449a4..27f7411b80f 100644 --- a/src/emu/cpu/m6502/m6509.h +++ b/src/emu/cpu/m6502/m6509.h @@ -32,8 +32,8 @@ protected: virtual ~mi_6509_normal() {} virtual UINT8 read(UINT16 adr); virtual UINT8 read_9(UINT16 adr); - virtual UINT8 read_direct(UINT16 adr); - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); + virtual UINT8 read_arg(UINT16 adr); virtual void write(UINT16 adr, UINT8 val); virtual void write_9(UINT16 adr, UINT8 val); }; @@ -42,8 +42,8 @@ protected: public: mi_6509_nd(m6509_device *base); virtual ~mi_6509_nd() {} - virtual UINT8 read_direct(UINT16 adr); - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); + virtual UINT8 read_arg(UINT16 adr); }; virtual void device_start(); diff --git a/src/emu/cpu/m6502/m6510.c b/src/emu/cpu/m6502/m6510.c index dfab818bd60..10e57fb27b8 100644 --- a/src/emu/cpu/m6502/m6510.c +++ b/src/emu/cpu/m6502/m6510.c @@ -119,9 +119,9 @@ UINT8 m6510_device::mi_6510_normal::read(UINT16 adr) return res; } -UINT8 m6510_device::mi_6510_normal::read_direct(UINT16 adr) +UINT8 m6510_device::mi_6510_normal::read_sync(UINT16 adr) { - UINT8 res = direct->read_raw_byte(adr); + UINT8 res = sdirect->read_byte(adr); if(adr == 0x0000) res = base->dir_r(); else if(adr == 0x0001) @@ -129,9 +129,9 @@ UINT8 m6510_device::mi_6510_normal::read_direct(UINT16 adr) return res; } -UINT8 m6510_device::mi_6510_normal::read_decrypted(UINT16 adr) +UINT8 m6510_device::mi_6510_normal::read_arg(UINT16 adr) { - UINT8 res = direct->read_decrypted_byte(adr); + UINT8 res = direct->read_byte(adr); if(adr == 0x0000) res = base->dir_r(); else if(adr == 0x0001) @@ -152,14 +152,24 @@ m6510_device::mi_6510_nd::mi_6510_nd(m6510_device *_base) : mi_6510_normal(_base { } -UINT8 m6510_device::mi_6510_nd::read_direct(UINT16 adr) +UINT8 m6510_device::mi_6510_nd::read_sync(UINT16 adr) { - return read(adr); + UINT8 res = sprogram->read_byte(adr); + if(adr == 0x0000) + res = base->dir_r(); + else if(adr == 0x0001) + res = base->port_r(); + return res; } -UINT8 m6510_device::mi_6510_nd::read_decrypted(UINT16 adr) +UINT8 m6510_device::mi_6510_nd::read_arg(UINT16 adr) { - return read(adr); + UINT8 res = program->read_byte(adr); + if(adr == 0x0000) + res = base->dir_r(); + else if(adr == 0x0001) + res = base->port_r(); + return res; } #include "cpu/m6502/m6510.inc" diff --git a/src/emu/cpu/m6502/m6510.h b/src/emu/cpu/m6502/m6510.h index 76b8a405f30..2dbd7e4138e 100644 --- a/src/emu/cpu/m6502/m6510.h +++ b/src/emu/cpu/m6502/m6510.h @@ -47,8 +47,8 @@ protected: mi_6510_normal(m6510_device *base); virtual ~mi_6510_normal() {} virtual UINT8 read(UINT16 adr); - virtual UINT8 read_direct(UINT16 adr); - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); + virtual UINT8 read_arg(UINT16 adr); virtual void write(UINT16 adr, UINT8 val); }; @@ -56,8 +56,8 @@ protected: public: mi_6510_nd(m6510_device *base); virtual ~mi_6510_nd() {} - virtual UINT8 read_direct(UINT16 adr); - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); + virtual UINT8 read_arg(UINT16 adr); }; devcb_read8 read_port; diff --git a/src/emu/cpu/m6502/n2a03.c b/src/emu/cpu/m6502/n2a03.c index dd29182f53c..b3b2cb31808 100644 --- a/src/emu/cpu/m6502/n2a03.c +++ b/src/emu/cpu/m6502/n2a03.c @@ -38,14 +38,14 @@ UINT8 n2a03_device::mi_2a03_normal::read(UINT16 adr) return program->read_byte(adr); } -UINT8 n2a03_device::mi_2a03_normal::read_direct(UINT16 adr) +UINT8 n2a03_device::mi_2a03_normal::read_sync(UINT16 adr) { - return direct->read_raw_byte(adr); + return sdirect->read_byte(adr); } -UINT8 n2a03_device::mi_2a03_normal::read_decrypted(UINT16 adr) +UINT8 n2a03_device::mi_2a03_normal::read_arg(UINT16 adr) { - return direct->read_decrypted_byte(adr); + return direct->read_byte(adr); } void n2a03_device::mi_2a03_normal::write(UINT16 adr, UINT8 val) @@ -58,12 +58,12 @@ UINT8 n2a03_device::mi_2a03_nd::read(UINT16 adr) return program->read_byte(adr); } -UINT8 n2a03_device::mi_2a03_nd::read_direct(UINT16 adr) +UINT8 n2a03_device::mi_2a03_nd::read_sync(UINT16 adr) { - return program->read_byte(adr); + return sprogram->read_byte(adr); } -UINT8 n2a03_device::mi_2a03_nd::read_decrypted(UINT16 adr) +UINT8 n2a03_device::mi_2a03_nd::read_arg(UINT16 adr) { return program->read_byte(adr); } diff --git a/src/emu/cpu/m6502/n2a03.h b/src/emu/cpu/m6502/n2a03.h index c2f8a7f511b..a046ef71ad3 100644 --- a/src/emu/cpu/m6502/n2a03.h +++ b/src/emu/cpu/m6502/n2a03.h @@ -28,8 +28,8 @@ protected: public: virtual ~mi_2a03_normal() {} virtual UINT8 read(UINT16 adr); - virtual UINT8 read_direct(UINT16 adr); - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); + virtual UINT8 read_arg(UINT16 adr); virtual void write(UINT16 adr, UINT8 val); }; @@ -37,8 +37,8 @@ protected: public: virtual ~mi_2a03_nd() {} virtual UINT8 read(UINT16 adr); - virtual UINT8 read_direct(UINT16 adr); - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); + virtual UINT8 read_arg(UINT16 adr); virtual void write(UINT16 adr, UINT8 val); }; diff --git a/src/emu/cpu/m6502/odeco16.lst b/src/emu/cpu/m6502/odeco16.lst index cf8b75455d6..6cea2fa7282 100644 --- a/src/emu/cpu/m6502/odeco16.lst +++ b/src/emu/cpu/m6502/odeco16.lst @@ -13,13 +13,13 @@ brk_16_imp write(SP, irq_taken ? P & ~F_B : P); dec_SP(); if(nmi_state) { - PC = read_direct(0xfff7); - PC = set_h(PC, read_direct(0xfff6)); + PC = read_arg(0xfff7); + PC = set_h(PC, read_arg(0xfff6)); nmi_state = false; standard_irq_callback(NMI_LINE); } else { - PC = read_direct(0xfff3); - PC = set_h(PC, read_direct(0xfff2)); + PC = read_arg(0xfff3); + PC = set_h(PC, read_arg(0xfff2)); if(irq_taken) standard_irq_callback(IRQ_LINE); } @@ -95,7 +95,7 @@ vbl_zpg # exceptions reset_16 - PC = read_direct(0xfff1); - PC = set_h(PC, read_direct(0xfff0)); + PC = read_arg(0xfff1); + PC = set_h(PC, read_arg(0xfff0)); prefetch(); inst_state = -1; diff --git a/src/emu/cpu/m6502/om6502.lst b/src/emu/cpu/m6502/om6502.lst index f76884b554f..24c560c02fa 100644 --- a/src/emu/cpu/m6502/om6502.lst +++ b/src/emu/cpu/m6502/om6502.lst @@ -184,7 +184,7 @@ bcc_rel if(!(P & F_C)) { read_pc_noinc(); if(page_changing(PC, INT8(TMP))) { - read_direct(set_l(PC, PC+INT8(TMP))); + read_arg(set_l(PC, PC+INT8(TMP))); } PC += INT8(TMP); } @@ -195,7 +195,7 @@ bcs_rel if(P & F_C) { read_pc_noinc(); if(page_changing(PC, INT8(TMP))) { - read_direct(set_l(PC, PC+INT8(TMP))); + read_arg(set_l(PC, PC+INT8(TMP))); } PC += INT8(TMP); } @@ -206,7 +206,7 @@ beq_rel if(P & F_Z) { read_pc_noinc(); if(page_changing(PC, INT8(TMP))) { - read_direct(set_l(PC, PC+INT8(TMP))); + read_arg(set_l(PC, PC+INT8(TMP))); } PC += INT8(TMP); } @@ -228,7 +228,7 @@ bmi_rel if(P & F_N) { read_pc_noinc(); if(page_changing(PC, INT8(TMP))) { - read_direct(set_l(PC, PC+INT8(TMP))); + read_arg(set_l(PC, PC+INT8(TMP))); } PC += INT8(TMP); } @@ -239,7 +239,7 @@ bne_rel if(!(P & F_Z)) { read_pc_noinc(); if(page_changing(PC, INT8(TMP))) { - read_direct(set_l(PC, PC+INT8(TMP))); + read_arg(set_l(PC, PC+INT8(TMP))); } PC += INT8(TMP); } @@ -250,7 +250,7 @@ bpl_rel if(!(P & F_N)) { read_pc_noinc(); if(page_changing(PC, INT8(TMP))) { - read_direct(set_l(PC, PC+INT8(TMP))); + read_arg(set_l(PC, PC+INT8(TMP))); } PC += INT8(TMP); } @@ -270,13 +270,13 @@ brk_imp write(SP, irq_taken ? P & ~F_B : P); dec_SP(); if(nmi_state) { - PC = read_direct(0xfffa); - PC = set_h(PC, read_direct(0xfffb)); + PC = read_arg(0xfffa); + PC = set_h(PC, read_arg(0xfffb)); nmi_state = false; standard_irq_callback(NMI_LINE); } else { - PC = read_direct(0xfffe); - PC = set_h(PC, read_direct(0xffff)); + PC = read_arg(0xfffe); + PC = set_h(PC, read_arg(0xffff)); if(irq_taken) standard_irq_callback(IRQ_LINE); } @@ -290,7 +290,7 @@ bvc_rel if(!(P & F_V)) { read_pc_noinc(); if(page_changing(PC, INT8(TMP))) { - read_direct(set_l(PC, PC+INT8(TMP))); + read_arg(set_l(PC, PC+INT8(TMP))); } PC += INT8(TMP); } @@ -301,7 +301,7 @@ bvs_rel if(P & F_V) { read_pc_noinc(); if(page_changing(PC, INT8(TMP))) { - read_direct(set_l(PC, PC+INT8(TMP))); + read_arg(set_l(PC, PC+INT8(TMP))); } PC += INT8(TMP); } @@ -1216,8 +1216,8 @@ tya_imp # exceptions reset - PC = read_direct(0xfffc); - PC = set_h(PC, read_direct(0xfffd)); + PC = read_arg(0xfffc); + PC = set_h(PC, read_arg(0xfffd)); prefetch(); inst_state = -1; diff --git a/src/emu/cpu/m6502/om65c02.lst b/src/emu/cpu/m6502/om65c02.lst index 21bc1d4e726..d64ddcdc409 100644 --- a/src/emu/cpu/m6502/om65c02.lst +++ b/src/emu/cpu/m6502/om65c02.lst @@ -181,7 +181,7 @@ bra_rel TMP = read_pc(); read_pc_noinc(); if(page_changing(PC, INT8(TMP))) { - read_direct(set_l(PC, PC+INT8(TMP))); + read_arg(set_l(PC, PC+INT8(TMP))); } PC += INT8(TMP); prefetch(); @@ -199,13 +199,13 @@ brk_c_imp write(SP, irq_taken || nmi_state ? P & ~F_B : P); dec_SP(); if(irq_taken && nmi_state) { - PC = read_direct(0xfffa); - PC = set_h(PC, read_direct(0xfffb)); + PC = read_arg(0xfffa); + PC = set_h(PC, read_arg(0xfffb)); nmi_state = false; standard_irq_callback(NMI_LINE); } else { - PC = read_direct(0xfffe); - PC = set_h(PC, read_direct(0xffff)); + PC = read_arg(0xfffe); + PC = set_h(PC, read_arg(0xffff)); if(irq_taken) standard_irq_callback(IRQ_LINE); } diff --git a/src/emu/cpu/m6502/om65ce02.lst b/src/emu/cpu/m6502/om65ce02.lst index 6fdf244a8b1..049097fded8 100644 --- a/src/emu/cpu/m6502/om65ce02.lst +++ b/src/emu/cpu/m6502/om65ce02.lst @@ -360,12 +360,12 @@ brk_ce_imp write(SP, irq_taken || nmi_state ? P & ~F_B : P); dec_SP_ce(); if(nmi_state) { - PC = read_direct(0xfffa); - PC = set_h(PC, read_direct(0xfffb)); + PC = read_arg(0xfffa); + PC = set_h(PC, read_arg(0xfffb)); nmi_state = false; } else { - PC = read_direct(0xfffe); - PC = set_h(PC, read_direct(0xffff)); + PC = read_arg(0xfffe); + PC = set_h(PC, read_arg(0xffff)); } irq_taken = false; P = (P | F_I) & ~F_D; // Do *not* move after the prefetch diff --git a/src/emu/cpu/m6502/om740.lst b/src/emu/cpu/m6502/om740.lst index d944a0cbcb5..9f17dc639bf 100644 --- a/src/emu/cpu/m6502/om740.lst +++ b/src/emu/cpu/m6502/om740.lst @@ -99,7 +99,7 @@ bra_rel TMP = read_pc(); read_pc_noinc(); if(page_changing(PC, INT8(TMP))) { - read_direct(set_l(PC, PC+INT8(TMP))); + read_arg(set_l(PC, PC+INT8(TMP))); } PC += INT8(TMP); prefetch(); @@ -112,8 +112,8 @@ jmp_zpi prefetch(); reset740 - PC = read_direct(0xfffe); - PC = set_h(PC, read_direct(0xffff)); + PC = read_arg(0xfffe); + PC = set_h(PC, read_arg(0xffff)); prefetch(); inst_state = -1; @@ -131,13 +131,13 @@ brk740_imp write(SP, irq_taken ? P & ~F_B : P); dec_SP(); if(nmi_state) { - PC = read_direct(0xfffa); - PC = set_h(PC, read_direct(0xfffb)); + PC = read_arg(0xfffa); + PC = set_h(PC, read_arg(0xfffb)); nmi_state = false; standard_irq_callback(NMI_LINE); } else { - PC = read_direct(m_irq_vector); - PC = set_h(PC, read_direct(m_irq_vector+1)); + PC = read_arg(m_irq_vector); + PC = set_h(PC, read_arg(m_irq_vector+1)); if(irq_taken) standard_irq_callback(IRQ_LINE); } diff --git a/src/emu/cpu/m6800/m6800.c b/src/emu/cpu/m6800/m6800.c index 3cb68924929..46a7cc4a99a 100644 --- a/src/emu/cpu/m6800/m6800.c +++ b/src/emu/cpu/m6800/m6800.c @@ -160,14 +160,14 @@ static UINT32 timer_next; /* opcodes. In case of system with memory mapped I/O, this function can be */ /* used to greatly speed up emulation */ /****************************************************************************/ -#define M_RDOP(Addr) ((unsigned)m_direct->read_decrypted_byte(Addr)) +#define M_RDOP(Addr) ((unsigned)m_decrypted_opcodes_direct->read_byte(Addr)) /****************************************************************************/ /* M6800_RDOP_ARG() is identical to M6800_RDOP() but it's used for reading */ /* opcode arguments. This difference can be used to support systems that */ /* use different encoding mechanisms for opcodes and opcode arguments */ /****************************************************************************/ -#define M_RDOP_ARG(Addr) ((unsigned)m_direct->read_raw_byte(Addr)) +#define M_RDOP_ARG(Addr) ((unsigned)m_direct->read_byte(Addr)) /* macros to access memory */ #define IMMBYTE(b) b = M_RDOP_ARG(PCD); PC++ @@ -535,6 +535,7 @@ const device_type HD6303Y = &device_creator<hd6303y_cpu_device>; m6800_cpu_device::m6800_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : cpu_device(mconfig, M6800, "M6800", tag, owner, clock, "m6800", __FILE__) , m_program_config("program", ENDIANNESS_BIG, 8, 16, 0) + , m_decrypted_opcodes_config("program", ENDIANNESS_BIG, 8, 16, 0) , m_io_config("io", ENDIANNESS_BIG, 8, 9, 0) , m_has_io(false) , m_out_sc2_func(*this) @@ -548,6 +549,7 @@ m6800_cpu_device::m6800_cpu_device(const machine_config &mconfig, const char *ta m6800_cpu_device::m6800_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, bool has_io, int clock_divider, const op_func *insn, const UINT8 *cycles, address_map_constructor internal) : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source) , m_program_config("program", ENDIANNESS_BIG, 8, 16, 0, internal) + , m_decrypted_opcodes_config("program", ENDIANNESS_BIG, 8, 16, 0) , m_io_config("io", ENDIANNESS_BIG, 8, 9, 0) , m_has_io(has_io) , m_out_sc2_func(*this) @@ -625,6 +627,17 @@ hd6303y_cpu_device::hd6303y_cpu_device(const machine_config &mconfig, const char { } +const address_space_config *m6800_cpu_device::memory_space_config(address_spacenum spacenum) const +{ + switch(spacenum) + { + case AS_PROGRAM: return &m_program_config; + case AS_IO: return m_has_io ? &m_io_config : NULL; + case AS_DECRYPTED_OPCODES: return has_configured_map(AS_DECRYPTED_OPCODES) ? &m_decrypted_opcodes_config : NULL; + default: return NULL; + } +} + UINT32 m6800_cpu_device::RM16(UINT32 Addr ) { @@ -1039,6 +1052,8 @@ void m6800_cpu_device::device_start() { m_program = &space(AS_PROGRAM); m_direct = &m_program->direct(); + m_decrypted_opcodes = has_space(AS_DECRYPTED_OPCODES) ? &space(AS_DECRYPTED_OPCODES) : m_program; + m_decrypted_opcodes_direct = &m_decrypted_opcodes->direct(); if ( m_has_io ) m_io = &space(AS_IO); diff --git a/src/emu/cpu/m6800/m6800.h b/src/emu/cpu/m6800/m6800.h index 1f7d668861b..af02be492d8 100644 --- a/src/emu/cpu/m6800/m6800.h +++ b/src/emu/cpu/m6800/m6800.h @@ -84,7 +84,7 @@ protected: virtual void execute_set_input(int inputnum, int state); // device_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO && m_has_io) ? &m_io_config : NULL ); } + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; // device_state_interface overrides void state_string_export(const device_state_entry &entry, std::string &str); @@ -95,6 +95,7 @@ protected: virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options); address_space_config m_program_config; + address_space_config m_decrypted_opcodes_config; address_space_config m_io_config; bool m_has_io; @@ -115,8 +116,8 @@ protected: int m_sc1_state; /* Memory spaces */ - address_space *m_program; - direct_read_data *m_direct; + address_space *m_program, *m_decrypted_opcodes; + direct_read_data *m_direct, *m_decrypted_opcodes_direct; address_space *m_io; const op_func *m_insn; diff --git a/src/emu/cpu/m68000/m68000.h b/src/emu/cpu/m68000/m68000.h index d5ab6b16b84..5279ad655ec 100644 --- a/src/emu/cpu/m68000/m68000.h +++ b/src/emu/cpu/m68000/m68000.h @@ -166,7 +166,7 @@ public: virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; // address spaces - const address_space_config m_program_config; + const address_space_config m_program_config, m_oprogram_config; void define_state(void); @@ -175,7 +175,6 @@ public: void set_rte_callback(write_line_delegate callback); void set_tas_write_callback(write8_delegate callback); UINT16 get_fc(); - void set_encrypted_opcode_range(offs_t start, offs_t end); void set_hmmu_enable(int enable); void set_instruction_hook(read32_delegate ihook); void set_buserror_details(UINT32 fault_addr, UINT8 rw, UINT8 fc); @@ -263,7 +262,7 @@ public: allowing writeback to be disabled globally or selectively or other side effects to be implemented */ - address_space *program; + address_space *program, *oprogram; /* Redirect memory calls */ @@ -278,11 +277,11 @@ public: // class m68k_memory_interface // { public: - void init8(address_space &space); - void init16(address_space &space); - void init32(address_space &space); - void init32mmu(address_space &space); - void init32hmmu(address_space &space); + void init8(address_space &space, address_space &ospace); + void init16(address_space &space, address_space &ospace); + void init32(address_space &space, address_space &ospace); + void init32mmu(address_space &space, address_space &ospace); + void init32hmmu(address_space &space, address_space &ospace); offs_t opcode_xor; // Address Calculation m68k_readimm16_delegate readimm16; // Immediate read 16 bit @@ -322,11 +321,8 @@ public: public: // m68k_memory_interface memory; - address_space *m_space; - direct_read_data *m_direct; - - offs_t encrypted_start; - offs_t encrypted_end; + address_space *m_space, *m_ospace; + direct_read_data *m_direct, *m_odirect; UINT32 iotemp; diff --git a/src/emu/cpu/m68000/m68kcpu.c b/src/emu/cpu/m68000/m68kcpu.c index 62e14a0cf79..bb83abade83 100644 --- a/src/emu/cpu/m68000/m68kcpu.c +++ b/src/emu/cpu/m68000/m68kcpu.c @@ -956,6 +956,7 @@ void m68000_base_device::init_cpu_common(void) //this = device;//deviceparam; program = &space(AS_PROGRAM); + oprogram = has_space(AS_DECRYPTED_OPCODES) ? &space(AS_DECRYPTED_OPCODES) : program; int_ack_callback = device_irq_acknowledge_delegate(FUNC(m68000_base_device::standard_irq_callback_member), this); /* disable all MMUs */ @@ -1230,12 +1231,6 @@ void m68000_base_device::state_string_export(const device_state_entry &entry, st /* global access */ -void m68000_base_device::set_encrypted_opcode_range(offs_t start, offs_t end) -{ - encrypted_start = start; - encrypted_end = end; -} - void m68000_base_device::set_hmmu_enable(int enable) { hmmu_enabled = enable; @@ -1252,13 +1247,15 @@ void m68000_base_device::set_instruction_hook(read32_delegate ihook) UINT16 m68000_base_device::m68008_read_immediate_16(offs_t address) { - return (m_direct->read_decrypted_byte(address) << 8) | (m_direct->read_decrypted_byte(address + 1)); + return (m_odirect->read_byte(address) << 8) | (m_odirect->read_byte(address + 1)); } -void m68000_base_device::init8(address_space &space) +void m68000_base_device::init8(address_space &space, address_space &ospace) { m_space = &space; m_direct = &space.direct(); + m_ospace = &ospace; + m_odirect = &ospace.direct(); // m_cpustate = this; opcode_xor = 0; @@ -1277,12 +1274,12 @@ void m68000_base_device::init8(address_space &space) UINT16 m68000_base_device::read_immediate_16(offs_t address) { - return m_direct->read_decrypted_word((address), opcode_xor); + return m_odirect->read_word((address), opcode_xor); } UINT16 m68000_base_device::simple_read_immediate_16(offs_t address) { - return m_direct->read_decrypted_word(address); + return m_odirect->read_word(address); } void m68000_base_device::m68000_write_byte(offs_t address, UINT8 data) @@ -1292,10 +1289,13 @@ void m68000_base_device::m68000_write_byte(offs_t address, UINT8 data) m_space->write_word(address & ~1, data | (data << 8), masks[address & 1]); } -void m68000_base_device::init16(address_space &space) +void m68000_base_device::init16(address_space &space, address_space &ospace) { m_space = &space; m_direct = &space.direct(); + m_ospace = &ospace; + m_odirect = &ospace.direct(); + opcode_xor = 0; readimm16 = m68k_readimm16_delegate(FUNC(m68000_base_device::simple_read_immediate_16), this); @@ -1316,10 +1316,12 @@ void m68000_base_device::init16(address_space &space) ****************************************************************************/ /* interface for 32-bit data bus (68EC020, 68020) */ -void m68000_base_device::init32(address_space &space) +void m68000_base_device::init32(address_space &space, address_space &ospace) { m_space = &space; m_direct = &space.direct(); + m_ospace = &ospace; + m_odirect = &ospace.direct(); opcode_xor = WORD_XOR_BE(0); readimm16 = m68k_readimm16_delegate(FUNC(m68000_base_device::read_immediate_16), this); @@ -1368,7 +1370,7 @@ UINT16 m68000_base_device::read_immediate_16_mmu(offs_t address) } } - return m_direct->read_decrypted_word((address), opcode_xor); + return m_odirect->read_word((address), opcode_xor); } /* potentially misaligned 16-bit reads with a 32-bit data bus (and 24-bit address bus) */ @@ -1533,10 +1535,12 @@ void m68000_base_device::writelong_d32_mmu(offs_t address, UINT32 data) m_space->write_byte(address + 3, data); } -void m68000_base_device::init32mmu(address_space &space) +void m68000_base_device::init32mmu(address_space &space, address_space &ospace) { m_space = &space; m_direct = &space.direct(); + m_ospace = &ospace; + m_odirect = &ospace.direct(); opcode_xor = WORD_XOR_BE(0); readimm16 = m68k_readimm16_delegate(FUNC(m68000_base_device::read_immediate_16_mmu), this); @@ -1577,7 +1581,7 @@ UINT16 m68000_base_device::read_immediate_16_hmmu(offs_t address) address = hmmu_translate_addr(this, address); } - return m_direct->read_decrypted_word((address), opcode_xor); + return m_odirect->read_word((address), opcode_xor); } /* potentially misaligned 16-bit reads with a 32-bit data bus (and 24-bit address bus) */ @@ -1659,10 +1663,12 @@ void m68000_base_device::writelong_d32_hmmu(offs_t address, UINT32 data) m_space->write_byte(address + 3, data); } -void m68000_base_device::init32hmmu(address_space &space) +void m68000_base_device::init32hmmu(address_space &space, address_space &ospace) { m_space = &space; m_direct = &space.direct(); + m_ospace = &ospace; + m_odirect = &ospace.direct(); opcode_xor = WORD_XOR_BE(0); readimm16 = m68k_readimm16_delegate(FUNC(m68000_base_device::read_immediate_16_hmmu), this); @@ -1780,7 +1786,7 @@ void m68000_base_device::init_cpu_m68000(void) cpu_type = CPU_TYPE_000; // dasm_type = M68K_CPU_TYPE_68000; - init16(*program); + init16(*program, *oprogram); sr_mask = 0xa71f; /* T1 -- S -- -- I2 I1 I0 -- -- -- X N Z V C */ jump_table = m68ki_instruction_jump_table[0]; cyc_instruction = m68ki_cycles[0]; @@ -1810,7 +1816,7 @@ void m68000_base_device::init_cpu_m68008(void) cpu_type = CPU_TYPE_008; // dasm_type = M68K_CPU_TYPE_68008; - init8(*program); + init8(*program, *oprogram); sr_mask = 0xa71f; /* T1 -- S -- -- I2 I1 I0 -- -- -- X N Z V C */ jump_table = m68ki_instruction_jump_table[0]; cyc_instruction = m68ki_cycles[0]; @@ -1838,7 +1844,7 @@ void m68000_base_device::init_cpu_m68010(void) cpu_type = CPU_TYPE_010; // dasm_type = M68K_CPU_TYPE_68010; - init16(*program); + init16(*program, *oprogram); sr_mask = 0xa71f; /* T1 -- S -- -- I2 I1 I0 -- -- -- X N Z V C */ jump_table = m68ki_instruction_jump_table[1]; cyc_instruction = m68ki_cycles[1]; @@ -1865,7 +1871,7 @@ void m68000_base_device::init_cpu_m68020(void) cpu_type = CPU_TYPE_020; // dasm_type = M68K_CPU_TYPE_68020; - init32(*program); + init32(*program, *oprogram); sr_mask = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ jump_table = m68ki_instruction_jump_table[2]; cyc_instruction = m68ki_cycles[2]; @@ -1898,7 +1904,7 @@ void m68000_base_device::init_cpu_m68020pmmu(void) has_fpu = 1; - init32mmu(*program); + init32mmu(*program, *oprogram); } @@ -1911,7 +1917,7 @@ void m68000_base_device::init_cpu_m68020hmmu(void) has_fpu = 1; - init32hmmu(*program); + init32hmmu(*program, *oprogram); } void m68000_base_device::init_cpu_m68ec020(void) @@ -1922,7 +1928,7 @@ void m68000_base_device::init_cpu_m68ec020(void) // dasm_type = M68K_CPU_TYPE_68EC020; - init32(*program); + init32(*program, *oprogram); sr_mask = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ jump_table = m68ki_instruction_jump_table[2]; cyc_instruction = m68ki_cycles[2]; @@ -1951,7 +1957,7 @@ void m68000_base_device::init_cpu_m68030(void) // dasm_type = M68K_CPU_TYPE_68030; - init32mmu(*program); + init32mmu(*program, *oprogram); sr_mask = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ jump_table = m68ki_instruction_jump_table[3]; cyc_instruction = m68ki_cycles[3]; @@ -1981,7 +1987,7 @@ void m68000_base_device::init_cpu_m68ec030(void) // dasm_type = M68K_CPU_TYPE_68EC030; - init32(*program); + init32(*program, *oprogram); sr_mask = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ jump_table = m68ki_instruction_jump_table[3]; cyc_instruction = m68ki_cycles[3]; @@ -2011,7 +2017,7 @@ void m68000_base_device::init_cpu_m68040(void) // dasm_type = M68K_CPU_TYPE_68040; - init32mmu(*program); + init32mmu(*program, *oprogram); sr_mask = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ jump_table = m68ki_instruction_jump_table[4]; cyc_instruction = m68ki_cycles[4]; @@ -2040,7 +2046,7 @@ void m68000_base_device::init_cpu_m68ec040(void) // dasm_type = M68K_CPU_TYPE_68EC040; - init32(*program); + init32(*program, *oprogram); sr_mask = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ jump_table = m68ki_instruction_jump_table[4]; cyc_instruction = m68ki_cycles[4]; @@ -2069,7 +2075,7 @@ void m68000_base_device::init_cpu_m68lc040(void) // dasm_type = M68K_CPU_TYPE_68LC040; - init32mmu(*program); + init32mmu(*program, *oprogram); sr_mask = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ jump_table = m68ki_instruction_jump_table[4]; cyc_instruction = m68ki_cycles[4]; @@ -2105,7 +2111,7 @@ void m68000_base_device::init_cpu_fscpu32(void) // dasm_type = M68K_CPU_TYPE_FSCPU32; - init32(*program); + init32(*program, *oprogram); sr_mask = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ jump_table = m68ki_instruction_jump_table[5]; cyc_instruction = m68ki_cycles[5]; @@ -2133,7 +2139,7 @@ void m68000_base_device::init_cpu_coldfire(void) // dasm_type = M68K_CPU_TYPE_COLDFIRE; - init32(*program); + init32(*program, *oprogram); sr_mask = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */ jump_table = m68ki_instruction_jump_table[6]; cyc_instruction = m68ki_cycles[6]; @@ -2330,7 +2336,8 @@ const device_type M68K = &device_creator<m68000_base_device>; m68000_base_device::m68000_base_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : cpu_device(mconfig, M68K, "M68K", tag, owner, clock, "m68k", __FILE__), - m_program_config("program", ENDIANNESS_BIG, 16, 24) + m_program_config("program", ENDIANNESS_BIG, 16, 24), + m_oprogram_config("decrypted_opcodes", ENDIANNESS_BIG, 16, 24) { clear_all(); } @@ -2341,7 +2348,8 @@ m68000_base_device::m68000_base_device(const machine_config &mconfig, const char m68000_base_device::m68000_base_device(const machine_config &mconfig, const char *name, const char *tag, device_t *owner, UINT32 clock, const device_type type, UINT32 prg_data_width, UINT32 prg_address_bits, address_map_constructor internal_map, const char *shortname, const char *source) : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source), - m_program_config("program", ENDIANNESS_BIG, prg_data_width, prg_address_bits, 0, internal_map) + m_program_config("program", ENDIANNESS_BIG, prg_data_width, prg_address_bits, 0, internal_map), + m_oprogram_config("decrypted_opcodes", ENDIANNESS_BIG, prg_data_width, prg_address_bits, 0, internal_map) { clear_all(); } @@ -2350,7 +2358,8 @@ m68000_base_device::m68000_base_device(const machine_config &mconfig, const char m68000_base_device::m68000_base_device(const machine_config &mconfig, const char *name, const char *tag, device_t *owner, UINT32 clock, const device_type type, UINT32 prg_data_width, UINT32 prg_address_bits, const char *shortname, const char *source) : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source), - m_program_config("program", ENDIANNESS_BIG, prg_data_width, prg_address_bits) + m_program_config("program", ENDIANNESS_BIG, prg_data_width, prg_address_bits), + m_oprogram_config("decrypted_opcodes", ENDIANNESS_BIG, prg_data_width, prg_address_bits) { clear_all(); } @@ -2443,9 +2452,6 @@ void m68000_base_device::clear_all() m_direct = 0; - encrypted_start = 0; - encrypted_end = 0; - iotemp = 0; save_sr = 0; @@ -2536,12 +2542,12 @@ void m68000_base_device::execute_set_input(int inputnum, int state) const address_space_config *m68000_base_device::memory_space_config(address_spacenum spacenum) const { - if (spacenum == AS_PROGRAM) + switch(spacenum) { - return &m_program_config; + case AS_PROGRAM: return &m_program_config; + case AS_DECRYPTED_OPCODES: return has_configured_map(AS_DECRYPTED_OPCODES) ? &m_oprogram_config : NULL; + default: return NULL; } - - return NULL; } diff --git a/src/emu/cpu/m68000/m68kcpu.h b/src/emu/cpu/m68000/m68kcpu.h index 03909114628..831fb024a88 100644 --- a/src/emu/cpu/m68000/m68kcpu.h +++ b/src/emu/cpu/m68000/m68kcpu.h @@ -626,26 +626,17 @@ INLINE unsigned int m68k_read_immediate_32(m68000_base_device *m68k, unsigned in INLINE unsigned int m68k_read_pcrelative_8(m68000_base_device *m68k, unsigned int address) { - if (address >= m68k->encrypted_start && address < m68k->encrypted_end) - return ((m68k->/*memory.*/readimm16(address&~1)>>(8*(1-(address & 1))))&0xff); - - return m68k->/*memory.*/read8(address); + return ((m68k->/*memory.*/readimm16(address&~1)>>(8*(1-(address & 1))))&0xff); } INLINE unsigned int m68k_read_pcrelative_16(m68000_base_device *m68k, unsigned int address) { - if (address >= m68k->encrypted_start && address < m68k->encrypted_end) - return m68k->/*memory.*/readimm16(address); - - return m68k->/*memory.*/read16(address); + return m68k->/*memory.*/readimm16(address); } INLINE unsigned int m68k_read_pcrelative_32(m68000_base_device *m68k, unsigned int address) { - if (address >= m68k->encrypted_start && address < m68k->encrypted_end) - return m68k_read_immediate_32(m68k, address); - - return m68k->/*memory.*/read32(address); + return m68k_read_immediate_32(m68k, address); } diff --git a/src/emu/cpu/m6805/m6805.c b/src/emu/cpu/m6805/m6805.c index 8df8c9416ac..b7fc47c8dfc 100644 --- a/src/emu/cpu/m6805/m6805.c +++ b/src/emu/cpu/m6805/m6805.c @@ -53,14 +53,14 @@ /* opcodes. In case of system with memory mapped I/O, this function can be */ /* used to greatly speed up emulation */ /****************************************************************************/ -#define M6805_RDOP(addr) ((unsigned)m_direct->read_decrypted_byte(addr)) +#define M6805_RDOP(addr) ((unsigned)m_direct->read_byte(addr)) /****************************************************************************/ /* M6805_RDOP_ARG() is identical to M6805_RDOP() but it's used for reading */ /* opcode arguments. This difference can be used to support systems that */ /* use different encoding mechanisms for opcodes and opcode arguments */ /****************************************************************************/ -#define M6805_RDOP_ARG(addr) ((unsigned)m_direct->read_raw_byte(addr)) +#define M6805_RDOP_ARG(addr) ((unsigned)m_direct->read_byte(addr)) #define SP_MASK m_sp_mask /* stack pointer mask */ #define SP_LOW m_sp_low /* stack pointer low water mark */ diff --git a/src/emu/cpu/m6809/hd6309.ops b/src/emu/cpu/m6809/hd6309.ops index cddde7318d4..6da3a904d2b 100644 --- a/src/emu/cpu/m6809/hd6309.ops +++ b/src/emu/cpu/m6809/hd6309.ops @@ -14,9 +14,6 @@ MAIN: // opcode fetch @m_opcode = read_opcode(); - // burn delay loops - burn_any_delay_loops(); - // dispatch opcode switch(m_opcode) { diff --git a/src/emu/cpu/m6809/m6809.c b/src/emu/cpu/m6809/m6809.c index 1b7b0e1e777..d69b0417453 100644 --- a/src/emu/cpu/m6809/m6809.c +++ b/src/emu/cpu/m6809/m6809.c @@ -113,8 +113,10 @@ m6809_base_device::m6809_base_device(const machine_config &mconfig, const char * : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source), m_lic_func(*this), m_program_config("program", ENDIANNESS_BIG, 8, 16), + m_sprogram_config("decrypted_opcodes", ENDIANNESS_BIG, 8, 16), m_clock_divider(divider) { + m_mintf = NULL; } @@ -124,7 +126,14 @@ m6809_base_device::m6809_base_device(const machine_config &mconfig, const char * void m6809_base_device::device_start() { - m_direct = &m_addrspace[AS_PROGRAM]->direct(); + if (!m_mintf) + m_mintf = new mi_default; + + m_mintf->m_program = &space(AS_PROGRAM); + m_mintf->m_sprogram = has_space(AS_DECRYPTED_OPCODES) ? &space(AS_DECRYPTED_OPCODES) : m_mintf->m_program; + + m_mintf->m_direct = &m_mintf->m_program->direct(); + m_mintf->m_sdirect = &m_mintf->m_sprogram->direct(); m_lic_func.resolve_safe(); @@ -280,11 +289,12 @@ void m6809_base_device::device_post_load() const address_space_config *m6809_base_device::memory_space_config(address_spacenum spacenum) const { - if (spacenum == AS_PROGRAM) + switch(spacenum) { - return &m_program_config; + case AS_PROGRAM: return &m_program_config; + case AS_DECRYPTED_OPCODES: return has_configured_map(AS_DECRYPTED_OPCODES) ? &m_sprogram_config : NULL; + default: return NULL; } - return NULL; } @@ -539,6 +549,28 @@ void m6809_base_device::execute_run() } +UINT8 m6809_base_device::mi_default::read(UINT16 adr) +{ + return m_program->read_byte(adr); +} + +UINT8 m6809_base_device::mi_default::read_opcode(UINT16 adr) +{ + return m_sdirect->read_byte(adr); +} + +UINT8 m6809_base_device::mi_default::read_opcode_arg(UINT16 adr) +{ + return m_direct->read_byte(adr); +} + + +void m6809_base_device::mi_default::write(UINT16 adr, UINT8 val) +{ + m_program->write_byte(adr, val); +} + + //------------------------------------------------- // m6809_device diff --git a/src/emu/cpu/m6809/m6809.h b/src/emu/cpu/m6809/m6809.h index 7b14a6882e5..595585cd098 100644 --- a/src/emu/cpu/m6809/m6809.h +++ b/src/emu/cpu/m6809/m6809.h @@ -39,6 +39,27 @@ public: DECLARE_WRITE_LINE_MEMBER( nmi_line ); protected: + class memory_interface { + public: + address_space *m_program, *m_sprogram; + direct_read_data *m_direct, *m_sdirect; + + virtual ~memory_interface() {} + virtual UINT8 read(UINT16 adr) = 0; + virtual UINT8 read_opcode(UINT16 adr) = 0; + virtual UINT8 read_opcode_arg(UINT16 adr) = 0; + virtual void write(UINT16 adr, UINT8 val) = 0; + }; + + class mi_default : public memory_interface { + public: + virtual ~mi_default() {} + virtual UINT8 read(UINT16 adr); + virtual UINT8 read_opcode(UINT16 adr); + virtual UINT8 read_opcode_arg(UINT16 adr); + virtual void write(UINT16 adr, UINT8 val); + }; + // device-level overrides virtual void device_start(); virtual void device_reset(); @@ -119,6 +140,9 @@ protected: VECTOR_RESET_FFFE = 0xFFFE }; + // Memory interface + memory_interface * m_mintf; + // CPU registers PAIR16 m_pc; // program counter PAIR16 m_ppc; // previous program counter @@ -151,19 +175,19 @@ protected: void eat_remaining(); // read a byte from given memory location - inline UINT8 read_memory(UINT16 address) { eat(1); return m_addrspace[AS_PROGRAM]->read_byte(address); } + inline UINT8 read_memory(UINT16 address) { eat(1); return m_mintf->read(address); } // write a byte to given memory location - inline void write_memory(UINT16 address, UINT8 data) { eat(1); m_addrspace[AS_PROGRAM]->write_byte(address, data); } + inline void write_memory(UINT16 address, UINT8 data) { eat(1); m_mintf->write(address, data); } // read_opcode() is like read_memory() except it is used for reading opcodes. In the case of a system // with memory mapped I/O, this function can be used to greatly speed up emulation. - inline UINT8 read_opcode(UINT16 address) { eat(1); return m_direct->read_decrypted_byte(address); } + inline UINT8 read_opcode(UINT16 address) { eat(1); return m_mintf->read_opcode(address); } // read_opcode_arg() is identical to read_opcode() except it is used for reading opcode arguments. This // difference can be used to support systems that use different encoding mechanisms for opcodes // and opcode arguments. - inline UINT8 read_opcode_arg(UINT16 address) { eat(1); return m_direct->read_raw_byte(address); } + inline UINT8 read_opcode_arg(UINT16 address) { eat(1); return m_mintf->read_opcode_arg(address); } // read_opcode() and bump the program counter inline UINT8 read_opcode() { return read_opcode(m_pc.w++); } @@ -187,10 +211,6 @@ protected: void write_operand(UINT8 data); void write_operand(int ordinal, UINT8 data); - // delay loops - bool match_target_bytes(UINT16 address, const UINT8 *bytes, int length); - void burn_any_delay_loops(); - // instructions void daa(); void mul(); @@ -245,7 +265,7 @@ protected: private: // address spaces const address_space_config m_program_config; - direct_read_data * m_direct; + const address_space_config m_sprogram_config; // other state UINT32 m_state; diff --git a/src/emu/cpu/m6809/m6809.ops b/src/emu/cpu/m6809/m6809.ops index 49fe45644b9..96b9f6c11a7 100644 --- a/src/emu/cpu/m6809/m6809.ops +++ b/src/emu/cpu/m6809/m6809.ops @@ -16,9 +16,6 @@ MAIN: @m_opcode = read_opcode(); m_lic_func(CLEAR_LINE); - // burn delay loops - burn_any_delay_loops(); - // dispatch opcode switch(m_opcode) { diff --git a/src/emu/cpu/m6809/m6809inl.h b/src/emu/cpu/m6809/m6809inl.h index 4959bcb7fda..8fd1cfe330d 100644 --- a/src/emu/cpu/m6809/m6809inl.h +++ b/src/emu/cpu/m6809/m6809inl.h @@ -126,48 +126,6 @@ inline ATTR_FORCE_INLINE void m6809_base_device::write_operand(int ordinal, UINT //------------------------------------------------- -// match_target_bytes -//------------------------------------------------- - -inline ATTR_FORCE_INLINE bool m6809_base_device::match_target_bytes(UINT16 address, const UINT8 *bytes, int length) -{ - UINT8 *start_raw = (UINT8 *) m_direct->read_raw_ptr(address); - UINT8 *start_decrypted = (UINT8 *) m_direct->read_decrypted_ptr(address); - UINT8 *end_raw = (UINT8 *) m_direct->read_raw_ptr(address + length - 1); - UINT8 *end_decrypted = (UINT8 *) m_direct->read_decrypted_ptr(address + length - 1); - - return (start_raw != NULL) - && (end_raw != NULL) - && (start_raw == start_decrypted) - && (end_raw == end_decrypted) - && (start_raw + length - 1 == end_raw) - && !memcmp(start_raw, bytes, length); -} - - -//------------------------------------------------- -// burn_any_delay_loops - optimization for delay -// loops -//------------------------------------------------- - -inline ATTR_FORCE_INLINE void m6809_base_device::burn_any_delay_loops() -{ - static const UINT8 target_bytes[] = { 0x30, 0x1F, 0x26, 0xFC }; - - if ((m_opcode == 0x26) - && !(m_cc & CC_Z) - && !(machine().debug_flags & DEBUG_FLAG_CALL_HOOK) - && match_target_bytes(m_pc.w - 3, target_bytes, ARRAY_LENGTH(target_bytes))) - { - // LEAX -1,X ; BNE * - UINT16 burned_loops = MIN((int) m_x.w - 1, m_icount / 8); - m_x.w -= burned_loops; - eat(burned_loops * 8); - } -} - - -//------------------------------------------------- // daa - decimal arithmetic adjustment instruction //------------------------------------------------- diff --git a/src/emu/cpu/mb86233/mb86233.c b/src/emu/cpu/mb86233/mb86233.c index c9ccd6e31ad..0ad34296064 100644 --- a/src/emu/cpu/mb86233/mb86233.c +++ b/src/emu/cpu/mb86233/mb86233.c @@ -69,7 +69,7 @@ offs_t mb86233_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const UIN #define GETBRAM() m_BRAM #define GETREPCNT() m_repcnt -#define ROPCODE(a) m_direct->read_decrypted_dword(a<<2) +#define ROPCODE(a) m_direct->read_dword(a<<2) #define RDMEM(a) m_program->read_dword((a<<2)) #define WRMEM(a,v) m_program->write_dword((a<<2), v) diff --git a/src/emu/cpu/mb88xx/mb88xx.c b/src/emu/cpu/mb88xx/mb88xx.c index 2bd49a6374d..0508bfad1d4 100644 --- a/src/emu/cpu/mb88xx/mb88xx.c +++ b/src/emu/cpu/mb88xx/mb88xx.c @@ -47,7 +47,7 @@ const device_type MB8844 = &device_creator<mb8844_cpu_device>; MACROS ***************************************************************************/ -#define READOP(a) (m_direct->read_decrypted_byte(a)) +#define READOP(a) (m_direct->read_byte(a)) #define RDMEM(a) (m_data->read_byte(a)) #define WRMEM(a,v) (m_data->write_byte((a), (v))) diff --git a/src/emu/cpu/mc68hc11/mc68hc11.c b/src/emu/cpu/mc68hc11/mc68hc11.c index 1ead2b94fdf..f05d9126334 100644 --- a/src/emu/cpu/mc68hc11/mc68hc11.c +++ b/src/emu/cpu/mc68hc11/mc68hc11.c @@ -300,13 +300,13 @@ void mc68hc11_cpu_device::hc11_regs_w(UINT32 address, UINT8 value) UINT8 mc68hc11_cpu_device::FETCH() { - return m_direct->read_decrypted_byte(m_pc++); + return m_direct->read_byte(m_pc++); } UINT16 mc68hc11_cpu_device::FETCH16() { UINT16 w; - w = (m_direct->read_decrypted_byte(m_pc) << 8) | (m_direct->read_decrypted_byte(m_pc+1)); + w = (m_direct->read_byte(m_pc) << 8) | (m_direct->read_byte(m_pc+1)); m_pc += 2; return w; } diff --git a/src/emu/cpu/mcs48/mcs48.c b/src/emu/cpu/mcs48/mcs48.c index 6025ffe07cd..a24cf72f0d6 100644 --- a/src/emu/cpu/mcs48/mcs48.c +++ b/src/emu/cpu/mcs48/mcs48.c @@ -348,7 +348,7 @@ offs_t upi41_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 UINT8 mcs48_cpu_device::opcode_fetch() { - return m_direct->read_decrypted_byte(m_pc++); + return m_direct->read_byte(m_pc++); } @@ -359,7 +359,7 @@ UINT8 mcs48_cpu_device::opcode_fetch() UINT8 mcs48_cpu_device::argument_fetch() { - return m_direct->read_raw_byte(m_pc++); + return m_direct->read_byte(m_pc++); } diff --git a/src/emu/cpu/mcs51/mcs51.c b/src/emu/cpu/mcs51/mcs51.c index d3c73ecf0c6..3e262b68c8c 100644 --- a/src/emu/cpu/mcs51/mcs51.c +++ b/src/emu/cpu/mcs51/mcs51.c @@ -379,8 +379,8 @@ ds5002fp_device::ds5002fp_device(const machine_config &mconfig, const char *tag, ***************************************************************************/ /* Read Opcode/Opcode Arguments from Program Code */ -#define ROP(pc) m_direct->read_decrypted_byte(pc) -#define ROP_ARG(pc) m_direct->read_raw_byte(pc) +#define ROP(pc) m_direct->read_byte(pc) +#define ROP_ARG(pc) m_direct->read_byte(pc) /* Read a byte from External Code Memory (Usually Program Rom(s) Space) */ #define CODEMEM_R(a) (UINT8)m_program->read_byte(a) @@ -1996,7 +1996,7 @@ void mcs51_cpu_device::execute_run() /* Read next opcode */ PPC = PC; debugger_instruction_hook(this, PC); - op = m_direct->read_decrypted_byte(PC++); + op = m_direct->read_byte(PC++); /* process opcode and count cycles */ m_inst_cycles = mcs51_cycles[op]; diff --git a/src/emu/cpu/mcs96/mcs96.h b/src/emu/cpu/mcs96/mcs96.h index 3f91c0b64ea..d121a31e546 100644 --- a/src/emu/cpu/mcs96/mcs96.h +++ b/src/emu/cpu/mcs96/mcs96.h @@ -119,7 +119,7 @@ protected: inline void next(int cycles) { icount -= cycles_scaling*cycles; inst_state = STATE_FETCH; } inline void next_noirq(int cycles) { icount -= cycles_scaling*cycles; inst_state = STATE_FETCH_NOIRQ; } void check_irq(); - inline UINT8 read_pc() { return direct->read_decrypted_byte(PC++); } + inline UINT8 read_pc() { return direct->read_byte(PC++); } void reg_w8(UINT8 adr, UINT8 data); void reg_w16(UINT8 adr, UINT16 data); diff --git a/src/emu/cpu/mips/mips3.c b/src/emu/cpu/mips/mips3.c index 3b377dfa64f..5ceff4b5462 100644 --- a/src/emu/cpu/mips/mips3.c +++ b/src/emu/cpu/mips/mips3.c @@ -101,7 +101,7 @@ static const UINT8 fpmode_source[4] = MEMORY ACCESSORS ***************************************************************************/ -#define ROPCODE(pc) direct->read_decrypted_dword(pc) +#define ROPCODE(pc) direct->read_dword(pc) const device_type VR4300BE = &device_creator<vr4300be_device>; diff --git a/src/emu/cpu/mips/mips3drc.c b/src/emu/cpu/mips/mips3drc.c index 70c31df2220..b454d10f74a 100644 --- a/src/emu/cpu/mips/mips3drc.c +++ b/src/emu/cpu/mips/mips3drc.c @@ -1095,12 +1095,12 @@ void mips3_device::generate_checksum_block(drcuml_block *block, compiler_state * if (!(seqhead->flags & OPFLAG_VIRTUAL_NOOP)) { UINT32 sum = seqhead->opptr.l[0]; - void *base = m_direct->read_decrypted_ptr(seqhead->physpc); + void *base = m_direct->read_ptr(seqhead->physpc); UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); // load i0,base,0,dword if (seqhead->delay.first() != NULL && seqhead->physpc != seqhead->delay.first()->physpc) { - base = m_direct->read_decrypted_ptr(seqhead->delay.first()->physpc); + base = m_direct->read_ptr(seqhead->delay.first()->physpc); assert(base != NULL); UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); // load i1,base,dword UML_ADD(block, I0, I0, I1); // add i0,i0,i1 @@ -1120,20 +1120,20 @@ void mips3_device::generate_checksum_block(drcuml_block *block, compiler_state * for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next()) if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP)) { - void *base = m_direct->read_decrypted_ptr(seqhead->physpc); + void *base = m_direct->read_ptr(seqhead->physpc); UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); // load i0,base,0,dword UML_CMP(block, I0, curdesc->opptr.l[0]); // cmp i0,opptr[0] UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead)); // exne nocode,seqhead->pc } #else UINT32 sum = 0; - void *base = m_direct->read_decrypted_ptr(seqhead->physpc); + void *base = m_direct->read_ptr(seqhead->physpc); UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); // load i0,base,0,dword sum += seqhead->opptr.l[0]; for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next()) if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP)) { - base = m_direct->read_decrypted_ptr(curdesc->physpc); + base = m_direct->read_ptr(curdesc->physpc); assert(base != NULL); UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); // load i1,base,dword UML_ADD(block, I0, I0, I1); // add i0,i0,i1 @@ -1141,7 +1141,7 @@ void mips3_device::generate_checksum_block(drcuml_block *block, compiler_state * if (curdesc->delay.first() != NULL && (curdesc == seqlast || (curdesc->next() != NULL && curdesc->next()->physpc != curdesc->delay.first()->physpc))) { - base = m_direct->read_decrypted_ptr(curdesc->delay.first()->physpc); + base = m_direct->read_ptr(curdesc->delay.first()->physpc); assert(base != NULL); UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); // load i1,base,dword UML_ADD(block, I0, I0, I1); // add i0,i0,i1 diff --git a/src/emu/cpu/mips/mips3fe.c b/src/emu/cpu/mips/mips3fe.c index 7d031c32407..42055c39e24 100644 --- a/src/emu/cpu/mips/mips3fe.c +++ b/src/emu/cpu/mips/mips3fe.c @@ -49,7 +49,7 @@ bool mips3_frontend::describe(opcode_desc &desc, const opcode_desc *prev) // fetch the opcode assert((desc.physpc & 3) == 0); - op = desc.opptr.l[0] = m_mips3->m_direct->read_decrypted_dword(desc.physpc); + op = desc.opptr.l[0] = m_mips3->m_direct->read_dword(desc.physpc); // all instructions are 4 bytes and default to a single cycle each desc.length = 4; diff --git a/src/emu/cpu/mips/r3000.c b/src/emu/cpu/mips/r3000.c index 5e6fa280884..1b64e05799c 100644 --- a/src/emu/cpu/mips/r3000.c +++ b/src/emu/cpu/mips/r3000.c @@ -498,7 +498,7 @@ offs_t r3000_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *op inline UINT32 r3000_device::readop(offs_t pc) { - return m_direct->read_decrypted_dword(pc); + return m_direct->read_dword(pc); } UINT8 r3000_device::readmem(offs_t offset) diff --git a/src/emu/cpu/nec/nec.c b/src/emu/cpu/nec/nec.c index 173e18fdebd..6c53cfa677a 100644 --- a/src/emu/cpu/nec/nec.c +++ b/src/emu/cpu/nec/nec.c @@ -210,7 +210,7 @@ void nec_common_device::do_prefetch(int previous_ICount) UINT8 nec_common_device::fetch() { prefetch(); - return m_direct->read_raw_byte((Sreg(PS)<<4)+m_ip++, m_fetch_xor); + return m_direct->read_byte((Sreg(PS)<<4)+m_ip++, m_fetch_xor); } UINT16 nec_common_device::fetchword() @@ -230,7 +230,7 @@ static UINT8 parity_table[256]; UINT8 nec_common_device::fetchop() { prefetch(); - return m_direct->read_decrypted_byte(( Sreg(PS)<<4)+m_ip++, m_fetch_xor); + return m_direct->read_byte(( Sreg(PS)<<4)+m_ip++, m_fetch_xor); } diff --git a/src/emu/cpu/nec/v25.c b/src/emu/cpu/nec/v25.c index bf4ee0ab6ed..384043c8f9c 100644 --- a/src/emu/cpu/nec/v25.c +++ b/src/emu/cpu/nec/v25.c @@ -122,7 +122,7 @@ void v25_common_device::do_prefetch(int previous_ICount) UINT8 v25_common_device::fetch() { prefetch(); - return m_direct->read_raw_byte((Sreg(PS)<<4)+m_ip++, m_fetch_xor); + return m_direct->read_byte((Sreg(PS)<<4)+m_ip++, m_fetch_xor); } UINT16 v25_common_device::fetchword() @@ -146,7 +146,7 @@ UINT8 v25_common_device::fetchop() UINT8 ret; prefetch(); - ret = m_direct->read_decrypted_byte(( Sreg(PS)<<4)+m_ip++, m_fetch_xor); + ret = m_direct->read_byte(( Sreg(PS)<<4)+m_ip++, m_fetch_xor); if (m_MF == 0) if (m_v25v35_decryptiontable) diff --git a/src/emu/cpu/pic16c5x/pic16c5x.c b/src/emu/cpu/pic16c5x/pic16c5x.c index 0c78f34eebd..3acd46944f7 100644 --- a/src/emu/cpu/pic16c5x/pic16c5x.c +++ b/src/emu/cpu/pic16c5x/pic16c5x.c @@ -167,7 +167,7 @@ void pic16c5x_device::update_internalram_ptr() -#define PIC16C5x_RDOP(A) (m_direct->read_decrypted_word((A)<<1)) +#define PIC16C5x_RDOP(A) (m_direct->read_word((A)<<1)) #define PIC16C5x_RAM_RDMEM(A) ((UINT8)m_data->read_byte(A)) #define PIC16C5x_RAM_WRMEM(A,V) (m_data->write_byte(A,V)) diff --git a/src/emu/cpu/pic16c62x/pic16c62x.c b/src/emu/cpu/pic16c62x/pic16c62x.c index 1d2dae52b95..2a38bcd5f93 100644 --- a/src/emu/cpu/pic16c62x/pic16c62x.c +++ b/src/emu/cpu/pic16c62x/pic16c62x.c @@ -170,7 +170,7 @@ void pic16c62x_device::update_internalram_ptr() m_internalram = (UINT8 *)m_data->get_write_ptr(0x00); } -#define PIC16C62x_RDOP(A) (m_direct->read_decrypted_word((A)<<1)) +#define PIC16C62x_RDOP(A) (m_direct->read_word((A)<<1)) #define PIC16C62x_RAM_RDMEM(A) ((UINT8)m_data->read_byte(A)) #define PIC16C62x_RAM_WRMEM(A,V) (m_data->write_byte(A,V)) #define PIC16C62x_In(Port) ((UINT8)m_io->read_byte((Port))) diff --git a/src/emu/cpu/powerpc/ppcdrc.c b/src/emu/cpu/powerpc/ppcdrc.c index 561dec685bf..088eab855aa 100644 --- a/src/emu/cpu/powerpc/ppcdrc.c +++ b/src/emu/cpu/powerpc/ppcdrc.c @@ -1595,7 +1595,7 @@ void ppc_device::generate_checksum_block(drcuml_block *block, compiler_state *co { if (!(seqhead->flags & OPFLAG_VIRTUAL_NOOP)) { - void *base = m_direct->read_decrypted_ptr(seqhead->physpc, m_codexor); + void *base = m_direct->read_ptr(seqhead->physpc, m_codexor); UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); // load i0,base,dword UML_CMP(block, I0, seqhead->opptr.l[0]); // cmp i0,*opptr UML_EXHc(block, COND_NE, *m_nocode, seqhead->pc); // exne nocode,seqhead->pc @@ -1609,20 +1609,20 @@ void ppc_device::generate_checksum_block(drcuml_block *block, compiler_state *co for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next()) if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP)) { - void *base = m_direct->read_decrypted_ptr(seqhead->physpc, m_codexor); + void *base = m_direct->read_ptr(seqhead->physpc, m_codexor); UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); // load i0,base,dword UML_CMP(block, I0, curdesc->opptr.l[0]); // cmp i0,*opptr UML_EXHc(block, COND_NE, *m_nocode, seqhead->pc); // exne nocode,seqhead->pc } #else UINT32 sum = 0; - void *base = m_direct->read_decrypted_ptr(seqhead->physpc, m_codexor); + void *base = m_direct->read_ptr(seqhead->physpc, m_codexor); UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); // load i0,base,dword sum += seqhead->opptr.l[0]; for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next()) if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP)) { - base = m_direct->read_decrypted_ptr(curdesc->physpc, m_codexor); + base = m_direct->read_ptr(curdesc->physpc, m_codexor); UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); // load i1,base,dword UML_ADD(block, I0, I0, I1); // add i0,i0,i1 sum += curdesc->opptr.l[0]; diff --git a/src/emu/cpu/powerpc/ppcfe.c b/src/emu/cpu/powerpc/ppcfe.c index 94037f7e137..8ba5a90eb4e 100644 --- a/src/emu/cpu/powerpc/ppcfe.c +++ b/src/emu/cpu/powerpc/ppcfe.c @@ -83,7 +83,7 @@ bool ppc_frontend::describe(opcode_desc &desc, const opcode_desc *prev) } // fetch the opcode - op = desc.opptr.l[0] = m_ppc->m_direct->read_decrypted_dword(desc.physpc, m_ppc->m_codexor); + op = desc.opptr.l[0] = m_ppc->m_direct->read_dword(desc.physpc, m_ppc->m_codexor); // all instructions are 4 bytes and default to a single cycle each desc.length = 4; diff --git a/src/emu/cpu/pps4/pps4.c b/src/emu/cpu/pps4/pps4.c index bd04a900030..5be986f2c3d 100644 --- a/src/emu/cpu/pps4/pps4.c +++ b/src/emu/cpu/pps4/pps4.c @@ -115,7 +115,7 @@ offs_t pps4_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *opr */ inline UINT8 pps4_device::ROP() { - const UINT8 op = m_direct->read_decrypted_byte(m_P & 0xFFF); + const UINT8 op = m_direct->read_byte(m_P & 0xFFF); m_Ip = m_I1; // save previous opcode m_P = (m_P + 1) & 0xFFF; m_icount -= 1; @@ -131,7 +131,7 @@ inline UINT8 pps4_device::ROP() */ inline UINT8 pps4_device::ARG() { - const UINT8 arg = m_direct->read_raw_byte(m_P & 0xFFF); + const UINT8 arg = m_direct->read_byte(m_P & 0xFFF); m_P = (m_P + 1) & 0xFFF; m_icount -= 1; return arg; diff --git a/src/emu/cpu/psx/psx.c b/src/emu/cpu/psx/psx.c index 271c419c479..a60a1204b9f 100644 --- a/src/emu/cpu/psx/psx.c +++ b/src/emu/cpu/psx/psx.c @@ -1437,7 +1437,7 @@ void psxcpu_device::update_cop0( int reg ) ( m_cp0r[ CP0_SR ] & SR_IEC ) != 0 && ( m_cp0r[ CP0_SR ] & m_cp0r[ CP0_CAUSE ] & CAUSE_IP ) != 0 ) { - m_op = m_direct->read_decrypted_dword( m_pc ); + m_op = m_direct->read_dword( m_pc ); execute_unstoppable_instructions( 1 ); exception( EXC_INT ); } @@ -1470,11 +1470,11 @@ void psxcpu_device::fetch_next_op() { UINT32 safepc = m_delayv & ~m_bad_word_address_mask; - m_op = m_direct->read_decrypted_dword( safepc ); + m_op = m_direct->read_dword( safepc ); } else { - m_op = m_direct->read_decrypted_dword( m_pc + 4 ); + m_op = m_direct->read_dword( m_pc + 4 ); } } @@ -2289,7 +2289,7 @@ void psxcpu_device::execute_run() if( LOG_BIOSCALL ) log_bioscall(); debugger_instruction_hook( this, m_pc ); - m_op = m_direct->read_decrypted_dword( m_pc ); + m_op = m_direct->read_dword( m_pc ); if( m_berr ) { diff --git a/src/emu/cpu/rsp/rspdrc.c b/src/emu/cpu/rsp/rspdrc.c index e30bad904ec..a1fabc19638 100644 --- a/src/emu/cpu/rsp/rspdrc.c +++ b/src/emu/cpu/rsp/rspdrc.c @@ -669,12 +669,12 @@ void rsp_device::generate_checksum_block(drcuml_block *block, compiler_state *co if (!(seqhead->flags & OPFLAG_VIRTUAL_NOOP)) { UINT32 sum = seqhead->opptr.l[0]; - void *base = m_direct->read_decrypted_ptr(seqhead->physpc | 0x1000); + void *base = m_direct->read_ptr(seqhead->physpc | 0x1000); UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); // load i0,base,0,dword if (seqhead->delay.first() != NULL && seqhead->physpc != seqhead->delay.first()->physpc) { - base = m_direct->read_decrypted_ptr(seqhead->delay.first()->physpc | 0x1000); + base = m_direct->read_ptr(seqhead->delay.first()->physpc | 0x1000); assert(base != NULL); UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); // load i1,base,dword UML_ADD(block, I0, I0, I1); // add i0,i0,i1 @@ -691,13 +691,13 @@ void rsp_device::generate_checksum_block(drcuml_block *block, compiler_state *co else { UINT32 sum = 0; - void *base = m_direct->read_decrypted_ptr(seqhead->physpc | 0x1000); + void *base = m_direct->read_ptr(seqhead->physpc | 0x1000); UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); // load i0,base,0,dword sum += seqhead->opptr.l[0]; for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next()) if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP)) { - base = m_direct->read_decrypted_ptr(curdesc->physpc | 0x1000); + base = m_direct->read_ptr(curdesc->physpc | 0x1000); assert(base != NULL); UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); // load i1,base,dword UML_ADD(block, I0, I0, I1); // add i0,i0,i1 @@ -705,7 +705,7 @@ void rsp_device::generate_checksum_block(drcuml_block *block, compiler_state *co if (curdesc->delay.first() != NULL && (curdesc == seqlast || (curdesc->next() != NULL && curdesc->next()->physpc != curdesc->delay.first()->physpc))) { - base = m_direct->read_decrypted_ptr(curdesc->delay.first()->physpc | 0x1000); + base = m_direct->read_ptr(curdesc->delay.first()->physpc | 0x1000); assert(base != NULL); UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); // load i1,base,dword UML_ADD(block, I0, I0, I1); // add i0,i0,i1 diff --git a/src/emu/cpu/rsp/rspfe.c b/src/emu/cpu/rsp/rspfe.c index 96291bd0d65..7a80fb6347b 100644 --- a/src/emu/cpu/rsp/rspfe.c +++ b/src/emu/cpu/rsp/rspfe.c @@ -37,7 +37,7 @@ bool rsp_frontend::describe(opcode_desc &desc, const opcode_desc *prev) UINT32 op, opswitch; // fetch the opcode - op = desc.opptr.l[0] = m_rsp.m_direct->read_decrypted_dword(desc.physpc | 0x1000); + op = desc.opptr.l[0] = m_rsp.m_direct->read_dword(desc.physpc | 0x1000); // all instructions are 4 bytes and default to a single cycle each desc.length = 4; diff --git a/src/emu/cpu/s2650/s2650.c b/src/emu/cpu/s2650/s2650.c index abdbe04a1c5..a67bc2ce5fe 100644 --- a/src/emu/cpu/s2650/s2650.c +++ b/src/emu/cpu/s2650/s2650.c @@ -229,7 +229,7 @@ inline int s2650_device::check_irq_line() ***************************************************************/ inline UINT8 s2650_device::ROP() { - UINT8 result = m_direct->read_decrypted_byte(m_page + m_iar); + UINT8 result = m_direct->read_byte(m_page + m_iar); m_iar = (m_iar + 1) & PMSK; return result; } @@ -240,7 +240,7 @@ inline UINT8 s2650_device::ROP() ***************************************************************/ inline UINT8 s2650_device::ARG() { - UINT8 result = m_direct->read_raw_byte(m_page + m_iar); + UINT8 result = m_direct->read_byte(m_page + m_iar); m_iar = (m_iar + 1) & PMSK; return result; } diff --git a/src/emu/cpu/saturn/satops.inc b/src/emu/cpu/saturn/satops.inc index 35befaaa55f..8f7420584e3 100644 --- a/src/emu/cpu/saturn/satops.inc +++ b/src/emu/cpu/saturn/satops.inc @@ -9,7 +9,7 @@ int saturn_device::READ_OP() { UINT8 data; m_icount-=3; - data=m_direct->read_decrypted_byte(m_pc); + data=m_direct->read_byte(m_pc); saturn_assert(data<0x10); m_pc=(m_pc+1)&0xfffff; return data; @@ -19,7 +19,7 @@ int saturn_device::READ_OP_ARG() { UINT8 data; m_icount-=3; - data=m_direct->read_raw_byte(m_pc); + data=m_direct->read_byte(m_pc); saturn_assert(data<0x10); m_pc=(m_pc+1)&0xfffff; return data; diff --git a/src/emu/cpu/sc61860/scops.inc b/src/emu/cpu/sc61860/scops.inc index bde6edd53e1..7bc5b05c987 100644 --- a/src/emu/cpu/sc61860/scops.inc +++ b/src/emu/cpu/sc61860/scops.inc @@ -18,18 +18,18 @@ UINT8 sc61860_device::READ_OP() { - return m_direct->read_decrypted_byte(m_pc++); + return m_direct->read_byte(m_pc++); } UINT8 sc61860_device::READ_OP_ARG() { - return m_direct->read_raw_byte(m_pc++); + return m_direct->read_byte(m_pc++); } UINT16 sc61860_device::READ_OP_ARG_WORD() { - UINT16 t=m_direct->read_decrypted_byte(m_pc++)<<8; - t|=m_direct->read_decrypted_byte(m_pc++); + UINT16 t=m_direct->read_byte(m_pc++)<<8; + t|=m_direct->read_byte(m_pc++); return t; } diff --git a/src/emu/cpu/scmp/scmp.c b/src/emu/cpu/scmp/scmp.c index cbfaf6a82c2..edd8502c1c5 100644 --- a/src/emu/cpu/scmp/scmp.c +++ b/src/emu/cpu/scmp/scmp.c @@ -69,14 +69,14 @@ UINT8 scmp_device::ROP() { UINT16 pc = m_PC.w.l; m_PC.w.l = ADD12(m_PC.w.l,1); - return m_direct->read_decrypted_byte( pc); + return m_direct->read_byte( pc); } UINT8 scmp_device::ARG() { UINT16 pc = m_PC.w.l; m_PC.w.l = ADD12(m_PC.w.l,1); - return m_direct->read_raw_byte(pc); + return m_direct->read_byte(pc); } UINT8 scmp_device::RM(UINT32 a) diff --git a/src/emu/cpu/score/score.c b/src/emu/cpu/score/score.c index 3ecbbe6fb4c..a8e3dd210fc 100644 --- a/src/emu/cpu/score/score.c +++ b/src/emu/cpu/score/score.c @@ -283,7 +283,7 @@ INT32 score7_cpu_device::sign_extend(UINT32 data, UINT8 len) UINT32 score7_cpu_device::fetch() { - return m_direct->read_decrypted_dword(m_pc & ~3); + return m_direct->read_dword(m_pc & ~3); } UINT8 score7_cpu_device::read_byte(offs_t offset) diff --git a/src/emu/cpu/se3208/se3208.c b/src/emu/cpu/se3208/se3208.c index 31cbdfe73a2..98a87335d33 100644 --- a/src/emu/cpu/se3208/se3208.c +++ b/src/emu/cpu/se3208/se3208.c @@ -1738,7 +1738,7 @@ void se3208_device::execute_run() { do { - UINT16 Opcode=m_direct->read_decrypted_word(m_PC, WORD_XOR_LE(0)); + UINT16 Opcode=m_direct->read_word(m_PC, WORD_XOR_LE(0)); debugger_instruction_hook(this, m_PC); diff --git a/src/emu/cpu/sh2/sh2.c b/src/emu/cpu/sh2/sh2.c index 9e7c5a467a1..179cc533dc3 100644 --- a/src/emu/cpu/sh2/sh2.c +++ b/src/emu/cpu/sh2/sh2.c @@ -150,6 +150,7 @@ ADDRESS_MAP_END sh2_device::sh2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : cpu_device(mconfig, SH2, "SH-2", tag, owner, clock, "sh2", __FILE__) , m_program_config("program", ENDIANNESS_BIG, 32, 32, 0, ADDRESS_MAP_NAME(sh2_internal_map)) + , m_decrypted_program_config("decrypted_opcodes", ENDIANNESS_BIG, 32, 32, 0) , m_is_slave(0) , m_cpu_type(CPU_TYPE_SH2) , m_cache(CACHE_SIZE + sizeof(internal_sh2_state)) @@ -187,6 +188,7 @@ void sh2_device::device_stop() sh2_device::sh2_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int cpu_type) : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source) , m_program_config("program", ENDIANNESS_BIG, 32, 32, 0, ADDRESS_MAP_NAME(sh2_internal_map)) + , m_decrypted_program_config("decrypted_opcodes", ENDIANNESS_BIG, 32, 32, 0) , m_is_slave(0) , m_cpu_type(cpu_type) , m_cache(CACHE_SIZE + sizeof(internal_sh2_state)) @@ -214,6 +216,15 @@ sh1_device::sh1_device(const machine_config &mconfig, const char *tag, device_t { } +const address_space_config *sh2_device::memory_space_config(address_spacenum spacenum) const +{ + switch(spacenum) + { + case AS_PROGRAM: return &m_program_config; + case AS_DECRYPTED_OPCODES: return has_configured_map(AS_DECRYPTED_OPCODES) ? &m_decrypted_program_config : NULL; + default: return NULL; + } +} offs_t sh2_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) { @@ -2397,7 +2408,8 @@ void sh2_device::device_start() m_ftcsr_read_cb.bind_relative_to(*owner()); m_program = &space(AS_PROGRAM); - m_direct = &m_program->direct(); + m_decrypted_program = has_space(AS_DECRYPTED_OPCODES) ? &space(AS_DECRYPTED_OPCODES) : &space(AS_PROGRAM); + m_direct = &m_decrypted_program->direct(); m_internal = &space(AS_PROGRAM); save_item(NAME(m_sh2_state->pc)); diff --git a/src/emu/cpu/sh2/sh2.h b/src/emu/cpu/sh2/sh2.h index a91ac1e781d..c981dfe3c9b 100644 --- a/src/emu/cpu/sh2/sh2.h +++ b/src/emu/cpu/sh2/sh2.h @@ -138,7 +138,7 @@ protected: virtual void execute_set_input(int inputnum, int state); // device_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : NULL; } + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; // device_state_interface overrides virtual void state_import(const device_state_entry &entry); @@ -151,7 +151,7 @@ protected: virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options); private: - address_space_config m_program_config; + address_space_config m_program_config, m_decrypted_program_config; // Data that needs to be stored close to the generated DRC code struct internal_sh2_state @@ -195,7 +195,7 @@ private: UINT32 m_pcflushes[16]; // pcflush entries INT8 m_irq_line_state[17]; - address_space *m_program; + address_space *m_program, *m_decrypted_program; protected: direct_read_data *m_direct; private: diff --git a/src/emu/cpu/sh2/sh2drc.c b/src/emu/cpu/sh2/sh2drc.c index 42c2cde9434..9c636f6cf84 100644 --- a/src/emu/cpu/sh2/sh2drc.c +++ b/src/emu/cpu/sh2/sh2drc.c @@ -1309,7 +1309,7 @@ void sh2_device::generate_checksum_block(drcuml_block *block, compiler_state *co { if (!(seqhead->flags & OPFLAG_VIRTUAL_NOOP)) { - void *base = m_direct->read_decrypted_ptr(seqhead->physpc, SH2_CODE_XOR(0)); + void *base = m_direct->read_ptr(seqhead->physpc, SH2_CODE_XOR(0)); UML_LOAD(block, I0, base, 0, SIZE_WORD, SCALE_x2); // load i0,base,word UML_CMP(block, I0, seqhead->opptr.w[0]); // cmp i0,*opptr UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead)); // exne nocode,seqhead->pc @@ -1323,20 +1323,20 @@ void sh2_device::generate_checksum_block(drcuml_block *block, compiler_state *co for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next()) if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP)) { - base = m_direct->read_decrypted_ptr(curdesc->physpc, SH2_CODE_XOR(0)); + base = m_direct->read_ptr(curdesc->physpc, SH2_CODE_XOR(0)); UML_LOAD(block, I0, curdesc->opptr.w, 0, SIZE_WORD, SCALE_x2); // load i0,*opptr,0,word UML_CMP(block, I0, curdesc->opptr.w[0]); // cmp i0,*opptr UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead)); // exne nocode,seqhead->pc } #else UINT32 sum = 0; - void *base = m_direct->read_decrypted_ptr(seqhead->physpc, SH2_CODE_XOR(0)); + void *base = m_direct->read_ptr(seqhead->physpc, SH2_CODE_XOR(0)); UML_LOAD(block, I0, base, 0, SIZE_WORD, SCALE_x4); // load i0,base,word sum += seqhead->opptr.w[0]; for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next()) if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP)) { - base = m_direct->read_decrypted_ptr(curdesc->physpc, SH2_CODE_XOR(0)); + base = m_direct->read_ptr(curdesc->physpc, SH2_CODE_XOR(0)); UML_LOAD(block, I1, base, 0, SIZE_WORD, SCALE_x2); // load i1,*opptr,word UML_ADD(block, I0, I0, I1); // add i0,i0,i1 sum += curdesc->opptr.w[0]; diff --git a/src/emu/cpu/sh2/sh2fe.c b/src/emu/cpu/sh2/sh2fe.c index 9cc2be5c048..8ea8ccb82d3 100644 --- a/src/emu/cpu/sh2/sh2fe.c +++ b/src/emu/cpu/sh2/sh2fe.c @@ -34,7 +34,7 @@ bool sh2_frontend::describe(opcode_desc &desc, const opcode_desc *prev) UINT16 opcode; /* fetch the opcode */ - opcode = desc.opptr.w[0] = m_sh2->m_direct->read_decrypted_word(desc.physpc, SH2_CODE_XOR(0)); + opcode = desc.opptr.w[0] = m_sh2->m_direct->read_word(desc.physpc, SH2_CODE_XOR(0)); /* all instructions are 2 bytes and most are a single cycle */ desc.length = 2; diff --git a/src/emu/cpu/sh4/sh4.c b/src/emu/cpu/sh4/sh4.c index 889fe12eb5c..c5107b6e26f 100644 --- a/src/emu/cpu/sh4/sh4.c +++ b/src/emu/cpu/sh4/sh4.c @@ -3948,7 +3948,7 @@ void sh34_base_device::execute_run() { if (m_delay) { - const UINT16 opcode = m_direct->read_decrypted_word((UINT32)(m_delay & AM), WORD2_XOR_LE(0)); + const UINT16 opcode = m_direct->read_word((UINT32)(m_delay & AM), WORD2_XOR_LE(0)); debugger_instruction_hook(this, (m_pc-2) & AM); @@ -3964,7 +3964,7 @@ void sh34_base_device::execute_run() } else { - const UINT16 opcode = m_direct->read_decrypted_word((UINT32)(m_pc & AM), WORD2_XOR_LE(0)); + const UINT16 opcode = m_direct->read_word((UINT32)(m_pc & AM), WORD2_XOR_LE(0)); debugger_instruction_hook(this, m_pc & AM); @@ -3995,7 +3995,7 @@ void sh3be_device::execute_run() { if (m_delay) { - const UINT16 opcode = m_direct->read_decrypted_word((UINT32)(m_delay & AM), WORD_XOR_LE(6)); + const UINT16 opcode = m_direct->read_word((UINT32)(m_delay & AM), WORD_XOR_LE(6)); debugger_instruction_hook(this, m_delay & AM); @@ -4014,7 +4014,7 @@ void sh3be_device::execute_run() } else { - const UINT16 opcode = m_direct->read_decrypted_word((UINT32)(m_pc & AM), WORD_XOR_LE(6)); + const UINT16 opcode = m_direct->read_word((UINT32)(m_pc & AM), WORD_XOR_LE(6)); debugger_instruction_hook(this, m_pc & AM); @@ -4045,7 +4045,7 @@ void sh4be_device::execute_run() { if (m_delay) { - const UINT16 opcode = m_direct->read_decrypted_word((UINT32)(m_delay & AM), WORD_XOR_LE(6)); + const UINT16 opcode = m_direct->read_word((UINT32)(m_delay & AM), WORD_XOR_LE(6)); debugger_instruction_hook(this, m_delay & AM); @@ -4064,7 +4064,7 @@ void sh4be_device::execute_run() } else { - const UINT16 opcode = m_direct->read_decrypted_word((UINT32)(m_pc & AM), WORD_XOR_LE(6)); + const UINT16 opcode = m_direct->read_word((UINT32)(m_pc & AM), WORD_XOR_LE(6)); debugger_instruction_hook(this, m_pc & AM); diff --git a/src/emu/cpu/ssp1601/ssp1601.c b/src/emu/cpu/ssp1601/ssp1601.c index 94720fd7e73..66c3e0baf3d 100644 --- a/src/emu/cpu/ssp1601/ssp1601.c +++ b/src/emu/cpu/ssp1601/ssp1601.c @@ -43,7 +43,7 @@ #define PPC m_ppc.w.h -#define FETCH() m_direct->read_decrypted_word(rPC++ << 1) +#define FETCH() m_direct->read_word(rPC++ << 1) #define PROGRAM_WORD(a) m_program->read_word((a) << 1) #define GET_PPC_OFFS() PPC diff --git a/src/emu/cpu/t11/t11.c b/src/emu/cpu/t11/t11.c index 46f82f9a627..211bbd1f071 100644 --- a/src/emu/cpu/t11/t11.c +++ b/src/emu/cpu/t11/t11.c @@ -58,7 +58,7 @@ t11_device::t11_device(const machine_config &mconfig, const char *tag, device_t int t11_device::ROPCODE() { PC &= 0xfffe; - int val = m_direct->read_decrypted_word(PC); + int val = m_direct->read_word(PC); PC += 2; return val; } diff --git a/src/emu/cpu/tms32010/tms32010.c b/src/emu/cpu/tms32010/tms32010.c index a90a697f58b..e6264d3f1dd 100644 --- a/src/emu/cpu/tms32010/tms32010.c +++ b/src/emu/cpu/tms32010/tms32010.c @@ -219,7 +219,7 @@ offs_t tms32010_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 * used to greatly speed up emulation */ -#define TMS32010_RDOP(A) (m_direct->read_decrypted_word((A)<<1)) +#define TMS32010_RDOP(A) (m_direct->read_word((A)<<1)) /**************************************************************************** @@ -228,7 +228,7 @@ offs_t tms32010_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 * that use different encoding mechanisms for opcodes and opcode arguments */ -#define TMS32010_RDOP_ARG(A) (m_direct->read_raw_word((A)<<1)) +#define TMS32010_RDOP_ARG(A) (m_direct->read_word((A)<<1)) /************************************************************************ diff --git a/src/emu/cpu/tms32025/tms32025.c b/src/emu/cpu/tms32025/tms32025.c index 91fa0423e1c..9acc4a31f8c 100644 --- a/src/emu/cpu/tms32025/tms32025.c +++ b/src/emu/cpu/tms32025/tms32025.c @@ -134,8 +134,8 @@ Table 3-2. TMS32025/26 Memory Blocks #define S_IN(A) (m_io->read_word((A)<<1)) #define S_OUT(A,V) (m_io->write_word(((A)<<1),(V))) -#define M_RDOP(A) ((m_pgmmap[(A) >> 7]) ? (m_pgmmap[(A) >> 7][(A) & 0x7f]) : m_direct->read_decrypted_word((A)<<1)) -#define M_RDOP_ARG(A) ((m_pgmmap[(A) >> 7]) ? (m_pgmmap[(A) >> 7][(A) & 0x7f]) : m_direct->read_decrypted_word((A)<<1)) +#define M_RDOP(A) ((m_pgmmap[(A) >> 7]) ? (m_pgmmap[(A) >> 7][(A) & 0x7f]) : m_direct->read_word((A)<<1)) +#define M_RDOP_ARG(A) ((m_pgmmap[(A) >> 7]) ? (m_pgmmap[(A) >> 7][(A) & 0x7f]) : m_direct->read_word((A)<<1)) /************************** Memory mapped registers ****************/ diff --git a/src/emu/cpu/tms32031/tms32031.c b/src/emu/cpu/tms32031/tms32031.c index df1f389e4c5..1d8096ce959 100644 --- a/src/emu/cpu/tms32031/tms32031.c +++ b/src/emu/cpu/tms32031/tms32031.c @@ -339,7 +339,7 @@ const rom_entry *tms3203x_device::device_rom_region() const inline UINT32 tms3203x_device::ROPCODE(offs_t pc) { - return m_direct->read_decrypted_dword(pc << 2); + return m_direct->read_dword(pc << 2); } diff --git a/src/emu/cpu/tms32051/tms32051.c b/src/emu/cpu/tms32051/tms32051.c index c4ddc7de55e..7e77cc01398 100644 --- a/src/emu/cpu/tms32051/tms32051.c +++ b/src/emu/cpu/tms32051/tms32051.c @@ -78,7 +78,7 @@ offs_t tms32051_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 #define CYCLES(x) (m_icount -= x) -#define ROPCODE() m_direct->read_decrypted_word((m_pc++) << 1) +#define ROPCODE() m_direct->read_word((m_pc++) << 1) void tms32051_device::CHANGE_PC(UINT16 new_pc) { diff --git a/src/emu/cpu/tms32082/tms32082.c b/src/emu/cpu/tms32082/tms32082.c index f7833e7898c..56d97713b45 100644 --- a/src/emu/cpu/tms32082/tms32082.c +++ b/src/emu/cpu/tms32082/tms32082.c @@ -426,7 +426,7 @@ void tms32082_mp_device::execute_set_input(int inputnum, int state) UINT32 tms32082_mp_device::fetch() { - UINT32 w = m_direct->read_decrypted_dword(m_fetchpc); + UINT32 w = m_direct->read_dword(m_fetchpc); m_fetchpc += 4; return w; } diff --git a/src/emu/cpu/tms34010/34010ops.c b/src/emu/cpu/tms34010/34010ops.c index 1e0866478fc..6674d7a1faa 100644 --- a/src/emu/cpu/tms34010/34010ops.c +++ b/src/emu/cpu/tms34010/34010ops.c @@ -80,13 +80,13 @@ void tms340x0_device::unimpl(UINT16 op) { /* kludge for Super High Impact -- this doesn't seem to cause */ /* an illegal opcode exception */ - if (m_direct->read_decrypted_word(TOBYTE(m_pc - 0x10)) == 0x0007) + if (m_direct->read_word(TOBYTE(m_pc - 0x10)) == 0x0007) return; /* 9 Ball Shootout calls to FFDF7468, expecting it */ /* to execute the next instruction from FFDF7470 */ /* but the instruction at FFDF7460 is an 0x0001 */ - if (m_direct->read_decrypted_word(TOBYTE(m_pc - 0x10)) == 0x0001) + if (m_direct->read_word(TOBYTE(m_pc - 0x10)) == 0x0001) return; PUSH(m_pc); @@ -96,7 +96,7 @@ void tms340x0_device::unimpl(UINT16 op) COUNT_UNKNOWN_CYCLES(16); /* extra check to prevent bad things */ - if (m_pc == 0 || s_opcode_table[m_direct->read_decrypted_word(TOBYTE(m_pc)) >> 4] == &tms34010_device::unimpl) + if (m_pc == 0 || s_opcode_table[m_direct->read_word(TOBYTE(m_pc)) >> 4] == &tms34010_device::unimpl) { set_input_line(INPUT_LINE_HALT, ASSERT_LINE); debugger_break(machine()); diff --git a/src/emu/cpu/tms34010/tms34010.c b/src/emu/cpu/tms34010/tms34010.c index 524fa8bd917..4faf2967bc8 100644 --- a/src/emu/cpu/tms34010/tms34010.c +++ b/src/emu/cpu/tms34010/tms34010.c @@ -174,32 +174,32 @@ inline UINT32 tms340x0_device::ROPCODE() { UINT32 pc = TOBYTE(m_pc); m_pc += 2 << 3; - return m_direct->read_decrypted_word(pc); + return m_direct->read_word(pc); } inline INT16 tms340x0_device::PARAM_WORD() { UINT32 pc = TOBYTE(m_pc); m_pc += 2 << 3; - return m_direct->read_raw_word(pc); + return m_direct->read_word(pc); } inline INT32 tms340x0_device::PARAM_LONG() { UINT32 pc = TOBYTE(m_pc); m_pc += 4 << 3; - return (UINT16)m_direct->read_raw_word(pc) | (m_direct->read_raw_word(pc + 2) << 16); + return (UINT16)m_direct->read_word(pc) | (m_direct->read_word(pc + 2) << 16); } inline INT16 tms340x0_device::PARAM_WORD_NO_INC() { - return m_direct->read_raw_word(TOBYTE(m_pc)); + return m_direct->read_word(TOBYTE(m_pc)); } inline INT32 tms340x0_device::PARAM_LONG_NO_INC() { UINT32 pc = TOBYTE(m_pc); - return (UINT16)m_direct->read_raw_word(pc) | (m_direct->read_raw_word(pc + 2) << 16); + return (UINT16)m_direct->read_word(pc) | (m_direct->read_word(pc + 2) << 16); } /* read memory byte */ diff --git a/src/emu/cpu/tms7000/tms7000.c b/src/emu/cpu/tms7000/tms7000.c index acc81731c1b..99451e30d6b 100644 --- a/src/emu/cpu/tms7000/tms7000.c +++ b/src/emu/cpu/tms7000/tms7000.c @@ -631,7 +631,7 @@ void tms7000_device::execute_run() { debugger_instruction_hook(this, m_pc); - m_op = m_direct->read_decrypted_byte(m_pc++); + m_op = m_direct->read_byte(m_pc++); execute_one(m_op); } while (m_icount > 0); } diff --git a/src/emu/cpu/tms7000/tms7000.h b/src/emu/cpu/tms7000/tms7000.h index 4b5f14ebe89..92effc0d079 100644 --- a/src/emu/cpu/tms7000/tms7000.h +++ b/src/emu/cpu/tms7000/tms7000.h @@ -143,8 +143,8 @@ protected: inline UINT16 read_mem16(UINT16 address) { return m_program->read_byte(address) << 8 | m_program->read_byte((address + 1) & 0xffff); } inline void write_mem16(UINT16 address, UINT16 data) { m_program->write_byte(address, data >> 8 & 0xff); m_program->write_byte((address + 1) & 0xffff, data & 0xff); } - inline UINT8 imm8() { return m_direct->read_raw_byte(m_pc++); } - inline UINT16 imm16() { UINT16 ret = m_direct->read_raw_byte(m_pc++) << 8; return ret | m_direct->read_raw_byte(m_pc++); } + inline UINT8 imm8() { return m_direct->read_byte(m_pc++); } + inline UINT16 imm16() { UINT16 ret = m_direct->read_byte(m_pc++) << 8; return ret | m_direct->read_byte(m_pc++); } inline UINT8 pull8() { return m_program->read_byte(m_sp--); } inline void push8(UINT8 data) { m_program->write_byte(++m_sp, data); } diff --git a/src/emu/cpu/upd7725/upd7725.c b/src/emu/cpu/upd7725/upd7725.c index 78e248eb7bf..d422eae21b0 100644 --- a/src/emu/cpu/upd7725/upd7725.c +++ b/src/emu/cpu/upd7725/upd7725.c @@ -326,7 +326,7 @@ void necdsp_device::execute_run() debugger_instruction_hook(this, regs.pc); } - opcode = m_direct->read_decrypted_dword(regs.pc<<2)>>8; + opcode = m_direct->read_dword(regs.pc<<2)>>8; regs.pc++; switch(opcode >> 22) { diff --git a/src/emu/cpu/upd7810/upd7810_macros.h b/src/emu/cpu/upd7810/upd7810_macros.h index b6172e816ba..27783fb5d9a 100644 --- a/src/emu/cpu/upd7810/upd7810_macros.h +++ b/src/emu/cpu/upd7810/upd7810_macros.h @@ -104,8 +104,8 @@ // MEMORY/OPCODE READ/WRITE //************************************************************************** -#define RDOP(O) O = m_direct->read_decrypted_byte(PCD); PC++ -#define RDOPARG(A) A = m_direct->read_raw_byte(PCD); PC++ +#define RDOP(O) O = m_direct->read_byte(PCD); PC++ +#define RDOPARG(A) A = m_direct->read_byte(PCD); PC++ #define RM(A) m_program->read_byte(A) #define WM(A,V) m_program->write_byte(A,V) diff --git a/src/emu/cpu/v30mz/v30mz.c b/src/emu/cpu/v30mz/v30mz.c index 62f3dc94132..3bc7c28236a 100644 --- a/src/emu/cpu/v30mz/v30mz.c +++ b/src/emu/cpu/v30mz/v30mz.c @@ -308,7 +308,7 @@ inline void v30mz_cpu_device::write_port(UINT16 port, UINT8 data) inline UINT8 v30mz_cpu_device::fetch_op() { - UINT8 data = m_direct->read_decrypted_byte( pc() ); + UINT8 data = m_direct->read_byte( pc() ); m_ip++; return data; } @@ -316,7 +316,7 @@ inline UINT8 v30mz_cpu_device::fetch_op() inline UINT8 v30mz_cpu_device::fetch() { - UINT8 data = m_direct->read_raw_byte( pc() ); + UINT8 data = m_direct->read_byte( pc() ); m_ip++; return data; } diff --git a/src/emu/cpu/v60/v60.c b/src/emu/cpu/v60/v60.c index 3f2df66199c..38b17139fb7 100644 --- a/src/emu/cpu/v60/v60.c +++ b/src/emu/cpu/v60/v60.c @@ -63,17 +63,17 @@ offs_t v70_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *opro // memory accessors #if defined(LSB_FIRST) && !defined(ALIGN_INTS) -#define OpRead8(a) (m_direct->read_decrypted_byte(a)) -#define OpRead16(a) (m_direct->read_decrypted_word(a)) -#define OpRead32(a) (m_direct->read_decrypted_dword(a)) +#define OpRead8(a) (m_direct->read_byte(a)) +#define OpRead16(a) (m_direct->read_word(a)) +#define OpRead32(a) (m_direct->read_dword(a)) #else -#define OpRead8(a) (m_direct->read_decrypted_byte((a), m_fetch_xor)) -#define OpRead16(a) ((m_direct->read_decrypted_byte(((a)+0), m_fetch_xor) << 0) | \ - (m_direct->read_decrypted_byte(((a)+1), m_fetch_xor) << 8)) -#define OpRead32(a) ((m_direct->read_decrypted_byte(((a)+0), m_fetch_xor) << 0) | \ - (m_direct->read_decrypted_byte(((a)+1), m_fetch_xor) << 8) | \ - (m_direct->read_decrypted_byte(((a)+2), m_fetch_xor) << 16) | \ - (m_direct->read_decrypted_byte(((a)+3), m_fetch_xor) << 24)) +#define OpRead8(a) (m_direct->read_byte((a), m_fetch_xor)) +#define OpRead16(a) ((m_direct->read_byte(((a)+0), m_fetch_xor) << 0) | \ + (m_direct->read_byte(((a)+1), m_fetch_xor) << 8)) +#define OpRead32(a) ((m_direct->read_byte(((a)+0), m_fetch_xor) << 0) | \ + (m_direct->read_byte(((a)+1), m_fetch_xor) << 8) | \ + (m_direct->read_byte(((a)+2), m_fetch_xor) << 16) | \ + (m_direct->read_byte(((a)+3), m_fetch_xor) << 24)) #endif diff --git a/src/emu/cpu/v810/v810.c b/src/emu/cpu/v810/v810.c index c665053af7a..9e6db000949 100644 --- a/src/emu/cpu/v810/v810.c +++ b/src/emu/cpu/v810/v810.c @@ -137,7 +137,7 @@ offs_t v810_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *opr #define WIO_H(addr, val) (m_io->write_word(addr,val)) #define WIO_W(addr, val) (m_io->write_dword(addr,val)) -#define R_OP(addr) (m_direct->read_decrypted_word(addr)) +#define R_OP(addr) (m_direct->read_word(addr)) #define GET1 (op&0x1f) #define GET2 ((op>>5)&0x1f) diff --git a/src/emu/cpu/z180/z180.c b/src/emu/cpu/z180/z180.c index 60fea4491c6..134e67dfb72 100644 --- a/src/emu/cpu/z180/z180.c +++ b/src/emu/cpu/z180/z180.c @@ -85,6 +85,7 @@ z180_device::z180_device(const machine_config &mconfig, const char *tag, device_ : cpu_device(mconfig, Z180, "Z180", tag, owner, clock, "z180", __FILE__) , m_program_config("program", ENDIANNESS_LITTLE, 8, 20, 0) , m_io_config("io", ENDIANNESS_LITTLE, 8, 16, 0) + , m_decrypted_opcodes_config("program", ENDIANNESS_LITTLE, 8, 20, 0) { } @@ -767,6 +768,18 @@ static UINT8 *SZHVC_sub; #include "z180ed.inc" #include "z180op.inc" + +const address_space_config *z180_device::memory_space_config(address_spacenum spacenum) const +{ + switch(spacenum) + { + case AS_PROGRAM: return &m_program_config; + case AS_IO: return &m_io_config; + case AS_DECRYPTED_OPCODES: return has_configured_map(AS_DECRYPTED_OPCODES) ? &m_decrypted_opcodes_config : NULL; + default: return NULL; + } +} + UINT8 z180_device::z180_readcontrol(offs_t port) { /* normal external readport */ @@ -1956,6 +1969,8 @@ void z180_device::device_start() m_program = &space(AS_PROGRAM); m_direct = &m_program->direct(); + m_oprogram = has_space(AS_DECRYPTED_OPCODES) ? &space(AS_DECRYPTED_OPCODES) : m_program; + m_odirect = &m_oprogram->direct(); m_iospace = &space(AS_IO); /* set up the state table */ diff --git a/src/emu/cpu/z180/z180.h b/src/emu/cpu/z180/z180.h index a3d50852bf3..7529280b95a 100644 --- a/src/emu/cpu/z180/z180.h +++ b/src/emu/cpu/z180/z180.h @@ -153,7 +153,7 @@ protected: virtual void execute_set_input(int inputnum, int state); // device_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : NULL ); } + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; virtual bool memory_translate(address_spacenum spacenum, int intention, offs_t &address); // device_state_interface overrides @@ -169,6 +169,7 @@ protected: private: address_space_config m_program_config; address_space_config m_io_config; + address_space_config m_decrypted_opcodes_config; PAIR m_PREPC,m_PC,m_SP,m_AF,m_BC,m_DE,m_HL,m_IX,m_IY; PAIR m_AF2,m_BC2,m_DE2,m_HL2; @@ -193,6 +194,8 @@ private: z80_daisy_chain m_daisy; address_space *m_program; direct_read_data *m_direct; + address_space *m_oprogram; + direct_read_data *m_odirect; address_space *m_iospace; UINT8 m_rtemp; UINT32 m_ioltemp; diff --git a/src/emu/cpu/z180/z180dd.inc b/src/emu/cpu/z180/z180dd.inc index 99557547757..bd2a9fc7137 100644 --- a/src/emu/cpu/z180/z180dd.inc +++ b/src/emu/cpu/z180/z180dd.inc @@ -2,7 +2,7 @@ // copyright-holders:Juergen Buchmueller OP(illegal,1) { logerror("Z180 '%s' ill. opcode $%02x $%02x\n", - tag(), m_direct->read_decrypted_byte((_PCD-1)&0xffff), m_direct->read_decrypted_byte(_PCD)); + tag(), m_odirect->read_byte((_PCD-1)&0xffff), m_odirect->read_byte(_PCD)); } /********************************************************** diff --git a/src/emu/cpu/z180/z180ed.inc b/src/emu/cpu/z180/z180ed.inc index 83dcee1afdb..91520228f87 100644 --- a/src/emu/cpu/z180/z180ed.inc +++ b/src/emu/cpu/z180/z180ed.inc @@ -3,7 +3,7 @@ OP(illegal,2) { logerror("Z180 '%s' ill. opcode $ed $%02x\n", - tag(), m_direct->read_decrypted_byte((_PCD-1)&0xffff)); + tag(), m_odirect->read_byte((_PCD-1)&0xffff)); } /********************************************************** diff --git a/src/emu/cpu/z180/z180ops.h b/src/emu/cpu/z180/z180ops.h index 66de64871ba..36f06a6847f 100644 --- a/src/emu/cpu/z180/z180ops.h +++ b/src/emu/cpu/z180/z180ops.h @@ -102,7 +102,7 @@ UINT8 z180_device::ROP() { offs_t addr = _PCD; _PC++; - return m_direct->read_decrypted_byte(MMU_REMAP_ADDR(addr)); + return m_odirect->read_byte(MMU_REMAP_ADDR(addr)); } /**************************************************************** @@ -115,14 +115,14 @@ UINT8 z180_device::ARG() { offs_t addr = _PCD; _PC++; - return m_direct->read_raw_byte(MMU_REMAP_ADDR(addr)); + return m_direct->read_byte(MMU_REMAP_ADDR(addr)); } UINT32 z180_device::ARG16() { offs_t addr = _PCD; _PC += 2; - return m_direct->read_raw_byte(MMU_REMAP_ADDR(addr)) | (m_direct->read_raw_byte(MMU_REMAP_ADDR(addr+1)) << 8); + return m_direct->read_byte(MMU_REMAP_ADDR(addr)) | (m_direct->read_byte(MMU_REMAP_ADDR(addr+1)) << 8); } /*************************************************************** diff --git a/src/emu/cpu/z8/z8.c b/src/emu/cpu/z8/z8.c index bcff4b44145..7db38eaf500 100644 --- a/src/emu/cpu/z8/z8.c +++ b/src/emu/cpu/z8/z8.c @@ -210,7 +210,7 @@ offs_t z8_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom UINT8 z8_device::fetch() { - UINT8 data = m_direct->read_decrypted_byte(m_pc); + UINT8 data = m_direct->read_byte(m_pc); m_pc++; diff --git a/src/emu/cpu/z8/z8ops.inc b/src/emu/cpu/z8/z8ops.inc index 79621ed1512..4c522791b8e 100644 --- a/src/emu/cpu/z8/z8ops.inc +++ b/src/emu/cpu/z8/z8ops.inc @@ -146,7 +146,7 @@ void z8_device::load_from_memory(address_space *space) UINT8 src = get_working_register(operands & 0x0f); UINT16 address = register_pair_read(src); - UINT8 data = m_direct->read_decrypted_byte(address); + UINT8 data = m_direct->read_byte(address); register_write(dst, data); } @@ -171,7 +171,7 @@ void z8_device::load_from_memory_autoinc(address_space *space) UINT8 src = get_working_register(operands & 0x0f); UINT16 address = register_pair_read(src); - UINT8 data = m_direct->read_decrypted_byte(address); + UINT8 data = m_direct->read_byte(address); register_write(real_dst, data); diff --git a/src/emu/cpu/z80/z80.c b/src/emu/cpu/z80/z80.c index df11378ffac..2b5e2e877f7 100644 --- a/src/emu/cpu/z80/z80.c +++ b/src/emu/cpu/z80/z80.c @@ -473,7 +473,7 @@ inline UINT8 z80_device::rop() { unsigned pc = PCD; PC++; - return m_direct->read_decrypted_byte(pc); + return m_decrypted_opcodes_direct->read_byte(pc); } /**************************************************************** @@ -486,14 +486,14 @@ inline UINT8 z80_device::arg() { unsigned pc = PCD; PC++; - return m_direct->read_raw_byte(pc); + return m_direct->read_byte(pc); } inline UINT16 z80_device::arg16() { unsigned pc = PCD; PC += 2; - return m_direct->read_raw_byte(pc) | (m_direct->read_raw_byte((pc+1)&0xffff) << 8); + return m_direct->read_byte(pc) | (m_direct->read_byte((pc+1)&0xffff) << 8); } /*************************************************************** @@ -1945,7 +1945,7 @@ OP(xycb,ff) { A = set(7, rm(m_ea)); wm(m_ea, A); } /* SET 7,A=(XY+o) */ OP(illegal,1) { logerror("Z80 '%s' ill. opcode $%02x $%02x\n", - tag(), m_direct->read_decrypted_byte((PCD-1)&0xffff), m_direct->read_decrypted_byte(PCD)); + tag(), m_decrypted_opcodes_direct->read_byte((PCD-1)&0xffff), m_decrypted_opcodes_direct->read_byte(PCD)); } /********************************************************** @@ -2533,7 +2533,7 @@ OP(fd,ff) { illegal_1(); op_ff(); } /* DB FD OP(illegal,2) { logerror("Z80 '%s' ill. opcode $ed $%02x\n", - tag(), m_direct->read_decrypted_byte((PCD-1)&0xffff)); + tag(), m_decrypted_opcodes_direct->read_byte((PCD-1)&0xffff)); } /********************************************************** @@ -3375,7 +3375,9 @@ void z80_device::device_start() m_ea = 0; m_program = &space(AS_PROGRAM); + m_decrypted_opcodes = has_space(AS_DECRYPTED_OPCODES) ? &space(AS_DECRYPTED_OPCODES) : m_program; m_direct = &m_program->direct(); + m_decrypted_opcodes_direct = &m_decrypted_opcodes->direct(); m_io = &space(AS_IO); if (static_config() != NULL) @@ -3702,6 +3704,7 @@ void z80_device::z80_set_cycle_tables(const UINT8 *op, const UINT8 *cb, const UI z80_device::z80_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : cpu_device(mconfig, Z80, "Z80", tag, owner, clock, "z80", __FILE__), m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0), + m_decrypted_opcodes_config("decrypted_opcodes", ENDIANNESS_LITTLE, 8, 16, 0), m_io_config("io", ENDIANNESS_LITTLE, 8, 16, 0) { } @@ -3709,10 +3712,22 @@ z80_device::z80_device(const machine_config &mconfig, const char *tag, device_t z80_device::z80_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source), m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0), + m_decrypted_opcodes_config("decrypted_opcodes", ENDIANNESS_LITTLE, 8, 16, 0), m_io_config("io", ENDIANNESS_LITTLE, 8, 16, 0) { } +const address_space_config *z80_device::memory_space_config(address_spacenum spacenum) const +{ + switch(spacenum) + { + case AS_PROGRAM: return &m_program_config; + case AS_IO: return &m_io_config; + case AS_DECRYPTED_OPCODES: return has_configured_map(AS_DECRYPTED_OPCODES) ? &m_decrypted_opcodes_config : NULL; + default: return NULL; + } +} + const device_type Z80 = &device_creator<z80_device>; nsc800_device::nsc800_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) diff --git a/src/emu/cpu/z80/z80.h b/src/emu/cpu/z80/z80.h index be04708b3a2..f32686ac479 100644 --- a/src/emu/cpu/z80/z80.h +++ b/src/emu/cpu/z80/z80.h @@ -55,7 +55,7 @@ protected: virtual void execute_set_input(int inputnum, int state); // device_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : NULL ); } + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; // device_state_interface overrides virtual void state_import(const device_state_entry &entry); @@ -233,10 +233,13 @@ protected: // address spaces const address_space_config m_program_config; + const address_space_config m_decrypted_opcodes_config; const address_space_config m_io_config; address_space *m_program; - address_space *m_io; + address_space *m_decrypted_opcodes; + address_space *m_io; direct_read_data *m_direct; + direct_read_data *m_decrypted_opcodes_direct; PAIR m_prvpc; PAIR m_pc; diff --git a/src/emu/debug/debugcmd.c b/src/emu/debug/debugcmd.c index 8e76f3b3b2b..580da3b5119 100644 --- a/src/emu/debug/debugcmd.c +++ b/src/emu/debug/debugcmd.c @@ -2453,7 +2453,7 @@ static void execute_dasm(running_machine &machine, int ref, int params, const ch { UINT64 offset, length, bytes = 1; int minbytes, maxbytes, byteswidth; - address_space *space; + address_space *space, *decrypted_space; FILE *f = NULL; int j; @@ -2466,6 +2466,8 @@ static void execute_dasm(running_machine &machine, int ref, int params, const ch return; if (!debug_command_parameter_cpu_space(machine, (params > 4) ? param[4] : NULL, AS_PROGRAM, space)) return; + if (!debug_command_parameter_cpu_space(machine, (params > 4) ? param[4] : NULL, AS_DECRYPTED_OPCODES, decrypted_space)) + space = decrypted_space; /* determine the width of the bytes */ cpu_device *cpudevice = downcast<cpu_device *>(&space->device()); @@ -2508,8 +2510,8 @@ static void execute_dasm(running_machine &machine, int ref, int params, const ch /* fetch the bytes up to the maximum */ for (numbytes = 0; numbytes < maxbytes; numbytes++) { - opbuf[numbytes] = debug_read_opcode(*space, pcbyte + numbytes, 1, FALSE); - argbuf[numbytes] = debug_read_opcode(*space, pcbyte + numbytes, 1, TRUE); + opbuf[numbytes] = debug_read_opcode(*decrypted_space, pcbyte + numbytes, 1); + argbuf[numbytes] = debug_read_opcode(*space, pcbyte + numbytes, 1); } /* disassemble the result */ @@ -2522,7 +2524,7 @@ static void execute_dasm(running_machine &machine, int ref, int params, const ch int startdex = outdex; numbytes = space->address_to_byte(numbytes); for (j = 0; j < numbytes; j += minbytes) - outdex += sprintf(&output[outdex], "%s ", core_i64_hex_format(debug_read_opcode(*space, pcbyte + j, minbytes, FALSE), minbytes * 2)); + outdex += sprintf(&output[outdex], "%s ", core_i64_hex_format(debug_read_opcode(*decrypted_space, pcbyte + j, minbytes), minbytes * 2)); if (outdex - startdex < byteswidth) outdex += sprintf(&output[outdex], "%*s", byteswidth - (outdex - startdex), ""); outdex += sprintf(&output[outdex], " "); @@ -2647,9 +2649,11 @@ static void execute_traceflush(running_machine &machine, int ref, int params, co static void execute_history(running_machine &machine, int ref, int params, const char *param[]) { /* validate parameters */ - address_space *space; + address_space *space, *decrypted_space; if (!debug_command_parameter_cpu_space(machine, (params > 0) ? param[0] : NULL, AS_PROGRAM, space)) return; + if (!debug_command_parameter_cpu_space(machine, (params > 0) ? param[0] : NULL, AS_DECRYPTED_OPCODES, decrypted_space)) + decrypted_space = space; UINT64 count = device_debug::HISTORY_SIZE; if (!debug_command_parameter_number(machine, param[1], &count)) @@ -2672,8 +2676,8 @@ static void execute_history(running_machine &machine, int ref, int params, const UINT8 opbuf[64], argbuf[64]; for (int numbytes = 0; numbytes < maxbytes; numbytes++) { - opbuf[numbytes] = debug_read_opcode(*space, pcbyte + numbytes, 1, false); - argbuf[numbytes] = debug_read_opcode(*space, pcbyte + numbytes, 1, true); + opbuf[numbytes] = debug_read_opcode(*decrypted_space, pcbyte + numbytes, 1); + argbuf[numbytes] = debug_read_opcode(*space, pcbyte + numbytes, 1); } char buffer[200]; diff --git a/src/emu/debug/debugcpu.c b/src/emu/debug/debugcpu.c index 9e3d8121344..2eeb2e1af72 100644 --- a/src/emu/debug/debugcpu.c +++ b/src/emu/debug/debugcpu.c @@ -860,7 +860,7 @@ void debug_write_memory(address_space &space, offs_t address, UINT64 data, int s the given offset from opcode space -------------------------------------------------*/ -UINT64 debug_read_opcode(address_space &space, offs_t address, int size, int arg) +UINT64 debug_read_opcode(address_space &space, offs_t address, int size) { UINT64 result = ~(UINT64)0 & (~(UINT64)0 >> (64 - 8*size)), result2; debugcpu_private *global = space.machine().debugcpu_data; @@ -881,8 +881,8 @@ UINT64 debug_read_opcode(address_space &space, offs_t address, int size, int arg if (size > space.data_width() / 8) { int halfsize = size / 2; - UINT64 r0 = debug_read_opcode(space, address + 0, halfsize, arg); - UINT64 r1 = debug_read_opcode(space, address + halfsize, halfsize, arg); + UINT64 r0 = debug_read_opcode(space, address + 0, halfsize); + UINT64 r1 = debug_read_opcode(space, address + halfsize, halfsize); if (space.endianness() == ENDIANNESS_LITTLE) return r0 | (r1 << (8 * halfsize)); @@ -957,14 +957,14 @@ UINT64 debug_read_opcode(address_space &space, offs_t address, int size, int arg switch (size) { case 1: - result = (arg) ? space.direct().read_raw_byte(address, addrxor) : space.direct().read_decrypted_byte(address, addrxor); + result = space.direct().read_byte(address, addrxor); break; case 2: - result = (arg) ? space.direct().read_raw_word(address & ~1, addrxor) : space.direct().read_decrypted_word(address & ~1, addrxor); + result = space.direct().read_word(address & ~1, addrxor); if ((address & 1) != 0) { - result2 = (arg) ? space.direct().read_raw_word((address & ~1) + 2, addrxor) : space.direct().read_decrypted_word((address & ~1) + 2, addrxor); + result2 = space.direct().read_word((address & ~1) + 2, addrxor); if (space.endianness() == ENDIANNESS_LITTLE) result = (result >> (8 * (address & 1))) | (result2 << (16 - 8 * (address & 1))); else @@ -974,10 +974,10 @@ UINT64 debug_read_opcode(address_space &space, offs_t address, int size, int arg break; case 4: - result = (arg) ? space.direct().read_raw_dword(address & ~3, addrxor) : space.direct().read_decrypted_dword(address & ~3, addrxor); + result = space.direct().read_dword(address & ~3, addrxor); if ((address & 3) != 0) { - result2 = (arg) ? space.direct().read_raw_dword((address & ~3) + 4, addrxor) : space.direct().read_decrypted_dword((address & ~3) + 4, addrxor); + result2 = space.direct().read_dword((address & ~3) + 4, addrxor); if (space.endianness() == ENDIANNESS_LITTLE) result = (result >> (8 * (address & 3))) | (result2 << (32 - 8 * (address & 3))); else @@ -987,10 +987,10 @@ UINT64 debug_read_opcode(address_space &space, offs_t address, int size, int arg break; case 8: - result = (arg) ? space.direct().read_raw_qword(address & ~7, addrxor) : space.direct().read_decrypted_qword(address & ~7, addrxor); + result = space.direct().read_qword(address & ~7, addrxor); if ((address & 7) != 0) { - result2 = (arg) ? space.direct().read_raw_qword((address & ~7) + 8, addrxor) : space.direct().read_decrypted_qword((address & ~7) + 8, addrxor); + result2 = space.direct().read_qword((address & ~7) + 8, addrxor); if (space.endianness() == ENDIANNESS_LITTLE) result = (result >> (8 * (address & 7))) | (result2 << (64 - 8 * (address & 7))); else @@ -1219,10 +1219,7 @@ static UINT64 expression_read_program_direct(address_space &space, int opcode, o offs_t lowmask = space.data_width() / 8 - 1; /* get the base of memory, aligned to the address minus the lowbits */ - if (opcode & 1) - base = (UINT8 *)space.direct().read_decrypted_ptr(address & ~lowmask); - else - base = (UINT8 *)space.get_read_ptr(address & ~lowmask); + base = (UINT8 *)space.get_read_ptr(address & ~lowmask); /* if we have a valid base, return the appropriate byte */ if (base != NULL) @@ -1394,10 +1391,7 @@ static void expression_write_program_direct(address_space &space, int opcode, of offs_t lowmask = space.data_width() / 8 - 1; /* get the base of memory, aligned to the address minus the lowbits */ - if (opcode & 1) - base = (UINT8 *)space.direct().read_decrypted_ptr(address & ~lowmask); - else - base = (UINT8 *)space.get_read_ptr(address & ~lowmask); + base = (UINT8 *)space.get_read_ptr(address & ~lowmask); /* if we have a valid base, write the appropriate byte */ if (base != NULL) @@ -2733,6 +2727,7 @@ UINT32 device_debug::compute_opcode_crc32(offs_t pc) const assert(m_memory != NULL); // determine the adjusted PC + address_space &decrypted_space = m_memory->has_space(AS_DECRYPTED_OPCODES) ? m_memory->space(AS_DECRYPTED_OPCODES) : m_memory->space(AS_PROGRAM); address_space &space = m_memory->space(AS_PROGRAM); offs_t pcbyte = space.address_to_byte(pc) & space.bytemask(); @@ -2741,8 +2736,8 @@ UINT32 device_debug::compute_opcode_crc32(offs_t pc) const int maxbytes = max_opcode_bytes(); for (int numbytes = 0; numbytes < maxbytes; numbytes++) { - opbuf[numbytes] = debug_read_opcode(space, pcbyte + numbytes, 1, false); - argbuf[numbytes] = debug_read_opcode(space, pcbyte + numbytes, 1, true); + opbuf[numbytes] = debug_read_opcode(decrypted_space, pcbyte + numbytes, 1); + argbuf[numbytes] = debug_read_opcode(space, pcbyte + numbytes, 1); } // disassemble to our buffer @@ -3128,6 +3123,7 @@ UINT32 device_debug::dasm_wrapped(std::string &buffer, offs_t pc) assert(m_memory != NULL && m_disasm != NULL); // determine the adjusted PC + address_space &decrypted_space = m_memory->has_space(AS_DECRYPTED_OPCODES) ? m_memory->space(AS_DECRYPTED_OPCODES) : m_memory->space(AS_PROGRAM); address_space &space = m_memory->space(AS_PROGRAM); offs_t pcbyte = space.address_to_byte(pc) & space.bytemask(); @@ -3136,8 +3132,8 @@ UINT32 device_debug::dasm_wrapped(std::string &buffer, offs_t pc) int maxbytes = max_opcode_bytes(); for (int numbytes = 0; numbytes < maxbytes; numbytes++) { - opbuf[numbytes] = debug_read_opcode(space, pcbyte + numbytes, 1, false); - argbuf[numbytes] = debug_read_opcode(space, pcbyte + numbytes, 1, true); + opbuf[numbytes] = debug_read_opcode(decrypted_space, pcbyte + numbytes, 1); + argbuf[numbytes] = debug_read_opcode(space, pcbyte + numbytes, 1); } // disassemble to our buffer diff --git a/src/emu/debug/debugcpu.h b/src/emu/debug/debugcpu.h index 2f1f90c4ef7..d337a7103f7 100644 --- a/src/emu/debug/debugcpu.h +++ b/src/emu/debug/debugcpu.h @@ -549,7 +549,7 @@ void debug_write_qword(address_space &space, offs_t address, UINT64 data, int ap void debug_write_memory(address_space &space, offs_t address, UINT64 data, int size, int apply_translation); /* read 1,2,4 or 8 bytes at the given offset from opcode space */ -UINT64 debug_read_opcode(address_space &space, offs_t offset, int size, int arg); +UINT64 debug_read_opcode(address_space &space, offs_t offset, int size); #endif diff --git a/src/emu/debug/dvdisasm.c b/src/emu/debug/dvdisasm.c index d29ab590fd4..afcd40dd0ef 100644 --- a/src/emu/debug/dvdisasm.c +++ b/src/emu/debug/dvdisasm.c @@ -27,7 +27,8 @@ debug_view_disasm_source::debug_view_disasm_source(const char *name, device_t &d : debug_view_source(name, &device), m_device(device), m_disasmintf(dynamic_cast<device_disasm_interface *>(&device)), - m_space(device.memory().space(AS_PROGRAM)) + m_space(device.memory().space(AS_PROGRAM)), + m_decrypted_space(device.memory().has_space(AS_DECRYPTED_OPCODES) ? device.memory().space(AS_DECRYPTED_OPCODES) : device.memory().space(AS_PROGRAM)) { } @@ -251,8 +252,8 @@ offs_t debug_view_disasm::find_pc_backwards(offs_t targetpc, int numinstrs) while (curpcbyte < fillpcbyte) { fillpcbyte--; - opbuf[1000 + fillpcbyte - targetpcbyte] = debug_read_opcode(source.m_space, fillpcbyte, 1, FALSE); - argbuf[1000 + fillpcbyte - targetpcbyte] = debug_read_opcode(source.m_space, fillpcbyte, 1, TRUE); + opbuf[1000 + fillpcbyte - targetpcbyte] = debug_read_opcode(source.m_decrypted_space, fillpcbyte, 1); + argbuf[1000 + fillpcbyte - targetpcbyte] = debug_read_opcode(source.m_space, fillpcbyte, 1); } // loop until we get past the target instruction @@ -310,12 +311,12 @@ void debug_view_disasm::generate_bytes(offs_t pcbyte, int numbytes, int minbytes // output the first value int offset = 0; if (maxchars >= char_num * minbytes) - offset = sprintf(string, "%s", core_i64_format(debug_read_opcode(source.m_space, pcbyte, minbytes, FALSE), minbytes * char_num, source.is_octal())); + offset = sprintf(string, "%s", core_i64_format(debug_read_opcode(source.m_decrypted_space, pcbyte, minbytes), minbytes * char_num, source.is_octal())); // output subsequent values int byte; for (byte = minbytes; byte < numbytes && offset + 1 + char_num * minbytes < maxchars; byte += minbytes) - offset += sprintf(&string[offset], " %s", core_i64_format(debug_read_opcode(source.m_space, pcbyte + byte, minbytes, encrypted), minbytes * char_num, source.is_octal())); + offset += sprintf(&string[offset], " %s", core_i64_format(debug_read_opcode(encrypted ? source.m_space : source.m_decrypted_space, pcbyte + byte, minbytes), minbytes * char_num, source.is_octal())); // if we ran out of room, indicate more string[maxchars - 1] = 0; @@ -394,8 +395,8 @@ bool debug_view_disasm::recompute(offs_t pc, int startline, int lines) // fetch the bytes up to the maximum for (numbytes = 0; numbytes < maxbytes; numbytes++) { - opbuf[numbytes] = debug_read_opcode(source.m_space, pcbyte + numbytes, 1, FALSE); - argbuf[numbytes] = debug_read_opcode(source.m_space, pcbyte + numbytes, 1, TRUE); + opbuf[numbytes] = debug_read_opcode(source.m_decrypted_space, pcbyte + numbytes, 1); + argbuf[numbytes] = debug_read_opcode(source.m_space, pcbyte + numbytes, 1); } // disassemble the result @@ -429,8 +430,8 @@ bool debug_view_disasm::recompute(offs_t pc, int startline, int lines) } // update opcode base information - m_last_direct_decrypted = source.m_space.direct().decrypted(); - m_last_direct_raw = source.m_space.direct().raw(); + m_last_direct_decrypted = source.m_decrypted_space.direct().ptr(); + m_last_direct_raw = source.m_space.direct().ptr(); m_last_change_count = source.m_device.debug()->comment_change_count(); // no longer need to recompute @@ -478,7 +479,7 @@ void debug_view_disasm::view_update() } // if the opcode base has changed, rework things - if (source.m_space.direct().decrypted() != m_last_direct_decrypted || source.m_space.direct().raw() != m_last_direct_raw) + if (source.m_decrypted_space.direct().ptr() != m_last_direct_decrypted || source.m_space.direct().ptr() != m_last_direct_raw) m_recompute = true; // if the comments have changed, redo it diff --git a/src/emu/debug/dvdisasm.h b/src/emu/debug/dvdisasm.h index 6f1c911aaeb..202ffbe4d8c 100644 --- a/src/emu/debug/dvdisasm.h +++ b/src/emu/debug/dvdisasm.h @@ -51,6 +51,7 @@ private: device_t & m_device; // underlying device device_disasm_interface *m_disasmintf; // disassembly interface address_space & m_space; // address space to display + address_space & m_decrypted_space; // address space to display for decrypted opcodes }; diff --git a/src/emu/devcpu.h b/src/emu/devcpu.h index eff1a8e8d6f..20cf21f25f0 100644 --- a/src/emu/devcpu.h +++ b/src/emu/devcpu.h @@ -68,6 +68,7 @@ enum #define MCFG_CPU_PROGRAM_MAP MCFG_DEVICE_PROGRAM_MAP #define MCFG_CPU_DATA_MAP MCFG_DEVICE_DATA_MAP #define MCFG_CPU_IO_MAP MCFG_DEVICE_IO_MAP +#define MCFG_CPU_DECRYPTED_OPCODES_MAP MCFG_DEVICE_DECRYPTED_OPCODES_MAP #define MCFG_CPU_VBLANK_INT_DRIVER MCFG_DEVICE_VBLANK_INT_DRIVER #define MCFG_CPU_PERIODIC_INT_DRIVER MCFG_DEVICE_PERIODIC_INT_DRIVER diff --git a/src/emu/dimemory.h b/src/emu/dimemory.h index 330dfb806e3..5255aadb3da 100644 --- a/src/emu/dimemory.h +++ b/src/emu/dimemory.h @@ -46,6 +46,9 @@ const int TRANSLATE_FETCH_DEBUG = (TRANSLATE_FETCH | TRANSLATE_DEBUG_MASK); #define MCFG_DEVICE_ADDRESS_MAP(_space, _map) \ device_memory_interface::static_set_addrmap(*device, _space, ADDRESS_MAP_NAME(_map)); +#define MCFG_DEVICE_REMOVE_ADDRESS_MAP(_space) \ + device_memory_interface::static_set_addrmap(*device, _space, NULL); + #define MCFG_DEVICE_PROGRAM_MAP(_map) \ MCFG_DEVICE_ADDRESS_MAP(AS_PROGRAM, _map) @@ -55,6 +58,9 @@ const int TRANSLATE_FETCH_DEBUG = (TRANSLATE_FETCH | TRANSLATE_DEBUG_MASK); #define MCFG_DEVICE_IO_MAP(_map) \ MCFG_DEVICE_ADDRESS_MAP(AS_IO, _map) +#define MCFG_DEVICE_DECRYPTED_OPCODES_MAP(_map) \ + MCFG_DEVICE_ADDRESS_MAP(AS_DECRYPTED_OPCODES, _map) + //************************************************************************** @@ -82,6 +88,8 @@ public: // basic information getters bool has_space(int index = 0) const { return (m_addrspace[index] != NULL); } bool has_space(address_spacenum index) const { return (m_addrspace[int(index)] != NULL); } + bool has_configured_map(int index = 0) const { return (m_address_map[index] != NULL); } + bool has_configured_map(address_spacenum index) const { return (m_address_map[int(index)] != NULL); } address_space &space(int index = 0) const { assert(m_addrspace[index] != NULL); return *m_addrspace[index]; } address_space &space(address_spacenum index) const { assert(m_addrspace[int(index)] != NULL); return *m_addrspace[int(index)]; } diff --git a/src/emu/machine/6821pia.c b/src/emu/machine/6821pia.c index 93c6244f144..3fbf6477fa9 100644 --- a/src/emu/machine/6821pia.c +++ b/src/emu/machine/6821pia.c @@ -14,7 +14,7 @@ // MACROS //************************************************************************** -#define VERBOSE 0 +#define VERBOSE 1 #define LOG(x) do { if (VERBOSE) logerror x; } while (0) diff --git a/src/emu/machine/68307.c b/src/emu/machine/68307.c index 08116ca0e18..320c701acc7 100644 --- a/src/emu/machine/68307.c +++ b/src/emu/machine/68307.c @@ -114,7 +114,7 @@ int m68307_calc_cs(m68307cpu_device *m68k, offs_t address) UINT16 m68307cpu_device::simple_read_immediate_16_m68307(offs_t address) { // m68307_currentcs = m68307_calc_cs(this, address); - return m_direct->read_decrypted_word(address); + return m_direct->read_word(address); } UINT8 m68307cpu_device::read_byte_m68307(offs_t address) diff --git a/src/emu/mconfig.h b/src/emu/mconfig.h index 053890f73e6..a96367ccced 100644 --- a/src/emu/mconfig.h +++ b/src/emu/mconfig.h @@ -22,9 +22,8 @@ // CONSTANTS //************************************************************************** -// by convention, tags should all lowercase and between 1-15 characters +// by convention, tags should all be lowercase #define MIN_TAG_LENGTH 1 -#define MAX_TAG_LENGTH 15 //************************************************************************** // TYPE DEFINITIONS diff --git a/src/emu/memory.c b/src/emu/memory.c index fe38d0595b6..c7742085b0a 100644 --- a/src/emu/memory.c +++ b/src/emu/memory.c @@ -1510,7 +1510,6 @@ memory_manager::memory_manager(running_machine &machine) m_banknext(STATIC_BANK1) { memset(m_bank_ptr, 0, sizeof(m_bank_ptr)); - memset(m_bankd_ptr, 0, sizeof(m_bankd_ptr)); } @@ -2099,41 +2098,6 @@ void address_space::locate_memory() } -//------------------------------------------------- -// set_decrypted_region - registers an address -// range as having a decrypted data pointer -//------------------------------------------------- - -void address_space::set_decrypted_region(offs_t addrstart, offs_t addrend, void *base) -{ - offs_t bytestart = address_to_byte(addrstart); - offs_t byteend = address_to_byte_end(addrend); - bool found = false; - - // loop over banks looking for a match - for (memory_bank *bank = manager().m_banklist.first(); bank != NULL; bank = bank->next()) - { - // consider this bank if it is used for reading and matches the address space - if (bank->references_space(*this, ROW_READ)) - { - // verify that the provided range fully covers this bank - if (bank->is_covered_by(bytestart, byteend)) - { - // set the decrypted pointer for the corresponding memory bank - bank->set_base_decrypted(reinterpret_cast<UINT8 *>(base) + bank->bytestart() - bytestart); - found = true; - } - - // fatal error if the decrypted region straddles the bank - else if (bank->straddles(bytestart, byteend)) - throw emu_fatalerror("memory_set_decrypted_region found straddled region %08X-%08X for device '%s'", bytestart, byteend, m_device.tag()); - } - } - - // fatal error as well if we didn't find any relevant memory banks - if (!found) - throw emu_fatalerror("memory_set_decrypted_region unable to find matching region %08X-%08X for device '%s'", bytestart, byteend, m_device.tag()); -} //------------------------------------------------- @@ -3666,8 +3630,7 @@ handler_entry &address_table_write::handler(UINT32 index) const direct_read_data::direct_read_data(address_space &space) : m_space(space), - m_raw(NULL), - m_decrypted(NULL), + m_ptr(NULL), m_bytemask(space.bytemask()), m_bytestart(1), m_byteend(0), @@ -3718,17 +3681,12 @@ bool direct_read_data::set_direct_region(offs_t &byteaddress) return false; } - // if no decrypted opcodes, point to the same base - UINT8 *base = *m_space.manager().bank_pointer_addr(m_entry, false); - UINT8 *based = *m_space.manager().bank_pointer_addr(m_entry, true); - if (based == NULL) - based = base; + UINT8 *base = *m_space.manager().bank_pointer_addr(m_entry); // compute the adjusted base const handler_entry_read &handler = m_space.read().handler_read(m_entry); m_bytemask = handler.bytemask(); - m_raw = base - (handler.bytestart() & m_bytemask); - m_decrypted = based - (handler.bytestart() & m_bytemask); + m_ptr = base - (handler.bytestart() & m_bytemask); m_bytestart = maskedbits | range->m_bytestart; m_byteend = maskedbits | range->m_byteend; return true; @@ -3811,15 +3769,12 @@ direct_update_delegate direct_read_data::set_direct_update(direct_update_delegat // within a custom callback //------------------------------------------------- -void direct_read_data::explicit_configure(offs_t bytestart, offs_t byteend, offs_t bytemask, void *raw, void *decrypted) +void direct_read_data::explicit_configure(offs_t bytestart, offs_t byteend, offs_t bytemask, void *ptr) { m_bytestart = bytestart; m_byteend = byteend; m_bytemask = bytemask; - m_raw = reinterpret_cast<UINT8 *>(raw); - m_decrypted = reinterpret_cast<UINT8 *>((decrypted == NULL) ? raw : decrypted); - m_raw -= bytestart & bytemask; - m_decrypted -= bytestart & bytemask; + m_ptr = reinterpret_cast<UINT8 *>(ptr) - (bytestart & bytemask); } @@ -3901,8 +3856,7 @@ memory_block::~memory_block() memory_bank::memory_bank(address_space &space, int index, offs_t bytestart, offs_t byteend, const char *tag) : m_next(NULL), m_machine(space.machine()), - m_baseptr(space.manager().bank_pointer_addr(index, false)), - m_basedptr(space.manager().bank_pointer_addr(index, true)), + m_baseptr(space.manager().bank_pointer_addr(index)), m_index(index), m_anonymous(tag == NULL), m_bytestart(bytestart), @@ -3994,23 +3948,6 @@ void memory_bank::set_base(void *base) //------------------------------------------------- -// set_base_decrypted - set the decrypted base -// explicitly -//------------------------------------------------- - -void memory_bank::set_base_decrypted(void *base) -{ - // NULL is not an option - if (base == NULL) - throw emu_fatalerror("memory_bank::set_base_decrypted called NULL base"); - - // set the base and invalidate any referencing spaces - *m_basedptr = reinterpret_cast<UINT8 *>(base); - invalidate_references(); -} - - -//------------------------------------------------- // set_entry - set the base to a pre-configured // entry //------------------------------------------------- @@ -4022,13 +3959,11 @@ void memory_bank::set_entry(int entrynum) throw emu_fatalerror("memory_bank::set_entry called for anonymous bank"); if (entrynum < 0 || entrynum >= int(m_entry.size())) throw emu_fatalerror("memory_bank::set_entry called with out-of-range entry %d", entrynum); - if (m_entry[entrynum].m_raw == NULL) + if (m_entry[entrynum].m_ptr == NULL) throw emu_fatalerror("memory_bank::set_entry called for bank '%s' with invalid bank entry %d", m_tag.c_str(), entrynum); - // set both raw and decrypted values m_curentry = entrynum; - *m_baseptr = m_entry[entrynum].m_raw; - *m_basedptr = m_entry[entrynum].m_decrypted; + *m_baseptr = m_entry[entrynum].m_ptr; // invalidate referencing spaces invalidate_references(); @@ -4064,11 +3999,11 @@ void memory_bank::configure_entry(int entrynum, void *base) expand_entries(entrynum); // set the entry - m_entry[entrynum].m_raw = reinterpret_cast<UINT8 *>(base); + m_entry[entrynum].m_ptr = reinterpret_cast<UINT8 *>(base); // if the bank base is not configured, and we're the first entry, set us up if (*m_baseptr == NULL && entrynum == 0) - *m_baseptr = m_entry[entrynum].m_raw; + *m_baseptr = m_entry[entrynum].m_ptr; } @@ -4084,43 +4019,6 @@ void memory_bank::configure_entries(int startentry, int numentries, void *base, } -//------------------------------------------------- -// configure_decrypted_entry - configure a -// decrypted entry -//------------------------------------------------- - -void memory_bank::configure_decrypted_entry(int entrynum, void *base) -{ - // must be positive - if (entrynum < 0) - throw emu_fatalerror("memory_bank::configure_decrypted_entry called with out-of-range entry %d", entrynum); - - // if we haven't allocated this many entries yet, expand our array - if (entrynum >= int(m_entry.size())) - expand_entries(entrynum); - - // set the entry - m_entry[entrynum].m_decrypted = reinterpret_cast<UINT8 *>(base); - - // if the bank base is not configured, and we're the first entry, set us up - if (*m_basedptr == NULL && entrynum == 0) - *m_basedptr = m_entry[entrynum].m_decrypted; -} - - -//------------------------------------------------- -// configure_decrypted_entries - configure -// multiple decrypted entries -//------------------------------------------------- - -void memory_bank::configure_decrypted_entries(int startentry, int numentries, void *base, offs_t stride) -{ - // fill in the requested bank entries (backwards to improve allocation) - for (int entrynum = startentry + numentries - 1; entrynum >= startentry; entrynum--) - configure_decrypted_entry(entrynum, reinterpret_cast<UINT8 *>(base) + (entrynum - startentry) * stride); -} - - //************************************************************************** // MEMORY REGIONS //************************************************************************** diff --git a/src/emu/memory.h b/src/emu/memory.h index da91f4c0baf..739bf72baa7 100644 --- a/src/emu/memory.h +++ b/src/emu/memory.h @@ -37,7 +37,8 @@ enum address_spacenum // alternate address space names for common use AS_PROGRAM = AS_0, // program address space AS_DATA = AS_1, // data address space - AS_IO = AS_2 // I/O address space + AS_IO = AS_2, // I/O address space + AS_DECRYPTED_OPCODES = AS_3 // decrypted opcodes, when separate from data accesses }; DECLARE_ENUM_OPERATORS(address_spacenum); @@ -166,8 +167,7 @@ public: // getters address_space &space() const { return m_space; } - UINT8 *raw() const { return m_raw; } - UINT8 *decrypted() const { return m_decrypted; } + UINT8 *ptr() const { return m_ptr; } // see if an address is within bounds, or attempt to update it if not bool address_is_valid(offs_t byteaddress) { return EXPECTED(byteaddress >= m_bytestart && byteaddress <= m_byteend) || set_direct_region(byteaddress); } @@ -178,21 +178,14 @@ public: // custom update callbacks and configuration direct_update_delegate set_direct_update(direct_update_delegate function); - void explicit_configure(offs_t bytestart, offs_t byteend, offs_t bytemask, void *raw, void *decrypted = NULL); - - // accessor methods for reading raw data - void *read_raw_ptr(offs_t byteaddress, offs_t directxor = 0); - UINT8 read_raw_byte(offs_t byteaddress, offs_t directxor = 0); - UINT16 read_raw_word(offs_t byteaddress, offs_t directxor = 0); - UINT32 read_raw_dword(offs_t byteaddress, offs_t directxor = 0); - UINT64 read_raw_qword(offs_t byteaddress, offs_t directxor = 0); - - // accessor methods for reading decrypted data - void *read_decrypted_ptr(offs_t byteaddress, offs_t directxor = 0); - UINT8 read_decrypted_byte(offs_t byteaddress, offs_t directxor = 0); - UINT16 read_decrypted_word(offs_t byteaddress, offs_t directxor = 0); - UINT32 read_decrypted_dword(offs_t byteaddress, offs_t directxor = 0); - UINT64 read_decrypted_qword(offs_t byteaddress, offs_t directxor = 0); + void explicit_configure(offs_t bytestart, offs_t byteend, offs_t bytemask, void *raw); + + // accessor methods + void *read_ptr(offs_t byteaddress, offs_t directxor = 0); + UINT8 read_byte(offs_t byteaddress, offs_t directxor = 0); + UINT16 read_word(offs_t byteaddress, offs_t directxor = 0); + UINT32 read_dword(offs_t byteaddress, offs_t directxor = 0); + UINT64 read_qword(offs_t byteaddress, offs_t directxor = 0); private: // internal helpers @@ -202,8 +195,7 @@ private: // internal state address_space & m_space; - UINT8 * m_raw; // direct access data pointer (raw) - UINT8 * m_decrypted; // direct access data pointer (decrypted) + UINT8 * m_ptr; // direct access data pointer offs_t m_bytemask; // byte address mask offs_t m_bytestart; // minimum valid byte address offs_t m_byteend; // maximum valid byte address @@ -355,9 +347,6 @@ public: offs_t byte_to_address(offs_t address) const { return m_config.byte2addr(address); } offs_t byte_to_address_end(offs_t address) const { return m_config.byte2addr_end(address); } - // decryption - void set_decrypted_region(offs_t addrstart, offs_t addrend, void *base); - // direct access direct_update_delegate set_direct_update_handler(direct_update_delegate function) { return m_direct->set_direct_update(function); } bool set_direct_region(offs_t &byteaddress); @@ -566,11 +555,10 @@ class memory_bank read_or_write m_readorwrite; // used for read or write? }; - // a bank_entry contains a raw and decrypted pointer + // a bank_entry contains a pointer struct bank_entry { - UINT8 * m_raw; - UINT8 * m_decrypted; + UINT8 * m_ptr; }; public: @@ -586,7 +574,6 @@ public: bool anonymous() const { return m_anonymous; } offs_t bytestart() const { return m_bytestart; } void *base() const { return *m_baseptr; } - void *base_decrypted() const { return *m_basedptr; } const char *tag() const { return m_tag.c_str(); } const char *name() const { return m_name.c_str(); } @@ -602,13 +589,10 @@ public: // set the base explicitly void set_base(void *base); - void set_base_decrypted(void *base); // configure and set entries void configure_entry(int entrynum, void *base); void configure_entries(int startentry, int numentries, void *base, offs_t stride); - void configure_decrypted_entry(int entrynum, void *base); - void configure_decrypted_entries(int startentry, int numentries, void *base, offs_t stride); void set_entry(int entrynum); private: @@ -620,7 +604,6 @@ private: memory_bank * m_next; // next bank in sequence running_machine & m_machine; // need the machine to free our memory UINT8 ** m_baseptr; // pointer to our base pointer in the global array - UINT8 ** m_basedptr; // same for the decrypted base pointer UINT16 m_index; // array index for this handler bool m_anonymous; // are we anonymous or explicit? offs_t m_bytestart; // byte-adjusted start offset @@ -747,7 +730,7 @@ public: void dump(FILE *file); // pointers to a bank pointer (internal usage only) - UINT8 **bank_pointer_addr(UINT8 index, bool decrypted = false) { return decrypted ? &m_bankd_ptr[index] : &m_bank_ptr[index]; } + UINT8 **bank_pointer_addr(UINT8 index) { return &m_bank_ptr[index]; } // regions memory_region *region_alloc(const char *name, UINT32 length, UINT8 width, endianness_t endian); @@ -766,7 +749,6 @@ private: bool m_initialized; // have we completed initialization? UINT8 * m_bank_ptr[TOTAL_MEMORY_BANKS]; // array of bank pointers - UINT8 * m_bankd_ptr[TOTAL_MEMORY_BANKS]; // array of decrypted bank pointers simple_list<address_space> m_spacelist; // list of address spaces simple_list<memory_block> m_blocklist; // head of the list of memory blocks @@ -887,102 +869,67 @@ private: //************************************************************************** //------------------------------------------------- -// read_raw_ptr - return a pointer to valid RAM +// read_ptr - return a pointer to valid RAM // referenced by the address, or NULL if no RAM // backing that address //------------------------------------------------- -inline void *direct_read_data::read_raw_ptr(offs_t byteaddress, offs_t directxor) -{ - if (address_is_valid(byteaddress)) - return &m_raw[(byteaddress ^ directxor) & m_bytemask]; - return NULL; -} - -inline void *direct_read_data::read_decrypted_ptr(offs_t byteaddress, offs_t directxor) +inline void *direct_read_data::read_ptr(offs_t byteaddress, offs_t directxor) { if (address_is_valid(byteaddress)) - return &m_decrypted[(byteaddress ^ directxor) & m_bytemask]; + return &m_ptr[(byteaddress ^ directxor) & m_bytemask]; return NULL; } //------------------------------------------------- -// read_raw_byte - read a byte via the +// read_byte - read a byte via the // direct_read_data class //------------------------------------------------- -inline UINT8 direct_read_data::read_raw_byte(offs_t byteaddress, offs_t directxor) +inline UINT8 direct_read_data::read_byte(offs_t byteaddress, offs_t directxor) { if (address_is_valid(byteaddress)) - return m_raw[(byteaddress ^ directxor) & m_bytemask]; - return m_space.read_byte(byteaddress); -} - -inline UINT8 direct_read_data::read_decrypted_byte(offs_t byteaddress, offs_t directxor) -{ - if (address_is_valid(byteaddress)) - return m_decrypted[(byteaddress ^ directxor) & m_bytemask]; + return m_ptr[(byteaddress ^ directxor) & m_bytemask]; return m_space.read_byte(byteaddress); } //------------------------------------------------- -// read_raw_word - read a word via the +// read_word - read a word via the // direct_read_data class //------------------------------------------------- -inline UINT16 direct_read_data::read_raw_word(offs_t byteaddress, offs_t directxor) +inline UINT16 direct_read_data::read_word(offs_t byteaddress, offs_t directxor) { if (address_is_valid(byteaddress)) - return *reinterpret_cast<UINT16 *>(&m_raw[(byteaddress ^ directxor) & m_bytemask]); - return m_space.read_word(byteaddress); -} - -inline UINT16 direct_read_data::read_decrypted_word(offs_t byteaddress, offs_t directxor) -{ - if (address_is_valid(byteaddress)) - return *reinterpret_cast<UINT16 *>(&m_decrypted[(byteaddress ^ directxor) & m_bytemask]); + return *reinterpret_cast<UINT16 *>(&m_ptr[(byteaddress ^ directxor) & m_bytemask]); return m_space.read_word(byteaddress); } //------------------------------------------------- -// read_raw_dword - read a dword via the +// read_dword - read a dword via the // direct_read_data class //------------------------------------------------- -inline UINT32 direct_read_data::read_raw_dword(offs_t byteaddress, offs_t directxor) +inline UINT32 direct_read_data::read_dword(offs_t byteaddress, offs_t directxor) { if (address_is_valid(byteaddress)) - return *reinterpret_cast<UINT32 *>(&m_raw[(byteaddress ^ directxor) & m_bytemask]); - return m_space.read_dword(byteaddress); -} - -inline UINT32 direct_read_data::read_decrypted_dword(offs_t byteaddress, offs_t directxor) -{ - if (address_is_valid(byteaddress)) - return *reinterpret_cast<UINT32 *>(&m_decrypted[(byteaddress ^ directxor) & m_bytemask]); + return *reinterpret_cast<UINT32 *>(&m_ptr[(byteaddress ^ directxor) & m_bytemask]); return m_space.read_dword(byteaddress); } //------------------------------------------------- -// read_raw_qword - read a qword via the +// read_qword - read a qword via the // direct_read_data class //------------------------------------------------- -inline UINT64 direct_read_data::read_raw_qword(offs_t byteaddress, offs_t directxor) -{ - if (address_is_valid(byteaddress)) - return *reinterpret_cast<UINT64 *>(&m_raw[(byteaddress ^ directxor) & m_bytemask]); - return m_space.read_qword(byteaddress); -} - -inline UINT64 direct_read_data::read_decrypted_qword(offs_t byteaddress, offs_t directxor) +inline UINT64 direct_read_data::read_qword(offs_t byteaddress, offs_t directxor) { if (address_is_valid(byteaddress)) - return *reinterpret_cast<UINT64 *>(&m_decrypted[(byteaddress ^ directxor) & m_bytemask]); + return *reinterpret_cast<UINT64 *>(&m_ptr[(byteaddress ^ directxor) & m_bytemask]); return m_space.read_qword(byteaddress); } diff --git a/src/emu/sound/bsmt2000.c b/src/emu/sound/bsmt2000.c index 80802d5f60e..0b1dea55354 100644 --- a/src/emu/sound/bsmt2000.c +++ b/src/emu/sound/bsmt2000.c @@ -296,7 +296,7 @@ READ16_MEMBER( bsmt2000_device::tms_data_r ) READ16_MEMBER( bsmt2000_device::tms_rom_r ) { // underlying logic assumes this is a sign-extended value - return (INT8)m_direct->read_raw_byte((m_rom_bank << 16) + m_rom_address); + return (INT8)m_direct->read_byte((m_rom_bank << 16) + m_rom_address); } diff --git a/src/emu/sound/c352.c b/src/emu/sound/c352.c index 15a3ba68273..b4172e43aa0 100644 --- a/src/emu/sound/c352.c +++ b/src/emu/sound/c352.c @@ -124,8 +124,8 @@ void c352_device::mix_one_channel(unsigned long ch, long sample_count) return; } - sample = (char)m_direct->read_raw_byte(pos); - nextsample = (char)m_direct->read_raw_byte(pos+cnt); + sample = (char)m_direct->read_byte(pos); + nextsample = (char)m_direct->read_byte(pos+cnt); // sample is muLaw, not 8-bit linear (Fighting Layer uses this extensively) if (flag & C352_FLG_MULAW) diff --git a/src/emu/sound/es5503.c b/src/emu/sound/es5503.c index 9364aa8065d..b1881412da2 100644 --- a/src/emu/sound/es5503.c +++ b/src/emu/sound/es5503.c @@ -184,9 +184,9 @@ void es5503_device::sound_stream_update(sound_stream &stream, stream_sample_t ** // channel strobe is always valid when reading; this allows potentially banking per voice m_channel_strobe = (ctrl>>4) & 0xf; - data = (INT32)m_direct->read_raw_byte(ramptr + wtptr) ^ 0x80; + data = (INT32)m_direct->read_byte(ramptr + wtptr) ^ 0x80; - if (m_direct->read_raw_byte(ramptr + wtptr) == 0x00) + if (m_direct->read_byte(ramptr + wtptr) == 0x00) { halt_osc(osc, 1, &acc, resshift); } diff --git a/src/emu/sound/multipcm.c b/src/emu/sound/multipcm.c index 5f984ffeadb..69c164bad2c 100644 --- a/src/emu/sound/multipcm.c +++ b/src/emu/sound/multipcm.c @@ -534,7 +534,7 @@ void multipcm_device::device_start() for (int j = 0; j < 12; j++) { - ptSample[j] = (UINT8)m_direct->read_raw_byte((i*12) + j); + ptSample[j] = (UINT8)m_direct->read_byte((i*12) + j); } m_Samples[i].Start=(ptSample[0]<<16)|(ptSample[1]<<8)|(ptSample[2]<<0); @@ -616,7 +616,7 @@ void multipcm_device::sound_stream_update(sound_stream &stream, stream_sample_t unsigned int adr=slot->offset>>SHIFT; signed int sample; unsigned int step=slot->step; - signed int csample=(signed short) (m_direct->read_raw_byte(slot->Base+adr)<<8); + signed int csample=(signed short) (m_direct->read_byte(slot->Base+adr)<<8); signed int fpart=slot->offset&((1<<SHIFT)-1); sample=(csample*fpart+slot->Prev*((1<<SHIFT)-fpart))>>SHIFT; diff --git a/src/emu/sound/okim6295.c b/src/emu/sound/okim6295.c index 2e59809199d..fc9f35e3a58 100644 --- a/src/emu/sound/okim6295.c +++ b/src/emu/sound/okim6295.c @@ -303,14 +303,14 @@ void okim6295_device::write_command(UINT8 command) // determine the start/stop positions offs_t base = m_command * 8; - offs_t start = m_direct->read_raw_byte(base + 0) << 16; - start |= m_direct->read_raw_byte(base + 1) << 8; - start |= m_direct->read_raw_byte(base + 2) << 0; + offs_t start = m_direct->read_byte(base + 0) << 16; + start |= m_direct->read_byte(base + 1) << 8; + start |= m_direct->read_byte(base + 2) << 0; start &= 0x3ffff; - offs_t stop = m_direct->read_raw_byte(base + 3) << 16; - stop |= m_direct->read_raw_byte(base + 4) << 8; - stop |= m_direct->read_raw_byte(base + 5) << 0; + offs_t stop = m_direct->read_byte(base + 3) << 16; + stop |= m_direct->read_byte(base + 4) << 8; + stop |= m_direct->read_byte(base + 5) << 0; stop &= 0x3ffff; if (start < stop) @@ -405,7 +405,7 @@ void okim6295_device::okim_voice::generate_adpcm(direct_read_data &direct, strea while (samples-- != 0) { // fetch the next sample byte - int nibble = direct.read_raw_byte(m_base_offset + m_sample / 2) >> (((m_sample & 1) << 2) ^ 4); + int nibble = direct.read_byte(m_base_offset + m_sample / 2) >> (((m_sample & 1) << 2) ^ 4); // output to the buffer, scaling by the volume // signal in range -2048..2047, volume in range 2..32 => signal * volume / 2 in range -32768..32767 diff --git a/src/emu/sound/okim9810.c b/src/emu/sound/okim9810.c index 54e53fe55d0..e134e646ddb 100644 --- a/src/emu/sound/okim9810.c +++ b/src/emu/sound/okim9810.c @@ -313,31 +313,31 @@ void okim9810_device::write_command(UINT8 data) const offs_t base = m_TMP_register * 8; offs_t startAddr; - UINT8 startFlags = m_direct->read_raw_byte(base + 0); - startAddr = m_direct->read_raw_byte(base + 1) << 16; - startAddr |= m_direct->read_raw_byte(base + 2) << 8; - startAddr |= m_direct->read_raw_byte(base + 3) << 0; + UINT8 startFlags = m_direct->read_byte(base + 0); + startAddr = m_direct->read_byte(base + 1) << 16; + startAddr |= m_direct->read_byte(base + 2) << 8; + startAddr |= m_direct->read_byte(base + 3) << 0; offs_t endAddr; - UINT8 endFlags = m_direct->read_raw_byte(base + 4); - endAddr = m_direct->read_raw_byte(base + 5) << 16; - endAddr |= m_direct->read_raw_byte(base + 6) << 8; - endAddr |= m_direct->read_raw_byte(base + 7) << 0; + UINT8 endFlags = m_direct->read_byte(base + 4); + endAddr = m_direct->read_byte(base + 5) << 16; + endAddr |= m_direct->read_byte(base + 6) << 8; + endAddr |= m_direct->read_byte(base + 7) << 0; // Sub-table if (startFlags & 0x80) { offs_t subTable = startAddr; // TODO: New startFlags &= 0x80. Are there further subtables? - startFlags = m_direct->read_raw_byte(subTable + 0); - startAddr = m_direct->read_raw_byte(subTable + 1) << 16; - startAddr |= m_direct->read_raw_byte(subTable + 2) << 8; - startAddr |= m_direct->read_raw_byte(subTable + 3) << 0; + startFlags = m_direct->read_byte(subTable + 0); + startAddr = m_direct->read_byte(subTable + 1) << 16; + startAddr |= m_direct->read_byte(subTable + 2) << 8; + startAddr |= m_direct->read_byte(subTable + 3) << 0; // TODO: What does byte (subTable + 4) refer to? - endAddr = m_direct->read_raw_byte(subTable + 5) << 16; - endAddr |= m_direct->read_raw_byte(subTable + 6) << 8; - endAddr |= m_direct->read_raw_byte(subTable + 7) << 0; + endAddr = m_direct->read_byte(subTable + 5) << 16; + endAddr |= m_direct->read_byte(subTable + 6) << 8; + endAddr |= m_direct->read_byte(subTable + 7) << 0; } m_voice[channel].m_sample = 0; @@ -478,7 +478,7 @@ void okim9810_device::okim_voice::generate_audio(direct_read_data &direct, if (m_sample == 0) { // fetch the first sample nibble - int nibble0 = direct.read_raw_byte(m_base_offset + m_sample / 2) >> (((m_sample & 1) << 2) ^ 4); + int nibble0 = direct.read_byte(m_base_offset + m_sample / 2) >> (((m_sample & 1) << 2) ^ 4); switch (m_playbackAlgo) { case OKIM9810_ADPCM_PLAYBACK: @@ -504,7 +504,7 @@ void okim9810_device::okim_voice::generate_audio(direct_read_data &direct, } // And fetch the second sample nibble - int nibble1 = direct.read_raw_byte(m_base_offset + (m_sample+1) / 2) >> ((((m_sample+1) & 1) << 2) ^ 4); + int nibble1 = direct.read_byte(m_base_offset + (m_sample+1) / 2) >> ((((m_sample+1) & 1) << 2) ^ 4); switch (m_playbackAlgo) { case OKIM9810_ADPCM_PLAYBACK: diff --git a/src/emu/sound/qs1000.c b/src/emu/sound/qs1000.c index 18872b99e1f..3100800acbc 100644 --- a/src/emu/sound/qs1000.c +++ b/src/emu/sound/qs1000.c @@ -523,7 +523,7 @@ void qs1000_device::sound_stream_update(sound_stream &stream, stream_sample_t ** if (chan.m_start + chan.m_adpcm_addr >= chan.m_loop_end) chan.m_adpcm_addr = chan.m_loop_start - chan.m_start; - UINT8 data = m_direct->read_raw_byte(chan.m_start + (chan.m_adpcm_addr >> 1)); + UINT8 data = m_direct->read_byte(chan.m_start + (chan.m_adpcm_addr >> 1)); UINT8 nibble = (chan.m_adpcm_addr & 1 ? data : data >> 4) & 0xf; chan.m_adpcm_signal = chan.m_adpcm.clock(nibble); } @@ -556,7 +556,7 @@ void qs1000_device::sound_stream_update(sound_stream &stream, stream_sample_t ** } } - INT8 result = m_direct->read_raw_byte(chan.m_addr) - 128; + INT8 result = m_direct->read_byte(chan.m_addr) - 128; chan.m_acc += chan.m_freq; chan.m_addr = (chan.m_addr + (chan.m_acc >> 18)) & QS1000_ADDRESS_MASK; @@ -576,9 +576,9 @@ void qs1000_device::start_voice(int ch) UINT32 table_addr = (m_channels[ch].m_regs[0x01] << 16) | (m_channels[ch].m_regs[0x02] << 8) | m_channels[ch].m_regs[0x03]; // Fetch the sound information - UINT16 freq = (m_direct->read_raw_byte(table_addr + 0) << 8) | m_direct->read_raw_byte(table_addr + 1); - UINT16 word1 = (m_direct->read_raw_byte(table_addr + 2) << 8) | m_direct->read_raw_byte(table_addr + 3); - UINT16 base = (m_direct->read_raw_byte(table_addr + 4) << 8) | m_direct->read_raw_byte(table_addr + 5); + UINT16 freq = (m_direct->read_byte(table_addr + 0) << 8) | m_direct->read_byte(table_addr + 1); + UINT16 word1 = (m_direct->read_byte(table_addr + 2) << 8) | m_direct->read_byte(table_addr + 3); + UINT16 base = (m_direct->read_byte(table_addr + 4) << 8) | m_direct->read_byte(table_addr + 5); if (LOGGING_ENABLED) printf("[%.6x] Freq:%.4x ????:%.4x Addr:%.4x\n", table_addr, freq, word1, base); @@ -588,42 +588,42 @@ void qs1000_device::start_voice(int ch) return; // Fetch the sample pointers and flags - UINT8 byte0 = m_direct->read_raw_byte(base); + UINT8 byte0 = m_direct->read_byte(base); UINT32 start_addr; start_addr = byte0 << 16; - start_addr |= m_direct->read_raw_byte(base + 1) << 8; - start_addr |= m_direct->read_raw_byte(base + 2) << 0; + start_addr |= m_direct->read_byte(base + 1) << 8; + start_addr |= m_direct->read_byte(base + 2) << 0; start_addr &= QS1000_ADDRESS_MASK; UINT32 loop_start; loop_start = (byte0 & 0xf0) << 16; - loop_start |= m_direct->read_raw_byte(base + 3) << 12; - loop_start |= m_direct->read_raw_byte(base + 4) << 4; - loop_start |= m_direct->read_raw_byte(base + 5) >> 4; + loop_start |= m_direct->read_byte(base + 3) << 12; + loop_start |= m_direct->read_byte(base + 4) << 4; + loop_start |= m_direct->read_byte(base + 5) >> 4; loop_start &= QS1000_ADDRESS_MASK; UINT32 loop_end; loop_end = (byte0 & 0xf0) << 16; - loop_end |= (m_direct->read_raw_byte(base + 5) & 0xf) << 16; - loop_end |= m_direct->read_raw_byte(base + 6) << 8; - loop_end |= m_direct->read_raw_byte(base + 7); + loop_end |= (m_direct->read_byte(base + 5) & 0xf) << 16; + loop_end |= m_direct->read_byte(base + 6) << 8; + loop_end |= m_direct->read_byte(base + 7); loop_end &= QS1000_ADDRESS_MASK; - UINT8 byte8 = m_direct->read_raw_byte(base + 8); + UINT8 byte8 = m_direct->read_byte(base + 8); if (LOGGING_ENABLED) { - UINT8 byte9 = m_direct->read_raw_byte(base + 9); - UINT8 byte10 = m_direct->read_raw_byte(base + 10); - UINT8 byte11 = m_direct->read_raw_byte(base + 11); - UINT8 byte12 = m_direct->read_raw_byte(base + 12); - UINT8 byte13 = m_direct->read_raw_byte(base + 13); - UINT8 byte14 = m_direct->read_raw_byte(base + 14); - UINT8 byte15 = m_direct->read_raw_byte(base + 15); + UINT8 byte9 = m_direct->read_byte(base + 9); + UINT8 byte10 = m_direct->read_byte(base + 10); + UINT8 byte11 = m_direct->read_byte(base + 11); + UINT8 byte12 = m_direct->read_byte(base + 12); + UINT8 byte13 = m_direct->read_byte(base + 13); + UINT8 byte14 = m_direct->read_byte(base + 14); + UINT8 byte15 = m_direct->read_byte(base + 15); printf("[%.6x] Sample Start:%.6x Loop Start:%.6x Loop End:%.6x Params: %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x\n", base, start_addr, loop_start, loop_end, byte8, byte9, byte10, byte11, byte12, byte13, byte14, byte15); } diff --git a/src/emu/sound/ymf278b.c b/src/emu/sound/ymf278b.c index 7e323f3d525..401bf2441f0 100644 --- a/src/emu/sound/ymf278b.c +++ b/src/emu/sound/ymf278b.c @@ -250,23 +250,23 @@ void ymf278b_device::sound_stream_update(sound_stream &stream, stream_sample_t * { // 8 bit case 0: - sample = m_direct->read_raw_byte(slot->startaddr + (slot->stepptr>>16))<<8; + sample = m_direct->read_byte(slot->startaddr + (slot->stepptr>>16))<<8; break; // 12 bit case 1: if (slot->stepptr & 0x10000) - sample = m_direct->read_raw_byte(slot->startaddr + (slot->stepptr>>17)*3+2)<<8 | - (m_direct->read_raw_byte(slot->startaddr + (slot->stepptr>>17)*3+1) << 4 & 0xf0); + sample = m_direct->read_byte(slot->startaddr + (slot->stepptr>>17)*3+2)<<8 | + (m_direct->read_byte(slot->startaddr + (slot->stepptr>>17)*3+1) << 4 & 0xf0); else - sample = m_direct->read_raw_byte(slot->startaddr + (slot->stepptr>>17)*3)<<8 | - (m_direct->read_raw_byte(slot->startaddr + (slot->stepptr>>17)*3+1) & 0xf0); + sample = m_direct->read_byte(slot->startaddr + (slot->stepptr>>17)*3)<<8 | + (m_direct->read_byte(slot->startaddr + (slot->stepptr>>17)*3+1) & 0xf0); break; // 16 bit case 2: - sample = m_direct->read_raw_byte(slot->startaddr + ((slot->stepptr>>16)*2))<<8 | - m_direct->read_raw_byte(slot->startaddr + ((slot->stepptr>>16)*2)+1); + sample = m_direct->read_byte(slot->startaddr + ((slot->stepptr>>16)*2))<<8 | + m_direct->read_byte(slot->startaddr + ((slot->stepptr>>16)*2)+1); break; // ?? bit, effect is unknown, datasheet says it's prohibited @@ -480,7 +480,7 @@ void ymf278b_device::C_w(UINT8 reg, UINT8 data) else offset = m_wavetblhdr*0x80000 + (slot->wave - 384) * 12; for (i = 0; i < 12; i++) - p[i] = m_direct->read_raw_byte(offset+i); + p[i] = m_direct->read_byte(offset+i); slot->bits = (p[0]&0xc0)>>6; slot->startaddr = (p[2] | (p[1]<<8) | ((p[0]&0x3f)<<16)); @@ -752,7 +752,7 @@ READ8_MEMBER( ymf278b_device::read ) ret = (m_pcmregs[m_port_C] & 0x1f) | 0x20; // device ID in upper bits break; case 6: - ret = m_direct->read_raw_byte(m_memadr); + ret = m_direct->read_byte(m_memadr); m_memadr = (m_memadr + 1) & 0x3fffff; break; diff --git a/src/emu/validity.c b/src/emu/validity.c index 8ed4f1e7fe2..14f46661888 100644 --- a/src/emu/validity.c +++ b/src/emu/validity.c @@ -109,8 +109,6 @@ void validity_checker::validate_tag(const char *tag) // too short/too long = bad if (strlen(begin) < MIN_TAG_LENGTH) osd_printf_error("Tag '%s' is too short (must be at least %d characters)\n", tag, MIN_TAG_LENGTH); - if (strlen(begin) > MAX_TAG_LENGTH) - osd_printf_error("Tag '%s' is too long (must be less than %d characters)\n", tag, MAX_TAG_LENGTH); } diff --git a/src/mame/audio/seibu.c b/src/mame/audio/seibu.c index 9e64e9ef6b0..e1a0b0aaa5b 100644 --- a/src/mame/audio/seibu.c +++ b/src/mame/audio/seibu.c @@ -83,6 +83,13 @@ seibu_sound_device::seibu_sound_device(const machine_config &mconfig, const char m_rst10_irq(0xff), m_rst18_irq(0xff) { + m_encryption_mode = 0; + m_decrypted_opcodes = NULL; +} + +void seibu_sound_device::set_encryption(int mode) +{ + m_encryption_mode = mode; } //------------------------------------------------- @@ -91,6 +98,32 @@ seibu_sound_device::seibu_sound_device(const machine_config &mconfig, const char void seibu_sound_device::device_start() { + int length = memregion(":audiocpu")->bytes(); + UINT8 *rom = memregion(":audiocpu")->base(); + if (length > 0x10000) + { + membank(":seibu_bank1")->configure_entries(0, (length - 0x10000) / 0x8000, rom + 0x10000, 0x8000); + + /* Denjin Makai definitely needs this at start-up, it never writes to the bankswitch */ + membank(":seibu_bank1")->set_entry(0); + } + + switch(m_encryption_mode) { + case 0: break; + case 3: break; + + case 1: + get_custom_decrypt(); + memcpy(m_decrypted_opcodes, rom, length); + apply_decrypt(rom, m_decrypted_opcodes, 0x2000); + break; + + case 2: + get_custom_decrypt(); + apply_decrypt(rom, m_decrypted_opcodes, length); + break; + } + m_main2sub[0] = m_main2sub[1] = 0; m_sub2main[0] = m_sub2main[1] = 0; @@ -108,18 +141,8 @@ void seibu_sound_device::device_start() void seibu_sound_device::device_reset() { - int romlength = machine().root_device().memregion("audiocpu")->bytes(); - UINT8 *rom = machine().root_device().memregion("audiocpu")->base(); - - m_sound_cpu = machine().device("audiocpu"); + m_sound_cpu = machine().device(":audiocpu"); update_irq_lines(VECTOR_INIT); - if (romlength > 0x10000) - { - machine().root_device().membank("bank1")->configure_entries(0, (romlength - 0x10000) / 0x8000, rom + 0x10000, 0x8000); - - /* Denjin Makai definitely needs this at start-up, it never writes to the bankswitch */ - machine().root_device().membank("bank1")->set_entry(0); - } } static UINT8 decrypt_data(int a,int src) @@ -155,25 +178,32 @@ static UINT8 decrypt_opcode(int a,int src) return src; } -void seibu_sound_device::decrypt(const char *cpu,int length) +UINT8 *seibu_sound_device::get_custom_decrypt() { - address_space &space = machine().device(cpu)->memory().space(AS_PROGRAM); - UINT8 *decrypt = auto_alloc_array_clear(machine(), UINT8, length); - UINT8 *rom = machine().root_device().memregion(cpu)->base(); - int i; - - space.set_decrypted_region(0x0000, (length < 0x10000) ? (length - 1) : 0x1fff, decrypt); + if (m_decrypted_opcodes) + return m_decrypted_opcodes; + + int size = memregion(":audiocpu")->bytes(); + m_decrypted_opcodes = auto_alloc_array_clear(machine(), UINT8, size); + membank(":seibu_bank0d")->set_base(m_decrypted_opcodes); + if (size > 0x10000) { + membank(":seibu_bank1d")->configure_entries(0, (size - 0x10000) / 0x8000, m_decrypted_opcodes + 0x10000, 0x8000); + membank(":seibu_bank1d")->set_entry(0); + } else + membank(":seibu_bank1d")->set_base(m_decrypted_opcodes + 0x8000); + + return m_decrypted_opcodes; +} - for (i = 0;i < length;i++) +void seibu_sound_device::apply_decrypt(UINT8 *rom, UINT8 *opcodes, int length) +{ + for (int i = 0;i < length;i++) { UINT8 src = rom[i]; rom[i] = decrypt_data(i,src); - decrypt[i] = decrypt_opcode(i,src); + opcodes[i] = decrypt_opcode(i,src); } - - if (length > 0x10000) - machine().root_device().membank("bank1")->configure_decrypted_entries(0, (length - 0x10000) / 0x8000, decrypt + 0x10000, 0x8000); } void seibu_sound_device::update_irq_lines(int param) @@ -238,7 +268,9 @@ WRITE_LINE_MEMBER( seibu_sound_device::fm_irqhandler ) WRITE8_MEMBER( seibu_sound_device::bank_w ) { - space.machine().root_device().membank("bank1")->set_entry(data & 1); + membank(":seibu_bank1")->set_entry(data & 1); + if (m_decrypted_opcodes) + membank(":seibu_bank1d")->set_entry(data & 1); } WRITE8_MEMBER( seibu_sound_device::coin_w ) @@ -326,6 +358,11 @@ WRITE16_MEMBER( seibu_sound_device::main_mustb_w ) /***************************************************************************/ +ADDRESS_MAP_START( seibu_sound_decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, driver_device ) + AM_RANGE(0x0000, 0x1fff) AM_ROMBANK("seibu_bank0d") + AM_RANGE(0x8000, 0xffff) AM_ROMBANK("seibu_bank1d") +ADDRESS_MAP_END + ADDRESS_MAP_START( seibu_sound_map, AS_PROGRAM, 8, driver_device ) AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x2000, 0x27ff) AM_RAM @@ -341,7 +378,7 @@ ADDRESS_MAP_START( seibu_sound_map, AS_PROGRAM, 8, driver_device ) AM_RANGE(0x4018, 0x4019) AM_DEVWRITE("seibu_sound", seibu_sound_device, main_data_w) AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) AM_RANGE(0x6000, 0x6000) AM_DEVREADWRITE("oki", okim6295_device, read, write) - AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1") + AM_RANGE(0x8000, 0xffff) AM_ROMBANK("seibu_bank1") ADDRESS_MAP_END ADDRESS_MAP_START( seibu2_airraid_sound_map, AS_PROGRAM, 8, driver_device ) @@ -359,7 +396,7 @@ ADDRESS_MAP_START( seibu2_airraid_sound_map, AS_PROGRAM, 8, driver_device ) AM_RANGE(0x4018, 0x4019) AM_DEVWRITE("seibu_sound", seibu_sound_device, main_data_w) AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) // AM_RANGE(0x6000, 0x6000) AM_DEVREADWRITE("oki", okim6295_device, read, write) - AM_RANGE(0x8000, 0xffff) AM_ROM + AM_RANGE(0x8000, 0xffff) AM_ROMBANK("seibu_bank1") ADDRESS_MAP_END ADDRESS_MAP_START( seibu2_sound_map, AS_PROGRAM, 8, driver_device ) @@ -377,7 +414,7 @@ ADDRESS_MAP_START( seibu2_sound_map, AS_PROGRAM, 8, driver_device ) AM_RANGE(0x4018, 0x4019) AM_DEVWRITE("seibu_sound", seibu_sound_device, main_data_w) AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) AM_RANGE(0x6000, 0x6000) AM_DEVREADWRITE("oki", okim6295_device, read, write) - AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1") + AM_RANGE(0x8000, 0xffff) AM_ROMBANK("seibu_bank1") ADDRESS_MAP_END ADDRESS_MAP_START( seibu2_raiden2_sound_map, AS_PROGRAM, 8, driver_device ) @@ -396,7 +433,7 @@ ADDRESS_MAP_START( seibu2_raiden2_sound_map, AS_PROGRAM, 8, driver_device ) AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) AM_RANGE(0x6000, 0x6000) AM_DEVREADWRITE("oki1", okim6295_device, read, write) AM_RANGE(0x6002, 0x6002) AM_DEVREADWRITE("oki2", okim6295_device, read, write) - AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1") + AM_RANGE(0x8000, 0xffff) AM_ROMBANK("seibu_bank1") AM_RANGE(0x4004, 0x4004) AM_NOP AM_RANGE(0x401a, 0x401a) AM_NOP ADDRESS_MAP_END @@ -416,7 +453,7 @@ ADDRESS_MAP_START( seibu_newzeroteam_sound_map, AS_PROGRAM, 8, driver_device ) AM_RANGE(0x401a, 0x401a) AM_DEVWRITE("seibu_sound", seibu_sound_device, bank_w) AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) AM_RANGE(0x6000, 0x6000) AM_DEVREADWRITE("oki", okim6295_device, read, write) - AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1") + AM_RANGE(0x8000, 0xffff) AM_ROMBANK("seibu_bank1") ADDRESS_MAP_END ADDRESS_MAP_START( seibu3_sound_map, AS_PROGRAM, 8, driver_device ) @@ -434,7 +471,7 @@ ADDRESS_MAP_START( seibu3_sound_map, AS_PROGRAM, 8, driver_device ) AM_RANGE(0x4018, 0x4019) AM_DEVWRITE("seibu_sound", seibu_sound_device, main_data_w) AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) AM_RANGE(0x6008, 0x6009) AM_DEVREADWRITE("ym2", ym2203_device, read, write) - AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1") + AM_RANGE(0x8000, 0xffff) AM_ROMBANK("seibu_bank1") ADDRESS_MAP_END ADDRESS_MAP_START( seibu3_adpcm_sound_map, AS_PROGRAM, 8, driver_device ) @@ -456,7 +493,7 @@ ADDRESS_MAP_START( seibu3_adpcm_sound_map, AS_PROGRAM, 8, driver_device ) AM_RANGE(0x6005, 0x6006) AM_DEVWRITE("adpcm2", seibu_adpcm_device, adr_w) AM_RANGE(0x6008, 0x6009) AM_DEVREADWRITE("ym2", ym2203_device, read, write) AM_RANGE(0x601a, 0x601a) AM_DEVWRITE("adpcm2", seibu_adpcm_device, ctl_w) - AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1") + AM_RANGE(0x8000, 0xffff) AM_ROMBANK("seibu_bank1") ADDRESS_MAP_END /*************************************************************************** diff --git a/src/mame/audio/seibu.h b/src/mame/audio/seibu.h index a92ab8a5855..ca3fa2f11c2 100644 --- a/src/mame/audio/seibu.h +++ b/src/mame/audio/seibu.h @@ -31,6 +31,7 @@ #include "sound/2203intf.h" #include "sound/okim6295.h" +ADDRESS_MAP_EXTERN(seibu_sound_decrypted_opcodes_map, 8); ADDRESS_MAP_EXTERN(seibu_sound_map, 8); ADDRESS_MAP_EXTERN(seibu2_sound_map, 8); ADDRESS_MAP_EXTERN(seibu2_airraid_sound_map, 8); @@ -58,7 +59,10 @@ public: DECLARE_READ8_MEMBER( main_data_pending_r ); DECLARE_WRITE8_MEMBER( main_data_w ); DECLARE_WRITE8_MEMBER( pending_w ); - void decrypt(const char *cpu,int length); + + static void apply_decrypt(UINT8 *rom, UINT8 *opcodes, int length); + void set_encryption(int mode); + UINT8 *get_custom_decrypt(); void update_irq_lines(int param); protected: @@ -67,6 +71,9 @@ protected: virtual void device_reset(); private: + int m_encryption_mode; + UINT8 *m_decrypted_opcodes; + // internal state device_t *m_sound_cpu; UINT8 m_main2sub[2]; @@ -188,6 +195,24 @@ extern const device_type SEIBU_ADPCM; MCFG_CPU_PROGRAM_MAP(seibu3_adpcm_sound_map) \ MCFG_DEVICE_ADD("seibu_sound", SEIBU_SOUND, 0) +#define SEIBU_SOUND_SYSTEM_ENCRYPTED_LOW() \ + MCFG_DEVICE_MODIFY("seibu_sound") \ + downcast<seibu_sound_device *>(device)->set_encryption(1); \ + MCFG_DEVICE_MODIFY("audiocpu") \ + MCFG_CPU_DECRYPTED_OPCODES_MAP(seibu_sound_decrypted_opcodes_map) + +#define SEIBU_SOUND_SYSTEM_ENCRYPTED_FULL() \ + MCFG_DEVICE_MODIFY("seibu_sound") \ + downcast<seibu_sound_device *>(device)->set_encryption(2); \ + MCFG_DEVICE_MODIFY("audiocpu") \ + MCFG_CPU_DECRYPTED_OPCODES_MAP(seibu_sound_decrypted_opcodes_map) + +#define SEIBU_SOUND_SYSTEM_ENCRYPTED_CUSTOM() \ + MCFG_DEVICE_MODIFY("seibu_sound") \ + downcast<seibu_sound_device *>(device)->set_encryption(3); \ + MCFG_DEVICE_MODIFY("audiocpu") \ + MCFG_CPU_DECRYPTED_OPCODES_MAP(seibu_sound_decrypted_opcodes_map) + #define SEIBU_SOUND_SYSTEM_YM3812_INTERFACE(freq1,freq2) \ MCFG_SPEAKER_STANDARD_MONO("mono") \ \ diff --git a/src/mame/audio/turrett.c b/src/mame/audio/turrett.c index 29b07dbb4c8..6a2fc150c7b 100644 --- a/src/mame/audio/turrett.c +++ b/src/mame/audio/turrett.c @@ -103,7 +103,7 @@ void turrett_device::sound_stream_update(sound_stream &stream, stream_sample_t * for (int s = 0; s < samples; ++s) { - INT16 sample = m_direct->read_raw_word(addr << 1); + INT16 sample = m_direct->read_word(addr << 1); if ((UINT16)sample == 0x8000) { diff --git a/src/mame/drivers/angelkds.c b/src/mame/drivers/angelkds.c index 47e225f680f..8bd36d7b37c 100644 --- a/src/mame/drivers/angelkds.c +++ b/src/mame/drivers/angelkds.c @@ -212,6 +212,11 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, angelkds_state ) AM_RANGE(0xf005, 0xf005) AM_WRITE(angelkds_layer_ctrl_write) ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, angelkds_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") + AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") +ADDRESS_MAP_END + static ADDRESS_MAP_START( main_portmap, AS_IO, 8, angelkds_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_WRITENOP // 00 on start-up, not again @@ -628,6 +633,12 @@ static MACHINE_CONFIG_START( angelkds, angelkds_state ) MCFG_SOUND_ROUTE(3, "mono", 0.45) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( spcpostn, angelkds ) + /* encryption */ + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + /*** Rom Loading "maincpu" for the main code @@ -643,7 +654,7 @@ MACHINE_CONFIG_END ROM_START( angelkds ) /* Nasco X090-PC-A (Sega 837-6600) */ - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "11428.c10", 0x00000, 0x08000, CRC(90daacd2) SHA1(7e50ad1cbed0c1e6bad04ef1611cad25538c905f) ) ROM_REGION( 0x20000, "user1", 0 ) /* Banked Code */ @@ -690,7 +701,7 @@ ROM_END ROM_START( spcpostn ) /* X090-PC-A 171-5383 */ - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* D317-0005 (NEC Z80 Custom) */ + ROM_REGION( 0x8000, "maincpu", 0 ) /* D317-0005 (NEC Z80 Custom) */ ROM_LOAD( "epr10125.c10", 0x00000, 0x08000, CRC(bffd38c6) SHA1(af02907124343ddecd21439d25f1ebb81ef9f51a) ) /* encrypted */ ROM_REGION( 0x28000, "user1", 0 ) /* Banked Code */ @@ -736,10 +747,12 @@ DRIVER_INIT_MEMBER(angelkds_state,spcpostn) { UINT8 *RAM = memregion("user1")->base(); - sega_317_0005_decode(machine(), "maincpu"); + // 317-0005 + sega_decode_317(memregion("maincpu")->base(), m_decrypted_opcodes, 1); + membank("bank1")->configure_entries(0, 10, &RAM[0x0000], 0x4000); } GAME( 1988, angelkds, 0, angelkds, angelkds, angelkds_state, angelkds, ROT90, "Sega / Nasco?", "Angel Kids (Japan)" , GAME_SUPPORTS_SAVE) /* Nasco not displayed but 'Exa Planning' is */ -GAME( 1986, spcpostn, 0, angelkds, spcpostn, angelkds_state, spcpostn, ROT90, "Sega / Nasco", "Space Position (Japan)" , GAME_SUPPORTS_SAVE) /* encrypted */ +GAME( 1986, spcpostn, 0, spcpostn, spcpostn, angelkds_state, spcpostn, ROT90, "Sega / Nasco", "Space Position (Japan)" , GAME_SUPPORTS_SAVE) /* encrypted */ diff --git a/src/mame/drivers/appoooh.c b/src/mame/drivers/appoooh.c index b3ab3aba401..6c99c38dad5 100644 --- a/src/mame/drivers/appoooh.c +++ b/src/mame/drivers/appoooh.c @@ -227,6 +227,12 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, appoooh_state ) AM_RANGE(0xf000, 0xffff) AM_RAM ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, appoooh_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") + AM_RANGE(0x8000, 0x9fff) AM_ROM AM_REGION("maincpu", 0x8000) + AM_RANGE(0xa000, 0xdfff) AM_ROMBANK("bank1") +ADDRESS_MAP_END + static ADDRESS_MAP_START( main_portmap, AS_IO, 8, appoooh_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_READ_PORT("P1") AM_DEVWRITE("sn1", sn76489_device, write) @@ -455,6 +461,9 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( robowres, appoooh_common ) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -577,13 +586,48 @@ ROM_END DRIVER_INIT_MEMBER(appoooh_state,robowres) { - sega_315_5179_decode(machine(), "maincpu"); + static const UINT8 xor_table[128] = + { + 0x00,0x45,0x41,0x14,0x10,0x55,0x51,0x01,0x04,0x40,0x45,0x11,0x14,0x50, + 0x00,0x05,0x41,0x44,0x10,0x15,0x51,0x54,0x04, + 0x00,0x45,0x41,0x14,0x10,0x55,0x05,0x01,0x44,0x40,0x15,0x11,0x54,0x50, + 0x00,0x05,0x41,0x44,0x10,0x15,0x51,0x01,0x04, + 0x40,0x45,0x11,0x14,0x50,0x55,0x05,0x01,0x44,0x40,0x15,0x11,0x54,0x04, + 0x00,0x45,0x41,0x14,0x50, + 0x00,0x05,0x41,0x44,0x10,0x15,0x51,0x54,0x04, + 0x00,0x45,0x41,0x14,0x50,0x55,0x05,0x01,0x44,0x40,0x15,0x11,0x54,0x50, + 0x00,0x05,0x41,0x44,0x10,0x55,0x51,0x01,0x04, + 0x40,0x45,0x11,0x14,0x50,0x55,0x05,0x01,0x44,0x40,0x15,0x51,0x54,0x04, + 0x00,0x45,0x41,0x14,0x10,0x55,0x51,0x01,0x04, + 0x40,0x45,0x11,0x54,0x50,0x00,0x05,0x41, + }; + + static const int swap_table[128] = + { + 8, 9,11,13,15, 0, 2, 4, 6, + 8, 9,11,13,15, 1, 2, 4, 6, + 8, 9,11,13,15, 1, 2, 4, 6, + 8, 9,11,13,15, 1, 2, 4, 6, + 8,10,11,13,15, 1, 2, 4, 6, + 8,10,11,13,15, 1, 2, 4, 6, + 8,10,11,13,15, 1, 3, 4, 6, + 8, + 7, 1, 2, 4, 6, 0, 1, 3, 5, + 7, 1, 2, 4, 6, 0, 1, 3, 5, + 7, 1, 2, 4, 6, 0, 2, 3, 5, + 7, 1, 2, 4, 6, 0, 2, 3, 5, + 7, 1, 2, 4, 6, 0, 2, 3, 5, + 7, 1, 3, 4, 6, 0, 2, 3, 5, + 7, 1, 3, 4, 6, 0, 2, 4, 5, + 7, + }; + + sega_decode_2(memregion("maincpu")->base(), m_decrypted_opcodes, xor_table, swap_table); } DRIVER_INIT_MEMBER(appoooh_state,robowresb) { - address_space &space = m_maincpu->space(AS_PROGRAM); - space.set_decrypted_region(0x0000, 0x7fff, memregion("maincpu")->base() + 0x1c000); + memcpy(m_decrypted_opcodes, memregion("maincpu")->base() + 0x1c000, 0x8000); } diff --git a/src/mame/drivers/boogwing.c b/src/mame/drivers/boogwing.c index 10f314ec6af..4a0ecabbf5b 100644 --- a/src/mame/drivers/boogwing.c +++ b/src/mame/drivers/boogwing.c @@ -143,6 +143,9 @@ static ADDRESS_MAP_START( boogwing_map, AS_PROGRAM, 16, boogwing_state ) AM_RANGE(0x3c0000, 0x3c004f) AM_RAM // ? ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 16, boogwing_state ) + AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END static ADDRESS_MAP_START( audio_map, AS_PROGRAM, 8, boogwing_state ) AM_RANGE(0x000000, 0x00ffff) AM_ROM @@ -317,6 +320,7 @@ static MACHINE_CONFIG_START( boogwing, boogwing_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 14000000) /* DE102 */ MCFG_CPU_PROGRAM_MAP(boogwing_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", boogwing_state, irq6_line_hold) MCFG_CPU_ADD("audiocpu", H6280, 32220000/4) @@ -635,7 +639,7 @@ DRIVER_INIT_MEMBER(boogwing_state,boogwing) deco56_decrypt_gfx(machine(), "tiles2"); deco56_decrypt_gfx(machine(), "tiles3"); deco56_remap_gfx(machine(), "gfx6"); - deco102_decrypt_cpu(machine(), "maincpu", 0x42ba, 0x00, 0x18); + deco102_decrypt_cpu((UINT16 *)memregion("maincpu")->base(), m_decrypted_opcodes, 0x100000, 0x42ba, 0x00, 0x18); memcpy(dst, src, 0x100000); } diff --git a/src/mame/drivers/cabal.c b/src/mame/drivers/cabal.c index 1ae39175190..54932b10902 100644 --- a/src/mame/drivers/cabal.c +++ b/src/mame/drivers/cabal.c @@ -468,7 +468,7 @@ static GFXDECODE_START( cabal ) GFXDECODE_END -static MACHINE_CONFIG_START( cabal, cabal_state ) +static MACHINE_CONFIG_START( cabal_base, cabal_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_20MHz/2) /* verified on pcb */ @@ -511,6 +511,14 @@ static MACHINE_CONFIG_START( cabal, cabal_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono", 0.40) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( cabal, cabal_base ) + SEIBU_SOUND_SYSTEM_ENCRYPTED_LOW() +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( cabalbl2, cabal_base ) + SEIBU_SOUND_SYSTEM_ENCRYPTED_CUSTOM() +MACHINE_CONFIG_END + /* the bootleg has different sound hardware (2 extra Z80s for ADPCM playback) */ static MACHINE_CONFIG_START( cabalbl, cabal_state ) @@ -787,7 +795,7 @@ ROM_END // based on stickers present on the board it appears to have been manufactured by 'TAB-Austria' and is marked 'CA02' ROM_START( cabalbl2 ) - ROM_REGION( 0x50000, "maincpu", 0 ) /* 64k for cpu code */ + ROM_REGION( 0x40000, "maincpu", 0 ) /* 64k for cpu code */ ROM_LOAD16_BYTE( "c9.bin", 0x00000, 0x10000, CRC(00abbe0c) SHA1(bacf17444abfb4f56248ff56e37b0aa2b1a3800d) ) ROM_LOAD16_BYTE( "c7.bin", 0x00001, 0x10000, CRC(44736281) SHA1(1d6da95ef96d9c02aea70791e1cb87b70097d5ed) ) ROM_LOAD16_BYTE( "c8.bin", 0x20000, 0x10000, CRC(d763a47c) SHA1(146d8082a404b6eddaf2dc9ba41a997949c17f8a) ) @@ -831,33 +839,17 @@ ROM_START( cabalbl2 ) ROM_END - -void cabal_state::seibu_sound_bootleg(const char *cpu,int length) -{ - address_space &space = machine().device(cpu)->memory().space(AS_PROGRAM); - UINT8 *decrypt = auto_alloc_array(machine(), UINT8, length); - UINT8 *rom = memregion(cpu)->base(); - - space.set_decrypted_region(0x0000, (length < 0x10000) ? (length - 1) : 0x1fff, decrypt); - - memcpy(decrypt, rom+length, length); - - if (length > 0x10000) - membank("bank1")->configure_decrypted_entries(0, (length - 0x10000) / 0x8000, decrypt + 0x10000, 0x8000); -} - - - DRIVER_INIT_MEMBER(cabal_state,cabal) { - m_seibu_sound->decrypt("audiocpu",0x2000); m_adpcm1->decrypt("adpcm1"); m_adpcm2->decrypt("adpcm2"); } DRIVER_INIT_MEMBER(cabal_state,cabalbl2) { - seibu_sound_bootleg("audiocpu",0x2000); + UINT8 *decrypt = m_seibu_sound->get_custom_decrypt(); + memcpy(decrypt, memregion("audiocpu")->base()+0x2000, 0x2000); + memcpy(decrypt+0x8000, memregion("audiocpu")->base()+0x8000, 0x8000); m_adpcm1->decrypt("adpcm1"); m_adpcm2->decrypt("adpcm2"); } @@ -866,7 +858,7 @@ DRIVER_INIT_MEMBER(cabal_state,cabalbl2) GAME( 1988, cabal, 0, cabal, cabalj, cabal_state, cabal, ROT0, "TAD Corporation", "Cabal (World, Joystick version)", GAME_SUPPORTS_SAVE ) GAME( 1989, cabala, cabal, cabal, cabalj, cabal_state, cabal, ROT0, "TAD Corporation (Alpha Trading license)", "Cabal (Alpha Trading)", GAME_SUPPORTS_SAVE ) // korea? GAME( 1988, cabalbl, cabal, cabalbl, cabalbl, driver_device, 0, ROT0, "bootleg (Red Corporation)", "Cabal (bootleg of Joystick version, set 1, alternate sound hardware)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) -GAME( 1988, cabalbl2,cabal, cabal, cabalj, cabal_state, cabalbl2,ROT0, "bootleg", "Cabal (bootleg of Joystick version, set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1988, cabalbl2,cabal, cabalbl2,cabalj, cabal_state, cabalbl2,ROT0, "bootleg", "Cabal (bootleg of Joystick version, set 2)", GAME_SUPPORTS_SAVE ) GAME( 1988, cabalus, cabal, cabal, cabalt, cabal_state, cabal, ROT0, "TAD Corporation (Fabtek license)", "Cabal (US set 1, Trackball version)", GAME_SUPPORTS_SAVE ) GAME( 1988, cabalus2,cabal, cabal, cabalt, cabal_state, cabal, ROT0, "TAD Corporation (Fabtek license)", "Cabal (US set 2, Trackball version)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/calorie.c b/src/mame/drivers/calorie.c index effedfd8a5f..a5921c03dd8 100644 --- a/src/mame/drivers/calorie.c +++ b/src/mame/drivers/calorie.c @@ -94,7 +94,8 @@ public: m_sprites(*this, "sprites"), m_maincpu(*this, "maincpu"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } /* memory pointers */ required_shared_ptr<UINT8> m_fg_ram; @@ -121,6 +122,7 @@ public: required_device<cpu_device> m_maincpu; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; + optional_shared_ptr<UINT8> m_decrypted_opcodes; }; @@ -256,7 +258,7 @@ WRITE8_MEMBER(calorie_state::bogus_w) static ADDRESS_MAP_START( calorie_map, AS_PROGRAM, 8, calorie_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0xbfff) AM_ROM - AM_RANGE(0xc000, 0xcfff) AM_RAM + AM_RANGE(0xc000, 0xcfff) AM_RAM AM_SHARE("ram") AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(fg_ram_w) AM_SHARE("fg_ram") AM_RANGE(0xd800, 0xdbff) AM_RAM AM_SHARE("sprites") AM_RANGE(0xdc00, 0xdcff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") @@ -269,6 +271,11 @@ static ADDRESS_MAP_START( calorie_map, AS_PROGRAM, 8, calorie_state ) AM_RANGE(0xf800, 0xf800) AM_WRITE(soundlatch_byte_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, calorie_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") + AM_RANGE(0x8000, 0xbfff) AM_ROM + AM_RANGE(0xc000, 0xcfff) AM_RAM AM_SHARE("ram") +ADDRESS_MAP_END static ADDRESS_MAP_START( calorie_sound_map, AS_PROGRAM, 8, calorie_state ) AM_RANGE(0x0000, 0x3fff) AM_ROM @@ -447,6 +454,7 @@ static MACHINE_CONFIG_START( calorie, calorie_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,4000000) /* 4 MHz */ MCFG_CPU_PROGRAM_MAP(calorie_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", calorie_state, irq0_line_hold) MCFG_CPU_ADD("audiocpu", Z80,3000000) /* 3 MHz */ @@ -555,13 +563,13 @@ ROM_END DRIVER_INIT_MEMBER(calorie_state,calorie) { - sega_317_0004_decode(machine(), "maincpu"); + // 317-0004 + sega_decode_317(memregion("maincpu")->base(), m_decrypted_opcodes, 0); } DRIVER_INIT_MEMBER(calorie_state,calorieb) { - address_space &space = m_maincpu->space(AS_PROGRAM); - space.set_decrypted_region(0x0000, 0x7fff, memregion("maincpu")->base() + 0x10000); + memcpy(m_decrypted_opcodes, memregion("maincpu")->base() + 0x10000, 0x8000); } diff --git a/src/mame/drivers/cbasebal.c b/src/mame/drivers/cbasebal.c index d3b7bd38cb1..41034ad2d68 100644 --- a/src/mame/drivers/cbasebal.c +++ b/src/mame/drivers/cbasebal.c @@ -98,6 +98,11 @@ static ADDRESS_MAP_START( cbasebal_map, AS_PROGRAM, 8, cbasebal_state ) AM_RANGE(0xfe00, 0xffff) AM_RAM AM_SHARE("spriteram") ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, cbasebal_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROMBANK("bank0d") + AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1d") +ADDRESS_MAP_END + static ADDRESS_MAP_START( cbasebal_portmap, AS_IO, 8, cbasebal_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_WRITE(cbasebal_bankswitch_w) @@ -257,6 +262,7 @@ static MACHINE_CONFIG_START( cbasebal, cbasebal_state ) MCFG_CPU_ADD("maincpu", Z80, 6000000) /* ??? */ MCFG_CPU_PROGRAM_MAP(cbasebal_map) MCFG_CPU_IO_MAP(cbasebal_portmap) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", cbasebal_state, irq0_line_hold) /* ??? */ MCFG_EEPROM_SERIAL_93C46_ADD("eeprom") @@ -330,7 +336,13 @@ ROM_END DRIVER_INIT_MEMBER(cbasebal_state,cbasebal) { - pang_decode(machine()); + UINT8 *src = memregion("maincpu")->base(); + int size = memregion("maincpu")->bytes(); + UINT8 *dst = auto_alloc_array(machine(), UINT8, size); + pang_decode(src, dst, size); + membank("bank1")->configure_entries(0, 16, src + 0x10000, 0x4000); + membank("bank0d")->set_base(dst); + membank("bank1d")->configure_entries(0, 16, dst + 0x10000, 0x4000); } diff --git a/src/mame/drivers/cclimber.c b/src/mame/drivers/cclimber.c index b3162d5b532..6cfd1382651 100644 --- a/src/mame/drivers/cclimber.c +++ b/src/mame/drivers/cclimber.c @@ -254,8 +254,10 @@ WRITE8_MEMBER(cclimber_state::toprollr_rombank_w) m_toprollr_rombank &= ~(1 << offset); m_toprollr_rombank |= (data & 1) << offset; - if (m_toprollr_rombank < 3) + if (m_toprollr_rombank < 3) { membank("bank1")->set_entry(m_toprollr_rombank); + membank("bank1d")->set_entry(m_toprollr_rombank); + } } MACHINE_RESET_MEMBER(cclimber_state,cclimber) @@ -299,6 +301,10 @@ static ADDRESS_MAP_START( cclimber_map, AS_PROGRAM, 8, cclimber_state ) AM_RANGE(0xb800, 0xb800) AM_READ_PORT("SYSTEM") ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, cclimber_state ) + AM_RANGE(0x0000, 0x5fff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( cannonb_map, AS_PROGRAM, 8, cclimber_state ) AM_RANGE(0x5045, 0x505f) AM_WRITENOP /* do not errorlog this */ AM_RANGE(0x0000, 0x5fff) AM_ROM @@ -339,6 +345,10 @@ static ADDRESS_MAP_START( swimmer_map, AS_PROGRAM, 8, cclimber_state ) AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW1") AM_RANGE(0xb800, 0xb800) AM_READ_PORT("DSW2") AM_WRITEONLY AM_SHARE("bgcolor") AM_RANGE(0xb880, 0xb880) AM_READ_PORT("SYSTEM") +ADDRESS_MAP_END + +static ADDRESS_MAP_START( guzzler_map, AS_PROGRAM, 8, cclimber_state ) + AM_IMPORT_FROM(swimmer_map) AM_RANGE(0xc000, 0xc7ff) AM_RAM /* ??? used by Guzzler */ AM_RANGE(0xe000, 0xffff) AM_ROM /* Guzzler only */ ADDRESS_MAP_END @@ -367,7 +377,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( toprollr_map, AS_PROGRAM, 8, cclimber_state ) AM_RANGE(0x0000, 0x5fff) AM_ROMBANK("bank1") - AM_RANGE(0x6000, 0x6bff) AM_RAM + AM_RANGE(0x6000, 0x6bff) AM_RAM AM_SHARE("ram") AM_RANGE(0x8800, 0x88ff) AM_RAM AM_SHARE("bigspriteram") AM_RANGE(0x8c00, 0x8fff) AM_RAM AM_SHARE("bg_videoram") AM_RANGE(0x9000, 0x93ff) AM_RAM AM_SHARE("videoram") @@ -386,6 +396,10 @@ static ADDRESS_MAP_START( toprollr_map, AS_PROGRAM, 8, cclimber_state ) AM_RANGE(0xc000, 0xffff) AM_ROM ADDRESS_MAP_END +static ADDRESS_MAP_START( toprollr_decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, cclimber_state ) + AM_RANGE(0x0000, 0x5fff) AM_ROMBANK("bank1d") + AM_RANGE(0xc000, 0xffff) AM_ROM AM_REGION("maincpu", 0xc000) +ADDRESS_MAP_END static ADDRESS_MAP_START( cclimber_portmap, AS_IO, 8, cclimber_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) @@ -1019,6 +1033,11 @@ static MACHINE_CONFIG_DERIVED( cclimber, root ) MCFG_CCLIMBER_AUDIO_ADD("cclimber_audio") MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( cclimberx, cclimber ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( cannonb, cclimber ) @@ -1037,6 +1056,7 @@ static MACHINE_CONFIG_DERIVED( yamato, root ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(yamato_map) MCFG_CPU_IO_MAP(yamato_portmap) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_ADD("audiocpu", Z80, 3072000) /* 3.072 MHz ? */ MCFG_CPU_PROGRAM_MAP(yamato_audio_map) @@ -1065,6 +1085,7 @@ static MACHINE_CONFIG_DERIVED( toprollr, cclimber ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(toprollr_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(toprollr_decrypted_opcodes_map) /* video hardware */ MCFG_GFXDECODE_MODIFY("gfxdecode", toprollr) @@ -1114,6 +1135,12 @@ static MACHINE_CONFIG_START( swimmer, cclimber_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( guzzler, swimmer ) + /* basic machine hardware */ + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(guzzler_map) +MACHINE_CONFIG_END + /*************************************************************************** @@ -1122,7 +1149,7 @@ MACHINE_CONFIG_END ***************************************************************************/ ROM_START( cclimber ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "cc11", 0x0000, 0x1000, CRC(217ec4ff) SHA1(334604c3a051d57440a9d0bfc34b809418ef1d2d) ) ROM_LOAD( "cc10", 0x1000, 0x1000, CRC(b3c26cef) SHA1(f52cb5482c12a9c5fb56e2e2aec7cab0ed23e5a5) ) ROM_LOAD( "cc09", 0x2000, 0x1000, CRC(6db0879c) SHA1(c0ba1976c1dcd6edadd78073173a26851ae8dd4f) ) @@ -1154,7 +1181,7 @@ ROM_START( cclimber ) ROM_END ROM_START( cclimberj ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "cc11j.bin", 0x0000, 0x1000, CRC(89783959) SHA1(948fa88fcb9e3797b9c10934d36cf6a55cb590fe) ) ROM_LOAD( "cc10j.bin", 0x1000, 0x1000, CRC(14eda506) SHA1(4bc55b4c4ec197952b05ad32584f15f0383cc2df) ) ROM_LOAD( "cc09j.bin", 0x2000, 0x1000, CRC(26489069) SHA1(9be4d4a22dd334e619416e6c846a05003c0d687e) ) @@ -1186,7 +1213,7 @@ ROM_START( cclimberj ) ROM_END ROM_START( ccboot ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "m11.bin", 0x0000, 0x1000, CRC(5efbe180) SHA1(e0c24f21d563da075eb5019d0e76cb01c2598c7a) ) ROM_LOAD( "m10.bin", 0x1000, 0x1000, CRC(be2748c7) SHA1(ae66bc4e5e02bf9944a3ee4b0d2dec073f732260) ) ROM_LOAD( "cc09j.bin", 0x2000, 0x1000, CRC(26489069) SHA1(9be4d4a22dd334e619416e6c846a05003c0d687e) ) @@ -1219,7 +1246,7 @@ ROM_START( ccboot ) ROM_END ROM_START( ccboot2 ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "11.4k", 0x0000, 0x1000, CRC(b2b17e24) SHA1(1242d64242b3a6fe099457d155ebc508e5482818) ) ROM_LOAD( "10.4j", 0x1000, 0x1000, CRC(8382bc0f) SHA1(2390ee2ec08a074c7bc4b9c7750b979a1d3a8a67) ) ROM_LOAD( "cc09j.bin", 0x2000, 0x1000, CRC(26489069) SHA1(9be4d4a22dd334e619416e6c846a05003c0d687e) ) @@ -1252,7 +1279,7 @@ ROM_START( ccboot2 ) ROM_END ROM_START( ccbootmr ) /* Model Racing bootleg */ - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "211.k4", 0x0000, 0x1000, CRC(b2b17e24) SHA1(1242d64242b3a6fe099457d155ebc508e5482818) ) ROM_LOAD( "210.j4", 0x1000, 0x1000, CRC(8382bc0f) SHA1(2390ee2ec08a074c7bc4b9c7750b979a1d3a8a67) ) ROM_LOAD( "209.f4", 0x2000, 0x1000, CRC(26489069) SHA1(9be4d4a22dd334e619416e6c846a05003c0d687e) ) @@ -1286,7 +1313,7 @@ ROM_END ROM_START( cclimbroper ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "cc5-2532.cpu", 0x0000, 0x1000, CRC(f94b96e8) SHA1(b13dceb0a73d1a4eeb9c3e2d2307f0c82c365393)) ROM_LOAD( "cc4-2532.cpu", 0x1000, 0x1000, CRC(4b1abea6) SHA1(eae7c96fc0b64d313bed4a75bd6d397b37eaac7e) ) ROM_LOAD( "cc3-2532.cpu", 0x2000, 0x1000, CRC(5612bb3c) SHA1(213846bb3393467260f401b00b821cbab7ac9636) ) @@ -1323,7 +1350,7 @@ ROM_END /* Sets below are Crazy Kong Part II and have an extra screen in attract mode, showing a caged Kong and copyright */ ROM_START( ckongpt2 ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "7.5d", 0x0000, 0x1000, CRC(b27df032) SHA1(57f9be139c610405e3c2fddd7093dfb1277e450e) ) ROM_LOAD( "8.5e", 0x1000, 0x1000, CRC(5dc1aaba) SHA1(42b9e5946ffce7c156d114bde68f37c2c34853c4) ) ROM_LOAD( "9.5h", 0x2000, 0x1000, CRC(c9054c94) SHA1(1aa08d2501ee620759fd5c111e12f6d432c25294) ) @@ -1352,7 +1379,7 @@ ROM_START( ckongpt2 ) ROM_END ROM_START( ckongpt2a ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "7.5d", 0x0000, 0x1000, CRC(b27df032) SHA1(57f9be139c610405e3c2fddd7093dfb1277e450e) ) ROM_LOAD( "8.5e", 0x1000, 0x1000, CRC(5dc1aaba) SHA1(42b9e5946ffce7c156d114bde68f37c2c34853c4) ) ROM_LOAD( "9.5h", 0x2000, 0x1000, CRC(c9054c94) SHA1(1aa08d2501ee620759fd5c111e12f6d432c25294) ) @@ -1381,7 +1408,7 @@ ROM_START( ckongpt2a ) ROM_END ROM_START( ckongpt2j ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "7.5d", 0x0000, 0x1000, CRC(b27df032) SHA1(57f9be139c610405e3c2fddd7093dfb1277e450e) ) ROM_LOAD( "8.5e", 0x1000, 0x1000, CRC(5dc1aaba) SHA1(42b9e5946ffce7c156d114bde68f37c2c34853c4) ) ROM_LOAD( "9.5h", 0x2000, 0x1000, CRC(c9054c94) SHA1(1aa08d2501ee620759fd5c111e12f6d432c25294) ) @@ -1410,7 +1437,7 @@ ROM_START( ckongpt2j ) ROM_END ROM_START( ckongpt2jeu ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "7.5d", 0x0000, 0x1000, CRC(b27df032) SHA1(57f9be139c610405e3c2fddd7093dfb1277e450e) ) ROM_LOAD( "8.5e", 0x1000, 0x1000, CRC(5dc1aaba) SHA1(42b9e5946ffce7c156d114bde68f37c2c34853c4) ) ROM_LOAD( "9.5h", 0x2000, 0x1000, CRC(c9054c94) SHA1(1aa08d2501ee620759fd5c111e12f6d432c25294) ) @@ -1440,7 +1467,7 @@ ROM_END ROM_START( ckongpt2b ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "d05-7.rom", 0x0000, 0x1000, CRC(5d96ee9a) SHA1(f531d251fd3469edd3b5b5e7c26ff9cef7006ce8) ) ROM_LOAD( "f05-8.rom", 0x1000, 0x1000, CRC(74a8435b) SHA1(465ad96009d3ba939eee13ba0d5fd6d9dec118bc) ) ROM_LOAD( "h05-9.rom", 0x2000, 0x1000, CRC(e06ca575) SHA1(cd5a32fac614902e136e522ac188616c72d65571) ) @@ -1473,7 +1500,7 @@ ROM_END /* Sets below are 'Crazy Kong' without the extra Falcon screen or Pt. 2 subtitle, they also have worse colours */ ROM_START( ckong ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "falcon7", 0x0000, 0x1000, CRC(2171cac3) SHA1(7b18bfe44c32fb64b675bbbe2136344522c79b09) ) ROM_LOAD( "falcon8", 0x1000, 0x1000, CRC(88b83ff7) SHA1(4afc494cc264aaa4614da6aed02ce062d9c20850) ) ROM_LOAD( "falcon9", 0x2000, 0x1000, CRC(cff2af47) SHA1(1757428cefad13855a623162101ec01c04006c94) ) @@ -1503,7 +1530,7 @@ ROM_END ROM_START( ckongo ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "o55a-1", 0x0000, 0x1000, CRC(8bfb4623) SHA1(1b8e12d1f337756bbfa9c3d736db7513d571c1b3) ) ROM_LOAD( "o55a-2", 0x1000, 0x1000, CRC(9ae8089b) SHA1(e50864bb77dce24ba6d10c4fc16ccaa593962442) ) ROM_LOAD( "o55a-3", 0x2000, 0x1000, CRC(e82b33c8) SHA1(27befba696cd1a9453fb49e8e4ddd46eab41b30d) ) @@ -1537,7 +1564,7 @@ ROM_START( ckongo ) ROM_END ROM_START( ckongalc ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "ck7.bin", 0x0000, 0x1000, CRC(2171cac3) SHA1(7b18bfe44c32fb64b675bbbe2136344522c79b09) ) ROM_LOAD( "ck8.bin", 0x1000, 0x1000, CRC(88b83ff7) SHA1(4afc494cc264aaa4614da6aed02ce062d9c20850) ) ROM_LOAD( "ck9.bin", 0x2000, 0x1000, CRC(cff2af47) SHA1(1757428cefad13855a623162101ec01c04006c94) ) @@ -1566,7 +1593,7 @@ ROM_START( ckongalc ) ROM_END ROM_START( bigkong ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "dk01f7_2532.d5", 0x0000, 0x1000, CRC(4c9102f1) SHA1(845b48fa1e6ad82dc797520f7ff7daffc1a47c39) ) ROM_LOAD( "dk02f8_2532.f5", 0x1000, 0x1000, CRC(1683e9ae) SHA1(4690c8be70c0cc0e7d78d2ff205eed3f4ead7278) ) ROM_LOAD( "dk03f9_2532.h5", 0x2000, 0x1000, CRC(073eea32) SHA1(de7889df04f8a279a0864748298e5ccdce0578f1) ) @@ -1595,7 +1622,7 @@ ROM_START( bigkong ) ROM_END ROM_START( monkeyd ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "ck7.bin", 0x0000, 0x1000, CRC(2171cac3) SHA1(7b18bfe44c32fb64b675bbbe2136344522c79b09) ) ROM_LOAD( "ck8.bin", 0x1000, 0x1000, CRC(88b83ff7) SHA1(4afc494cc264aaa4614da6aed02ce062d9c20850) ) ROM_LOAD( "ck9.bin", 0x2000, 0x1000, CRC(cff2af47) SHA1(1757428cefad13855a623162101ec01c04006c94) ) @@ -1766,7 +1793,7 @@ Dip Switch - Donkey King ROM_START( dking ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "d11.r2", 0x0800, 0x0800, CRC(f7cace41) SHA1(981dbb1cddd66a0cbc8fe147172ffe7eb5b7fa21) ) ROM_CONTINUE( 0x0000, 0x800 ) ROM_LOAD( "d7.1n", 0x1000, 0x1000, CRC(fe89dea4) SHA1(c39372ebe9950808ebc1ff7909c291496b206026) ) @@ -1798,7 +1825,7 @@ ROM_END ROM_START( ckongdks ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "ck13.bin", 0x0800, 0x0800, CRC(f97ba8ae) SHA1(ae4a578ad77a8d3252f2f99a1afa6f38bc00471e) ) // 97.509766% ROM_CONTINUE( 0x0000, 0x0800 ) ROM_LOAD( "ck09.bin", 0x1000, 0x1000, CRC(fe89dea4) SHA1(c39372ebe9950808ebc1ff7909c291496b206026) ) @@ -1835,7 +1862,7 @@ ROM_END of Silver Land so I'm loading the River Patrol GFX instead as they fit better */ ROM_START( rpatrol ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "sci1.bin", 0x0000, 0x1000, CRC(33b01c90) SHA1(9c8da6dd963bfb0544ef99b8fdedcf86c32cdb6b) ) ROM_LOAD( "sci2.bin", 0x1000, 0x1000, CRC(03f53340) SHA1(35336945f4b634fc4c7791ac9c9e6643c8cd8006) ) ROM_LOAD( "sci3.bin", 0x2000, 0x1000, CRC(8fa300df) SHA1(5c3ba1ef6c1ce8df437b4fa464293208630b5e8d) ) @@ -1886,7 +1913,7 @@ ROM_START( rpatrol ) ROM_END ROM_START( rpatrolb ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "rp1.4l", 0x0000, 0x1000, CRC(bfd7ae7a) SHA1(a06d1cc2674ed40d0bfa67dd6d724964c1e40600) ) ROM_LOAD( "rp2.4j", 0x1000, 0x1000, CRC(03f53340) SHA1(35336945f4b634fc4c7791ac9c9e6643c8cd8006) ) ROM_LOAD( "rp3.4f", 0x2000, 0x1000, CRC(8fa300df) SHA1(5c3ba1ef6c1ce8df437b4fa464293208630b5e8d) ) @@ -1917,7 +1944,7 @@ ROM_START( rpatrolb ) ROM_END ROM_START( silvland ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "7.2r", 0x0000, 0x1000, CRC(57e6be62) SHA1(c1d47970f8209256c9ccd6512b921dec6c276998) ) ROM_LOAD( "8.1n", 0x1000, 0x1000, CRC(bbb2b287) SHA1(93cd4ebe238c189c80be8b8ab1ec2649256dd6ea) ) ROM_LOAD( "rp3.4f", 0x2000, 0x1000, CRC(8fa300df) SHA1(5c3ba1ef6c1ce8df437b4fa464293208630b5e8d) ) @@ -1990,7 +2017,7 @@ ROM_START( cannonb ) ROM_END ROM_START( cannonb2 ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "cb1.bin", 0x0000, 0x1000, CRC(7a3cba7c) SHA1(08b8b356fdbe642e80d42b5ab4164a1bd6ad93ba) ) ROM_LOAD( "cb2.bin", 0x1000, 0x1000, CRC(58ef3118) SHA1(51ae36c21147e99d4060034520f6eebf3210937c) ) ROM_LOAD( "cb3.bin", 0x2000, 0x1000, CRC(e18a836b) SHA1(19b90a55db82914c5db18486e05d9f59aba1b442) ) @@ -2021,7 +2048,7 @@ ROM_START( cannonb2 ) ROM_END ROM_START( cannonb3 ) - ROM_REGION( 0x11000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "1 pos e5 2532.bin", 0x0000, 0x1000, CRC(4b482e80) SHA1(4c0e52016ed760d399e8d49f600d38c1b6ccf256) ) ROM_LOAD( "2 pos f5 2532.bin", 0x1000, 0x1000, CRC(1fa050af) SHA1(00244e19aee14ce980697136cddb6cb72a4d80da) ) ROM_LOAD( "3 pos h5 2532.bin", 0x2000, 0x1000, CRC(e18a836b) SHA1(19b90a55db82914c5db18486e05d9f59aba1b442) ) @@ -2063,7 +2090,7 @@ ROM_END */ ROM_START( bagmanf ) - ROM_REGION( 0x11000, "maincpu", 0 ) + ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "01.d5.bin", 0x0000, 0x1000, CRC(e0156191) SHA1(bb5f16d49fbe48f3bac118acd1fea51ec4bc5355) ) ROM_LOAD( "02.f5.bin", 0x1000, 0x1000, CRC(7b758982) SHA1(c8460023b43fed4aca9c6b987faea334832c5e30) ) ROM_LOAD( "03.h5.bin", 0x2000, 0x1000, CRC(302a077b) SHA1(916c4a6ea1e631cc72bdb91ff9d263dcbaf08bb2) ) @@ -2104,7 +2131,7 @@ ROM_END ROM_START( swimmer ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "sw1", 0x0000, 0x1000, CRC(f12481e7) SHA1(4e8ee509043fd57ec1579594f0b2c543f270bead) ) ROM_LOAD( "sw2", 0x1000, 0x1000, CRC(a0b6fdd2) SHA1(7d3603de6c282224869824c7572868fc85599ea2) ) ROM_LOAD( "sw3", 0x2000, 0x1000, CRC(ec93d7de) SHA1(e225c6b98eb3c32825c1cc1fcf69dec7e340460c) ) @@ -2114,7 +2141,7 @@ ROM_START( swimmer ) ROM_LOAD( "sw7", 0x6000, 0x1000, CRC(37efb64e) SHA1(0ed4d678895c17b37df605990acd096c538e3675) ) ROM_LOAD( "sw8", 0x7000, 0x1000, CRC(33d6001e) SHA1(749b746d018e74e364fd6974e4522c8a18915774) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x1000, "audiocpu", 0 ) ROM_LOAD( "sw12.4k", 0x0000, 0x1000, CRC(2eee9bcb) SHA1(ceafdf750a8af0c1c9abbbf437c3e9d9ae09f72b) ) ROM_REGION( 0x3000, "gfx1", 0 ) @@ -2137,7 +2164,7 @@ ROM_START( swimmer ) ROM_END ROM_START( swimmera ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "swa1", 0x0000, 0x1000, CRC(42c2b6c5) SHA1(13688e1ee08308b13ead5af7b4f65043dae4e40f) ) ROM_LOAD( "swa2", 0x1000, 0x1000, CRC(49bac195) SHA1(a5d2cc2cdd10003f69014c4799f5f59e47a44260) ) ROM_LOAD( "swa3", 0x2000, 0x1000, CRC(a6d8cb01) SHA1(80ab0ffaee6e0edf19b767229865722c2af6112c) ) @@ -2147,7 +2174,7 @@ ROM_START( swimmera ) ROM_LOAD( "swa7", 0x6000, 0x1000, CRC(7090e5ee) SHA1(d1e0ca38c3d1e4a7b7efa3696e47fb36ad3f8aa0) ) ROM_LOAD( "swa8", 0x7000, 0x1000, CRC(ab86efa9) SHA1(5b5a80ae285c7e9f4c51e646116edf789d4dba39) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x1000, "audiocpu", 0 ) ROM_LOAD( "sw12.4k", 0x0000, 0x1000, CRC(2eee9bcb) SHA1(ceafdf750a8af0c1c9abbbf437c3e9d9ae09f72b) ) ROM_REGION( 0x3000, "gfx1", 0 ) @@ -2170,7 +2197,7 @@ ROM_START( swimmera ) ROM_END ROM_START( swimmerb ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "sw1.9l", 0x0000, 0x1000, CRC(b045be08) SHA1(52187e1daebec521a98157f22960637393e40e62) ) ROM_LOAD( "sw2.9k", 0x1000, 0x1000, CRC(163d65e5) SHA1(b505f05af96f241285f0f7082ed03fa07bbde7de) ) ROM_LOAD( "sw3.9j", 0x2000, 0x1000, CRC(631d74e9) SHA1(b6adba9445264de80f5daf33dad1c90b23617648) ) @@ -2180,7 +2207,7 @@ ROM_START( swimmerb ) ROM_LOAD( "sw7.9c", 0x6000, 0x1000, CRC(88266f2e) SHA1(4ad15f9ba7b45a6c1c3637f8d0fd8be9c04b495f) ) ROM_LOAD( "sw8.9a", 0x7000, 0x1000, CRC(191a16e4) SHA1(75d3f49e2f4ea04d3a7cc88662c023768bf48365) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x1000, "audiocpu", 0 ) ROM_LOAD( "sw12.4k", 0x0000, 0x1000, CRC(2eee9bcb) SHA1(ceafdf750a8af0c1c9abbbf437c3e9d9ae09f72b) ) ROM_REGION( 0x3000, "gfx1", 0 ) @@ -2210,7 +2237,7 @@ ROM_START( guzzler ) ROM_LOAD( "guzz-04.bin", 0x6000, 0x2000, CRC(45be42f5) SHA1(578943afdb6ceca34ca7c19c2fd1164ca3aa57bd) ) ROM_LOAD( "guzz-16.bin", 0xe000, 0x2000, CRC(61ee00b7) SHA1(ea8516c8dfb2de32a8034f94c7d0c086e3596740) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x1000, "audiocpu", 0 ) ROM_LOAD( "guzz-12.bin", 0x0000, 0x1000, CRC(f3754d9e) SHA1(bb30832aba4e82ab0ecce40fc1223d9771ff7dd2) ) ROM_REGION( 0x3000, "gfx1", 0 ) @@ -2241,7 +2268,7 @@ ROM_START( guzzlers ) /* Swimmer Conversion, 1k vs 2k romsize in maincpu */ ROM_LOAD( "guzz8.a9", 0x7000, 0x1000, CRC(8d44f5f8) SHA1(957f1b880f6f815ac31c1a37c40cdff75dd119cf) ) ROM_LOAD( "guzz-16.bin", 0xe000, 0x2000, CRC(61ee00b7) SHA1(ea8516c8dfb2de32a8034f94c7d0c086e3596740) ) // 16. - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x1000, "audiocpu", 0 ) ROM_LOAD( "guzz-12.bin", 0x0000, 0x1000, CRC(f3754d9e) SHA1(bb30832aba4e82ab0ecce40fc1223d9771ff7dd2) ) // GUZZ12.L4 ROM_REGION( 0x3000, "gfx1", 0 ) /* chars */ @@ -2261,14 +2288,14 @@ ROM_START( guzzlers ) /* Swimmer Conversion, 1k vs 2k romsize in maincpu */ ROM_END ROM_START( yamato ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "2.5de", 0x0000, 0x2000, CRC(20895096) SHA1(af76786e3c519e710899f143d46c53087e9817c7) ) ROM_LOAD( "3.5f", 0x2000, 0x2000, CRC(57a696f9) SHA1(28ea80fb100ac92295fc3eb318617d7cb014408d) ) ROM_LOAD( "4.5jh", 0x4000, 0x2000, CRC(59a468e8) SHA1(a79cdee6efefd87a356cc8d710f8050bc12e07c3) ) /* hole at 6000-6fff */ ROM_LOAD( "11.5a", 0x7000, 0x1000, CRC(35987485) SHA1(1f0cb545bbd52982cbf801bc1dd2c4087af2f5f7) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x800, "audiocpu", 0 ) ROM_LOAD( "1.5v", 0x0000, 0x0800, CRC(3aad9e3c) SHA1(37b0414b265397881bb45b166ecab85880d1358d) ) ROM_REGION( 0x4000, "gfx1", 0 ) @@ -2292,14 +2319,14 @@ ROM_START( yamato ) ROM_END ROM_START( yamato2 ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "2-2.5de", 0x0000, 0x2000, CRC(93da1d52) SHA1(21b72856ebbd969e4e075b52719e6acdbd1bc4c5) ) ROM_LOAD( "3-2.5f", 0x2000, 0x2000, CRC(31e73821) SHA1(e582c9fcea1b29d43f65b6aa67e1895c38d2736c) ) ROM_LOAD( "4-2.5jh", 0x4000, 0x2000, CRC(fd7bcfc3) SHA1(5037170cb3a9824794e90d74def92b0b25d45caa) ) /* hole at 6000-6fff */ /* 7000-7fff not present here */ - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x8000, "audiocpu", 0 ) ROM_LOAD( "1.5v", 0x0000, 0x0800, CRC(3aad9e3c) SHA1(37b0414b265397881bb45b166ecab85880d1358d) ) ROM_REGION( 0x4000, "gfx1", 0 ) @@ -2323,7 +2350,7 @@ ROM_START( yamato2 ) ROM_END ROM_START( toprollr ) - ROM_REGION( 0x10000*2, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "10.k3", 0xc000, 0x2000, CRC(1e8914a6) SHA1(ec17f185f890d04ce75a5d8edf8b32da60e7a8d8) ) ROM_LOAD( "11.l3", 0xe000, 0x2000, CRC(b20a9fa2) SHA1(accd3296447eca002b0808e7b02832f5e35407e8) ) @@ -2366,7 +2393,29 @@ ROM_END DRIVER_INIT_MEMBER(cclimber_state,yamato) { - yamato_decode(machine(),"maincpu"); + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...0 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x20,0xa0,0x28,0xa8 }, /* ...0...0...1...1 */ + { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x08,0x28 }, /* ...0...1...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...0...1 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x20,0xa0,0x28,0xa8 }, /* ...0...1...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...1...1 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...0...0...0 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...0...1 */ + { 0xa0,0x20,0x80,0x00 }, { 0x20,0xa0,0x28,0xa8 }, /* ...1...0...1...0 */ + { 0x28,0x20,0xa8,0xa0 }, { 0x20,0xa0,0x28,0xa8 }, /* ...1...0...1...1 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...1...0...0 */ + { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...1...0...1 */ + { 0xa0,0x20,0x80,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...1...1...1...0 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x00,0x08,0x20,0x28 } /* ...1...1...1...1 */ + }; + + sega_decode(memregion("maincpu")->base(), m_decrypted_opcodes, 0x6000, convtable); save_item(NAME(m_yamato_p0)); save_item(NAME(m_yamato_p1)); @@ -2375,7 +2424,36 @@ DRIVER_INIT_MEMBER(cclimber_state,yamato) DRIVER_INIT_MEMBER(cclimber_state,toprollr) { - toprollr_decode(machine(), "maincpu", "user1"); + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...0 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x20,0xa0,0x28,0xa8 }, /* ...0...0...1...1 */ + { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x08,0x28 }, /* ...0...1...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...0...1 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x20,0xa0,0x28,0xa8 }, /* ...0...1...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...1...1 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...0...0...0 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...0...1 */ + { 0xa0,0x20,0x80,0x00 }, { 0x20,0xa0,0x28,0xa8 }, /* ...1...0...1...0 */ + { 0x28,0x20,0xa8,0xa0 }, { 0x20,0xa0,0x28,0xa8 }, /* ...1...0...1...1 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...1...0...0 */ + { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...1...0...1 */ + { 0xa0,0x20,0x80,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...1...1...1...0 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x00,0x08,0x20,0x28 } /* ...1...1...1...1 */ + }; + + UINT8 *opcodes = auto_alloc_array(machine(), UINT8, 0x6000*3); + sega_decode(memregion("user1")->base(), opcodes, 0, convtable, 3, 0x6000); + + membank("bank1")->configure_entries(0, 3, memregion("user1")->base(), 0x6000); + membank("bank1d")->configure_entries(0, 3, opcodes, 0x6000); + + membank("bank1")->set_entry(0); + membank("bank1d")->set_entry(0); save_item(NAME(m_toprollr_rombank)); } @@ -2395,12 +2473,12 @@ DRIVER_INIT_MEMBER(cclimber_state,dking) } -GAME( 1980, cclimber, 0, cclimber, cclimber, cclimber_state, cclimber, ROT0, "Nichibutsu", "Crazy Climber (US)", GAME_SUPPORTS_SAVE ) -GAME( 1980, cclimberj, cclimber, cclimber, cclimberj, cclimber_state,cclimberj,ROT0, "Nichibutsu", "Crazy Climber (Japan)", GAME_SUPPORTS_SAVE ) -GAME( 1980, ccboot, cclimber, cclimber, cclimber, cclimber_state, cclimberj,ROT0, "bootleg", "Crazy Climber (bootleg set 1)", GAME_SUPPORTS_SAVE ) -GAME( 1980, ccboot2, cclimber, cclimber, cclimber, cclimber_state, cclimberj,ROT0, "bootleg", "Crazy Climber (bootleg set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1980, ccbootmr, cclimber, cclimber, cclimber, cclimber_state, cclimberj,ROT0, "bootleg (Model Racing)", "Crazy Climber (Model Racing bootleg)", GAME_SUPPORTS_SAVE ) -GAME( 1980, cclimbroper, cclimber, cclimber, cclimber, driver_device, 0, ROT0, "bootleg (Operamatic)", "Crazy Climber (Spanish, Operamatic bootleg)", GAME_SUPPORTS_SAVE ) +GAME( 1980, cclimber, 0, cclimberx, cclimber, cclimber_state, cclimber, ROT0, "Nichibutsu", "Crazy Climber (US)", GAME_SUPPORTS_SAVE ) +GAME( 1980, cclimberj, cclimber, cclimberx, cclimberj, cclimber_state,cclimberj,ROT0, "Nichibutsu", "Crazy Climber (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1980, ccboot, cclimber, cclimberx, cclimber, cclimber_state, cclimberj,ROT0, "bootleg", "Crazy Climber (bootleg set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1980, ccboot2, cclimber, cclimberx, cclimber, cclimber_state, cclimberj,ROT0, "bootleg", "Crazy Climber (bootleg set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1980, ccbootmr, cclimber, cclimberx, cclimber, cclimber_state, cclimberj,ROT0, "bootleg (Model Racing)", "Crazy Climber (Model Racing bootleg)", GAME_SUPPORTS_SAVE ) +GAME( 1980, cclimbroper, cclimber, cclimber, cclimber, driver_device, 0, ROT0, "bootleg (Operamatic)", "Crazy Climber (Spanish, Operamatic bootleg)", GAME_SUPPORTS_SAVE ) /* these sets have ugly colours, no extra attract screen, and no graphics for the extra attract screen in the BG roms - there is a Falcon logo in the text roms which is unused @@ -2441,8 +2519,8 @@ GAME( 1982, swimmer, 0, swimmer, swimmer, driver_device, 0, GAME( 1982, swimmera, swimmer, swimmer, swimmer, driver_device, 0, ROT0, "Tehkan", "Swimmer (set 2)", GAME_SUPPORTS_SAVE ) GAME( 1982, swimmerb, swimmer, swimmer, swimmerb, driver_device, 0, ROT0, "Tehkan", "Swimmer (set 3)", GAME_SUPPORTS_SAVE ) -GAME( 1983, guzzler, 0, swimmer, guzzler, driver_device, 0, ROT90, "Tehkan", "Guzzler", GAME_SUPPORTS_SAVE ) -GAME( 1983, guzzlers, guzzler, swimmer, guzzler, driver_device, 0, ROT90, "Tehkan", "Guzzler (Swimmer Conversion)", GAME_SUPPORTS_SAVE ) +GAME( 1983, guzzler, 0, guzzler, guzzler, driver_device, 0, ROT90, "Tehkan", "Guzzler", GAME_SUPPORTS_SAVE ) +GAME( 1983, guzzlers, guzzler, guzzler, guzzler, driver_device, 0, ROT90, "Tehkan", "Guzzler (Swimmer Conversion)", GAME_SUPPORTS_SAVE ) GAME( 1983, yamato, 0, yamato, yamato, cclimber_state, yamato, ROT90, "Sega", "Yamato (US)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) GAME( 1983, yamato2, yamato, yamato, yamato, cclimber_state, yamato, ROT90, "Sega", "Yamato (World?)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/chinsan.c b/src/mame/drivers/chinsan.c index 33031e08dac..fca2227d2be 100644 --- a/src/mame/drivers/chinsan.c +++ b/src/mame/drivers/chinsan.c @@ -87,6 +87,7 @@ public: required_device<msm5205_device> m_adpcm; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; + UINT8 *m_decrypted_opcodes; }; @@ -139,6 +140,7 @@ UINT32 chinsan_state::screen_update_chinsan(screen_device &screen, bitmap_ind16 WRITE8_MEMBER(chinsan_state::ctrl_w) { membank("bank1")->set_entry(data >> 6); + membank("bank1d")->set_entry(data >> 6); } WRITE8_MEMBER(chinsan_state::ym_port_w1) @@ -248,6 +250,11 @@ static ADDRESS_MAP_START( chinsan_map, AS_PROGRAM, 8, chinsan_state ) AM_RANGE(0xe000, 0xf7ff) AM_RAM AM_SHARE("video") ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, chinsan_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROMBANK("bank0d") + AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1d") +ADDRESS_MAP_END + static ADDRESS_MAP_START( chinsan_io, AS_IO, 8, chinsan_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_WRITE(chinsan_port00_w) @@ -564,7 +571,9 @@ WRITE_LINE_MEMBER(chinsan_state::chin_adpcm_int) void chinsan_state::machine_start() { - membank("bank1")->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x4000); + membank("bank1")->configure_entries(0, 4, memregion("maincpu")->base() + 0x8000, 0x4000); + membank("bank0d")->set_base(m_decrypted_opcodes); + membank("bank1d")->configure_entries(0, 4, m_decrypted_opcodes + 0x8000, 0x4000); save_item(NAME(m_adpcm_idle)); save_item(NAME(m_port_select)); @@ -589,6 +598,7 @@ static MACHINE_CONFIG_START( chinsan, chinsan_state ) MCFG_CPU_ADD("maincpu", Z80,10000000/2) /* ? MHz */ MCFG_CPU_PROGRAM_MAP(chinsan_map) MCFG_CPU_IO_MAP(chinsan_io) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", chinsan_state, irq0_line_hold) @@ -633,10 +643,10 @@ MACHINE_CONFIG_END *************************************/ ROM_START( chinsan ) - ROM_REGION( 0x20000, "maincpu", 0 ) /* encrypted code / data */ + ROM_REGION( 0x18000, "maincpu", 0 ) /* encrypted code / data */ ROM_LOAD( "mm00.7d", 0x00000, 0x08000, CRC(f7a4414f) SHA1(f65223b2928f610ab97fda2f2c008806cf2420e5) ) ROM_CONTINUE( 0x00000, 0x08000 ) // first half is blank - ROM_LOAD( "mm01.8d", 0x10000, 0x10000, CRC(c69ddbf5) SHA1(9533365c1761b113174d53a2e23ce6a7baca7dfe) ) + ROM_LOAD( "mm01.8d", 0x08000, 0x10000, CRC(c69ddbf5) SHA1(9533365c1761b113174d53a2e23ce6a7baca7dfe) ) ROM_REGION( 0x2000, "user1", 0 ) /* MC8123 key */ ROM_LOAD( "317-5012.key", 0x0000, 0x2000, CRC(2ecfb132) SHA1(3110ef82080dd7d908cc6bf34c6643f187f90b29) ) @@ -667,7 +677,8 @@ ROM_END DRIVER_INIT_MEMBER(chinsan_state,chinsan) { - mc8123_decrypt_rom(machine(), "maincpu", "user1", "bank1", 4); + m_decrypted_opcodes = auto_alloc_array(machine(), UINT8, 0x18000); + mc8123_decode(memregion("maincpu")->base(), m_decrypted_opcodes, memregion("user1")->base(), 0x18000); } diff --git a/src/mame/drivers/circusc.c b/src/mame/drivers/circusc.c index 238fd9b002c..1bd909c2d09 100644 --- a/src/mame/drivers/circusc.c +++ b/src/mame/drivers/circusc.c @@ -334,7 +334,7 @@ INTERRUPT_GEN_MEMBER(circusc_state::vblank_irq) static MACHINE_CONFIG_START( circusc, circusc_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6809, 2048000) /* 2 MHz? */ + MCFG_CPU_ADD("maincpu", KONAMI1, 2048000) /* 2 MHz? */ MCFG_CPU_PROGRAM_MAP(circusc_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", circusc_state, vblank_irq) MCFG_WATCHDOG_VBLANK_INIT(8) @@ -567,7 +567,6 @@ ROM_END DRIVER_INIT_MEMBER(circusc_state,circusc) { - konami1_decode(machine(), "maincpu"); } diff --git a/src/mame/drivers/commando.c b/src/mame/drivers/commando.c index 42507a52015..012e6ac0171 100644 --- a/src/mame/drivers/commando.c +++ b/src/mame/drivers/commando.c @@ -72,6 +72,10 @@ static ADDRESS_MAP_START( commando_map, AS_PROGRAM, 8, commando_state ) AM_RANGE(0xff80, 0xffff) AM_RAM ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, commando_state ) + AM_RANGE(0x0000, 0xbfff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, commando_state ) AM_RANGE(0x0000, 0x3fff) AM_ROM AM_RANGE(0x4000, 0x47ff) AM_RAM @@ -245,6 +249,7 @@ static MACHINE_CONFIG_START( commando, commando_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, PHI_MAIN) // ??? MCFG_CPU_PROGRAM_MAP(commando_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", commando_state, commando_interrupt) MCFG_CPU_ADD("audiocpu", Z80, PHI_B) // 3 MHz @@ -281,7 +286,7 @@ MACHINE_CONFIG_END /* ROMs */ ROM_START( commando ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "cm04.9m", 0x0000, 0x8000, CRC(8438b694) SHA1(e154478d8f1b635355bd777370acabe49cb9d309) ) ROM_LOAD( "cm03.8m", 0x8000, 0x4000, CRC(35486542) SHA1(531a85c9e03970ce037be84f2240c2df6f6e3ec1) ) @@ -317,7 +322,7 @@ ROM_START( commando ) ROM_END ROM_START( commandou ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "u4-f.9m", 0x0000, 0x8000, CRC(a6118935) SHA1(d5811968b23d61e344e151747bcc3c0ed2b9497b) ) ROM_LOAD( "u3-f.8m", 0x8000, 0x4000, CRC(24f49684) SHA1(d38a7bd9f3b506747a03f6b94c3f8a2d9fc59166) ) @@ -353,7 +358,7 @@ ROM_START( commandou ) ROM_END ROM_START( commandoj ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "so04.9m", 0x0000, 0x8000, CRC(d3f2bfb3) SHA1(738a5673ac6a907cb04cfb125e8aab3f7437b9d2) ) ROM_LOAD( "so03.8m", 0x8000, 0x4000, CRC(ed01f472) SHA1(fa181293ae8f0fee78d412259eb81f6de1e1307a) ) @@ -389,7 +394,7 @@ ROM_START( commandoj ) ROM_END ROM_START( commandob ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "commandob_04_9m_27256.bin", 0x0000, 0x8000, CRC(348a7654) SHA1(f3668c47c154a9c7d7afeabb0259c9bc56e847ac) ) ROM_LOAD( "cm03.8m", 0x8000, 0x4000, CRC(35486542) SHA1(531a85c9e03970ce037be84f2240c2df6f6e3ec1) ) @@ -433,7 +438,7 @@ ROM_START( commandob ) ROM_END ROM_START( commandob2 ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "10", 0x0000, 0x8000, CRC(ab5d1469) SHA1(05935155365bef3c40823101303a3857af1c71e6) ) ROM_LOAD( "11", 0x8000, 0x4000, CRC(d1a43ba1) SHA1(dbaedcd3a1b489a01b7f783fda6fcad203758717) ) @@ -507,7 +512,7 @@ ROM_START( commandob2 ) ROM_END ROM_START( commandou2 ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "uc4.9m", 0x0000, 0x8000, CRC(89ee8e17) SHA1(68db271af8b0f400ca95df5672983bfb87f3f84a) ) ROM_LOAD( "uc3.8m", 0x8000, 0x4000, CRC(72a1a529) SHA1(fe7797206e38bd78e817b6c351d5cb943720fe6c) ) @@ -543,7 +548,7 @@ ROM_START( commandou2 ) ROM_END ROM_START( sinvasn ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "sp04.9m", 0x0000, 0x8000, CRC(33f9601e) SHA1(71182227b77fccbbc1d89b5828aa86dcc64ca05e) ) ROM_LOAD( "sp03.8m", 0x8000, 0x4000, CRC(c7fb43b3) SHA1(36d0dffdacc36a6b6a77101d942c0821846f3275) ) @@ -579,7 +584,7 @@ ROM_START( sinvasn ) ROM_END ROM_START( sinvasnb ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "u4", 0x0000, 0x8000, CRC(834ba0de) SHA1(85f40559e6a436f3f752b6e862a419a5b9481fa8) ) ROM_LOAD( "u3", 0x8000, 0x4000, CRC(07e4ee3a) SHA1(6d7665b3072f075893ef37e55147b10271d069ef) ) @@ -618,40 +623,26 @@ ROM_END DRIVER_INIT_MEMBER(commando_state,commando) { - address_space &space = m_maincpu->space(AS_PROGRAM); UINT8 *rom = memregion("maincpu")->base(); - UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0xc000); - int A; - - space.set_decrypted_region(0x0000, 0xbfff, decrypt); // the first opcode is *not* encrypted - decrypt[0] = rom[0]; - for (A = 1; A < 0xc000; A++) + m_decrypted_opcodes[0] = rom[0]; + for (int A = 1; A < 0xc000; A++) { - int src; - - src = rom[A]; - decrypt[A] = (src & 0x11) | ((src & 0xe0) >> 4) | ((src & 0x0e) << 4); + UINT8 src = rom[A]; + m_decrypted_opcodes[A] = (src & 0x11) | ((src & 0xe0) >> 4) | ((src & 0x0e) << 4); } } DRIVER_INIT_MEMBER(commando_state,spaceinv) { - address_space &space = m_maincpu->space(AS_PROGRAM); UINT8 *rom = memregion("maincpu")->base(); - UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0xc000); - int A; - - space.set_decrypted_region(0x0000, 0xbfff, decrypt); // the first opcode *is* encrypted - for (A = 0; A < 0xc000; A++) + for (int A = 0; A < 0xc000; A++) { - int src; - - src = rom[A]; - decrypt[A] = (src & 0x11) | ((src & 0xe0) >> 4) | ((src & 0x0e) << 4); + UINT8 src = rom[A]; + m_decrypted_opcodes[A] = (src & 0x11) | ((src & 0xe0) >> 4) | ((src & 0x0e) << 4); } } diff --git a/src/mame/drivers/cps1.c b/src/mame/drivers/cps1.c index 1206481492b..cf3055a71ce 100644 --- a/src/mame/drivers/cps1.c +++ b/src/mame/drivers/cps1.c @@ -622,6 +622,10 @@ ADDRESS_MAP_START( qsound_sub_map, AS_PROGRAM, 8, cps_state ) // used by cps2. AM_RANGE(0xf000, 0xffff) AM_RAM AM_SHARE("qsound_ram2") ADDRESS_MAP_END +ADDRESS_MAP_START( qsound_decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, cps_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROMBANK("decrypted") +ADDRESS_MAP_END + static ADDRESS_MAP_START( sf2m3_map, AS_PROGRAM, 16, cps_state ) AM_RANGE(0x000000, 0x3fffff) AM_ROM AM_RANGE(0x800010, 0x800011) AM_READ_PORT("IN1") /* Player input ports */ @@ -3238,6 +3242,7 @@ static MACHINE_CONFIG_DERIVED( qsound, cps1_12MHz ) MCFG_CPU_REPLACE("audiocpu", Z80, XTAL_8MHz) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(qsound_sub_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(qsound_decrypted_opcodes_map) MCFG_CPU_PERIODIC_INT_DRIVER(cps_state, irq0_line_hold, 250) // measured (cps2.c) MCFG_MACHINE_START_OVERRIDE(cps_state, qsound) @@ -11551,27 +11556,35 @@ DRIVER_INIT_MEMBER( cps_state, sf2m8 ) DRIVER_INIT_CALL(cps1); } +void cps_state::kabuki_setup(void (*decode)(UINT8 *src, UINT8 *dst)) +{ + UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x8000); + UINT8 *rom = memregion("audiocpu")->base(); + decode(rom, decrypt); + membank("decrypted")->set_base(decrypt); +} + DRIVER_INIT_MEMBER(cps_state,wof) { - wof_decode(machine()); + kabuki_setup(wof_decode); DRIVER_INIT_CALL(cps1); } DRIVER_INIT_MEMBER(cps_state,dino) { - dino_decode(machine()); + kabuki_setup(dino_decode); DRIVER_INIT_CALL(cps1); } DRIVER_INIT_MEMBER(cps_state,punisher) { - punisher_decode(machine()); + kabuki_setup(punisher_decode); DRIVER_INIT_CALL(cps1); } DRIVER_INIT_MEMBER(cps_state,slammast) { - slammast_decode(machine()); + kabuki_setup(slammast_decode); DRIVER_INIT_CALL(cps1); } diff --git a/src/mame/drivers/cps2.c b/src/mame/drivers/cps2.c index aba0c3e76e7..8d51c75b272 100644 --- a/src/mame/drivers/cps2.c +++ b/src/mame/drivers/cps2.c @@ -884,6 +884,9 @@ static ADDRESS_MAP_START( cps2_map, AS_PROGRAM, 16, cps_state ) AM_RANGE(0xff0000, 0xffffff) AM_RAM /* RAM */ ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 16, cps_state ) + AM_RANGE(0x000000, 0x3fffff) AM_ROM AM_SHARE("decrypted_opcodes") /* 68000 ROM */ +ADDRESS_MAP_END static ADDRESS_MAP_START( dead_cps2_map, AS_PROGRAM, 16, cps_state ) AM_RANGE(0x000000, 0x3fffff) AM_ROM /* 68000 ROM */ @@ -1215,6 +1218,7 @@ static MACHINE_CONFIG_START( cps2, cps_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz) MCFG_CPU_PROGRAM_MAP(cps2_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", cps_state, cps2_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, XTAL_8MHz) @@ -1251,6 +1255,7 @@ static MACHINE_CONFIG_DERIVED( dead_cps2, cps2 ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(dead_cps2_map) + MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_DECRYPTED_OPCODES) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( gigaman2, cps2 ) @@ -1259,6 +1264,8 @@ static MACHINE_CONFIG_DERIVED( gigaman2, cps2 ) MCFG_DEVICE_REMOVE("qsound") + MCFG_CPU_MODIFY("maincpu") + MCFG_OKIM6295_ADD("oki", XTAL_32MHz/32, OKIM6295_PIN7_HIGH) // clock frequency & pin 7 not verified MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.47) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.47) @@ -8660,8 +8667,6 @@ void cps_state::gigaman2_gfx_reorder() DRIVER_INIT_MEMBER(cps_state,gigaman2) { address_space &space = m_maincpu->space(AS_PROGRAM); - UINT16 *rom = (UINT16 *)memregion("maincpu")->base(); - int length = memregion("maincpu")->bytes(); gigaman2_gfx_reorder(); @@ -8671,8 +8676,8 @@ DRIVER_INIT_MEMBER(cps_state,gigaman2) save_pointer(NAME(m_gigaman2_dummyqsound_ram), 0x20000 / 2); space.install_readwrite_handler(0x618000, 0x619fff, read16_delegate(FUNC(cps_state::gigaman2_dummyqsound_r),this), write16_delegate(FUNC(cps_state::gigaman2_dummyqsound_w), this)); // no qsound.. - space.set_decrypted_region(0x000000, (length) - 1, &rom[length/4]); - m_maincpu->set_encrypted_opcode_range(0, length); + + memcpy(m_decrypted_opcodes, memregion("maincpu")->base()+0x200000, 0x200000); /* no digital volume switches on this? */ m_digital_volume_timer->adjust(attotime::never, 0, attotime::never); diff --git a/src/mame/drivers/cps3.c b/src/mame/drivers/cps3.c index bb025a6995b..d9b3c214524 100644 --- a/src/mame/drivers/cps3.c +++ b/src/mame/drivers/cps3.c @@ -745,13 +745,11 @@ void cps3_state::cps3_decrypt_bios() int i; UINT32 *coderegion = (UINT32*)memregion("bios")->base(); - m_decrypted_bios = (UINT32*)memregion("bios")->base(); - for (i=0;i<0x80000;i+=4) { UINT32 dword = coderegion[i/4]; UINT32 xormask = cps3_mask(i, m_key1, m_key2); - m_decrypted_bios[i/4] = dword ^ xormask; + coderegion[i/4] = dword ^ xormask; } #if 0 /* Dump to file */ @@ -811,13 +809,6 @@ void cps3_state::init_crypt(UINT32 key1, UINT32 key2, int altEncryption) m_maincpu->sh2drc_add_fastram(0x040C0030, 0x040C003b, 0, &m_tilemap30_regs_base[0]); cps3_decrypt_bios(); - m_decrypted_gamerom = auto_alloc_array(machine(), UINT32, 0x1000000/4); - - - m_0xc0000000_ram_decrypted = auto_alloc_array(machine(), UINT32, 0x400/4); - - address_space &main = m_maincpu->space(AS_PROGRAM); - main.set_direct_update_handler(direct_update_delegate(FUNC(cps3_state::cps3_direct_handler), this)); init_common(); } @@ -1358,43 +1349,6 @@ WRITE32_MEMBER(cps3_state::cps3_0xc0000000_ram_w) m_0xc0000000_ram_decrypted[offset] = m_0xc0000000_ram[offset]^cps3_mask(offset*4+0xc0000000, m_key1, m_key2); } - - -DIRECT_UPDATE_MEMBER(cps3_state::cps3_direct_handler) -{ -// if(DEBUG_PRINTF) printf("address %04x\n",address); - - /* BIOS ROM */ - if (address < 0x80000) - { - direct.explicit_configure(0x00000, 0x7ffff, 0x7ffff, m_decrypted_bios); - return ~0; - } - /* RAM */ - else if (address >= 0x06000000 && address <= 0x06ffffff) - { - UINT8 *decrypted = (UINT8*)m_decrypted_gamerom; - UINT8 *raw = decrypted; - - if (m_altEncryption) raw = (UINT8*) m_user4region; - - direct.explicit_configure(0x06000000, 0x06ffffff, 0x00ffffff, raw, decrypted); - - return ~0; - } - else if (address >= 0xc0000000 && address <= 0xc00003ff) - { - //direct->decrypted = (void*)m_0xc0000000_ram_decrypted; - direct.explicit_configure(0xc0000000, 0xc00003ff, 0x3ff, (UINT8*)m_0xc0000000_ram.target(), (UINT8*)m_0xc0000000_ram_decrypted); - return ~0; - } - - /* anything else falls through to NOPs */ - direct.explicit_configure(address, address, 0, (UINT8*)m_nops, (UINT8*)m_nops); - return ~0; -} - - WRITE32_MEMBER(cps3_state::cram_bank_w) { if (ACCESSING_BITS_0_7) @@ -2249,6 +2203,12 @@ static ADDRESS_MAP_START( cps3_map, AS_PROGRAM, 32, cps3_state ) AM_RANGE(0xc0000000, 0xc00003ff) AM_RAM_WRITE(cps3_0xc0000000_ram_w ) AM_SHARE("0xc0000000_ram") /* Executes code from here */ ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 32, cps3_state ) + AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_REGION("bios", 0) // Bios ROM + AM_RANGE(0x06000000, 0x06ffffff) AM_ROM AM_SHARE("decrypted_gamerom") + AM_RANGE(0xc0000000, 0xc00003ff) AM_ROM AM_SHARE("0xc0000000_ram_decrypted") +ADDRESS_MAP_END + static INPUT_PORTS_START( cps3 ) PORT_START("INPUTS") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) @@ -2551,8 +2511,9 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_START( cps3, cps3_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", SH2, 6250000*4) // external clock is 6.25 Mhz, it sets the intenral multiplier to 4x (this should probably be handled in the core..) + MCFG_CPU_ADD("maincpu", SH2, 6250000*4) // external clock is 6.25 Mhz, it sets the internal multiplier to 4x (this should probably be handled in the core..) MCFG_CPU_PROGRAM_MAP(cps3_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", cps3_state, cps3_vbl_interrupt) MCFG_CPU_PERIODIC_INT_DRIVER(cps3_state, cps3_other_interrupt, 80) /* ?source? */ MCFG_SH2_DMA_KLUDGE_CB(cps3_state, dma_callback) diff --git a/src/mame/drivers/cshooter.c b/src/mame/drivers/cshooter.c index 597acba64aa..aeacb6e31be 100644 --- a/src/mame/drivers/cshooter.c +++ b/src/mame/drivers/cshooter.c @@ -4,7 +4,7 @@ TS 01.05.2006: - - added sprites, bgmap reading and few ixes here and there + - added sprites, bgmap reading and few fixes here and there airraid and cshootere are a bit "playable" ;) without gfx @@ -103,7 +103,8 @@ public: m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), m_generic_paletteram_8(*this, "paletteram"), - m_generic_paletteram2_8(*this, "paletteram2") { } + m_generic_paletteram2_8(*this, "paletteram2"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } required_device<cpu_device> m_maincpu; optional_device<seibu_sound_device> m_seibu_sound; @@ -114,6 +115,7 @@ public: required_device<palette_device> m_palette; required_shared_ptr<UINT8> m_generic_paletteram_8; required_shared_ptr<UINT8> m_generic_paletteram2_8; + required_shared_ptr<UINT8> m_decrypted_opcodes; tilemap_t *m_txtilemap; int m_coin_stat; @@ -253,7 +255,7 @@ WRITE8_MEMBER(cshooter_state::cshooter_c700_w) WRITE8_MEMBER(cshooter_state::bank_w) { - membank("bank1")->set_base(&memregion("user1")->base()[0x4000*((data>>4)&3)]); + membank("bank1")->set_entry((data>>4)&3); } @@ -313,6 +315,10 @@ static ADDRESS_MAP_START( airraid_map, AS_PROGRAM, 8, cshooter_state ) AM_RANGE(0xfe00, 0xffff) AM_RAM AM_SHARE("spriteram") ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, cshooter_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + #if 0 /* Sound CPU */ @@ -440,9 +446,11 @@ static MACHINE_CONFIG_START( airraid, cshooter_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,XTAL_12MHz/2) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(airraid_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", cshooter_state, cshooter_scanline, "screen", 0, 1) SEIBU2_AIRRAID_SOUND_SYSTEM_CPU(XTAL_14_31818MHz/4) /* verified on pcb */ + SEIBU_SOUND_SYSTEM_ENCRYPTED_LOW() MCFG_QUANTUM_TIME(attotime::from_hz(6000)) @@ -595,29 +603,24 @@ DRIVER_INIT_MEMBER(cshooter_state,cshooter) DRIVER_INIT_MEMBER(cshooter_state,cshootere) { - address_space &space = m_maincpu->space(AS_PROGRAM); - int A; UINT8 *rom = memregion("maincpu")->base(); - UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x8000); - space.set_decrypted_region(0x0000, 0x7fff, decrypt); - - for (A = 0x0000;A < 0x8000;A++) + for (int A = 0x0000;A < 0x8000;A++) { /* decode the opcodes */ - decrypt[A] = rom[A]; + m_decrypted_opcodes[A] = rom[A]; if (BIT(A,5) && !BIT(A,3)) - decrypt[A] ^= 0x40; + m_decrypted_opcodes[A] ^= 0x40; if (BIT(A,10) && !BIT(A,9) && BIT(A,3)) - decrypt[A] ^= 0x20; + m_decrypted_opcodes[A] ^= 0x20; if ((BIT(A,10) ^ BIT(A,9)) && BIT(A,1)) - decrypt[A] ^= 0x02; + m_decrypted_opcodes[A] ^= 0x02; if (BIT(A,9) || !BIT(A,5) || BIT(A,3)) - decrypt[A] = BITSWAP8(decrypt[A],7,6,1,4,3,2,5,0); + m_decrypted_opcodes[A] = BITSWAP8(m_decrypted_opcodes[A],7,6,1,4,3,2,5,0); /* decode the data */ if (BIT(A,5)) @@ -627,8 +630,7 @@ DRIVER_INIT_MEMBER(cshooter_state,cshootere) rom[A] = BITSWAP8(rom[A],7,6,1,4,3,2,5,0); } - membank("bank1")->set_base(&memregion("user1")->base()[0]); - m_seibu_sound->decrypt("audiocpu",0x2000); + membank("bank1")->configure_entries(0, 4, memregion("user1")->base(), 0x4000); } diff --git a/src/mame/drivers/darkmist.c b/src/mame/drivers/darkmist.c index 549154641b1..35419344046 100644 --- a/src/mame/drivers/darkmist.c +++ b/src/mame/drivers/darkmist.c @@ -64,6 +64,10 @@ static ADDRESS_MAP_START( memmap, AS_PROGRAM, 8, darkmist_state ) AM_RANGE(0xf000, 0xffff) AM_RAM AM_SHARE("spriteram") ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, darkmist_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") + AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") +ADDRESS_MAP_END static INPUT_PORTS_START( darkmist ) PORT_START("P1") @@ -232,6 +236,7 @@ static MACHINE_CONFIG_START( darkmist, darkmist_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,4000000) /* ? MHz */ MCFG_CPU_PROGRAM_MAP(memmap) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", darkmist_state, scanline, "screen", 0, 1) MCFG_DEVICE_ADD("t5182", T5182, 0) @@ -401,11 +406,9 @@ void darkmist_state::decrypt_snd() DRIVER_INIT_MEMBER(darkmist_state,darkmist) { - address_space &space = m_maincpu->space(AS_PROGRAM); int i, len; UINT8 *ROM = memregion("maincpu")->base(); dynamic_buffer buffer(0x10000); - UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x8000); decrypt_gfx(); @@ -432,10 +435,10 @@ DRIVER_INIT_MEMBER(darkmist_state,darkmist) } ROM[i] = d; - decrypt[i] = p; + m_decrypted_opcodes[i] = p; } - space.set_decrypted_region(0x0000, 0x7fff, decrypt); + membank("bank1")->set_base(&ROM[0x010000]); /* adr line swaps */ ROM = memregion("user1")->base(); diff --git a/src/mame/drivers/dblewing.c b/src/mame/drivers/dblewing.c index bfb9b470842..9663f217f9d 100644 --- a/src/mame/drivers/dblewing.c +++ b/src/mame/drivers/dblewing.c @@ -89,7 +89,8 @@ public: m_sprgen(*this, "spritegen"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), - m_deco_tilegen1(*this, "tilegen1") + m_deco_tilegen1(*this, "tilegen1"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } optional_device<deco104_device> m_deco104; /* memory pointers */ @@ -106,6 +107,7 @@ public: required_device<cpu_device> m_maincpu; required_device<cpu_device> m_audiocpu; required_device<deco16ic_device> m_deco_tilegen1; + required_shared_ptr<UINT16> m_decrypted_opcodes; DECLARE_WRITE_LINE_MEMBER(sound_irq); DECLARE_READ16_MEMBER(dblewing_prot_r); DECLARE_WRITE16_MEMBER(dblewing_prot_w); @@ -179,6 +181,10 @@ static ADDRESS_MAP_START( dblewing_map, AS_PROGRAM, 16, dblewing_state ) AM_RANGE(0xff0000, 0xff3fff) AM_MIRROR(0xc000) AM_RAM ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 16, dblewing_state ) + AM_RANGE(0x000000, 0x07ffff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + READ8_MEMBER(dblewing_state::irq_latch_r) { /* bit 1 of dblewing_sound_irq specifies IRQ command writes */ @@ -362,6 +368,7 @@ static MACHINE_CONFIG_START( dblewing, dblewing_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_28MHz/2) /* DE102 */ MCFG_CPU_PROGRAM_MAP(dblewing_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", dblewing_state, irq6_line_hold) MCFG_CPU_ADD("audiocpu", Z80, XTAL_32_22MHz/9) @@ -450,7 +457,7 @@ ROM_END DRIVER_INIT_MEMBER(dblewing_state,dblewing) { deco56_decrypt_gfx(machine(), "gfx1"); - deco102_decrypt_cpu(machine(), "maincpu", 0x399d, 0x25, 0x3d); + deco102_decrypt_cpu((UINT16 *)memregion("maincpu")->base(), m_decrypted_opcodes, 0x80000, 0x399d, 0x25, 0x3d); } diff --git a/src/mame/drivers/deadang.c b/src/mame/drivers/deadang.c index e685c4267d0..f7e6b872502 100644 --- a/src/mame/drivers/deadang.c +++ b/src/mame/drivers/deadang.c @@ -244,6 +244,7 @@ static MACHINE_CONFIG_START( deadang, deadang_state ) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer2", deadang_state, sub_scanline, "screen", 0, 1) SEIBU3A_SOUND_SYSTEM_CPU(XTAL_14_31818MHz/4) + SEIBU_SOUND_SYSTEM_ENCRYPTED_LOW() MCFG_QUANTUM_TIME(attotime::from_hz(60)) // the game stops working with higher interleave rates.. @@ -413,14 +414,12 @@ ROM_END DRIVER_INIT_MEMBER(deadang_state,deadang) { - m_seibu_sound->decrypt("audiocpu", 0x2000); m_adpcm1->decrypt("adpcm1"); m_adpcm2->decrypt("adpcm2"); } DRIVER_INIT_MEMBER(deadang_state,ghunter) { - m_seibu_sound->decrypt("audiocpu", 0x2000); m_adpcm1->decrypt("adpcm1"); m_adpcm2->decrypt("adpcm2"); diff --git a/src/mame/drivers/dietgo.c b/src/mame/drivers/dietgo.c index ce9ac1a75ff..c26414b78a8 100644 --- a/src/mame/drivers/dietgo.c +++ b/src/mame/drivers/dietgo.c @@ -60,6 +60,10 @@ static ADDRESS_MAP_START( dietgo_map, AS_PROGRAM, 16, dietgo_state ) AM_RANGE(0x380000, 0x38ffff) AM_RAM // mainram ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 16, dietgo_state ) + AM_RANGE(0x000000, 0x07ffff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + /* Physical memory map (21 bits) */ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, dietgo_state ) @@ -205,6 +209,7 @@ static MACHINE_CONFIG_START( dietgo, dietgo_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_28MHz/2) /* DE102 (verified on pcb) */ MCFG_CPU_PROGRAM_MAP(dietgo_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", dietgo_state, irq6_line_hold) MCFG_CPU_ADD("audiocpu", H6280, XTAL_32_22MHz/4/3) /* Custom chip 45; XIN is 32.220MHZ/4, verified on pcb */ @@ -365,7 +370,7 @@ ROM_END DRIVER_INIT_MEMBER(dietgo_state,dietgo) { deco56_decrypt_gfx(machine(), "gfx1"); - deco102_decrypt_cpu(machine(), "maincpu", 0xe9ba, 0x01, 0x19); + deco102_decrypt_cpu((UINT16 *)memregion("maincpu")->base(), m_decrypted_opcodes, 0x80000, 0xe9ba, 0x01, 0x19); } GAME( 1992, dietgo, 0, dietgo, dietgo, dietgo_state, dietgo, ROT0, "Data East Corporation", "Diet Go Go (Euro v1.1 1992.09.26)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/dynduke.c b/src/mame/drivers/dynduke.c index 8d0329907c2..200175fa2a7 100644 --- a/src/mame/drivers/dynduke.c +++ b/src/mame/drivers/dynduke.c @@ -283,6 +283,7 @@ static MACHINE_CONFIG_START( dynduke, dynduke_state ) MCFG_CPU_VBLANK_INT_DRIVER("screen", dynduke_state, interrupt) SEIBU_SOUND_SYSTEM_CPU(14318180/4) + SEIBU_SOUND_SYSTEM_ENCRYPTED_FULL() MCFG_QUANTUM_TIME(attotime::from_hz(3600)) @@ -607,7 +608,6 @@ ROM_END DRIVER_INIT_MEMBER(dynduke_state,dynduke) { - m_seibu_sound->decrypt("audiocpu",0x20000); } /* Game Drivers */ diff --git a/src/mame/drivers/finalizr.c b/src/mame/drivers/finalizr.c index f1d84e8e59f..cfd7a23f96f 100644 --- a/src/mame/drivers/finalizr.c +++ b/src/mame/drivers/finalizr.c @@ -260,7 +260,7 @@ void finalizr_state::machine_reset() static MACHINE_CONFIG_START( finalizr, finalizr_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6809,XTAL_18_432MHz/6) /* ??? */ + MCFG_CPU_ADD("maincpu", KONAMI1, XTAL_18_432MHz/6) /* ??? */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", finalizr_state, finalizr_scanline, "screen", 0, 1) @@ -352,7 +352,6 @@ ROM_END DRIVER_INIT_MEMBER(finalizr_state,finalizr) { - konami1_decode(machine(), "maincpu"); } diff --git a/src/mame/drivers/freekick.c b/src/mame/drivers/freekick.c index f9043a736f7..25b5a7b6764 100644 --- a/src/mame/drivers/freekick.c +++ b/src/mame/drivers/freekick.c @@ -81,7 +81,9 @@ READ8_MEMBER(freekick_state::spinner_r) WRITE8_MEMBER(freekick_state::pbillrd_bankswitch_w) { - membank("bank1")->set_entry(data & 1); + m_bank1->set_entry(data & 1); + if(m_bank1d) + m_bank1d->set_entry(data & 1); } WRITE8_MEMBER(freekick_state::nmi_enable_w) @@ -187,6 +189,11 @@ static ADDRESS_MAP_START( pbillrd_map, AS_PROGRAM, 8, freekick_state ) AM_RANGE(0xfc03, 0xfc03) AM_DEVWRITE("sn4", sn76489a_device, write) ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, freekick_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROMBANK("bank0d") + AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1d") +ADDRESS_MAP_END + static ADDRESS_MAP_START( freekickb_map, AS_PROGRAM, 8, freekick_state ) AM_RANGE(0x0000, 0xcfff) AM_ROM AM_RANGE(0xd000, 0xdfff) AM_RAM @@ -582,7 +589,7 @@ MACHINE_RESET_MEMBER(freekick_state,freekick) MACHINE_START_MEMBER(freekick_state,pbillrd) { - membank("bank1")->configure_entries(0, 2, memregion("maincpu")->base() + 0x10000, 0x4000); + m_bank1->configure_entries(0, 2, memregion("maincpu")->base() + 0x8000, 0x4000); MACHINE_START_CALL_MEMBER(freekick); } @@ -645,6 +652,11 @@ static MACHINE_CONFIG_DERIVED( pbillrd, base ) MCFG_MACHINE_RESET_OVERRIDE(freekick_state,freekick) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( pbillrdm, pbillrd ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( freekickb, base ) /* basic machine hardware */ @@ -676,6 +688,7 @@ static MACHINE_CONFIG_DERIVED( gigas, base ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(gigas_map) MCFG_CPU_IO_MAP(gigas_io_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_MACHINE_START_OVERRIDE(freekick_state,freekick) MCFG_MACHINE_RESET_OVERRIDE(freekick_state,freekick) @@ -704,11 +717,10 @@ MACHINE_CONFIG_END *************************************/ ROM_START( pbillrd ) - ROM_REGION( 0x18000, "maincpu", 0 ) /* Z80 Code */ - ROM_LOAD( "pb.18", 0x00000, 0x4000, CRC(9e6275ac) SHA1(482e845e7fb4190da483155bd908ad470373cd5c) ) - ROM_LOAD( "pb.7", 0x04000, 0x4000, CRC(dd438431) SHA1(07a950e38b3f627ecf95e5831e5480abb337a010) ) - ROM_CONTINUE( 0x10000, 0x4000 ) - ROM_LOAD( "pb.9", 0x14000, 0x4000, CRC(089ce80a) SHA1(779be9ba2277a26fbebf4acf9e2f5319a934b0f5) ) + ROM_REGION( 0x10000, "maincpu", 0 ) /* Z80 Code */ + ROM_LOAD( "pb.18", 0x0000, 0x4000, CRC(9e6275ac) SHA1(482e845e7fb4190da483155bd908ad470373cd5c) ) + ROM_LOAD( "pb.7", 0x4000, 0x8000, CRC(dd438431) SHA1(07a950e38b3f627ecf95e5831e5480abb337a010) ) + ROM_LOAD( "pb.9", 0xc000, 0x4000, CRC(089ce80a) SHA1(779be9ba2277a26fbebf4acf9e2f5319a934b0f5) ) ROM_REGION( 0xc000, "gfx1", 0 ) /* GFX */ ROM_LOAD( "pb.4", 0x000000, 0x04000, CRC(2f4d4dd3) SHA1(ee4facabf591c235c270db4f4d3f612b8c474e57) ) @@ -730,11 +742,10 @@ ROM_START( pbillrd ) ROM_END ROM_START( pbillrds ) /* Encrytped with a Sega MC-8123 (317-0030) CPU module */ - ROM_REGION( 0x18000, "maincpu", 0 ) /* Z80 Code */ - ROM_LOAD( "10626.8n", 0x00000, 0x4000, CRC(51d725e6) SHA1(d7007c983530780e7fa3686cb7a6d7c382c802fa) ) /* encrypted */ - ROM_LOAD( "10625.8r", 0x04000, 0x4000, CRC(8977c724) SHA1(f00835a04dc6fa7d8c1e382dace515f2aa7d6f44) ) /* encrypted */ - ROM_CONTINUE( 0x10000, 0x4000 ) - ROM_LOAD( "10627.10n", 0x14000, 0x4000, CRC(2335e6dd) SHA1(82352b6f4abea88aad3a96ca63cccccb6e278f48) ) /* encrypted */ + ROM_REGION( 0x10000, "maincpu", 0 ) /* Z80 Code */ + ROM_LOAD( "10626.8n", 0x0000, 0x4000, CRC(51d725e6) SHA1(d7007c983530780e7fa3686cb7a6d7c382c802fa) ) /* encrypted */ + ROM_LOAD( "10625.8r", 0x4000, 0x8000, CRC(8977c724) SHA1(f00835a04dc6fa7d8c1e382dace515f2aa7d6f44) ) /* encrypted */ + ROM_LOAD( "10627.10n", 0xc000, 0x4000, CRC(2335e6dd) SHA1(82352b6f4abea88aad3a96ca63cccccb6e278f48) ) /* encrypted */ ROM_REGION( 0x2000, "user1", 0 ) /* MC8123 key */ ROM_LOAD( "317-0030.key", 0x0000, 0x2000, CRC(9223f06d) SHA1(51a22a4c80fe273526bde68918c13c6476cec383) ) @@ -761,11 +772,10 @@ ROM_END // all ROMs were HN4827128G-25, except 17, HN27256G-25 // CPU module marked 3?7-500B, but seems to act the same as above ROM_START( pbillrdsa ) - ROM_REGION( 0x18000, "maincpu", 0 ) /* Z80 Code */ - ROM_LOAD( "29", 0x00000, 0x4000, CRC(da020258) SHA1(172276061c2e06bcf3477488734a72598412181b) ) /* encrypted */ // label scraped off, might be 20 - ROM_LOAD( "17", 0x04000, 0x4000, CRC(9bb3d467) SHA1(5d61c80c920363cbcb548f4a08434e2a05b3d5f3) ) /* encrypted */ - ROM_CONTINUE( 0x10000, 0x4000 ) - ROM_LOAD( "19", 0x14000, 0x4000, CRC(2335e6dd) SHA1(82352b6f4abea88aad3a96ca63cccccb6e278f48) ) /* encrypted */ + ROM_REGION( 0x10000, "maincpu", 0 ) /* Z80 Code */ + ROM_LOAD( "29", 0x0000, 0x4000, CRC(da020258) SHA1(172276061c2e06bcf3477488734a72598412181b) ) /* encrypted */ // label scraped off, might be 20 + ROM_LOAD( "17", 0x4000, 0x8000, CRC(9bb3d467) SHA1(5d61c80c920363cbcb548f4a08434e2a05b3d5f3) ) /* encrypted */ + ROM_LOAD( "19", 0xc000, 0x4000, CRC(2335e6dd) SHA1(82352b6f4abea88aad3a96ca63cccccb6e278f48) ) /* encrypted */ ROM_REGION( 0x2000, "user1", 0 ) /* MC8123 key */ ROM_LOAD( "317-0030.key", 0x0000, 0x2000, CRC(9223f06d) SHA1(51a22a4c80fe273526bde68918c13c6476cec383) ) @@ -1034,12 +1044,12 @@ ROM_START( countrunb2 ) ROM_END ROM_START( gigasm2b ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) - ROM_LOAD( "8.rom", 0x10000, 0x4000, CRC(c00a4a6c) SHA1(0d1bb849c9bfe4e92ad70e4ef19da494c0bd7ba8) ) + ROM_REGION( 2*0xc000, "maincpu", 0 ) + ROM_LOAD( "8.rom", 0x0c000, 0x4000, CRC(c00a4a6c) SHA1(0d1bb849c9bfe4e92ad70e4ef19da494c0bd7ba8) ) ROM_CONTINUE( 0x00000, 0x4000 ) - ROM_LOAD( "7.rom", 0x14000, 0x4000, CRC(92bd9045) SHA1(e4d8a94deeb795bb284ca0bd211ed40ed498b172) ) + ROM_LOAD( "7.rom", 0x10000, 0x4000, CRC(92bd9045) SHA1(e4d8a94deeb795bb284ca0bd211ed40ed498b172) ) ROM_CONTINUE( 0x04000, 0x4000 ) - ROM_LOAD( "9.rom", 0x18000, 0x4000, CRC(a3ef809c) SHA1(6d4098658aa124e10e5edb8e8e3abe0aa26741a1) ) + ROM_LOAD( "9.rom", 0x14000, 0x4000, CRC(a3ef809c) SHA1(6d4098658aa124e10e5edb8e8e3abe0aa26741a1) ) ROM_CONTINUE( 0x08000, 0x4000 ) ROM_REGION( 0xc000, "gfx1", 0 ) /* GFX */ @@ -1111,10 +1121,10 @@ Note: MCU dump has fixed bits, but read is good. If not correct, it's protected. */ ROM_START( gigasb ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) - ROM_LOAD( "g-7", 0x10000, 0x4000, CRC(daf4e88d) SHA1(391dff914ce8e9b7975fc8827c066d7db16c4171) ) + ROM_REGION( 2*0xc000, "maincpu", 0 ) + ROM_LOAD( "g-7", 0x0c000, 0x4000, CRC(daf4e88d) SHA1(391dff914ce8e9b7975fc8827c066d7db16c4171) ) ROM_CONTINUE( 0x00000, 0x4000 ) - ROM_LOAD( "g-8", 0x14000, 0x8000, CRC(4ab4c1f1) SHA1(63d8f489c7a8271e99a66d97e6eb0eb252cb2b67) ) + ROM_LOAD( "g-8", 0x10000, 0x8000, CRC(4ab4c1f1) SHA1(63d8f489c7a8271e99a66d97e6eb0eb252cb2b67) ) ROM_CONTINUE( 0x04000, 0x8000 ) ROM_REGION( 0xc000, "gfx1", 0 ) /* GFX */ @@ -1137,8 +1147,8 @@ ROM_START( gigasb ) ROM_END ROM_START( oigas ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) - ROM_LOAD( "rom.7", 0x10000, 0x4000, CRC(e5bc04cc) SHA1(ffbd416313a9e49d2f9a7268d5ef48a8b641e480) ) + ROM_REGION( 2*0xc000, "maincpu", 0 ) + ROM_LOAD( "rom.7", 0x0c000, 0x4000, CRC(e5bc04cc) SHA1(ffbd416313a9e49d2f9a7268d5ef48a8b641e480) ) ROM_CONTINUE( 0x00000, 0x4000) ROM_LOAD( "rom.8", 0x04000, 0x8000, CRC(c199060d) SHA1(de8f1e0f941533abbbed25b595b1d51fadbb428d) ) @@ -1174,19 +1184,25 @@ ROM_END DRIVER_INIT_MEMBER(freekick_state,gigasb) { - address_space &space = m_maincpu->space(AS_PROGRAM); - space.set_decrypted_region(0x0000, 0xbfff, memregion("maincpu")->base() + 0x10000); + membank("bank0d")->set_base(memregion("maincpu")->base() + 0xc000); + m_bank1d->set_base(memregion("maincpu")->base() + 0x14000); } DRIVER_INIT_MEMBER(freekick_state,pbillrds) { - mc8123_decrypt_rom(machine(), "maincpu", "user1", "bank1", 2); + UINT8 *decrypted_opcodes = auto_alloc_array(machine(), UINT8, 0x10000); + mc8123_decode(memregion("maincpu")->base(), decrypted_opcodes, memregion("user1")->base(), 0x10000); + membank("bank0d")->set_base(decrypted_opcodes); + m_bank1d->configure_entries(0, 2, decrypted_opcodes + 0x8000, 0x4000); } DRIVER_INIT_MEMBER(freekick_state,gigas) { - mc8123_decrypt_rom(machine(), "maincpu", "user1", NULL, 1); + UINT8 *decrypted_opcodes = auto_alloc_array(machine(), UINT8, 0xc000); + mc8123_decode(memregion("maincpu")->base(), decrypted_opcodes, memregion("user1")->base(), 0xc000); + membank("bank0d")->set_base(decrypted_opcodes); + m_bank1d->set_base(decrypted_opcodes + 0x8000); } @@ -1203,8 +1219,8 @@ GAME( 1986, gigasb, gigas, gigas, gigas, freekick_state, gigasb, R GAME( 1986, oigas, gigas , oigas, gigas, freekick_state, gigasb, ROT270, "bootleg", "Oigas (bootleg)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) GAME( 1986, gigasm2b, 0, gigas, gigasm2, freekick_state, gigasb, ROT270, "bootleg", "Gigas Mark II (bootleg)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) GAME( 1987, pbillrd, 0, pbillrd, pbillrd, driver_device, 0, ROT0, "Nihon System", "Perfect Billiard", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) -GAME( 1987, pbillrds, pbillrd, pbillrd, pbillrd, freekick_state, pbillrds,ROT0, "Nihon System", "Perfect Billiard (MC-8123, 317-0030)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) -GAME( 1987, pbillrdsa, pbillrd, pbillrd, pbillrd, freekick_state, pbillrds,ROT0, "Nihon System", "Perfect Billiard (MC-8123, 317-5008)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) // sticker on CPU module different (wrong?) functionality the same +GAME( 1987, pbillrds, pbillrd, pbillrdm, pbillrd, freekick_state, pbillrds,ROT0, "Nihon System", "Perfect Billiard (MC-8123, 317-0030)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) +GAME( 1987, pbillrdsa, pbillrd, pbillrdm, pbillrd, freekick_state, pbillrds,ROT0, "Nihon System", "Perfect Billiard (MC-8123, 317-5008)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) // sticker on CPU module different (wrong?) functionality the same GAME( 1987, freekick, 0, freekickb, freekck, driver_device, 0, ROT270, "Nihon System (Merit license)", "Free Kick (NS6201-A 1987.10)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) GAME( 1987, freekicka, freekick, freekickb, freekck, driver_device, 0, ROT270, "Nihon System", "Free Kick (NS6201-A 1987.9)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) GAME( 1987, freekickb1,freekick, freekickb, freekck, driver_device, 0, ROT270, "bootleg", "Free Kick (bootleg set 1)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/funworld.c b/src/mame/drivers/funworld.c index 33f2bd74e39..f144bb80cff 100644 --- a/src/mame/drivers/funworld.c +++ b/src/mame/drivers/funworld.c @@ -5954,7 +5954,6 @@ DRIVER_INIT_MEMBER(funworld_state, multiwin) ******************************************************/ { UINT8 *ROM = memregion("maincpu")->base(); - address_space &space = m_maincpu->space(AS_PROGRAM); int x; @@ -5971,8 +5970,6 @@ DRIVER_INIT_MEMBER(funworld_state, multiwin) ROM[x+0x10000] = code; } - - space.set_decrypted_region(0x8000, 0xffff, memregion("maincpu")->base() + 0x18000); } @@ -5988,7 +5985,6 @@ DRIVER_INIT_MEMBER(funworld_state, royalcdc) ******************************************************/ UINT8 *ROM = memregion("maincpu")->base(); - address_space &space = m_maincpu->space(AS_PROGRAM); int x; @@ -6025,8 +6021,6 @@ DRIVER_INIT_MEMBER(funworld_state, royalcdc) ROM[x+0x10000] = code; } - - space.set_decrypted_region(0x6000, 0xffff, memregion("maincpu")->base() + 0x16000); } diff --git a/src/mame/drivers/galaxian.c b/src/mame/drivers/galaxian.c index 3accadfaf72..f9276d41095 100644 --- a/src/mame/drivers/galaxian.c +++ b/src/mame/drivers/galaxian.c @@ -1355,6 +1355,10 @@ static ADDRESS_MAP_START( mooncrst_map_base, AS_PROGRAM, 8, galaxian_state ) AM_RANGE(0xb800, 0xb800) AM_MIRROR(0x07ff) AM_READ(watchdog_reset_r) ADDRESS_MAP_END +static ADDRESS_MAP_START( moonqsr_decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, galaxian_state ) + AM_RANGE(0x0000, 0x3fff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( mooncrst_map, AS_PROGRAM, 8, galaxian_state ) AM_IMPORT_FROM(mooncrst_map_base) AM_IMPORT_FROM(mooncrst_map_discrete) @@ -1670,6 +1674,10 @@ static ADDRESS_MAP_START( mshuttle_map, AS_PROGRAM, 8, galaxian_state ) AM_RANGE(0xb800, 0xb800) AM_READ(watchdog_reset_r) ADDRESS_MAP_END +static ADDRESS_MAP_START( mshuttle_decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, galaxian_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( mshuttle_portmap, AS_IO, 8, galaxian_state ) ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_GLOBAL_MASK(0x0f) @@ -5192,6 +5200,11 @@ static MACHINE_CONFIG_DERIVED( mooncrst, galaxian_base ) MCFG_FRAGMENT_ADD(mooncrst_audio) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( moonqsr, mooncrst ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(moonqsr_decrypted_opcodes_map) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( fantastc, galaxian_base ) @@ -5289,6 +5302,7 @@ static MACHINE_CONFIG_DERIVED( mshuttle, galaxian_base ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(mshuttle_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(mshuttle_decrypted_opcodes_map) MCFG_CPU_IO_MAP(mshuttle_portmap) /* sound hardware */ @@ -5965,7 +5979,7 @@ DRIVER_INIT_MEMBER(galaxian_state,mooncrst) common_init(&galaxian_state::galaxian_draw_bullet, &galaxian_state::galaxian_draw_background, &galaxian_state::mooncrst_extend_tile_info, &galaxian_state::mooncrst_extend_sprite_info); /* decrypt program code */ - decode_mooncrst(0x8000, memregion("maincpu")->base()); + decode_mooncrst(0x4000, memregion("maincpu")->base()); } @@ -5990,15 +6004,11 @@ DRIVER_INIT_MEMBER(galaxian_state,mooncrgx) DRIVER_INIT_MEMBER(galaxian_state,moonqsr) { - address_space &space = m_maincpu->space(AS_PROGRAM); - UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x8000); - /* video extensions */ common_init(&galaxian_state::galaxian_draw_bullet, &galaxian_state::galaxian_draw_background, &galaxian_state::moonqsr_extend_tile_info, &galaxian_state::moonqsr_extend_sprite_info); /* decrypt program code */ - decode_mooncrst(0x8000, decrypt); - space.set_decrypted_region(0x0000, 0x7fff, decrypt); + decode_mooncrst(0x4000, m_decrypted_opcodes); } WRITE8_MEMBER(galaxian_state::artic_gfxbank_w) @@ -6253,14 +6263,9 @@ DRIVER_INIT_MEMBER(galaxian_state,kong) void galaxian_state::mshuttle_decode(const UINT8 convtable[8][16]) { - address_space &space = m_maincpu->space(AS_PROGRAM); UINT8 *rom = memregion("maincpu")->base(); - UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x10000); - int A; - space.set_decrypted_region(0x0000, 0xffff, decrypt); - - for (A = 0x0000;A < 0x10000;A++) + for (int A = 0x0000;A < 0x8000;A++) { int i,j; UINT8 src = rom[A]; @@ -6273,7 +6278,7 @@ void galaxian_state::mshuttle_decode(const UINT8 convtable[8][16]) j = (src & 0x01) | ((src & 0x04) >> 1) | ((src & 0x10) >> 2) | ((src & 0x40) >> 3); /* decode the opcodes */ - decrypt[A] = (src & 0xaa) | convtable[i][j]; + m_decrypted_opcodes[A] = (src & 0xaa) | convtable[i][j]; } } @@ -9151,7 +9156,7 @@ ROM_END ROM_START( mshuttle ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "my05", 0x0000, 0x1000, CRC(83574af1) SHA1(d69c2a0538a49d6c72c3346ac4e3959d91da6c98) ) ROM_LOAD( "my04", 0x1000, 0x1000, CRC(1cfae2c8) SHA1(6c7eeee70e91b8498c41525dcc60f8086cff8da7) ) ROM_LOAD( "my03", 0x2000, 0x1000, CRC(c8b8a368) SHA1(140ba60f55285d1e9f7a262634f5ce5c3470ab71) ) @@ -9173,7 +9178,7 @@ ROM_START( mshuttle ) ROM_END ROM_START( mshuttle2 ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "my05", 0x0000, 0x1000, CRC(83574af1) SHA1(d69c2a0538a49d6c72c3346ac4e3959d91da6c98) ) ROM_LOAD( "my04", 0x1000, 0x1000, CRC(1cfae2c8) SHA1(6c7eeee70e91b8498c41525dcc60f8086cff8da7) ) ROM_LOAD( "my03", 0x2000, 0x1000, CRC(c8b8a368) SHA1(140ba60f55285d1e9f7a262634f5ce5c3470ab71) ) @@ -9197,7 +9202,7 @@ ROM_END ROM_START( mshuttlej ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "mcs.5", 0x0000, 0x1000, CRC(a5a292b4) SHA1(b4e9d969c762f4114eba88051917df122fc7181f) ) ROM_LOAD( "mcs.4", 0x1000, 0x1000, CRC(acdc0f9e) SHA1(8cd6d6566fe3f4090ccb625c3c1e5850a371826f) ) ROM_LOAD( "mcs.3", 0x2000, 0x1000, CRC(c1e3f5d8) SHA1(d3af89d485b1ca21ac879dbe15490dcd1cd64f2a) ) @@ -9220,7 +9225,7 @@ ROM_START( mshuttlej ) ROM_END ROM_START( mshuttlej2 ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "ali5.bin", 0x0000, 0x1000, CRC(320fe630) SHA1(df4fe25989783c8851f41c9b4b63dedfa365c1e9) ) ROM_LOAD( "mcs.4", 0x1000, 0x1000, CRC(acdc0f9e) SHA1(8cd6d6566fe3f4090ccb625c3c1e5850a371826f) ) ROM_LOAD( "mcs.3", 0x2000, 0x1000, CRC(c1e3f5d8) SHA1(d3af89d485b1ca21ac879dbe15490dcd1cd64f2a) ) @@ -10859,7 +10864,7 @@ GAME( 1980, mooncreg, mooncrst, mooncrst, mooncreg, galaxian_state, moonc GAME( 1980, mooncrsl, mooncrst, mooncrst, mooncrsl, galaxian_state, mooncrsu, ROT90, "bootleg (Laguna S.A.)", "Cresta Mundo (Laguna S.A. Spanish Moon Cresta bootleg)", GAME_SUPPORTS_SAVE ) GAME( 1980, stera, mooncrst, mooncrst, smooncrs, galaxian_state, mooncrsu, ROT90, "bootleg", "Steraranger (Moon Cresta bootleg)", GAME_SUPPORTS_SAVE ) GAME( 1980, mooncrgx, mooncrst, galaxian, mooncrgx, galaxian_state, mooncrgx, ROT270, "bootleg", "Moon Cresta (Galaxian hardware)", GAME_SUPPORTS_SAVE ) -GAME( 1980, moonqsr, 0, mooncrst, moonqsr, galaxian_state, moonqsr, ROT90, "Nichibutsu", "Moon Quasar", GAME_SUPPORTS_SAVE ) +GAME( 1980, moonqsr, 0, moonqsr, moonqsr, galaxian_state, moonqsr, ROT90, "Nichibutsu", "Moon Quasar", GAME_SUPPORTS_SAVE ) GAME( 1980, moonal2, galaxian, mooncrst, moonal2, galaxian_state, galaxian, ROT90, "Namco / Nichibutsu", "Moon Alien Part 2", GAME_SUPPORTS_SAVE ) GAME( 1980, moonal2b, galaxian, mooncrst, moonal2, galaxian_state, galaxian, ROT90, "Namco / Nichibutsu", "Moon Alien Part 2 (older version)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/gyruss.c b/src/mame/drivers/gyruss.c index 0001553790b..e894a93edd2 100644 --- a/src/mame/drivers/gyruss.c +++ b/src/mame/drivers/gyruss.c @@ -466,7 +466,7 @@ static MACHINE_CONFIG_START( gyruss, gyruss_state ) MCFG_CPU_PROGRAM_MAP(main_cpu1_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", gyruss_state, master_vblank_irq) - MCFG_CPU_ADD("sub", M6809, MASTER_CLOCK/12) /* 1.536 MHz */ + MCFG_CPU_ADD("sub", KONAMI1, MASTER_CLOCK/12) /* 1.536 MHz */ MCFG_CPU_PROGRAM_MAP(main_cpu2_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", gyruss_state, slave_vblank_irq) @@ -681,7 +681,6 @@ ROM_END DRIVER_INIT_MEMBER(gyruss_state,gyruss) { - konami1_decode(machine(), "sub"); } diff --git a/src/mame/drivers/hyperspt.c b/src/mame/drivers/hyperspt.c index 826e5e278c0..bbbe2f74a26 100644 --- a/src/mame/drivers/hyperspt.c +++ b/src/mame/drivers/hyperspt.c @@ -292,7 +292,7 @@ INTERRUPT_GEN_MEMBER(hyperspt_state::vblank_irq) static MACHINE_CONFIG_START( hyperspt, hyperspt_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6809, XTAL_18_432MHz/12) /* verified on pcb */ + MCFG_CPU_ADD("maincpu", KONAMI1, XTAL_18_432MHz/12) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(hyperspt_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", hyperspt_state, vblank_irq) @@ -544,7 +544,6 @@ ROM_END DRIVER_INIT_MEMBER(hyperspt_state,hyperspt) { - konami1_decode(machine(), "maincpu"); } diff --git a/src/mame/drivers/igs017.c b/src/mame/drivers/igs017.c index 2a76f9ecc59..c049153dde3 100644 --- a/src/mame/drivers/igs017.c +++ b/src/mame/drivers/igs017.c @@ -72,7 +72,8 @@ public: m_screen(*this, "screen"), m_palette(*this, "palette"), m_generic_paletteram_8(*this, "paletteram"), - m_generic_paletteram_16(*this, "paletteram") + m_generic_paletteram_16(*this, "paletteram"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } int m_input_addr; @@ -89,6 +90,7 @@ public: required_device<palette_device> m_palette; optional_shared_ptr<UINT8> m_generic_paletteram_8; optional_shared_ptr<UINT16> m_generic_paletteram_16; + optional_shared_ptr<UINT8> m_decrypted_opcodes; void igs025_to_igs022_callback( void ); @@ -847,14 +849,12 @@ DRIVER_INIT_MEMBER(igs017_state,starzan) int size = 0x040000; UINT8 *data = memregion("maincpu")->base(); - UINT8 *code = auto_alloc_array(machine(), UINT8, size); + UINT8 *code = m_decrypted_opcodes; memcpy(code, data, size); starzan_decrypt(data, size, false); // data starzan_decrypt(code, size, true); // opcodes - m_maincpu->space(AS_PROGRAM).set_decrypted_region(0x00000, 0x3ffff, code); - mgcs_flip_sprites(); } @@ -1349,6 +1349,10 @@ static ADDRESS_MAP_START( iqblocka_map, AS_PROGRAM, 8, igs017_state ) AM_RANGE( 0x10000, 0x3ffff ) AM_ROM ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, igs017_state ) + AM_RANGE( 0x00000, 0x3ffff ) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + WRITE8_MEMBER(igs017_state::nmi_enable_w) { m_nmi_enable = data & 1; @@ -3706,6 +3710,10 @@ static MACHINE_CONFIG_START( iqblocka, igs017_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( starzan, iqblocka ) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END // mgcs @@ -4669,5 +4677,5 @@ GAME( 1998, lhzb2a, lhzb2, lhzb2a, lhzb2a, igs017_state, lhzb2a, ROT GAME( 1998, slqz2, 0, slqz2, slqz2, igs017_state, slqz2, ROT0, "IGS", "Mahjong Shuang Long Qiang Zhu 2 (VS203J)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION ) GAME( 1999?, tarzan, 0, iqblocka, iqblocka, igs017_state, tarzan, ROT0, "IGS", "Tarzan (V109C)", GAME_NOT_WORKING ) GAME( 1999?, tarzana, tarzan, iqblocka, iqblocka, igs017_state, tarzana, ROT0, "IGS", "Tarzan (V107)", GAME_NOT_WORKING ) -GAME( 2000?, starzan, 0, iqblocka, iqblocka, igs017_state, starzan, ROT0, "IGS / G.F. Gioca", "Super Tarzan (Italy, V100I)", GAME_NOT_WORKING ) +GAME( 2000?, starzan, 0, starzan, iqblocka, igs017_state, starzan, ROT0, "IGS / G.F. Gioca", "Super Tarzan (Italy, V100I)", GAME_NOT_WORKING ) GAME( ????, spkrform, spk116it, spkrform, spkrform, igs017_state, spkrform, ROT0, "IGS", "Super Poker (v100xD03) / Formosa", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION ) diff --git a/src/mame/drivers/jack.c b/src/mame/drivers/jack.c index 79148e92564..9b5d0132922 100644 --- a/src/mame/drivers/jack.c +++ b/src/mame/drivers/jack.c @@ -192,6 +192,10 @@ static ADDRESS_MAP_START( jack_map, AS_PROGRAM, 8, jack_state ) AM_RANGE(0xc000, 0xffff) AM_ROM ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, jack_state ) + AM_RANGE(0x0000, 0x3fff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( striv_map, AS_PROGRAM, 8, jack_state ) AM_RANGE(0xb000, 0xb0ff) AM_WRITENOP AM_RANGE(0xc000, 0xcfff) AM_READ(striv_question_r) @@ -929,6 +933,11 @@ static MACHINE_CONFIG_START( jack, jack_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( treahunt, jack ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( striv, jack ) @@ -1442,23 +1451,17 @@ DRIVER_INIT_MEMBER(jack_state,zzyzzyxx) void jack_state::treahunt_decode( ) { - int A; - address_space &space = m_maincpu->space(AS_PROGRAM); UINT8 *rom = memregion("maincpu")->base(); - UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x4000); - int data; - - space.set_decrypted_region(0x0000, 0x3fff, decrypt); /* Thanks to Mike Balfour for helping out with the decryption */ - for (A = 0; A < 0x4000; A++) + for (int A = 0; A < 0x4000; A++) { - data = rom[A]; + UINT8 data = rom[A]; if (A & 0x1000) { /* unencrypted = D0 D2 D5 D1 D3 D6 D4 D7 */ - decrypt[A] = + m_decrypted_opcodes[A] = ((data & 0x01) << 7) | ((data & 0x02) << 3) | ((data & 0x04) << 4) | @@ -1469,12 +1472,12 @@ void jack_state::treahunt_decode( ) if ((A & 0x04) == 0) /* unencrypted = !D0 D2 D5 D1 D3 D6 D4 !D7 */ - decrypt[A] ^= 0x81; + m_decrypted_opcodes[A] ^= 0x81; } else { /* unencrypted = !D7 D2 D5 D1 D3 D6 D4 !D0 */ - decrypt[A] = + m_decrypted_opcodes[A] = (~data & 0x81) | ((data & 0x02) << 3) | ((data & 0x04) << 4) | @@ -1555,7 +1558,7 @@ DRIVER_INIT_MEMBER(jack_state,striv) GAME( 1982, jack, 0, jack, jack, jack_state, jack, ROT90, "Hara Industries (Cinematronics license)", "Jack the Giantkiller (set 1)", GAME_SUPPORTS_SAVE ) GAME( 1982, jack2, jack, jack, jack2, jack_state, jack, ROT90, "Hara Industries (Cinematronics license)", "Jack the Giantkiller (set 2)", GAME_SUPPORTS_SAVE ) GAME( 1982, jack3, jack, jack, jack3, jack_state, jack, ROT90, "Hara Industries (Cinematronics license)", "Jack the Giantkiller (set 3)", GAME_SUPPORTS_SAVE ) -GAME( 1982, treahunt, jack, jack, treahunt, jack_state, treahunt, ROT90, "Hara Industries", "Treasure Hunt", GAME_SUPPORTS_SAVE ) +GAME( 1982, treahunt, jack, treahunt, treahunt, jack_state, treahunt, ROT90, "Hara Industries", "Treasure Hunt", GAME_SUPPORTS_SAVE ) GAME( 1982, zzyzzyxx, 0, jack, zzyzzyxx, jack_state, zzyzzyxx, ROT90, "Cinematronics / Advanced Microcomputer Systems", "Zzyzzyxx (set 1)", GAME_SUPPORTS_SAVE ) GAME( 1982, zzyzzyxx2, zzyzzyxx, jack, zzyzzyxx, jack_state, zzyzzyxx, ROT90, "Cinematronics / Advanced Microcomputer Systems", "Zzyzzyxx (set 2)", GAME_SUPPORTS_SAVE ) GAME( 1982, brix, zzyzzyxx, jack, zzyzzyxx, jack_state, zzyzzyxx, ROT90, "Cinematronics / Advanced Microcomputer Systems", "Brix", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/jailbrek.c b/src/mame/drivers/jailbrek.c index 0142f42e7a9..2a58c3df652 100644 --- a/src/mame/drivers/jailbrek.c +++ b/src/mame/drivers/jailbrek.c @@ -246,7 +246,7 @@ void jailbrek_state::machine_reset() static MACHINE_CONFIG_START( jailbrek, jailbrek_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6809, MASTER_CLOCK/12) + MCFG_CPU_ADD("maincpu", KONAMI1, MASTER_CLOCK/12) MCFG_CPU_PROGRAM_MAP(jailbrek_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", jailbrek_state, jb_interrupt) MCFG_CPU_PERIODIC_INT_DRIVER(jailbrek_state, jb_interrupt_nmi, 500) /* ? */ @@ -414,8 +414,6 @@ DRIVER_INIT_MEMBER(jailbrek_state,jailbrek) SPEECH_ROM[ind] = SPEECH_ROM[ind + 0x2000]; } } - - konami1_decode(machine(), "maincpu"); } GAME( 1986, jailbrek, 0, jailbrek, jailbrek, jailbrek_state, jailbrek, ROT0, "Konami", "Jail Break", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/jongkyo.c b/src/mame/drivers/jongkyo.c index 5b13a9ee921..4536391be9b 100644 --- a/src/mame/drivers/jongkyo.c +++ b/src/mame/drivers/jongkyo.c @@ -139,6 +139,7 @@ WRITE8_MEMBER(jongkyo_state::bank_select_w) m_rom_bank |= mask; membank("bank1")->set_entry(m_rom_bank); + membank("bank1d")->set_entry(m_rom_bank); } WRITE8_MEMBER(jongkyo_state::mux_w) @@ -243,6 +244,11 @@ static ADDRESS_MAP_START( jongkyo_memmap, AS_PROGRAM, 8, jongkyo_state ) AM_RANGE(0x8000, 0xffff) AM_RAM AM_SHARE("videoram") ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, jongkyo_state ) + AM_RANGE(0x0000, 0x6bff) AM_ROMBANK("bank0d") + AM_RANGE(0x6c00, 0x6fff) AM_ROMBANK("bank1d") +ADDRESS_MAP_END + static ADDRESS_MAP_START( jongkyo_portmap, AS_IO, 8, jongkyo_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) @@ -488,6 +494,7 @@ static MACHINE_CONFIG_START( jongkyo, jongkyo_state ) MCFG_CPU_ADD("maincpu", Z80,JONGKYO_CLOCK/4) MCFG_CPU_PROGRAM_MAP(jongkyo_memmap) MCFG_CPU_IO_MAP(jongkyo_portmap) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", jongkyo_state, irq0_line_hold) @@ -518,12 +525,13 @@ MACHINE_CONFIG_END *************************************/ ROM_START( jongkyo ) - ROM_REGION( 0x9000, "maincpu", 0 ) + ROM_REGION( 0x8c00, "maincpu", 0 ) ROM_LOAD( "epr-6258", 0x00000, 0x02000, CRC(fb8b7bcc) SHA1(8ece7c2c82c237b4b51829d412b2109b96ccd0e7) ) ROM_LOAD( "epr-6259", 0x02000, 0x02000, CRC(e46cde5d) SHA1(1cbe1677cfb3fa9f76ad90d5b1446ce9cefee6b7) ) ROM_LOAD( "epr-6260", 0x04000, 0x02000, CRC(369a5365) SHA1(037a2971a59ab339595b333cbdfd4cbb104de2be) ) - ROM_LOAD( "epr-6262", 0x06000, 0x01000, CRC(ecf50f34) SHA1(ecfa1a9360d8fbcbed457d46e53bae77f6d78c1d) ) - ROM_LOAD( "epr-6261", 0x07000, 0x02000, CRC(9c475ae1) SHA1(b993c2636dafed9f80fa87e71921c3c85c039e45) ) // banked at 6c00-6fff + ROM_LOAD( "epr-6262", 0x06000, 0x00c00, CRC(ecf50f34) SHA1(ecfa1a9360d8fbcbed457d46e53bae77f6d78c1d) ) + ROM_IGNORE(0x400) + ROM_LOAD( "epr-6261", 0x06c00, 0x02000, CRC(9c475ae1) SHA1(b993c2636dafed9f80fa87e71921c3c85c039e45) ) // banked at 6c00-6fff ROM_REGION( 0x300, "proms", 0 ) /* colours */ @@ -544,17 +552,44 @@ ROM_END DRIVER_INIT_MEMBER(jongkyo_state,jongkyo) { - int i; + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x28,0x08,0xa8,0x88 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...0...0...0 */ + { 0x80,0x88,0xa0,0xa8 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...0...0...1 */ + { 0xa0,0xa8,0x20,0x28 }, { 0x20,0xa0,0x00,0x80 }, /* ...0...0...1...0 */ + { 0xa0,0xa8,0x20,0x28 }, { 0x80,0x88,0xa0,0xa8 }, /* ...0...0...1...1 */ + { 0x08,0x88,0x00,0x80 }, { 0x08,0x88,0x00,0x80 }, /* ...0...1...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x08,0x88,0x00,0x80 }, /* ...0...1...0...1 */ + { 0x20,0xa0,0x00,0x80 }, { 0x20,0xa0,0x00,0x80 }, /* ...0...1...1...0 */ + { 0x08,0x88,0x00,0x80 }, { 0x08,0x88,0x00,0x80 }, /* ...0...1...1...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0xa8,0x20,0x28 }, /* ...1...0...0...0 */ + { 0x80,0x88,0xa0,0xa8 }, { 0x80,0x88,0xa0,0xa8 }, /* ...1...0...0...1 */ + { 0xa0,0xa8,0x20,0x28 }, { 0x20,0xa0,0x00,0x80 }, /* ...1...0...1...0 */ + { 0xa0,0xa8,0x20,0x28 }, { 0x80,0x88,0xa0,0xa8 }, /* ...1...0...1...1 */ + { 0x08,0x88,0x00,0x80 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...1...0...0 */ + { 0x08,0x88,0x00,0x80 }, { 0x80,0x88,0xa0,0xa8 }, /* ...1...1...0...1 */ + { 0x28,0x08,0xa8,0x88 }, { 0x20,0xa0,0x00,0x80 }, /* ...1...1...1...0 */ + { 0x80,0x88,0xa0,0xa8 }, { 0x08,0x88,0x00,0x80 } /* ...1...1...1...1 */ + }; + UINT8 *rom = memregion("maincpu")->base(); /* first of all, do a simple bitswap */ - for (i = 0x6000; i < 0x9000; ++i) + for (int i = 0x6000; i < 0x8c00; ++i) { rom[i] = BITSWAP8(rom[i], 7,6,5,3,4,2,1,0); } + UINT8 *opcodes = auto_alloc_array(machine(), UINT8, 0x6c00+0x400*8); + /* then do the standard Sega decryption */ - jongkyo_decode(machine(), "maincpu"); + sega_decode(rom, opcodes, 0x6c00, convtable, 8, 0x400); + + membank("bank1")->configure_entries(0, 8, rom+0x6c00, 0x400); + membank("bank1d")->configure_entries(0, 8, opcodes+0x6c00, 0x400); + membank("bank0d")->set_base(opcodes); } diff --git a/src/mame/drivers/junofrst.c b/src/mame/drivers/junofrst.c index a5f0180aefd..57bc3dfb294 100644 --- a/src/mame/drivers/junofrst.c +++ b/src/mame/drivers/junofrst.c @@ -409,7 +409,7 @@ INTERRUPT_GEN_MEMBER(junofrst_state::_30hz_irq) static MACHINE_CONFIG_START( junofrst, junofrst_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6809, 1500000) /* 1.5 MHz ??? */ + MCFG_CPU_ADD("maincpu", KONAMI1, 1500000) /* 1.5 MHz ??? */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", junofrst_state, _30hz_irq) @@ -507,10 +507,7 @@ ROM_END DRIVER_INIT_MEMBER(junofrst_state,junofrst) { - UINT8 *decrypted = konami1_decode(machine(), "maincpu"); - membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x1000); - membank("bank1")->configure_decrypted_entries(0, 16, decrypted + 0x10000, 0x1000); } diff --git a/src/mame/drivers/kchamp.c b/src/mame/drivers/kchamp.c index 754b464929f..79f2260bffd 100644 --- a/src/mame/drivers/kchamp.c +++ b/src/mame/drivers/kchamp.c @@ -115,6 +115,10 @@ static ADDRESS_MAP_START( kchampvs_map, AS_PROGRAM, 8, kchamp_state ) AM_RANGE(0xe000, 0xffff) AM_ROM ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, kchamp_state ) + AM_RANGE(0x0000, 0xffff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( kchampvs_io_map, AS_IO, 8, kchamp_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_READ_PORT("P1") AM_WRITE(kchamp_flipscreen_w) @@ -400,6 +404,7 @@ static MACHINE_CONFIG_START( kchampvs, kchamp_state ) MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz/4) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(kchampvs_map) MCFG_CPU_IO_MAP(kchampvs_io_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", kchamp_state, kc_interrupt) MCFG_CPU_ADD("audiocpu", Z80, XTAL_12MHz/4) /* verified on pcb */ @@ -701,26 +706,19 @@ ROM_START( karatevs ) ROM_END -UINT8 *kchamp_state::decrypt_code() +void kchamp_state::decrypt_code() { - address_space &space = m_maincpu->space(AS_PROGRAM); - UINT8 *decrypted = auto_alloc_array(machine(), UINT8, 0x10000); UINT8 *rom = memregion("maincpu")->base(); - int A; - - space.set_decrypted_region(0x0000, 0xffff, decrypted); - - for (A = 0; A < 0x10000; A++) - decrypted[A] = (rom[A] & 0x55) | ((rom[A] & 0x88) >> 2) | ((rom[A] & 0x22) << 2); - - return decrypted; + for (int A = 0; A < 0x10000; A++) + m_decrypted_opcodes[A] = (rom[A] & 0x55) | ((rom[A] & 0x88) >> 2) | ((rom[A] & 0x22) << 2); } DRIVER_INIT_MEMBER(kchamp_state,kchampvs) { + decrypt_code(); + UINT8 *rom = memregion("maincpu")->base(); - UINT8 *decrypted = decrypt_code(); int A; /* @@ -732,14 +730,14 @@ DRIVER_INIT_MEMBER(kchamp_state,kchampvs) turns the encryption on, but this doesn't explain the encrypted address for the jump. */ - decrypted[0] = rom[0]; /* this is a jump */ + m_decrypted_opcodes[0] = rom[0]; /* this is a jump */ A = rom[1] + 256 * rom[2]; - decrypted[A] = rom[A]; /* fix opcode on first jump address (again, a jump) */ + m_decrypted_opcodes[A] = rom[A]; /* fix opcode on first jump address (again, a jump) */ rom[A+1] ^= 0xee; /* fix address of the second jump */ A = rom[A+1] + 256 * rom[A+2]; - decrypted[A] = rom[A]; /* fix third opcode (ld a,$xx) */ + m_decrypted_opcodes[A] = rom[A]; /* fix third opcode (ld a,$xx) */ A += 2; - decrypted[A] = rom[A]; /* fix fourth opcode (ld ($xxxx),a */ + m_decrypted_opcodes[A] = rom[A]; /* fix fourth opcode (ld ($xxxx),a */ /* and from here on, opcodes are encrypted */ m_counter = 0; diff --git a/src/mame/drivers/ladybug.c b/src/mame/drivers/ladybug.c index 51613cf3235..6f12067e4f9 100644 --- a/src/mame/drivers/ladybug.c +++ b/src/mame/drivers/ladybug.c @@ -142,6 +142,10 @@ static ADDRESS_MAP_START( ladybug_map, AS_PROGRAM, 8, ladybug_state ) AM_RANGE(0xe000, 0xe000) AM_READ_PORT("IN2") ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, ladybug_state ) + AM_RANGE(0x0000, 0x5fff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( sraider_cpu1_map, AS_PROGRAM, 8, ladybug_state ) AM_RANGE(0x0000, 0x5fff) AM_ROM @@ -786,6 +790,10 @@ static MACHINE_CONFIG_START( ladybug, ladybug_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( dorodon, ladybug ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END static MACHINE_CONFIG_START( sraider, ladybug_state ) @@ -1043,15 +1051,11 @@ DRIVER_INIT_MEMBER(ladybug_state,dorodon) /* decode the opcodes */ offs_t i; - address_space &space = m_maincpu->space(AS_PROGRAM); - UINT8 *decrypted = auto_alloc_array(machine(), UINT8, 0x6000); UINT8 *rom = memregion("maincpu")->base(); UINT8 *table = memregion("user1")->base(); - space.set_decrypted_region(0x0000, 0x5fff, decrypted); - for (i = 0; i < 0x6000; i++) - decrypted[i] = table[rom[i]]; + m_decrypted_opcodes[i] = table[rom[i]]; } @@ -1059,7 +1063,7 @@ GAME( 1981, cavenger, 0, ladybug, cavenger, driver_device, 0, ROT0, GAME( 1981, ladybug, 0, ladybug, ladybug, driver_device, 0, ROT270, "Universal", "Lady Bug", GAME_SUPPORTS_SAVE ) GAME( 1981, ladybugb, ladybug, ladybug, ladybug, driver_device, 0, ROT270, "bootleg", "Lady Bug (bootleg set 1)", GAME_SUPPORTS_SAVE ) GAME( 1981, ladybgb2, ladybug, ladybug, ladybug, driver_device, 0, ROT270, "bootleg", "Lady Bug (bootleg set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1982, dorodon, 0, ladybug, dorodon, ladybug_state, dorodon, ROT270, "UPL (Falcon license?)", "Dorodon (set 1)", GAME_SUPPORTS_SAVE ) // license or bootleg? -GAME( 1982, dorodon2, dorodon, ladybug, dorodon, ladybug_state, dorodon, ROT270, "UPL (Falcon license?)", "Dorodon (set 2)", GAME_SUPPORTS_SAVE ) // " +GAME( 1982, dorodon, 0, dorodon, dorodon, ladybug_state, dorodon, ROT270, "UPL (Falcon license?)", "Dorodon (set 1)", GAME_SUPPORTS_SAVE ) // license or bootleg? +GAME( 1982, dorodon2, dorodon, dorodon, dorodon, ladybug_state, dorodon, ROT270, "UPL (Falcon license?)", "Dorodon (set 2)", GAME_SUPPORTS_SAVE ) // " GAME( 1982, snapjack, 0, ladybug, snapjack, driver_device, 0, ROT0, "Universal", "Snap Jack", GAME_SUPPORTS_SAVE ) GAME( 1982, sraider, 0, sraider, sraider, driver_device, 0, ROT270, "Universal", "Space Raider", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/liberate.c b/src/mame/drivers/liberate.c index 824ca2fc9e1..42a67e605df 100644 --- a/src/mame/drivers/liberate.c +++ b/src/mame/drivers/liberate.c @@ -263,6 +263,10 @@ static ADDRESS_MAP_START( liberate_map, AS_PROGRAM, 8, liberate_state ) AM_RANGE(0x8000, 0xffff) AM_ROM ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, liberate_state ) + AM_RANGE(0x8000, 0xffff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( prosoccr_map, AS_PROGRAM, 8, liberate_state ) AM_RANGE(0x0000, 0x0fff) AM_RAM AM_RANGE(0x1000, 0x3fff) AM_ROM /* Mirror of main rom */ @@ -719,7 +723,7 @@ MACHINE_RESET_MEMBER(liberate_state,liberate) m_bank = 0; } -static MACHINE_CONFIG_START( liberate, liberate_state ) +static MACHINE_CONFIG_START( liberate_base, liberate_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu",DECO16, 2000000) @@ -761,7 +765,12 @@ static MACHINE_CONFIG_START( liberate, liberate_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( liberatb, liberate ) +static MACHINE_CONFIG_DERIVED( liberate, liberate_base ) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( liberatb, liberate_base ) /* basic machine hardware */ MCFG_CPU_REPLACE("maincpu", M6502, 2000000) @@ -769,14 +778,14 @@ static MACHINE_CONFIG_DERIVED( liberatb, liberate ) MCFG_CPU_VBLANK_INT_DRIVER("screen", liberate_state, deco16_interrupt) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( boomrang, liberate ) +static MACHINE_CONFIG_DERIVED( boomrang, liberate_base ) MCFG_VIDEO_START_OVERRIDE(liberate_state,boomrang) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_UPDATE_DRIVER(liberate_state, screen_update_boomrang) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( prosoccr, liberate ) +static MACHINE_CONFIG_DERIVED( prosoccr, liberate_base ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") @@ -1268,21 +1277,14 @@ DRIVER_INIT_MEMBER(liberate_state,yellowcb) DRIVER_INIT_MEMBER(liberate_state,liberate) { - int A; - address_space &space = m_maincpu->space(AS_PROGRAM); - UINT8 *decrypted = auto_alloc_array(machine(), UINT8, 0x10000); UINT8 *ROM = memregion("maincpu")->base(); - space.set_decrypted_region(0x0000, 0xffff, decrypted); - /* Swap bits for opcodes only, not data */ - for (A = 0; A < 0x10000; A++) { - decrypted[A] = (ROM[A] & 0xd7) | ((ROM[A] & 0x08) << 2) | ((ROM[A] & 0x20) >> 2); - decrypted[A] = (decrypted[A] & 0xbb) | ((decrypted[A] & 0x04) << 4) | ((decrypted[A] & 0x40) >> 4); - decrypted[A] = (decrypted[A] & 0x7d) | ((decrypted[A] & 0x02) << 6) | ((decrypted[A] & 0x80) >> 6); + for (int A = 0; A < 0x8000; A++) { + m_decrypted_opcodes[A] = (ROM[A+0x8000] & 0xd7) | ((ROM[A+0x8000] & 0x08) << 2) | ((ROM[A+0x8000] & 0x20) >> 2); + m_decrypted_opcodes[A] = (m_decrypted_opcodes[A] & 0xbb) | ((m_decrypted_opcodes[A] & 0x04) << 4) | ((m_decrypted_opcodes[A] & 0x40) >> 4); + m_decrypted_opcodes[A] = (m_decrypted_opcodes[A] & 0x7d) | ((m_decrypted_opcodes[A] & 0x02) << 6) | ((m_decrypted_opcodes[A] & 0x80) >> 6); } - - membank("bank1")->configure_decrypted_entry(0, decrypted + 0x8000); } /************************************* diff --git a/src/mame/drivers/megazone.c b/src/mame/drivers/megazone.c index 5a82b24de3a..e5bc1f41ff9 100644 --- a/src/mame/drivers/megazone.c +++ b/src/mame/drivers/megazone.c @@ -234,7 +234,7 @@ INTERRUPT_GEN_MEMBER(megazone_state::vblank_irq) static MACHINE_CONFIG_START( megazone, megazone_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6809, 18432000/9) /* 2 MHz */ + MCFG_CPU_ADD("maincpu", KONAMI1, 18432000/9) /* 2 MHz */ MCFG_CPU_PROGRAM_MAP(megazone_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", megazone_state, vblank_irq) @@ -506,7 +506,6 @@ ROM_END DRIVER_INIT_MEMBER(megazone_state,megazone) { - konami1_decode(machine(), "maincpu"); } GAME( 1983, megazone, 0, megazone, megazone, megazone_state, megazone, ROT90, "Konami", "Mega Zone (Konami set 1)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/mitchell.c b/src/mame/drivers/mitchell.c index c1ce0a6e4e4..aac45ebe430 100644 --- a/src/mame/drivers/mitchell.c +++ b/src/mame/drivers/mitchell.c @@ -121,6 +121,7 @@ WRITE8_MEMBER(mitchell_state::eeprom_serial_w) WRITE8_MEMBER(mitchell_state::pang_bankswitch_w) { membank("bank1")->set_entry(data & 0x0f); + membank("bank1d")->set_entry(data & 0x0f); } /************************************* @@ -280,6 +281,11 @@ static ADDRESS_MAP_START( mitchell_map, AS_PROGRAM, 8, mitchell_state ) AM_RANGE(0xe000, 0xffff) AM_RAM /* Work RAM */ ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, mitchell_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROMBANK("bank0d") + AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1d") +ADDRESS_MAP_END + static ADDRESS_MAP_START( mitchell_io_map, AS_IO, 8, mitchell_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_WRITE(pang_gfxctrl_w) /* Palette bank, layer enable, coin counters, more */ @@ -1115,6 +1121,7 @@ static MACHINE_CONFIG_START( pang, mitchell_state ) MCFG_CPU_ADD("maincpu",Z80, XTAL_16MHz/2) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(mitchell_map) MCFG_CPU_IO_MAP(mitchell_io_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mitchell_state, mitchell_irq, "screen", 0, 1) MCFG_MACHINE_START_OVERRIDE(mitchell_state,mitchell) @@ -1187,6 +1194,7 @@ static MACHINE_CONFIG_DERIVED( spangbl, pangnv ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(spangbl_map) MCFG_CPU_IO_MAP(spangbl_io_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", mitchell_state, irq0_line_hold) MCFG_DEVICE_REMOVE("scantimer") @@ -1215,6 +1223,7 @@ static MACHINE_CONFIG_START( mstworld, mitchell_state ) MCFG_CPU_ADD("maincpu", Z80, 6000000*4) MCFG_CPU_PROGRAM_MAP(mitchell_map) MCFG_CPU_IO_MAP(mstworld_io_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", mitchell_state, irq0_line_hold) MCFG_CPU_ADD("audiocpu", Z80,6000000) /* 6 MHz? */ @@ -1253,6 +1262,7 @@ static MACHINE_CONFIG_START( marukin, mitchell_state ) MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz/2) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(mitchell_map) MCFG_CPU_IO_MAP(mitchell_io_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mitchell_state, mitchell_irq, "screen", 0, 1) MCFG_EEPROM_SERIAL_93C46_ADD("eeprom") @@ -1307,6 +1317,7 @@ static MACHINE_CONFIG_START( pkladiesbl, mitchell_state ) MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz/2) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(mitchell_map) MCFG_CPU_IO_MAP(mitchell_io_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mitchell_state, mitchell_irq, "screen", 0, 1) MCFG_EEPROM_SERIAL_93C46_ADD("eeprom") @@ -2085,58 +2096,58 @@ ROM_END * *************************************/ -void mitchell_state::bootleg_decode( ) +void mitchell_state::bootleg_decode() { - address_space &space = m_maincpu->space(AS_PROGRAM); - space.set_decrypted_region(0x0000, 0x7fff, memregion("maincpu")->base() + 0x50000); - membank("bank1")->configure_decrypted_entries(0, 16, memregion("maincpu")->base() + 0x60000, 0x4000); + membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x4000); + membank("bank0d")->set_base(memregion("maincpu")->base() + 0x50000); + membank("bank1d")->configure_entries(0, 16, memregion("maincpu")->base() + 0x60000, 0x4000); } -void mitchell_state::configure_banks( ) +void mitchell_state::configure_banks(void (*decode)(UINT8 *src, UINT8 *dst, int size)) { - membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x4000); + UINT8 *src = memregion("maincpu")->base(); + int size = memregion("maincpu")->bytes(); + UINT8 *dst = auto_alloc_array(machine(), UINT8, size); + decode(src, dst, size); + membank("bank1")->configure_entries(0, 16, src + 0x10000, 0x4000); + membank("bank0d")->set_base(dst); + membank("bank1d")->configure_entries(0, 16, dst + 0x10000, 0x4000); } DRIVER_INIT_MEMBER(mitchell_state,dokaben) { m_input_type = 0; - mgakuen2_decode(machine()); - configure_banks(); + configure_banks(mgakuen2_decode); } DRIVER_INIT_MEMBER(mitchell_state,pang) { m_input_type = 0; - pang_decode(machine()); - configure_banks(); + configure_banks(pang_decode); } DRIVER_INIT_MEMBER(mitchell_state,pangb) { m_input_type = 0; bootleg_decode(); - configure_banks(); if (m_nvram != NULL) m_nvram->set_base(&m_dummy_nvram, sizeof(m_dummy_nvram)); /* for pangba */ } DRIVER_INIT_MEMBER(mitchell_state,cworld) { m_input_type = 0; - cworld_decode(machine()); - configure_banks(); + configure_banks(cworld_decode); } DRIVER_INIT_MEMBER(mitchell_state,hatena) { m_input_type = 0; - hatena_decode(machine()); - configure_banks(); + configure_banks(hatena_decode); } DRIVER_INIT_MEMBER(mitchell_state,spang) { m_input_type = 3; m_nvram->set_base(&memregion("maincpu")->base()[0xe000], 0x80); /* NVRAM */ - spang_decode(machine()); - configure_banks(); + configure_banks(spang_decode); } DRIVER_INIT_MEMBER(mitchell_state,spangbl) @@ -2144,79 +2155,69 @@ DRIVER_INIT_MEMBER(mitchell_state,spangbl) m_input_type = 3; m_nvram->set_base(&memregion("maincpu")->base()[0xe000], 0x80); /* NVRAM */ bootleg_decode(); - configure_banks(); } DRIVER_INIT_MEMBER(mitchell_state,spangj) { m_input_type = 3; m_nvram->set_base(&memregion("maincpu")->base()[0xe000], 0x80); /* NVRAM */ - spangj_decode(machine()); - configure_banks(); + configure_banks(spangj_decode); } DRIVER_INIT_MEMBER(mitchell_state,sbbros) { m_input_type = 3; m_nvram->set_base(&memregion("maincpu")->base()[0xe000], 0x80); /* NVRAM */ - sbbros_decode(machine()); - configure_banks(); + configure_banks(sbbros_decode); } DRIVER_INIT_MEMBER(mitchell_state,qtono1) { m_input_type = 0; - qtono1_decode(machine()); - configure_banks(); + configure_banks(qtono1_decode); } DRIVER_INIT_MEMBER(mitchell_state,qsangoku) { m_input_type = 0; - qsangoku_decode(machine()); - configure_banks(); + configure_banks(qsangoku_decode); } + DRIVER_INIT_MEMBER(mitchell_state,mgakuen) { m_input_type = 1; - configure_banks(); + membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x4000); m_maincpu->space(AS_IO).install_read_port(0x03, 0x03, "DSW0"); m_maincpu->space(AS_IO).install_read_port(0x04, 0x04, "DSW1"); } DRIVER_INIT_MEMBER(mitchell_state,mgakuen2) { m_input_type = 1; - mgakuen2_decode(machine()); - configure_banks(); + configure_banks(mgakuen2_decode); } DRIVER_INIT_MEMBER(mitchell_state,pkladies) { m_input_type = 1; - mgakuen2_decode(machine()); - configure_banks(); + configure_banks(mgakuen2_decode); } DRIVER_INIT_MEMBER(mitchell_state,pkladiesbl) { m_input_type = 1; bootleg_decode(); - configure_banks(); } DRIVER_INIT_MEMBER(mitchell_state,marukin) { m_input_type = 1; - marukin_decode(machine()); - configure_banks(); + configure_banks(marukin_decode); } DRIVER_INIT_MEMBER(mitchell_state,block) { m_input_type = 2; m_nvram->set_base(&memregion("maincpu")->base()[0xff80], 0x80); /* NVRAM */ - block_decode(machine()); - configure_banks(); + configure_banks(block_decode); } DRIVER_INIT_MEMBER(mitchell_state,blockbl) { m_input_type = 2; m_nvram->set_base(&memregion("maincpu")->base()[0xff80], 0x80); /* NVRAM */ bootleg_decode(); - configure_banks(); } DRIVER_INIT_MEMBER(mitchell_state,mstworld) @@ -2262,7 +2263,6 @@ DRIVER_INIT_MEMBER(mitchell_state,mstworld) } bootleg_decode(); - configure_banks(); } diff --git a/src/mame/drivers/mouser.c b/src/mame/drivers/mouser.c index a953d8f4e73..477b2469d5d 100644 --- a/src/mame/drivers/mouser.c +++ b/src/mame/drivers/mouser.c @@ -75,9 +75,12 @@ static ADDRESS_MAP_START( mouser_map, AS_PROGRAM, 8, mouser_state ) AM_RANGE(0xb800, 0xb800) AM_READ_PORT("P2") AM_WRITE(mouser_sound_interrupt_w) /* byte to sound cpu */ ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, mouser_state ) + AM_RANGE(0x0000, 0x5fff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END static ADDRESS_MAP_START( mouser_sound_map, AS_PROGRAM, 8, mouser_state ) - AM_RANGE(0x0000, 0x1fff) AM_ROM + AM_RANGE(0x0000, 0x0fff) AM_ROM AM_RANGE(0x2000, 0x23ff) AM_RAM AM_RANGE(0x3000, 0x3000) AM_READ(mouser_sound_byte_r) AM_RANGE(0x4000, 0x4000) AM_WRITE(mouser_sound_nmi_clear_w) @@ -199,6 +202,7 @@ static MACHINE_CONFIG_START( mouser, mouser_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 4000000) /* 4 MHz ? */ MCFG_CPU_PROGRAM_MAP(mouser_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", mouser_state, mouser_nmi_interrupt) /* NMI is masked externally */ MCFG_CPU_ADD("audiocpu", Z80, 4000000) /* ??? */ @@ -232,12 +236,12 @@ MACHINE_CONFIG_END ROM_START( mouser ) - ROM_REGION( 0x20000, "maincpu", 0 ) /* 64K for data, 64K for encrypted opcodes */ + ROM_REGION( 0x6000, "maincpu", 0 ) /* 64K for data, 64K for encrypted opcodes */ ROM_LOAD( "m0.5e", 0x0000, 0x2000, CRC(b56e00bc) SHA1(f3b23212590d91f1d19b1c7a98c560fbe5943185) ) ROM_LOAD( "m1.5f", 0x2000, 0x2000, CRC(ae375d49) SHA1(8422f5a4d8560425f0c8612cf6f76029fcfe267c) ) ROM_LOAD( "m2.5j", 0x4000, 0x2000, CRC(ef5817e4) SHA1(5cadc19f20fadf97c95852b280305fe4c75f1d19) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x1000, "audiocpu", 0 ) ROM_LOAD( "m5.3v", 0x0000, 0x1000, CRC(50705eec) SHA1(252cea3498722318638f0c98ae929463ffd7d0d6) ) ROM_REGION( 0x4000, "gfx1", 0 ) @@ -256,12 +260,12 @@ ROM_END ROM_START( mouserc ) - ROM_REGION( 0x20000, "maincpu", 0 ) /* 64K for data, 64K for encrypted opcodes */ + ROM_REGION( 0x6000, "maincpu", 0 ) /* 64K for data, 64K for encrypted opcodes */ ROM_LOAD( "83001.0", 0x0000, 0x2000, CRC(e20f9601) SHA1(f559a470784bda0bee9cab257a548238365acaa6) ) ROM_LOAD( "m1.5f", 0x2000, 0x2000, CRC(ae375d49) SHA1(8422f5a4d8560425f0c8612cf6f76029fcfe267c) ) // 83001.1 ROM_LOAD( "m2.5j", 0x4000, 0x2000, CRC(ef5817e4) SHA1(5cadc19f20fadf97c95852b280305fe4c75f1d19) ) // 83001.2 - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x1000, "audiocpu", 0 ) ROM_LOAD( "m5.3v", 0x0000, 0x1000, CRC(50705eec) SHA1(252cea3498722318638f0c98ae929463ffd7d0d6) ) // 83001.5 ROM_REGION( 0x4000, "gfx1", 0 ) @@ -284,16 +288,12 @@ DRIVER_INIT_MEMBER(mouser_state,mouser) /* Decode the opcodes */ offs_t i; - address_space &space = m_maincpu->space(AS_PROGRAM); UINT8 *rom = memregion("maincpu")->base(); - UINT8 *decrypted = auto_alloc_array(machine(), UINT8, 0x6000); UINT8 *table = memregion("user1")->base(); - space.set_decrypted_region(0x0000, 0x5fff, decrypted); - for (i = 0; i < 0x6000; i++) { - decrypted[i] = table[rom[i]]; + m_decrypted_opcodes[i] = table[rom[i]]; } } diff --git a/src/mame/drivers/mustache.c b/src/mame/drivers/mustache.c index 885c1b2acdf..d08e2d2195c 100644 --- a/src/mame/drivers/mustache.c +++ b/src/mame/drivers/mustache.c @@ -191,8 +191,6 @@ static MACHINE_CONFIG_START( mustache, mustache_state ) MCFG_PALETTE_INIT_OWNER(mustache_state, mustache) /* sound hardware */ - MCFG_DEVICE_ADD("seibu_sound", SEIBU_SOUND, 0) // for seibu_sound_decrypt on the MAIN cpu (not sound) - MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_YM2151_ADD("ymsnd", YM_CLOCK) @@ -272,7 +270,7 @@ DRIVER_INIT_MEMBER(mustache_state,mustache) for (i = 0; i < 2*G2; i++) gfx2[i] = buf[BITSWAP24(i,23,22,21,20,19,18,17,16,15,12,11,10,9,8,7,6,5,4,13,14,3,2,1,0)]; - m_cpu_decrypt->decrypt("maincpu",0x8000); + seibu_sound_device::apply_decrypt(NULL, NULL, 0xc000); } diff --git a/src/mame/drivers/ninjakd2.c b/src/mame/drivers/ninjakd2.c index b1c780d6235..25d8f386d1c 100644 --- a/src/mame/drivers/ninjakd2.c +++ b/src/mame/drivers/ninjakd2.c @@ -374,7 +374,6 @@ static ADDRESS_MAP_START( ninjakd2_main_cpu, AS_PROGRAM, 8, ninjakd2_state ) AM_RANGE(0xfa00, 0xffff) AM_RAM AM_SHARE("spriteram") ADDRESS_MAP_END - static ADDRESS_MAP_START( mnight_main_cpu, AS_PROGRAM, 8, ninjakd2_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") @@ -454,6 +453,12 @@ static ADDRESS_MAP_START( ninjakd2_sound_cpu, AS_PROGRAM, 8, ninjakd2_state ) AM_RANGE(0xf000, 0xf000) AM_WRITE(ninjakd2_pcm_play_w) ADDRESS_MAP_END + +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, ninjakd2_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") + AM_RANGE(0x8000, 0xbfff) AM_ROM AM_REGION("soundcpu", 0x8000) +ADDRESS_MAP_END + static ADDRESS_MAP_START( ninjakd2_sound_io, AS_IO, 8, ninjakd2_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x01) AM_DEVWRITE("2203.1", ym2203_device, write) @@ -909,7 +914,7 @@ MACHINE_RESET_MEMBER(ninjakd2_state,omegaf) /*****************************************************************************/ -static MACHINE_CONFIG_START( ninjakd2, ninjakd2_state ) +static MACHINE_CONFIG_START( ninjakd2_core, ninjakd2_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK_12/2) /* verified */ @@ -956,7 +961,12 @@ static MACHINE_CONFIG_START( ninjakd2, ninjakd2_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( mnight, ninjakd2 ) +static MACHINE_CONFIG_DERIVED( ninjakd2, ninjakd2_core ) + MCFG_CPU_MODIFY("soundcpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( mnight, ninjakd2_core ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") @@ -969,7 +979,7 @@ static MACHINE_CONFIG_DERIVED( mnight, ninjakd2 ) MCFG_DEVICE_REMOVE("pcm") MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( arkarea, ninjakd2 ) +static MACHINE_CONFIG_DERIVED( arkarea, ninjakd2_core ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") @@ -1469,15 +1479,14 @@ void ninjakd2_state::gfx_unscramble() DRIVER_INIT_MEMBER(ninjakd2_state,ninjakd2) { - mc8123_decrypt_rom(machine(), "soundcpu", "user1", NULL, 0); + mc8123_decode(memregion("soundcpu")->base(), m_decrypted_opcodes, memregion("user1")->base(), 0x8000); gfx_unscramble(); } DRIVER_INIT_MEMBER(ninjakd2_state,bootleg) { - address_space &space = m_soundcpu->space(AS_PROGRAM); - space.set_decrypted_region(0x0000, 0x7fff, memregion("soundcpu")->base() + 0x10000); + memcpy(m_decrypted_opcodes, memregion("soundcpu")->base() + 0x10000, 0x8000); gfx_unscramble(); } diff --git a/src/mame/drivers/pacman.c b/src/mame/drivers/pacman.c index 17772c0a202..7c6b1cd941e 100644 --- a/src/mame/drivers/pacman.c +++ b/src/mame/drivers/pacman.c @@ -982,6 +982,10 @@ ADDRESS_MAP_END // The Pacman code uses $5004 and $5005 for LED's and $5007 for coin lockout. This hardware does not // exist on any Pacman or Puckman board I have seen. DW +static ADDRESS_MAP_START( patched_opcodes_map, AS_DECRYPTED_OPCODES, 8, pacman_state ) + AM_RANGE(0x0000, 0x3fff) AM_MIRROR(0x8000) AM_ROM AM_SHARE("patched_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( birdiy_map, AS_PROGRAM, 8, pacman_state ) AM_RANGE(0x0000, 0x3fff) AM_MIRROR(0x8000) AM_ROM @@ -3462,6 +3466,11 @@ static MACHINE_CONFIG_START( pacman, pacman_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( pacmanp, pacman ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(patched_opcodes_map) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( pengojpm, pacman ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(pengojpm_map) @@ -6371,25 +6380,22 @@ ROM_END void pacman_state::maketrax_rom_decode() { - address_space &space = m_maincpu->space(AS_PROGRAM); - UINT8 *decrypted = auto_alloc_array(machine(), UINT8, 0x4000); UINT8 *rom = memregion("maincpu")->base(); /* patch protection using a copy of the opcodes so ROM checksum */ /* tests will not fail */ - space.set_decrypted_region(0x0000, 0x3fff, decrypted); - - memcpy(decrypted,rom,0x4000); - - decrypted[0x0415] = 0xc9; - decrypted[0x1978] = 0x18; - decrypted[0x238e] = 0xc9; - decrypted[0x3ae5] = 0xe6; - decrypted[0x3ae7] = 0x00; - decrypted[0x3ae8] = 0xc9; - decrypted[0x3aed] = 0x86; - decrypted[0x3aee] = 0xc0; - decrypted[0x3aef] = 0xb0; + + memcpy(m_patched_opcodes,rom,0x4000); + + m_patched_opcodes[0x0415] = 0xc9; + m_patched_opcodes[0x1978] = 0x18; + m_patched_opcodes[0x238e] = 0xc9; + m_patched_opcodes[0x3ae5] = 0xe6; + m_patched_opcodes[0x3ae7] = 0x00; + m_patched_opcodes[0x3ae8] = 0xc9; + m_patched_opcodes[0x3aed] = 0x86; + m_patched_opcodes[0x3aee] = 0xc0; + m_patched_opcodes[0x3aef] = 0xb0; } DRIVER_INIT_MEMBER(pacman_state,maketrax) @@ -6403,25 +6409,22 @@ DRIVER_INIT_MEMBER(pacman_state,maketrax) void pacman_state::korosuke_rom_decode() { - address_space &space = m_maincpu->space(AS_PROGRAM); - UINT8 *decrypted = auto_alloc_array(machine(), UINT8, 0x4000); UINT8 *rom = memregion("maincpu")->base(); /* patch protection using a copy of the opcodes so ROM checksum */ /* tests will not fail */ - space.set_decrypted_region(0x0000, 0x3fff, decrypted); - - memcpy(decrypted,rom,0x4000); - - decrypted[0x044c] = 0xc9; - decrypted[0x1973] = 0x18; - decrypted[0x238c] = 0xc9; - decrypted[0x3ae9] = 0xe6; /* not changed */ - decrypted[0x3aeb] = 0x00; - decrypted[0x3aec] = 0xc9; - decrypted[0x3af1] = 0x86; - decrypted[0x3af2] = 0xc0; - decrypted[0x3af3] = 0xb0; + + memcpy(m_patched_opcodes,rom,0x4000); + + m_patched_opcodes[0x044c] = 0xc9; + m_patched_opcodes[0x1973] = 0x18; + m_patched_opcodes[0x238c] = 0xc9; + m_patched_opcodes[0x3ae9] = 0xe6; /* not changed */ + m_patched_opcodes[0x3aeb] = 0x00; + m_patched_opcodes[0x3aec] = 0xc9; + m_patched_opcodes[0x3af1] = 0x86; + m_patched_opcodes[0x3af2] = 0xc0; + m_patched_opcodes[0x3af3] = 0xb0; } DRIVER_INIT_MEMBER(pacman_state,korosuke) @@ -6869,18 +6872,18 @@ GAME( 1985, jumpshotp,jumpshot, pacman, jumpshotp,pacman_state, jumpshot, ROT GAME( 1985, shootbul, 0, pacman, shootbul, pacman_state, jumpshot, ROT90, "Bally Midway", "Shoot the Bull", GAME_SUPPORTS_SAVE ) -GAME( 1981, crush, 0, pacman, maketrax, pacman_state, maketrax, ROT90, "Alpha Denshi Co. / Kural Samno Electric, Ltd.", "Crush Roller (set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1981, crush, 0, pacmanp, maketrax, pacman_state, maketrax, ROT90, "Alpha Denshi Co. / Kural Samno Electric, Ltd.", "Crush Roller (set 1)", GAME_SUPPORTS_SAVE ) GAME( 1981, crush2, crush, pacman, maketrax, driver_device, 0, ROT90, "Alpha Denshi Co. / Kural Esco Electric, Ltd.", "Crush Roller (set 2)", GAME_SUPPORTS_SAVE ) GAME( 1981, crush3, crush, pacman, maketrax, pacman_state, eyes, ROT90, "Alpha Denshi Co. / Kural Electric, Ltd.", "Crush Roller (set 3)", GAME_SUPPORTS_SAVE ) GAME( 1981, crush4, crush, crush4, crush4, driver_device, 0, ROT90, "Alpha Denshi Co. / Kural TWT", "Crush Roller (set 4)", GAME_SUPPORTS_SAVE ) -GAME( 1981, maketrax, crush, pacman, maketrax, pacman_state, maketrax, ROT270, "Alpha Denshi Co. / Kural (Williams license)", "Make Trax (US set 1)", GAME_SUPPORTS_SAVE ) -GAME( 1981, maketrxb, crush, pacman, maketrax, pacman_state, maketrax, ROT270, "Alpha Denshi Co. / Kural (Williams license)", "Make Trax (US set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1981, korosuke, crush, pacman, korosuke, pacman_state, korosuke, ROT90, "Alpha Denshi Co. / Kural Electric, Ltd.", "Korosuke Roller (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1981, maketrax, crush, pacmanp, maketrax, pacman_state, maketrax, ROT270, "Alpha Denshi Co. / Kural (Williams license)", "Make Trax (US set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1981, maketrxb, crush, pacmanp, maketrax, pacman_state, maketrax, ROT270, "Alpha Denshi Co. / Kural (Williams license)", "Make Trax (US set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1981, korosuke, crush, pacmanp, korosuke, pacman_state, korosuke, ROT90, "Alpha Denshi Co. / Kural Electric, Ltd.", "Korosuke Roller (Japan)", GAME_SUPPORTS_SAVE ) GAME( 1981, crushbl, crush, pacman, maketrax, driver_device, 0, ROT90, "bootleg", "Crush Roller (bootleg set 1)", GAME_SUPPORTS_SAVE ) -GAME( 1981, crushbl2, crush, pacman, mbrush, pacman_state, maketrax, ROT90, "bootleg", "Crush Roller (bootleg set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1981, crushbl3, crush, pacman, mbrush, pacman_state, maketrax, ROT90, "bootleg", "Crush Roller (bootleg set 3)", GAME_SUPPORTS_SAVE ) +GAME( 1981, crushbl2, crush, pacmanp, mbrush, pacman_state, maketrax, ROT90, "bootleg", "Crush Roller (bootleg set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1981, crushbl3, crush, pacmanp, mbrush, pacman_state, maketrax, ROT90, "bootleg", "Crush Roller (bootleg set 3)", GAME_SUPPORTS_SAVE ) GAME( 1981, crushs, crush, crushs, crushs, driver_device, 0, ROT90, "bootleg (Sidam)", "Crush Roller (bootleg set 4)", GAME_SUPPORTS_SAVE ) // Sidam PCB, no Sidam text -GAME( 1981, mbrush, crush, pacman, mbrush, pacman_state, maketrax, ROT90, "bootleg", "Magic Brush (bootleg of Crush Roller)", GAME_SUPPORTS_SAVE ) +GAME( 1981, mbrush, crush, pacmanp, mbrush, pacman_state, maketrax, ROT90, "bootleg", "Magic Brush (bootleg of Crush Roller)", GAME_SUPPORTS_SAVE ) GAME( 1981, paintrlr, crush, pacman, paintrlr, driver_device, 0, ROT90, "bootleg", "Paint Roller (bootleg of Crush Roller)", GAME_SUPPORTS_SAVE ) GAME( 1982, eyes, 0, pacman, eyes, pacman_state, eyes, ROT90, "Techstar (Rock-Ola license)", "Eyes (US set 1)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/pbaction.c b/src/mame/drivers/pbaction.c index 6c7daa53a91..5e28dda1937 100644 --- a/src/mame/drivers/pbaction.c +++ b/src/mame/drivers/pbaction.c @@ -84,8 +84,7 @@ WRITE8_MEMBER(pbaction_state::nmi_mask_w) } static ADDRESS_MAP_START( pbaction_map, AS_PROGRAM, 8, pbaction_state ) - AM_RANGE(0x0000, 0x7fff) AM_ROM - AM_RANGE(0x8000, 0xbfff) AM_ROM + AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0xc000, 0xcfff) AM_RAM AM_SHARE("work_ram") AM_RANGE(0xd000, 0xd3ff) AM_RAM_WRITE(pbaction_videoram2_w) AM_SHARE("videoram2") AM_RANGE(0xd400, 0xd7ff) AM_RAM_WRITE(pbaction_colorram2_w) AM_SHARE("colorram2") @@ -102,6 +101,11 @@ static ADDRESS_MAP_START( pbaction_map, AS_PROGRAM, 8, pbaction_state ) AM_RANGE(0xe800, 0xe800) AM_WRITE(pbaction_sh_command_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, pbaction_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") + AM_RANGE(0x8000, 0xbfff) AM_ROM AM_REGION("maincpu", 0x8000) +ADDRESS_MAP_END + static ADDRESS_MAP_START( pbaction_sound_map, AS_PROGRAM, 8, pbaction_state ) AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x4000, 0x47ff) AM_RAM @@ -312,6 +316,11 @@ static MACHINE_CONFIG_START( pbaction, pbaction_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( pbactionx, pbaction ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + /*************************************************************************** @@ -377,7 +386,7 @@ ROM_START( pbaction2 ) ROM_END ROM_START( pbaction3 ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "14.bin", 0x0000, 0x4000, CRC(f17a62eb) SHA1(8dabfc0ad127c154c0293a65df32d52d57dd9755) ) ROM_LOAD( "12.bin", 0x4000, 0x4000, CRC(ec3c64c6) SHA1(6130b80606d717f95e219316c2d3fa0a1980ea1d) ) ROM_LOAD( "13.bin", 0x8000, 0x4000, CRC(c93c851e) SHA1(b41077708fce4ccbcecdeae32af8821ca5322e87) ) @@ -403,7 +412,7 @@ ROM_START( pbaction3 ) ROM_END ROM_START( pbaction4 ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "pinball_09.bin", 0x0000, 0x4000, CRC(c8e81ece) SHA1(04eafbd79263225f6c6fb5f04951b54179144f17) ) ROM_IGNORE(0x4000) ROM_LOAD( "pinball_10.bin", 0x4000, 0x8000, CRC(04b56c7c) SHA1(d09c22fd0235e1c6a9b1978ba69338bb1ae5667d) ) @@ -433,7 +442,7 @@ ROM_START( pbaction4 ) ROM_END ROM_START( pbaction5 ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "p16.bin", 0x0000, 0x4000, CRC(ad20b360) SHA1(91e3cdceb1c170580d926b2ed8359c3100f71b11) ) ROM_LOAD( "c15.bin", 0x4000, 0x4000, CRC(057acfe3) SHA1(49c184d7caea0c0e9f0d0e163f2ef42bb9aebf16) ) ROM_LOAD( "p14.bin", 0x8000, 0x2000, CRC(e7412d68) SHA1(e75731d9bea80e0dc09798dd46e3b947fdb54aaa) ) @@ -479,7 +488,7 @@ DRIVER_INIT_MEMBER(pbaction_state,pbactio3) } /* then do the standard Sega decryption */ - pbaction_decode(machine(), "maincpu"); + DRIVER_INIT_CALL(pbactio4); /* install a protection (?) workaround */ m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000, 0xc000, read8_delegate(FUNC(pbaction_state::pbactio3_prot_kludge_r),this) ); @@ -487,14 +496,36 @@ DRIVER_INIT_MEMBER(pbaction_state,pbactio3) DRIVER_INIT_MEMBER(pbaction_state,pbactio4) { + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0xa8,0xa0,0x88,0x80 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...0...0 */ + { 0x28,0x08,0xa8,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...0...1 */ + { 0x28,0x20,0xa8,0xa0 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...1...0 */ + { 0x28,0x08,0xa8,0x88 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...0...1...1 */ + { 0xa8,0xa0,0x88,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...1...0...0 */ + { 0x28,0x20,0xa8,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...0...1 */ + { 0x28,0x20,0xa8,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...1...0 */ + { 0xa8,0xa0,0x88,0x80 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...1...1 */ + { 0xa8,0xa0,0x88,0x80 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...0...0 */ + { 0x28,0x20,0xa8,0xa0 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...0...0...1 */ + { 0x28,0x20,0xa8,0xa0 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...1...0 */ + { 0x28,0x08,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...1...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...1...0...0 */ + { 0x28,0x20,0xa8,0xa0 }, { 0xa8,0x28,0xa0,0x20 }, /* ...1...1...0...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...1...1...0 */ + { 0xa8,0xa0,0x88,0x80 }, { 0xa8,0x28,0xa0,0x20 } /* ...1...1...1...1 */ + }; + /* this one only has the Sega decryption */ - pbaction_decode(machine(), "maincpu"); + sega_decode(memregion("maincpu")->base(), m_decrypted_opcodes, 0x8000, convtable); } -GAME( 1985, pbaction, 0, pbaction, pbaction, driver_device, 0, ROT90, "Tehkan", "Pinball Action (set 1)", GAME_SUPPORTS_SAVE ) -GAME( 1985, pbaction2, pbaction, pbaction, pbaction, driver_device, 0, ROT90, "Tehkan", "Pinball Action (set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1985, pbaction3, pbaction, pbaction, pbaction, pbaction_state, pbactio3, ROT90, "Tehkan", "Pinball Action (set 3, encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1985, pbaction4, pbaction, pbaction, pbaction, pbaction_state, pbactio4, ROT90, "Tehkan", "Pinball Action (set 4, encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1985, pbaction5, pbaction, pbaction, pbaction, pbaction_state, pbactio4, ROT90, "Tehkan", "Pinball Action (set 5, encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1985, pbaction, 0, pbaction, pbaction, driver_device, 0, ROT90, "Tehkan", "Pinball Action (set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1985, pbaction2, pbaction, pbaction, pbaction, driver_device, 0, ROT90, "Tehkan", "Pinball Action (set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1985, pbaction3, pbaction, pbactionx, pbaction, pbaction_state, pbactio3, ROT90, "Tehkan", "Pinball Action (set 3, encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1985, pbaction4, pbaction, pbactionx, pbaction, pbaction_state, pbactio4, ROT90, "Tehkan", "Pinball Action (set 4, encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1985, pbaction5, pbaction, pbactionx, pbaction, pbaction_state, pbactio4, ROT90, "Tehkan", "Pinball Action (set 5, encrypted)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/pengo.c b/src/mame/drivers/pengo.c index 3548c5b2580..c5e952f88eb 100644 --- a/src/mame/drivers/pengo.c +++ b/src/mame/drivers/pengo.c @@ -73,12 +73,14 @@ class pengo_state : public pacman_state { public: pengo_state(const machine_config &mconfig, device_type type, const char *tag) - : pacman_state(mconfig, type, tag) { } + : pacman_state(mconfig, type, tag), m_decrypted_opcodes(*this, "decrypted_opcodes") { } DECLARE_WRITE8_MEMBER(pengo_coin_counter_w); DECLARE_WRITE8_MEMBER(irq_mask_w); DECLARE_DRIVER_INIT(penta); DECLARE_DRIVER_INIT(pengo); INTERRUPT_GEN_MEMBER(vblank_irq); + + optional_shared_ptr<UINT8> m_decrypted_opcodes; }; @@ -125,7 +127,7 @@ static ADDRESS_MAP_START( pengo_map, AS_PROGRAM, 8, pengo_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x83ff) AM_RAM_WRITE(pacman_videoram_w) AM_SHARE("videoram") /* video and color RAM, scratchpad RAM, sprite codes */ AM_RANGE(0x8400, 0x87ff) AM_RAM_WRITE(pacman_colorram_w) AM_SHARE("colorram") - AM_RANGE(0x8800, 0x8fef) AM_RAM + AM_RANGE(0x8800, 0x8fef) AM_RAM AM_SHARE("mainram") AM_RANGE(0x8ff0, 0x8fff) AM_RAM AM_SHARE("spriteram") AM_RANGE(0x9000, 0x901f) AM_DEVWRITE("namco", namco_device, pacman_sound_w) AM_RANGE(0x9020, 0x902f) AM_WRITEONLY AM_SHARE("spriteram2") @@ -144,6 +146,13 @@ static ADDRESS_MAP_START( pengo_map, AS_PROGRAM, 8, pengo_state ) ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, pengo_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") + AM_RANGE(0x8800, 0x8fef) AM_RAM AM_SHARE("mainram") + AM_RANGE(0x8ff0, 0x8fff) AM_RAM AM_SHARE("spriteram") +ADDRESS_MAP_END + + static ADDRESS_MAP_START( jrpacmbl_map, AS_PROGRAM, 8, pengo_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_RAM_WRITE(jrpacman_videoram_w) AM_SHARE("videoram") @@ -366,6 +375,7 @@ static MACHINE_CONFIG_START( pengo, pengo_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) MCFG_CPU_PROGRAM_MAP(pengo_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", pengo_state, vblank_irq) /* video hardware */ @@ -397,6 +407,7 @@ static MACHINE_CONFIG_DERIVED( jrpacmbl, pengo ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(jrpacmbl_map) + MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_DECRYPTED_OPCODES) MCFG_VIDEO_START_OVERRIDE(pengo_state,jrpacman) MACHINE_CONFIG_END @@ -631,7 +642,29 @@ ROM_END DRIVER_INIT_MEMBER(pengo_state,pengo) { - pengo_decode(machine(), "maincpu"); + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0xa0,0x80,0xa8,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...0...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...0...1 */ + { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...0...1...0 */ + { 0x08,0x28,0x88,0xa8 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...1 */ + { 0x08,0x00,0x88,0x80 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...1...0...0 */ + { 0xa0,0x80,0x20,0x00 }, { 0x08,0x00,0x88,0x80 }, /* ...0...1...0...1 */ + { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...1...1...0 */ + { 0xa0,0x80,0x20,0x00 }, { 0x00,0x08,0x20,0x28 }, /* ...0...1...1...1 */ + { 0x88,0x80,0x08,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...0...0 */ + { 0x88,0x80,0x08,0x00 }, { 0x00,0x08,0x20,0x28 }, /* ...1...0...0...1 */ + { 0x08,0x28,0x88,0xa8 }, { 0x08,0x28,0x88,0xa8 }, /* ...1...0...1...0 */ + { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...1...1 */ + { 0x08,0x00,0x88,0x80 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...0 */ + { 0x00,0x08,0x20,0x28 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...1 */ + { 0x08,0x28,0x88,0xa8 }, { 0x08,0x28,0x88,0xa8 }, /* ...1...1...1...0 */ + { 0x08,0x00,0x88,0x80 }, { 0xa0,0x80,0x20,0x00 } /* ...1...1...1...1 */ + }; + + sega_decode(memregion("maincpu")->base(), m_decrypted_opcodes, 0x8000, convtable); } @@ -677,14 +710,10 @@ DRIVER_INIT_MEMBER(pengo_state,penta) { 0x88,0x0a,0x82,0x00,0xa0,0x22,0xaa,0x28 }, /* ...1...1...0.... */ { 0x88,0x0a,0x82,0x00,0xa0,0x22,0xaa,0x28 } /* ...1...1...1.... */ }; - address_space &space = m_maincpu->space(AS_PROGRAM); - UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x8000); - UINT8 *rom = memregion("maincpu")->base(); - int A; - space.set_decrypted_region(0x0000, 0x7fff, decrypt); + UINT8 *rom = memregion("maincpu")->base(); - for (A = 0x0000;A < 0x8000;A++) + for (int A = 0x0000;A < 0x8000;A++) { int i,j; UINT8 src; @@ -706,7 +735,7 @@ DRIVER_INIT_MEMBER(pengo_state,penta) /* now decode the opcodes */ /* pick the translation table from bits 4, 8 and 12 of the address */ i = ((A >> 4) & 1) + (((A >> 8) & 1) << 1) + (((A >> 12) & 1) << 2); - decrypt[A] = src ^ opcode_xortable[i][j]; + m_decrypted_opcodes[A] = src ^ opcode_xortable[i][j]; } } diff --git a/src/mame/drivers/pktgaldx.c b/src/mame/drivers/pktgaldx.c index c29d8089f28..7dd4af0c82b 100644 --- a/src/mame/drivers/pktgaldx.c +++ b/src/mame/drivers/pktgaldx.c @@ -109,6 +109,10 @@ static ADDRESS_MAP_START( pktgaldx_map, AS_PROGRAM, 16, pktgaldx_state ) AM_RANGE(0x170000, 0x17ffff) AM_RAM ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 16, pktgaldx_state ) + AM_RANGE(0x000000, 0x07ffff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + /* Pocket Gal Deluxe (bootleg!) */ @@ -320,6 +324,7 @@ static MACHINE_CONFIG_START( pktgaldx, pktgaldx_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 14000000) MCFG_CPU_PROGRAM_MAP(pktgaldx_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", pktgaldx_state, irq6_line_hold) @@ -474,7 +479,7 @@ ROM_END DRIVER_INIT_MEMBER(pktgaldx_state,pktgaldx) { deco56_decrypt_gfx(machine(), "gfx1"); - deco102_decrypt_cpu(machine(), "maincpu", 0x42ba, 0x00, 0x00); + deco102_decrypt_cpu((UINT16 *)memregion("maincpu")->base(), m_decrypted_opcodes, 0x80000, 0x42ba, 0x00, 0x00); } GAME( 1992, pktgaldx, 0, pktgaldx, pktgaldx, pktgaldx_state, pktgaldx, ROT0, "Data East Corporation", "Pocket Gal Deluxe (Euro v3.00)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/raiden.c b/src/mame/drivers/raiden.c index 2ffeb0a93d6..dcc96275db7 100644 --- a/src/mame/drivers/raiden.c +++ b/src/mame/drivers/raiden.c @@ -301,7 +301,11 @@ static MACHINE_CONFIG_START( raiden, raiden_state ) SEIBU_SOUND_SYSTEM_YM3812_RAIDEN_INTERFACE(XTAL_14_31818MHz/4,XTAL_12MHz/12) // frequency and pin 7 verified (pin set in audio\seibu.h) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( raidenu, raiden ) +static MACHINE_CONFIG_DERIVED( raidene, raiden ) + SEIBU_SOUND_SYSTEM_ENCRYPTED_FULL() +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( raidenu, raidene ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") @@ -616,7 +620,6 @@ void raiden_state::common_decrypt() DRIVER_INIT_MEMBER(raiden_state,raiden) { common_decrypt(); - m_seibu_sound->decrypt("audiocpu",0x20000); } DRIVER_INIT_MEMBER(raiden_state,raidenk) @@ -626,17 +629,16 @@ DRIVER_INIT_MEMBER(raiden_state,raidenk) DRIVER_INIT_MEMBER(raiden_state,raidenu) { - m_seibu_sound->decrypt("audiocpu",0x20000); } /***************************************************************************/ /* Same PCB, differ by region byte(s) */ -GAME( 1990, raiden, 0, raiden, raiden, raiden_state, raiden, ROT270, "Seibu Kaihatsu", "Raiden (set 1)", GAME_SUPPORTS_SAVE ) -GAME( 1990, raidena, raiden, raiden, raiden, raiden_state, raiden, ROT270, "Seibu Kaihatsu", "Raiden (set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1990, raidenu, raiden, raiden, raiden, raiden_state, raiden, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden (US set 1)", GAME_SUPPORTS_SAVE ) -GAME( 1990, raident, raiden, raiden, raiden, raiden_state, raiden, ROT270, "Seibu Kaihatsu (Liang HWA Electronics license)", "Raiden (Taiwan)", GAME_SUPPORTS_SAVE ) +GAME( 1990, raiden, 0, raidene, raiden, raiden_state, raiden, ROT270, "Seibu Kaihatsu", "Raiden (set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1990, raidena, raiden, raidene, raiden, raiden_state, raiden, ROT270, "Seibu Kaihatsu", "Raiden (set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1990, raidenu, raiden, raidene, raiden, raiden_state, raiden, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden (US set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1990, raident, raiden, raidene, raiden, raiden_state, raiden, ROT270, "Seibu Kaihatsu (Liang HWA Electronics license)", "Raiden (Taiwan)", GAME_SUPPORTS_SAVE ) /* Same as above, but the sound CPU code is not encrypted */ GAME( 1990, raidenk, raiden, raiden, raiden, raiden_state, raidenk, ROT270, "Seibu Kaihatsu (IBL Corporation license)", "Raiden (Korea)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/rocnrope.c b/src/mame/drivers/rocnrope.c index 16c5fd25116..cd39c4af89e 100644 --- a/src/mame/drivers/rocnrope.c +++ b/src/mame/drivers/rocnrope.c @@ -199,7 +199,7 @@ INTERRUPT_GEN_MEMBER(rocnrope_state::vblank_irq) static MACHINE_CONFIG_START( rocnrope, rocnrope_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6809, MASTER_CLOCK / 3 / 4) /* Verified in schematics */ + MCFG_CPU_ADD("maincpu", KONAMI1, MASTER_CLOCK / 3 / 4) /* Verified in schematics */ MCFG_CPU_PROGRAM_MAP(rocnrope_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", rocnrope_state, vblank_irq) @@ -356,14 +356,11 @@ ROM_END DRIVER_INIT_MEMBER(rocnrope_state,rocnrope) { - UINT8 *decrypted = konami1_decode(machine(), "maincpu"); - - decrypted[0x703d] = 0x98; /* fix one instruction */ + memregion("maincpu")->base()[0x703d] = 0x98^0x88; /* fix one instruction */ } DRIVER_INIT_MEMBER(rocnrope_state,rocnropk) { - konami1_decode(machine(), "maincpu"); } diff --git a/src/mame/drivers/sbasketb.c b/src/mame/drivers/sbasketb.c index b59065aec78..707d2be2c77 100644 --- a/src/mame/drivers/sbasketb.c +++ b/src/mame/drivers/sbasketb.c @@ -184,7 +184,7 @@ INTERRUPT_GEN_MEMBER(sbasketb_state::vblank_irq) static MACHINE_CONFIG_START( sbasketb, sbasketb_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6809, 1400000) /* 1.400 MHz ??? */ + MCFG_CPU_ADD("maincpu", KONAMI1, 1400000) /* 1.400 MHz ??? */ MCFG_CPU_PROGRAM_MAP(sbasketb_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", sbasketb_state, vblank_irq) @@ -220,6 +220,13 @@ static MACHINE_CONFIG_START( sbasketb, sbasketb_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END +MACHINE_CONFIG_DERIVED(sbasketbu, sbasketb) + MCFG_DEVICE_REMOVE("maincpu") + MCFG_CPU_ADD("maincpu", M6809, 1400000) /* 1.400 MHz ??? */ + MCFG_CPU_PROGRAM_MAP(sbasketb_map) + MCFG_CPU_VBLANK_INT_DRIVER("screen", sbasketb_state, vblank_irq) +MACHINE_CONFIG_END + /*************************************************************************** @@ -396,10 +403,9 @@ ROM_END DRIVER_INIT_MEMBER(sbasketb_state,sbasketb) { - konami1_decode(machine(), "maincpu"); } -GAME( 1984, sbasketb, 0, sbasketb, sbasketb, sbasketb_state, sbasketb, ROT90, "Konami", "Super Basketball (version I, encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1984, sbasketh, sbasketb, sbasketb, sbasketb, driver_device, 0, ROT90, "Konami", "Super Basketball (version H, unprotected)", GAME_SUPPORTS_SAVE ) -GAME( 1984, sbasketg, sbasketb, sbasketb, sbasketb, sbasketb_state, sbasketb, ROT90, "Konami", "Super Basketball (version G, encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1984, sbaskete, sbasketb, sbasketb, sbasketb, sbasketb_state, sbasketb, ROT90, "Konami", "Super Basketball (version E, encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1984, sbasketb, 0, sbasketb, sbasketb, sbasketb_state, sbasketb, ROT90, "Konami", "Super Basketball (version I, encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1984, sbasketh, sbasketb, sbasketbu, sbasketb, driver_device, 0, ROT90, "Konami", "Super Basketball (version H, unprotected)", GAME_SUPPORTS_SAVE ) +GAME( 1984, sbasketg, sbasketb, sbasketb, sbasketb, sbasketb_state, sbasketb, ROT90, "Konami", "Super Basketball (version G, encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1984, sbaskete, sbasketb, sbasketb, sbasketb, sbasketb_state, sbasketb, ROT90, "Konami", "Super Basketball (version E, encrypted)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/scramble.c b/src/mame/drivers/scramble.c index bbe27542d99..ad73e39448f 100644 --- a/src/mame/drivers/scramble.c +++ b/src/mame/drivers/scramble.c @@ -405,6 +405,11 @@ static ADDRESS_MAP_START( harem_map, AS_PROGRAM, 8, scramble_state ) AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("rombank") // bitswapped rom ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, scramble_state ) + AM_RANGE(0x0000, 0x1fff) AM_ROM AM_REGION("maincpu", 0) + AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("rombank_decrypted") +ADDRESS_MAP_END + static ADDRESS_MAP_START( harem_sound_map, AS_PROGRAM, 8, scramble_state ) AM_RANGE(0x0000, 0x2fff) AM_ROM AM_RANGE(0x6000, 0x6000) AM_READNOP @@ -1675,6 +1680,7 @@ static MACHINE_CONFIG_DERIVED( harem, scramble ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(harem_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_MODIFY("audiocpu") MCFG_CPU_PROGRAM_MAP(harem_sound_map) diff --git a/src/mame/drivers/segae.c b/src/mame/drivers/segae.c index eb824bc8d54..e02daa3d88d 100644 --- a/src/mame/drivers/segae.c +++ b/src/mame/drivers/segae.c @@ -311,7 +311,12 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_vdp1(*this, "vdp1"), - m_vdp2(*this, "vdp2") { } + m_vdp2(*this, "vdp2"), + m_decrypted_opcodes(*this, "decrypted_opcodes"), + m_maincpu_region(*this, "maincpu"), + m_bank1(*this, "bank1"), + m_bank0d(*this, "bank0d"), + m_bank1d(*this, "bank1d") { } DECLARE_WRITE8_MEMBER( bank_write ); DECLARE_WRITE_LINE_MEMBER( int_callback ); @@ -332,6 +337,12 @@ public: required_device<sega315_5124_device> m_vdp1; required_device<sega315_5124_device> m_vdp2; + optional_shared_ptr<UINT8> m_decrypted_opcodes; + required_memory_region m_maincpu_region; + required_memory_bank m_bank1; + optional_memory_bank m_bank0d; + optional_memory_bank m_bank1d; + // Analog input related UINT8 m_port_select; UINT16 m_last1; @@ -358,7 +369,19 @@ public: static ADDRESS_MAP_START( systeme_map, AS_PROGRAM, 8, systeme_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM /* Fixed ROM */ AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank1") AM_WRITE_BANK("vram_write") /* Banked ROM */ - AM_RANGE(0xc000, 0xffff) AM_RAM + AM_RANGE(0xc000, 0xffff) AM_RAM AM_SHARE("mainram") +ADDRESS_MAP_END + +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, systeme_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") + AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") + AM_RANGE(0xc000, 0xffff) AM_RAM AM_SHARE("mainram") +ADDRESS_MAP_END + +static ADDRESS_MAP_START( banked_decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, systeme_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROMBANK("bank0d") + AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1d") + AM_RANGE(0xc000, 0xffff) AM_RAM AM_SHARE("mainram") ADDRESS_MAP_END @@ -396,7 +419,9 @@ WRITE8_MEMBER( systeme_state::bank_write ) membank("vdp1_bank")->set_entry((data >> 7) & 1); membank("vdp2_bank")->set_entry((data >> 6) & 1); membank("vram_write")->set_entry(data >> 5); - membank("bank1")->set_entry(data & 0x0f); + m_bank1->set_entry(data & 0x0f); + if(m_bank1d) + m_bank1d->set_entry(data & 0x0f); } @@ -404,7 +429,7 @@ void systeme_state::machine_start() { membank("vdp1_bank")->configure_entries(0, 2, m_vram[0], 0x4000); membank("vdp2_bank")->configure_entries(0, 2, m_vram[1], 0x4000); - membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x4000); + m_bank1->configure_entries(0, 16, m_maincpu_region->base() + 0x10000, 0x4000); for (int i = 7; i >= 0; i--) { @@ -909,7 +934,7 @@ ROM_START( fantzn2 ) ROM_LOAD( "epr-11414.ic4", 0x30000, 0x10000, CRC(6f7a9f5f) SHA1(b53aa2eded781c80466a79b7d81383b9a875d0be) ) ROM_LOAD( "epr-11412.ic2", 0x40000, 0x10000, CRC(b14db5af) SHA1(04c7fb659385438b3d8f9fb66800eb7b6373bda9) ) - ROM_REGION( 0x2000, "user1", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "key", 0 ) /* MC8123 key */ ROM_LOAD( "317-0057.key", 0x0000, 0x2000, CRC(ee43d0f0) SHA1(72cb75a4d8352fe372db12046a59ea044360d5c3) ) ROM_END @@ -923,7 +948,7 @@ ROM_START( opaopa ) ROM_LOAD( "epr11221.ic3", 0x20000, 0x08000, CRC(4ca132a2) SHA1(cb4e4c01b6ab070eef37c0603190caafe6236ccd) ) /* encrypted */ ROM_LOAD( "epr11220.ic2", 0x28000, 0x08000, CRC(a165e2ef) SHA1(498ff4c5d3a2658567393378c56be6ed86ac0384) ) /* encrypted */ - ROM_REGION( 0x2000, "user1", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "key", 0 ) /* MC8123 key */ ROM_LOAD( "317-0042.key", 0x0000, 0x2000, CRC(d6312538) SHA1(494ac7f080775c21dc7d369e6ea78f3299e6975a) ) ROM_END @@ -988,6 +1013,16 @@ static MACHINE_CONFIG_START( systeme, systeme_state ) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( systemex, systeme ) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( systemeb, systeme ) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(banked_decrypted_opcodes_map) +MACHINE_CONFIG_END + DRIVER_INIT_MEMBER(systeme_state, hangonjr) { m_maincpu->space(AS_IO).install_read_handler(0xf8, 0xf8, read8_delegate(FUNC(systeme_state::hangonjr_port_f8_read), this)); @@ -997,7 +1032,58 @@ DRIVER_INIT_MEMBER(systeme_state, hangonjr) DRIVER_INIT_MEMBER(systeme_state, astrofl) { - sega_315_5177_decode(machine(), "maincpu"); + // 315-5177 + static const UINT8 xor_table[128] = + { + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14, + + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14, + }; + + static const int swap_table[128] = + { + 0,0,0,0, + 1,1,1,1,1, + 2,2,2,2,2, + 3,3,3,3, + 4,4,4,4,4, + 5,5,5,5,5, + 6,6,6,6,6, + 7,7,7,7,7, + 8,8,8,8, + 9,9,9,9,9, + 10,10,10,10,10, + 11,11,11,11,11, + 12,12,12,12,12, + 13,13, + + 8,8,8,8, + 9,9,9,9,9, + 10,10,10,10,10, + 11,11,11,11, + 12,12,12,12,12, + 13,13,13,13,13, + 14,14,14,14,14, + 15,15,15,15,15, + 16,16,16,16, + 17,17,17,17,17, + 18,18,18,18,18, + 19,19,19,19,19, + 20,20,20,20,20, + 21,21, + }; + + sega_decode_2(m_maincpu_region->base(), m_decrypted_opcodes, xor_table, swap_table); } @@ -1010,21 +1096,25 @@ DRIVER_INIT_MEMBER(systeme_state, ridleofp) DRIVER_INIT_MEMBER(systeme_state, opaopa) { - mc8123_decrypt_rom(machine(), "maincpu", "user1", "bank1", 8); + UINT8 *banked_decrypted_opcodes = auto_alloc_array(machine(), UINT8, m_maincpu_region->bytes()); + mc8123_decode(m_maincpu_region->base(), banked_decrypted_opcodes, memregion("key")->base(), m_maincpu_region->bytes()); + + m_bank0d->set_base(banked_decrypted_opcodes); + m_bank1d->configure_entries(0, 16, banked_decrypted_opcodes + 0x10000, 0x4000); } DRIVER_INIT_MEMBER(systeme_state, fantzn2) { - mc8123_decrypt_rom(machine(), "maincpu", "user1", NULL, 0); + mc8123_decode(m_maincpu_region->base(), m_decrypted_opcodes, memregion("key")->base(), 0x8000); } -// YEAR, NAME, PARENT, MACHINE, INPUT, INIT, MONITOR,COMPANY,FULLNAME,FLAGS -GAME( 1985, hangonjr, 0, systeme, hangonjr, systeme_state, hangonjr, ROT0, "Sega", "Hang-On Jr.", GAME_SUPPORTS_SAVE ) -GAME( 1986, transfrm, 0, systeme, transfrm, driver_device, 0, ROT0, "Sega", "Transformer", GAME_SUPPORTS_SAVE ) -GAME( 1986, astrofl, transfrm, systeme, transfrm, systeme_state, astrofl, ROT0, "Sega", "Astro Flash (Japan)", GAME_SUPPORTS_SAVE ) -GAME( 1986, ridleofp, 0, systeme, ridleofp, systeme_state, ridleofp, ROT90, "Sega / Nasco", "Riddle of Pythagoras (Japan)", GAME_SUPPORTS_SAVE ) -GAME( 1987, opaopa, 0, systeme, opaopa, systeme_state, opaopa, ROT0, "Sega", "Opa Opa (MC-8123, 317-0042)", GAME_SUPPORTS_SAVE ) -GAME( 1988, fantzn2, 0, systeme, fantzn2, systeme_state, fantzn2, ROT0, "Sega", "Fantasy Zone II - The Tears of Opa-Opa (MC-8123, 317-0057)", GAME_SUPPORTS_SAVE ) -GAME( 1988, tetrisse, 0, systeme, tetrisse, driver_device, 0, ROT0, "Sega", "Tetris (Japan, System E)", GAME_SUPPORTS_SAVE ) +// YEAR, NAME, PARENT, MACHINE, INPUT, INIT, MONITOR,COMPANY,FULLNAME,FLAGS +GAME( 1985, hangonjr, 0, systeme, hangonjr, systeme_state, hangonjr, ROT0, "Sega", "Hang-On Jr.", GAME_SUPPORTS_SAVE ) +GAME( 1986, transfrm, 0, systeme, transfrm, driver_device, 0, ROT0, "Sega", "Transformer", GAME_SUPPORTS_SAVE ) +GAME( 1986, astrofl, transfrm, systemex, transfrm, systeme_state, astrofl, ROT0, "Sega", "Astro Flash (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1986, ridleofp, 0, systeme, ridleofp, systeme_state, ridleofp, ROT90, "Sega / Nasco", "Riddle of Pythagoras (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1987, opaopa, 0, systemeb, opaopa, systeme_state, opaopa, ROT0, "Sega", "Opa Opa (MC-8123, 317-0042)", GAME_SUPPORTS_SAVE ) +GAME( 1988, fantzn2, 0, systemex, fantzn2, systeme_state, fantzn2, ROT0, "Sega", "Fantasy Zone II - The Tears of Opa-Opa (MC-8123, 317-0057)", GAME_SUPPORTS_SAVE ) +GAME( 1988, tetrisse, 0, systeme, tetrisse, driver_device, 0, ROT0, "Sega", "Tetris (Japan, System E)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/segag80r.c b/src/mame/drivers/segag80r.c index ea0f834432a..490bee85605 100644 --- a/src/mame/drivers/segag80r.c +++ b/src/mame/drivers/segag80r.c @@ -322,6 +322,13 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, segag80r_state ) AM_RANGE(0xe000, 0xffff) AM_RAM_WRITE(vidram_w) AM_SHARE("videoram") ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, segag80r_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") + AM_RANGE(0x8000, 0xbfff) AM_ROM AM_REGION("maincpu", 0x8000) + AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(mainram_w) AM_SHARE("mainram") + AM_RANGE(0xe000, 0xffff) AM_RAM_WRITE(vidram_w) AM_SHARE("videoram") +ADDRESS_MAP_END + /* complete memory map derived from schematics */ static ADDRESS_MAP_START( main_portmap, AS_IO, 8, segag80r_state ) @@ -877,6 +884,10 @@ static MACHINE_CONFIG_DERIVED( monsterb, g80r_base ) MCFG_FRAGMENT_ADD(monsterb_sound_board) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( monster2, monsterb ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( pignewt, g80r_base ) @@ -897,6 +908,7 @@ static MACHINE_CONFIG_DERIVED( sindbadm, g80r_base ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_IO_MAP(sindbadm_portmap) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", segag80r_state, sindbadm_vblank_start) MCFG_DEVICE_ADD("ppi8255", I8255A, 0) @@ -1497,11 +1509,34 @@ DRIVER_INIT_MEMBER(segag80r_state,monsterb) DRIVER_INIT_MEMBER(segag80r_state,monster2) { + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x88,0x08,0x80,0x00 }, { 0x00,0x08,0x20,0x28 }, /* ...0...0...0...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...0...1 */ + { 0x28,0x20,0xa8,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...0...1...0 */ + { 0x88,0x08,0x80,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...1...1 */ + { 0x00,0x08,0x20,0x28 }, { 0x88,0x08,0x80,0x00 }, /* ...0...1...0...0 */ + { 0xa0,0x80,0x20,0x00 }, { 0x80,0x88,0x00,0x08 }, /* ...0...1...0...1 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...1...1...0 */ + { 0x88,0x08,0x80,0x00 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...1...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0x80,0x88,0x00,0x08 }, /* ...1...0...0...0 */ + { 0x80,0x88,0x00,0x08 }, { 0x00,0x08,0x20,0x28 }, /* ...1...0...0...1 */ + { 0x28,0x20,0xa8,0xa0 }, { 0x28,0xa8,0x08,0x88 }, /* ...1...0...1...0 */ + { 0x00,0x08,0x20,0x28 }, { 0x80,0xa0,0x88,0xa8 }, /* ...1...0...1...1 */ + { 0x80,0x88,0x00,0x08 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...0 */ + { 0x80,0xa0,0x88,0xa8 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...1 */ + { 0xa0,0x80,0x20,0x00 }, { 0x80,0xa0,0x88,0xa8 }, /* ...1...1...1...0 */ + { 0x28,0x20,0xa8,0xa0 }, { 0x00,0x08,0x20,0x28 } /* ...1...1...1...1 */ + }; + + sega_decode(memregion("maincpu")->base(), m_decrypted_opcodes, 0x8000, convtable); + address_space &iospace = m_maincpu->space(AS_IO); address_space &pgmspace = m_maincpu->space(AS_PROGRAM); /* configure the 315-5006 security chip */ - spatter_decode(machine(), "maincpu"); m_decrypt = segag80_security(0); /* configure video */ @@ -1546,11 +1581,34 @@ DRIVER_INIT_MEMBER(segag80r_state,pignewt) DRIVER_INIT_MEMBER(segag80r_state,sindbadm) { + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...0 */ + { 0xa8,0xa0,0x88,0x80 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...0...0...1 */ + { 0xa8,0xa0,0x88,0x80 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...0...1...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...1...1 */ + { 0xa8,0x88,0xa0,0x80 }, { 0xa0,0x20,0xa8,0x28 }, /* ...0...1...0...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...1 */ + { 0xa8,0xa0,0x88,0x80 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...1...1...0 */ + { 0xa8,0xa0,0x88,0x80 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...1...1...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...0...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...0...1 */ + { 0xa8,0xa0,0x88,0x80 }, { 0x00,0x20,0x80,0xa0 }, /* ...1...0...1...0 */ + { 0xa8,0xa0,0x88,0x80 }, { 0x00,0x20,0x80,0xa0 }, /* ...1...0...1...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...0 */ + { 0xa8,0x88,0xa0,0x80 }, { 0xa0,0x20,0xa8,0x28 }, /* ...1...1...0...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...1...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 } /* ...1...1...1...1 */ + }; + + sega_decode(memregion("maincpu")->base(), m_decrypted_opcodes, 0x8000, convtable); + address_space &iospace = m_maincpu->space(AS_IO); address_space &pgmspace = m_maincpu->space(AS_PROGRAM); /* configure the encrypted Z80 */ - sindbadm_decode(machine(), "maincpu"); m_decrypt = segag80_security(0); /* configure video */ @@ -1585,7 +1643,7 @@ GAME( 1981, spaceod2, spaceod, spaceod, spaceod, segag80r_state, spaceod, R GAME( 1982, monsterb, 0, monsterb, monsterb, segag80r_state, monsterb, ROT270, "Sega", "Monster Bash", GAME_IMPERFECT_SOUND ) /* 2-board G-80 system */ -GAME( 1982, monsterb2, monsterb, monsterb, monsterb, segag80r_state, monster2, ROT270, "Sega", "Monster Bash (2 board version)", GAME_IMPERFECT_SOUND ) +GAME( 1982, monsterb2, monsterb, monster2, monsterb, segag80r_state, monster2, ROT270, "Sega", "Monster Bash (2 board version)", GAME_IMPERFECT_SOUND ) GAME( 1983, pignewt, 0, pignewt, pignewt, segag80r_state, pignewt, ROT270, "Sega", "Pig Newton (version C)", GAME_IMPERFECT_SOUND ) GAME( 1983, pignewta, pignewt, pignewt, pignewta, segag80r_state, pignewt, ROT270, "Sega", "Pig Newton (version A)", GAME_IMPERFECT_SOUND ) GAME( 1983, sindbadm, 0, sindbadm, sindbadm, segag80r_state, sindbadm, ROT270, "Sega", "Sindbad Mystery", 0 ) diff --git a/src/mame/drivers/segahang.c b/src/mame/drivers/segahang.c index d1dd85fc686..fdd896e745c 100644 --- a/src/mame/drivers/segahang.c +++ b/src/mame/drivers/segahang.c @@ -426,6 +426,11 @@ static ADDRESS_MAP_START( hangon_map, AS_PROGRAM, 16, segahang_state ) AM_RANGE(0xe00000, 0xffffff) AM_READWRITE(hangon_io_r, hangon_io_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 16, segahang_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x000000, 0x03ffff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( sharrier_map, AS_PROGRAM, 16, segahang_state ) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x000000, 0x03ffff) AM_ROM @@ -959,11 +964,17 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( endurobl, sharrier_base ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) + MCFG_FRAGMENT_ADD(sound_board_2203) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( endurob2, sharrier_base ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) + MCFG_FRAGMENT_ADD(sound_board_2203x2) MACHINE_CONFIG_END @@ -1777,13 +1788,10 @@ DRIVER_INIT_MEMBER(segahang_state,enduror) DRIVER_INIT_MEMBER(segahang_state,endurobl) { DRIVER_INIT_CALL(enduror); - // assemble decrypted half of ROM and register it UINT16 *rom = reinterpret_cast<UINT16 *>(memregion("maincpu")->base()); - UINT16 *decrypt = auto_alloc_array(machine(), UINT16, 0x40000/2); - memcpy(decrypt + 0x00000/2, rom + 0x30000/2, 0x10000); - memcpy(decrypt + 0x10000/2, rom + 0x10000/2, 0x20000); - m_maincpu->space(AS_PROGRAM).set_decrypted_region(0x000000, 0x03ffff, decrypt); + memcpy(m_decrypted_opcodes + 0x00000/2, rom + 0x30000/2, 0x10000); + memcpy(m_decrypted_opcodes + 0x10000/2, rom + 0x10000/2, 0x20000); } DRIVER_INIT_MEMBER(segahang_state,endurob2) @@ -1792,9 +1800,7 @@ DRIVER_INIT_MEMBER(segahang_state,endurob2) // assemble decrypted half of ROM and register it UINT16 *rom = reinterpret_cast<UINT16 *>(memregion("maincpu")->base()); - UINT16 *decrypt = auto_alloc_array(machine(), UINT16, 0x40000/2); - memcpy(decrypt, rom, 0x30000); - m_maincpu->space(AS_PROGRAM).set_decrypted_region(0x000000, 0x03ffff, decrypt); + memcpy(m_decrypted_opcodes, rom, 0x30000); } diff --git a/src/mame/drivers/segaorun.c b/src/mame/drivers/segaorun.c index c80dc050f02..7181c1a848c 100644 --- a/src/mame/drivers/segaorun.c +++ b/src/mame/drivers/segaorun.c @@ -465,7 +465,7 @@ void segaorun_state::memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 in case 0: mapper.map_as_ram(0x60000, 0x08000, 0xf98000, "workram", write16_delegate()); - mapper.map_as_rom(0x00000, 0x60000, 0xf80000, "rom0base", 0x00000, write16_delegate()); + mapper.map_as_rom(0x00000, 0x60000, 0xf80000, "rom0base", "decrypted_rom0base", 0x00000, write16_delegate()); break; } } diff --git a/src/mame/drivers/segas16a.c b/src/mame/drivers/segas16a.c index 2001e28b832..6313f3dee38 100644 --- a/src/mame/drivers/segas16a.c +++ b/src/mame/drivers/segas16a.c @@ -974,6 +974,10 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, segas16a_state ) AM_RANGE(0xf800, 0xffff) AM_RAM ADDRESS_MAP_END +static ADDRESS_MAP_START( sound_decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, segas16a_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("sound_decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( sound_portmap, AS_IO, 8, segas16a_state ) ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_GLOBAL_MASK(0xff) @@ -1964,6 +1968,11 @@ static MACHINE_CONFIG_DERIVED( system16a_no7751, system16a ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( system16a_no7751p, system16a_no7751 ) + MCFG_DEVICE_MODIFY("soundcpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(sound_decrypted_opcodes_map) +MACHINE_CONFIG_END + /* static MACHINE_CONFIG_DERIVED( system16a_i8751_no7751, system16a_i8751 ) MCFG_DEVICE_REMOVE("n7751") @@ -3503,7 +3512,59 @@ DRIVER_INIT_MEMBER(segas16a_state,quartet) DRIVER_INIT_MEMBER(segas16a_state,fantzonep) { DRIVER_INIT_CALL(generic); - sega_315_5177_decode(machine(), "soundcpu"); + + // 315-5177 + static const UINT8 xor_table[128] = + { + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14, + + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14, + }; + + static const int swap_table[128] = + { + 0,0,0,0, + 1,1,1,1,1, + 2,2,2,2,2, + 3,3,3,3, + 4,4,4,4,4, + 5,5,5,5,5, + 6,6,6,6,6, + 7,7,7,7,7, + 8,8,8,8, + 9,9,9,9,9, + 10,10,10,10,10, + 11,11,11,11,11, + 12,12,12,12,12, + 13,13, + + 8,8,8,8, + 9,9,9,9,9, + 10,10,10,10,10, + 11,11,11,11, + 12,12,12,12,12, + 13,13,13,13,13, + 14,14,14,14,14, + 15,15,15,15,15, + 16,16,16,16, + 17,17,17,17,17, + 18,18,18,18,18, + 19,19,19,19,19, + 20,20,20,20,20, + 21,21, + }; + + sega_decode_2(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, xor_table, swap_table); } DRIVER_INIT_MEMBER(segas16a_state,sdi) @@ -3545,7 +3606,7 @@ GAME( 1986, alexkidd, 0, system16a, alexkidd, segas16a GAME( 1986, alexkidd1, alexkidd, system16a_fd1089a, alexkidd, segas16a_state,generic, ROT0, "Sega", "Alex Kidd: The Lost Stars (set 1, FD1089A 317-0021)", GAME_SUPPORTS_SAVE ) GAME( 1986, fantzone, 0, system16a_no7751, fantzone, segas16a_state,generic, ROT0, "Sega", "Fantasy Zone (Rev A, unprotected)", GAME_SUPPORTS_SAVE ) GAME( 1986, fantzone1, fantzone, system16a_no7751, fantzone, segas16a_state,generic, ROT0, "Sega", "Fantasy Zone (unprotected)", GAME_SUPPORTS_SAVE ) -GAME( 1986, fantzonep, fantzone, system16a_no7751, fantzone, segas16a_state,fantzonep, ROT0, "Sega", "Fantasy Zone (317-5000)", GAME_SUPPORTS_SAVE ) +GAME( 1986, fantzonep, fantzone, system16a_no7751p, fantzone, segas16a_state,fantzonep, ROT0, "Sega", "Fantasy Zone (317-5000)", GAME_SUPPORTS_SAVE ) GAME( 1986, fantzonepr, fantzone, system16a_no7751, fantzone, segas16a_state,generic, ROT0, "Sega", "Fantasy Zone (prototype)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) // bad / missing gfx roms GAME( 1988, passsht16a, passsht, system16a_fd1094, passsht16a, segas16a_state,passsht16a, ROT270, "Sega", "Passing Shot (Japan, 4 Players, System 16A, FD1094 317-0071)", GAME_SUPPORTS_SAVE ) GAME( 1987, sdi, 0, system16a_fd1089b_no7751, sdi, segas16a_state,sdi, ROT0, "Sega", "SDI - Strategic Defense Initiative (Japan, newer, System 16A, FD1089B 317-0027)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/segas16b.c b/src/mame/drivers/segas16b.c index 8646a8976fc..d028409837a 100644 --- a/src/mame/drivers/segas16b.c +++ b/src/mame/drivers/segas16b.c @@ -926,8 +926,8 @@ void segas16b_state::memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 in case 2: // 3rd ROM base, or board-specific banking switch (m_romboard) { - case ROM_BOARD_171_5358_SMALL: mapper.map_as_rom(0x00000, 0x20000, 0xfe0000, "rom2base", 0x20000, write16_delegate()); break; - case ROM_BOARD_171_5358: mapper.map_as_rom(0x00000, 0x20000, 0xfe0000, "rom2base", 0x40000, write16_delegate()); break; + case ROM_BOARD_171_5358_SMALL: mapper.map_as_rom(0x00000, 0x20000, 0xfe0000, "rom2base", "decrypted_rom2base", 0x20000, write16_delegate()); break; + case ROM_BOARD_171_5358: mapper.map_as_rom(0x00000, 0x20000, 0xfe0000, "rom2base", "decrypted_rom2base", 0x40000, write16_delegate()); break; case ROM_BOARD_171_5521: case ROM_BOARD_171_5704: mapper.map_as_handler(0x00000, 0x10000, 0xff0000, read16_delegate(), write16_delegate(FUNC(segas16b_state::rom_5704_bank_w), this)); break; case ROM_BOARD_171_5797: mapper.map_as_handler(0x00000, 0x10000, 0xff0000, read16_delegate(FUNC(segas16b_state::unknown_rgn2_r), this), write16_delegate(FUNC(segas16b_state::unknown_rgn2_w), this)); break; @@ -939,10 +939,10 @@ void segas16b_state::memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 in case 1: // 2nd ROM base, banking & math, or sound for Korean games switch (m_romboard) { - case ROM_BOARD_171_5358_SMALL: mapper.map_as_rom(0x00000, 0x20000, 0xfe0000, "rom1base", 0x10000, write16_delegate()); break; - case ROM_BOARD_171_5358: mapper.map_as_rom(0x00000, 0x20000, 0xfe0000, "rom1base", 0x20000, write16_delegate()); break; + case ROM_BOARD_171_5358_SMALL: mapper.map_as_rom(0x00000, 0x20000, 0xfe0000, "rom1base", "decrypted_rom1base", 0x10000, write16_delegate()); break; + case ROM_BOARD_171_5358: mapper.map_as_rom(0x00000, 0x20000, 0xfe0000, "rom1base", "decrypted_rom1base", 0x20000, write16_delegate()); break; case ROM_BOARD_171_5521: - case ROM_BOARD_171_5704: mapper.map_as_rom(0x00000, 0x40000, 0xfc0000, "rom1base", 0x40000, write16_delegate()); break; + case ROM_BOARD_171_5704: mapper.map_as_rom(0x00000, 0x40000, 0xfc0000, "rom1base", "decrypted_rom1base", 0x40000, write16_delegate()); break; case ROM_BOARD_KOREAN: mapper.map_as_handler(0x00000, 0x10000, 0xff0000, read16_delegate(), write16_delegate(FUNC(segas16b_state::atomicp_sound_w), this)); break; case ROM_BOARD_171_5797: mapper.map_as_handler(0x00000, 0x04000, 0xffc000, read16_delegate(FUNC(segas16b_state::rom_5797_bank_math_r), this), write16_delegate(FUNC(segas16b_state::rom_5797_bank_math_w), this)); break; default: assert(false); @@ -952,12 +952,12 @@ void segas16b_state::memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 in case 0: // 1st ROM base switch (m_romboard) { - case ROM_BOARD_171_5358_SMALL: mapper.map_as_rom(0x00000, 0x20000, 0xfe0000, "rom0base", 0x00000, write16_delegate()); break; - case ROM_BOARD_171_5358: mapper.map_as_rom(0x00000, 0x20000, 0xfe0000, "rom0base", 0x00000, write16_delegate()); break; + case ROM_BOARD_171_5358_SMALL: mapper.map_as_rom(0x00000, 0x20000, 0xfe0000, "rom0base", "decrypted_rom0base", 0x00000, write16_delegate()); break; + case ROM_BOARD_171_5358: mapper.map_as_rom(0x00000, 0x20000, 0xfe0000, "rom0base", "decrypted_rom0base", 0x00000, write16_delegate()); break; case ROM_BOARD_171_5521: - case ROM_BOARD_171_5704: mapper.map_as_rom(0x00000, 0x40000, 0xfc0000, "rom0base", 0000000, write16_delegate()); break; - case ROM_BOARD_KOREAN: mapper.map_as_rom(0x00000, 0x40000, 0xfc0000, "rom0base", 0000000, write16_delegate()); break; - case ROM_BOARD_171_5797: mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom0base", 0000000, write16_delegate()); break; + case ROM_BOARD_171_5704: mapper.map_as_rom(0x00000, 0x40000, 0xfc0000, "rom0base", "decrypted_rom0base", 0000000, write16_delegate()); break; + case ROM_BOARD_KOREAN: mapper.map_as_rom(0x00000, 0x40000, 0xfc0000, "rom0base", "decrypted_rom0base", 0000000, write16_delegate()); break; + case ROM_BOARD_171_5797: mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom0base", "decrypted_rom0base", 0000000, write16_delegate()); break; default: assert(false); } break; @@ -1742,6 +1742,12 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, segas16b_state ) AM_RANGE(0xf800, 0xffff) AM_RAM ADDRESS_MAP_END +static ADDRESS_MAP_START( sound_decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, segas16b_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("sound_decrypted_opcodes") + AM_RANGE(0x8000, 0xdfff) AM_ROMBANK("soundbank") +ADDRESS_MAP_END + static ADDRESS_MAP_START( sound_portmap, AS_IO, 8, segas16b_state ) ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_GLOBAL_MASK(0xff) @@ -3320,6 +3326,10 @@ static MACHINE_CONFIG_START( system16b, segas16b_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.48) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( system16b_mc8123, system16b ) + MCFG_CPU_MODIFY("soundcpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(sound_decrypted_opcodes_map) +MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( system16b_fd1089a, system16b ) MCFG_CPU_REPLACE("maincpu", FD1089A, MASTER_CLOCK_10MHz) @@ -6759,7 +6769,7 @@ DRIVER_INIT_MEMBER(segas16b_state,aceattac_5358) DRIVER_INIT_MEMBER(segas16b_state,aliensyn7_5358_small) { DRIVER_INIT_CALL(generic_5358_small); - mc8123_decrypt_rom(machine(), "soundcpu", "mcu", NULL, 0); + mc8123_decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, memregion("mcu")->base(), 0x8000); } DRIVER_INIT_MEMBER(segas16b_state,altbeast_5521) @@ -6783,7 +6793,7 @@ DRIVER_INIT_MEMBER(segas16b_state,altbeas5_5521) DRIVER_INIT_MEMBER(segas16b_state,altbeas4_5521) { DRIVER_INIT_CALL(generic_5521); - mc8123_decrypt_rom(machine(), "soundcpu", "mcu", NULL, 0); + mc8123_decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, memregion("mcu")->base(), 0x8000); } DRIVER_INIT_MEMBER(segas16b_state,ddux_5704) @@ -6841,7 +6851,7 @@ DRIVER_INIT_MEMBER(segas16b_state,passshtj_5358) DRIVER_INIT_MEMBER(segas16b_state,cencourt_5358) { DRIVER_INIT_CALL(passshtj_5358); - mc8123_decrypt_rom(machine(), "soundcpu", "mcu", NULL, 0); + mc8123_decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, memregion("mcu")->base(), 0x8000); } DRIVER_INIT_MEMBER(segas16b_state,sdi_5358_small) @@ -6859,13 +6869,13 @@ DRIVER_INIT_MEMBER(segas16b_state,defense_5358_small) DRIVER_INIT_MEMBER(segas16b_state,shinobi4_5521) { DRIVER_INIT_CALL(generic_5521); - mc8123_decrypt_rom(machine(), "soundcpu", "mcu", NULL, 0); + mc8123_decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, memregion("mcu")->base(), 0x8000); } DRIVER_INIT_MEMBER(segas16b_state,shinobi3_5358) { DRIVER_INIT_CALL(generic_5358); - mc8123_decrypt_rom(machine(), "soundcpu", "mcu", NULL, 0); + mc8123_decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, memregion("mcu")->base(), 0x8000); } DRIVER_INIT_MEMBER(segas16b_state,sjryuko_5358_small) @@ -6910,7 +6920,7 @@ DRIVER_INIT_MEMBER(segas16b_state,snapper) GAME( 1988, aceattac, 0, system16b_fd1094, aceattac, segas16b_state,aceattac_5358, ROT270, "Sega", "Ace Attacker (FD1094 317-0059)", 0 ) GAME( 1987, aliensyn, 0, system16b, aliensyn, segas16b_state,generic_5358_small, ROT0, "Sega", "Alien Syndrome (set 4, System 16B, unprotected)", 0 ) -GAME( 1987, aliensyn7, aliensyn, system16b, aliensyn, segas16b_state,aliensyn7_5358_small, ROT0, "Sega", "Alien Syndrome (set 7, System 16B, MC-8123B 317-00xx)", 0 ) +GAME( 1987, aliensyn7, aliensyn, system16b_mc8123, aliensyn, segas16b_state,aliensyn7_5358_small, ROT0, "Sega", "Alien Syndrome (set 7, System 16B, MC-8123B 317-00xx)", 0 ) GAME( 1987, aliensyn3, aliensyn, system16b_fd1089a, aliensyn, segas16b_state,generic_5358_small, ROT0, "Sega", "Alien Syndrome (set 3, System 16B, FD1089A 317-0033)", 0 ) GAME( 1987, aliensynj, aliensyn, system16b_fd1089a, aliensynj,segas16b_state,generic_5358_small, ROT0, "Sega", "Alien Syndrome (set 6, Japan, new, System 16B, FD1089A 317-0033)", 0 ) @@ -6918,7 +6928,7 @@ GAME( 1988, altbeast, 0, system16b_i8751, altbeast, segas16b_state, GAME( 1988, altbeastj, altbeast, system16b_i8751, altbeast, segas16b_state,altbeasj_5521, ROT0, "Sega", "Juuouki (set 7, Japan, 8751 317-0077)", 0 ) GAME( 1988, altbeast6, altbeast, system16b_i8751, altbeast, segas16b_state,altbeas5_5521, ROT0, "Sega", "Altered Beast (set 6, 8751 317-0076)", 0 ) GAME( 1988, altbeast5, altbeast, system16b_fd1094, altbeast, segas16b_state,generic_5521, ROT0, "Sega", "Altered Beast (set 5, FD1094 317-0069)", 0 ) -GAME( 1988, altbeast4, altbeast, system16b, altbeast, segas16b_state,altbeas4_5521, ROT0, "Sega", "Altered Beast (set 4, MC-8123B 317-0066)", 0 ) +GAME( 1988, altbeast4, altbeast, system16b_mc8123, altbeast, segas16b_state,altbeas4_5521, ROT0, "Sega", "Altered Beast (set 4, MC-8123B 317-0066)", 0 ) GAME( 1988, altbeastj3, altbeast, system16b_fd1094, altbeast, segas16b_state,generic_5521, ROT0, "Sega", "Juuouki (set 3, Japan, FD1094 317-0068)", 0 ) GAME( 1988, altbeast2, altbeast, system16b, altbeast, segas16b_state,altbeas4_5521, ROT0, "Sega", "Altered Beast (set 2, MC-8123B 317-0066)", 0 ) GAME( 1988, altbeastj1, altbeast, system16b_fd1094, altbeast, segas16b_state,generic_5521, ROT0, "Sega", "Juuouki (set 1, Japan, FD1094 317-0065)", 0 ) @@ -6974,7 +6984,7 @@ GAME( 1989, mvpj, mvp, system16b_fd1094, mvp, segas16b_state, GAME( 1988, passsht, 0, system16b_fd1094, passsht, segas16b_state,generic_5358, ROT270, "Sega", "Passing Shot (World, 2 Players, FD1094 317-0080)", 0 ) GAME( 1988, passshta, passsht, system16b_fd1094, passshtj, segas16b_state,passshtj_5358, ROT270, "Sega", "Passing Shot (World, 4 Players, FD1094 317-0074)", 0 ) GAME( 1988, passshtj, passsht, system16b_fd1094, passshtj, segas16b_state,passshtj_5358, ROT270, "Sega", "Passing Shot (Japan, 4 Players, FD1094 317-0070)", 0 ) -GAME( 1988, cencourt, passsht, system16b, cencourt, segas16b_state,cencourt_5358, ROT270, "Sega", "Center Court (World, 4 Players, prototype, MC-8123B)", 0 ) +GAME( 1988, cencourt, passsht, system16b_mc8123, cencourt, segas16b_state,cencourt_5358, ROT270, "Sega", "Center Court (World, 4 Players, prototype, MC-8123B)", 0 ) GAME( 1991, riotcity, 0, system16b, riotcity, segas16b_state,generic_5704, ROT0, "Sega / Westone", "Riot City (Japan)", 0 ) @@ -6985,8 +6995,8 @@ GAME( 1987, sdib, sdi, system16b_fd1089a, sdi, segas16b_state, GAME( 1987, sdibl, sdi, system16b, sdi, segas16b_state,sdi_5358_small, ROT0, "bootleg", "SDI - Strategic Defense Initiative (bootleg)", 0 ) GAME( 1987, shinobi5, shinobi, system16b, shinobi, segas16b_state,generic_5521, ROT0, "Sega", "Shinobi (set 5, System 16B, unprotected)", 0 ) -GAME( 1987, shinobi4, shinobi, system16b, shinobi, segas16b_state,shinobi4_5521, ROT0, "Sega", "Shinobi (set 4, System 16B, MC-8123B 317-0054)", 0 ) -GAME( 1987, shinobi3, shinobi, system16b, shinobi, segas16b_state,shinobi3_5358, ROT0, "Sega", "Shinobi (set 3, System 16B, MC-8123B 317-0054)", 0 ) +GAME( 1987, shinobi4, shinobi, system16b_mc8123, shinobi, segas16b_state,shinobi4_5521, ROT0, "Sega", "Shinobi (set 4, System 16B, MC-8123B 317-0054)", 0 ) +GAME( 1987, shinobi3, shinobi, system16b_mc8123, shinobi, segas16b_state,shinobi3_5358, ROT0, "Sega", "Shinobi (set 3, System 16B, MC-8123B 317-0054)", 0 ) GAME( 1987, shinobi2, shinobi, system16b_fd1094, shinobi, segas16b_state,generic_5358, ROT0, "Sega", "Shinobi (set 2, System 16B, FD1094 317-0049)", 0 ) GAME( 1987, sonicbom, 0, system16b_fd1094, sonicbom, segas16b_state,generic_5358, ROT270, "Sega", "Sonic Boom (FD1094 317-0053)", 0 ) diff --git a/src/mame/drivers/segas18.c b/src/mame/drivers/segas18.c index afd68a1d736..609a0509227 100644 --- a/src/mame/drivers/segas18.c +++ b/src/mame/drivers/segas18.c @@ -84,13 +84,13 @@ void segas18_state::memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 ind switch (m_romboard) { case ROM_BOARD_171_SHADOW: mapper.map_as_handler(0x00000, 0x00010, 0xfffff0, read16_delegate(FUNC(segas18_state::genesis_vdp_r), this), write16_delegate(FUNC(segas18_state::genesis_vdp_w), this)); break; - case ROM_BOARD_171_5874: mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom1base", 0x80000, write16_delegate()); break; + case ROM_BOARD_171_5874: mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom1base", "decrypted_rom1base", 0x80000, write16_delegate()); break; case ROM_BOARD_171_5987: if (romsize <= 0x100000) - mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom1base", 0x80000, write16_delegate(FUNC(segas18_state::rom_5987_bank_w), this)); + mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom1base", "decrypted_rom1base", 0x80000, write16_delegate(FUNC(segas18_state::rom_5987_bank_w), this)); else - mapper.map_as_rom(0x00000,0x100000, 0xf00000, "rom1base",0x100000, write16_delegate(FUNC(segas18_state::rom_5987_bank_w), this)); + mapper.map_as_rom(0x00000,0x100000, 0xf00000, "rom1base", "decrypted_rom1base",0x100000, write16_delegate(FUNC(segas18_state::rom_5987_bank_w), this)); break; - case ROM_BOARD_837_7525: mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom1base", 0x80000, write16_delegate(FUNC(segas18_state::rom_837_7525_bank_w), this)); + case ROM_BOARD_837_7525: mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom1base", "decrypted_rom1base", 0x80000, write16_delegate(FUNC(segas18_state::rom_837_7525_bank_w), this)); break; default: assert(false); @@ -101,12 +101,12 @@ void segas18_state::memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 ind switch (m_romboard) { case ROM_BOARD_171_SHADOW: - case ROM_BOARD_171_5874: mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom0base", 0x00000, write16_delegate()); break; + case ROM_BOARD_171_5874: mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom0base", "decrypted_rom0base", 0x00000, write16_delegate()); break; case ROM_BOARD_837_7525: case ROM_BOARD_171_5987: if (romsize <= 0x100000) - mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom0base", 0x00000, write16_delegate()); + mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom0base", "decrypted_rom0base", 0x00000, write16_delegate()); else - mapper.map_as_rom(0x00000,0x100000, 0xf00000, "rom0base", 0x00000, write16_delegate()); + mapper.map_as_rom(0x00000,0x100000, 0xf00000, "rom0base", "decrypted_rom0base", 0x00000, write16_delegate()); break; default: assert(false); } diff --git a/src/mame/drivers/seicross.c b/src/mame/drivers/seicross.c index 4a6294e52ba..380023ace2d 100644 --- a/src/mame/drivers/seicross.c +++ b/src/mame/drivers/seicross.c @@ -127,7 +127,7 @@ static ADDRESS_MAP_START( mcu_nvram_map, AS_PROGRAM, 8, seicross_state ) AM_RANGE(0x0000, 0x007f) AM_RAM AM_RANGE(0x1000, 0x10ff) AM_RAM AM_SHARE("nvram") AM_RANGE(0x2000, 0x2000) AM_DEVWRITE("dac", dac_device, write_unsigned8) - AM_RANGE(0x8000, 0xf7ff) AM_ROM + AM_RANGE(0x8000, 0xf7ff) AM_ROM AM_REGION("maincpu", 0) AM_RANGE(0xf800, 0xffff) AM_RAM AM_SHARE("share1") ADDRESS_MAP_END @@ -137,10 +137,14 @@ static ADDRESS_MAP_START( mcu_no_nvram_map, AS_PROGRAM, 8, seicross_state ) AM_RANGE(0x1005, 0x1005) AM_READ_PORT("DSW2") /* DSW2 */ AM_RANGE(0x1006, 0x1006) AM_READ_PORT("DSW3") /* DSW3 */ AM_RANGE(0x2000, 0x2000) AM_DEVWRITE("dac", dac_device, write_unsigned8) - AM_RANGE(0x8000, 0xf7ff) AM_ROM + AM_RANGE(0x8000, 0xf7ff) AM_ROM AM_REGION("maincpu", 0) AM_RANGE(0xf800, 0xffff) AM_RAM AM_SHARE("share1") ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, seicross_state ) + AM_RANGE(0x8000, 0xf7ff) AM_ROM AM_SHARE("decrypted_opcodes") + AM_RANGE(0xf800, 0xffff) AM_RAM AM_SHARE("share1") +ADDRESS_MAP_END @@ -427,6 +431,11 @@ static MACHINE_CONFIG_DERIVED( nvram, no_nvram ) MCFG_NVRAM_ADD_CUSTOM_DRIVER("nvram", seicross_state, nvram_init) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( friskytb, nvram ) + MCFG_CPU_MODIFY("mcu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + /*************************************************************************** @@ -435,7 +444,7 @@ MACHINE_CONFIG_END ***************************************************************************/ ROM_START( friskyt ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x7800, "maincpu", 0 ) ROM_LOAD( "ftom.01", 0x0000, 0x1000, CRC(bce5d486) SHA1(b3226d5737490f18092227a663e89ad48f39d82c) ) ROM_LOAD( "ftom.02", 0x1000, 0x1000, CRC(63157d6e) SHA1(2792f3d918ffee3818eca98f52192a069ab60678) ) ROM_LOAD( "ftom.03", 0x2000, 0x1000, CRC(c8d9ef2c) SHA1(43dd6bfd93188004b977b97120df28c028e8582b) ) @@ -445,9 +454,6 @@ ROM_START( friskyt ) ROM_LOAD( "ftom.07", 0x6000, 0x1000, CRC(b2ef303a) SHA1(a7150457b454e15c06fa832d42dd1f0e165fcd6e) ) ROM_LOAD( "ft8_8.rom", 0x7000, 0x0800, CRC(10461a24) SHA1(c1f98316a4e90a2a6ef4953708b90c9546caaedd) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* 64k for the protection mcu */ - ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) /* shares the main program ROMs and RAM with the main CPU. */ - ROM_REGION( 0x4000, "gfx1", 0 ) ROM_LOAD( "ftom.11", 0x0000, 0x1000, CRC(1ec6ff65) SHA1(aab589c89cd14549b35f4dece5d3c231033c0c1a) ) ROM_LOAD( "ftom.12", 0x1000, 0x1000, CRC(3b8f40b5) SHA1(08e0c1fce11ee6c507c28b0d659c5b010f2f2b6f) ) @@ -460,7 +466,7 @@ ROM_START( friskyt ) ROM_END ROM_START( friskyta ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x7800, "maincpu", 0 ) ROM_LOAD( "ft.01", 0x0000, 0x1000, CRC(0ea46e19) SHA1(3feb3ee882926c0efa602cf92e6879e84a6050ed) ) ROM_LOAD( "ft.02", 0x1000, 0x1000, CRC(4f7b8662) SHA1(400c47d7ab5f3a749dbadb2286255b969ec48348) ) ROM_LOAD( "ft.03", 0x2000, 0x1000, CRC(1eb1b77c) SHA1(c08d6c1f1bbe2d41b0f6336a0c53ec993556e6b4) ) @@ -470,9 +476,6 @@ ROM_START( friskyta ) ROM_LOAD( "ft.07", 0x6000, 0x1000, CRC(0ba02b2e) SHA1(1260c16d589fca37bf58ee28a4795f4b6333d0b9) ) ROM_LOAD( "ft8_8.rom", 0x7000, 0x0800, CRC(10461a24) SHA1(c1f98316a4e90a2a6ef4953708b90c9546caaedd) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* 64k for the protection mcu */ - ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) /* shares the main program ROMs and RAM with the main CPU. */ - ROM_REGION( 0x4000, "gfx1", 0 ) ROM_LOAD( "ft.11", 0x0000, 0x1000, CRC(956d924a) SHA1(e61bf5f187932c6cb676b4120cd95fe422f6a1a6) ) ROM_LOAD( "ft.12", 0x1000, 0x1000, CRC(c028d3b8) SHA1(9e8768b9658f8b05ade4dd5fb2ecde4a52627bc1) ) @@ -486,7 +489,7 @@ ROM_END ROM_START( friskytb ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x7800, "maincpu", 0 ) ROM_LOAD( "1.3a", 0x0000, 0x1000, CRC(554bdb0f) SHA1(d56a421329c5191599983009e841cd84d5b7c710) ) ROM_LOAD( "2.3b", 0x1000, 0x1000, CRC(0658633a) SHA1(3bf09e0d77bd8fcb66563c82c849c0cc45d9cacf) ) ROM_LOAD( "3.3d", 0x2000, 0x1000, CRC(c8de15ff) SHA1(1bb2108700e9f8aa9c5416324a2d0bdd05e8ff25) ) @@ -496,9 +499,6 @@ ROM_START( friskytb ) ROM_LOAD( "7.3i", 0x6000, 0x1000, CRC(aa36a6b8) SHA1(bf8af71313459a775b07dcfdce455077c4f499bf) ) ROM_LOAD( "8.3j", 0x7000, 0x0800, CRC(10461a24) SHA1(c1f98316a4e90a2a6ef4953708b90c9546caaedd) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* 64k for the protection mcu */ - ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) /* shares the main program ROMs and RAM with the main CPU. */ - ROM_REGION( 0x4000, "gfx1", 0 ) ROM_LOAD( "11.7l", 0x0000, 0x1000, CRC(caa93315) SHA1(af8fd135c0a9c0278705975c127a91f246341da1) ) // 99.707031% - tile 0x69 is blank vs ft.11 (it's the symbol used for lives, instead this set shows lives to the left of the HIGH SCORE text using different gfx) ROM_LOAD( "12.7n", 0x1000, 0x1000, CRC(c028d3b8) SHA1(9e8768b9658f8b05ade4dd5fb2ecde4a52627bc1) ) @@ -511,7 +511,7 @@ ROM_START( friskytb ) ROM_END ROM_START( radrad ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x7800, "maincpu", 0 ) ROM_LOAD( "1.3a", 0x0000, 0x1000, CRC(b1e958ca) SHA1(3ab5fc3314f202ba527470eacbb76d52fe969bca) ) ROM_LOAD( "2.3b", 0x1000, 0x1000, CRC(30ba76b3) SHA1(e6af1fc35fdc71d5436f0d29e5722cbcb4409196) ) ROM_LOAD( "3.3c", 0x2000, 0x1000, CRC(1c9f397b) SHA1(7f556c5bef5309d5048c3b9671b88ad646a8b648) ) @@ -521,9 +521,6 @@ ROM_START( radrad ) ROM_LOAD( "7.3g", 0x6000, 0x1000, CRC(02b1f9c9) SHA1(6b857ae477d3c92a58494140ffa3337dba8e77cc) ) ROM_LOAD( "8.3h", 0x7000, 0x0800, CRC(911c90e8) SHA1(94fa91e767ab27a1616f1768f97a44a59a3f3294) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* 64k for the protection mcu */ - ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) /* shares the main program ROMs and RAM with the main CPU. */ - ROM_REGION( 0x4000, "gfx1", 0 ) ROM_LOAD( "11.l7", 0x0000, 0x1000, CRC(4ace7afb) SHA1(3c495f106505d5dfed93393db1f1b3842f603448) ) ROM_LOAD( "12.n7", 0x1000, 0x1000, CRC(b19b8473) SHA1(42160f978f8e209a89be097b5cfc7ac0aeec49c5) ) @@ -539,7 +536,7 @@ ROM_START( radrad ) ROM_END ROM_START( seicross ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x7800, "maincpu", 0 ) ROM_LOAD( "smc1", 0x0000, 0x1000, CRC(f6c3aeca) SHA1(d57019e80f7e3d47ca74f54604e92d40ba9819fc) ) ROM_LOAD( "smc2", 0x1000, 0x1000, CRC(0ec6c218) SHA1(d8cffea48d8afd229f2008399afe3858c13653e5) ) ROM_LOAD( "smc3", 0x2000, 0x1000, CRC(ceb3c8f4) SHA1(e49f834637b4addcf362cd010e31802c3e145cbe) ) @@ -549,9 +546,6 @@ ROM_START( seicross ) ROM_LOAD( "smc7", 0x6000, 0x1000, CRC(13052b03) SHA1(2866f2533a788f734310a74789f762f3fa17a57a) ) ROM_LOAD( "smc8", 0x7000, 0x0800, CRC(2093461d) SHA1(0d640bc7ee1e9ffe32580e3143677475145b06d2) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* 64k for the protection mcu */ - ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) /* shares the main program ROMs and RAM with the main CPU. */ - ROM_REGION( 0x4000, "gfx1", 0 ) ROM_LOAD( "sz11.7k", 0x0000, 0x1000, CRC(fbd9b91d) SHA1(6b3581f4b518c058b970d569ced07dd7dc6a87e6) ) ROM_LOAD( "smcd", 0x1000, 0x1000, CRC(c3c953c4) SHA1(a96937a48b59b7e992e53d279c10a5f3ea7f9a6f) ) @@ -567,7 +561,7 @@ ROM_START( seicross ) ROM_END ROM_START( sectrzon ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x7800, "maincpu", 0 ) ROM_LOAD( "sz1.3a", 0x0000, 0x1000, CRC(f0a45cb4) SHA1(ab3b8d78e25cdbb2fd6a6c0718ae13767364994d) ) ROM_LOAD( "sz2.3c", 0x1000, 0x1000, CRC(fea68ddb) SHA1(b9ed0cad9a2ded04bcc7042d975b77be63313070) ) ROM_LOAD( "sz3.3d", 0x2000, 0x1000, CRC(baad4294) SHA1(e7fc3ccc940de6df8d786c986b602127c9db9ebb) ) @@ -577,9 +571,6 @@ ROM_START( sectrzon ) ROM_LOAD( "sz7.3i", 0x6000, 0x1000, CRC(7b34dc1c) SHA1(fb163a908c991cd214e0d2d685e74563a460a929) ) ROM_LOAD( "sz8.3j", 0x7000, 0x0800, CRC(9933526a) SHA1(2178ef8653f1d60be28bcaebe1033ef7ae480157) ) - ROM_REGION( 0x10000, "mcu", 0 ) /* 64k for the protection mcu */ - ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) /* shares the main program ROMs and RAM with the main CPU. */ - ROM_REGION( 0x4000, "gfx1", 0 ) ROM_LOAD( "sz11.7k", 0x0000, 0x1000, CRC(fbd9b91d) SHA1(6b3581f4b518c058b970d569ced07dd7dc6a87e6) ) ROM_LOAD( "sz12.7m", 0x1000, 0x1000, CRC(2bdef9ad) SHA1(50fe41e81c1307317b4fb6b47bf0619d141c42ff) ) @@ -596,21 +587,18 @@ ROM_END DRIVER_INIT_MEMBER(seicross_state,friskytb) { - UINT8 *ROM = memregion("mcu")->base(); - address_space &space = m_mcu->space(AS_PROGRAM); + UINT8 *ROM = memregion("maincpu")->base(); // this code is in ROM 6.3h, maps to MCU at dxxx - for (int i = 0; i < 0x8000; i++) + for (int i = 0; i < 0x7800; i++) { - ROM[i] = BITSWAP8(ROM[i + 0x8000], 6, 7, 5, 4, 3, 2, 0, 1); + m_decrypted_opcodes[i] = BITSWAP8(ROM[i], 6, 7, 5, 4, 3, 2, 0, 1); } - - space.set_decrypted_region(0x8000, 0xffff, ROM); } GAME( 1981, friskyt, 0, nvram, friskyt, driver_device, 0, ROT0, "Nichibutsu", "Frisky Tom (set 1)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) GAME( 1981, friskyta, friskyt, nvram, friskyt, driver_device, 0, ROT0, "Nichibutsu", "Frisky Tom (set 2)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) -GAME( 1981, friskytb, friskyt, nvram, friskyt, seicross_state, friskytb, ROT0, "Nichibutsu", "Frisky Tom (set 3, encrypted)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) // protection mcu runs encrypted opcodes +GAME( 1981, friskytb, friskyt, friskytb, friskyt, seicross_state, friskytb, ROT0, "Nichibutsu", "Frisky Tom (set 3, encrypted)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) // protection mcu runs encrypted opcodes GAME( 1982, radrad, 0, no_nvram, radrad, driver_device, 0, ROT0, "Nichibutsu USA", "Radical Radial", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) GAME( 1984, seicross, 0, no_nvram, seicross, driver_device, 0, ROT90, "Nichibutsu / Alice", "Seicross", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) GAME( 1984, sectrzon, seicross, no_nvram, seicross, driver_device, 0, ROT90, "Nichibutsu / Alice", "Sector Zone", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/senjyo.c b/src/mame/drivers/senjyo.c index 16b3440d986..decc626fc7d 100644 --- a/src/mame/drivers/senjyo.c +++ b/src/mame/drivers/senjyo.c @@ -166,8 +166,12 @@ static ADDRESS_MAP_START( senjyo_map, AS_PROGRAM, 8, senjyo_state ) AM_RANGE(0xd005, 0xd005) AM_READ_PORT("DSW2") ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, senjyo_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( senjyo_sound_map, AS_PROGRAM, 8, senjyo_state ) - AM_RANGE(0x0000, 0x3fff) AM_ROM + AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x4000, 0x43ff) AM_RAM AM_RANGE(0x8000, 0x8000) AM_DEVWRITE("sn1", sn76496_device, write) AM_RANGE(0x9000, 0x9000) AM_DEVWRITE("sn2", sn76496_device, write) @@ -233,7 +237,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( starforb_sound_map, AS_PROGRAM, 8, senjyo_state ) - AM_RANGE(0x0000, 0x3fff) AM_ROM + AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x4000, 0x43ff) AM_RAM AM_RANGE(0x8000, 0x8000) AM_DEVWRITE("sn1", sn76496_device, write) AM_RANGE(0x9000, 0x9000) AM_DEVWRITE("sn2", sn76496_device, write) @@ -606,8 +610,12 @@ static MACHINE_CONFIG_START( senjyo, senjyo_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.05) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( senjyox, senjyo ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( starforb, senjyo ) +static MACHINE_CONFIG_DERIVED( starforb, senjyox ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") @@ -625,13 +633,13 @@ MACHINE_CONFIG_END ***************************************************************************/ ROM_START( senjyo ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "08m_05t.bin", 0x0000, 0x2000, CRC(b1f3544d) SHA1(59997164dfb740fce1862d89754be7517303161a) ) ROM_LOAD( "08k_04t.bin", 0x2000, 0x2000, CRC(e34468a8) SHA1(1931788e4ebe0dab9525f795b639be6544a6b31a) ) ROM_LOAD( "08j_03t.bin", 0x4000, 0x2000, CRC(c33aedee) SHA1(5adf83268ef7b91194dea41204bdb931a14f2158) ) ROM_LOAD( "08f_02t.bin", 0x6000, 0x2000, CRC(0ef4db9e) SHA1(0dcb216495f4328c44cc0af87ffb0bd255b7dc1a) ) - ROM_REGION( 0x10000, "sub", 0 ) /* 64k for sound board */ + ROM_REGION( 0x2000, "sub", 0 ) ROM_LOAD( "02h_01t.bin", 0x0000, 0x2000, CRC(c1c24455) SHA1(24a2ab9e4df793f68f51bbe6a1313f38d951a8af) ) ROM_REGION( 0x03000, "gfx1", 0 ) @@ -666,11 +674,11 @@ ROM_START( senjyo ) ROM_END ROM_START( starforc ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "3.3p", 0x0000, 0x4000, CRC(8ba27691) SHA1(2b8b1e634ef5bed5c61a078e64a6dda77f84cdf5) ) ROM_LOAD( "2.3mn", 0x4000, 0x4000, CRC(0fc4d2d6) SHA1(0743e3928d5cc0e3f1bcdaf4b0cc83aeb7a2f7a8) ) - ROM_REGION( 0x10000, "sub", 0 ) /* 64k for sound board */ + ROM_REGION( 0x2000, "sub", 0 ) /* 64k for sound board */ ROM_LOAD( "1.3hj", 0x0000, 0x2000, CRC(2735bb22) SHA1(1bd0558e05b41aebab3911991969512df904fea5) ) ROM_REGION( 0x03000, "gfx1", 0 ) @@ -703,13 +711,13 @@ ROM_START( starforc ) ROM_END ROM_START( starforcb ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "a2.8m", 0x0000, 0x2000, CRC(e81e8b7d) SHA1(829a082a335a0cf5bf8cc97bee96e62271f03ff4) ) ROM_LOAD( "a3.8k", 0x2000, 0x2000, CRC(7e98f0ab) SHA1(76eb387fbf5d04b7951a115d29076d1fd21346c4) ) ROM_LOAD( "a4.8j", 0x4000, 0x2000, CRC(285bc599) SHA1(c2f294a5e3ca39084e8f8503d6e9e00885ad0609) ) ROM_LOAD( "a5.8f", 0x6000, 0x2000, CRC(74d328b1) SHA1(3098438d47f650507de8b1d0aecfca81663cbe9c) ) - ROM_REGION( 0x10000, "sub", 0 ) /* 64k for sound board */ + ROM_REGION( 0x2000, "sub", 0 ) ROM_LOAD( "a0.2e", 0x0000, 0x2000, CRC(5ab0e2fa) SHA1(78f0290d1e006a39bb8ee5a29cf229ed2c1f2b09) ) ROM_REGION( 0x03000, "gfx1", 0 ) @@ -745,13 +753,13 @@ ROM_START( starforcb ) ROM_END ROM_START( starforca ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "5.bin", 0x0000, 0x2000, CRC(7691bbd4) SHA1(efcab11ea0ed58b6a47c9d7a994c921dfaa1b47e) ) ROM_LOAD( "4.bin", 0x2000, 0x2000, CRC(32f3c34e) SHA1(9ecaa46fe296c2f2e9c8faf3d40085c0f10acbe1) ) ROM_LOAD( "3.bin", 0x4000, 0x2000, CRC(5e99cfa0) SHA1(d16d5247f4afb7abb5b8331ad7ae9d4d1f6d6554) ) ROM_LOAD( "2.bin", 0x6000, 0x2000, CRC(311c6e59) SHA1(ff3ba96ffade7602d3b150dae4bdc1c02a148576) ) - ROM_REGION( 0x10000, "sub", 0 ) /* 64k for sound board */ + ROM_REGION( 0x2000, "sub", 0 ) ROM_LOAD( "0.bin", 0x0000, 0x2000, CRC(a277c268) SHA1(99ed8439119fa4b850ad8aadb7ff3e54d4cd40be) ) ROM_REGION( 0x03000, "gfx1", 0 ) @@ -787,13 +795,13 @@ ROM_START( starforca ) ROM_END ROM_START( starforce ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "starfore.005", 0x0000, 0x2000, CRC(825f7ebe) SHA1(d63fd516e075bcc28d42189216b95bbf491a4cd1) ) ROM_LOAD( "starfore.004", 0x2000, 0x2000, CRC(fbcecb65) SHA1(0406ae134915539a171603ecdd1b549f98dd048c) ) ROM_LOAD( "starfore.003", 0x4000, 0x2000, CRC(9f8013b9) SHA1(5398c97d84b4458ff926e07d6189d60565fbd8f1) ) ROM_LOAD( "starfore.002", 0x6000, 0x2000, CRC(f8111eba) SHA1(cf3295ffae4e36e87aea4332613f2cafb51522ce) ) - ROM_REGION( 0x10000, "sub", 0 ) /* 64k for sound board */ + ROM_REGION( 0x2000, "sub", 0 ) ROM_LOAD( "starfore.000", 0x0000, 0x2000, CRC(a277c268) SHA1(99ed8439119fa4b850ad8aadb7ff3e54d4cd40be) ) ROM_REGION( 0x03000, "gfx1", 0 ) @@ -826,11 +834,11 @@ ROM_START( starforce ) ROM_END ROM_START( megaforc ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "mf3.bin", 0x0000, 0x4000, CRC(d3ea82ec) SHA1(e15fda65ba24517cc04abc55b5d079a33327553c) ) ROM_LOAD( "mf2.bin", 0x4000, 0x4000, CRC(aa320718) SHA1(cbbf8e4d06a1ecf77d776058d965afdaa7f5b47f) ) - ROM_REGION( 0x10000, "sub", 0 ) /* 64k for sound board */ + ROM_REGION( 0x2000, "sub", 0 ) ROM_LOAD( "1.3hj", 0x0000, 0x2000, CRC(2735bb22) SHA1(1bd0558e05b41aebab3911991969512df904fea5) ) ROM_REGION( 0x03000, "gfx1", 0 ) @@ -863,11 +871,11 @@ ROM_START( megaforc ) ROM_END ROM_START( baluba ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "0", 0x0000, 0x4000, CRC(0e2ebe32) SHA1(d5cac260b19dc4e8d2064a7e3de5d52ab0eb95d0) ) ROM_LOAD( "1", 0x4000, 0x4000, CRC(cde97076) SHA1(ef47851b2ed0d820e1564545795b707d00d5c6ce) ) - ROM_REGION( 0x10000, "sub", 0 ) /* 64k for sound board */ + ROM_REGION( 0x2000, "sub", 0 ) ROM_LOAD( "2", 0x0000, 0x2000, CRC(441fbc64) SHA1(3853f80043e28e06a3ee399e3cd261b3ee94e0b9) ) ROM_REGION( 0x03000, "gfx1", 0 ) @@ -907,8 +915,29 @@ DRIVER_INIT_MEMBER(senjyo_state,starforc) } DRIVER_INIT_MEMBER(senjyo_state,starfore) { - /* encrypted CPU */ - suprloco_decode(machine(), "maincpu"); + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...0...0 */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...0...1 */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...1...0 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...1 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...1...0...0 */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...1...0...1 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...1...1...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...1...1 */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...0...0...0 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...0...1 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...1...0 */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...0...1...1 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...1...0...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...1 */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...1...1...0 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 } /* ...1...1...1...1 */ + }; + + sega_decode(memregion("maincpu")->base(), m_decrypted_opcodes, 0x8000, convtable); m_is_senjyo = 0; m_scrollhack = 0; @@ -916,8 +945,29 @@ DRIVER_INIT_MEMBER(senjyo_state,starfore) DRIVER_INIT_MEMBER(senjyo_state,starfora) { - /* encrypted CPU */ - yamato_decode(machine(), "maincpu"); + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...0 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x20,0xa0,0x28,0xa8 }, /* ...0...0...1...1 */ + { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x08,0x28 }, /* ...0...1...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...0...1 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x20,0xa0,0x28,0xa8 }, /* ...0...1...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...1...1 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...0...0...0 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...0...1 */ + { 0xa0,0x20,0x80,0x00 }, { 0x20,0xa0,0x28,0xa8 }, /* ...1...0...1...0 */ + { 0x28,0x20,0xa8,0xa0 }, { 0x20,0xa0,0x28,0xa8 }, /* ...1...0...1...1 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...1...0...0 */ + { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...1...0...1 */ + { 0xa0,0x20,0x80,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...1...1...1...0 */ + { 0x20,0xa0,0x28,0xa8 }, { 0x00,0x08,0x20,0x28 } /* ...1...1...1...1 */ + }; + + sega_decode(memregion("maincpu")->base(), m_decrypted_opcodes, 0x8000, convtable); m_is_senjyo = 0; m_scrollhack = 1; @@ -932,8 +982,8 @@ DRIVER_INIT_MEMBER(senjyo_state,senjyo) GAME( 1983, senjyo, 0, senjyo, senjyo, senjyo_state, senjyo, ROT90, "Tehkan", "Senjyo", GAME_SUPPORTS_SAVE ) GAME( 1984, starforc, 0, senjyo, starforc, senjyo_state, starforc, ROT90, "Tehkan", "Star Force", GAME_SUPPORTS_SAVE ) -GAME( 1984, starforce,starforc, senjyo, starforc, senjyo_state, starfore, ROT90, "Tehkan", "Star Force (encrypted, set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1984, starforce,starforc, senjyox, starforc, senjyo_state, starfore, ROT90, "Tehkan", "Star Force (encrypted, set 1)", GAME_SUPPORTS_SAVE ) GAME( 1984, starforcb,starforc, starforb,starforc, senjyo_state, starfore, ROT90, "bootleg", "Star Force (encrypted, bootleg)", GAME_SUPPORTS_SAVE ) -GAME( 1984, starforca,starforc, senjyo, starforc, senjyo_state, starfora, ROT90, "Tehkan", "Star Force (encrypted, set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1984, starforca,starforc, senjyox, starforc, senjyo_state, starfora, ROT90, "Tehkan", "Star Force (encrypted, set 2)", GAME_SUPPORTS_SAVE ) GAME( 1985, megaforc, starforc, senjyo, starforc, senjyo_state, starforc, ROT90, "Tehkan (Video Ware license)", "Mega Force", GAME_SUPPORTS_SAVE ) GAME( 1986, baluba, 0, senjyo, baluba, senjyo_state, starforc, ROT90, "Able Corp, Ltd.", "Baluba-louk no Densetsu (Japan)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/sg1000a.c b/src/mame/drivers/sg1000a.c index dbee65b80ea..2da7f13e8f1 100644 --- a/src/mame/drivers/sg1000a.c +++ b/src/mame/drivers/sg1000a.c @@ -126,13 +126,15 @@ class sg1000a_state : public driver_device public: sg1000a_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu") { } + m_maincpu(*this, "maincpu"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } DECLARE_WRITE_LINE_MEMBER(vdp_interrupt); DECLARE_WRITE8_MEMBER(sg1000a_coin_counter_w); DECLARE_DRIVER_INIT(sg1000a); DECLARE_DRIVER_INIT(chwrestl); required_device<cpu_device> m_maincpu; + optional_shared_ptr<UINT8> m_decrypted_opcodes; }; @@ -143,11 +145,15 @@ public: *************************************/ static ADDRESS_MAP_START( program_map, AS_PROGRAM, 8, sg1000a_state ) - AM_RANGE(0x0000, 0x7fff) AM_ROM // separate region needed for decrypting - AM_RANGE(0x8000, 0xbfff) AM_ROM + AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0xc000, 0xc3ff) AM_RAM AM_MIRROR(0x400) ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, sg1000a_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") + AM_RANGE(0x8000, 0xbfff) AM_ROM AM_REGION("maincpu", 0x8000) +ADDRESS_MAP_END + static ADDRESS_MAP_START( io_map, AS_IO, 8, sg1000a_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x7f, 0x7f) AM_DEVWRITE("snsnd", sn76489_device, write) @@ -285,6 +291,11 @@ static MACHINE_CONFIG_START( sg1000a, sg1000a_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( sg1000ax, sg1000a ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + /************************************* * * ROM definitions @@ -324,8 +335,30 @@ DRIVER_INIT_MEMBER(sg1000a_state,sg1000a) DRIVER_INIT_MEMBER(sg1000a_state,chwrestl) { + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x28,0x08,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...0 */ + { 0x28,0x08,0xa8,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...0...1 */ + { 0x88,0x80,0x08,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...1...0 */ + { 0x88,0x08,0x80,0x00 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...1...1 */ + { 0x28,0x08,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...0 */ + { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...1 */ + { 0x88,0x08,0x80,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...0...1...1...0 */ + { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...1...1...1 */ + { 0x80,0xa0,0x00,0x20 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...0...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...0...1 */ + { 0x80,0xa0,0x00,0x20 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...0...1...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...0...1...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...1...0...0 */ + { 0x80,0xa0,0x00,0x20 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...1...0...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...1...1...0 */ + { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 } /* ...1...1...1...1 */ + }; + DRIVER_INIT_CALL(sg1000a); - regulus_decode(machine(), "maincpu"); + sega_decode(memregion("maincpu")->base(), m_decrypted_opcodes, 0x8000, convtable); } /************************************* @@ -334,6 +367,6 @@ DRIVER_INIT_MEMBER(sg1000a_state,chwrestl) * *************************************/ -GAME( 1984, chboxing, 0, sg1000a, chboxing, sg1000a_state, sg1000a, ROT0, "Sega", "Champion Boxing", 0 ) -GAME( 1985, chwrestl, 0, sg1000a, chwrestl, sg1000a_state, chwrestl, ROT0, "Sega", "Champion Pro Wrestling", 0 ) -GAME( 1985, dokidoki, 0, sg1000a, dokidoki, sg1000a_state, sg1000a, ROT0, "Sega", "Doki Doki Penguin Land", 0 ) +GAME( 1984, chboxing, 0, sg1000a, chboxing, sg1000a_state, sg1000a, ROT0, "Sega", "Champion Boxing", 0 ) +GAME( 1985, chwrestl, 0, sg1000ax, chwrestl, sg1000a_state, chwrestl, ROT0, "Sega", "Champion Pro Wrestling", 0 ) +GAME( 1985, dokidoki, 0, sg1000a, dokidoki, sg1000a_state, sg1000a, ROT0, "Sega", "Doki Doki Penguin Land", 0 ) diff --git a/src/mame/drivers/stfight.c b/src/mame/drivers/stfight.c index 75467910f10..9a2d235754b 100644 --- a/src/mame/drivers/stfight.c +++ b/src/mame/drivers/stfight.c @@ -275,6 +275,10 @@ static ADDRESS_MAP_START( cpu1_map, AS_PROGRAM, 8, stfight_state ) AM_RANGE(0xf000, 0xffff) AM_RAM AM_SHARE("sprite_ram") ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, stfight_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( cshooter_cpu1_map, AS_PROGRAM, 8, stfight_state ) AM_RANGE(0xc801, 0xc801) AM_WRITE(stfight_bank_w) AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(cshooter_text_w) AM_SHARE("tx_vram") @@ -536,6 +540,7 @@ static MACHINE_CONFIG_START( stfight, stfight_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz / 4) MCFG_CPU_PROGRAM_MAP(cpu1_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", stfight_state, stfight_vb_interrupt) MCFG_CPU_ADD("audiocpu", Z80, XTAL_12MHz / 4) @@ -589,6 +594,7 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( cshooter, stfight ) MCFG_CPU_REPLACE("maincpu", Z80, XTAL_12MHz / 2) MCFG_CPU_PROGRAM_MAP(cshooter_cpu1_map) + MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_DECRYPTED_OPCODES) MCFG_CPU_VBLANK_INT_DRIVER("screen", stfight_state, stfight_vb_interrupt) MCFG_CPU_REPLACE("audiocpu", Z80, XTAL_12MHz / 2) diff --git a/src/mame/drivers/suna8.c b/src/mame/drivers/suna8.c index bf8ffd55b04..2761d97955b 100644 --- a/src/mame/drivers/suna8.c +++ b/src/mame/drivers/suna8.c @@ -73,14 +73,15 @@ DRIVER_INIT_MEMBER(suna8_state,hardhead) rom[i] = BITSWAP8(rom[i], 7,6,5,3,4,2,1,0) ^ 0x58; } + membank("bank0d")->set_base(memregion("maincpu")->base()); membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x4000); + membank("bank1d")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x4000); } /* Non encrypted bootleg */ DRIVER_INIT_MEMBER(suna8_state,hardhedb) { - address_space &space = m_maincpu->space(AS_PROGRAM); - space.set_decrypted_region(0x0000, 0x7fff, memregion("maincpu")->base() + 0x48000); + membank("bank0d")->set_base(memregion("maincpu")->base() + 0x48000); membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x4000); } @@ -137,14 +138,13 @@ DRIVER_INIT_MEMBER(suna8_state, brickzn_common) m_decrypt = brickzn_decrypt(); // Non-banked opcodes - address_space &space = m_maincpu->space(AS_PROGRAM); - space.set_decrypted_region(0x0000, 0x7fff, m_decrypt); + membank("bank0d")->set_base(m_decrypt); // Data banks: 00-0f normal data decryption, 10-1f alternate data decryption: membank("bank1")->configure_entries(0, 16*2, memregion("maincpu")->base() + 0x10000, 0x4000); // Opcode banks: 00-1f normal opcode decryption: - membank("bank1")->configure_decrypted_entries(0, 16, m_decrypt + 0x10000, 0x4000); - membank("bank1")->configure_decrypted_entries(16, 16, m_decrypt + 0x10000, 0x4000); + membank("bank1d")->configure_entries(0, 16, m_decrypt + 0x10000, 0x4000); + membank("bank1d")->configure_entries(16, 16, m_decrypt + 0x10000, 0x4000); } DRIVER_INIT_MEMBER(suna8_state,brickzn) @@ -209,8 +209,8 @@ DRIVER_INIT_MEMBER(suna8_state,brickzn11) // Data banks: 00-0f normal data decryption, 10-1f alternate data decryption: membank("bank1")->configure_entries(0, 16*2, memregion("maincpu")->base() + 0x10000, 0x4000); // Opcode banks: 00-1f normal opcode decryption: - membank("bank1")->configure_decrypted_entries(0, 16, decrypt + 0x10000, 0x4000); - membank("bank1")->configure_decrypted_entries(16, 16, decrypt + 0x10000, 0x4000); + membank("bank1d")->configure_entries(0, 16, decrypt + 0x10000, 0x4000); + membank("bank1d")->configure_entries(16, 16, decrypt + 0x10000, 0x4000); } @@ -220,14 +220,13 @@ DRIVER_INIT_MEMBER(suna8_state,brickzn11) DRIVER_INIT_MEMBER(suna8_state,hardhea2) { - address_space &space = m_maincpu->space(AS_PROGRAM); UINT8 *RAM = memregion("maincpu")->base(); size_t size = memregion("maincpu")->bytes(); UINT8 *decrypt = auto_alloc_array(machine(), UINT8, size); UINT8 x; int i; - space.set_decrypted_region(0x0000, 0x7fff, decrypt); + membank("bank0d")->set_base(decrypt); /* Address lines scrambling */ memcpy(decrypt, RAM, size); @@ -307,14 +306,13 @@ rom13: 0?, 1y, 2n, 3n ?,?,?,? (palettes) DRIVER_INIT_MEMBER(suna8_state,starfigh) { - address_space &space = m_maincpu->space(AS_PROGRAM); UINT8 *RAM = memregion("maincpu")->base(); size_t size = memregion("maincpu")->bytes(); UINT8 *decrypt = auto_alloc_array(machine(), UINT8, size); UINT8 x; int i; - space.set_decrypted_region(0x0000, 0x7fff, decrypt); + membank("bank0d")->set_base(decrypt); /* Address lines scrambling */ memcpy(decrypt, RAM, size); @@ -393,14 +391,13 @@ DRIVER_INIT_MEMBER(suna8_state,starfigh) DRIVER_INIT_MEMBER(suna8_state,sparkman) { - address_space &space = m_maincpu->space(AS_PROGRAM); UINT8 *RAM = memregion("maincpu")->base(); size_t size = memregion("maincpu")->bytes(); UINT8 *decrypt = auto_alloc_array(machine(), UINT8, size); UINT8 x; int i; - space.set_decrypted_region(0x0000, 0x7fff, decrypt); + membank("bank0d")->set_base(decrypt); /* Address lines scrambling */ memcpy(decrypt, RAM, size); @@ -539,6 +536,7 @@ WRITE8_MEMBER(suna8_state::hardhead_bankswitch_w) if (data & ~0xef) logerror("CPU #0 - PC %04X: unknown bank bits: %02X\n",space.device().safe_pc(),data); membank("bank1")->set_entry(bank); + membank("bank1d")->set_entry(bank); } @@ -571,6 +569,10 @@ static ADDRESS_MAP_START( hardhead_map, AS_PROGRAM, 8, suna8_state ) AM_RANGE(0xe000, 0xffff) AM_RAM_WRITE(suna8_spriteram_w) AM_SHARE("spriteram") // Sprites ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, suna8_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROMBANK("bank0d") + AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1d") +ADDRESS_MAP_END static ADDRESS_MAP_START( hardhead_io_map, AS_IO, 8, suna8_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) @@ -596,6 +598,7 @@ WRITE8_MEMBER(suna8_state::rranger_bankswitch_w) if (data & ~0xf7) logerror("CPU #0 - PC %04X: unknown bank bits: %02X\n",space.device().safe_pc(),data); membank("bank1")->set_entry(bank); + membank("bank1d")->set_entry(bank); flip_screen_set(data & 0x20); coin_lockout_w ( machine(), 0, data & 0x40); @@ -695,6 +698,7 @@ WRITE8_MEMBER(suna8_state::brickzn_rombank_w) if (data & ~0x0f) logerror("CPU #0 - PC %04X: unknown rom bank bits: %02X\n",space.device().safe_pc(),data); membank("bank1")->set_entry(bank + (membank("bank1")->entry() & 0x10)); + membank("bank1d")->set_entry(membank("bank1")->entry()); m_rombank = data; } @@ -812,13 +816,11 @@ WRITE8_MEMBER(suna8_state::brickzn_multi_w) if (m_prot_opcode_toggle == 0) { - address_space &space = m_maincpu->space(AS_PROGRAM); - space.set_decrypted_region(0x0000, 0x7fff, m_decrypt); + membank("bank0d")->set_base(m_decrypt); } else { - address_space &space = m_maincpu->space(AS_PROGRAM); - space.set_decrypted_region(0x0000, 0x7fff, memregion("maincpu")->base()); + membank("bank0d")->set_base(memregion("maincpu")->base()); } } } @@ -839,6 +841,7 @@ WRITE8_MEMBER(suna8_state::brickzn_prot2_w) // Select alternate data decryption, see code at 787e: membank("bank1")->set_entry((membank("bank1")->entry() & 0x0f) + ((m_prot2 == (data | 0xdc)) ? 0x10 : 0)); + membank("bank1d")->set_entry(membank("bank1")->entry()); m_prot2_prev = m_prot2; m_prot2 = data; @@ -941,6 +944,7 @@ WRITE8_MEMBER(suna8_state::hardhea2_rombank_w) if (data & ~0x0f) logerror("CPU #0 - PC %04X: unknown rom bank bits: %02X\n",space.device().safe_pc(),data); membank("bank1")->set_entry(bank); + membank("bank1d")->set_entry(bank); m_rombank = data; } @@ -1080,6 +1084,7 @@ WRITE8_MEMBER(suna8_state::starfigh_leds_w) int bank = m_rombank_latch & 0x0f; membank("bank1")->set_entry(bank); + membank("bank1d")->set_entry(bank); m_rombank = m_rombank_latch; logerror("CPU #0 - PC %04X: rom bank = %02X\n",space.device().safe_pc(), m_rombank); @@ -1193,6 +1198,7 @@ WRITE8_MEMBER(suna8_state::sparkman_rombank_w) int bank = m_rombank_latch & 0x0f; membank("bank1")->set_entry(bank); + membank("bank1d")->set_entry(bank); m_rombank = m_rombank_latch; logerror("CPU #0 - PC %04X: rom bank = %02X\n",space.device().safe_pc(), m_rombank); @@ -1868,6 +1874,7 @@ static MACHINE_CONFIG_START( hardhead, suna8_state ) MCFG_CPU_ADD("maincpu", Z80, SUNA8_MASTER_CLOCK / 4) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(hardhead_map) MCFG_CPU_IO_MAP(hardhead_io_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", suna8_state, irq0_line_hold) /* No NMI */ MCFG_CPU_ADD("audiocpu", Z80, SUNA8_MASTER_CLOCK / 8) /* verified on pcb */ @@ -1922,6 +1929,7 @@ static MACHINE_CONFIG_START( rranger, suna8_state ) MCFG_CPU_ADD("maincpu", Z80, SUNA8_MASTER_CLOCK / 4) /* ? */ MCFG_CPU_PROGRAM_MAP(rranger_map) MCFG_CPU_IO_MAP(rranger_io_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", suna8_state, irq0_line_hold) /* IRQ & NMI ! */ MCFG_CPU_ADD("audiocpu", Z80, SUNA8_MASTER_CLOCK / 8) /* verified on pcb */ @@ -1974,6 +1982,7 @@ MACHINE_RESET_MEMBER(suna8_state,brickzn) m_paletteram_enab = 1; // for brickzn11 m_remap_sound = 0; membank("bank1")->set_entry(0); + membank("bank1d")->set_entry(0); } static MACHINE_CONFIG_START( brickzn11, suna8_state ) @@ -1981,6 +1990,7 @@ static MACHINE_CONFIG_START( brickzn11, suna8_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, SUNA8_MASTER_CLOCK / 4) /* SUNA PROTECTION BLOCK */ MCFG_CPU_PROGRAM_MAP(brickzn11_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", suna8_state, irq0_line_hold) // nmi breaks ramtest but is needed! MCFG_CPU_ADD("audiocpu", Z80, SUNA8_MASTER_CLOCK / 4) /* Z0840006PSC - 6MHz (measured) */ @@ -2065,6 +2075,7 @@ static MACHINE_CONFIG_DERIVED( hardhea2, brickzn ) MCFG_CPU_ADD("maincpu", Z80, SUNA8_MASTER_CLOCK / 4) /* SUNA T568009 */ MCFG_CPU_PROGRAM_MAP(hardhea2_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", suna8_state, hardhea2_interrupt, "screen", 0, 1) MCFG_MACHINE_RESET_OVERRIDE(suna8_state,hardhea2) @@ -2084,6 +2095,7 @@ static MACHINE_CONFIG_START( starfigh, suna8_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, SUNA8_MASTER_CLOCK / 4) /* ? */ MCFG_CPU_PROGRAM_MAP(starfigh_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", suna8_state, hardhea2_interrupt, "screen", 0, 1) /* The sound section is identical to that of hardhead */ @@ -2135,6 +2147,7 @@ static MACHINE_CONFIG_START( sparkman, suna8_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, SUNA8_MASTER_CLOCK / 4) /* ? */ MCFG_CPU_PROGRAM_MAP(sparkman_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", suna8_state, hardhea2_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, SUNA8_MASTER_CLOCK / 4) /* ? */ diff --git a/src/mame/drivers/suprloco.c b/src/mame/drivers/suprloco.c index 587fdb4e004..2779544ffa9 100644 --- a/src/mame/drivers/suprloco.c +++ b/src/mame/drivers/suprloco.c @@ -36,8 +36,7 @@ WRITE8_MEMBER(suprloco_state::soundport_w) } static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, suprloco_state ) - AM_RANGE(0x0000, 0x7fff) AM_ROM - AM_RANGE(0x8000, 0xbfff) AM_ROM + AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0xc000, 0xc1ff) AM_RAM AM_SHARE("spriteram") AM_RANGE(0xc800, 0xc800) AM_READ_PORT("SYSTEM") AM_RANGE(0xd000, 0xd000) AM_READ_PORT("P1") @@ -52,6 +51,10 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, suprloco_state ) AM_RANGE(0xf800, 0xffff) AM_RAM ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, suprloco_state ) + AM_RANGE(0x0000, 0xbfff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, suprloco_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_RAM @@ -165,6 +168,7 @@ static MACHINE_CONFIG_START( suprloco, suprloco_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 4000000) /* 4 MHz (?) */ MCFG_CPU_PROGRAM_MAP(main_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", suprloco_state, irq0_line_hold) MCFG_CPU_ADD("audiocpu", Z80, 4000000) @@ -202,7 +206,7 @@ MACHINE_CONFIG_END ***************************************************************************/ ROM_START( suprloco ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "epr-5226a.37", 0x0000, 0x4000, CRC(33b02368) SHA1(c6e3116ad4b52bcc3174de5770f7a7ce024790d5) ) /* encrypted */ ROM_LOAD( "epr-5227a.15", 0x4000, 0x4000, CRC(a5e67f50) SHA1(1dd52e4cf00ce414fe1db8259c9976cdc23513b4) ) /* encrypted */ ROM_LOAD( "epr-5228.28", 0x8000, 0x4000, CRC(a597828a) SHA1(61004d112591fd2d752c39df71c1304d9308daae) ) @@ -231,7 +235,7 @@ ROM_START( suprloco ) ROM_END ROM_START( suprlocoo ) - ROM_REGION( 2*0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "epr-5226.37", 0x0000, 0x4000, CRC(57f514dd) SHA1(707800b90a22547a56b01d1e11775e9ee5555d23) ) /* encrypted */ ROM_LOAD( "epr-5227.15", 0x4000, 0x4000, CRC(5a1d2fb0) SHA1(fdb9416e5530718245fd597073a63feddb233c3c) ) /* encrypted */ ROM_LOAD( "epr-5228.28", 0x8000, 0x4000, CRC(a597828a) SHA1(61004d112591fd2d752c39df71c1304d9308daae) ) @@ -292,9 +296,30 @@ DRIVER_INIT_MEMBER(suprloco_state,suprloco) } } + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...0...0 */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...0...1 */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...1...0 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...1 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...1...0...0 */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...1...0...1 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...1...1...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...1...1 */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...0...0...0 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...0...1 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...1...0 */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...0...1...1 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...1...0...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...1 */ + { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...1...1...0 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 } /* ...1...1...1...1 */ + }; /* decrypt program ROMs */ - suprloco_decode(machine(), "maincpu"); + sega_decode(memregion("maincpu")->base(), m_decrypted_opcodes, 0xc000, convtable); } diff --git a/src/mame/drivers/system1.c b/src/mame/drivers/system1.c index e21fa0d4987..6cbaa042973 100644 --- a/src/mame/drivers/system1.c +++ b/src/mame/drivers/system1.c @@ -358,13 +358,20 @@ static const UINT8 cc_ex[0x100] = { void system1_state::machine_start() { - UINT32 numbanks = (memregion("maincpu")->bytes() - 0x10000) / 0x4000; + UINT32 numbanks = (m_maincpu_region->bytes() - 0x10000) / 0x4000; if (numbanks > 0) - membank("bank1")->configure_entries(0, numbanks, memregion("maincpu")->base() + 0x10000, 0x4000); + m_bank1->configure_entries(0, numbanks, m_maincpu_region->base() + 0x10000, 0x4000); else - membank("bank1")->configure_entry(0, memregion("maincpu")->base() + 0x8000); - membank("bank1")->set_entry(0); + m_bank1->configure_entry(0, m_maincpu_region->base() + 0x8000); + m_bank1->set_entry(0); + + if (m_banked_decrypted_opcodes) + { + m_bank0d->set_base(m_banked_decrypted_opcodes); + m_bank1d->configure_entries(0, numbanks, m_banked_decrypted_opcodes + 0x10000, 0x4000); + m_bank1d->set_entry(0); + } m_maincpu->z80_set_cycle_tables(cc_op, cc_cb, cc_ed, cc_xy, cc_xycb, cc_ex); @@ -400,14 +407,16 @@ void system1_state::machine_reset() void system1_state::bank44_custom_w(UINT8 data, UINT8 prevdata) { /* bank bits are bits 6 and 2 */ - membank("bank1")->set_entry(((data & 0x40) >> 5) | ((data & 0x04) >> 2)); + m_bank1->set_entry(((data & 0x40) >> 5) | ((data & 0x04) >> 2)); } void system1_state::bank0c_custom_w(UINT8 data, UINT8 prevdata) { /* bank bits are bits 3 and 2 */ - membank("bank1")->set_entry((data & 0x0c) >> 2); + m_bank1->set_entry((data & 0x0c) >> 2); + if(m_bank1d) + m_bank1d->set_entry((data & 0x0c) >> 2); } @@ -592,7 +601,7 @@ READ8_MEMBER(system1_state::mcu_io_r) return m_maincpu->space(AS_PROGRAM).read_byte(offset); case 1: - return memregion("maincpu")->base()[offset + 0x10000]; + return m_maincpu_region->base()[offset + 0x10000]; case 2: return m_maincpu->space(AS_IO).read_byte(offset); @@ -733,6 +742,22 @@ static ADDRESS_MAP_START( system1_map, AS_PROGRAM, 8, system1_state ) AM_RANGE(0xfc00, 0xffff) AM_WRITE(system1_sprite_collision_reset_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, system1_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") + AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") + AM_RANGE(0xc000, 0xcfff) AM_RAM AM_SHARE("ram") + AM_RANGE(0xd000, 0xd7ff) AM_RAM AM_SHARE("spriteram") + AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(system1_paletteram_w) AM_SHARE("paletteram") +ADDRESS_MAP_END + +static ADDRESS_MAP_START( banked_decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, system1_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROMBANK("bank0d") + AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1d") + AM_RANGE(0xc000, 0xcfff) AM_RAM AM_SHARE("ram") + AM_RANGE(0xd000, 0xd7ff) AM_RAM AM_SHARE("spriteram") + AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(system1_paletteram_w) AM_SHARE("paletteram") +ADDRESS_MAP_END + /* same as normal System 1 except address map is shuffled (RAM/collision are swapped) */ static ADDRESS_MAP_START( nobo_map, AS_PROGRAM, 8, system1_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM @@ -2146,6 +2171,12 @@ static MACHINE_CONFIG_START( sys1ppi, system1_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( sys1ppix, sys1ppi ) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + + /* reduced visible area for scrolling games */ static MACHINE_CONFIG_DERIVED( sys1ppis, sys1ppi ) @@ -2154,6 +2185,10 @@ static MACHINE_CONFIG_DERIVED( sys1ppis, sys1ppi ) MCFG_SCREEN_VISIBLE_AREA(2*(0*8+8), 2*(32*8-1-8), 0*8, 28*8-1) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( sys1ppisx, sys1ppis ) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END /* revised board with 128kbit ROMs and a Z80 PIO for outputs */ @@ -2169,6 +2204,11 @@ static MACHINE_CONFIG_DERIVED( sys1pio, sys1ppi ) MCFG_Z80PIO_OUT_PB_CB(WRITE8(system1_state, videomode_w)) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( sys1piox, sys1pio ) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + /* reduced visible area for scrolling games */ static MACHINE_CONFIG_DERIVED( sys1pios, sys1pio ) @@ -2177,6 +2217,10 @@ static MACHINE_CONFIG_DERIVED( sys1pios, sys1pio ) MCFG_SCREEN_VISIBLE_AREA(2*(0*8+8), 2*(32*8-1-8), 0*8, 28*8-1) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( sys1piosx, sys1pios ) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END /* this describes the additional 8751 MCU when present */ @@ -2223,6 +2267,16 @@ static MACHINE_CONFIG_DERIVED( sys2, sys1ppi ) MCFG_SCREEN_UPDATE_DRIVER(system1_state, screen_update_system2) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( sys2x, sys2 ) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( sys2xb, sys2 ) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(banked_decrypted_opcodes_map) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( sys2m, sys2 ) MCFG_FRAGMENT_ADD( mcu ) MACHINE_CONFIG_END @@ -2235,6 +2289,11 @@ static MACHINE_CONFIG_DERIVED( sys2row, sys2 ) MCFG_SCREEN_UPDATE_DRIVER(system1_state, screen_update_system2_rowscroll) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( sys2rowxb, sys2row ) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(banked_decrypted_opcodes_map) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( sys2rowm, sys2row ) MCFG_FRAGMENT_ADD( mcu ) MACHINE_CONFIG_END @@ -4688,55 +4747,704 @@ ROM_END DRIVER_INIT_MEMBER(system1_state,bank00) { m_videomode_custom = NULL; + m_banked_decrypted_opcodes = NULL; } + DRIVER_INIT_MEMBER(system1_state,bank44) { m_videomode_custom = &system1_state::bank44_custom_w; + m_banked_decrypted_opcodes = NULL; } DRIVER_INIT_MEMBER(system1_state,bank0c) { m_videomode_custom = &system1_state::bank0c_custom_w; + m_banked_decrypted_opcodes = NULL; +} + +DRIVER_INIT_MEMBER(system1_state,regulus) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x28,0x08,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...0 */ + { 0x28,0x08,0xa8,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...0...1 */ + { 0x88,0x80,0x08,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...1...0 */ + { 0x88,0x08,0x80,0x00 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...1...1 */ + { 0x28,0x08,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...0 */ + { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...1 */ + { 0x88,0x08,0x80,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...0...1...1...0 */ + { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...1...1...1 */ + { 0x80,0xa0,0x00,0x20 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...0...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...0...1 */ + { 0x80,0xa0,0x00,0x20 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...0...1...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...0...1...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...1...0...0 */ + { 0x80,0xa0,0x00,0x20 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...1...0...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...1...1...0 */ + { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,mrviking) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...0 */ + { 0x88,0x08,0x80,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...1 */ + { 0x28,0x08,0xa8,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...1...0 */ + { 0x88,0x08,0x80,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...1...1 */ + { 0x28,0x08,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...0 */ + { 0x88,0x80,0x08,0x00 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...1...0...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...1...0 */ + { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...1...1...1 */ + { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...0...0 */ + { 0x88,0x08,0x80,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...0...1 */ + { 0xa0,0x80,0x20,0x00 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...1...0 */ + { 0xa0,0x80,0x20,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...1...0...1...1 */ + { 0x28,0x08,0xa8,0x88 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...0 */ + { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...1...1...0 */ + { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0xa8,0x88 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,swat) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0xa8,0x80,0x88 }, /* ...0...0...0...0 */ + { 0x88,0x08,0x80,0x00 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...1 */ + { 0xa0,0x80,0x20,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...1...0 */ + { 0xa0,0xa8,0x80,0x88 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...1...1 */ + { 0x28,0x20,0xa8,0xa0 }, { 0xa0,0xa8,0x80,0x88 }, /* ...0...1...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...0...1 */ + { 0xa0,0x80,0x20,0x00 }, { 0xa0,0xa8,0x80,0x88 }, /* ...0...1...1...0 */ + { 0x28,0x20,0xa8,0xa0 }, { 0xa0,0xa8,0x80,0x88 }, /* ...0...1...1...1 */ + { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...0...0 */ + { 0xa0,0x20,0x80,0x00 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...0...1 */ + { 0xa0,0x20,0x80,0x00 }, { 0xa0,0x20,0x80,0x00 }, /* ...1...0...1...0 */ + { 0xa0,0x20,0x80,0x00 }, { 0xa0,0x20,0x80,0x00 }, /* ...1...0...1...1 */ + { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...1...0...1 */ + { 0xa0,0xa8,0x80,0x88 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...1...0 */ + { 0x28,0x20,0xa8,0xa0 }, { 0xa0,0xa8,0x80,0x88 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,flicky) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x08,0x88,0x00,0x80 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...0...0 */ + { 0x80,0x00,0xa0,0x20 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x28,0x08,0x20,0x00 }, /* ...0...0...1...0 */ + { 0x28,0x08,0x20,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...1 */ + { 0x08,0x88,0x00,0x80 }, { 0x80,0x00,0xa0,0x20 }, /* ...0...1...0...0 */ + { 0x80,0x00,0xa0,0x20 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...1 */ + { 0x28,0x08,0x20,0x00 }, { 0x28,0x08,0x20,0x00 }, /* ...0...1...1...0 */ + { 0x28,0x08,0x20,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...1...1 */ + { 0x08,0x88,0x00,0x80 }, { 0xa8,0x88,0x28,0x08 }, /* ...1...0...0...0 */ + { 0xa8,0x88,0x28,0x08 }, { 0x80,0x00,0xa0,0x20 }, /* ...1...0...0...1 */ + { 0x28,0x08,0x20,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...1...0 */ + { 0xa8,0x88,0x28,0x08 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...1...1 */ + { 0x08,0x88,0x00,0x80 }, { 0x80,0x00,0xa0,0x20 }, /* ...1...1...0...0 */ + { 0xa8,0x88,0x28,0x08 }, { 0x80,0x00,0xa0,0x20 }, /* ...1...1...0...1 */ + { 0x28,0x08,0x20,0x00 }, { 0x28,0x08,0x20,0x00 }, /* ...1...1...1...0 */ + { 0x08,0x88,0x00,0x80 }, { 0x88,0x80,0x08,0x00 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,wmatch) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...0...0...0 */ + { 0x08,0x88,0x00,0x80 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...1 */ + { 0x20,0x00,0xa0,0x80 }, { 0x20,0x28,0xa0,0xa8 }, /* ...0...0...1...0 */ + { 0x20,0x28,0xa0,0xa8 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...0...1...1 */ + { 0xa8,0x28,0x88,0x08 }, { 0xa8,0x28,0x88,0x08 }, /* ...0...1...0...0 */ + { 0x08,0x88,0x00,0x80 }, { 0xa8,0x28,0x88,0x08 }, /* ...0...1...0...1 */ + { 0xa8,0x28,0x88,0x08 }, { 0x20,0x28,0xa0,0xa8 }, /* ...0...1...1...0 */ + { 0xa8,0x28,0x88,0x08 }, { 0xa8,0x28,0x88,0x08 }, /* ...0...1...1...1 */ + { 0x20,0x28,0xa0,0xa8 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x20,0x28,0xa0,0xa8 }, /* ...1...0...0...1 */ + { 0x20,0x28,0xa0,0xa8 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...1...0 */ + { 0x20,0x28,0xa0,0xa8 }, { 0x20,0x28,0xa0,0xa8 }, /* ...1...0...1...1 */ + { 0x20,0x00,0xa0,0x80 }, { 0x20,0x28,0xa0,0xa8 }, /* ...1...1...0...0 */ + { 0xa8,0x28,0x88,0x08 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...1 */ + { 0x20,0x28,0xa0,0xa8 }, { 0x20,0x28,0xa0,0xa8 }, /* ...1...1...1...0 */ + { 0xa8,0x28,0x88,0x08 }, { 0xa8,0x28,0x88,0x08 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,bullfgtj) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0xa0,0xa8,0x20,0x28 }, { 0x80,0xa0,0x00,0x20 }, /* ...0...0...0...0 */ + { 0x20,0x28,0x00,0x08 }, { 0x20,0x28,0x00,0x08 }, /* ...0...0...0...1 */ + { 0xa0,0xa8,0x20,0x28 }, { 0x08,0x28,0x00,0x20 }, /* ...0...0...1...0 */ + { 0x88,0x08,0xa8,0x28 }, { 0x88,0x08,0xa8,0x28 }, /* ...0...0...1...1 */ + { 0xa0,0xa8,0x20,0x28 }, { 0x20,0x28,0x00,0x08 }, /* ...0...1...0...0 */ + { 0x28,0xa8,0x20,0xa0 }, { 0x20,0x28,0x00,0x08 }, /* ...0...1...0...1 */ + { 0xa0,0xa8,0x20,0x28 }, { 0x08,0x28,0x00,0x20 }, /* ...0...1...1...0 */ + { 0x88,0x08,0xa8,0x28 }, { 0x88,0x08,0xa8,0x28 }, /* ...0...1...1...1 */ + { 0x28,0xa8,0x20,0xa0 }, { 0xa0,0xa8,0x20,0x28 }, /* ...1...0...0...0 */ + { 0x88,0x08,0xa8,0x28 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...0...0...1 */ + { 0x28,0xa8,0x20,0xa0 }, { 0x08,0x28,0x00,0x20 }, /* ...1...0...1...0 */ + { 0x28,0xa8,0x20,0xa0 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...0...1...1 */ + { 0x20,0x28,0x00,0x08 }, { 0x20,0x28,0x00,0x08 }, /* ...1...1...0...0 */ + { 0x88,0x08,0xa8,0x28 }, { 0x20,0x28,0x00,0x08 }, /* ...1...1...0...1 */ + { 0x08,0x28,0x00,0x20 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...1...1...0 */ + { 0x08,0x28,0x00,0x20 }, { 0x88,0x08,0xa8,0x28 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,spatter) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x88,0x08,0x80,0x00 }, { 0x00,0x08,0x20,0x28 }, /* ...0...0...0...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...0...1 */ + { 0x28,0x20,0xa8,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...0...1...0 */ + { 0x88,0x08,0x80,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...1...1 */ + { 0x00,0x08,0x20,0x28 }, { 0x88,0x08,0x80,0x00 }, /* ...0...1...0...0 */ + { 0xa0,0x80,0x20,0x00 }, { 0x80,0x88,0x00,0x08 }, /* ...0...1...0...1 */ + { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...1...1...0 */ + { 0x88,0x08,0x80,0x00 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...1...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0x80,0x88,0x00,0x08 }, /* ...1...0...0...0 */ + { 0x80,0x88,0x00,0x08 }, { 0x00,0x08,0x20,0x28 }, /* ...1...0...0...1 */ + { 0x28,0x20,0xa8,0xa0 }, { 0x28,0xa8,0x08,0x88 }, /* ...1...0...1...0 */ + { 0x00,0x08,0x20,0x28 }, { 0x80,0xa0,0x88,0xa8 }, /* ...1...0...1...1 */ + { 0x80,0x88,0x00,0x08 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...0 */ + { 0x80,0xa0,0x88,0xa8 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...1 */ + { 0xa0,0x80,0x20,0x00 }, { 0x80,0xa0,0x88,0xa8 }, /* ...1...1...1...0 */ + { 0x28,0x20,0xa8,0xa0 }, { 0x00,0x08,0x20,0x28 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,pitfall2) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...0...0 */ + { 0x08,0x88,0x28,0xa8 }, { 0x28,0xa8,0x20,0xa0 }, /* ...0...0...0...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...0 */ + { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...0...1...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x20,0x00,0xa0,0x80 }, /* ...0...1...0...0 */ + { 0x28,0xa8,0x20,0xa0 }, { 0x20,0x00,0xa0,0x80 }, /* ...0...1...0...1 */ + { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...1...1...0 */ + { 0x28,0xa8,0x20,0xa0 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...1...1...1 */ + { 0x20,0x00,0xa0,0x80 }, { 0x80,0x88,0xa0,0xa8 }, /* ...1...0...0...0 */ + { 0x80,0x88,0xa0,0xa8 }, { 0x80,0x88,0xa0,0xa8 }, /* ...1...0...0...1 */ + { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...1...0 */ + { 0x80,0x88,0xa0,0xa8 }, { 0x28,0xa8,0x20,0xa0 }, /* ...1...0...1...1 */ + { 0x20,0x00,0xa0,0x80 }, { 0x80,0x88,0xa0,0xa8 }, /* ...1...1...0...0 */ + { 0x80,0x88,0xa0,0xa8 }, { 0x20,0x00,0xa0,0x80 }, /* ...1...1...0...1 */ + { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...1...1...0 */ + { 0x80,0x88,0xa0,0xa8 }, { 0x28,0xa8,0x20,0xa0 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,nprinces) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x08,0x88,0x00,0x80 }, { 0xa0,0x20,0x80,0x00 }, /* ...0...0...0...0 */ + { 0xa8,0xa0,0x28,0x20 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...1 */ + { 0x88,0x80,0x08,0x00 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...0...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...0...1...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x20,0x80,0x00 }, /* ...0...1...0...0 */ + { 0xa8,0xa0,0x28,0x20 }, { 0xa8,0xa0,0x28,0x20 }, /* ...0...1...0...1 */ + { 0x88,0x80,0x08,0x00 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...1...1 */ + { 0xa0,0x20,0x80,0x00 }, { 0xa0,0x20,0x80,0x00 }, /* ...1...0...0...0 */ + { 0x08,0x88,0x00,0x80 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...0...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...1...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...1...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...1...0...1 */ + { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...1...0 */ + { 0x08,0x88,0x00,0x80 }, { 0x28,0x08,0xa8,0x88 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,seganinj) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...0...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa0,0xa8,0x80,0x88 }, /* ...0...0...0...1 */ + { 0xa8,0xa0,0x28,0x20 }, { 0xa8,0xa0,0x28,0x20 }, /* ...0...0...1...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa0,0xa8,0x80,0x88 }, /* ...0...0...1...1 */ + { 0x28,0x08,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...0...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0x88,0x08,0x80,0x00 }, /* ...0...1...0...1 */ + { 0x28,0x08,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...1...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa8,0xa0,0x28,0x20 }, /* ...0...1...1...1 */ + { 0x88,0x08,0x80,0x00 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...0...0 */ + { 0xa0,0xa8,0x80,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...1...0...0...1 */ + { 0xa8,0xa0,0x28,0x20 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...1...0 */ + { 0xa8,0xa0,0x28,0x20 }, { 0x28,0xa8,0x08,0x88 }, /* ...1...0...1...1 */ + { 0x28,0x08,0xa8,0x88 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...1...0...0 */ + { 0x28,0x08,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...1...0...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...1...1...0 */ + { 0xa8,0xa0,0x28,0x20 }, { 0x28,0x08,0xa8,0x88 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,imsorry) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x88,0x08,0x80,0x00 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...0...0...0 */ + { 0x00,0x20,0x80,0xa0 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...0...1 */ + { 0x88,0x08,0xa8,0x28 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...0...1...0 */ + { 0x00,0x20,0x80,0xa0 }, { 0x88,0x08,0xa8,0x28 }, /* ...0...0...1...1 */ + { 0x00,0x20,0x80,0xa0 }, { 0x08,0x00,0x88,0x80 }, /* ...0...1...0...0 */ + { 0x00,0x20,0x80,0xa0 }, { 0x20,0x28,0xa0,0xa8 }, /* ...0...1...0...1 */ + { 0x20,0x28,0xa0,0xa8 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...1...1...0 */ + { 0x20,0x28,0xa0,0xa8 }, { 0x88,0x08,0xa8,0x28 }, /* ...0...1...1...1 */ + { 0x88,0x08,0x80,0x00 }, { 0x08,0x00,0x88,0x80 }, /* ...1...0...0...0 */ + { 0x08,0x00,0x88,0x80 }, { 0x88,0x08,0x80,0x00 }, /* ...1...0...0...1 */ + { 0x08,0x28,0x00,0x20 }, { 0x08,0x28,0x00,0x20 }, /* ...1...0...1...0 */ + { 0x88,0x08,0x80,0x00 }, { 0x08,0x28,0x00,0x20 }, /* ...1...0...1...1 */ + { 0x08,0x28,0x00,0x20 }, { 0x08,0x00,0x88,0x80 }, /* ...1...1...0...0 */ + { 0x08,0x28,0x00,0x20 }, { 0x20,0x28,0xa0,0xa8 }, /* ...1...1...0...1 */ + { 0x20,0x28,0xa0,0xa8 }, { 0x08,0x28,0x00,0x20 }, /* ...1...1...1...0 */ + { 0x20,0x28,0xa0,0xa8 }, { 0x08,0x28,0x00,0x20 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,teddybb) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x20,0x28,0x00,0x08 }, { 0x80,0x00,0xa0,0x20 }, /* ...0...0...0...0 */ + { 0x20,0x28,0x00,0x08 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...0...0...1 */ + { 0x28,0x08,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...0 */ + { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...1 */ + { 0x20,0x28,0x00,0x08 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...0...0 */ + { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...1...0...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...1...0 */ + { 0xa0,0xa8,0x20,0x28 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...1...1 */ + { 0x80,0x00,0xa0,0x20 }, { 0x80,0x00,0xa0,0x20 }, /* ...1...0...0...0 */ + { 0xa0,0x20,0xa8,0x28 }, { 0xa0,0xa8,0x20,0x28 }, /* ...1...0...0...1 */ + { 0xa0,0x20,0xa8,0x28 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...1...0 */ + { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...1...1 */ + { 0x80,0x00,0xa0,0x20 }, { 0x20,0x28,0x00,0x08 }, /* ...1...1...0...0 */ + { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0x20,0xa8,0x28 }, /* ...1...1...0...1 */ + { 0x80,0x00,0xa0,0x20 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...1...1...0 */ + { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0x20,0xa8,0x28 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,myheroj) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x20,0x00,0xa0,0x80 }, { 0x80,0xa0,0x88,0xa8 }, /* ...0...0...0...0 */ + { 0x20,0x00,0xa0,0x80 }, { 0x80,0xa0,0x88,0xa8 }, /* ...0...0...0...1 */ + { 0xa8,0xa0,0x88,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...1...0 */ + { 0x08,0x88,0x00,0x80 }, { 0x80,0xa0,0x88,0xa8 }, /* ...0...0...1...1 */ + { 0x20,0x00,0xa0,0x80 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...1...0...0 */ + { 0x20,0x00,0xa0,0x80 }, { 0x08,0x88,0x00,0x80 }, /* ...0...1...0...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...1...1...0 */ + { 0x08,0x88,0x00,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...1...1...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0x20,0x00,0xa0,0x80 }, /* ...1...0...0...0 */ + { 0x80,0xa0,0x88,0xa8 }, { 0x20,0x00,0xa0,0x80 }, /* ...1...0...0...1 */ + { 0x80,0xa0,0x88,0xa8 }, { 0x80,0xa0,0x88,0xa8 }, /* ...1...0...1...0 */ + { 0xa8,0xa0,0x88,0x80 }, { 0x80,0xa0,0x88,0xa8 }, /* ...1...0...1...1 */ + { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...0 */ + { 0x88,0x80,0x08,0x00 }, { 0x08,0x88,0x00,0x80 }, /* ...1...1...0...1 */ + { 0x88,0x80,0x08,0x00 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...1...1...0 */ + { 0x88,0x80,0x08,0x00 }, { 0xa8,0xa0,0x88,0x80 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,4dwarrio) +{ + // 315-5162 + static const UINT8 xor_table[128] = + { + 0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, + 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, + 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, + 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, + 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, + 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, + 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, + 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, + 0x00, + }; + + static const int swap_table[128] = + { + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 12, + }; + + DRIVER_INIT_CALL(bank00); + sega_decode_2(m_maincpu_region->base(), m_decrypted_opcodes, xor_table, swap_table); +} + +DRIVER_INIT_MEMBER(system1_state,wboy) +{ + // 315-5177 + static const UINT8 xor_table[128] = + { + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14, + + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14, + }; + + static const int swap_table[128] = + { + 0,0,0,0, + 1,1,1,1,1, + 2,2,2,2,2, + 3,3,3,3, + 4,4,4,4,4, + 5,5,5,5,5, + 6,6,6,6,6, + 7,7,7,7,7, + 8,8,8,8, + 9,9,9,9,9, + 10,10,10,10,10, + 11,11,11,11,11, + 12,12,12,12,12, + 13,13, + + 8,8,8,8, + 9,9,9,9,9, + 10,10,10,10,10, + 11,11,11,11, + 12,12,12,12,12, + 13,13,13,13,13, + 14,14,14,14,14, + 15,15,15,15,15, + 16,16,16,16, + 17,17,17,17,17, + 18,18,18,18,18, + 19,19,19,19,19, + 20,20,20,20,20, + 21,21, + }; + + DRIVER_INIT_CALL(bank00); + sega_decode_2(m_maincpu_region->base(), m_decrypted_opcodes, xor_table, swap_table); +} + +DRIVER_INIT_MEMBER(system1_state,wboy2) +{ + // 315-5178 + static const UINT8 xor_table[128] = + { + 0x00,0x55,0x45,0x05,0x11,0x41,0x01,0x14,0x44,0x50,0x10, + 0x00,0x55,0x15,0x05,0x51,0x41,0x01,0x14,0x44,0x04,0x10, + 0x40,0x55,0x15,0x05,0x51,0x11, + 0x01,0x54,0x44,0x04,0x10,0x40,0x00,0x15,0x45,0x51,0x11, + 0x01,0x54,0x14,0x04,0x50,0x40,0x00,0x15,0x45,0x05,0x11, + 0x41,0x54,0x14,0x04,0x50,0x10, + 0x00,0x55,0x45,0x05,0x11,0x41,0x01,0x14, + + 0x00,0x55,0x45,0x05,0x11,0x41,0x01,0x14,0x44,0x50,0x10, + 0x00,0x55,0x15,0x05,0x51,0x41,0x01,0x14,0x44,0x04,0x10, + 0x40,0x55,0x15,0x05,0x51,0x11, + 0x01,0x54,0x44,0x04,0x10,0x40,0x00,0x15,0x45,0x51,0x11, + 0x01,0x54,0x14,0x04,0x50,0x40,0x00,0x15,0x45,0x05,0x11, + 0x41,0x54,0x14,0x04,0x50,0x10, + 0x00,0x55,0x45,0x05,0x11,0x41,0x01,0x14, + }; + + static const int swap_table[128] = + { + 2, + 3, 5, 7, 1, 3, 5, 7, 1, 3, 5, 7, + 0, 2, 4, 6, 0, 2, 4, 6, 0, 2, 4, + 5, 7, 1, 3, 5, 7, 1, 3, 5, 7, 1, 3, + 4, 6, 0, 2, 4, 6, 0, 2, 4, 6, + 8, + 1, 3, 5, 7, 1, 3, 5, 7, 1, 3, 5, + 6, 0, 2, 4, 6, 0, 2, + + 10, + 11,13,15, 9,11,13,15, 9,11,13,15, + 8,10,12,14, 8,10,12,14, 8,10,12, + 13,15, 9,11,13,15, 9,11,13,15, 9,11, + 12,14, 8,10,12,14, 8,10,12,14, + 16, + 9,11,13,15, 9,11,13,15, 9,11,13, + 14, 8,10,12,14, 8,10, + }; + + DRIVER_INIT_CALL(bank00); + sega_decode_2(m_maincpu_region->base(), m_decrypted_opcodes, xor_table, swap_table); +} + +DRIVER_INIT_MEMBER(system1_state,wboyo) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...1...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...0 */ + { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...1...0 */ + { 0x88,0x80,0x08,0x00 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...1...1 */ + { 0xa0,0x20,0xa8,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...0...0 */ + { 0xa0,0x20,0xa8,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...0...1 */ + { 0xa0,0x20,0xa8,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...1...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa0,0x20,0xa8,0x28 }, /* ...1...1...0...0 */ + { 0xa0,0x20,0xa8,0x28 }, { 0x28,0xa8,0x08,0x88 }, /* ...1...1...0...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa0,0x20,0xa8,0x28 }, /* ...1...1...1...0 */ + { 0x28,0x08,0xa8,0x88 }, { 0x28,0xa8,0x08,0x88 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank00); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,blockgal) +{ + DRIVER_INIT_CALL(bank00); + mc8123_decode(m_maincpu_region->base(), m_decrypted_opcodes, memregion("key")->base(), 0x8000); +} + +DRIVER_INIT_MEMBER(system1_state,hvymetal) +{ + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...1...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...0 */ + { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...1 */ + { 0xa0,0x80,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...1...0 */ + { 0x88,0x80,0x08,0x00 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...1...1 */ + { 0xa0,0x20,0xa8,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...0...0 */ + { 0xa0,0x20,0xa8,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...0...1 */ + { 0xa0,0x20,0xa8,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...1...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa0,0x20,0xa8,0x28 }, /* ...1...1...0...0 */ + { 0xa0,0x20,0xa8,0x28 }, { 0x28,0xa8,0x08,0x88 }, /* ...1...1...0...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa0,0x20,0xa8,0x28 }, /* ...1...1...1...0 */ + { 0x28,0x08,0xa8,0x88 }, { 0x28,0xa8,0x08,0x88 } /* ...1...1...1...1 */ + }; + + DRIVER_INIT_CALL(bank44); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); +} + +DRIVER_INIT_MEMBER(system1_state,gardia) +{ + // 317-0006 + DRIVER_INIT_CALL(bank44); + sega_decode_317(m_maincpu_region->base(), m_decrypted_opcodes, 2); +} + +DRIVER_INIT_MEMBER(system1_state,gardiab) +{ + // 317-0007 + DRIVER_INIT_CALL(bank44); + sega_decode_317(m_maincpu_region->base(), m_decrypted_opcodes, 3); +} + +DRIVER_INIT_MEMBER(system1_state,wbml) +{ + DRIVER_INIT_CALL(bank0c); + m_banked_decrypted_opcodes = auto_alloc_array(machine(), UINT8, m_maincpu_region->bytes()); + mc8123_decode(m_maincpu_region->base(), m_banked_decrypted_opcodes, memregion("key")->base(), m_maincpu_region->bytes()); +} + +DRIVER_INIT_MEMBER(system1_state,ufosensi) +{ + DRIVER_INIT_CALL(bank0c); + m_banked_decrypted_opcodes = auto_alloc_array(machine(), UINT8, m_maincpu_region->bytes()); + mc8123_decode(m_maincpu_region->base(), m_banked_decrypted_opcodes, memregion("key")->base(), m_maincpu_region->bytes()); +} + +DRIVER_INIT_MEMBER(system1_state,wboysys2) +{ + // 315-5177 + static const UINT8 xor_table[128] = + { + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14, + + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, + 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, + 0x05,0x55,0x50,0x14, + }; + + static const int swap_table[128] = + { + 0,0,0,0, + 1,1,1,1,1, + 2,2,2,2,2, + 3,3,3,3, + 4,4,4,4,4, + 5,5,5,5,5, + 6,6,6,6,6, + 7,7,7,7,7, + 8,8,8,8, + 9,9,9,9,9, + 10,10,10,10,10, + 11,11,11,11,11, + 12,12,12,12,12, + 13,13, + + 8,8,8,8, + 9,9,9,9,9, + 10,10,10,10,10, + 11,11,11,11, + 12,12,12,12,12, + 13,13,13,13,13, + 14,14,14,14,14, + 15,15,15,15,15, + 16,16,16,16, + 17,17,17,17,17, + 18,18,18,18,18, + 19,19,19,19,19, + 20,20,20,20,20, + 21,21, + }; + + DRIVER_INIT_CALL(bank0c); + sega_decode_2(m_maincpu_region->base(), m_decrypted_opcodes, xor_table, swap_table); } -DRIVER_INIT_MEMBER(system1_state,regulus) { DRIVER_INIT_CALL(bank00); regulus_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,mrviking) { DRIVER_INIT_CALL(bank00); mrviking_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,swat) { DRIVER_INIT_CALL(bank00); swat_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,flicky) { DRIVER_INIT_CALL(bank00); flicky_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,wmatch) { DRIVER_INIT_CALL(bank00); wmatch_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,bullfgtj) { DRIVER_INIT_CALL(bank00); bullfgtj_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,spatter) { DRIVER_INIT_CALL(bank00); spatter_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,pitfall2) { DRIVER_INIT_CALL(bank00); pitfall2_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,nprinces) { DRIVER_INIT_CALL(bank00); nprinces_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,seganinj) { DRIVER_INIT_CALL(bank00); seganinj_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,imsorry) { DRIVER_INIT_CALL(bank00); imsorry_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,teddybb) { DRIVER_INIT_CALL(bank00); teddybb_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,myheroj) { DRIVER_INIT_CALL(bank00); myheroj_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,4dwarrio) { DRIVER_INIT_CALL(bank00); sega_315_5162_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,wboy) { DRIVER_INIT_CALL(bank00); sega_315_5177_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,wboy2) { DRIVER_INIT_CALL(bank00); sega_315_5178_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,wboyo) { DRIVER_INIT_CALL(bank00); hvymetal_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,blockgal) { DRIVER_INIT_CALL(bank00); mc8123_decrypt_rom(machine(), "maincpu", "key", NULL, 0); } - -DRIVER_INIT_MEMBER(system1_state,hvymetal) { DRIVER_INIT_CALL(bank44); hvymetal_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,gardia) { DRIVER_INIT_CALL(bank44); sega_317_0006_decode(machine(), "maincpu"); } -DRIVER_INIT_MEMBER(system1_state,gardiab) { DRIVER_INIT_CALL(bank44); sega_317_0007_decode(machine(), "maincpu"); } - -DRIVER_INIT_MEMBER(system1_state,wbml) { DRIVER_INIT_CALL(bank0c); mc8123_decrypt_rom(machine(), "maincpu", "key", "bank1", 4); } -DRIVER_INIT_MEMBER(system1_state,ufosensi) { DRIVER_INIT_CALL(bank0c); mc8123_decrypt_rom(machine(), "maincpu", "key", "bank1", 4); } -DRIVER_INIT_MEMBER(system1_state,wboysys2) { DRIVER_INIT_CALL(bank0c); sega_315_5177_decode(machine(), "maincpu"); } DRIVER_INIT_MEMBER(system1_state,dakkochn) { m_videomode_custom = &system1_state::dakkochn_custom_w; - - mc8123_decrypt_rom(machine(), "maincpu", "key", "bank1", 4); + m_banked_decrypted_opcodes = auto_alloc_array(machine(), UINT8, m_maincpu_region->bytes()); + mc8123_decode(m_maincpu_region->base(), m_banked_decrypted_opcodes, memregion("key")->base(), m_maincpu_region->bytes()); } DRIVER_INIT_MEMBER(system1_state,myherok) { + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x20,0x00,0xa0,0x80 }, { 0x80,0xa0,0x88,0xa8 }, /* ...0...0...0...0 */ + { 0x20,0x00,0xa0,0x80 }, { 0x80,0xa0,0x88,0xa8 }, /* ...0...0...0...1 */ + { 0xa8,0xa0,0x88,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...1...0 */ + { 0x08,0x88,0x00,0x80 }, { 0x80,0xa0,0x88,0xa8 }, /* ...0...0...1...1 */ + { 0x20,0x00,0xa0,0x80 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...1...0...0 */ + { 0x20,0x00,0xa0,0x80 }, { 0x08,0x88,0x00,0x80 }, /* ...0...1...0...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...1...1...0 */ + { 0x08,0x88,0x00,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...1...1...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0x20,0x00,0xa0,0x80 }, /* ...1...0...0...0 */ + { 0x80,0xa0,0x88,0xa8 }, { 0x20,0x00,0xa0,0x80 }, /* ...1...0...0...1 */ + { 0x80,0xa0,0x88,0xa8 }, { 0x80,0xa0,0x88,0xa8 }, /* ...1...0...1...0 */ + { 0xa8,0xa0,0x88,0x80 }, { 0x80,0xa0,0x88,0xa8 }, /* ...1...0...1...1 */ + { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...0 */ + { 0x88,0x80,0x08,0x00 }, { 0x08,0x88,0x00,0x80 }, /* ...1...1...0...1 */ + { 0x88,0x80,0x08,0x00 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...1...1...0 */ + { 0x88,0x80,0x08,0x00 }, { 0xa8,0xa0,0x88,0x80 } /* ...1...1...1...1 */ + }; + + int A; UINT8 *rom; @@ -4744,7 +5452,7 @@ DRIVER_INIT_MEMBER(system1_state,myherok) /* additionally to the usual protection, all the program ROMs have data lines */ /* D0 and D1 swapped. */ - rom = memregion("maincpu")->base(); + rom = m_maincpu_region->base(); for (A = 0;A < 0xc000;A++) rom[A] = (rom[A] & 0xfc) | ((rom[A] & 1) << 1) | ((rom[A] & 2) >> 1); @@ -4778,13 +5486,13 @@ DRIVER_INIT_MEMBER(system1_state,myherok) } } - myheroj_decode(machine(), "maincpu"); + sega_decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000, convtable); } READ8_MEMBER(system1_state::nob_start_r) { /* in reality, it's likely some M1-dependent behavior */ - return (space.device().safe_pc() <= 0x0003) ? 0x80 : memregion("maincpu")->base()[1]; + return (space.device().safe_pc() <= 0x0003) ? 0x80 : m_maincpu_region->base()[1]; } DRIVER_INIT_MEMBER(system1_state,nob) @@ -4809,7 +5517,7 @@ DRIVER_INIT_MEMBER(system1_state,nobb) /* Patch to get PRG ROMS ('T', 'R' and 'S) status as "GOOD" in the "test mode" */ /* not really needed */ -// UINT8 *ROM = memregion("maincpu")->base(); +// UINT8 *ROM = m_maincpu_region->base(); // ROM[0x3296] = 0x18; // 'jr' instead of 'jr z' - 'T' (PRG Main ROM) // ROM[0x32be] = 0x18; // 'jr' instead of 'jr z' - 'R' (Banked ROM 1) @@ -4837,18 +5545,16 @@ DRIVER_INIT_MEMBER(system1_state,nobb) DRIVER_INIT_MEMBER(system1_state,bootleg) { - address_space &space = m_maincpu->space(AS_PROGRAM); - space.set_decrypted_region(0x0000, 0x7fff, memregion("maincpu")->base() + 0x10000); DRIVER_INIT_CALL(bank00); + memcpy(m_decrypted_opcodes, m_maincpu_region->base() + 0x10000, 0x8000); } DRIVER_INIT_MEMBER(system1_state,bootsys2) { - address_space &space = m_maincpu->space(AS_PROGRAM); - space.set_decrypted_region(0x0000, 0x7fff, memregion("maincpu")->base() + 0x20000); - membank("bank1")->configure_decrypted_entries(0, 4, memregion("maincpu")->base() + 0x30000, 0x4000); DRIVER_INIT_CALL(bank0c); + m_bank0d->set_base(m_maincpu_region->base() + 0x20000); + m_bank1d->configure_entries(0, 4, m_maincpu_region->base() + 0x30000, 0x4000); } DRIVER_INIT_MEMBER(system1_state,choplift) @@ -4882,84 +5588,84 @@ DRIVER_INIT_MEMBER(system1_state,shtngmst) *************************************/ /* PPI-based System 1 */ -GAME( 1983, starjack, 0, sys1ppis, starjack, system1_state, bank00, ROT270, "Sega", "Star Jacker (Sega)", GAME_SUPPORTS_SAVE ) -GAME( 1983, starjacks, starjack, sys1ppis, starjacks, system1_state, bank00, ROT270, "Sega (Stern Electronics license)", "Star Jacker (Stern Electronics)", GAME_SUPPORTS_SAVE ) -GAME( 1983, upndown, 0, sys1ppi, upndown, system1_state, nprinces, ROT270, "Sega", "Up'n Down (315-5030)", GAME_SUPPORTS_SAVE ) -GAME( 1983, upndownu, upndown, sys1ppi, upndown, system1_state, bank00, ROT270, "Sega", "Up'n Down (not encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1983, regulus, 0, sys1ppi, regulus, system1_state, regulus, ROT270, "Sega", "Regulus (315-5033, Rev A.)", GAME_SUPPORTS_SAVE ) -GAME( 1983, reguluso, regulus, sys1ppi, reguluso, system1_state, regulus, ROT270, "Sega", "Regulus (315-5033)", GAME_SUPPORTS_SAVE ) -GAME( 1983, regulusu, regulus, sys1ppi, regulus, system1_state, bank00, ROT270, "Sega", "Regulus (not encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1984, mrviking, 0, sys1ppis, mrviking, system1_state, mrviking, ROT270, "Sega", "Mister Viking (315-5041)", GAME_SUPPORTS_SAVE ) -GAME( 1984, mrvikingj, mrviking, sys1ppis, mrvikingj, system1_state, mrviking, ROT270, "Sega", "Mister Viking (315-5041, Japan)", GAME_SUPPORTS_SAVE ) -GAME( 1984, swat, 0, sys1ppi, swat, system1_state, swat, ROT270, "Coreland / Sega", "SWAT (315-5048)", GAME_SUPPORTS_SAVE ) -GAME( 1984, flickyo, flicky, sys1ppi, flicky, system1_state, flicky, ROT0, "Sega", "Flicky (64k Version, System 1, 315-5051, set 1)", GAME_SUPPORTS_SAVE ) -GAME( 1984, flickys1, flicky, sys1ppi, flickys1, system1_state, flicky, ROT0, "Sega", "Flicky (64k Version, System 1, 315-5051, set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1984, wmatch, 0, sys1ppis, wmatch, system1_state, wmatch, ROT270, "Sega", "Water Match (315-5064)", GAME_SUPPORTS_SAVE ) -GAME( 1984, bullfgt, 0, sys1ppi, bullfgt, system1_state, bullfgtj, ROT0, "Coreland / Sega", "Bullfight (315-5065)", GAME_SUPPORTS_SAVE ) -GAME( 1985, nprinces, seganinj, sys1ppi, seganinj, system1_state, flicky, ROT0, "bootleg?", "Ninja Princess (315-5051, 64k Ver. bootleg?)", GAME_SUPPORTS_SAVE ) -GAME( 1985, nprincesu, seganinj, sys1ppi, seganinj, system1_state, bank00, ROT0, "Sega", "Ninja Princess (64k Ver. not encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboy2, wboy, sys1ppi, wboy, system1_state, wboy2, ROT0, "Escape (Sega license)", "Wonder Boy (set 2, 315-5178)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboy2u, wboy, sys1ppi, wboy, system1_state, bank00, ROT0, "Escape (Sega license)", "Wonder Boy (set 2, not encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wbdeluxe, wboy, sys1ppi, wbdeluxe, system1_state, bank00, ROT0, "Escape (Sega license)", "Wonder Boy Deluxe", GAME_SUPPORTS_SAVE ) -GAME( 1986, nob, 0, nobm, nob, system1_state, nob, ROT270, "Coreland / Data East Corporation", "Noboranka (Japan)", GAME_SUPPORTS_SAVE ) -GAME( 1986, nobb, nob, nob, nob, system1_state, nobb, ROT270, "bootleg (Game Electronics)", "Noboranka (Japan, bootleg)", GAME_SUPPORTS_SAVE ) +GAME( 1983, starjack, 0, sys1ppis, starjack, system1_state, bank00, ROT270, "Sega", "Star Jacker (Sega)", GAME_SUPPORTS_SAVE ) +GAME( 1983, starjacks, starjack, sys1ppis, starjacks, system1_state, bank00, ROT270, "Sega (Stern Electronics license)", "Star Jacker (Stern Electronics)", GAME_SUPPORTS_SAVE ) +GAME( 1983, upndown, 0, sys1ppix, upndown, system1_state, nprinces, ROT270, "Sega", "Up'n Down (315-5030)", GAME_SUPPORTS_SAVE ) +GAME( 1983, upndownu, upndown, sys1ppi, upndown, system1_state, bank00, ROT270, "Sega", "Up'n Down (not encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1983, regulus, 0, sys1ppix, regulus, system1_state, regulus, ROT270, "Sega", "Regulus (315-5033, Rev A.)", GAME_SUPPORTS_SAVE ) +GAME( 1983, reguluso, regulus, sys1ppix, reguluso, system1_state, regulus, ROT270, "Sega", "Regulus (315-5033)", GAME_SUPPORTS_SAVE ) +GAME( 1983, regulusu, regulus, sys1ppi, regulus, system1_state, bank00, ROT270, "Sega", "Regulus (not encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1984, mrviking, 0, sys1ppisx, mrviking, system1_state, mrviking, ROT270, "Sega", "Mister Viking (315-5041)", GAME_SUPPORTS_SAVE ) +GAME( 1984, mrvikingj, mrviking, sys1ppisx, mrvikingj, system1_state, mrviking, ROT270, "Sega", "Mister Viking (315-5041, Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1984, swat, 0, sys1ppix, swat, system1_state, swat, ROT270, "Coreland / Sega", "SWAT (315-5048)", GAME_SUPPORTS_SAVE ) +GAME( 1984, flickyo, flicky, sys1ppix, flicky, system1_state, flicky, ROT0, "Sega", "Flicky (64k Version, System 1, 315-5051, set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1984, flickys1, flicky, sys1ppix, flickys1, system1_state, flicky, ROT0, "Sega", "Flicky (64k Version, System 1, 315-5051, set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1984, wmatch, 0, sys1ppisx, wmatch, system1_state, wmatch, ROT270, "Sega", "Water Match (315-5064)", GAME_SUPPORTS_SAVE ) +GAME( 1984, bullfgt, 0, sys1ppix, bullfgt, system1_state, bullfgtj, ROT0, "Coreland / Sega", "Bullfight (315-5065)", GAME_SUPPORTS_SAVE ) +GAME( 1985, nprinces, seganinj, sys1ppix, seganinj, system1_state, flicky, ROT0, "bootleg?", "Ninja Princess (315-5051, 64k Ver. bootleg?)", GAME_SUPPORTS_SAVE ) +GAME( 1985, nprincesu, seganinj, sys1ppi, seganinj, system1_state, bank00, ROT0, "Sega", "Ninja Princess (64k Ver. not encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboy2, wboy, sys1ppix, wboy, system1_state, wboy2, ROT0, "Escape (Sega license)", "Wonder Boy (set 2, 315-5178)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboy2u, wboy, sys1ppi, wboy, system1_state, bank00, ROT0, "Escape (Sega license)", "Wonder Boy (set 2, not encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wbdeluxe, wboy, sys1ppi, wbdeluxe, system1_state, bank00, ROT0, "Escape (Sega license)", "Wonder Boy Deluxe", GAME_SUPPORTS_SAVE ) +GAME( 1986, nob, 0, nobm, nob, system1_state, nob, ROT270, "Coreland / Data East Corporation", "Noboranka (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1986, nobb, nob, nob, nob, system1_state, nobb, ROT270, "bootleg (Game Electronics)", "Noboranka (Japan, bootleg)", GAME_SUPPORTS_SAVE ) /* PIO-based System 1 */ -GAME( 1984, flicky, 0, sys1pio, flicky, system1_state, flicky, ROT0, "Sega", "Flicky (128k Version, System 2, 315-5051)", GAME_SUPPORTS_SAVE ) -GAME( 1984, flickys2, flicky, sys1pio, flickys2, system1_state, bank00, ROT0, "Sega", "Flicky (128k Version, System 2, not encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1984, thetogyu, bullfgt, sys1pio, bullfgt, system1_state, bullfgtj, ROT0, "Coreland / Sega", "The Togyu (315-5065, Japan)", GAME_SUPPORTS_SAVE ) -GAME( 1984, spatter, 0, sys1pios, spatter, system1_state, spatter, ROT0, "Sega", "Spatter (set 1)", GAME_SUPPORTS_SAVE ) -GAME( 1984, spattera, spatter, sys1pios, spatter, system1_state, spatter, ROT0, "Sega", "Spatter (315-5099)", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) -GAME( 1984, ssanchan, spatter, sys1pios, spatter, system1_state, spatter, ROT0, "Sega", "Sanrin San Chan (Japan)", GAME_SUPPORTS_SAVE ) -GAME( 1985, pitfall2, 0, sys1pio, pitfall2, system1_state, pitfall2, ROT0, "Sega", "Pitfall II (315-5093)", GAME_SUPPORTS_SAVE ) -GAME( 1985, pitfall2a, pitfall2, sys1pio, pitfall2, system1_state, pitfall2, ROT0, "Sega", "Pitfall II (315-5093, Flicky Conversion)", GAME_SUPPORTS_SAVE ) -GAME( 1985, pitfall2u, pitfall2, sys1pio, pitfall2u, system1_state, bank00, ROT0, "Sega", "Pitfall II (not encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1985, seganinj, 0, sys1pio, seganinj, system1_state, seganinj, ROT0, "Sega", "Sega Ninja (315-5102)", GAME_SUPPORTS_SAVE ) -GAME( 1985, seganinju, seganinj, sys1pio, seganinj, system1_state, bank00, ROT0, "Sega", "Sega Ninja (not encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1985, ninja, seganinj, sys1pio, seganinj, system1_state, seganinj, ROT0, "Sega", "Ninja (315-5102)", GAME_SUPPORTS_SAVE ) -GAME( 1985, nprinceso, seganinj, sys1pio, seganinj, system1_state, nprinces, ROT0, "Sega", "Ninja Princess (315-5098, 128k Ver.)", GAME_SUPPORTS_SAVE ) -GAME( 1985, nprincesb, seganinj, sys1pio, seganinj, system1_state, flicky, ROT0, "bootleg?", "Ninja Princess (315-5051?, 128k Ver. bootleg?)", GAME_SUPPORTS_SAVE ) -GAME( 1985, imsorry, 0, sys1pio, imsorry, system1_state, imsorry, ROT0, "Coreland / Sega", "I'm Sorry (315-5110, US)", GAME_SUPPORTS_SAVE ) -GAME( 1985, imsorryj, imsorry, sys1pio, imsorry, system1_state, imsorry, ROT0, "Coreland / Sega", "Gonbee no I'm Sorry (315-5110, Japan)", GAME_SUPPORTS_SAVE ) -GAME( 1985, teddybb, 0, sys1pio, teddybb, system1_state, teddybb, ROT0, "Sega", "TeddyBoy Blues (315-5115, New Ver.)", GAME_SUPPORTS_SAVE ) -GAME( 1985, teddybbo, teddybb, sys1pio, teddybb, system1_state, teddybb, ROT0, "Sega", "TeddyBoy Blues (315-5115, Old Ver.)", GAME_SUPPORTS_SAVE ) -GAME( 1985, teddybbobl, teddybb, sys1pio, teddybb, system1_state, teddybb, ROT0, "bootleg", "TeddyBoy Blues (Old Ver. bootleg)", GAME_SUPPORTS_SAVE ) -GAME( 1985, myhero, 0, sys1pio, myhero, system1_state, bank00, ROT0, "Coreland / Sega", "My Hero (US, not encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1985, sscandal, myhero, sys1pio, myhero, system1_state, myheroj, ROT0, "Coreland / Sega", "Seishun Scandal (315-5132, Japan)", GAME_SUPPORTS_SAVE ) -GAME( 1985, myherok, myhero, sys1pio, myhero, system1_state, myherok, ROT0, "Coreland / Sega", "My Hero (Korea)", GAME_SUPPORTS_SAVE ) -GAME( 1985, 4dwarrio, 0, sys1pio, 4dwarrio, system1_state, 4dwarrio, ROT0, "Coreland / Sega", "4-D Warriors (315-5162)", GAME_SUPPORTS_SAVE ) -GAME( 1986, raflesia, 0, sys1pio, raflesia, system1_state, 4dwarrio, ROT270, "Coreland / Sega", "Rafflesia (315-5162)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboy, 0, sys1pio, wboy, system1_state, wboy, ROT0, "Escape (Sega license)", "Wonder Boy (set 1, 315-5177)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboyo, wboy, sys1pio, wboy, system1_state, wboyo, ROT0, "Escape (Sega license)", "Wonder Boy (set 1, 315-5135)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboy3, wboy, sys1pio, wboy3, system1_state, wboyo, ROT0, "Escape (Sega license)", "Wonder Boy (set 3, 315-5135)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboy4, wboy, sys1pio, wboy, system1_state, 4dwarrio, ROT0, "Escape (Sega license)", "Wonder Boy (315-5162, 4-D Warriors Conversion)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboyu, wboy, sys1pio, wboyu, system1_state, bank00, ROT0, "Escape (Sega license)", "Wonder Boy (prototype?)", GAME_SUPPORTS_SAVE ) // appears to be a very early / unfinished version. -GAME( 1986, wboy5, wboy, sys1pio, wboy3, system1_state, wboyo, ROT0, "bootleg", "Wonder Boy (set 5, bootleg)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboyub, wboy, sys1pio, wboy, system1_state, wboyo, ROT0, "bootleg", "Wonder Boy (US bootleg)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) -GAME( 1987, blockgal, 0, sys1pio, blockgal, system1_state, blockgal, ROT90, "Sega / Vic Tokai","Block Gal (MC-8123B, 317-0029)", GAME_SUPPORTS_SAVE) +GAME( 1984, flicky, 0, sys1piox, flicky, system1_state, flicky, ROT0, "Sega", "Flicky (128k Version, System 2, 315-5051)", GAME_SUPPORTS_SAVE ) +GAME( 1984, flickys2, flicky, sys1pio, flickys2, system1_state, bank00, ROT0, "Sega", "Flicky (128k Version, System 2, not encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1984, thetogyu, bullfgt, sys1piox, bullfgt, system1_state, bullfgtj, ROT0, "Coreland / Sega", "The Togyu (315-5065, Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1984, spatter, 0, sys1piosx, spatter, system1_state, spatter, ROT0, "Sega", "Spatter (set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1984, spattera, spatter, sys1piosx, spatter, system1_state, spatter, ROT0, "Sega", "Spatter (315-5099)", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) +GAME( 1984, ssanchan, spatter, sys1piosx, spatter, system1_state, spatter, ROT0, "Sega", "Sanrin San Chan (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1985, pitfall2, 0, sys1piox, pitfall2, system1_state, pitfall2, ROT0, "Sega", "Pitfall II (315-5093)", GAME_SUPPORTS_SAVE ) +GAME( 1985, pitfall2a, pitfall2, sys1piox, pitfall2, system1_state, pitfall2, ROT0, "Sega", "Pitfall II (315-5093, Flicky Conversion)", GAME_SUPPORTS_SAVE ) +GAME( 1985, pitfall2u, pitfall2, sys1pio, pitfall2u, system1_state, bank00, ROT0, "Sega", "Pitfall II (not encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1985, seganinj, 0, sys1piox, seganinj, system1_state, seganinj, ROT0, "Sega", "Sega Ninja (315-5102)", GAME_SUPPORTS_SAVE ) +GAME( 1985, seganinju, seganinj, sys1pio, seganinj, system1_state, bank00, ROT0, "Sega", "Sega Ninja (not encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1985, ninja, seganinj, sys1piox, seganinj, system1_state, seganinj, ROT0, "Sega", "Ninja (315-5102)", GAME_SUPPORTS_SAVE ) +GAME( 1985, nprinceso, seganinj, sys1piox, seganinj, system1_state, nprinces, ROT0, "Sega", "Ninja Princess (315-5098, 128k Ver.)", GAME_SUPPORTS_SAVE ) +GAME( 1985, nprincesb, seganinj, sys1piox, seganinj, system1_state, flicky, ROT0, "bootleg?", "Ninja Princess (315-5051?, 128k Ver. bootleg?)", GAME_SUPPORTS_SAVE ) +GAME( 1985, imsorry, 0, sys1piox, imsorry, system1_state, imsorry, ROT0, "Coreland / Sega", "I'm Sorry (315-5110, US)", GAME_SUPPORTS_SAVE ) +GAME( 1985, imsorryj, imsorry, sys1piox, imsorry, system1_state, imsorry, ROT0, "Coreland / Sega", "Gonbee no I'm Sorry (315-5110, Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1985, teddybb, 0, sys1piox, teddybb, system1_state, teddybb, ROT0, "Sega", "TeddyBoy Blues (315-5115, New Ver.)", GAME_SUPPORTS_SAVE ) +GAME( 1985, teddybbo, teddybb, sys1piox, teddybb, system1_state, teddybb, ROT0, "Sega", "TeddyBoy Blues (315-5115, Old Ver.)", GAME_SUPPORTS_SAVE ) +GAME( 1985, teddybbobl, teddybb, sys1piox, teddybb, system1_state, teddybb, ROT0, "bootleg", "TeddyBoy Blues (Old Ver. bootleg)", GAME_SUPPORTS_SAVE ) +GAME( 1985, myhero, 0, sys1pio, myhero, system1_state, bank00, ROT0, "Coreland / Sega", "My Hero (US, not encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1985, sscandal, myhero, sys1piox, myhero, system1_state, myheroj, ROT0, "Coreland / Sega", "Seishun Scandal (315-5132, Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1985, myherok, myhero, sys1piox, myhero, system1_state, myherok, ROT0, "Coreland / Sega", "My Hero (Korea)", GAME_SUPPORTS_SAVE ) +GAME( 1985, 4dwarrio, 0, sys1piox, 4dwarrio, system1_state, 4dwarrio, ROT0, "Coreland / Sega", "4-D Warriors (315-5162)", GAME_SUPPORTS_SAVE ) +GAME( 1986, raflesia, 0, sys1piox, raflesia, system1_state, 4dwarrio, ROT270, "Coreland / Sega", "Rafflesia (315-5162)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboy, 0, sys1piox, wboy, system1_state, wboy, ROT0, "Escape (Sega license)", "Wonder Boy (set 1, 315-5177)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboyo, wboy, sys1piox, wboy, system1_state, wboyo, ROT0, "Escape (Sega license)", "Wonder Boy (set 1, 315-5135)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboy3, wboy, sys1piox, wboy3, system1_state, wboyo, ROT0, "Escape (Sega license)", "Wonder Boy (set 3, 315-5135)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboy4, wboy, sys1piox, wboy, system1_state, 4dwarrio, ROT0, "Escape (Sega license)", "Wonder Boy (315-5162, 4-D Warriors Conversion)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboyu, wboy, sys1pio, wboyu, system1_state, bank00, ROT0, "Escape (Sega license)", "Wonder Boy (prototype?)", GAME_SUPPORTS_SAVE ) // appears to be a very early / unfinished version. +GAME( 1986, wboy5, wboy, sys1piox, wboy3, system1_state, wboyo, ROT0, "bootleg", "Wonder Boy (set 5, bootleg)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboyub, wboy, sys1piox, wboy, system1_state, wboyo, ROT0, "bootleg", "Wonder Boy (US bootleg)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) +GAME( 1987, blockgal, 0, sys1piox, blockgal, system1_state, blockgal, ROT90, "Sega / Vic Tokai","Block Gal (MC-8123B, 317-0029)", GAME_SUPPORTS_SAVE) /* PIO-based System 1 with ROM banking */ -GAME( 1985, hvymetal, 0, sys1pio, hvymetal, system1_state, hvymetal, ROT0, "Sega", "Heavy Metal (315-5135)", GAME_SUPPORTS_SAVE ) -GAME( 1986, gardia, 0, sys1pio, gardia, system1_state, gardia, ROT270, "Coreland / Sega", "Gardia (317-0006)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE) -GAME( 1986, brain, 0, sys1pio, brain, system1_state, bank44, ROT0, "Coreland / Sega", "Brain", GAME_SUPPORTS_SAVE ) +GAME( 1985, hvymetal, 0, sys1piox, hvymetal, system1_state, hvymetal, ROT0, "Sega", "Heavy Metal (315-5135)", GAME_SUPPORTS_SAVE ) +GAME( 1986, gardia, 0, sys1piox, gardia, system1_state, gardia, ROT270, "Coreland / Sega", "Gardia (317-0006)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE) +GAME( 1986, brain, 0, sys1pio, brain, system1_state, bank44, ROT0, "Coreland / Sega", "Brain", GAME_SUPPORTS_SAVE ) /* System 2 */ -GAME( 1985, choplift, 0, sys2rowm, choplift, system1_state, choplift, ROT0, "Sega (licensed from Dan Gorlin)", "Choplifter (8751 315-5151)", GAME_SUPPORTS_SAVE ) -GAME( 1985, chopliftu, choplift, sys2row, choplift, system1_state, bank0c, ROT0, "Sega (licensed from Dan Gorlin)", "Choplifter (unprotected)", GAME_SUPPORTS_SAVE ) -GAME( 1985, chopliftbl, choplift, sys2row, choplift, system1_state, bank0c, ROT0, "bootleg", "Choplifter (bootleg)", GAME_SUPPORTS_SAVE ) -GAME( 1985, shtngmst, 0, sys2m, shtngmst, system1_state, shtngmst, ROT0, "Sega", "Shooting Master (8751 315-5159)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) -GAME( 1985, shtngmste, shtngmst, sys2m, shtngmst, system1_state, shtngmst, ROT0, "Sega / EVG", "Shooting Master (EVG, 8751 315-5159a)", GAME_SUPPORTS_SAVE ) -GAME( 1986, gardiab, gardia, sys2, gardia, system1_state, gardiab, ROT270, "bootleg", "Gardia (317-0007?, bootleg)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) -GAME( 1986, wboysys2, wboy, sys2, wboysys2, system1_state, wboysys2, ROT0, "Escape (Sega license)", "Wonder Boy (system 2)", GAME_SUPPORTS_SAVE ) -GAME( 1987, tokisens, 0, sys2, tokisens, system1_state, bank0c, ROT90, "Sega", "Toki no Senshi - Chrono Soldier", GAME_SUPPORTS_SAVE ) -GAME( 1987, wbml, 0, sys2, wbml, system1_state, wbml, ROT0, "Sega / Westone", "Wonder Boy in Monster Land (Japan New Ver., MC-8123, 317-0043)", GAME_SUPPORTS_SAVE ) -GAME( 1987, wbmljo, wbml, sys2, wbml, system1_state, wbml, ROT0, "Sega / Westone", "Wonder Boy in Monster Land (Japan Old Ver., MC-8123, 317-0043)", GAME_SUPPORTS_SAVE ) -GAME( 1987, wbmljb, wbml, sys2, wbml, system1_state, bootsys2, ROT0, "bootleg", "Wonder Boy in Monster Land (Japan bootleg)", GAME_SUPPORTS_SAVE ) -GAME( 1987, wbmlb, wbml, sys2, wbml, system1_state, bootsys2, ROT0, "bootleg", "Wonder Boy in Monster Land (English bootleg set 1)", GAME_SUPPORTS_SAVE) -GAME( 1987, wbmlbg, wbml, sys2, wbml, system1_state, bootsys2, ROT0, "bootleg (Galaxy Electronics)", "Wonder Boy in Monster Land (English bootleg set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1987, wbmlbge, wbml, sys2, wbml, system1_state, bootsys2, ROT0, "bootleg (Gecas)", "Wonder Boy in Monster Land (English bootleg set 3)", GAME_SUPPORTS_SAVE ) -GAME( 2009, wbmlvc, wbml, sys2, wbml, system1_state, bootsys2, ROT0, "Sega", "Wonder Boy in Monster Land (English, Virtual Console)", GAME_SUPPORTS_SAVE ) -GAME( 1987, dakkochn, 0, sys2, dakkochn, system1_state, dakkochn, ROT0, "White Board", "DakkoChan House (MC-8123B, 317-5014)", GAME_SUPPORTS_SAVE ) -GAME( 1987, blockgalb, blockgal, sys2, blockgal, system1_state, bootleg, ROT90, "bootleg", "Block Gal (bootleg)", GAME_SUPPORTS_SAVE ) -GAME( 1988, ufosensi, 0, sys2row, ufosensi, system1_state, ufosensi, ROT0, "Sega", "Ufo Senshi Yohko Chan (MC-8123, 317-0064)", GAME_SUPPORTS_SAVE ) -GAME( 1988, ufosensib, ufosensi, sys2row, ufosensi, system1_state, bootsys2, ROT0, "bootleg", "Ufo Senshi Yohko Chan (bootleg, not encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1985, choplift, 0, sys2rowm, choplift, system1_state, choplift, ROT0, "Sega (licensed from Dan Gorlin)", "Choplifter (8751 315-5151)", GAME_SUPPORTS_SAVE ) +GAME( 1985, chopliftu, choplift, sys2row, choplift, system1_state, bank0c, ROT0, "Sega (licensed from Dan Gorlin)", "Choplifter (unprotected)", GAME_SUPPORTS_SAVE ) +GAME( 1985, chopliftbl, choplift, sys2row, choplift, system1_state, bank0c, ROT0, "bootleg", "Choplifter (bootleg)", GAME_SUPPORTS_SAVE ) +GAME( 1985, shtngmst, 0, sys2m, shtngmst, system1_state, shtngmst, ROT0, "Sega", "Shooting Master (8751 315-5159)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) +GAME( 1985, shtngmste, shtngmst, sys2m, shtngmst, system1_state, shtngmst, ROT0, "Sega / EVG", "Shooting Master (EVG, 8751 315-5159a)", GAME_SUPPORTS_SAVE ) +GAME( 1986, gardiab, gardia, sys2x, gardia, system1_state, gardiab, ROT270, "bootleg", "Gardia (317-0007?, bootleg)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) +GAME( 1986, wboysys2, wboy, sys2x, wboysys2, system1_state, wboysys2, ROT0, "Escape (Sega license)", "Wonder Boy (system 2)", GAME_SUPPORTS_SAVE ) +GAME( 1987, tokisens, 0, sys2, tokisens, system1_state, bank0c, ROT90, "Sega", "Toki no Senshi - Chrono Soldier", GAME_SUPPORTS_SAVE ) +GAME( 1987, wbml, 0, sys2xb, wbml, system1_state, wbml, ROT0, "Sega / Westone", "Wonder Boy in Monster Land (Japan New Ver., MC-8123, 317-0043)", GAME_SUPPORTS_SAVE ) +GAME( 1987, wbmljo, wbml, sys2xb, wbml, system1_state, wbml, ROT0, "Sega / Westone", "Wonder Boy in Monster Land (Japan Old Ver., MC-8123, 317-0043)", GAME_SUPPORTS_SAVE ) +GAME( 1987, wbmljb, wbml, sys2xb, wbml, system1_state, bootsys2, ROT0, "bootleg", "Wonder Boy in Monster Land (Japan bootleg)", GAME_SUPPORTS_SAVE ) +GAME( 1987, wbmlb, wbml, sys2xb, wbml, system1_state, bootsys2, ROT0, "bootleg", "Wonder Boy in Monster Land (English bootleg set 1)", GAME_SUPPORTS_SAVE) +GAME( 1987, wbmlbg, wbml, sys2xb, wbml, system1_state, bootsys2, ROT0, "bootleg (Galaxy Electronics)", "Wonder Boy in Monster Land (English bootleg set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1987, wbmlbge, wbml, sys2xb, wbml, system1_state, bootsys2, ROT0, "bootleg (Gecas)", "Wonder Boy in Monster Land (English bootleg set 3)", GAME_SUPPORTS_SAVE ) +GAME( 2009, wbmlvc, wbml, sys2xb, wbml, system1_state, bootsys2, ROT0, "Sega", "Wonder Boy in Monster Land (English, Virtual Console)", GAME_SUPPORTS_SAVE ) +GAME( 1987, dakkochn, 0, sys2xb, dakkochn, system1_state, dakkochn, ROT0, "White Board", "DakkoChan House (MC-8123B, 317-5014)", GAME_SUPPORTS_SAVE ) +GAME( 1987, blockgalb, blockgal, sys2x, blockgal, system1_state, bootleg, ROT90, "bootleg", "Block Gal (bootleg)", GAME_SUPPORTS_SAVE ) +GAME( 1988, ufosensi, 0, sys2rowxb, ufosensi, system1_state, ufosensi, ROT0, "Sega", "Ufo Senshi Yohko Chan (MC-8123, 317-0064)", GAME_SUPPORTS_SAVE ) +GAME( 1988, ufosensib, ufosensi, sys2rowxb, ufosensi, system1_state, bootsys2, ROT0, "bootleg", "Ufo Senshi Yohko Chan (bootleg, not encrypted)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/system16.c b/src/mame/drivers/system16.c index 692c99e659f..2c0723f6f18 100644 --- a/src/mame/drivers/system16.c +++ b/src/mame/drivers/system16.c @@ -625,6 +625,10 @@ static ADDRESS_MAP_START( bayrouteb1_map, AS_PROGRAM, 16, segas1x_bootleg_state AM_RANGE(0x902002, 0x902003) AM_READ_PORT("DSW1") ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 16, segas1x_bootleg_state ) + AM_RANGE(0x000000, 0x0bffff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + void segas1x_bootleg_state::datsu_set_pages( ) { UINT16 page; @@ -2159,6 +2163,7 @@ static MACHINE_CONFIG_START( goldnaxeb1, segas1x_bootleg_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 10000000) MCFG_CPU_PROGRAM_MAP(goldnaxeb1_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", segas1x_bootleg_state, sys16_interrupt) @@ -2187,6 +2192,7 @@ static MACHINE_CONFIG_DERIVED( goldnaxeb2, goldnaxeb1 ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(goldnaxeb2_map) + MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_DECRYPTED_OPCODES) MACHINE_CONFIG_END @@ -2202,6 +2208,7 @@ static MACHINE_CONFIG_DERIVED( bayrouteb2, goldnaxeb1 ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(bayrouteb2_map) + MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_DECRYPTED_OPCODES) MCFG_FRAGMENT_ADD(system16_datsu_sound) @@ -3462,29 +3469,24 @@ DRIVER_INIT_MEMBER(segas1x_bootleg_state,wb3bbl) DRIVER_INIT_MEMBER(segas1x_bootleg_state,goldnaxeb1) { int i; - UINT8 *ROM = memregion("maincpu")->base(); + UINT16 *ROM = (UINT16 *)memregion("maincpu")->base(); UINT8 *KEY = memregion("decryption")->base(); - address_space &space = m_maincpu->space(AS_PROGRAM); - UINT8 data[0x1000]; + UINT16 data[0x800]; // the decryption key is in a rom (part of an MSDOS executable...) for (i = 0; i < 0x800; i++) { - KEY[i] = KEY[i] ^ 0xff; - data[(i * 2) + 0] = ((KEY[i] & 0x80) >> 1) | ((KEY[i] & 0x40) >> 2) | ((KEY[i] & 0x20) >> 3) | ((KEY[i] & 0x10) >> 4); - data[(i * 2) + 1] = ((KEY[i] & 0x08) << 3) | ((KEY[i] & 0x04) << 2) | ((KEY[i] & 0x02) << 1) | ((KEY[i] & 0x01) << 0); + UINT8 k = KEY[i] ^ 0xff; + data[i] = ((k & 0x80) << 7) | ((k & 0x40) << 6) | ((k & 0x20) << 5) | ((k & 0x10) << 4) | ((k & 0x08) << 3) | ((k & 0x04) << 2) | ((k & 0x02) << 1) | ((k & 0x01) << 0); } - m_decrypted_region = auto_alloc_array(machine(), UINT8, 0xc0000); - memcpy(m_decrypted_region, ROM, 0xc0000); + memcpy(m_decrypted_opcodes, ROM, 0xc0000); - for (i = 0; i < 0x40000; i++) + for (i = 0; i < 0x20000; i++) { - m_decrypted_region[i] = ROM[i] ^ data[(i & 0xfff) ^ 1]; + m_decrypted_opcodes[i] = ROM[i] ^ data[i & 0x7ff]; } - space.set_decrypted_region(0x00000, 0xbffff, m_decrypted_region); - DRIVER_INIT_CALL(common); m_spritebank_type = 1; @@ -3499,23 +3501,20 @@ DRIVER_INIT_MEMBER(segas1x_bootleg_state,bayrouteb1) // // for now we use the code which is present in the unprotected bootleg set // and modify the rom to use it - UINT16 *ROM2; - UINT16 *decrypted_region2; // decrypt DRIVER_INIT_CALL(goldnaxeb1); - ROM2 = (UINT16*)memregion("maincpu")->base(); - decrypted_region2 = (UINT16*)m_decrypted_region; + UINT16 *ROM = (UINT16*)memregion("maincpu")->base(); // patch interrupt vector - ROM2[0x0070/2] = 0x000b; - ROM2[0x0072/2] = 0xf000; + ROM[0x0070/2] = 0x000b; + ROM[0x0072/2] = 0xf000; // patch check for code in RAM - decrypted_region2[0x107e/2] = 0x48e7; - decrypted_region2[0x1080/2] = 0x000b; - decrypted_region2[0x1082/2] = 0xf000; + m_decrypted_opcodes[0x107e/2] = 0x48e7; + m_decrypted_opcodes[0x1080/2] = 0x000b; + m_decrypted_opcodes[0x1082/2] = 0xf000; } DRIVER_INIT_MEMBER(segas1x_bootleg_state,bayrouteb2) diff --git a/src/mame/drivers/tcl.c b/src/mame/drivers/tcl.c index 2c975602f4d..48a5b93c25f 100644 --- a/src/mame/drivers/tcl.c +++ b/src/mame/drivers/tcl.c @@ -173,7 +173,6 @@ DRIVER_INIT_MEMBER(tcl_state,tcl) { /* only the first part is decrypted (and verified)*/ - address_space &space = m_maincpu->space(AS_PROGRAM); UINT8 *dest = memregion("maincpu")->base(); int len = memregion("maincpu")->bytes(); dynamic_buffer src(len); @@ -197,8 +196,6 @@ DRIVER_INIT_MEMBER(tcl_state,tcl) WRITEDEST((src[idx]^0x11)^0xf0); // abcdefgh -> ABCdefgH } } - - space.set_decrypted_region(0x0000, 0x7fff, dest+0x10000); } GAME( 1995, tcl, 0, tcl, tcl, tcl_state, tcl, ROT0, "Uniwang", "Taiwan Chess Legend", GAME_NOT_WORKING ) diff --git a/src/mame/drivers/toki.c b/src/mame/drivers/toki.c index fc6d7cdf076..aad35f84649 100644 --- a/src/mame/drivers/toki.c +++ b/src/mame/drivers/toki.c @@ -403,6 +403,13 @@ static MACHINE_CONFIG_START( toki, toki_state ) /* KOYO 20.000MHz near the cpu * SEIBU_SOUND_SYSTEM_YM3812_RAIDEN_INTERFACE(XTAL_14_31818MHz/4,XTAL_12MHz/12) /* verifed on pcb */ MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( tokie, toki ) + SEIBU_SOUND_SYSTEM_ENCRYPTED_LOW() +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( tokic, toki ) + SEIBU_SOUND_SYSTEM_ENCRYPTED_CUSTOM() +MACHINE_CONFIG_END static MACHINE_CONFIG_START( tokib, toki_state ) @@ -757,8 +764,6 @@ DRIVER_INIT_MEMBER(toki_state,toki) { ROM[i] = buffer[BITSWAP24(i,23,22,21,20,19,18,17,16,13,14,15,12,11,10,9,8,7,6,5,4,3,2,1,0)]; } - - m_seibu_sound->decrypt("audiocpu",0x2000); } @@ -821,16 +826,12 @@ DRIVER_INIT_MEMBER(toki_state,jujuba) /* Decrypt data for z80 program */ { - address_space &space = m_audiocpu->space(AS_PROGRAM); - UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x20000); + UINT8 *decrypt = m_seibu_sound->get_custom_decrypt(); UINT8 *rom = memregion("audiocpu")->base(); - int i; memcpy(decrypt,rom,0x20000); - space.set_decrypted_region(0x0000, 0x1fff, decrypt); - - for (i = 0;i < 0x2000;i++) + for (int i = 0;i < 0x2000;i++) { UINT8 src = decrypt[i]; rom[i] = src^0x55; @@ -852,15 +853,15 @@ DRIVER_INIT_MEMBER(toki_state,jujuba) // these 2 are both unique revisions -GAME( 1989, toki, 0, toki, toki, toki_state, toki, ROT0, "TAD Corporation", "Toki (World, set 1)", GAME_SUPPORTS_SAVE ) -GAME( 1989, tokiu, toki, toki, toki, toki_state, toki, ROT0, "TAD Corporation (Fabtek license)", "Toki (US, set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1989, toki, 0, tokie, toki, toki_state, toki, ROT0, "TAD Corporation", "Toki (World, set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1989, tokiu, toki, tokie, toki, toki_state, toki, ROT0, "TAD Corporation (Fabtek license)", "Toki (US, set 1)", GAME_SUPPORTS_SAVE ) // these 3 are all the same revision, only the region byte differs -GAME( 1989, tokia, toki, toki, toki, toki_state, toki, ROT0, "TAD Corporation", "Toki (World, set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1989, tokiua,toki, toki, toki, toki_state, toki, ROT0, "TAD Corporation (Fabtek license)", "Toki (US, set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1989, juju, toki, toki, toki, toki_state, toki, ROT0, "TAD Corporation", "JuJu Densetsu (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1989, tokia, toki, tokie, toki, toki_state, toki, ROT0, "TAD Corporation", "Toki (World, set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1989, tokiua,toki, tokie, toki, toki_state, toki, ROT0, "TAD Corporation (Fabtek license)", "Toki (US, set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1989, juju, toki, tokie, toki, toki_state, toki, ROT0, "TAD Corporation", "JuJu Densetsu (Japan)", GAME_SUPPORTS_SAVE ) GAME( 1990, tokib, toki, tokib, tokib, toki_state, tokib, ROT0, "bootleg (Datsu)", "Toki (Datsu bootleg)", GAME_SUPPORTS_SAVE ) GAME( 1990, jujub, toki, tokib, tokib, toki_state, tokib, ROT0, "bootleg (Playmark)", "JuJu Densetsu (Playmark bootleg)", GAME_SUPPORTS_SAVE ) /* Sound hardware seems to have been slightly modified, the coins are handled ok, but there is no music and bad sfx. Program roms have a slight bitswap, Flipscreen also seems to be ignored */ -GAME( 1989, jujuba, toki, toki, toki, toki_state, jujuba, ROT180, "bootleg", "JuJu Densetsu (Japan, bootleg)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // bootleg of tokia/juju revison +GAME( 1989, jujuba, toki, tokic, toki, toki_state, jujuba, ROT180, "bootleg", "JuJu Densetsu (Japan, bootleg)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // bootleg of tokia/juju revison diff --git a/src/mame/drivers/trackfld.c b/src/mame/drivers/trackfld.c index 7ff93fb34ca..2aa78acb812 100644 --- a/src/mame/drivers/trackfld.c +++ b/src/mame/drivers/trackfld.c @@ -892,7 +892,7 @@ INTERRUPT_GEN_MEMBER(trackfld_state::vblank_nmi) static MACHINE_CONFIG_START( trackfld, trackfld_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6809, MASTER_CLOCK/6/2) /* a guess for now */ + MCFG_CPU_ADD("maincpu", KONAMI1, MASTER_CLOCK/6/2) /* a guess for now */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", trackfld_state, vblank_irq) @@ -1010,8 +1010,11 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( mastkin, trackfld ) /* basic machine hardware */ - MCFG_CPU_MODIFY("maincpu") + MCFG_DEVICE_REMOVE("maincpu") + + MCFG_CPU_ADD("maincpu", M6809, MASTER_CLOCK/6/2) /* a guess for now */ MCFG_CPU_PROGRAM_MAP(mastkin_map) + MCFG_CPU_VBLANK_INT_DRIVER("screen", trackfld_state, vblank_irq) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( wizzquiz, trackfld ) @@ -1421,24 +1424,14 @@ ROM_END DRIVER_INIT_MEMBER(trackfld_state,trackfld) { - konami1_decode(machine(), "maincpu"); } DRIVER_INIT_MEMBER(trackfld_state,atlantol) { address_space &space = m_maincpu->space(AS_PROGRAM); UINT8 *rom = memregion("maincpu")->base(); - UINT8 *decrypt; - int A; - - /* "konami1" encrypted opcodes */ - decrypt = konami1_decode(machine(), "maincpu"); - - /* not encrypted opcodes */ - for (A = 0; A < 0x6000; A++) - decrypt[A] = rom[A]; - space.set_decrypted_region(0x0000, 0xffff, decrypt); + machine().device<konami1_device>("maincpu")->set_encryption_boundary(0x6000); space.install_write_handler(0x0800, 0x0800, write8_delegate(FUNC(trackfld_state::atlantol_gfxbank_w),this)); space.nop_write(0x1000, 0x1000); diff --git a/src/mame/drivers/turbo.c b/src/mame/drivers/turbo.c index 29c981cee60..b9ec462b66d 100644 --- a/src/mame/drivers/turbo.c +++ b/src/mame/drivers/turbo.c @@ -539,7 +539,6 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( buckrog_map, AS_PROGRAM, 8, turbo_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM - AM_RANGE(0x8000, 0xbfff) AM_ROM AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(turbo_videoram_w) AM_SHARE("videoram") // FIX PAGE AM_RANGE(0xc800, 0xc803) AM_MIRROR(0x07fc) AM_DEVREAD("i8255_0", i8255_device, read) AM_WRITE(buckrog_i8255_0_w) // 8255 AM_RANGE(0xd000, 0xd003) AM_MIRROR(0x07fc) AM_DEVREADWRITE("i8255_1", i8255_device, read, write) // 8255 @@ -555,6 +554,9 @@ static ADDRESS_MAP_START( buckrog_map, AS_PROGRAM, 8, turbo_state ) AM_RANGE(0xf800, 0xffff) AM_RAM // SCRATCH ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, turbo_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END static ADDRESS_MAP_START( buckrog_cpu2_map, AS_PROGRAM, 8, turbo_state ) AM_RANGE(0x0000, 0x1fff) AM_ROM @@ -919,6 +921,7 @@ static MACHINE_CONFIG_START( buckrog, turbo_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/4) MCFG_CPU_PROGRAM_MAP(buckrog_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", turbo_state, irq0_line_hold) MCFG_CPU_ADD("subcpu", Z80, MASTER_CLOCK/4) @@ -1178,7 +1181,7 @@ ROM_END ROM_START( buckrog ) /* CPU BOARD Sega ID# 834-5158-01, ROM BOARD Sega ID# 834-5152-01 */ - ROM_REGION( 0xc000, "maincpu", 0 ) + ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "epr-5265.cpu-ic3", 0x0000, 0x4000, CRC(f0055e97) SHA1(f6ee2afd6fef710949087d1cb04cbc242d1fa9f5) ) /* encrypted Z80 code, SEGA 315-5014 CPU */ ROM_LOAD( "epr-5266.cpu-ic4", 0x4000, 0x4000, CRC(7d084c39) SHA1(ef2c0a2a59e14d9e196fd3837139fc5acf0f63be) ) /* encrypted Z80 code, SEGA 315-5014 CPU */ @@ -1584,7 +1587,28 @@ DRIVER_INIT_MEMBER(turbo_state,turbo_enc) DRIVER_INIT_MEMBER(turbo_state,buckrog_enc) { - buckrog_decode(machine(), "maincpu"); + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x80,0x00,0x88,0x08 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...0...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...0...0...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...1...0 */ + { 0x80,0x00,0x88,0x08 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...0...1...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...1...0...0 */ + { 0x80,0x00,0x88,0x08 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...0...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...1...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...1...1...1 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...0...0...0 */ + { 0x80,0x00,0x88,0x08 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...0...1 */ + { 0x80,0x00,0x88,0x08 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...1...1 */ + { 0x80,0x00,0x88,0x08 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...1...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...1...0 */ + { 0x28,0xa8,0x08,0x88 }, { 0xa8,0xa0,0x88,0x80 } /* ...1...1...1...1 */ + }; + sega_decode(memregion("maincpu")->base(), m_decrypted_opcodes, 0x8000, convtable); } diff --git a/src/mame/drivers/wiz.c b/src/mame/drivers/wiz.c index a0490bbd343..ab881a9a3e1 100644 --- a/src/mame/drivers/wiz.c +++ b/src/mame/drivers/wiz.c @@ -328,6 +328,10 @@ static ADDRESS_MAP_START( kungfut_main_map, AS_PROGRAM, 8, wiz_state ) AM_RANGE(0xf818, 0xf818) AM_WRITE(wiz_bgcolor_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, wiz_state ) + AM_RANGE(0x0000, 0xbfff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END + static ADDRESS_MAP_START( wiz_main_map, AS_PROGRAM, 8, wiz_state ) AM_RANGE(0xc800, 0xc801) AM_WRITE(wiz_coin_counter_w) AM_RANGE(0xd400, 0xd400) AM_READ(wiz_protection_r) @@ -830,6 +834,7 @@ static MACHINE_CONFIG_DERIVED( stinger, kungfut ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(stinger_main_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) /* basic machine hardware */ MCFG_CPU_MODIFY("audiocpu") @@ -849,6 +854,9 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( scion, stinger ) + MCFG_CPU_MODIFY("maincpu") + MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_DECRYPTED_OPCODES) + /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(2*8, 32*8-1, 2*8, 30*8-1) @@ -863,12 +871,12 @@ MACHINE_CONFIG_END ***************************************************************************/ ROM_START( kungfut ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "p1.bin", 0x0000, 0x4000, CRC(b1e56960) SHA1(993388bbb663412110d1012be9ffc00b06fce4d0) ) ROM_LOAD( "p3.bin", 0x4000, 0x4000, CRC(6fc346f8) SHA1(bd1663fa780e41eafd668bf502b40c9750270e55) ) ROM_LOAD( "p2.bin", 0x8000, 0x4000, CRC(042cc9c5) SHA1(09f87e240c2aaa19fe7b8cb548ded828ab67b18b) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "1.bin", 0x0000, 0x2000, CRC(68028a5d) SHA1(2fabf5e55e09a34cd090d123737d31970e4086e8) ) ROM_REGION( 0x6000, "gfx1", 0 ) @@ -888,12 +896,12 @@ ROM_START( kungfut ) ROM_END ROM_START( kungfuta ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "kungfu.01", 0x0000, 0x4000, CRC(48dada70) SHA1(a90901d2aef73d4fa9d9c80769b82a3fead0a0f9) ) ROM_LOAD( "kungfu.02", 0x4000, 0x4000, CRC(c08c5152) SHA1(c5db3ee1ee165708d93d296b51a5bb43265ac75f) ) ROM_LOAD( "kungfu.03", 0x8000, 0x4000, CRC(09b8670c) SHA1(170e7cbf87727d940e959fa7a0328b4cc1aba195) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "kungfu.04", 0x0000, 0x2000, CRC(352bff48) SHA1(87d2408d31e1326ec810debcb2c724d1f003ae7b) ) ROM_REGION( 0x6000, "gfx1", 0 ) @@ -913,12 +921,12 @@ ROM_START( kungfuta ) ROM_END ROM_START( wiz ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "ic07_01.bin", 0x0000, 0x4000, CRC(c05f2c78) SHA1(98b93234684a3a228552ef41a08512fef1befedd) ) ROM_LOAD( "ic05_03.bin", 0x4000, 0x4000, CRC(7978d879) SHA1(866efdff3c111793d5a3cc2fa0b03a2b4e371c49) ) ROM_LOAD( "ic06_02.bin", 0x8000, 0x4000, CRC(9c406ad2) SHA1(cd82c3dc622886b6ebb30ba565f3c34d5a4e229b) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "ic57_10.bin", 0x0000, 0x2000, CRC(8a7575bd) SHA1(5470c4c3a40139f45db7a9e260f40b5244f10123) ) ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ @@ -941,12 +949,12 @@ ROM_START( wiz ) ROM_END ROM_START( wizt ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "wiz1.bin", 0x0000, 0x4000, CRC(5a6d3c60) SHA1(faeb7e7ddeee9638ec046655e87f866d81fdbee0) ) ROM_LOAD( "ic05_03.bin", 0x4000, 0x4000, CRC(7978d879) SHA1(866efdff3c111793d5a3cc2fa0b03a2b4e371c49) ) ROM_LOAD( "ic06_02.bin", 0x8000, 0x4000, CRC(9c406ad2) SHA1(cd82c3dc622886b6ebb30ba565f3c34d5a4e229b) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "ic57_10.bin", 0x0000, 0x2000, CRC(8a7575bd) SHA1(5470c4c3a40139f45db7a9e260f40b5244f10123) ) ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ @@ -970,12 +978,12 @@ ROM_END /* was marked as Wiz Alt Sound */ ROM_START( wizta ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "ic7", 0x0000, 0x4000, CRC(b2ec49ad) SHA1(f1624995e9d426dd69d6567a91713aa023e716ad) ) ROM_LOAD( "ic5", 0x4000, 0x4000, CRC(f7e8f792) SHA1(2c1f82e6f6b2573d8bf0a27fb344fe86f475ddef) ) ROM_LOAD( "ic6", 0x8000, 0x4000, CRC(9c406ad2) SHA1(cd82c3dc622886b6ebb30ba565f3c34d5a4e229b) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "ic57", 0x0000, 0x2000, CRC(8a7575bd) SHA1(5470c4c3a40139f45db7a9e260f40b5244f10123) ) ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ @@ -998,14 +1006,14 @@ ROM_START( wizta ) ROM_END ROM_START( stinger ) - ROM_REGION( 0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "1-5j.bin", 0x0000, 0x2000, CRC(1a2ca600) SHA1(473e89f2c49f6e6f38df5d6fc2267ffecf84c6c8) ) /* encrypted */ ROM_LOAD( "2-6j.bin", 0x2000, 0x2000, CRC(957cd39c) SHA1(38bb589b3bfd962415b31d1151adf4bdb661122f) ) /* encrypted */ ROM_LOAD( "3-8j.bin", 0x4000, 0x2000, CRC(404c932e) SHA1(c23eac49e06ff38564062c0e8c8cdadf877f1d6a) ) /* encrypted */ ROM_LOAD( "4-9j.bin", 0x6000, 0x2000, CRC(2d570f91) SHA1(31d54d9fd5254c33f07c605bd6112c7eb53c42a1) ) /* encrypted */ ROM_LOAD( "5-10j.bin", 0x8000, 0x2000, CRC(c841795c) SHA1(e03860813c03ca1c737935accc2b5fe87c6b624a) ) /* encrypted */ - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "6-9f.bin", 0x0000, 0x2000, CRC(79757f0c) SHA1(71be938c32c6a84618763761786ecc5d7d47581a) ) ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ @@ -1025,14 +1033,14 @@ ROM_START( stinger ) ROM_END ROM_START( stinger2 ) - ROM_REGION( 0x10000, "maincpu", 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "n1.bin", 0x0000, 0x2000, CRC(f2d2790c) SHA1(0e5e92ef45b5bc27b0818f83c89b3bda0e701403) ) /* encrypted */ ROM_LOAD( "n2.bin", 0x2000, 0x2000, CRC(8fd2d8d8) SHA1(d3318a81fddeb3fa50d01569c1e1145e26ce7277) ) /* encrypted */ ROM_LOAD( "n3.bin", 0x4000, 0x2000, CRC(f1794d36) SHA1(7954500f489c0bc58cda8e7ffc2e4474759fdc33) ) /* encrypted */ ROM_LOAD( "n4.bin", 0x6000, 0x2000, CRC(230ba682) SHA1(c419ffebd021d41b3f5021948007fb6bcdb1cdf7) ) /* encrypted */ ROM_LOAD( "n5.bin", 0x8000, 0x2000, CRC(a03a01da) SHA1(28fecac7a821ac4718242919840266a907160df0) ) /* encrypted */ - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "6-9f.bin", 0x0000, 0x2000, CRC(79757f0c) SHA1(71be938c32c6a84618763761786ecc5d7d47581a) ) ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ @@ -1052,14 +1060,14 @@ ROM_START( stinger2 ) ROM_END ROM_START( scion ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "sc1", 0x0000, 0x2000, CRC(8dcad575) SHA1(3f194ece25e730b1cbbf3f332bbdebc3a6a72b0f) ) ROM_LOAD( "sc2", 0x2000, 0x2000, CRC(f608e0ba) SHA1(e55b0ad4dc117339d45a999e13760f4ab3ca4ce0) ) ROM_LOAD( "sc3", 0x4000, 0x2000, CRC(915289b9) SHA1(b32b40f93de4501619486a8c5a8367d3b2e357a6) ) ROM_LOAD( "4.9j", 0x6000, 0x2000, CRC(0f40d002) SHA1(13b04f3902ebdda02670fcb667e181cf70594c37) ) ROM_LOAD( "5.10j", 0x8000, 0x2000, CRC(dc4923b7) SHA1(ec5c22ef1f9ba0fe4da3de62a63a44aa3ff850f4) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "sc6", 0x0000, 0x2000, CRC(09f5f9c1) SHA1(83e489f32597880fb1a13f0bafedd275facb21f7) ) ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ @@ -1079,14 +1087,14 @@ ROM_START( scion ) ROM_END ROM_START( scionc ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "1.5j", 0x0000, 0x2000, CRC(5aaf571e) SHA1(53becfad13e95012dce6597625c64dcba9ac4433) ) ROM_LOAD( "2.6j", 0x2000, 0x2000, CRC(d5a66ac9) SHA1(3192da12b2d6a07e203999ed97cdba16d4917a98) ) ROM_LOAD( "3.8j", 0x4000, 0x2000, CRC(6e616f28) SHA1(ea32add6173251152ca84426c098c92ace123878) ) ROM_LOAD( "4.9j", 0x6000, 0x2000, CRC(0f40d002) SHA1(13b04f3902ebdda02670fcb667e181cf70594c37) ) ROM_LOAD( "5.10j", 0x8000, 0x2000, CRC(dc4923b7) SHA1(ec5c22ef1f9ba0fe4da3de62a63a44aa3ff850f4) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "6.9f", 0x0000, 0x2000, CRC(a66a0ce6) SHA1(b2d6a8ded007c362c58496ead33d1561a982440a) ) ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ @@ -1115,15 +1123,11 @@ DRIVER_INIT_MEMBER(wiz_state,stinger) { 5,3,7, 0x80 }, { 5,7,3, 0x28 } }; - address_space &space = m_maincpu->space(AS_PROGRAM); + UINT8 *rom = memregion("maincpu")->base(); - int size = memregion("maincpu")->bytes(); - UINT8 *decrypt = auto_alloc_array(machine(), UINT8, size); const UINT8 *tbl; - space.set_decrypted_region(0x0000, 0xffff, decrypt); - - for (int a = 0x0000; a < 0x10000; a++) + for (int a = 0x0000; a < 0xc000; a++) { int row; UINT8 src; @@ -1131,7 +1135,7 @@ DRIVER_INIT_MEMBER(wiz_state,stinger) if (a & 0x2040) { /* not encrypted */ - decrypt[a] = rom[a]; + m_decrypted_opcodes[a] = rom[a]; } else { @@ -1142,7 +1146,7 @@ DRIVER_INIT_MEMBER(wiz_state,stinger) /* decode the opcodes */ tbl = swap_xor_table[row]; - decrypt[a] = BITSWAP8(src, tbl[0], 6, tbl[1], 4, tbl[2], 2, 1, 0) ^ tbl[3]; + m_decrypted_opcodes[a] = BITSWAP8(src, tbl[0], 6, tbl[1], 4, tbl[2], 2, 1, 0) ^ tbl[3]; } } } diff --git a/src/mame/drivers/zaxxon.c b/src/mame/drivers/zaxxon.c index 0b09caa8cab..54089a18c4d 100644 --- a/src/mame/drivers/zaxxon.c +++ b/src/mame/drivers/zaxxon.c @@ -438,6 +438,9 @@ static ADDRESS_MAP_START( zaxxon_map, AS_PROGRAM, 8, zaxxon_state ) AM_RANGE(0xe0fb, 0xe0fb) AM_MIRROR(0x1f00) AM_WRITE(zaxxon_bg_enable_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, zaxxon_state ) + AM_RANGE(0x0000, 0x5fff) AM_ROM AM_SHARE("decrypted_opcodes") +ADDRESS_MAP_END /* derived from Zaxxon, different sound hardware */ static ADDRESS_MAP_START( ixion_map, AS_PROGRAM, 8, zaxxon_state ) @@ -939,9 +942,20 @@ static MACHINE_CONFIG_DERIVED( zaxxon, root ) MCFG_FRAGMENT_ADD(zaxxon_samples) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( szaxxon, zaxxon ) + + /* encryption */ + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( futspy, root ) + /* encryption */ + MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) + /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_UPDATE_DRIVER(zaxxon_state, screen_update_futspy) @@ -956,6 +970,7 @@ static MACHINE_CONFIG_DERIVED( razmataz, root ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(ixion_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MCFG_DEVICE_REMOVE("ppi8255") @@ -1429,14 +1444,13 @@ ROM_START( tiptop ) /* 3 board stack */ ROM_END - /************************************* * - * ROM decryption + * Driver initialization * *************************************/ -void zaxxon_state::zaxxonj_decode(const char *cputag) +DRIVER_INIT_MEMBER(zaxxon_state,zaxxonj) { /* the values vary, but the translation mask is always laid out like this: @@ -1480,15 +1494,9 @@ void zaxxon_state::zaxxonj_decode(const char *cputag) { 0x02,0x08,0x2a,0x20,0x20,0x2a,0x08,0x02 } /* .......1...1...1 */ }; - int A; - address_space &space = machine().device(cputag)->memory().space(AS_PROGRAM); - UINT8 *rom = memregion(cputag)->base(); - int size = memregion(cputag)->bytes(); - UINT8 *decrypt = auto_alloc_array(machine(), UINT8, size); - - space.set_decrypted_region(0x0000, size - 1, decrypt); + UINT8 *rom = memregion("maincpu")->base(); - for (A = 0x0000; A < size; A++) + for (int A = 0x0000; A < 0x6000; A++) { int i,j; UINT8 src; @@ -1509,41 +1517,96 @@ void zaxxon_state::zaxxonj_decode(const char *cputag) /* now decode the opcodes */ /* pick the translation table from bits 0, 4, and 8 of the address */ i = ((A >> 0) & 1) + (((A >> 4) & 1) << 1) + (((A >> 8) & 1) << 2); - decrypt[A] = src ^ opcode_xortable[i][j]; + m_decrypted_opcodes[A] = src ^ opcode_xortable[i][j]; } } - -/************************************* - * - * Driver initialization - * - *************************************/ - -DRIVER_INIT_MEMBER(zaxxon_state,zaxxonj) -{ - zaxxonj_decode("maincpu"); -} - - DRIVER_INIT_MEMBER(zaxxon_state,szaxxon) { - szaxxon_decode(machine(), "maincpu"); + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...0...0...0 */ + { 0x08,0x28,0x88,0xa8 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...1 */ + { 0xa8,0x28,0xa0,0x20 }, { 0x20,0xa0,0x00,0x80 }, /* ...0...0...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...0...1...1 */ + { 0x08,0x28,0x88,0xa8 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...0...1 */ + { 0xa8,0x28,0xa0,0x20 }, { 0x20,0xa0,0x00,0x80 }, /* ...0...1...1...0 */ + { 0x08,0x28,0x88,0xa8 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...1...1 */ + { 0x08,0x28,0x88,0xa8 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...0...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...1...0 */ + { 0xa8,0x28,0xa0,0x20 }, { 0x20,0xa0,0x00,0x80 }, /* ...1...0...1...1 */ + { 0xa8,0x28,0xa0,0x20 }, { 0x20,0xa0,0x00,0x80 }, /* ...1...1...0...0 */ + { 0xa8,0x28,0xa0,0x20 }, { 0x20,0xa0,0x00,0x80 }, /* ...1...1...0...1 */ + { 0x08,0x28,0x88,0xa8 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 } /* ...1...1...1...1 */ + }; + + sega_decode(memregion("maincpu")->base(), m_decrypted_opcodes, 0x6000, convtable); } DRIVER_INIT_MEMBER(zaxxon_state,futspy) { - futspy_decode(machine(), "maincpu"); + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x28,0x08,0x20,0x00 }, { 0x28,0x08,0x20,0x00 }, /* ...0...0...0...0 */ + { 0x80,0x00,0xa0,0x20 }, { 0x08,0x88,0x00,0x80 }, /* ...0...0...0...1 */ + { 0x80,0x00,0xa0,0x20 }, { 0x08,0x88,0x00,0x80 }, /* ...0...0...1...0 */ + { 0xa0,0x80,0x20,0x00 }, { 0x20,0x28,0xa0,0xa8 }, /* ...0...0...1...1 */ + { 0x28,0x08,0x20,0x00 }, { 0x88,0x80,0xa8,0xa0 }, /* ...0...1...0...0 */ + { 0x80,0x00,0xa0,0x20 }, { 0x08,0x88,0x00,0x80 }, /* ...0...1...0...1 */ + { 0x80,0x00,0xa0,0x20 }, { 0x20,0x28,0xa0,0xa8 }, /* ...0...1...1...0 */ + { 0x20,0x28,0xa0,0xa8 }, { 0x08,0x88,0x00,0x80 }, /* ...0...1...1...1 */ + { 0x88,0x80,0xa8,0xa0 }, { 0x28,0x08,0x20,0x00 }, /* ...1...0...0...0 */ + { 0x80,0x00,0xa0,0x20 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...0...1 */ + { 0x20,0x28,0xa0,0xa8 }, { 0x08,0x88,0x00,0x80 }, /* ...1...0...1...0 */ + { 0x80,0x00,0xa0,0x20 }, { 0x20,0x28,0xa0,0xa8 }, /* ...1...0...1...1 */ + { 0x88,0x80,0xa8,0xa0 }, { 0x88,0x80,0xa8,0xa0 }, /* ...1...1...0...0 */ + { 0x80,0x00,0xa0,0x20 }, { 0x08,0x88,0x00,0x80 }, /* ...1...1...0...1 */ + { 0x80,0x00,0xa0,0x20 }, { 0x28,0x08,0x20,0x00 }, /* ...1...1...1...0 */ + { 0x20,0x28,0xa0,0xa8 }, { 0xa0,0x80,0x20,0x00 } /* ...1...1...1...1 */ + }; + + sega_decode(memregion("maincpu")->base(), m_decrypted_opcodes, 0x6000, convtable); } DRIVER_INIT_MEMBER(zaxxon_state,razmataz) { - address_space &pgmspace = m_maincpu->space(AS_PROGRAM); + // Note: same as nprinces + static const UINT8 convtable[32][4] = + { + /* opcode data address */ + /* A B C D A B C D */ + { 0x08,0x88,0x00,0x80 }, { 0xa0,0x20,0x80,0x00 }, /* ...0...0...0...0 */ + { 0xa8,0xa0,0x28,0x20 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...1 */ + { 0x88,0x80,0x08,0x00 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...0...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...0...1...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x20,0x80,0x00 }, /* ...0...1...0...0 */ + { 0xa8,0xa0,0x28,0x20 }, { 0xa8,0xa0,0x28,0x20 }, /* ...0...1...0...1 */ + { 0x88,0x80,0x08,0x00 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...1...1 */ + { 0xa0,0x20,0x80,0x00 }, { 0xa0,0x20,0x80,0x00 }, /* ...1...0...0...0 */ + { 0x08,0x88,0x00,0x80 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...0...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...1...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...1...1 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...1...0...0 */ + { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...1...0...1 */ + { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...1...0 */ + { 0x08,0x88,0x00,0x80 }, { 0x28,0x08,0xa8,0x88 } /* ...1...1...1...1 */ + }; + - nprinces_decode(machine(), "maincpu"); + sega_decode(memregion("maincpu")->base(), m_decrypted_opcodes, 0x6000, convtable); + + address_space &pgmspace = m_maincpu->space(AS_PROGRAM); /* additional input ports are wired */ pgmspace.install_read_port(0xc004, 0xc004, 0, 0x18f3, "SW04"); @@ -1570,19 +1633,19 @@ DRIVER_INIT_MEMBER(zaxxon_state,razmataz) GAME( 1982, zaxxon, 0, zaxxon, zaxxon, driver_device, 0, ROT90, "Sega", "Zaxxon (set 1)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) GAME( 1982, zaxxon2, zaxxon, zaxxon, zaxxon, driver_device, 0, ROT90, "Sega", "Zaxxon (set 2)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) GAME( 1982, zaxxon3, zaxxon, zaxxon, zaxxon, driver_device, 0, ROT90, "Sega", "Zaxxon (set 3)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) -GAME( 1982, zaxxonj, zaxxon, zaxxon, zaxxon, zaxxon_state, zaxxonj, ROT90, "Sega", "Zaxxon (Japan)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) -GAME( 1982, zaxxonb, zaxxon, zaxxon, zaxxon, zaxxon_state, zaxxonj, ROT90, "bootleg", "Jackson", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) +GAME( 1982, zaxxonj, zaxxon, szaxxon, zaxxon, zaxxon_state, zaxxonj, ROT90, "Sega", "Zaxxon (Japan)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) +GAME( 1982, zaxxonb, zaxxon, zaxxon, zaxxon, zaxxon_state, zaxxonj, ROT90, "bootleg", "Jackson", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) /* standard Zaxxon hardware but extra sound board plugged into 8255 PPI socket and encrypted cpu */ -GAME( 1982, szaxxon, 0, zaxxon, szaxxon, zaxxon_state, szaxxon, ROT90, "Sega", "Super Zaxxon (315-5013)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) +GAME( 1982, szaxxon, 0, szaxxon, szaxxon, zaxxon_state, szaxxon, ROT90, "Sega", "Super Zaxxon (315-5013)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) /* standard Zaxxon hardware? but encrypted cpu */ -GAME( 1984, futspy, 0, futspy, futspy, zaxxon_state, futspy, ROT90, "Sega", "Future Spy (315-5061)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) +GAME( 1984, futspy, 0, futspy, futspy, zaxxon_state, futspy, ROT90, "Sega", "Future Spy (315-5061)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) /* these games run on modified Zaxxon hardware with no skewing, extra inputs, and a */ /* G-80 Universal Sound Board */ -GAME( 1983, razmataz, 0, razmataz, razmataz, zaxxon_state, razmataz, ROT90, "Sega", "Razzmatazz", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) -GAME( 1983, ixion, 0, razmataz, ixion, zaxxon_state, szaxxon, ROT270, "Sega", "Ixion (prototype)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE) +GAME( 1983, razmataz, 0, razmataz, razmataz, zaxxon_state, razmataz, ROT90, "Sega", "Razzmatazz", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) +GAME( 1983, ixion, 0, razmataz, ixion, zaxxon_state, szaxxon, ROT270, "Sega", "Ixion (prototype)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE) /* these games run on a slightly newer Zaxxon hardware with more ROM space and a */ /* custom sprite DMA chip */ diff --git a/src/mame/includes/angelkds.h b/src/mame/includes/angelkds.h index d40f622a265..96009b248c9 100644 --- a/src/mame/includes/angelkds.h +++ b/src/mame/includes/angelkds.h @@ -19,7 +19,8 @@ public: m_subcpu(*this, "sub"), m_maincpu(*this, "maincpu"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } /* memory pointers */ required_shared_ptr<UINT8> m_bgtopvideoram; @@ -71,4 +72,5 @@ public: required_device<cpu_device> m_maincpu; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; + optional_shared_ptr<UINT8> m_decrypted_opcodes; }; diff --git a/src/mame/includes/appoooh.h b/src/mame/includes/appoooh.h index 85036346278..01c34c16dff 100644 --- a/src/mame/includes/appoooh.h +++ b/src/mame/includes/appoooh.h @@ -16,7 +16,8 @@ public: m_msm(*this, "msm"), m_maincpu(*this, "maincpu"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } /* memory pointers */ required_shared_ptr<UINT8> m_spriteram; @@ -65,6 +66,7 @@ public: required_device<cpu_device> m_maincpu; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; + optional_shared_ptr<UINT8> m_decrypted_opcodes; }; #define CHR1_OFST 0x00 /* palette page of char set #1 */ diff --git a/src/mame/includes/boogwing.h b/src/mame/includes/boogwing.h index 2941973ac05..0c7a9a7d317 100644 --- a/src/mame/includes/boogwing.h +++ b/src/mame/includes/boogwing.h @@ -35,7 +35,8 @@ public: m_pf4_rowscroll(*this, "pf4_rowscroll"), m_sprgen1(*this, "spritegen1"), m_sprgen2(*this, "spritegen2"), - m_palette(*this, "palette") + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } /* devices */ @@ -57,6 +58,7 @@ public: required_device<decospr_device> m_sprgen1; required_device<decospr_device> m_sprgen2; required_device<palette_device> m_palette; + required_shared_ptr<UINT16> m_decrypted_opcodes; DECLARE_WRITE8_MEMBER(sound_bankswitch_w); DECLARE_DRIVER_INIT(boogwing); diff --git a/src/mame/includes/cclimber.h b/src/mame/includes/cclimber.h index f2242a895f5..14489ef1f5f 100644 --- a/src/mame/includes/cclimber.h +++ b/src/mame/includes/cclimber.h @@ -20,8 +20,9 @@ public: m_swimmer_palettebank(*this, "palettebank"), m_swimmer_background_color(*this, "bgcolor"), m_toprollr_bg_videoram(*this, "bg_videoram"), - m_toprollr_bg_coloram(*this, "bg_coloram") { } - + m_toprollr_bg_coloram(*this, "bg_coloram"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } + required_device<cpu_device> m_maincpu; optional_device<cpu_device> m_audiocpu; required_device<gfxdecode_device> m_gfxdecode; @@ -39,6 +40,7 @@ public: optional_shared_ptr<UINT8> m_swimmer_background_color; optional_shared_ptr<UINT8> m_toprollr_bg_videoram; optional_shared_ptr<UINT8> m_toprollr_bg_coloram; + optional_shared_ptr<UINT8> m_decrypted_opcodes; UINT8 m_yamato_p0; UINT8 m_yamato_p1; diff --git a/src/mame/includes/commando.h b/src/mame/includes/commando.h index 0d3f78f873a..ad7fe963494 100644 --- a/src/mame/includes/commando.h +++ b/src/mame/includes/commando.h @@ -21,7 +21,8 @@ public: m_audiocpu(*this, "audiocpu"), m_maincpu(*this, "maincpu"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } /* memory pointers */ required_device<buffered_spriteram8_device> m_spriteram; @@ -58,4 +59,5 @@ public: required_device<cpu_device> m_maincpu; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; + optional_shared_ptr<UINT8> m_decrypted_opcodes; }; diff --git a/src/mame/includes/cps1.h b/src/mame/includes/cps1.h index 6f5ee69fb46..3a917e812d8 100644 --- a/src/mame/includes/cps1.h +++ b/src/mame/includes/cps1.h @@ -116,7 +116,8 @@ public: m_msm_2(*this, "msm2"), m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } /* memory pointers */ // cps1 @@ -212,6 +213,7 @@ public: required_device<gfxdecode_device> m_gfxdecode; required_device<screen_device> m_screen; required_device<palette_device> m_palette; + optional_shared_ptr<UINT16> m_decrypted_opcodes; DECLARE_READ16_MEMBER(cps1_hack_dsw_r); DECLARE_READ16_MEMBER(cps1_in1_r); @@ -301,6 +303,7 @@ public: TIMER_DEVICE_CALLBACK_MEMBER(cps2_interrupt); TIMER_CALLBACK_MEMBER(cps2_update_digital_volume); + void kabuki_setup(void (*decode)(UINT8 *src, UINT8 *dst)); /* fcrash handlers */ DECLARE_DRIVER_INIT(kodb); diff --git a/src/mame/includes/cps3.h b/src/mame/includes/cps3.h index efbde9ea77d..2ff488f0445 100644 --- a/src/mame/includes/cps3.h +++ b/src/mame/includes/cps3.h @@ -28,7 +28,9 @@ public: m_tilemap40_regs_base(*this, "tmap40_regs"), m_tilemap50_regs_base(*this, "tmap50_regs"), m_fullscreenzoom(*this, "fullscreenzoom"), - m_0xc0000000_ram(*this, "0xc0000000_ram") + m_0xc0000000_ram(*this, "0xc0000000_ram"), + m_decrypted_gamerom(*this, "decrypted_gamerom"), + m_0xc0000000_ram_decrypted(*this, "0xc0000000_ram_decrypted") { } required_device<sh2_device> m_maincpu; @@ -45,13 +47,12 @@ public: required_shared_ptr<UINT32> m_tilemap50_regs_base; required_shared_ptr<UINT32> m_fullscreenzoom; required_shared_ptr<UINT32> m_0xc0000000_ram; + required_shared_ptr<UINT32> m_decrypted_gamerom; + required_shared_ptr<UINT32> m_0xc0000000_ram_decrypted; fujitsu_29f016a_device *m_simm[7][8]; - UINT32* m_decrypted_bios; - UINT32* m_decrypted_gamerom; UINT32 m_cram_gfxflash_bank; UINT32* m_nops; - UINT32* m_0xc0000000_ram_decrypted; UINT32* m_char_ram; UINT32* m_eeprom; UINT32 m_ss_pal_base; @@ -111,7 +112,6 @@ public: DECLARE_WRITE32_MEMBER(cps3_unk_vidregs_w); DECLARE_READ32_MEMBER(cps3_colourram_r); DECLARE_WRITE32_MEMBER(cps3_colourram_w); - DECLARE_DIRECT_UPDATE_MEMBER(cps3_direct_handler); DECLARE_DRIVER_INIT(sfiii3); DECLARE_DRIVER_INIT(sfiii); DECLARE_DRIVER_INIT(redearth); diff --git a/src/mame/includes/darkmist.h b/src/mame/includes/darkmist.h index 0a50e431e0d..07b63ff6108 100644 --- a/src/mame/includes/darkmist.h +++ b/src/mame/includes/darkmist.h @@ -15,7 +15,8 @@ public: m_scroll(*this, "scroll"), m_videoram(*this, "videoram"), m_workram(*this, "workram"), - m_spriteram(*this, "spriteram") { } + m_spriteram(*this, "spriteram"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } required_device<cpu_device> m_maincpu; required_device<t5182_device> m_t5182; @@ -27,6 +28,7 @@ public: required_shared_ptr<UINT8> m_videoram; required_shared_ptr<UINT8> m_workram; required_shared_ptr<UINT8> m_spriteram; + optional_shared_ptr<UINT8> m_decrypted_opcodes; int m_hw; tilemap_t *m_bgtilemap; diff --git a/src/mame/includes/decocrpt.h b/src/mame/includes/decocrpt.h index 3bfcd1c6e8a..6ea05a3b7a0 100644 --- a/src/mame/includes/decocrpt.h +++ b/src/mame/includes/decocrpt.h @@ -9,7 +9,7 @@ void deco56_remap_gfx(running_machine &machine, const char *tag); /*----------- defined in machine/deco102.c -----------*/ -void deco102_decrypt_cpu(running_machine &machine, const char *cputag, int address_xor, int data_select_xor, int opcode_select_xor); +void deco102_decrypt_cpu(UINT16 *rom, UINT16 *opcodes, int size, int address_xor, int data_select_xor, int opcode_select_xor); /*----------- defined in machine/deco156.c -----------*/ diff --git a/src/mame/includes/dietgo.h b/src/mame/includes/dietgo.h index 8211cec1b8e..12c47ebf49e 100644 --- a/src/mame/includes/dietgo.h +++ b/src/mame/includes/dietgo.h @@ -24,7 +24,8 @@ public: m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_deco_tilegen1(*this, "tilegen1"), - m_decocomn(*this, "deco_common") + m_decocomn(*this, "deco_common"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } optional_device<deco104_device> m_deco104; @@ -40,6 +41,7 @@ public: required_device<cpu_device> m_audiocpu; required_device<deco16ic_device> m_deco_tilegen1; required_device<decocomn_device> m_decocomn; + required_shared_ptr<UINT16> m_decrypted_opcodes; DECLARE_DRIVER_INIT(dietgo); virtual void machine_start(); UINT32 screen_update_dietgo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); diff --git a/src/mame/includes/freekick.h b/src/mame/includes/freekick.h index f2bb788d160..514cbfb7c2b 100644 --- a/src/mame/includes/freekick.h +++ b/src/mame/includes/freekick.h @@ -11,7 +11,9 @@ public: m_spriteram(*this, "spriteram"), m_maincpu(*this, "maincpu"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_bank1(*this, "bank1"), + m_bank1d(*this, "bank1d") { } /* memory pointers */ required_shared_ptr<UINT8> m_videoram; @@ -63,4 +65,5 @@ public: required_device<cpu_device> m_maincpu; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; + optional_memory_bank m_bank1, m_bank1d; }; diff --git a/src/mame/includes/galaxian.h b/src/mame/includes/galaxian.h index 871581a0c06..500a419e203 100644 --- a/src/mame/includes/galaxian.h +++ b/src/mame/includes/galaxian.h @@ -54,7 +54,8 @@ public: m_videoram(*this, "videoram"), m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } required_device<cpu_device> m_maincpu; optional_device<cpu_device> m_audiocpu; @@ -73,6 +74,7 @@ public: required_device<gfxdecode_device> m_gfxdecode; required_device<screen_device> m_screen; required_device<palette_device> m_palette; + optional_shared_ptr<UINT8> m_decrypted_opcodes; int m_bullets_base; int m_sprites_base; diff --git a/src/mame/includes/jack.h b/src/mame/includes/jack.h index 968eec9b8df..c108a89eaef 100644 --- a/src/mame/includes/jack.h +++ b/src/mame/includes/jack.h @@ -18,7 +18,8 @@ public: m_videoram(*this, "videoram"), m_colorram(*this, "colorram"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } /* device- and memory pointers */ @@ -30,6 +31,7 @@ public: required_shared_ptr<UINT8> m_colorram; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; + optional_shared_ptr<UINT8> m_decrypted_opcodes; /* video-related */ tilemap_t *m_bg_tilemap; diff --git a/src/mame/includes/kchamp.h b/src/mame/includes/kchamp.h index 6ef9a7ddb13..6e44d71bc80 100644 --- a/src/mame/includes/kchamp.h +++ b/src/mame/includes/kchamp.h @@ -19,7 +19,8 @@ public: m_maincpu(*this, "maincpu"), m_msm(*this, "msm"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } /* memory pointers */ required_shared_ptr<UINT8> m_videoram; @@ -62,10 +63,11 @@ public: INTERRUPT_GEN_MEMBER(sound_int); void kchamp_draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ); void kchampvs_draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ); - UINT8 *decrypt_code(); + void decrypt_code(); DECLARE_WRITE_LINE_MEMBER(msmint); required_device<cpu_device> m_maincpu; optional_device<msm5205_device> m_msm; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; + optional_shared_ptr<UINT8> m_decrypted_opcodes; }; diff --git a/src/mame/includes/ladybug.h b/src/mame/includes/ladybug.h index 56e871113c2..8b7308edf5c 100644 --- a/src/mame/includes/ladybug.h +++ b/src/mame/includes/ladybug.h @@ -22,7 +22,8 @@ public: m_palette(*this, "palette"), m_port_dsw0(*this, "DSW0"), m_p1_control(*this, "CONTP1"), - m_p2_control(*this, "CONTP2") { } + m_p2_control(*this, "CONTP2"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } /* memory pointers */ required_shared_ptr<UINT8> m_videoram; @@ -57,6 +58,7 @@ public: optional_ioport m_port_dsw0; optional_ioport m_p1_control; optional_ioport m_p2_control; + optional_shared_ptr<UINT8> m_decrypted_opcodes; DECLARE_READ8_MEMBER(sraider_sound_low_r); DECLARE_READ8_MEMBER(sraider_sound_high_r); diff --git a/src/mame/includes/liberate.h b/src/mame/includes/liberate.h index 487792089b0..442c5ca5b70 100644 --- a/src/mame/includes/liberate.h +++ b/src/mame/includes/liberate.h @@ -14,7 +14,8 @@ public: m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } optional_shared_ptr<UINT8> m_paletteram; optional_shared_ptr<UINT8> m_bg_vram; /* prosport */ @@ -40,6 +41,7 @@ public: required_device<cpu_device> m_audiocpu; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; + optional_shared_ptr<UINT8> m_decrypted_opcodes; DECLARE_READ8_MEMBER(deco16_bank_r); DECLARE_READ8_MEMBER(deco16_io_r); diff --git a/src/mame/includes/mitchell.h b/src/mame/includes/mitchell.h index 497c50460d5..34369c3e767 100644 --- a/src/mame/includes/mitchell.h +++ b/src/mame/includes/mitchell.h @@ -117,7 +117,7 @@ public: UINT32 screen_update_pang(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); TIMER_DEVICE_CALLBACK_MEMBER(mitchell_irq); void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ); - void bootleg_decode( ); - void configure_banks( ); + void bootleg_decode(); + void configure_banks(void (*decode)(UINT8 *src, UINT8 *dst, int size)); DECLARE_WRITE_LINE_MEMBER(spangbl_adpcm_int); }; diff --git a/src/mame/includes/mouser.h b/src/mame/includes/mouser.h index 4b103f80d22..3fb99eb8877 100644 --- a/src/mame/includes/mouser.h +++ b/src/mame/includes/mouser.h @@ -17,7 +17,8 @@ public: m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } /* memory pointers */ required_shared_ptr<UINT8> m_videoram; @@ -33,6 +34,7 @@ public: required_device<cpu_device> m_audiocpu; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; + optional_shared_ptr<UINT8> m_decrypted_opcodes; DECLARE_WRITE8_MEMBER(mouser_nmi_enable_w); DECLARE_WRITE8_MEMBER(mouser_sound_interrupt_w); diff --git a/src/mame/includes/ninjakd2.h b/src/mame/includes/ninjakd2.h index ed38065f97a..f8a5f950604 100644 --- a/src/mame/includes/ninjakd2.h +++ b/src/mame/includes/ninjakd2.h @@ -21,7 +21,8 @@ public: m_spriteram(*this, "spriteram"), m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen"), - m_palette(*this, "palette") + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } required_device<cpu_device> m_maincpu; @@ -33,6 +34,7 @@ public: required_device<gfxdecode_device> m_gfxdecode; required_device<screen_device> m_screen; required_device<palette_device> m_palette; + optional_shared_ptr<UINT8> m_decrypted_opcodes; const INT16* m_sampledata; UINT8 m_omegaf_io_protection[3]; diff --git a/src/mame/includes/pacman.h b/src/mame/includes/pacman.h index 06c6c4d995b..d62272914f5 100644 --- a/src/mame/includes/pacman.h +++ b/src/mame/includes/pacman.h @@ -23,7 +23,8 @@ public: m_s2650games_tileram(*this, "s2650_tileram"), m_rocktrv2_prot_data(*this, "rocktrv2_prot"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") + m_palette(*this, "palette"), + m_patched_opcodes(*this, "patched_opcodes") { } required_device<cpu_device> m_maincpu; @@ -37,6 +38,7 @@ public: optional_shared_ptr<UINT8> m_rocktrv2_prot_data; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; + optional_shared_ptr<UINT8> m_patched_opcodes; UINT8 m_cannonb_bit_to_read; int m_mystery; diff --git a/src/mame/includes/pbaction.h b/src/mame/includes/pbaction.h index a6e7e74fcf2..13fc38633c6 100644 --- a/src/mame/includes/pbaction.h +++ b/src/mame/includes/pbaction.h @@ -20,7 +20,8 @@ public: m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } /* memory pointers */ required_shared_ptr<UINT8> m_videoram; @@ -41,6 +42,7 @@ public: required_device<cpu_device> m_audiocpu; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; + optional_shared_ptr<UINT8> m_decrypted_opcodes; UINT8 m_nmi_mask; DECLARE_WRITE8_MEMBER(pbaction_sh_command_w); diff --git a/src/mame/includes/pktgaldx.h b/src/mame/includes/pktgaldx.h index b185d8f2727..02b1143ff21 100644 --- a/src/mame/includes/pktgaldx.h +++ b/src/mame/includes/pktgaldx.h @@ -28,7 +28,8 @@ public: m_deco_tilegen1(*this, "tilegen1"), m_decocomn(*this, "deco_common"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } optional_device<deco104_device> m_deco104; @@ -49,6 +50,7 @@ public: optional_device<decocomn_device> m_decocomn; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; + optional_shared_ptr<UINT16> m_decrypted_opcodes; DECLARE_READ16_MEMBER(pckgaldx_unknown_r); DECLARE_READ16_MEMBER(pckgaldx_protection_r); diff --git a/src/mame/includes/segag80r.h b/src/mame/includes/segag80r.h index e6477326079..eaa3107ec3a 100644 --- a/src/mame/includes/segag80r.h +++ b/src/mame/includes/segag80r.h @@ -35,7 +35,8 @@ public: m_005snd(*this, "005"), m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } required_shared_ptr<UINT8> m_mainram; required_shared_ptr<UINT8> m_videoram; @@ -51,6 +52,7 @@ public: required_device<gfxdecode_device> m_gfxdecode; required_device<screen_device> m_screen; required_device<palette_device> m_palette; + optional_shared_ptr<UINT8> m_decrypted_opcodes; std::vector<UINT8> m_paletteram; diff --git a/src/mame/includes/segahang.h b/src/mame/includes/segahang.h index 664841e7983..7d6e6e84813 100644 --- a/src/mame/includes/segahang.h +++ b/src/mame/includes/segahang.h @@ -35,7 +35,8 @@ public: m_segaic16road(*this, "segaic16road"), m_workram(*this, "workram"), m_sharrier_video(false), - m_adc_select(0) + m_adc_select(0), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } // PPI read/write callbacks @@ -107,5 +108,6 @@ protected: // internal state UINT8 m_adc_select; bool m_shadow; + optional_shared_ptr<UINT16> m_decrypted_opcodes; TIMER_DEVICE_CALLBACK_MEMBER(hangon_irq); }; diff --git a/src/mame/includes/segas16a.h b/src/mame/includes/segas16a.h index 2a76c10dbaf..0656dd391a9 100644 --- a/src/mame/includes/segas16a.h +++ b/src/mame/includes/segas16a.h @@ -38,6 +38,7 @@ public: m_segaic16vid(*this, "segaic16vid"), m_sprites(*this, "sprites"), m_workram(*this, "nvram"), + m_sound_decrypted_opcodes(*this, "sound_decrypted_opcodes"), m_video_control(0), m_mcu_control(0), m_n7751_command(0), @@ -136,6 +137,7 @@ protected: // memory pointers required_shared_ptr<UINT16> m_workram; + optional_shared_ptr<UINT8> m_sound_decrypted_opcodes; // configuration read16_delegate m_custom_io_r; diff --git a/src/mame/includes/segas16b.h b/src/mame/includes/segas16b.h index c3df7a7fe44..33c74ae4f99 100644 --- a/src/mame/includes/segas16b.h +++ b/src/mame/includes/segas16b.h @@ -49,7 +49,8 @@ public: m_hwc_input_value(0), m_mj_input_num(0), m_mj_last_val(0), - m_gfxdecode(*this, "gfxdecode") + m_gfxdecode(*this, "gfxdecode"), + m_sound_decrypted_opcodes(*this, "sound_decrypted_opcodes") { } // memory mapping @@ -203,6 +204,7 @@ protected: UINT8 m_mj_last_val; required_device<gfxdecode_device> m_gfxdecode; + optional_shared_ptr<UINT8> m_sound_decrypted_opcodes; }; diff --git a/src/mame/includes/seicross.h b/src/mame/includes/seicross.h index 3093784d8f8..d54177825fe 100644 --- a/src/mame/includes/seicross.h +++ b/src/mame/includes/seicross.h @@ -16,7 +16,8 @@ public: m_videoram(*this, "videoram"), m_row_scroll(*this, "row_scroll"), m_spriteram2(*this, "spriteram2"), - m_colorram(*this, "colorram") { } + m_colorram(*this, "colorram"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } required_device<cpu_device> m_maincpu; required_device<cpu_device> m_mcu; @@ -29,6 +30,7 @@ public: required_shared_ptr<UINT8> m_row_scroll; required_shared_ptr<UINT8> m_spriteram2; required_shared_ptr<UINT8> m_colorram; + optional_shared_ptr<UINT8> m_decrypted_opcodes; UINT8 m_portb; tilemap_t *m_bg_tilemap; diff --git a/src/mame/includes/senjyo.h b/src/mame/includes/senjyo.h index 524b75d8a67..7ed3af920b9 100644 --- a/src/mame/includes/senjyo.h +++ b/src/mame/includes/senjyo.h @@ -30,7 +30,8 @@ public: m_bg3videoram(*this, "bg3videoram"), m_radarram(*this, "radarram"), m_bgstripesram(*this, "bgstripesram"), - m_generic_paletteram_8(*this, "paletteram") { } + m_generic_paletteram_8(*this, "paletteram"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } /* devices */ required_device<cpu_device> m_maincpu; @@ -56,6 +57,7 @@ public: required_shared_ptr<UINT8> m_radarram; required_shared_ptr<UINT8> m_bgstripesram; required_shared_ptr<UINT8> m_generic_paletteram_8; + optional_shared_ptr<UINT8> m_decrypted_opcodes; // game specific initialization int m_is_senjyo; diff --git a/src/mame/includes/stfight.h b/src/mame/includes/stfight.h index 48e66bdd91c..07a0669fd9d 100644 --- a/src/mame/includes/stfight.h +++ b/src/mame/includes/stfight.h @@ -22,7 +22,8 @@ public: m_text_attr_ram(*this, "text_attr_ram"), m_tx_vram(*this, "tx_vram"), m_vh_latch_ram(*this, "vh_latch_ram"), - m_sprite_ram(*this, "sprite_ram") { } + m_sprite_ram(*this, "sprite_ram"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } required_device<cpu_device> m_maincpu; required_device<cpu_device> m_audiocpu; @@ -36,6 +37,7 @@ public: optional_shared_ptr<UINT8> m_tx_vram; required_shared_ptr<UINT8> m_vh_latch_ram; required_shared_ptr<UINT8> m_sprite_ram; + optional_shared_ptr<UINT8> m_decrypted_opcodes; UINT8 *m_decrypt; UINT8 m_fm_data; diff --git a/src/mame/includes/suprloco.h b/src/mame/includes/suprloco.h index 2b3e99190dd..7d7f84d9b3b 100644 --- a/src/mame/includes/suprloco.h +++ b/src/mame/includes/suprloco.h @@ -10,7 +10,8 @@ public: m_gfxdecode(*this, "gfxdecode"), m_spriteram(*this, "spriteram"), m_videoram(*this, "videoram"), - m_scrollram(*this, "scrollram") { } + m_scrollram(*this, "scrollram"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } required_device<cpu_device> m_maincpu; required_device<cpu_device> m_audiocpu; @@ -19,6 +20,7 @@ public: required_shared_ptr<UINT8> m_spriteram; required_shared_ptr<UINT8> m_videoram; required_shared_ptr<UINT8> m_scrollram; + required_shared_ptr<UINT8> m_decrypted_opcodes; tilemap_t *m_bg_tilemap; int m_control; diff --git a/src/mame/includes/system1.h b/src/mame/includes/system1.h index fabb4bb0848..c6d7e437841 100644 --- a/src/mame/includes/system1.h +++ b/src/mame/includes/system1.h @@ -19,7 +19,12 @@ public: m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen"), m_palette(*this, "palette"), - m_generic_paletteram_8(*this, "paletteram") { } + m_generic_paletteram_8(*this, "paletteram"), + m_decrypted_opcodes(*this, "decrypted_opcodes"), + m_maincpu_region(*this, "maincpu"), + m_bank1(*this, "bank1"), + m_bank0d(*this, "bank0d"), + m_bank1d(*this, "bank1d") { } optional_device<i8255_device> m_ppi8255; required_shared_ptr<UINT8> m_ram; @@ -137,4 +142,11 @@ public: required_device<screen_device> m_screen; required_device<palette_device> m_palette; required_shared_ptr<UINT8> m_generic_paletteram_8; + optional_shared_ptr<UINT8> m_decrypted_opcodes; + required_memory_region m_maincpu_region; + required_memory_bank m_bank1; + optional_memory_bank m_bank0d; + optional_memory_bank m_bank1d; + + UINT8 *m_banked_decrypted_opcodes; }; diff --git a/src/mame/includes/system16.h b/src/mame/includes/system16.h index f2171e180ce..91ad78b88d8 100644 --- a/src/mame/includes/system16.h +++ b/src/mame/includes/system16.h @@ -24,7 +24,8 @@ public: m_soundcpu(*this, "soundcpu"), m_msm(*this, "5205"), m_upd7759(*this, "7759"), - m_gfxdecode(*this, "gfxdecode") { } + m_gfxdecode(*this, "gfxdecode"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } required_shared_ptr<UINT16> m_textram; optional_shared_ptr<UINT16> m_bg0_tileram; @@ -121,6 +122,7 @@ public: optional_device<msm5205_device> m_msm; optional_device<upd7759_device> m_upd7759; required_device<gfxdecode_device> m_gfxdecode; + optional_shared_ptr<UINT16> m_decrypted_opcodes; DECLARE_WRITE16_MEMBER(sound_command_nmi_w); DECLARE_WRITE16_MEMBER(sound_command_w); diff --git a/src/mame/includes/turbo.h b/src/mame/includes/turbo.h index d2d72d99b22..c982ca3b7e4 100644 --- a/src/mame/includes/turbo.h +++ b/src/mame/includes/turbo.h @@ -34,6 +34,7 @@ public: m_videoram(*this, "videoram"), m_spriteram(*this, "spriteram"), m_sprite_position(*this, "spritepos"), + m_decrypted_opcodes(*this, "decrypted_opcodes"), m_samples(*this, "samples"), m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen") @@ -55,6 +56,7 @@ public: required_shared_ptr<UINT8> m_videoram; required_shared_ptr<UINT8> m_spriteram; required_shared_ptr<UINT8> m_sprite_position; + optional_shared_ptr<UINT8> m_decrypted_opcodes; required_device<samples_device> m_samples; diff --git a/src/mame/includes/wiz.h b/src/mame/includes/wiz.h index 4b132a697c5..e68dd786b0d 100644 --- a/src/mame/includes/wiz.h +++ b/src/mame/includes/wiz.h @@ -25,7 +25,8 @@ public: m_attrram(*this, "attrram"), m_attrram2(*this, "attrram2"), m_spriteram(*this, "spriteram"), - m_spriteram2(*this, "spriteram2") + m_spriteram2(*this, "spriteram2"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } required_device<cpu_device> m_maincpu; @@ -42,6 +43,7 @@ public: required_shared_ptr<UINT8> m_attrram2; required_shared_ptr<UINT8> m_spriteram; required_shared_ptr<UINT8> m_spriteram2; + optional_shared_ptr<UINT8> m_decrypted_opcodes; INT32 m_flipx; INT32 m_flipy; diff --git a/src/mame/includes/zaxxon.h b/src/mame/includes/zaxxon.h index e89aeacea1b..ffea0ee6c61 100644 --- a/src/mame/includes/zaxxon.h +++ b/src/mame/includes/zaxxon.h @@ -19,7 +19,8 @@ public: m_dials(*this, "DIAL"), m_videoram(*this, "videoram"), m_spriteram(*this, "spriteram"), - m_colorram(*this, "colorram") { } + m_colorram(*this, "colorram"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } required_device<cpu_device> m_maincpu; optional_device<samples_device> m_samples; @@ -31,6 +32,7 @@ public: required_shared_ptr<UINT8> m_videoram; optional_shared_ptr<UINT8> m_spriteram; optional_shared_ptr<UINT8> m_colorram; + optional_shared_ptr<UINT8> m_decrypted_opcodes; UINT8 m_int_enabled; UINT8 m_coin_status[3]; diff --git a/src/mame/machine/cclimber.c b/src/mame/machine/cclimber.c index 803d1c00947..8eb1b531d63 100644 --- a/src/mame/machine/cclimber.c +++ b/src/mame/machine/cclimber.c @@ -8,14 +8,9 @@ void cclimber_state::cclimber_decode(const UINT8 convtable[8][16]) { - address_space &space = m_maincpu->space(AS_PROGRAM); UINT8 *rom = memregion("maincpu")->base(); - UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x10000); - int A; - - space.set_decrypted_region(0x0000, 0xffff, decrypt); - for (A = 0x0000;A < 0x10000;A++) + for (int A = 0x0000;A < 0x6000;A++) { int i,j; UINT8 src = rom[A]; @@ -28,7 +23,7 @@ void cclimber_state::cclimber_decode(const UINT8 convtable[8][16]) j = (src & 0x01) | ((src & 0x04) >> 1) | ((src & 0x10) >> 2) | ((src & 0x40) >> 3); /* decode the opcodes */ - decrypt[A] = (src & 0xaa) | convtable[i][j]; + m_decrypted_opcodes[A] = (src & 0xaa) | convtable[i][j]; } } diff --git a/src/mame/machine/cps2crpt.c b/src/mame/machine/cps2crpt.c index 9af7cf4d248..0dc76c7e5aa 100644 --- a/src/mame/machine/cps2crpt.c +++ b/src/mame/machine/cps2crpt.c @@ -632,12 +632,8 @@ static void optimise_sboxes(struct optimised_sbox* out, const struct sbox* in) -static void cps2_decrypt(running_machine &machine, const UINT32 *master_key, UINT32 upper_limit) +static void cps2_decrypt(running_machine &machine, UINT16 *rom, UINT16 *dec, int length, const UINT32 *master_key, UINT32 upper_limit) { - address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM); - UINT16 *rom = (UINT16 *)machine.root_device().memregion("maincpu")->base(); - int length = machine.root_device().memregion("maincpu")->bytes(); - UINT16 *dec = auto_alloc_array(machine, UINT16, length/2); int i; UINT32 key1[4]; struct optimised_sbox sboxes1[4*4]; @@ -714,16 +710,13 @@ static void cps2_decrypt(running_machine &machine, const UINT32 *master_key, UIN &sboxes2[0*4], &sboxes2[1*4], &sboxes2[2*4], &sboxes2[3*4], key2[0], key2[1], key2[2], key2[3]); } - // copy the unencrypted part (not really needed) + // copy the unencrypted part while (a < length/2) { dec[a] = rom[a]; a += 0x10000; } } - - space.set_decrypted_region(0x000000, length - 1, dec); - ((m68000_base_device*)machine.device("maincpu"))->set_encrypted_opcode_range(0, length); } @@ -1017,7 +1010,7 @@ DRIVER_INIT_MEMBER(cps_state,cps2crpt) if (strcmp(k->name, gamename) == 0) { // we have a proper key so use it to decrypt - cps2_decrypt(machine(), k->keys, k->upper_limit ? k->upper_limit : 0x400000); + cps2_decrypt(machine(), (UINT16 *)memregion("maincpu")->base(), m_decrypted_opcodes, memregion("maincpu")->bytes(), k->keys, k->upper_limit ? k->upper_limit : 0x400000); break; } diff --git a/src/mame/machine/deco102.c b/src/mame/machine/deco102.c index 5441ae9b0a6..3f0c79143f3 100644 --- a/src/mame/machine/deco102.c +++ b/src/mame/machine/deco102.c @@ -49,21 +49,13 @@ static UINT16 decrypt(UINT16 data, int address, int select_xor) bs[8],bs[9],bs[10],bs[11],bs[12],bs[13],bs[14],bs[15]); } -void deco102_decrypt_cpu(running_machine &machine, const char *cputag, int address_xor, int data_select_xor, int opcode_select_xor) +void deco102_decrypt_cpu(UINT16 *rom, UINT16 *opcodes, int size, int address_xor, int data_select_xor, int opcode_select_xor) { - int i; - address_space &space = machine.device(cputag)->memory().space(AS_PROGRAM); - UINT16 *rom = (UINT16 *)machine.root_device().memregion(cputag)->base(); - int size = machine.root_device().memregion(cputag)->bytes(); - UINT16 *opcodes = auto_alloc_array(machine, UINT16, size / 2); std::vector<UINT16> buf(size / 2); memcpy(&buf[0], rom, size); - space.set_decrypted_region(0, size - 1, opcodes); - ((m68000_base_device*)machine.device(cputag))->set_encrypted_opcode_range(0, size); - - for (i = 0; i < size / 2; i++) + for (int i = 0; i < size / 2; i++) { int src; diff --git a/src/mame/machine/deco222.c b/src/mame/machine/deco222.c index ebc6dc46f9a..1df8a720dd2 100644 --- a/src/mame/machine/deco222.c +++ b/src/mame/machine/deco222.c @@ -25,9 +25,9 @@ void deco_222_device::device_reset() static_cast<mi_decrypt *>(mintf)->had_written = false; } -UINT8 deco_222_device::mi_decrypt::read_decrypted(UINT16 adr) +UINT8 deco_222_device::mi_decrypt::read_sync(UINT16 adr) { - return BITSWAP8(direct->read_raw_byte(adr) ,7,5,6,4,3,2,1,0); + return BITSWAP8(direct->read_byte(adr) ,7,5,6,4,3,2,1,0); } @@ -49,7 +49,7 @@ void deco_c10707_device::device_reset() static_cast<mi_decrypt *>(mintf)->had_written = false; } -UINT8 deco_c10707_device::mi_decrypt::read_decrypted(UINT16 adr) +UINT8 deco_c10707_device::mi_decrypt::read_sync(UINT16 adr) { - return BITSWAP8(direct->read_raw_byte(adr) ,7,5,6,4,3,2,1,0); + return BITSWAP8(direct->read_byte(adr) ,7,5,6,4,3,2,1,0); } diff --git a/src/mame/machine/deco222.h b/src/mame/machine/deco222.h index d221d59b91e..042e2bbbd98 100644 --- a/src/mame/machine/deco222.h +++ b/src/mame/machine/deco222.h @@ -14,7 +14,7 @@ protected: bool had_written; virtual ~mi_decrypt() {} - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); }; virtual void device_start(); @@ -36,7 +36,7 @@ protected: bool had_written; virtual ~mi_decrypt() {} - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); }; virtual void device_start(); diff --git a/src/mame/machine/decocpu6.c b/src/mame/machine/decocpu6.c index 98542ff12fb..957c602976f 100644 --- a/src/mame/machine/decocpu6.c +++ b/src/mame/machine/decocpu6.c @@ -24,10 +24,10 @@ void deco_cpu6_device::device_reset() m6502_device::device_reset(); } -UINT8 deco_cpu6_device::mi_decrypt::read_decrypted(UINT16 adr) +UINT8 deco_cpu6_device::mi_decrypt::read_sync(UINT16 adr) { if (adr&1) - return BITSWAP8(direct->read_raw_byte(adr),6,4,7,5,3,2,1,0); + return BITSWAP8(direct->read_byte(adr),6,4,7,5,3,2,1,0); else - return direct->read_raw_byte(adr); + return direct->read_byte(adr); } diff --git a/src/mame/machine/decocpu6.h b/src/mame/machine/decocpu6.h index 6e6fc64effa..678338027fc 100644 --- a/src/mame/machine/decocpu6.h +++ b/src/mame/machine/decocpu6.h @@ -13,7 +13,7 @@ protected: class mi_decrypt : public mi_default_normal { public: virtual ~mi_decrypt() {} - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); }; virtual void device_start(); diff --git a/src/mame/machine/decocpu7.c b/src/mame/machine/decocpu7.c index e77f47b057f..dc6bb85dff8 100644 --- a/src/mame/machine/decocpu7.c +++ b/src/mame/machine/decocpu7.c @@ -20,9 +20,9 @@ void deco_cpu7_device::device_reset() static_cast<mi_decrypt *>(mintf)->had_written = false; } -UINT8 deco_cpu7_device::mi_decrypt::read_decrypted(UINT16 adr) +UINT8 deco_cpu7_device::mi_decrypt::read_sync(UINT16 adr) { - UINT8 res = direct->read_raw_byte(adr); + UINT8 res = direct->read_byte(adr); if(had_written) { had_written = false; if((adr & 0x0104) == 0x0104) diff --git a/src/mame/machine/decocpu7.h b/src/mame/machine/decocpu7.h index 0cf2dbf4bfd..26f67a11fc1 100644 --- a/src/mame/machine/decocpu7.h +++ b/src/mame/machine/decocpu7.h @@ -14,7 +14,7 @@ protected: bool had_written; virtual ~mi_decrypt() {} - virtual UINT8 read_decrypted(UINT16 adr); + virtual UINT8 read_sync(UINT16 adr); virtual void write(UINT16 adr, UINT8 val); }; diff --git a/src/mame/machine/fd1089.c b/src/mame/machine/fd1089.c index c9cea731f83..c273c4949b4 100644 --- a/src/mame/machine/fd1089.c +++ b/src/mame/machine/fd1089.c @@ -208,6 +208,9 @@ const fd1089_base_device::decrypt_parameters fd1089_base_device::s_data_params_a { 0xac, 1,6,3,5,0,7,4,2 }, }; +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 16, fd1094_device ) + AM_RANGE(0x00000, 0xfffff) AM_ROM AM_SHARE(":fd1089_decrypted_opcodes") +ADDRESS_MAP_END //************************************************************************** @@ -219,10 +222,14 @@ const fd1089_base_device::decrypt_parameters fd1089_base_device::s_data_params_a //------------------------------------------------- fd1089_base_device::fd1089_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) - : m68000_device(mconfig, tag, owner, clock, shortname, source) + : m68000_device(mconfig, tag, owner, clock, shortname, source), + m_decrypted_opcodes(*this, ":fd1089_decrypted_opcodes") { // override the name after the m68000 initializes m_name.assign(name); + + // add the decrypted opcodes map + m_address_map[AS_DECRYPTED_OPCODES] = ADDRESS_MAP_NAME(decrypted_opcodes_map); } fd1089a_device::fd1089a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) @@ -257,18 +264,12 @@ void fd1089_base_device::device_start() // determine length and resize our internal buffers UINT32 romsize = region()->bytes(); m_plaintext.resize(romsize/2); - m_decrypted_opcodes.resize(romsize/2); // copy the plaintext memcpy(&m_plaintext[0], rombase, romsize); // decrypt it, overwriting original data with the decrypted data decrypt(0x000000, romsize, &m_plaintext[0], &m_decrypted_opcodes[0], rombase); - - // mark the ROM region as decrypted, pointing to the opcodes (if it is mapped) - address_space &program = space(AS_PROGRAM); - if (program.get_read_ptr(0) != NULL) - program.set_decrypted_region(0x000000, romsize - 1, &m_decrypted_opcodes[0]); } diff --git a/src/mame/machine/fd1089.h b/src/mame/machine/fd1089.h index 0e66d1e2bdc..e8e106b5136 100644 --- a/src/mame/machine/fd1089.h +++ b/src/mame/machine/fd1089.h @@ -57,7 +57,7 @@ protected: // internal state const UINT8 * m_key; std::vector<UINT16> m_plaintext; - std::vector<UINT16> m_decrypted_opcodes; + required_shared_ptr<UINT16> m_decrypted_opcodes; // internal types struct decrypt_parameters diff --git a/src/mame/machine/fd1094.c b/src/mame/machine/fd1094.c index 32c369ef221..7391ae4c006 100644 --- a/src/mame/machine/fd1094.c +++ b/src/mame/machine/fd1094.c @@ -35,8 +35,8 @@ if bit 13 of the current value is 1; the fourth one is executed whenever one of the first three has been executed; the fifth one is always executed. Every step can be thought as consisting of a serie of operations, with some steps - avoiding some of them: a uncondicional bitswap, some conditional XORs, - a unconditional XOR and some condicional bitswaps. + avoiding some of them: a unconditional bitswap, some conditional XORs, + a unconditional XOR and some conditional bitswaps. In the end, the decryption of a value at a given address is controlled by 32 boolean variables; 8 of them change at every address (repeating after 0x2000 @@ -472,6 +472,9 @@ const UINT16 fd1094_device::s_masked_opcodes[] = 0xde3a,0xde7a,0xdeba,0xdefa, 0xdffa }; +static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 16, fd1094_device ) + AM_RANGE(0x00000, 0xfffff) AM_ROMBANK(":fd1094_decrypted_opcodes") +ADDRESS_MAP_END //************************************************************************** @@ -534,7 +537,8 @@ UINT16 *fd1094_decryption_cache::decrypted_opcodes(UINT8 state) return &m_decrypted_opcodes[state][0]; // otherwise, allocate and decrypt - m_decrypted_opcodes[state].resize(m_size); + m_decrypted_opcodes[state].resize(0x100000/2); + memset(&m_decrypted_opcodes[state][0], 0, 0x100000); m_fd1094.decrypt(m_baseaddress, m_size, m_rgnoffset, &m_decrypted_opcodes[state][0], state); return &m_decrypted_opcodes[state][0]; } @@ -552,6 +556,7 @@ UINT16 *fd1094_decryption_cache::decrypted_opcodes(UINT8 state) fd1094_device::fd1094_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : m68000_device(mconfig, tag, owner, clock, "fd1094", __FILE__), + m_decrypted_opcodes_bank(*this, ":fd1094_decrypted_opcodes"), m_state(0x00), m_irqmode(false), m_cache(*this), @@ -562,6 +567,9 @@ fd1094_device::fd1094_device(const machine_config &mconfig, const char *tag, dev // override the name after the m68000 initializes m_name.assign("FD1094"); + // add the decrypted opcodes map + m_address_map[AS_DECRYPTED_OPCODES] = ADDRESS_MAP_NAME(decrypted_opcodes_map); + // create the initial masked opcode table memset(m_masked_opcodes_lookup, 0, sizeof(m_masked_opcodes_lookup)); for (int index = 0; index < ARRAY_LENGTH(s_masked_opcodes); index++) @@ -575,6 +583,8 @@ fd1094_device::fd1094_device(const machine_config &mconfig, const char *tag, dev for (int opcode = 0; opcode < 65536; opcode += 2) if ((opcode & 0xff80) == 0x4e80 || (opcode & 0xf0f8) == 0x50c8 || (opcode & 0xf000) == 0x6000) m_masked_opcodes_lookup[1][opcode >> 4] |= 1 << ((opcode >> 1) & 7); + + m_state_change = state_change_delegate(FUNC(fd1094_device::default_state_change), this); } @@ -625,9 +635,6 @@ void fd1094_device::change_state(int newstate) void fd1094_device::device_start() { - // start the base device - m68000_device::device_start(); - // find the key m_key = memregion("key")->base(); if (m_key == NULL) @@ -655,13 +662,12 @@ void fd1094_device::device_start() if (m_srcbase == NULL) throw emu_fatalerror("FD1094 found no data to decrypt!"); - // if address 0 is mapped to ROM, assume this is a state memory mapping and - // use the internal state change callback - if (space(AS_PROGRAM).get_read_ptr(0) != NULL) - m_state_change = state_change_delegate(FUNC(fd1094_device::default_state_change), this); - // determine length and configure our cache m_cache.configure(0x000000, m_srcbytes, 0x000000); + change_state(STATE_RESET); + + // start the base device + m68000_device::device_start(); // register for the state changing callbacks we need in the m68000 set_cmpild_callback(write32_delegate(FUNC(fd1094_device::cmp_callback),this)); @@ -683,7 +689,7 @@ void fd1094_device::device_reset() // flush the cache and switch to the reset state m_cache.reset(); change_state(STATE_RESET); - + fprintf(stderr, "reset done\n"); // reset the parent m68000_device::device_reset(); } @@ -913,7 +919,7 @@ void fd1094_device::decrypt(offs_t baseaddr, UINT32 size, const UINT16 *srcptr, void fd1094_device::default_state_change(UINT8 state) { - space(AS_PROGRAM).set_decrypted_region(0x000000, m_srcbytes - 1, m_cache.decrypted_opcodes(state)); + m_decrypted_opcodes_bank->set_base(m_cache.decrypted_opcodes(state)); } diff --git a/src/mame/machine/fd1094.h b/src/mame/machine/fd1094.h index 3439a4c288c..db5eb5cb83e 100644 --- a/src/mame/machine/fd1094.h +++ b/src/mame/machine/fd1094.h @@ -88,6 +88,8 @@ public: }; protected: + required_memory_bank m_decrypted_opcodes_bank; + // device overrides virtual void device_start(); virtual void device_reset(); diff --git a/src/mame/machine/fddebug.c b/src/mame/machine/fddebug.c index 9abaec03ef2..0a78590cb5c 100644 --- a/src/mame/machine/fddebug.c +++ b/src/mame/machine/fddebug.c @@ -442,7 +442,7 @@ INLINE int pc_is_valid(address_space &space, UINT32 pc, UINT32 flags) return 0; if (pc & 0xff000000) return 0; - if (space.direct().read_decrypted_ptr(pc) == NULL) + if (space.direct().read_ptr(pc) == NULL) return 0; return 1; } diff --git a/src/mame/machine/kabuki.c b/src/mame/machine/kabuki.c index 038c1f5f422..4be230bc609 100644 --- a/src/mame/machine/kabuki.c +++ b/src/mame/machine/kabuki.c @@ -160,58 +160,37 @@ static void kabuki_decode(UINT8 *src,UINT8 *dest_op,UINT8 *dest_data, -static void mitchell_decode(running_machine &machine, int swap_key1,int swap_key2,int addr_key,int xor_key) +static void mitchell_decode(UINT8 *src, UINT8 *dst, int size, int swap_key1,int swap_key2,int addr_key,int xor_key) { - address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM); - UINT8 *rom = machine.root_device().memregion("maincpu")->base(); - UINT8 *decrypt = auto_alloc_array(machine, UINT8, machine.root_device().memregion("maincpu")->bytes()); - int numbanks = (machine.root_device().memregion("maincpu")->bytes() - 0x10000) / 0x4000; - int i; - - space.set_decrypted_region(0x0000, 0x7fff, decrypt); - kabuki_decode(rom,decrypt,rom,0x0000,0x8000, swap_key1,swap_key2,addr_key,xor_key); - - rom += 0x10000; - decrypt += 0x10000; - for (i = 0; i < numbanks; i++) - kabuki_decode(rom+i*0x4000,decrypt+i*0x4000,rom+i*0x4000,0x8000,0x4000, swap_key1,swap_key2,addr_key,xor_key); - - machine.root_device().membank("bank1")->configure_decrypted_entries(0, numbanks, decrypt, 0x4000); -/* - { - FILE *f; - f = fopen("a","wb"); - fwrite(rom,1,0x8000,f); - fwrite(rom+0x10000,1,0x40000,f); - fclose(f); - } -*/ + int numbanks = (size - 0x10000) / 0x4000; + + kabuki_decode(src,dst,src,0x0000,0x8000, swap_key1,swap_key2,addr_key,xor_key); + + src += 0x10000; + dst += 0x10000; + for (int i = 0; i < numbanks; i++) + kabuki_decode(src+i*0x4000,dst+i*0x4000,src+i*0x4000,0x8000,0x4000, swap_key1,swap_key2,addr_key,xor_key); } -void mgakuen2_decode(running_machine &machine) { mitchell_decode(machine,0x76543210,0x01234567,0xaa55,0xa5); } -void pang_decode(running_machine &machine) { mitchell_decode(machine,0x01234567,0x76543210,0x6548,0x24); } -void cworld_decode(running_machine &machine) { mitchell_decode(machine,0x04152637,0x40516273,0x5751,0x43); } -void hatena_decode(running_machine &machine) { mitchell_decode(machine,0x45670123,0x45670123,0x5751,0x43); } -void spang_decode(running_machine &machine) { mitchell_decode(machine,0x45670123,0x45670123,0x5852,0x43); } -void spangj_decode(running_machine &machine) { mitchell_decode(machine,0x45123670,0x67012345,0x55aa,0x5a); } -void sbbros_decode(running_machine &machine) { mitchell_decode(machine,0x45670123,0x45670123,0x2130,0x12); } -void marukin_decode(running_machine &machine) { mitchell_decode(machine,0x54321076,0x54321076,0x4854,0x4f); } -void qtono1_decode(running_machine &machine) { mitchell_decode(machine,0x12345670,0x12345670,0x1111,0x11); } -void qsangoku_decode(running_machine &machine) { mitchell_decode(machine,0x23456701,0x23456701,0x1828,0x18); } -void block_decode(running_machine &machine) { mitchell_decode(machine,0x02461357,0x64207531,0x0002,0x01); } +void mgakuen2_decode(UINT8 *src, UINT8 *dst, int size) { mitchell_decode(src,dst,size,0x76543210,0x01234567,0xaa55,0xa5); } +void pang_decode(UINT8 *src, UINT8 *dst, int size) { mitchell_decode(src,dst,size,0x01234567,0x76543210,0x6548,0x24); } +void cworld_decode(UINT8 *src, UINT8 *dst, int size) { mitchell_decode(src,dst,size,0x04152637,0x40516273,0x5751,0x43); } +void hatena_decode(UINT8 *src, UINT8 *dst, int size) { mitchell_decode(src,dst,size,0x45670123,0x45670123,0x5751,0x43); } +void spang_decode(UINT8 *src, UINT8 *dst, int size) { mitchell_decode(src,dst,size,0x45670123,0x45670123,0x5852,0x43); } +void spangj_decode(UINT8 *src, UINT8 *dst, int size) { mitchell_decode(src,dst,size,0x45123670,0x67012345,0x55aa,0x5a); } +void sbbros_decode(UINT8 *src, UINT8 *dst, int size) { mitchell_decode(src,dst,size,0x45670123,0x45670123,0x2130,0x12); } +void marukin_decode(UINT8 *src, UINT8 *dst, int size) { mitchell_decode(src,dst,size,0x54321076,0x54321076,0x4854,0x4f); } +void qtono1_decode(UINT8 *src, UINT8 *dst, int size) { mitchell_decode(src,dst,size,0x12345670,0x12345670,0x1111,0x11); } +void qsangoku_decode(UINT8 *src, UINT8 *dst, int size) { mitchell_decode(src,dst,size,0x23456701,0x23456701,0x1828,0x18); } +void block_decode(UINT8 *src, UINT8 *dst, int size) { mitchell_decode(src,dst,size,0x02461357,0x64207531,0x0002,0x01); } -static void cps1_decode(running_machine &machine,int swap_key1,int swap_key2,int addr_key,int xor_key) +static void cps1_decode(UINT8 *src, UINT8 *dst,int swap_key1,int swap_key2,int addr_key,int xor_key) { - address_space &space = machine.device("audiocpu")->memory().space(AS_PROGRAM); - UINT8 *decrypt = auto_alloc_array(machine, UINT8, 0x8000); - UINT8 *rom = machine.root_device().memregion("audiocpu")->base(); - - space.set_decrypted_region(0x0000, 0x7fff, decrypt); - kabuki_decode(rom,decrypt,rom,0x0000,0x8000, swap_key1,swap_key2,addr_key,xor_key); + kabuki_decode(src,dst,src,0x0000,0x8000, swap_key1,swap_key2,addr_key,xor_key); } -void wof_decode(running_machine &machine) { cps1_decode(machine,0x01234567,0x54163072,0x5151,0x51); } -void dino_decode(running_machine &machine) { cps1_decode(machine,0x76543210,0x24601357,0x4343,0x43); } -void punisher_decode(running_machine &machine) { cps1_decode(machine,0x67452103,0x75316024,0x2222,0x22); } -void slammast_decode(running_machine &machine) { cps1_decode(machine,0x54321076,0x65432107,0x3131,0x19); } +void wof_decode(UINT8 *src, UINT8 *dst) { cps1_decode(src,dst,0x01234567,0x54163072,0x5151,0x51); } +void dino_decode(UINT8 *src, UINT8 *dst) { cps1_decode(src,dst,0x76543210,0x24601357,0x4343,0x43); } +void punisher_decode(UINT8 *src, UINT8 *dst) { cps1_decode(src,dst,0x67452103,0x75316024,0x2222,0x22); } +void slammast_decode(UINT8 *src, UINT8 *dst) { cps1_decode(src,dst,0x54321076,0x65432107,0x3131,0x19); } diff --git a/src/mame/machine/kabuki.h b/src/mame/machine/kabuki.h index e5e1b9bfc76..1b9165bea07 100644 --- a/src/mame/machine/kabuki.h +++ b/src/mame/machine/kabuki.h @@ -2,18 +2,18 @@ // copyright-holders:Nicola Salmoria #include "emu.h" -void mgakuen2_decode(running_machine &machine); -void pang_decode(running_machine &machine); -void cworld_decode(running_machine &machine); -void hatena_decode(running_machine &machine); -void spang_decode(running_machine &machine); -void spangj_decode(running_machine &machine); -void sbbros_decode(running_machine &machine); -void marukin_decode(running_machine &machine); -void qtono1_decode(running_machine &machine); -void qsangoku_decode(running_machine &machine); -void block_decode(running_machine &machine); -void wof_decode(running_machine &machine); -void dino_decode(running_machine &machine); -void punisher_decode(running_machine &machine); -void slammast_decode(running_machine &machine); +void mgakuen2_decode(UINT8 *src, UINT8 *dst, int size); +void pang_decode(UINT8 *src, UINT8 *dst, int size); +void cworld_decode(UINT8 *src, UINT8 *dst, int size); +void hatena_decode(UINT8 *src, UINT8 *dst, int size); +void spang_decode(UINT8 *src, UINT8 *dst, int size); +void spangj_decode(UINT8 *src, UINT8 *dst, int size); +void sbbros_decode(UINT8 *src, UINT8 *dst, int size); +void marukin_decode(UINT8 *src, UINT8 *dst, int size); +void qtono1_decode(UINT8 *src, UINT8 *dst, int size); +void qsangoku_decode(UINT8 *src, UINT8 *dst, int size); +void block_decode(UINT8 *src, UINT8 *dst, int size); +void wof_decode(UINT8 *src, UINT8 *dst); +void dino_decode(UINT8 *src, UINT8 *dst); +void punisher_decode(UINT8 *src, UINT8 *dst); +void slammast_decode(UINT8 *src, UINT8 *dst); diff --git a/src/mame/machine/konami1.c b/src/mame/machine/konami1.c index 75d4a2b01b4..c0240bcbc78 100644 --- a/src/mame/machine/konami1.c +++ b/src/mame/machine/konami1.c @@ -1,60 +1,50 @@ // license:BSD-3-Clause -// copyright-holders:Nicola Salmoria, Chris Hardy +// copyright-holders:Olivier Galibert /*************************************************************************** - The Konami_1 CPU is a 6809 with opcodes scrambled. Here is how to - descramble them. + The Konami_1 CPU is a 6809 with opcodes scrambled. ***************************************************************************/ #include "emu.h" #include "konami1.h" +const device_type KONAMI1 = &device_creator<konami1_device>; -static UINT8 konami1_decodebyte( UINT8 opcode, UINT16 address ) +konami1_device::konami1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : m6809_base_device(mconfig, "KONAMI-1", tag, owner, clock, KONAMI1, 1, "konami1", __FILE__) { -/* -> -> CPU_D7 = (EPROM_D7 & ~ADDRESS_1) | (~EPROM_D7 & ADDRESS_1) > -> CPU_D6 = EPROM_D6 -> -> CPU_D5 = (EPROM_D5 & ADDRESS_1) | (~EPROM_D5 & ~ADDRESS_1) > -> CPU_D4 = EPROM_D4 -> -> CPU_D3 = (EPROM_D3 & ~ADDRESS_3) | (~EPROM_D3 & ADDRESS_3) > -> CPU_D2 = EPROM_D2 -> -> CPU_D1 = (EPROM_D1 & ADDRESS_3) | (~EPROM_D1 & ~ADDRESS_3) > -> CPU_D0 = EPROM_D0 -> -*/ - UINT8 xormask; - - - xormask = 0; - if (address & 0x02) xormask |= 0x80; - else xormask |= 0x20; - if (address & 0x08) xormask |= 0x08; - else xormask |= 0x02; - - return opcode ^ xormask; + m_boundary = 0x0000; } +void konami1_device::device_start() +{ + m_mintf = new mi_konami1(m_boundary); + m6809_base_device::device_start(); +} - -UINT8 *konami1_decode(running_machine &machine, const char *cpu) +void konami1_device::set_encryption_boundary(UINT16 adr) { - address_space &space = machine.device(cpu)->memory().space(AS_PROGRAM); - const UINT8 *rom = machine.root_device().memregion(cpu)->base(); - int size = machine.root_device().memregion(cpu)->bytes(); - int A; + m_boundary = adr; + if(m_mintf) + static_cast<mi_konami1 *>(m_mintf)->m_boundary = adr; +} - UINT8 *decrypted = auto_alloc_array(machine, UINT8, size); - space.set_decrypted_region(0x0000, 0xffff, decrypted); +konami1_device::mi_konami1::mi_konami1(UINT16 adr) +{ + m_boundary = adr; +} - for (A = 0;A < size;A++) - { - decrypted[A] = konami1_decodebyte(rom[A],A); +UINT8 konami1_device::mi_konami1::read_opcode(UINT16 adr) +{ + UINT8 val = m_sdirect->read_byte(adr); + if(adr < m_boundary) + return val; + switch(adr & 0xa) { + default: + case 0x0: return val ^ 0x22; + case 0x2: return val ^ 0x82; + case 0x8: return val ^ 0x28; + case 0xa: return val ^ 0x88; } - return decrypted; } diff --git a/src/mame/machine/konami1.h b/src/mame/machine/konami1.h index 00697959658..1efadd4eee4 100644 --- a/src/mame/machine/konami1.h +++ b/src/mame/machine/konami1.h @@ -1,3 +1,26 @@ // license:BSD-3-Clause -// copyright-holders:Nicola Salmoria, Chris Hardy -UINT8 *konami1_decode(running_machine &machine, const char *cpu); +// copyright-holders:Olivier Galibert + +#include "cpu/m6809/m6809.h" + +class konami1_device : public m6809_base_device { +public: + konami1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + void set_encryption_boundary(UINT16 adr); + +protected: + class mi_konami1 : public mi_default { + public: + UINT16 m_boundary; + mi_konami1(UINT16 boundary); + virtual ~mi_konami1() {} + virtual UINT8 read_opcode(UINT16 adr); + }; + + UINT16 m_boundary; + + virtual void device_start(); +}; + +extern const device_type KONAMI1; diff --git a/src/mame/machine/mc8123.c b/src/mame/machine/mc8123.c index a82c841347d..a6327cf0895 100644 --- a/src/mame/machine/mc8123.c +++ b/src/mame/machine/mc8123.c @@ -377,46 +377,17 @@ static UINT8 mc8123_decrypt(offs_t addr,UINT8 val,const UINT8 *key,int opcode) return decrypt(val,key[tbl_num + (opcode ? 0 : 0x1000)],opcode); } - -void mc8123_decrypt_rom(running_machine &machine, const char *cpu, const char *keyrgn, const char *bankname, int numbanks) +void mc8123_decode(UINT8 *rom, UINT8 *opcodes, const UINT8 *key, int length) { - address_space &space = machine.device(cpu)->memory().space(AS_PROGRAM); - int fixed_length = numbanks == 1 ? 0xc000 : 0x8000; - UINT8 *decrypted1 = auto_alloc_array(machine, UINT8, fixed_length); - UINT8 *decrypted2 = numbanks > 1 ? auto_alloc_array(machine, UINT8, 0x4000 * numbanks) : 0; - UINT8 *rom = machine.root_device().memregion(cpu)->base(); - UINT8 *key = machine.root_device().memregion(keyrgn)->base(); - int A, bank; - - space.set_decrypted_region(0x0000, fixed_length-1, decrypted1); - - for (A = 0x0000;A < fixed_length;A++) + for (int A = 0x0000;A < length;A++) { + int adr = A >= 0xc000 ? (A & 0x3fff) | 0x8000 : A; UINT8 src = rom[A]; /* decode the opcodes */ - decrypted1[A] = mc8123_decrypt(A,src,key,1); + opcodes[A] = mc8123_decrypt(adr,src,key,1); /* decode the data */ - rom[A] = mc8123_decrypt(A,src,key,0); - } - - if (bankname != NULL) - { - machine.root_device().membank(bankname)->configure_decrypted_entries(0, numbanks, decrypted2, 0x4000); - - for (bank = 0; bank < numbanks; ++bank) - { - for (A = 0x8000;A < 0xc000;A++) - { - UINT8 src = rom[0x8000 + 0x4000*bank + A]; - - /* decode the opcodes */ - decrypted2[0x4000 * bank + (A-0x8000)] = mc8123_decrypt(A,src,key,1); - - /* decode the data */ - rom[0x8000 + 0x4000*bank + A] = mc8123_decrypt(A,src,key,0); - } - } + rom[A] = mc8123_decrypt(adr,src,key,0); } } diff --git a/src/mame/machine/mc8123.h b/src/mame/machine/mc8123.h index 02caa2cbe0f..6887b4f644c 100644 --- a/src/mame/machine/mc8123.h +++ b/src/mame/machine/mc8123.h @@ -8,6 +8,6 @@ // this function assumes a fixed portion of ROM at 0000-7FFF, and // an arbitrary amount of banks at 8000-BFFF. -// numbanks may be 0, meaning there is no ROM to decrypt at 8000-BFFF, -// or 1, meaning 0000-BFFF will be decrypted as a single unit. -void mc8123_decrypt_rom(running_machine &machine, const char *cpu, const char *keyrgn, const char *bankname, int numbanks); + +void mc8123_decode(UINT8 *rom, UINT8 *opcodes, const UINT8 *key, int length); + diff --git a/src/mame/machine/scramble.c b/src/mame/machine/scramble.c index e51701679ab..eeea8613ee1 100644 --- a/src/mame/machine/scramble.c +++ b/src/mame/machine/scramble.c @@ -624,7 +624,7 @@ WRITE8_MEMBER(scramble_state::harem_decrypt_clk_w) } membank("rombank")->set_base (m_harem_decrypted_data + 0x2000 * bank); - membank("rombank")->set_base_decrypted (m_harem_decrypted_opcodes + 0x2000 * bank); + membank("rombank_decrypted")->set_base (m_harem_decrypted_opcodes + 0x2000 * bank); // logerror("%s: decrypt mode = %02x (bank %x) active\n", machine().describe_context(), m_harem_decrypt_mode, bank); @@ -674,5 +674,5 @@ DRIVER_INIT_MEMBER(scramble_state,harem) } membank("rombank")->set_base (m_harem_decrypted_data); - membank("rombank")->set_base_decrypted (m_harem_decrypted_opcodes); + membank("rombank_decrypted")->set_base (m_harem_decrypted_opcodes); } diff --git a/src/mame/machine/segacrp2.c b/src/mame/machine/segacrp2.c index e0d128363ad..b5cff3a5d0e 100644 --- a/src/mame/machine/segacrp2.c +++ b/src/mame/machine/segacrp2.c @@ -47,10 +47,9 @@ #include "segacrp2.h" -static void sega_decode_2(running_machine &machine,const char *cputag, - const UINT8 xor_table[128],const int swap_table[128]) +void sega_decode_2(UINT8 *rom, UINT8 *decrypted, + const UINT8 xor_table[128],const int swap_table[128]) { - int A; static const UINT8 swaptable[24][4] = { { 6,4,2,0 }, { 4,6,2,0 }, { 2,4,6,0 }, { 0,4,2,6 }, @@ -62,14 +61,7 @@ static void sega_decode_2(running_machine &machine,const char *cputag, }; - address_space &space = machine.device(cputag)->memory().space(AS_PROGRAM); - UINT8 *rom = machine.root_device().memregion(cputag)->base(); - UINT8 *decrypted = auto_alloc_array(machine, UINT8, 0x8000); - - space.set_decrypted_region(0x0000, 0x7fff, decrypted); - - - for (A = 0x0000;A < 0x8000;A++) + for (int A = 0x0000;A < 0x8000;A++) { int row; UINT8 src; @@ -93,187 +85,6 @@ static void sega_decode_2(running_machine &machine,const char *cputag, } - -void sega_315_5162_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 xor_table[128] = - { - 0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, - 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, - 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, - 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, - 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, - 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, - 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, - 0x00,0x40,0x10,0x50,0x04,0x44,0x14,0x54,0x01,0x41,0x11,0x51,0x05,0x45,0x15,0x55, - 0x00, - }; - - static const int swap_table[128] = - { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 12, - }; - - - sega_decode_2(machine,cputag,xor_table,swap_table); -} - - -void sega_315_5177_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 xor_table[128] = - { - 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, - 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, - 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, - 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, - 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, - 0x05,0x55,0x50,0x14, - - 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, - 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, - 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, - 0x05,0x55,0x50,0x14,0x41,0x45,0x00,0x50,0x54,0x11,0x45,0x40, - 0x04,0x54,0x51,0x15,0x40,0x44,0x01,0x51,0x55,0x10,0x44,0x41, - 0x05,0x55,0x50,0x14, - }; - - static const int swap_table[128] = - { - 0,0,0,0, - 1,1,1,1,1, - 2,2,2,2,2, - 3,3,3,3, - 4,4,4,4,4, - 5,5,5,5,5, - 6,6,6,6,6, - 7,7,7,7,7, - 8,8,8,8, - 9,9,9,9,9, - 10,10,10,10,10, - 11,11,11,11,11, - 12,12,12,12,12, - 13,13, - - 8,8,8,8, - 9,9,9,9,9, - 10,10,10,10,10, - 11,11,11,11, - 12,12,12,12,12, - 13,13,13,13,13, - 14,14,14,14,14, - 15,15,15,15,15, - 16,16,16,16, - 17,17,17,17,17, - 18,18,18,18,18, - 19,19,19,19,19, - 20,20,20,20,20, - 21,21, - }; - - - sega_decode_2(machine,cputag,xor_table,swap_table); -} - - -void sega_315_5178_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 xor_table[128] = - { - 0x00,0x55,0x45,0x05,0x11,0x41,0x01,0x14,0x44,0x50,0x10, - 0x00,0x55,0x15,0x05,0x51,0x41,0x01,0x14,0x44,0x04,0x10, - 0x40,0x55,0x15,0x05,0x51,0x11, - 0x01,0x54,0x44,0x04,0x10,0x40,0x00,0x15,0x45,0x51,0x11, - 0x01,0x54,0x14,0x04,0x50,0x40,0x00,0x15,0x45,0x05,0x11, - 0x41,0x54,0x14,0x04,0x50,0x10, - 0x00,0x55,0x45,0x05,0x11,0x41,0x01,0x14, - - 0x00,0x55,0x45,0x05,0x11,0x41,0x01,0x14,0x44,0x50,0x10, - 0x00,0x55,0x15,0x05,0x51,0x41,0x01,0x14,0x44,0x04,0x10, - 0x40,0x55,0x15,0x05,0x51,0x11, - 0x01,0x54,0x44,0x04,0x10,0x40,0x00,0x15,0x45,0x51,0x11, - 0x01,0x54,0x14,0x04,0x50,0x40,0x00,0x15,0x45,0x05,0x11, - 0x41,0x54,0x14,0x04,0x50,0x10, - 0x00,0x55,0x45,0x05,0x11,0x41,0x01,0x14, - }; - - static const int swap_table[128] = - { - 2, - 3, 5, 7, 1, 3, 5, 7, 1, 3, 5, 7, - 0, 2, 4, 6, 0, 2, 4, 6, 0, 2, 4, - 5, 7, 1, 3, 5, 7, 1, 3, 5, 7, 1, 3, - 4, 6, 0, 2, 4, 6, 0, 2, 4, 6, - 8, - 1, 3, 5, 7, 1, 3, 5, 7, 1, 3, 5, - 6, 0, 2, 4, 6, 0, 2, - - 10, - 11,13,15, 9,11,13,15, 9,11,13,15, - 8,10,12,14, 8,10,12,14, 8,10,12, - 13,15, 9,11,13,15, 9,11,13,15, 9,11, - 12,14, 8,10,12,14, 8,10,12,14, - 16, - 9,11,13,15, 9,11,13,15, 9,11,13, - 14, 8,10,12,14, 8,10, - }; - - - sega_decode_2(machine,cputag,xor_table,swap_table); -} - - -void sega_315_5179_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 xor_table[128] = - { - 0x00,0x45,0x41,0x14,0x10,0x55,0x51,0x01,0x04,0x40,0x45,0x11,0x14,0x50, - 0x00,0x05,0x41,0x44,0x10,0x15,0x51,0x54,0x04, - 0x00,0x45,0x41,0x14,0x10,0x55,0x05,0x01,0x44,0x40,0x15,0x11,0x54,0x50, - 0x00,0x05,0x41,0x44,0x10,0x15,0x51,0x01,0x04, - 0x40,0x45,0x11,0x14,0x50,0x55,0x05,0x01,0x44,0x40,0x15,0x11,0x54,0x04, - 0x00,0x45,0x41,0x14,0x50, - 0x00,0x05,0x41,0x44,0x10,0x15,0x51,0x54,0x04, - 0x00,0x45,0x41,0x14,0x50,0x55,0x05,0x01,0x44,0x40,0x15,0x11,0x54,0x50, - 0x00,0x05,0x41,0x44,0x10,0x55,0x51,0x01,0x04, - 0x40,0x45,0x11,0x14,0x50,0x55,0x05,0x01,0x44,0x40,0x15,0x51,0x54,0x04, - 0x00,0x45,0x41,0x14,0x10,0x55,0x51,0x01,0x04, - 0x40,0x45,0x11,0x54,0x50,0x00,0x05,0x41, - }; - - static const int swap_table[128] = - { - 8, 9,11,13,15, 0, 2, 4, 6, - 8, 9,11,13,15, 1, 2, 4, 6, - 8, 9,11,13,15, 1, 2, 4, 6, - 8, 9,11,13,15, 1, 2, 4, 6, - 8,10,11,13,15, 1, 2, 4, 6, - 8,10,11,13,15, 1, 2, 4, 6, - 8,10,11,13,15, 1, 3, 4, 6, - 8, - 7, 1, 2, 4, 6, 0, 1, 3, 5, - 7, 1, 2, 4, 6, 0, 1, 3, 5, - 7, 1, 2, 4, 6, 0, 2, 3, 5, - 7, 1, 2, 4, 6, 0, 2, 3, 5, - 7, 1, 2, 4, 6, 0, 2, 3, 5, - 7, 1, 3, 4, 6, 0, 2, 3, 5, - 7, 1, 3, 4, 6, 0, 2, 4, 5, - 7, - }; - - - sega_decode_2(machine,cputag,xor_table,swap_table); -} - - /****************************************************************************** These games (all 317-000x CPUs) use the same algorithm, but the key doesn't @@ -281,7 +92,7 @@ void sega_315_5179_decode(running_machine &machine, const char *cputag) ******************************************************************************/ -static void sega_decode_317(running_machine &machine, const char *cputag, int shift) +void sega_decode_317(UINT8 *rom, UINT8 *decrypted, int shift) { static const UINT8 xor_table[128+3] = { @@ -309,10 +120,5 @@ static void sega_decode_317(running_machine &machine, const char *cputag, int sh 10,20, 1, }; - sega_decode_2( machine, cputag, xor_table + shift, swap_table + shift ); + sega_decode_2(rom, decrypted, xor_table + shift, swap_table + shift); } - -void sega_317_0004_decode(running_machine &machine, const char *cputag) { sega_decode_317( machine, cputag, 0 ); } -void sega_317_0005_decode(running_machine &machine, const char *cputag) { sega_decode_317( machine, cputag, 1 ); } -void sega_317_0006_decode(running_machine &machine, const char *cputag) { sega_decode_317( machine, cputag, 2 ); } -void sega_317_0007_decode(running_machine &machine, const char *cputag) { sega_decode_317( machine, cputag, 3 ); } diff --git a/src/mame/machine/segacrp2.h b/src/mame/machine/segacrp2.h index 36493c9edf0..a842ef8096b 100644 --- a/src/mame/machine/segacrp2.h +++ b/src/mame/machine/segacrp2.h @@ -1,10 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Nicola Salmoria -void sega_315_5162_decode(running_machine &machine, const char *cputag); -void sega_315_5177_decode(running_machine &machine, const char *cputag); -void sega_315_5178_decode(running_machine &machine, const char *cputag); -void sega_315_5179_decode(running_machine &machine, const char *cputag); -void sega_317_0004_decode(running_machine &machine, const char *cputag); -void sega_317_0005_decode(running_machine &machine, const char *cputag); -void sega_317_0006_decode(running_machine &machine, const char *cputag); -void sega_317_0007_decode(running_machine &machine, const char *cputag); + +void sega_decode_2(UINT8 *rom, UINT8 *decrypted, + const UINT8 xor_table[128],const int swap_table[128]); + +void sega_decode_317(UINT8 *rom, UINT8 *decrypted, int shift); diff --git a/src/mame/machine/segacrpt.c b/src/mame/machine/segacrpt.c index 48c152a7ed6..e577ac786c8 100644 --- a/src/mame/machine/segacrpt.c +++ b/src/mame/machine/segacrpt.c @@ -215,26 +215,21 @@ static void look_for_known_plaintext(void) } #endif -static void sega_decode(running_machine &machine, const char *cputag, const UINT8 convtable[32][4]) +void sega_decode(UINT8 *data, UINT8 *opcodes, int size, const UINT8 convtable[32][4], int bank_count, int bank_size) { - int A; - - address_space &space = machine.device(cputag)->memory().space(AS_PROGRAM); - int length = machine.root_device().memregion(cputag)->bytes(); - int cryptlen = MIN(length, 0x8000); - UINT8 *rom = machine.root_device().memregion(cputag)->base(); - UINT8 *decrypted = auto_alloc_array(machine, UINT8, 0xc000); - - space.set_decrypted_region(0x0000, cryptlen - 1, decrypted); - - for (A = 0x0000;A < cryptlen;A++) + for (int A = 0x0000;A < size + bank_count*bank_size;A++) { int xorval = 0; - UINT8 src = rom[A]; + UINT8 src = data[A]; + int adr; + if(A < size || !bank_count) + adr = A; + else + adr = size + ((A - size) % bank_size); /* pick the translation table from bits 0, 4, 8 and 12 of the address */ - int row = (A & 1) + (((A >> 4) & 1) << 1) + (((A >> 8) & 1) << 2) + (((A >> 12) & 1) << 3); + int row = (adr & 1) + (((adr >> 4) & 1) << 1) + (((adr >> 8) & 1) << 2) + (((adr >> 12) & 1) << 3); /* pick the offset in the table from bits 3 and 5 of the source data */ int col = ((src >> 3) & 1) + (((src >> 5) & 1) << 1); @@ -246,826 +241,14 @@ static void sega_decode(running_machine &machine, const char *cputag, const UINT } /* decode the opcodes */ - decrypted[A] = (src & ~0xa8) | (convtable[2*row][col] ^ xorval); + opcodes[A] = (src & ~0xa8) | (convtable[2*row][col] ^ xorval); /* decode the data */ - rom[A] = (src & ~0xa8) | (convtable[2*row+1][col] ^ xorval); + data[A] = (src & ~0xa8) | (convtable[2*row+1][col] ^ xorval); if (convtable[2*row][col] == 0xff) /* table incomplete! (for development) */ - decrypted[A] = 0xee; + opcodes[A] = 0xee; if (convtable[2*row+1][col] == 0xff) /* table incomplete! (for development) */ - rom[A] = 0xee; - } - - /* this is a kludge to catch anyone who has code that crosses the encrypted/ */ - /* decrypted boundary. ssanchan does it */ - if (length > 0x8000) - { - int bytes = MIN(length - 0x8000, 0x4000); - memcpy(&decrypted[0x8000], &rom[0x8000], bytes); - } -} - - - -void buckrog_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x80,0x00,0x88,0x08 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...0...0...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...0...0...1 */ - { 0x28,0xa8,0x08,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...1...0 */ - { 0x80,0x00,0x88,0x08 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...0...1...1 */ - { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...1...0...0 */ - { 0x80,0x00,0x88,0x08 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...0...1 */ - { 0x28,0xa8,0x08,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...1...1...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...1...1...1 */ - { 0x28,0xa8,0x08,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...0...0...0 */ - { 0x80,0x00,0x88,0x08 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...0...1 */ - { 0x80,0x00,0x88,0x08 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...1...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...1...1 */ - { 0x80,0x00,0x88,0x08 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...1...0...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...1 */ - { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...1...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0xa8,0xa0,0x88,0x80 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void pengo_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0xa0,0x80,0xa8,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...0...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...0...1 */ - { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...0...1...0 */ - { 0x08,0x28,0x88,0xa8 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...1 */ - { 0x08,0x00,0x88,0x80 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...1...0...0 */ - { 0xa0,0x80,0x20,0x00 }, { 0x08,0x00,0x88,0x80 }, /* ...0...1...0...1 */ - { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...1...1...0 */ - { 0xa0,0x80,0x20,0x00 }, { 0x00,0x08,0x20,0x28 }, /* ...0...1...1...1 */ - { 0x88,0x80,0x08,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...0...0 */ - { 0x88,0x80,0x08,0x00 }, { 0x00,0x08,0x20,0x28 }, /* ...1...0...0...1 */ - { 0x08,0x28,0x88,0xa8 }, { 0x08,0x28,0x88,0xa8 }, /* ...1...0...1...0 */ - { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...1...1 */ - { 0x08,0x00,0x88,0x80 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...0 */ - { 0x00,0x08,0x20,0x28 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...1 */ - { 0x08,0x28,0x88,0xa8 }, { 0x08,0x28,0x88,0xa8 }, /* ...1...1...1...0 */ - { 0x08,0x00,0x88,0x80 }, { 0xa0,0x80,0x20,0x00 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void szaxxon_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...0...0...0 */ - { 0x08,0x28,0x88,0xa8 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...1 */ - { 0xa8,0x28,0xa0,0x20 }, { 0x20,0xa0,0x00,0x80 }, /* ...0...0...1...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...0...1...1 */ - { 0x08,0x28,0x88,0xa8 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...0...1 */ - { 0xa8,0x28,0xa0,0x20 }, { 0x20,0xa0,0x00,0x80 }, /* ...0...1...1...0 */ - { 0x08,0x28,0x88,0xa8 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...1...1 */ - { 0x08,0x28,0x88,0xa8 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...0...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...0...1 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...1...0 */ - { 0xa8,0x28,0xa0,0x20 }, { 0x20,0xa0,0x00,0x80 }, /* ...1...0...1...1 */ - { 0xa8,0x28,0xa0,0x20 }, { 0x20,0xa0,0x00,0x80 }, /* ...1...1...0...0 */ - { 0xa8,0x28,0xa0,0x20 }, { 0x20,0xa0,0x00,0x80 }, /* ...1...1...0...1 */ - { 0x08,0x28,0x88,0xa8 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...1...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void suprloco_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...0...0 */ - { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...0...1 */ - { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...1...0 */ - { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...1 */ - { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...1...0...0 */ - { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...1...0...1 */ - { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...1...1...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...1...1 */ - { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...0...0...0 */ - { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...0...1 */ - { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...1...0 */ - { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...0...1...1 */ - { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...1...0...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...1 */ - { 0x20,0x00,0xa0,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...1...1...0 */ - { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0xa8,0x88 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void yamato_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...0 */ - { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...1 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...1...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x20,0xa0,0x28,0xa8 }, /* ...0...0...1...1 */ - { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x08,0x28 }, /* ...0...1...0...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...0...1 */ - { 0x20,0xa0,0x28,0xa8 }, { 0x20,0xa0,0x28,0xa8 }, /* ...0...1...1...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...1...1 */ - { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...0...0...0 */ - { 0x20,0xa0,0x28,0xa8 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...0...1 */ - { 0xa0,0x20,0x80,0x00 }, { 0x20,0xa0,0x28,0xa8 }, /* ...1...0...1...0 */ - { 0x28,0x20,0xa8,0xa0 }, { 0x20,0xa0,0x28,0xa8 }, /* ...1...0...1...1 */ - { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...1...0...0 */ - { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...1...0...1 */ - { 0xa0,0x20,0x80,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...1...1...1...0 */ - { 0x20,0xa0,0x28,0xa8 }, { 0x00,0x08,0x20,0x28 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - -void toprollr_decode(running_machine &machine, const char *cputag, const char *regiontag) -{ - /* same tables as in Yamato, but encrypted ROM is banked */ - UINT8 *decrypted; - - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...0 */ - { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...1 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...1...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x20,0xa0,0x28,0xa8 }, /* ...0...0...1...1 */ - { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x08,0x28 }, /* ...0...1...0...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...0...1 */ - { 0x20,0xa0,0x28,0xa8 }, { 0x20,0xa0,0x28,0xa8 }, /* ...0...1...1...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...1...1 */ - { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...0...0...0 */ - { 0x20,0xa0,0x28,0xa8 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...0...1 */ - { 0xa0,0x20,0x80,0x00 }, { 0x20,0xa0,0x28,0xa8 }, /* ...1...0...1...0 */ - { 0x28,0x20,0xa8,0xa0 }, { 0x20,0xa0,0x28,0xa8 }, /* ...1...0...1...1 */ - { 0x20,0xa0,0x28,0xa8 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...1...0...0 */ - { 0x88,0xa8,0x08,0x28 }, { 0x88,0xa8,0x08,0x28 }, /* ...1...1...0...1 */ - { 0xa0,0x20,0x80,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...1...1...1...0 */ - { 0x20,0xa0,0x28,0xa8 }, { 0x00,0x08,0x20,0x28 } /* ...1...1...1...1 */ - }; - - int A; - - address_space &space = machine.device(cputag)->memory().space(AS_PROGRAM); - UINT8 *rom = machine.root_device().memregion(regiontag)->base(); - int bankstart; - decrypted = auto_alloc_array(machine, UINT8, 0x6000*3); - - - for(bankstart=0;bankstart<0x6000*3;bankstart+=0x6000) - for (A = 0x0000;A < 0x6000;A++) - { - int xorval = 0; - - UINT8 src = rom[A+bankstart]; - - /* pick the translation table from bits 0, 4, 8 and 12 of the address */ - int row = (A & 1) + (((A >> 4) & 1) << 1) + (((A >> 8) & 1) << 2) + (((A >> 12) & 1) << 3); - - /* pick the offset in the table from bits 3 and 5 of the source data */ - int col = ((src >> 3) & 1) + (((src >> 5) & 1) << 1); - /* the bottom half of the translation table is the mirror image of the top */ - if (src & 0x80) - { - col = 3 - col; - xorval = 0xa8; - } - - /* decode the opcodes */ - decrypted[A+bankstart] = (src & ~0xa8) | (convtable[2*row][col] ^ xorval); - - /* decode the data */ - rom[A+bankstart] = (src & ~0xa8) | (convtable[2*row+1][col] ^ xorval); - } - - machine.root_device().membank("bank1")->configure_entries(0,3, machine.root_device().memregion(regiontag)->base(),0x6000); - machine.root_device().membank("bank1")->configure_decrypted_entries(0,3,decrypted,0x6000); - space.set_decrypted_region(0x0000, 0x5fff, decrypted); - space.machine().root_device().membank("bank1")->set_entry(0); -} - - -void sindbadm_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...0 */ - { 0xa8,0xa0,0x88,0x80 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...0...0...1 */ - { 0xa8,0xa0,0x88,0x80 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...0...1...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...1...1 */ - { 0xa8,0x88,0xa0,0x80 }, { 0xa0,0x20,0xa8,0x28 }, /* ...0...1...0...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...1 */ - { 0xa8,0xa0,0x88,0x80 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...1...1...0 */ - { 0xa8,0xa0,0x88,0x80 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...1...1...1 */ - { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...0...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...0...1 */ - { 0xa8,0xa0,0x88,0x80 }, { 0x00,0x20,0x80,0xa0 }, /* ...1...0...1...0 */ - { 0xa8,0xa0,0x88,0x80 }, { 0x00,0x20,0x80,0xa0 }, /* ...1...0...1...1 */ - { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...0 */ - { 0xa8,0x88,0xa0,0x80 }, { 0xa0,0x20,0xa8,0x28 }, /* ...1...1...0...1 */ - { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...1...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void regulus_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x28,0x08,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...0 */ - { 0x28,0x08,0xa8,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...0...1 */ - { 0x88,0x80,0x08,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...1...0 */ - { 0x88,0x08,0x80,0x00 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...1...1 */ - { 0x28,0x08,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...0 */ - { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...1 */ - { 0x88,0x08,0x80,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...0...1...1...0 */ - { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...1...1...1 */ - { 0x80,0xa0,0x00,0x20 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...0...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...0...1 */ - { 0x80,0xa0,0x00,0x20 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...0...1...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...0...1...1 */ - { 0xa0,0x80,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...1...0...0 */ - { 0x80,0xa0,0x00,0x20 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...1...0...1 */ - { 0xa0,0x80,0xa8,0x88 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...1...1...0 */ - { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void mrviking_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x28,0xa8,0x08,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...0 */ - { 0x88,0x08,0x80,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...1 */ - { 0x28,0x08,0xa8,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...1...0 */ - { 0x88,0x08,0x80,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...1...1 */ - { 0x28,0x08,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...0 */ - { 0x88,0x80,0x08,0x00 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...1...0...1 */ - { 0xa0,0x80,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...1...0 */ - { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...1...1...1 */ - { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...0...0 */ - { 0x88,0x08,0x80,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...0...1 */ - { 0xa0,0x80,0x20,0x00 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...1...0 */ - { 0xa0,0x80,0x20,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...1...0...1...1 */ - { 0x28,0x08,0xa8,0x88 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...0 */ - { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...1 */ - { 0xa0,0x80,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...1...1...0 */ - { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0xa8,0x88 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void swat_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x88,0x08,0x80,0x00 }, { 0xa0,0xa8,0x80,0x88 }, /* ...0...0...0...0 */ - { 0x88,0x08,0x80,0x00 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...1 */ - { 0xa0,0x80,0x20,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...1...0 */ - { 0xa0,0xa8,0x80,0x88 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...1...1 */ - { 0x28,0x20,0xa8,0xa0 }, { 0xa0,0xa8,0x80,0x88 }, /* ...0...1...0...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...0...1 */ - { 0xa0,0x80,0x20,0x00 }, { 0xa0,0xa8,0x80,0x88 }, /* ...0...1...1...0 */ - { 0x28,0x20,0xa8,0xa0 }, { 0xa0,0xa8,0x80,0x88 }, /* ...0...1...1...1 */ - { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...0...0 */ - { 0xa0,0x20,0x80,0x00 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...0...1 */ - { 0xa0,0x20,0x80,0x00 }, { 0xa0,0x20,0x80,0x00 }, /* ...1...0...1...0 */ - { 0xa0,0x20,0x80,0x00 }, { 0xa0,0x20,0x80,0x00 }, /* ...1...0...1...1 */ - { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...1...0...1 */ - { 0xa0,0xa8,0x80,0x88 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...1...0 */ - { 0x28,0x20,0xa8,0xa0 }, { 0xa0,0xa8,0x80,0x88 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void flicky_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x08,0x88,0x00,0x80 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...0...0 */ - { 0x80,0x00,0xa0,0x20 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...1 */ - { 0xa0,0x80,0xa8,0x88 }, { 0x28,0x08,0x20,0x00 }, /* ...0...0...1...0 */ - { 0x28,0x08,0x20,0x00 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...1 */ - { 0x08,0x88,0x00,0x80 }, { 0x80,0x00,0xa0,0x20 }, /* ...0...1...0...0 */ - { 0x80,0x00,0xa0,0x20 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...1 */ - { 0x28,0x08,0x20,0x00 }, { 0x28,0x08,0x20,0x00 }, /* ...0...1...1...0 */ - { 0x28,0x08,0x20,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...1...1 */ - { 0x08,0x88,0x00,0x80 }, { 0xa8,0x88,0x28,0x08 }, /* ...1...0...0...0 */ - { 0xa8,0x88,0x28,0x08 }, { 0x80,0x00,0xa0,0x20 }, /* ...1...0...0...1 */ - { 0x28,0x08,0x20,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...1...0 */ - { 0xa8,0x88,0x28,0x08 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...1...1 */ - { 0x08,0x88,0x00,0x80 }, { 0x80,0x00,0xa0,0x20 }, /* ...1...1...0...0 */ - { 0xa8,0x88,0x28,0x08 }, { 0x80,0x00,0xa0,0x20 }, /* ...1...1...0...1 */ - { 0x28,0x08,0x20,0x00 }, { 0x28,0x08,0x20,0x00 }, /* ...1...1...1...0 */ - { 0x08,0x88,0x00,0x80 }, { 0x88,0x80,0x08,0x00 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void futspy_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x28,0x08,0x20,0x00 }, { 0x28,0x08,0x20,0x00 }, /* ...0...0...0...0 */ - { 0x80,0x00,0xa0,0x20 }, { 0x08,0x88,0x00,0x80 }, /* ...0...0...0...1 */ - { 0x80,0x00,0xa0,0x20 }, { 0x08,0x88,0x00,0x80 }, /* ...0...0...1...0 */ - { 0xa0,0x80,0x20,0x00 }, { 0x20,0x28,0xa0,0xa8 }, /* ...0...0...1...1 */ - { 0x28,0x08,0x20,0x00 }, { 0x88,0x80,0xa8,0xa0 }, /* ...0...1...0...0 */ - { 0x80,0x00,0xa0,0x20 }, { 0x08,0x88,0x00,0x80 }, /* ...0...1...0...1 */ - { 0x80,0x00,0xa0,0x20 }, { 0x20,0x28,0xa0,0xa8 }, /* ...0...1...1...0 */ - { 0x20,0x28,0xa0,0xa8 }, { 0x08,0x88,0x00,0x80 }, /* ...0...1...1...1 */ - { 0x88,0x80,0xa8,0xa0 }, { 0x28,0x08,0x20,0x00 }, /* ...1...0...0...0 */ - { 0x80,0x00,0xa0,0x20 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...0...1 */ - { 0x20,0x28,0xa0,0xa8 }, { 0x08,0x88,0x00,0x80 }, /* ...1...0...1...0 */ - { 0x80,0x00,0xa0,0x20 }, { 0x20,0x28,0xa0,0xa8 }, /* ...1...0...1...1 */ - { 0x88,0x80,0xa8,0xa0 }, { 0x88,0x80,0xa8,0xa0 }, /* ...1...1...0...0 */ - { 0x80,0x00,0xa0,0x20 }, { 0x08,0x88,0x00,0x80 }, /* ...1...1...0...1 */ - { 0x80,0x00,0xa0,0x20 }, { 0x28,0x08,0x20,0x00 }, /* ...1...1...1...0 */ - { 0x20,0x28,0xa0,0xa8 }, { 0xa0,0x80,0x20,0x00 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void wmatch_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...0...0...0 */ - { 0x08,0x88,0x00,0x80 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...1 */ - { 0x20,0x00,0xa0,0x80 }, { 0x20,0x28,0xa0,0xa8 }, /* ...0...0...1...0 */ - { 0x20,0x28,0xa0,0xa8 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...0...1...1 */ - { 0xa8,0x28,0x88,0x08 }, { 0xa8,0x28,0x88,0x08 }, /* ...0...1...0...0 */ - { 0x08,0x88,0x00,0x80 }, { 0xa8,0x28,0x88,0x08 }, /* ...0...1...0...1 */ - { 0xa8,0x28,0x88,0x08 }, { 0x20,0x28,0xa0,0xa8 }, /* ...0...1...1...0 */ - { 0xa8,0x28,0x88,0x08 }, { 0xa8,0x28,0x88,0x08 }, /* ...0...1...1...1 */ - { 0x20,0x28,0xa0,0xa8 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...0...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x20,0x28,0xa0,0xa8 }, /* ...1...0...0...1 */ - { 0x20,0x28,0xa0,0xa8 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...0...1...0 */ - { 0x20,0x28,0xa0,0xa8 }, { 0x20,0x28,0xa0,0xa8 }, /* ...1...0...1...1 */ - { 0x20,0x00,0xa0,0x80 }, { 0x20,0x28,0xa0,0xa8 }, /* ...1...1...0...0 */ - { 0xa8,0x28,0x88,0x08 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...1 */ - { 0x20,0x28,0xa0,0xa8 }, { 0x20,0x28,0xa0,0xa8 }, /* ...1...1...1...0 */ - { 0xa8,0x28,0x88,0x08 }, { 0xa8,0x28,0x88,0x08 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void bullfgtj_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0xa0,0xa8,0x20,0x28 }, { 0x80,0xa0,0x00,0x20 }, /* ...0...0...0...0 */ - { 0x20,0x28,0x00,0x08 }, { 0x20,0x28,0x00,0x08 }, /* ...0...0...0...1 */ - { 0xa0,0xa8,0x20,0x28 }, { 0x08,0x28,0x00,0x20 }, /* ...0...0...1...0 */ - { 0x88,0x08,0xa8,0x28 }, { 0x88,0x08,0xa8,0x28 }, /* ...0...0...1...1 */ - { 0xa0,0xa8,0x20,0x28 }, { 0x20,0x28,0x00,0x08 }, /* ...0...1...0...0 */ - { 0x28,0xa8,0x20,0xa0 }, { 0x20,0x28,0x00,0x08 }, /* ...0...1...0...1 */ - { 0xa0,0xa8,0x20,0x28 }, { 0x08,0x28,0x00,0x20 }, /* ...0...1...1...0 */ - { 0x88,0x08,0xa8,0x28 }, { 0x88,0x08,0xa8,0x28 }, /* ...0...1...1...1 */ - { 0x28,0xa8,0x20,0xa0 }, { 0xa0,0xa8,0x20,0x28 }, /* ...1...0...0...0 */ - { 0x88,0x08,0xa8,0x28 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...0...0...1 */ - { 0x28,0xa8,0x20,0xa0 }, { 0x08,0x28,0x00,0x20 }, /* ...1...0...1...0 */ - { 0x28,0xa8,0x20,0xa0 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...0...1...1 */ - { 0x20,0x28,0x00,0x08 }, { 0x20,0x28,0x00,0x08 }, /* ...1...1...0...0 */ - { 0x88,0x08,0xa8,0x28 }, { 0x20,0x28,0x00,0x08 }, /* ...1...1...0...1 */ - { 0x08,0x28,0x00,0x20 }, { 0x80,0xa0,0x00,0x20 }, /* ...1...1...1...0 */ - { 0x08,0x28,0x00,0x20 }, { 0x88,0x08,0xa8,0x28 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void pbaction_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0xa8,0xa0,0x88,0x80 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...0...0 */ - { 0x28,0x08,0xa8,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...0...1 */ - { 0x28,0x20,0xa8,0xa0 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...1...0 */ - { 0x28,0x08,0xa8,0x88 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...0...1...1 */ - { 0xa8,0xa0,0x88,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...1...0...0 */ - { 0x28,0x20,0xa8,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...0...1 */ - { 0x28,0x20,0xa8,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...1...0 */ - { 0xa8,0xa0,0x88,0x80 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...1...1 */ - { 0xa8,0xa0,0x88,0x80 }, { 0x28,0x20,0xa8,0xa0 }, /* ...1...0...0...0 */ - { 0x28,0x20,0xa8,0xa0 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...0...0...1 */ - { 0x28,0x20,0xa8,0xa0 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...1...0 */ - { 0x28,0x08,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...1...1 */ - { 0xa0,0x80,0xa8,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...1...0...0 */ - { 0x28,0x20,0xa8,0xa0 }, { 0xa8,0x28,0xa0,0x20 }, /* ...1...1...0...1 */ - { 0xa0,0x80,0xa8,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...1...1...0 */ - { 0xa8,0xa0,0x88,0x80 }, { 0xa8,0x28,0xa0,0x20 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void spatter_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x88,0x08,0x80,0x00 }, { 0x00,0x08,0x20,0x28 }, /* ...0...0...0...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...0...0...1 */ - { 0x28,0x20,0xa8,0xa0 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...0...1...0 */ - { 0x88,0x08,0x80,0x00 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...1...1 */ - { 0x00,0x08,0x20,0x28 }, { 0x88,0x08,0x80,0x00 }, /* ...0...1...0...0 */ - { 0xa0,0x80,0x20,0x00 }, { 0x80,0x88,0x00,0x08 }, /* ...0...1...0...1 */ - { 0x88,0x08,0x80,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...1...1...0 */ - { 0x88,0x08,0x80,0x00 }, { 0x28,0x20,0xa8,0xa0 }, /* ...0...1...1...1 */ - { 0x28,0xa8,0x08,0x88 }, { 0x80,0x88,0x00,0x08 }, /* ...1...0...0...0 */ - { 0x80,0x88,0x00,0x08 }, { 0x00,0x08,0x20,0x28 }, /* ...1...0...0...1 */ - { 0x28,0x20,0xa8,0xa0 }, { 0x28,0xa8,0x08,0x88 }, /* ...1...0...1...0 */ - { 0x00,0x08,0x20,0x28 }, { 0x80,0xa0,0x88,0xa8 }, /* ...1...0...1...1 */ - { 0x80,0x88,0x00,0x08 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...0 */ - { 0x80,0xa0,0x88,0xa8 }, { 0xa0,0x80,0x20,0x00 }, /* ...1...1...0...1 */ - { 0xa0,0x80,0x20,0x00 }, { 0x80,0xa0,0x88,0xa8 }, /* ...1...1...1...0 */ - { 0x28,0x20,0xa8,0xa0 }, { 0x00,0x08,0x20,0x28 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void jongkyo_decode(running_machine &machine, const char *cputag) -{ - /* encrypted ROM is banked */ - UINT8 *decrypted; - - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x28,0x08,0xa8,0x88 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...0...0...0 */ - { 0x80,0x88,0xa0,0xa8 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...0...0...1 */ - { 0xa0,0xa8,0x20,0x28 }, { 0x20,0xa0,0x00,0x80 }, /* ...0...0...1...0 */ - { 0xa0,0xa8,0x20,0x28 }, { 0x80,0x88,0xa0,0xa8 }, /* ...0...0...1...1 */ - { 0x08,0x88,0x00,0x80 }, { 0x08,0x88,0x00,0x80 }, /* ...0...1...0...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x08,0x88,0x00,0x80 }, /* ...0...1...0...1 */ - { 0x20,0xa0,0x00,0x80 }, { 0x20,0xa0,0x00,0x80 }, /* ...0...1...1...0 */ - { 0x08,0x88,0x00,0x80 }, { 0x08,0x88,0x00,0x80 }, /* ...0...1...1...1 */ - { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0xa8,0x20,0x28 }, /* ...1...0...0...0 */ - { 0x80,0x88,0xa0,0xa8 }, { 0x80,0x88,0xa0,0xa8 }, /* ...1...0...0...1 */ - { 0xa0,0xa8,0x20,0x28 }, { 0x20,0xa0,0x00,0x80 }, /* ...1...0...1...0 */ - { 0xa0,0xa8,0x20,0x28 }, { 0x80,0x88,0xa0,0xa8 }, /* ...1...0...1...1 */ - { 0x08,0x88,0x00,0x80 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...1...0...0 */ - { 0x08,0x88,0x00,0x80 }, { 0x80,0x88,0xa0,0xa8 }, /* ...1...1...0...1 */ - { 0x28,0x08,0xa8,0x88 }, { 0x20,0xa0,0x00,0x80 }, /* ...1...1...1...0 */ - { 0x80,0x88,0xa0,0xa8 }, { 0x08,0x88,0x00,0x80 } /* ...1...1...1...1 */ - }; - - int A; - - address_space &space = machine.device(cputag)->memory().space(AS_PROGRAM); - UINT8 *rom = machine.root_device().memregion(cputag)->base(); - decrypted = auto_alloc_array(machine, UINT8, 0x9000); - - for (A = 0x0000;A < 0x9000;A++) - { - int xorval = 0; - - UINT8 src = rom[A]; - - /* pick the translation table from bits 0, 4, 8 and 12 of the address */ - int row = (A & 1) + (((A >> 4) & 1) << 1) + (((A >> 8) & 1) << 2) + (((A >> 12) & 1) << 3); - - /* pick the offset in the table from bits 3 and 5 of the source data */ - int col = ((src >> 3) & 1) + (((src >> 5) & 1) << 1); - /* the bottom half of the translation table is the mirror image of the top */ - if (src & 0x80) - { - col = 3 - col; - xorval = 0xa8; - } - - /* special handling for banked area */ - if (A >= 0x7000) - row = (A & 1) + (((A >> 4) & 1) << 1) + (((A >> 8) & 1) << 2); - - /* decode the opcodes */ - decrypted[A] = (src & ~0xa8) | (convtable[2*row][col] ^ xorval); - - /* decode the data */ - rom[A] = (src & ~0xa8) | (convtable[2*row+1][col] ^ xorval); + data[A] = 0xee; } - - machine.root_device().membank("bank1")->configure_entries(0,8, machine.root_device().memregion(cputag)->base()+0x7000,0x0400); - machine.root_device().membank("bank1")->configure_decrypted_entries(0,8,decrypted+0x7000,0x0400); - space.set_decrypted_region(0x0000, 0x6bff, decrypted); - machine.root_device().membank("bank1")->set_entry(0); -} - - -void pitfall2_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...0...0 */ - { 0x08,0x88,0x28,0xa8 }, { 0x28,0xa8,0x20,0xa0 }, /* ...0...0...0...1 */ - { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...0 */ - { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...0...1...1 */ - { 0xa0,0x80,0xa8,0x88 }, { 0x20,0x00,0xa0,0x80 }, /* ...0...1...0...0 */ - { 0x28,0xa8,0x20,0xa0 }, { 0x20,0x00,0xa0,0x80 }, /* ...0...1...0...1 */ - { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...1...1...0 */ - { 0x28,0xa8,0x20,0xa0 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...1...1...1 */ - { 0x20,0x00,0xa0,0x80 }, { 0x80,0x88,0xa0,0xa8 }, /* ...1...0...0...0 */ - { 0x80,0x88,0xa0,0xa8 }, { 0x80,0x88,0xa0,0xa8 }, /* ...1...0...0...1 */ - { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...1...0 */ - { 0x80,0x88,0xa0,0xa8 }, { 0x28,0xa8,0x20,0xa0 }, /* ...1...0...1...1 */ - { 0x20,0x00,0xa0,0x80 }, { 0x80,0x88,0xa0,0xa8 }, /* ...1...1...0...0 */ - { 0x80,0x88,0xa0,0xa8 }, { 0x20,0x00,0xa0,0x80 }, /* ...1...1...0...1 */ - { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...1...1...0 */ - { 0x80,0x88,0xa0,0xa8 }, { 0x28,0xa8,0x20,0xa0 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void nprinces_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x08,0x88,0x00,0x80 }, { 0xa0,0x20,0x80,0x00 }, /* ...0...0...0...0 */ - { 0xa8,0xa0,0x28,0x20 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...0...1 */ - { 0x88,0x80,0x08,0x00 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...0...1...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...0...1...1 */ - { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x20,0x80,0x00 }, /* ...0...1...0...0 */ - { 0xa8,0xa0,0x28,0x20 }, { 0xa8,0xa0,0x28,0x20 }, /* ...0...1...0...1 */ - { 0x88,0x80,0x08,0x00 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...1...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...1...1...1 */ - { 0xa0,0x20,0x80,0x00 }, { 0xa0,0x20,0x80,0x00 }, /* ...1...0...0...0 */ - { 0x08,0x88,0x00,0x80 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...0...1 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...1...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...1...1 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...1...0...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...1...0...1 */ - { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...1...0 */ - { 0x08,0x88,0x00,0x80 }, { 0x28,0x08,0xa8,0x88 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void seganinj_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...0...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0xa0,0xa8,0x80,0x88 }, /* ...0...0...0...1 */ - { 0xa8,0xa0,0x28,0x20 }, { 0xa8,0xa0,0x28,0x20 }, /* ...0...0...1...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0xa0,0xa8,0x80,0x88 }, /* ...0...0...1...1 */ - { 0x28,0x08,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...0...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0x88,0x08,0x80,0x00 }, /* ...0...1...0...1 */ - { 0x28,0x08,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...1...0 */ - { 0x28,0xa8,0x08,0x88 }, { 0xa8,0xa0,0x28,0x20 }, /* ...0...1...1...1 */ - { 0x88,0x08,0x80,0x00 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...0...0 */ - { 0xa0,0xa8,0x80,0x88 }, { 0x28,0xa8,0x08,0x88 }, /* ...1...0...0...1 */ - { 0xa8,0xa0,0x28,0x20 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...1...0 */ - { 0xa8,0xa0,0x28,0x20 }, { 0x28,0xa8,0x08,0x88 }, /* ...1...0...1...1 */ - { 0x28,0x08,0xa8,0x88 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...1...0...0 */ - { 0x28,0x08,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...1...0...1 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...1...1...0 */ - { 0xa8,0xa0,0x28,0x20 }, { 0x28,0x08,0xa8,0x88 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void imsorry_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x88,0x08,0x80,0x00 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...0...0...0 */ - { 0x00,0x20,0x80,0xa0 }, { 0x88,0x08,0x80,0x00 }, /* ...0...0...0...1 */ - { 0x88,0x08,0xa8,0x28 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...0...1...0 */ - { 0x00,0x20,0x80,0xa0 }, { 0x88,0x08,0xa8,0x28 }, /* ...0...0...1...1 */ - { 0x00,0x20,0x80,0xa0 }, { 0x08,0x00,0x88,0x80 }, /* ...0...1...0...0 */ - { 0x00,0x20,0x80,0xa0 }, { 0x20,0x28,0xa0,0xa8 }, /* ...0...1...0...1 */ - { 0x20,0x28,0xa0,0xa8 }, { 0x00,0x20,0x80,0xa0 }, /* ...0...1...1...0 */ - { 0x20,0x28,0xa0,0xa8 }, { 0x88,0x08,0xa8,0x28 }, /* ...0...1...1...1 */ - { 0x88,0x08,0x80,0x00 }, { 0x08,0x00,0x88,0x80 }, /* ...1...0...0...0 */ - { 0x08,0x00,0x88,0x80 }, { 0x88,0x08,0x80,0x00 }, /* ...1...0...0...1 */ - { 0x08,0x28,0x00,0x20 }, { 0x08,0x28,0x00,0x20 }, /* ...1...0...1...0 */ - { 0x88,0x08,0x80,0x00 }, { 0x08,0x28,0x00,0x20 }, /* ...1...0...1...1 */ - { 0x08,0x28,0x00,0x20 }, { 0x08,0x00,0x88,0x80 }, /* ...1...1...0...0 */ - { 0x08,0x28,0x00,0x20 }, { 0x20,0x28,0xa0,0xa8 }, /* ...1...1...0...1 */ - { 0x20,0x28,0xa0,0xa8 }, { 0x08,0x28,0x00,0x20 }, /* ...1...1...1...0 */ - { 0x20,0x28,0xa0,0xa8 }, { 0x08,0x28,0x00,0x20 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void teddybb_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x20,0x28,0x00,0x08 }, { 0x80,0x00,0xa0,0x20 }, /* ...0...0...0...0 */ - { 0x20,0x28,0x00,0x08 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...0...0...1 */ - { 0x28,0x08,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...0 */ - { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...1...1 */ - { 0x20,0x28,0x00,0x08 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...0...0 */ - { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0xa8,0x20,0x28 }, /* ...0...1...0...1 */ - { 0xa0,0x80,0xa8,0x88 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...1...0 */ - { 0xa0,0xa8,0x20,0x28 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...1...1 */ - { 0x80,0x00,0xa0,0x20 }, { 0x80,0x00,0xa0,0x20 }, /* ...1...0...0...0 */ - { 0xa0,0x20,0xa8,0x28 }, { 0xa0,0xa8,0x20,0x28 }, /* ...1...0...0...1 */ - { 0xa0,0x20,0xa8,0x28 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...1...0 */ - { 0xa0,0x80,0xa8,0x88 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...0...1...1 */ - { 0x80,0x00,0xa0,0x20 }, { 0x20,0x28,0x00,0x08 }, /* ...1...1...0...0 */ - { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0x20,0xa8,0x28 }, /* ...1...1...0...1 */ - { 0x80,0x00,0xa0,0x20 }, { 0xa0,0x80,0xa8,0x88 }, /* ...1...1...1...0 */ - { 0xa0,0xa8,0x20,0x28 }, { 0xa0,0x20,0xa8,0x28 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void myheroj_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x20,0x00,0xa0,0x80 }, { 0x80,0xa0,0x88,0xa8 }, /* ...0...0...0...0 */ - { 0x20,0x00,0xa0,0x80 }, { 0x80,0xa0,0x88,0xa8 }, /* ...0...0...0...1 */ - { 0xa8,0xa0,0x88,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...1...0 */ - { 0x08,0x88,0x00,0x80 }, { 0x80,0xa0,0x88,0xa8 }, /* ...0...0...1...1 */ - { 0x20,0x00,0xa0,0x80 }, { 0x28,0xa8,0x08,0x88 }, /* ...0...1...0...0 */ - { 0x20,0x00,0xa0,0x80 }, { 0x08,0x88,0x00,0x80 }, /* ...0...1...0...1 */ - { 0x28,0xa8,0x08,0x88 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...1...1...0 */ - { 0x08,0x88,0x00,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...1...1...1 */ - { 0x28,0xa8,0x08,0x88 }, { 0x20,0x00,0xa0,0x80 }, /* ...1...0...0...0 */ - { 0x80,0xa0,0x88,0xa8 }, { 0x20,0x00,0xa0,0x80 }, /* ...1...0...0...1 */ - { 0x80,0xa0,0x88,0xa8 }, { 0x80,0xa0,0x88,0xa8 }, /* ...1...0...1...0 */ - { 0xa8,0xa0,0x88,0x80 }, { 0x80,0xa0,0x88,0xa8 }, /* ...1...0...1...1 */ - { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...0 */ - { 0x88,0x80,0x08,0x00 }, { 0x08,0x88,0x00,0x80 }, /* ...1...1...0...1 */ - { 0x88,0x80,0x08,0x00 }, { 0xa8,0xa0,0x88,0x80 }, /* ...1...1...1...0 */ - { 0x88,0x80,0x08,0x00 }, { 0xa8,0xa0,0x88,0x80 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void hvymetal_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0x88,0xa8,0x80,0xa0 }, { 0xa0,0x80,0xa8,0x88 }, /* ...0...0...0...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...0...1 */ - { 0xa0,0x80,0xa8,0x88 }, { 0x88,0xa8,0x80,0xa0 }, /* ...0...0...1...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x88,0x80,0x08,0x00 }, /* ...0...0...1...1 */ - { 0xa0,0x80,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...0 */ - { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...0...1 */ - { 0xa0,0x80,0xa8,0x88 }, { 0x88,0x80,0x08,0x00 }, /* ...0...1...1...0 */ - { 0x88,0x80,0x08,0x00 }, { 0x28,0x08,0xa8,0x88 }, /* ...0...1...1...1 */ - { 0xa0,0x20,0xa8,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...0...0 */ - { 0xa0,0x20,0xa8,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...0...1 */ - { 0xa0,0x20,0xa8,0x28 }, { 0x88,0xa8,0x80,0xa0 }, /* ...1...0...1...0 */ - { 0x88,0xa8,0x80,0xa0 }, { 0x28,0x08,0xa8,0x88 }, /* ...1...0...1...1 */ - { 0x28,0xa8,0x08,0x88 }, { 0xa0,0x20,0xa8,0x28 }, /* ...1...1...0...0 */ - { 0xa0,0x20,0xa8,0x28 }, { 0x28,0xa8,0x08,0x88 }, /* ...1...1...0...1 */ - { 0x28,0xa8,0x08,0x88 }, { 0xa0,0x20,0xa8,0x28 }, /* ...1...1...1...0 */ - { 0x28,0x08,0xa8,0x88 }, { 0x28,0xa8,0x08,0x88 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); -} - - -void lvcards_decode(running_machine &machine, const char *cputag) -{ - static const UINT8 convtable[32][4] = - { - /* opcode data address */ - /* A B C D A B C D */ - { 0xa8,0x88,0xa0,0x80 }, { 0xa8,0x28,0x88,0x08 }, /* ...0...0...0...0 */ - { 0xa8,0x28,0x88,0x08 }, { 0xa8,0x28,0x88,0x08 }, /* ...0...0...0...1 */ - { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...0...1...0 */ - { 0xa8,0xa0,0x88,0x80 }, { 0xa8,0xa0,0x88,0x80 }, /* ...0...0...1...1 */ - { 0xa8,0x28,0x88,0x08 }, { 0xa8,0x28,0xa0,0x20 }, /* ...0...1...0...0 */ - { 0xa8,0x28,0x88,0x08 }, { 0xa8,0x28,0x88,0x08 }, /* ...0...1...0...1 */ - { 0xa0,0x80,0x20,0x00 }, { 0xa0,0x80,0x20,0x00 }, /* ...0...1...1...0 */ - { 0xa8,0x88,0xa0,0x80 }, { 0xa8,0x88,0xa0,0x80 }, /* ...0...1...1...1 */ - { 0xa8,0x88,0xa0,0x80 }, { 0xa8,0x28,0x88,0x08 }, /* ...1...0...0...0 */ - { 0x88,0x80,0x08,0x00 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...0...1 */ - { 0xa8,0x28,0x88,0x08 }, { 0x88,0x80,0x08,0x00 }, /* ...1...0...1...0 */ - { 0xa8,0x28,0x88,0x08 }, { 0xa8,0x28,0x88,0x08 }, /* ...1...0...1...1 */ - { 0xa8,0x28,0x88,0x08 }, { 0xa8,0x88,0xa0,0x80 }, /* ...1...1...0...0 */ - { 0xa8,0x88,0xa0,0x80 }, { 0x88,0x80,0x08,0x00 }, /* ...1...1...0...1 */ - { 0x88,0x80,0x08,0x00 }, { 0xa8,0x28,0x88,0x08 }, /* ...1...1...1...0 */ - { 0xa8,0x28,0x88,0x08 }, { 0xa8,0x88,0xa0,0x80 } /* ...1...1...1...1 */ - }; - - - sega_decode(machine, cputag, convtable); } diff --git a/src/mame/machine/segacrpt.h b/src/mame/machine/segacrpt.h index c0d42bad383..ba6fc16ca72 100644 --- a/src/mame/machine/segacrpt.h +++ b/src/mame/machine/segacrpt.h @@ -1,27 +1,4 @@ // license:BSD-3-Clause // copyright-holders:Nicola Salmoria -void buckrog_decode(running_machine &machine, const char *cputag); -void pengo_decode(running_machine &machine, const char *cputag); -void szaxxon_decode(running_machine &machine, const char *cputag); -void suprloco_decode(running_machine &machine, const char *cputag); -void yamato_decode(running_machine &machine, const char *cputag); -void toprollr_decode(running_machine &machine, const char *cputag, const char *regiontag); -void sindbadm_decode(running_machine &machine, const char *cputag); -void regulus_decode(running_machine &machine, const char *cputag); -void mrviking_decode(running_machine &machine, const char *cputag); -void swat_decode(running_machine &machine, const char *cputag); -void flicky_decode(running_machine &machine, const char *cputag); -void futspy_decode(running_machine &machine, const char *cputag); -void wmatch_decode(running_machine &machine, const char *cputag); -void bullfgtj_decode(running_machine &machine, const char *cputag); -void pbaction_decode(running_machine &machine, const char *cputag); -void spatter_decode(running_machine &machine, const char *cputag); -void jongkyo_decode(running_machine &machine, const char *cputag); -void pitfall2_decode(running_machine &machine, const char *cputag); -void nprinces_decode(running_machine &machine, const char *cputag); -void seganinj_decode(running_machine &machine, const char *cputag); -void imsorry_decode(running_machine &machine, const char *cputag); -void teddybb_decode(running_machine &machine, const char *cputag); -void myheroj_decode(running_machine &machine, const char *cputag); -void hvymetal_decode(running_machine &machine, const char *cputag); -void lvcards_decode(running_machine &machine, const char *cputag); + +void sega_decode(UINT8 *data, UINT8 *opcodes, int size, const UINT8 convtable[32][4], int bank_count = 0, int bank_size = 0); diff --git a/src/mame/machine/segaic16.c b/src/mame/machine/segaic16.c index 5976fbc1be8..19ab5ef6906 100644 --- a/src/mame/machine/segaic16.c +++ b/src/mame/machine/segaic16.c @@ -179,6 +179,7 @@ sega_315_5195_mapper_device::sega_315_5195_mapper_device(const machine_config &m m_cputag(NULL), m_cpu(NULL), m_space(NULL), + m_decrypted_space(NULL), m_curregion(0) { } @@ -354,7 +355,7 @@ READ8_MEMBER( sega_315_5195_mapper_device::read ) // map_as_rom - map a region as ROM data //------------------------------------------------- -void sega_315_5195_mapper_device::map_as_rom(UINT32 offset, UINT32 length, offs_t mirror, const char *bank_name, offs_t rgnoffset, write16_delegate whandler) +void sega_315_5195_mapper_device::map_as_rom(UINT32 offset, UINT32 length, offs_t mirror, const char *bank_name, const char *decrypted_bank_name, offs_t rgnoffset, write16_delegate whandler) { // determine parameters region_info info; @@ -377,14 +378,17 @@ void sega_315_5195_mapper_device::map_as_rom(UINT32 offset, UINT32 length, offs_ // map now m_space->install_read_bank(info.start, romend, 0, info.mirror, bank_name); + if (m_decrypted_space) + m_decrypted_space->install_read_bank(info.start, romend, 0, info.mirror, decrypted_bank_name); // configure the bank memory_bank *bank = owner()->membank(bank_name); + memory_bank *decrypted_bank = owner()->membank(decrypted_bank_name); UINT8 *memptr = m_cpu->region()->base() + rgnoffset; bank->set_base(memptr); // remember this bank, and decrypt if necessary - m_banks[m_curregion].set(bank, info.start, romend, rgnoffset, memptr); + m_banks[m_curregion].set(bank, decrypted_bank, info.start, romend, rgnoffset, memptr); } // either install a write handler if provided or unmap the region @@ -524,6 +528,8 @@ void sega_315_5195_mapper_device::device_start() if (m_space == NULL) throw emu_fatalerror("Unable to find program address space on device '%s'", m_cputag); + m_decrypted_space = m_cpu->has_space(AS_DECRYPTED_OPCODES) ? &m_cpu->space(AS_DECRYPTED_OPCODES) : NULL; + // register for saves save_item(NAME(m_regs)); } @@ -597,6 +603,7 @@ void sega_315_5195_mapper_device::update_mapping() sega_315_5195_mapper_device::decrypt_bank::decrypt_bank() : m_bank(NULL), + m_decrypted_bank(NULL), m_start(0), m_end(0), m_rgnoffs(~0), @@ -647,7 +654,7 @@ void sega_315_5195_mapper_device::decrypt_bank::set_decrypt(fd1094_device *fd109 // a change //------------------------------------------------- -void sega_315_5195_mapper_device::decrypt_bank::set(memory_bank *bank, offs_t start, offs_t end, offs_t rgnoffs, UINT8 *src) +void sega_315_5195_mapper_device::decrypt_bank::set(memory_bank *bank, memory_bank *decrypted_bank, offs_t start, offs_t end, offs_t rgnoffs, UINT8 *src) { // ignore if not encrypted if (m_fd1089 == NULL && m_fd1094_cache == NULL) @@ -662,6 +669,7 @@ void sega_315_5195_mapper_device::decrypt_bank::set(memory_bank *bank, offs_t st // update to the current state m_bank = bank; + m_decrypted_bank = decrypted_bank; m_start = start; m_end = end; m_rgnoffs = rgnoffs; @@ -692,12 +700,12 @@ void sega_315_5195_mapper_device::decrypt_bank::update() { m_fd1089_decrypted.resize((m_end + 1 - m_start) / 2); m_fd1089->decrypt(m_start, m_end + 1 - m_start, m_rgnoffs, &m_fd1089_decrypted[0], reinterpret_cast<UINT16 *>(m_srcptr)); - m_bank->set_base_decrypted(&m_fd1089_decrypted[0]); + m_decrypted_bank->set_base(&m_fd1089_decrypted[0]); } // fd1094 case if (m_fd1094_cache != NULL) - m_bank->set_base_decrypted(m_fd1094_cache->decrypted_opcodes(m_fd1094_cache->fd1094().state())); + m_decrypted_bank->set_base(m_fd1094_cache->decrypted_opcodes(m_fd1094_cache->fd1094().state())); } diff --git a/src/mame/machine/segaic16.h b/src/mame/machine/segaic16.h index 4472e24d3db..58d772975a3 100644 --- a/src/mame/machine/segaic16.h +++ b/src/mame/machine/segaic16.h @@ -101,7 +101,7 @@ public: DECLARE_WRITE8_MEMBER( write ); // mapping helpers - void map_as_rom(UINT32 offset, UINT32 length, offs_t mirror, const char *bank_name, offs_t rgnoffset, write16_delegate whandler); + void map_as_rom(UINT32 offset, UINT32 length, offs_t mirror, const char *bank_name, const char *decrypted_bank_name, offs_t rgnoffset, write16_delegate whandler); void map_as_ram(UINT32 offset, UINT32 length, offs_t mirror, const char *bank_share_name, write16_delegate whandler); void map_as_handler(UINT32 offset, UINT32 length, offs_t mirror, read16_delegate rhandler, write16_delegate whandler); @@ -135,8 +135,8 @@ private: // configuration void set_decrypt(fd1089_base_device *fd1089); void set_decrypt(fd1094_device *fd1094); - void clear() { set(NULL, 0, 0, ~0, NULL); } - void set(memory_bank *bank, offs_t start, offs_t end, offs_t rgnoffs, UINT8 *src); + void clear() { set(NULL, NULL, 0, 0, ~0, NULL); } + void set(memory_bank *bank, memory_bank *decrypted_bank, offs_t start, offs_t end, offs_t rgnoffs, UINT8 *src); // updating void update(); @@ -145,6 +145,7 @@ private: private: // internal state memory_bank * m_bank; + memory_bank * m_decrypted_bank; offs_t m_start; offs_t m_end; offs_t m_rgnoffs; @@ -168,6 +169,7 @@ private: // internal state m68000_device * m_cpu; address_space * m_space; + address_space * m_decrypted_space; UINT8 m_regs[0x20]; UINT8 m_curregion; decrypt_bank m_banks[8]; diff --git a/src/mame/machine/slapstic.c b/src/mame/machine/slapstic.c index 60f6a26233d..5adf0c91d7f 100644 --- a/src/mame/machine/slapstic.c +++ b/src/mame/machine/slapstic.c @@ -821,7 +821,7 @@ int atari_slapstic_device::alt2_kludge(address_space &space, offs_t offset) if (MATCHES_MASK_VALUE(space.device().safe_pc() >> 1, slapstic.alt1)) { /* now look for a move.w (An),(An) or cmpm.w (An)+,(An)+ */ - UINT16 opcode = space.direct().read_decrypted_word(space.device().safe_pcbase() & 0xffffff); + UINT16 opcode = space.direct().read_word(space.device().safe_pcbase() & 0xffffff); if ((opcode & 0xf1f8) == 0x3090 || (opcode & 0xf1f8) == 0xb148) { /* fetch the value of the register for the second operand, and see */ diff --git a/src/mame/machine/stfight.c b/src/mame/machine/stfight.c index ff6e07476a5..f0aba6a01c3 100644 --- a/src/mame/machine/stfight.c +++ b/src/mame/machine/stfight.c @@ -39,18 +39,14 @@ Encryption PAL 16R4 on CPU board DRIVER_INIT_MEMBER(stfight_state,empcity) { - address_space &space = m_maincpu->space(AS_PROGRAM); UINT8 *rom = memregion("maincpu")->base(); - m_decrypt = auto_alloc_array(machine(), UINT8, 0x8000); - space.set_decrypted_region(0x0000, 0x7fff, m_decrypt); - for (UINT32 A = 0; A < 0x8000; ++A) { UINT8 src = rom[A]; // decode opcode - m_decrypt[A] = + m_decrypted_opcodes[A] = ( src & 0xA6 ) | ( ( ( ( src << 2 ) ^ src ) << 3 ) & 0x40 ) | ( ~( ( src ^ ( A >> 1 ) ) >> 2 ) & 0x10 ) | |