changed IREM cpu decryption to be 'real-time' (it's a feature of the CPU)

moved decryption table setup to 'config' struct for the CPU.

added latest tables from robiza, making Risky Challenge playable, promoted it to working

told CPU core to not decrypt code after brkn instruction, enabling it again on iret, allowing me to remove several 'don't decrypt range' hacks in robiza's code.

updated all drivers accordingly.

currently the disassembly is a bit weird now, this will need looking at.
This commit is contained in:
davidhay 2008-02-17 16:05:10 +00:00
parent c552f36c5b
commit b469de6db7
8 changed files with 375 additions and 342 deletions

View File

@ -114,6 +114,13 @@ typedef UINT32 DWORD;
#include "nec.h" #include "nec.h"
#include "necintrf.h" #include "necintrf.h"
/* default configuration */
static const nec_config default_config =
{
NULL
};
extern int necv_dasm_one(char *buffer, UINT32 eip, const UINT8 *oprom); extern int necv_dasm_one(char *buffer, UINT32 eip, const UINT8 *oprom);
/* NEC registers */ /* NEC registers */
@ -158,6 +165,10 @@ typedef struct
int (*irq_callback)(int irqline); int (*irq_callback)(int irqline);
memory_interface mem; memory_interface mem;
const nec_config *config;
} nec_Regs; } nec_Regs;
/***************************************************************************/ /***************************************************************************/
@ -185,10 +196,26 @@ static char seg_prefix; /* prefix segment indicator */
static UINT8 parity_table[256]; static UINT8 parity_table[256];
#include "cpuintrf.h"
static UINT8 fetchop(void)
{
UINT8 ret = cpu_readop( FETCH_XOR( ( I.sregs[PS]<<4)+I.ip++));
if (I.MF == 1)
if (I.config->v25v35_decryptiontable)
{
ret = I.config->v25v35_decryptiontable[ret];
}
return ret;
}
/***************************************************************************/ /***************************************************************************/
static void nec_reset (void) static void nec_reset (void)
{ {
const nec_config *config;
unsigned int i,j,c; unsigned int i,j,c;
static const BREGS reg_name[8]={ AL, CL, DL, BL, AH, CH, DH, BH }; static const BREGS reg_name[8]={ AL, CL, DL, BL, AH, CH, DH, BH };
int (*save_irqcallback)(int); int (*save_irqcallback)(int);
@ -196,9 +223,12 @@ static void nec_reset (void)
save_irqcallback = I.irq_callback; save_irqcallback = I.irq_callback;
save_mem = I.mem; save_mem = I.mem;
config = I.config;
memset( &I, 0, sizeof(I) ); memset( &I, 0, sizeof(I) );
I.irq_callback = save_irqcallback; I.irq_callback = save_irqcallback;
I.mem = save_mem; I.mem = save_mem;
I.config = config;
I.sregs[PS] = 0xffff; I.sregs[PS] = 0xffff;
@ -214,6 +244,9 @@ static void nec_reset (void)
I.ZeroVal = I.ParityVal = 1; I.ZeroVal = I.ParityVal = 1;
SetMD(1); /* set the mode-flag = native mode */ SetMD(1); /* set the mode-flag = native mode */
/* for v25+ / v35+ there is an internal decryption table */
//I.config->v25v35_decryptiontable = gussun_test_decryption_table;
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
{ {
Mod_RM.reg.b[i] = reg_name[(i & 0x38) >> 3]; Mod_RM.reg.b[i] = reg_name[(i & 0x38) >> 3];
@ -262,7 +295,7 @@ static void nec_interrupt(unsigned int_num,BOOLEAN md_flag)
static void nec_trap(void) static void nec_trap(void)
{ {
nec_instruction[FETCHOP](); nec_instruction[fetchop()]();
nec_interrupt(1,0); nec_interrupt(1,0);
} }
@ -362,7 +395,7 @@ OP( 0x22, i_and_r8b ) { DEF_r8b; ANDB; RegByte(ModRM)=dst; CLKM(2,2,2,11,10,6
OP( 0x23, i_and_r16w ) { DEF_r16w; ANDW; RegWord(ModRM)=dst; CLKR(15,15,8,15,11,6,2,EA); } OP( 0x23, i_and_r16w ) { DEF_r16w; ANDW; RegWord(ModRM)=dst; CLKR(15,15,8,15,11,6,2,EA); }
OP( 0x24, i_and_ald8 ) { DEF_ald8; ANDB; I.regs.b[AL]=dst; CLKS(4,4,2); } OP( 0x24, i_and_ald8 ) { DEF_ald8; ANDB; I.regs.b[AL]=dst; CLKS(4,4,2); }
OP( 0x25, i_and_axd16) { DEF_axd16; ANDW; I.regs.w[AW]=dst; CLKS(4,4,2); } OP( 0x25, i_and_axd16) { DEF_axd16; ANDW; I.regs.w[AW]=dst; CLKS(4,4,2); }
OP( 0x26, i_es ) { seg_prefix=TRUE; prefix_base=I.sregs[DS1]<<4; CLK(2); nec_instruction[FETCHOP](); seg_prefix=FALSE; } OP( 0x26, i_es ) { seg_prefix=TRUE; prefix_base=I.sregs[DS1]<<4; CLK(2); nec_instruction[fetchop()](); seg_prefix=FALSE; }
OP( 0x27, i_daa ) { ADJ4(6,0x60); CLKS(3,3,2); } OP( 0x27, i_daa ) { ADJ4(6,0x60); CLKS(3,3,2); }
OP( 0x28, i_sub_br8 ) { DEF_br8; SUBB; PutbackRMByte(ModRM,dst); CLKM(2,2,2,16,13,7); } OP( 0x28, i_sub_br8 ) { DEF_br8; SUBB; PutbackRMByte(ModRM,dst); CLKM(2,2,2,16,13,7); }
@ -371,7 +404,7 @@ OP( 0x2a, i_sub_r8b ) { DEF_r8b; SUBB; RegByte(ModRM)=dst; CLKM(2,2,2,11,10,6
OP( 0x2b, i_sub_r16w ) { DEF_r16w; SUBW; RegWord(ModRM)=dst; CLKR(15,15,8,15,11,6,2,EA); } OP( 0x2b, i_sub_r16w ) { DEF_r16w; SUBW; RegWord(ModRM)=dst; CLKR(15,15,8,15,11,6,2,EA); }
OP( 0x2c, i_sub_ald8 ) { DEF_ald8; SUBB; I.regs.b[AL]=dst; CLKS(4,4,2); } OP( 0x2c, i_sub_ald8 ) { DEF_ald8; SUBB; I.regs.b[AL]=dst; CLKS(4,4,2); }
OP( 0x2d, i_sub_axd16) { DEF_axd16; SUBW; I.regs.w[AW]=dst; CLKS(4,4,2); } OP( 0x2d, i_sub_axd16) { DEF_axd16; SUBW; I.regs.w[AW]=dst; CLKS(4,4,2); }
OP( 0x2e, i_cs ) { seg_prefix=TRUE; prefix_base=I.sregs[PS]<<4; CLK(2); nec_instruction[FETCHOP](); seg_prefix=FALSE; } OP( 0x2e, i_cs ) { seg_prefix=TRUE; prefix_base=I.sregs[PS]<<4; CLK(2); nec_instruction[fetchop()](); seg_prefix=FALSE; }
OP( 0x2f, i_das ) { ADJ4(-6,-0x60); CLKS(3,3,2); } OP( 0x2f, i_das ) { ADJ4(-6,-0x60); CLKS(3,3,2); }
OP( 0x30, i_xor_br8 ) { DEF_br8; XORB; PutbackRMByte(ModRM,dst); CLKM(2,2,2,16,13,7); } OP( 0x30, i_xor_br8 ) { DEF_br8; XORB; PutbackRMByte(ModRM,dst); CLKM(2,2,2,16,13,7); }
@ -380,7 +413,7 @@ OP( 0x32, i_xor_r8b ) { DEF_r8b; XORB; RegByte(ModRM)=dst; CLKM(2,2,2,11,10,6
OP( 0x33, i_xor_r16w ) { DEF_r16w; XORW; RegWord(ModRM)=dst; CLKR(15,15,8,15,11,6,2,EA); } OP( 0x33, i_xor_r16w ) { DEF_r16w; XORW; RegWord(ModRM)=dst; CLKR(15,15,8,15,11,6,2,EA); }
OP( 0x34, i_xor_ald8 ) { DEF_ald8; XORB; I.regs.b[AL]=dst; CLKS(4,4,2); } OP( 0x34, i_xor_ald8 ) { DEF_ald8; XORB; I.regs.b[AL]=dst; CLKS(4,4,2); }
OP( 0x35, i_xor_axd16) { DEF_axd16; XORW; I.regs.w[AW]=dst; CLKS(4,4,2); } OP( 0x35, i_xor_axd16) { DEF_axd16; XORW; I.regs.w[AW]=dst; CLKS(4,4,2); }
OP( 0x36, i_ss ) { seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; CLK(2); nec_instruction[FETCHOP](); seg_prefix=FALSE; } OP( 0x36, i_ss ) { seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; CLK(2); nec_instruction[fetchop()](); seg_prefix=FALSE; }
OP( 0x37, i_aaa ) { ADJB(6, (I.regs.b[AL] > 0xf9) ? 2 : 1); CLKS(7,7,4); } OP( 0x37, i_aaa ) { ADJB(6, (I.regs.b[AL] > 0xf9) ? 2 : 1); CLKS(7,7,4); }
OP( 0x38, i_cmp_br8 ) { DEF_br8; SUBB; CLKM(2,2,2,11,10,6); } OP( 0x38, i_cmp_br8 ) { DEF_br8; SUBB; CLKM(2,2,2,11,10,6); }
@ -389,7 +422,7 @@ OP( 0x3a, i_cmp_r8b ) { DEF_r8b; SUBB; CLKM(2,2,2,11,10,6); }
OP( 0x3b, i_cmp_r16w ) { DEF_r16w; SUBW; CLKR(15,15,8,15,11,6,2,EA); } OP( 0x3b, i_cmp_r16w ) { DEF_r16w; SUBW; CLKR(15,15,8,15,11,6,2,EA); }
OP( 0x3c, i_cmp_ald8 ) { DEF_ald8; SUBB; CLKS(4,4,2); } OP( 0x3c, i_cmp_ald8 ) { DEF_ald8; SUBB; CLKS(4,4,2); }
OP( 0x3d, i_cmp_axd16) { DEF_axd16; SUBW; CLKS(4,4,2); } OP( 0x3d, i_cmp_axd16) { DEF_axd16; SUBW; CLKS(4,4,2); }
OP( 0x3e, i_ds ) { seg_prefix=TRUE; prefix_base=I.sregs[DS0]<<4; CLK(2); nec_instruction[FETCHOP](); seg_prefix=FALSE; } OP( 0x3e, i_ds ) { seg_prefix=TRUE; prefix_base=I.sregs[DS0]<<4; CLK(2); nec_instruction[fetchop()](); seg_prefix=FALSE; }
OP( 0x3f, i_aas ) { ADJB(-6, (I.regs.b[AL] < 6) ? -2 : -1); CLKS(7,7,4); } OP( 0x3f, i_aas ) { ADJB(-6, (I.regs.b[AL] < 6) ? -2 : -1); CLKS(7,7,4); }
OP( 0x40, i_inc_ax ) { IncWordReg(AW); CLK(2); } OP( 0x40, i_inc_ax ) { IncWordReg(AW); CLK(2); }
@ -464,12 +497,13 @@ OP( 0x62, i_chkind ) {
nec_ICount-=20; nec_ICount-=20;
logerror("%06x: bound %04x high %04x low %04x tmp\n",activecpu_get_pc(),high,low,tmp); logerror("%06x: bound %04x high %04x low %04x tmp\n",activecpu_get_pc(),high,low,tmp);
} }
OP( 0x64, i_repnc ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW]; OP( 0x63, i_brkn ) { nec_interrupt(FETCH,1); CLKS(50,50,24); } // timing not verified, used by riskchal / gussun
OP( 0x64, i_repnc ) { UINT32 next = fetchop(); UINT16 c = I.regs.w[CW];
switch(next) { /* Segments */ switch(next) { /* Segments */
case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[DS1]<<4; next = FETCHOP; CLK(2); break; case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[DS1]<<4; next = fetchop(); CLK(2); break;
case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[PS]<<4; next = FETCHOP; CLK(2); break; case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[PS]<<4; next = fetchop(); CLK(2); break;
case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = fetchop(); CLK(2); break;
case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS0]<<4; next = FETCHOP; CLK(2); break; case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS0]<<4; next = fetchop(); CLK(2); break;
} }
switch(next) { switch(next) {
@ -492,12 +526,12 @@ OP( 0x64, i_repnc ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW];
seg_prefix=FALSE; seg_prefix=FALSE;
} }
OP( 0x65, i_repc ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW]; OP( 0x65, i_repc ) { UINT32 next = fetchop(); UINT16 c = I.regs.w[CW];
switch(next) { /* Segments */ switch(next) { /* Segments */
case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[DS1]<<4; next = FETCHOP; CLK(2); break; case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[DS1]<<4; next = fetchop(); CLK(2); break;
case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[PS]<<4; next = FETCHOP; CLK(2); break; case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[PS]<<4; next = fetchop(); CLK(2); break;
case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = fetchop(); CLK(2); break;
case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS0]<<4; next = FETCHOP; CLK(2); break; case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS0]<<4; next = fetchop(); CLK(2); break;
} }
switch(next) { switch(next) {
@ -749,7 +783,7 @@ OP( 0xcb, i_retf ) { POP(I.ip); POP(I.sregs[PS]); CHANGE_PC; CLKS(29,29,16)
OP( 0xcc, i_int3 ) { nec_interrupt(3,0); CLKS(50,50,24); } OP( 0xcc, i_int3 ) { nec_interrupt(3,0); CLKS(50,50,24); }
OP( 0xcd, i_int ) { nec_interrupt(FETCH,0); CLKS(50,50,24); } OP( 0xcd, i_int ) { nec_interrupt(FETCH,0); CLKS(50,50,24); }
OP( 0xce, i_into ) { if (OF) { nec_interrupt(4,0); CLKS(52,52,26); } else CLK(3); } OP( 0xce, i_into ) { if (OF) { nec_interrupt(4,0); CLKS(52,52,26); } else CLK(3); }
OP( 0xcf, i_iret ) { POP(I.ip); POP(I.sregs[PS]); i_popf(); CHANGE_PC; CLKS(39,39,19); } OP( 0xcf, i_iret ) { POP(I.ip); POP(I.sregs[PS]); i_popf(); SetMD(1); CHANGE_PC; CLKS(39,39,19); }
OP( 0xd0, i_rotshft_b ) { OP( 0xd0, i_rotshft_b ) {
UINT32 src, dst; GetModRM; src = (UINT32)GetRMByte(ModRM); dst=src; UINT32 src, dst; GetModRM; src = (UINT32)GetRMByte(ModRM); dst=src;
@ -841,12 +875,12 @@ OP( 0xee, i_outdxal ) { write_port_byte(I.regs.w[DW], I.regs.b[AL]); CLKS(8,8,3
OP( 0xef, i_outdxax ) { write_port_word(I.regs.w[DW], I.regs.w[AW]); CLKW(12,12,5,12,8,3,I.regs.w[DW]); } OP( 0xef, i_outdxax ) { write_port_word(I.regs.w[DW], I.regs.w[AW]); CLKW(12,12,5,12,8,3,I.regs.w[DW]); }
OP( 0xf0, i_lock ) { logerror("%06x: Warning - BUSLOCK\n",activecpu_get_pc()); I.no_interrupt=1; CLK(2); } OP( 0xf0, i_lock ) { logerror("%06x: Warning - BUSLOCK\n",activecpu_get_pc()); I.no_interrupt=1; CLK(2); }
OP( 0xf2, i_repne ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW]; OP( 0xf2, i_repne ) { UINT32 next = fetchop(); UINT16 c = I.regs.w[CW];
switch(next) { /* Segments */ switch(next) { /* Segments */
case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[DS1]<<4; next = FETCHOP; CLK(2); break; case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[DS1]<<4; next = fetchop(); CLK(2); break;
case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[PS]<<4; next = FETCHOP; CLK(2); break; case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[PS]<<4; next = fetchop(); CLK(2); break;
case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = fetchop(); CLK(2); break;
case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS0]<<4; next = FETCHOP; CLK(2); break; case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS0]<<4; next = fetchop(); CLK(2); break;
} }
switch(next) { switch(next) {
@ -868,12 +902,12 @@ OP( 0xf2, i_repne ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW];
} }
seg_prefix=FALSE; seg_prefix=FALSE;
} }
OP( 0xf3, i_repe ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW]; OP( 0xf3, i_repe ) { UINT32 next = fetchop(); UINT16 c = I.regs.w[CW];
switch(next) { /* Segments */ switch(next) { /* Segments */
case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[DS1]<<4; next = FETCHOP; CLK(2); break; case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[DS1]<<4; next = fetchop(); CLK(2); break;
case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[PS]<<4; next = FETCHOP; CLK(2); break; case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[PS]<<4; next = fetchop(); CLK(2); break;
case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = fetchop(); CLK(2); break;
case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS0]<<4; next = FETCHOP; CLK(2); break; case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS0]<<4; next = fetchop(); CLK(2); break;
} }
switch(next) { switch(next) {
@ -1013,10 +1047,16 @@ static offs_t nec_dasm(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8
} }
#endif /* ENABLE_DEBUGGER */ #endif /* ENABLE_DEBUGGER */
static void nec_init(int index, int clock, const void *config, int (*irqcallback)(int), int type) static void nec_init(int index, int clock, const void *_config, int (*irqcallback)(int), int type)
{ {
const nec_config *config = _config ? _config : &default_config;
static const char *const names[]={"V20","V30","V33"}; static const char *const names[]={"V20","V30","V33"};
I.config = config;
state_save_register_item_array(names[type], index, I.regs.w); state_save_register_item_array(names[type], index, I.regs.w);
state_save_register_item_array(names[type], index, I.sregs); state_save_register_item_array(names[type], index, I.sregs);
@ -1180,7 +1220,7 @@ static int v20_execute(int cycles)
I.no_interrupt--; I.no_interrupt--;
CALL_DEBUGGER((I.sregs[PS]<<4) + I.ip); CALL_DEBUGGER((I.sregs[PS]<<4) + I.ip);
nec_instruction[FETCHOP](); nec_instruction[fetchop()]();
} }
return cycles - nec_ICount; return cycles - nec_ICount;
} }
@ -1211,7 +1251,7 @@ static int v30_execute(int cycles) {
I.no_interrupt--; I.no_interrupt--;
CALL_DEBUGGER((I.sregs[PS]<<4) + I.ip); CALL_DEBUGGER((I.sregs[PS]<<4) + I.ip);
nec_instruction[FETCHOP](); nec_instruction[fetchop()]();
} }
return cycles - nec_ICount; return cycles - nec_ICount;
} }
@ -1243,7 +1283,7 @@ static int v33_execute(int cycles)
I.no_interrupt--; I.no_interrupt--;
CALL_DEBUGGER((I.sregs[PS]<<4) + I.ip); CALL_DEBUGGER((I.sregs[PS]<<4) + I.ip);
nec_instruction[FETCHOP](); nec_instruction[fetchop()]();
} }
return cycles - nec_ICount; return cycles - nec_ICount;

View File

@ -1,5 +1,12 @@
#include "cpuintrf.h" #include "cpuintrf.h"
typedef struct _nec_config nec_config;
struct _nec_config
{
const UINT8* v25v35_decryptiontable; // internal decryption table
};
typedef enum { DS1, PS, SS, DS0 } SREGS; typedef enum { DS1, PS, SS, DS0 } SREGS;
typedef enum { AW, CW, DW, BW, SP, BP, IX, IY } WREGS; typedef enum { AW, CW, DW, BW, SP, BP, IX, IY } WREGS;
@ -95,7 +102,9 @@ typedef enum { AH,AL,CH,CL,DH,DL,BH,BL,SPH,SPL,BPH,BPL,IXH,IXL,IYH,IYL } BREGS;
#define FETCH_XOR(a) ((a) ^ I.mem.fetch_xor) #define FETCH_XOR(a) ((a) ^ I.mem.fetch_xor)
#define FETCH (cpu_readop_arg(FETCH_XOR((I.sregs[PS]<<4)+I.ip++))) #define FETCH (cpu_readop_arg(FETCH_XOR((I.sregs[PS]<<4)+I.ip++)))
#define FETCHOP (cpu_readop(FETCH_XOR((I.sregs[PS]<<4)+I.ip++)))
#define FETCHOP ()
#define FETCHWORD(var) { var=cpu_readop_arg(FETCH_XOR((I.sregs[PS]<<4)+I.ip))+(cpu_readop_arg(FETCH_XOR((I.sregs[PS]<<4)+I.ip+1))<<8); I.ip+=2; } #define FETCHWORD(var) { var=cpu_readop_arg(FETCH_XOR((I.sregs[PS]<<4)+I.ip))+(cpu_readop_arg(FETCH_XOR((I.sregs[PS]<<4)+I.ip+1))<<8); I.ip+=2; }
#define PUSH(val) { I.regs.w[SP]-=2; write_word((((I.sregs[SS]<<4)+I.regs.w[SP])),val); } #define PUSH(val) { I.regs.w[SP]-=2; write_word((((I.sregs[SS]<<4)+I.regs.w[SP])),val); }
#define POP(var) { var = read_word((((I.sregs[SS]<<4)+I.regs.w[SP]))); I.regs.w[SP]+=2; } #define POP(var) { var = read_word((((I.sregs[SS]<<4)+I.regs.w[SP]))); I.regs.w[SP]+=2; }

View File

@ -97,6 +97,7 @@ static void i_pop_di(void);
static void i_pusha(void); static void i_pusha(void);
static void i_popa(void); static void i_popa(void);
static void i_chkind(void); static void i_chkind(void);
static void i_brkn(void);
static void i_repnc(void); static void i_repnc(void);
static void i_repc(void); static void i_repc(void);
static void i_push_d16(void); static void i_push_d16(void);
@ -347,7 +348,7 @@ static void (*const nec_instruction[256])(void) =
i_pusha, /* 0x60 */ i_pusha, /* 0x60 */
i_popa, /* 0x61 */ i_popa, /* 0x61 */
i_chkind, /* 0x62 */ i_chkind, /* 0x62 */
i_invalid, /* 0x63 */ i_brkn, /* 0x63 */ // brkn - v25+ / 35+ only?
i_repnc, /* 0x64 */ i_repnc, /* 0x64 */
i_repc, /* 0x65 */ i_repc, /* 0x65 */
i_invalid, /* 0x66 */ i_invalid, /* 0x66 */

View File

@ -19,6 +19,7 @@
#include "machine/irem_cpu.h" #include "machine/irem_cpu.h"
#include "sound/2151intf.h" #include "sound/2151intf.h"
#include "sound/iremga20.h" #include "sound/iremga20.h"
#include "cpu/nec/nec.h"
#define M107_IRQ_0 ((m107_irq_vectorbase+0)/4) /* VBL interrupt*/ #define M107_IRQ_0 ((m107_irq_vectorbase+0)/4) /* VBL interrupt*/
@ -475,6 +476,8 @@ static const struct IremGA20_interface iremGA20_interface =
/***************************************************************************/ /***************************************************************************/
static const nec_config firebarr_config ={ rtypeleo_decryption_table, };
static MACHINE_DRIVER_START( firebarr ) static MACHINE_DRIVER_START( firebarr )
/* basic machine hardware */ /* basic machine hardware */
@ -482,9 +485,9 @@ static MACHINE_DRIVER_START( firebarr )
MDRV_CPU_PROGRAM_MAP(main_map,0) MDRV_CPU_PROGRAM_MAP(main_map,0)
MDRV_CPU_IO_MAP(main_portmap,0) MDRV_CPU_IO_MAP(main_portmap,0)
MDRV_CPU_ADD(V30, 14318000/2) MDRV_CPU_ADD_TAG("sound", V30, 14318000/2)
/* audio CPU */ /* 14.318 MHz */
MDRV_CPU_PROGRAM_MAP(sound_map,0) MDRV_CPU_PROGRAM_MAP(sound_map,0)
MDRV_CPU_CONFIG(firebarr_config)
MDRV_MACHINE_START(m107) MDRV_MACHINE_START(m107)
MDRV_MACHINE_RESET(m107) MDRV_MACHINE_RESET(m107)
@ -516,17 +519,28 @@ static MACHINE_DRIVER_START( firebarr )
MDRV_SOUND_ROUTE(1, "right", 1.0) MDRV_SOUND_ROUTE(1, "right", 1.0)
MACHINE_DRIVER_END MACHINE_DRIVER_END
static const nec_config dsoccr94_config ={ dsoccr94_decryption_table, };
static MACHINE_DRIVER_START( dsoccr94 ) static MACHINE_DRIVER_START( dsoccr94 )
MDRV_IMPORT_FROM(firebarr) MDRV_IMPORT_FROM(firebarr)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_REPLACE("main", V33, 20000000/2) /* NEC V33, Could be 28MHz clock? */ MDRV_CPU_REPLACE("main", V33, 20000000/2) /* NEC V33, Could be 28MHz clock? */
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(dsoccr94_config)
/* video hardware */ /* video hardware */
MDRV_GFXDECODE(m107) MDRV_GFXDECODE(m107)
MACHINE_DRIVER_END MACHINE_DRIVER_END
static const nec_config wpksoc_config ={ leagueman_decryption_table, };
static MACHINE_DRIVER_START( wpksoc )
MDRV_IMPORT_FROM(firebarr)
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(wpksoc_config)
MACHINE_DRIVER_END
/***************************************************************************/ /***************************************************************************/
ROM_START( firebarr ) ROM_START( firebarr )
@ -632,8 +646,6 @@ static DRIVER_INIT( firebarr )
RAM = memory_region(REGION_CPU2); RAM = memory_region(REGION_CPU2);
memcpy(RAM+0xffff0,RAM+0x1fff0,0x10); /* Sound cpu Start vector */ memcpy(RAM+0xffff0,RAM+0x1fff0,0x10); /* Sound cpu Start vector */
irem_cpu_decrypt(1,rtypeleo_decryption_table);
m107_irq_vectorbase=0x20; m107_irq_vectorbase=0x20;
m107_spritesystem = 1; m107_spritesystem = 1;
} }
@ -648,8 +660,6 @@ static DRIVER_INIT( dsoccr94 )
RAM = memory_region(REGION_CPU2); RAM = memory_region(REGION_CPU2);
memcpy(RAM+0xffff0,RAM+0x1fff0,0x10); /* Sound cpu Start vector */ memcpy(RAM+0xffff0,RAM+0x1fff0,0x10); /* Sound cpu Start vector */
irem_cpu_decrypt(1,dsoccr94_decryption_table);
m107_irq_vectorbase=0x80; m107_irq_vectorbase=0x80;
m107_spritesystem = 0; m107_spritesystem = 0;
} }
@ -664,7 +674,6 @@ static DRIVER_INIT( wpksoc )
RAM = memory_region(REGION_CPU2); RAM = memory_region(REGION_CPU2);
memcpy(RAM+0xffff0,RAM+0x1fff0,0x10); /* Sound cpu Start vector */ memcpy(RAM+0xffff0,RAM+0x1fff0,0x10); /* Sound cpu Start vector */
irem_cpu_decrypt(1,leagueman_decryption_table);
m107_irq_vectorbase=0x80; m107_irq_vectorbase=0x80;
m107_spritesystem = 0; m107_spritesystem = 0;
@ -672,6 +681,6 @@ static DRIVER_INIT( wpksoc )
/***************************************************************************/ /***************************************************************************/
GAME( 1993, firebarr, 0, firebarr, firebarr, firebarr, ROT270, "Irem", "Fire Barrel (Japan)", GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS ) GAME( 1993, firebarr, 0, firebarr, firebarr, firebarr, ROT270, "Irem", "Fire Barrel (Japan)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS )
GAME( 1994, dsoccr94, 0, dsoccr94, dsoccr94, dsoccr94, ROT0, "Irem (Data East Corporation license)", "Dream Soccer '94", 0 ) GAME( 1994, dsoccr94, 0, dsoccr94, dsoccr94, dsoccr94, ROT0, "Irem (Data East Corporation license)", "Dream Soccer '94", 0 )
GAME( 1995, wpksoc, 0, firebarr, wpksoc, wpksoc, ROT0, "Jaleco", "World PK Soccer", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS ) GAME( 1995, wpksoc, 0, wpksoc, wpksoc, wpksoc, ROT0, "Jaleco", "World PK Soccer", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )

View File

@ -76,6 +76,7 @@ kengo 0x18 --------------
#include "sound/dac.h" #include "sound/dac.h"
#include "sound/2151intf.h" #include "sound/2151intf.h"
#include "m72.h" #include "m72.h"
#include "cpu/nec/nec.h"
#define MASTER_CLOCK XTAL_32MHz #define MASTER_CLOCK XTAL_32MHz
@ -1920,11 +1921,11 @@ static const struct YM2151interface ym2151_interface =
static MACHINE_DRIVER_START( rtype ) static MACHINE_DRIVER_START( rtype )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */ MDRV_CPU_ADD_TAG("main",V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(rtype_map,0) MDRV_CPU_PROGRAM_MAP(rtype_map,0)
MDRV_CPU_IO_MAP(m72_portmap,0) MDRV_CPU_IO_MAP(m72_portmap,0)
MDRV_CPU_ADD(Z80, SOUND_CLOCK) MDRV_CPU_ADD_TAG("sound",Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_ram_map,0) MDRV_CPU_PROGRAM_MAP(sound_ram_map,0)
MDRV_CPU_IO_MAP(sound_portmap,0) MDRV_CPU_IO_MAP(sound_portmap,0)
/* IRQs are generated by main Z80 and YM2151 */ /* IRQs are generated by main Z80 and YM2151 */
@ -1986,11 +1987,11 @@ ADDRESS_MAP_END
static MACHINE_DRIVER_START( m72 ) static MACHINE_DRIVER_START( m72 )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */ MDRV_CPU_ADD_TAG("main",V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(m72_map,0) MDRV_CPU_PROGRAM_MAP(m72_map,0)
MDRV_CPU_IO_MAP(m72_portmap,0) MDRV_CPU_IO_MAP(m72_portmap,0)
MDRV_CPU_ADD(Z80, SOUND_CLOCK) MDRV_CPU_ADD_TAG("sound",Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_ram_map,0) MDRV_CPU_PROGRAM_MAP(sound_ram_map,0)
MDRV_CPU_IO_MAP(sound_portmap,0) MDRV_CPU_IO_MAP(sound_portmap,0)
MDRV_CPU_VBLANK_INT(fake_nmi,128) /* clocked by V1? (Vigilante) */ MDRV_CPU_VBLANK_INT(fake_nmi,128) /* clocked by V1? (Vigilante) */
@ -2027,7 +2028,7 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( m72_8751 ) static MACHINE_DRIVER_START( m72_8751 )
MDRV_IMPORT_FROM(m72) MDRV_IMPORT_FROM(m72)
MDRV_CPU_ADD(I8751, 8000000) MDRV_CPU_ADD_TAG("mcu",I8751, 8000000)
MDRV_CPU_PROGRAM_MAP(mcu_map,0) MDRV_CPU_PROGRAM_MAP(mcu_map,0)
MDRV_CPU_DATA_MAP(mcu_data_map,0) MDRV_CPU_DATA_MAP(mcu_data_map,0)
MDRV_CPU_VBLANK_INT(irq0_line_pulse,1) MDRV_CPU_VBLANK_INT(irq0_line_pulse,1)
@ -2037,11 +2038,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( dkgenm72 ) static MACHINE_DRIVER_START( dkgenm72 )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */ MDRV_CPU_ADD_TAG("main",V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(m72_map,0) MDRV_CPU_PROGRAM_MAP(m72_map,0)
MDRV_CPU_IO_MAP(m72_portmap,0) MDRV_CPU_IO_MAP(m72_portmap,0)
MDRV_CPU_ADD(Z80, SOUND_CLOCK) MDRV_CPU_ADD_TAG("sound",Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_ram_map,0) MDRV_CPU_PROGRAM_MAP(sound_ram_map,0)
MDRV_CPU_IO_MAP(sound_portmap,0) MDRV_CPU_IO_MAP(sound_portmap,0)
MDRV_CPU_VBLANK_INT(fake_nmi,128) /* clocked by V1? (Vigilante) */ MDRV_CPU_VBLANK_INT(fake_nmi,128) /* clocked by V1? (Vigilante) */
@ -2079,11 +2080,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( xmultipl ) static MACHINE_DRIVER_START( xmultipl )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */ MDRV_CPU_ADD_TAG("main",V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(xmultipl_map,0) MDRV_CPU_PROGRAM_MAP(xmultipl_map,0)
MDRV_CPU_IO_MAP(m72_portmap,0) MDRV_CPU_IO_MAP(m72_portmap,0)
MDRV_CPU_ADD(Z80, SOUND_CLOCK) MDRV_CPU_ADD_TAG("sound",Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_ram_map,0) MDRV_CPU_PROGRAM_MAP(sound_ram_map,0)
MDRV_CPU_IO_MAP(sound_portmap,0) MDRV_CPU_IO_MAP(sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */ MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2121,11 +2122,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( dbreed ) static MACHINE_DRIVER_START( dbreed )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */ MDRV_CPU_ADD_TAG("main",V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(dbreed_map,0) MDRV_CPU_PROGRAM_MAP(dbreed_map,0)
MDRV_CPU_IO_MAP(hharry_portmap,0) MDRV_CPU_IO_MAP(hharry_portmap,0)
MDRV_CPU_ADD(Z80, SOUND_CLOCK) MDRV_CPU_ADD_TAG("sound",Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0) MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(rtype2_sound_portmap,0) MDRV_CPU_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */ MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2162,11 +2163,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( dbreed72 ) static MACHINE_DRIVER_START( dbreed72 )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */ MDRV_CPU_ADD_TAG("main", V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(dbreed72_map,0) MDRV_CPU_PROGRAM_MAP(dbreed72_map,0)
MDRV_CPU_IO_MAP(m72_portmap,0) MDRV_CPU_IO_MAP(m72_portmap,0)
MDRV_CPU_ADD(Z80, SOUND_CLOCK) MDRV_CPU_ADD_TAG("sound", Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_ram_map,0) MDRV_CPU_PROGRAM_MAP(sound_ram_map,0)
MDRV_CPU_IO_MAP(sound_portmap,0) MDRV_CPU_IO_MAP(sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */ MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2204,11 +2205,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( rtype2 ) static MACHINE_DRIVER_START( rtype2 )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */ MDRV_CPU_ADD_TAG("main", V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(rtype2_map,0) MDRV_CPU_PROGRAM_MAP(rtype2_map,0)
MDRV_CPU_IO_MAP(rtype2_portmap,0) MDRV_CPU_IO_MAP(rtype2_portmap,0)
MDRV_CPU_ADD(Z80, SOUND_CLOCK) MDRV_CPU_ADD_TAG("sound", Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0) MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(rtype2_sound_portmap,0) MDRV_CPU_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */ MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2245,11 +2246,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( majtitle ) static MACHINE_DRIVER_START( majtitle )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */ MDRV_CPU_ADD_TAG("main", V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(majtitle_map,0) MDRV_CPU_PROGRAM_MAP(majtitle_map,0)
MDRV_CPU_IO_MAP(majtitle_portmap,0) MDRV_CPU_IO_MAP(majtitle_portmap,0)
MDRV_CPU_ADD(Z80, SOUND_CLOCK) MDRV_CPU_ADD_TAG("sound", Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0) MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(rtype2_sound_portmap,0) MDRV_CPU_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */ MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2286,11 +2287,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( hharry ) static MACHINE_DRIVER_START( hharry )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */ MDRV_CPU_ADD_TAG("main", V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(hharry_map,0) MDRV_CPU_PROGRAM_MAP(hharry_map,0)
MDRV_CPU_IO_MAP(hharry_portmap,0) MDRV_CPU_IO_MAP(hharry_portmap,0)
MDRV_CPU_ADD(Z80, SOUND_CLOCK) MDRV_CPU_ADD_TAG("sound", Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0) MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(rtype2_sound_portmap,0) MDRV_CPU_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */ MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2328,11 +2329,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( hharryu ) static MACHINE_DRIVER_START( hharryu )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */ MDRV_CPU_ADD_TAG("main", V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(hharryu_map,0) MDRV_CPU_PROGRAM_MAP(hharryu_map,0)
MDRV_CPU_IO_MAP(rtype2_portmap,0) MDRV_CPU_IO_MAP(rtype2_portmap,0)
MDRV_CPU_ADD(Z80, SOUND_CLOCK) MDRV_CPU_ADD_TAG("sound", Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0) MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(rtype2_sound_portmap,0) MDRV_CPU_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */ MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2370,11 +2371,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( poundfor ) static MACHINE_DRIVER_START( poundfor )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */ MDRV_CPU_ADD_TAG("main", V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(rtype2_map,0) MDRV_CPU_PROGRAM_MAP(rtype2_map,0)
MDRV_CPU_IO_MAP(poundfor_portmap,0) MDRV_CPU_IO_MAP(poundfor_portmap,0)
MDRV_CPU_ADD(Z80, SOUND_CLOCK) MDRV_CPU_ADD_TAG("sound", Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0) MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(poundfor_sound_portmap,0) MDRV_CPU_IO_MAP(poundfor_sound_portmap,0)
MDRV_CPU_VBLANK_INT(fake_nmi,128) /* clocked by V1? (Vigilante) */ MDRV_CPU_VBLANK_INT(fake_nmi,128) /* clocked by V1? (Vigilante) */
@ -2408,14 +2409,14 @@ static MACHINE_DRIVER_START( poundfor )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.40) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.40)
MACHINE_DRIVER_END MACHINE_DRIVER_END
static MACHINE_DRIVER_START( kengo ) static MACHINE_DRIVER_START( cosmccop )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */ MDRV_CPU_ADD_TAG("main", V30,MASTER_CLOCK/2/2)
MDRV_CPU_PROGRAM_MAP(kengo_map,0) MDRV_CPU_PROGRAM_MAP(kengo_map,0)
MDRV_CPU_IO_MAP(kengo_portmap,0) MDRV_CPU_IO_MAP(kengo_portmap,0)
MDRV_CPU_ADD(Z80, SOUND_CLOCK) MDRV_CPU_ADD_TAG("sound", Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0) MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(rtype2_sound_portmap,0) MDRV_CPU_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */ MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2449,6 +2450,12 @@ static MACHINE_DRIVER_START( kengo )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.40) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.40)
MACHINE_DRIVER_END MACHINE_DRIVER_END
static const nec_config kengo_config ={ gunforce_decryption_table, };
static MACHINE_DRIVER_START( kengo )
MDRV_IMPORT_FROM( cosmccop )
MDRV_CPU_MODIFY("main")
MDRV_CPU_CONFIG(kengo_config)
MACHINE_DRIVER_END
/*************************************************************************** /***************************************************************************
@ -3539,12 +3546,6 @@ ROM_END
static DRIVER_INIT( kengo )
{
irem_cpu_decrypt(0,gunforce_decryption_table);
}
GAME( 1987, rtype, 0, rtype, rtype, 0, ROT0, "Irem", "R-Type (World)", GAME_NO_COCKTAIL ) GAME( 1987, rtype, 0, rtype, rtype, 0, ROT0, "Irem", "R-Type (World)", GAME_NO_COCKTAIL )
GAME( 1987, rtypej, rtype, rtype, rtypep, 0, ROT0, "Irem", "R-Type (Japan)", GAME_NO_COCKTAIL ) GAME( 1987, rtypej, rtype, rtype, rtypep, 0, ROT0, "Irem", "R-Type (Japan)", GAME_NO_COCKTAIL )
@ -3573,6 +3574,6 @@ GAME( 1990, poundfor, 0, poundfor, poundfor, 0, ROT270, "Irem", "P
GAME( 1990, poundfoj, poundfor, poundfor, poundfor, 0, ROT270, "Irem", "Pound for Pound (Japan)", GAME_NO_COCKTAIL ) GAME( 1990, poundfoj, poundfor, poundfor, poundfor, 0, ROT270, "Irem", "Pound for Pound (Japan)", GAME_NO_COCKTAIL )
GAME( 1990, poundfou, poundfor, poundfor, poundfor, 0, ROT270, "Irem America", "Pound for Pound (US)", GAME_NO_COCKTAIL ) GAME( 1990, poundfou, poundfor, poundfor, poundfor, 0, ROT270, "Irem America", "Pound for Pound (US)", GAME_NO_COCKTAIL )
GAME( 1990, airduel, 0, m72, airduel, airduel, ROT270, "Irem", "Air Duel (Japan)", 0 ) GAME( 1990, airduel, 0, m72, airduel, airduel, ROT270, "Irem", "Air Duel (Japan)", 0 )
GAME( 1991, cosmccop, 0, kengo, gallop, 0, ROT0, "Irem", "Cosmic Cop (World)", GAME_NO_COCKTAIL ) GAME( 1991, cosmccop, 0, cosmccop, gallop, 0, ROT0, "Irem", "Cosmic Cop (World)", GAME_NO_COCKTAIL )
GAME( 1991, gallop, cosmccop, m72, gallop, gallop, ROT0, "Irem", "Gallop - Armed police Unit (Japan)", GAME_NO_COCKTAIL ) GAME( 1991, gallop, cosmccop, m72, gallop, gallop, ROT0, "Irem", "Gallop - Armed police Unit (Japan)", GAME_NO_COCKTAIL )
GAME( 1991, kengo, 0, kengo, kengo, kengo, ROT0, "Irem", "Ken-Go", GAME_NO_COCKTAIL ) GAME( 1991, kengo, 0, kengo, kengo, 0, ROT0, "Irem", "Ken-Go", GAME_NO_COCKTAIL )

View File

@ -22,10 +22,6 @@ Notes:
selection moves too fast with the clock set at 16 MHz. It's still fast at selection moves too fast with the clock set at 16 MHz. It's still fast at
8 MHz, but at least it's usable. 8 MHz, but at least it's usable.
- Probably all games use a nec V35+ cpu: for gussun and risky challenge
we need a proper V35+ core for the use of the 0x63 instruction (brkn, to call a unencrypted
routine from encrypted code); for simulate the instruction there's an hack (m90_game_kludge).
*****************************************************************************/ *****************************************************************************/
#include "driver.h" #include "driver.h"
@ -34,13 +30,12 @@ Notes:
#include "audio/m72.h" #include "audio/m72.h"
#include "sound/dac.h" #include "sound/dac.h"
#include "sound/2151intf.h" #include "sound/2151intf.h"
#include "cpu/nec/nec.h"
static UINT32 bankaddress; static UINT32 bankaddress;
extern UINT16 *m90_video_data; extern UINT16 *m90_video_data;
extern int m90_game_kludge;
VIDEO_UPDATE( m90 ); VIDEO_UPDATE( m90 );
VIDEO_UPDATE( m90_bootleg ); VIDEO_UPDATE( m90_bootleg );
WRITE16_HANDLER( m90_video_control_w ); WRITE16_HANDLER( m90_video_control_w );
@ -654,11 +649,10 @@ static INTERRUPT_GEN( bomblord_interrupt )
} }
/* Basic hardware -- no decryption table is setup for CPU */
static MACHINE_DRIVER_START( m90 ) static MACHINE_DRIVER_START( m90 )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 8 MHz ??????? */ MDRV_CPU_ADD_TAG("main", V30,32000000/4)
MDRV_CPU_PROGRAM_MAP(main_cpu,0) MDRV_CPU_PROGRAM_MAP(main_cpu,0)
MDRV_CPU_IO_MAP(main_cpu_io,0) MDRV_CPU_IO_MAP(main_cpu_io,0)
MDRV_CPU_VBLANK_INT(m90_interrupt,1) MDRV_CPU_VBLANK_INT(m90_interrupt,1)
@ -697,18 +691,47 @@ static MACHINE_DRIVER_START( m90 )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
MACHINE_DRIVER_END MACHINE_DRIVER_END
static MACHINE_DRIVER_START( quizf1 )
static const nec_config hasamu_config ={ gunforce_decryption_table, };
static MACHINE_DRIVER_START( hasamu )
MDRV_IMPORT_FROM( m90 ) MDRV_IMPORT_FROM( m90 )
MDRV_SCREEN_VISIBLE_AREA(6*8, 54*8-1, 17*8-8, 47*8-1+8) MDRV_CPU_MODIFY("main")
MDRV_CPU_CONFIG(hasamu_config)
MACHINE_DRIVER_END
static const nec_config quizf1_config ={ lethalth_decryption_table, };
static MACHINE_DRIVER_START( quizf1 )
MDRV_IMPORT_FROM( m90 )
MDRV_CPU_MODIFY("main")
MDRV_CPU_CONFIG(quizf1_config)
MDRV_SCREEN_VISIBLE_AREA(6*8, 54*8-1, 17*8-8, 47*8-1+8)
MACHINE_DRIVER_END
static const nec_config matchit2_config ={ matchit2_decryption_table, };
static MACHINE_DRIVER_START( matchit2 )
MDRV_IMPORT_FROM( m90 )
MDRV_CPU_MODIFY("main")
MDRV_CPU_CONFIG(matchit2_config)
MDRV_SCREEN_VISIBLE_AREA(6*8, 54*8-1, 17*8-8, 47*8-1+8)
MACHINE_DRIVER_END MACHINE_DRIVER_END
static const nec_config riskchal_config ={ gussun_decryption_table, };
static MACHINE_DRIVER_START( riskchal )
MDRV_IMPORT_FROM( m90 )
MDRV_CPU_MODIFY("main")
MDRV_CPU_CONFIG(riskchal_config)
MDRV_SCREEN_VISIBLE_AREA(10*8, 50*8-1, 17*8, 47*8-1)
MACHINE_DRIVER_END
static const nec_config bomberman_config ={ bomberman_decryption_table, };
static MACHINE_DRIVER_START( bombrman ) static MACHINE_DRIVER_START( bombrman )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 8 MHz ??????? */ MDRV_CPU_ADD_TAG("main", V30,32000000/4)
MDRV_CPU_CONFIG(bomberman_config)
MDRV_CPU_PROGRAM_MAP(main_cpu,0) MDRV_CPU_PROGRAM_MAP(main_cpu,0)
MDRV_CPU_IO_MAP(main_cpu_io,0) MDRV_CPU_IO_MAP(main_cpu_io,0)
MDRV_CPU_VBLANK_INT(m90_interrupt,1) MDRV_CPU_VBLANK_INT(m90_interrupt,1)
@ -746,11 +769,14 @@ static MACHINE_DRIVER_START( bombrman )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
MACHINE_DRIVER_END MACHINE_DRIVER_END
static const nec_config dynablaster_config ={ dynablaster_decryption_table, };
static MACHINE_DRIVER_START( bbmanw ) static MACHINE_DRIVER_START( bbmanw )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD_TAG("main",V30,32000000/4) /* 8 MHz ??????? */ MDRV_CPU_ADD_TAG("main", V30,32000000/4)
MDRV_CPU_CONFIG(dynablaster_config)
MDRV_CPU_PROGRAM_MAP(main_cpu,0) MDRV_CPU_PROGRAM_MAP(main_cpu,0)
MDRV_CPU_IO_MAP(main_cpu_io,0) MDRV_CPU_IO_MAP(main_cpu_io,0)
MDRV_CPU_VBLANK_INT(m90_interrupt,1) MDRV_CPU_VBLANK_INT(m90_interrupt,1)
@ -788,18 +814,25 @@ static MACHINE_DRIVER_START( bbmanw )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
MACHINE_DRIVER_END MACHINE_DRIVER_END
static const nec_config no_table ={ NULL, };
static MACHINE_DRIVER_START( bomblord ) static MACHINE_DRIVER_START( bomblord )
MDRV_IMPORT_FROM( bbmanw ) MDRV_IMPORT_FROM( bbmanw )
MDRV_CPU_MODIFY("main") MDRV_CPU_MODIFY("main")
MDRV_CPU_CONFIG(no_table)
MDRV_CPU_VBLANK_INT(bomblord_interrupt,1) MDRV_CPU_VBLANK_INT(bomblord_interrupt,1)
MACHINE_DRIVER_END MACHINE_DRIVER_END
static MACHINE_DRIVER_START( bootleg ) static MACHINE_DRIVER_START( bootleg )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 16 MHz */ MDRV_CPU_ADD_TAG("main", V30,32000000/4)
MDRV_CPU_PROGRAM_MAP(bootleg_main_cpu,0) MDRV_CPU_PROGRAM_MAP(bootleg_main_cpu,0)
MDRV_CPU_IO_MAP(main_cpu_io,0) MDRV_CPU_IO_MAP(main_cpu_io,0)
MDRV_CPU_VBLANK_INT(m90_interrupt,1) MDRV_CPU_VBLANK_INT(m90_interrupt,1)
@ -1113,49 +1146,10 @@ ROM_END
static DRIVER_INIT( hasamu )
{
m90_game_kludge=0;
irem_cpu_decrypt(0,gunforce_decryption_table);
}
static DRIVER_INIT( bombrman )
{
m90_game_kludge=0;
irem_cpu_decrypt(0,bomberman_decryption_table);
}
/* Bomberman World executes encrypted code from RAM! */
static UINT16 *bbmanw_ram_base;
extern UINT8 *irem_cpu_decrypted;
static WRITE16_HANDLER( bbmanw_ram_write )
{
COMBINE_DATA(&bbmanw_ram_base[offset]);
if (ACCESSING_LSB)
irem_cpu_decrypted[0xa0c00+offset*2]=dynablaster_decryption_table[data & 0xff];
if (ACCESSING_MSB)
irem_cpu_decrypted[0xa0c00+offset*2+1]=dynablaster_decryption_table[(data >> 8) & 0xff];
}
static READ16_HANDLER( bbmanw_ram_read )
{
return bbmanw_ram_base[offset];
}
static DRIVER_INIT( bbmanw )
{
m90_game_kludge=0;
irem_cpu_decrypt(0,dynablaster_decryption_table);
bbmanw_ram_base = memory_install_write16_handler(0, ADDRESS_SPACE_PROGRAM, 0xa0c00, 0xa0cff, 0, 0, bbmanw_ram_write);
memory_install_read16_handler(0, ADDRESS_SPACE_PROGRAM, 0xa0c00, 0xa0cff, 0, 0, bbmanw_ram_read);
}
static DRIVER_INIT( quizf1 ) static DRIVER_INIT( quizf1 )
{ {
m90_game_kludge=0;
irem_cpu_decrypt(0,lethalth_decryption_table);
bankaddress = 0; bankaddress = 0;
set_m90_bank(); set_m90_bank();
@ -1163,30 +1157,13 @@ static DRIVER_INIT( quizf1 )
state_save_register_func_postload(set_m90_bank); state_save_register_func_postload(set_m90_bank);
} }
static DRIVER_INIT( riskchal )
{
m90_game_kludge=1;
irem_cpu_decrypt(0,gussun_decryption_table);
}
static DRIVER_INIT( gussun )
{
m90_game_kludge=2;
irem_cpu_decrypt(0,gussun_decryption_table);
}
static DRIVER_INIT( matchit2 )
{
m90_game_kludge=0;
irem_cpu_decrypt(0,matchit2_decryption_table);
}
static DRIVER_INIT( bomblord ) static DRIVER_INIT( bomblord )
{ {
UINT8 *RAM = memory_region(REGION_CPU1); UINT8 *RAM = memory_region(REGION_CPU1);
int i; int i;
m90_game_kludge=0;
for (i=0; i<0x100000; i+=8) for (i=0; i<0x100000; i+=8)
{ {
RAM[i+0]=BITSWAP8(RAM[i+0], 6, 4, 7, 3, 1, 2, 0, 5); RAM[i+0]=BITSWAP8(RAM[i+0], 6, 4, 7, 3, 1, 2, 0, 5);
@ -1202,17 +1179,17 @@ static DRIVER_INIT( bomblord )
GAME( 1991, hasamu, 0, m90, hasamu, hasamu, ROT0, "Irem", "Hasamu (Japan)", GAME_NO_COCKTAIL ) GAME( 1991, hasamu, 0, hasamu, hasamu, 0, ROT0, "Irem", "Hasamu (Japan)", GAME_NO_COCKTAIL )
GAME( 1991, dynablst, 0, bombrman, dynablst, bombrman, ROT0, "Irem (licensed from Hudson Soft)", "Dynablaster / Bomber Man", GAME_NO_COCKTAIL ) GAME( 1991, dynablst, 0, bombrman, dynablst, 0, ROT0, "Irem (licensed from Hudson Soft)", "Dynablaster / Bomber Man", GAME_NO_COCKTAIL )
GAME( 1991, bombrman, dynablst, bombrman, bombrman, bombrman, ROT0, "Irem (licensed from Hudson Soft)", "Bomber Man (Japan)", GAME_NO_COCKTAIL ) GAME( 1991, bombrman, dynablst, bombrman, bombrman, 0, ROT0, "Irem (licensed from Hudson Soft)", "Bomber Man (Japan)", GAME_NO_COCKTAIL )
GAME( 1991, atompunk, dynablst, bombrman, atompunk, bombrman, ROT0, "Irem America (licensed from Hudson Soft)", "Atomic Punk (US)", GAME_NO_COCKTAIL ) GAME( 1991, atompunk, dynablst, bombrman, atompunk, 0, ROT0, "Irem America (licensed from Hudson Soft)", "Atomic Punk (US)", GAME_NO_COCKTAIL )
GAME( 1991, dynablsb, dynablst, bootleg, bombrman, 0, ROT0, "bootleg", "Dynablaster (bootleg)", GAME_NOT_WORKING | GAME_NO_COCKTAIL ) GAME( 1991, dynablsb, dynablst, bootleg, bombrman, 0, ROT0, "bootleg", "Dynablaster (bootleg)", GAME_NOT_WORKING | GAME_NO_COCKTAIL )
GAME( 1992, bbmanw, 0, bbmanw, bbmanw, bbmanw, ROT0, "Irem", "Bomber Man World / New Dyna Blaster - Global Quest", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL ) GAME( 1992, bbmanw, 0, bbmanw, bbmanw, 0, ROT0, "Irem", "Bomber Man World / New Dyna Blaster - Global Quest", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL )
GAME( 1992, bbmanwj, bbmanw, bombrman, bbmanwj, bbmanw, ROT0, "Irem", "Bomber Man World (Japan)", GAME_NO_COCKTAIL ) GAME( 1992, bbmanwj, bbmanw, bbmanw, bbmanwj, 0, ROT0, "Irem", "Bomber Man World (Japan)", GAME_NO_COCKTAIL )
GAME( 1992, newapunk, bbmanw, bbmanw, bbmanwj, bbmanw, ROT0, "Irem America", "New Atomic Punk - Global Quest (US)", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL ) GAME( 1992, newapunk, bbmanw, bbmanw, bbmanwj, 0, ROT0, "Irem America", "New Atomic Punk - Global Quest (US)", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL )
GAME( 1992, bomblord, bbmanw, bomblord, bbmanw, bomblord, ROT0, "bootleg", "Bomber Lord (bootleg)", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL | GAME_NOT_WORKING ) GAME( 1992, bomblord, bbmanw, bomblord, bbmanw, bomblord, ROT0, "bootleg", "Bomber Lord (bootleg)", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL | GAME_NOT_WORKING )
GAME( 1992, quizf1, 0, quizf1, quizf1, quizf1, ROT0, "Irem", "Quiz F-1 1,2finish", GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) GAME( 1992, quizf1, 0, quizf1, quizf1, quizf1, ROT0, "Irem", "Quiz F-1 1,2finish", GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL )
GAME( 1993, riskchal, 0, m90, riskchal, riskchal, ROT0, "Irem", "Risky Challenge", GAME_NOT_WORKING | GAME_NO_COCKTAIL ) GAME( 1993, riskchal, 0, riskchal, riskchal, 0, ROT0, "Irem", "Risky Challenge", GAME_IMPERFECT_GRAPHICS )
GAME( 1993, gussun, riskchal, m90, riskchal, gussun, ROT0, "Irem", "Gussun Oyoyo (Japan)", GAME_NOT_WORKING | GAME_NO_COCKTAIL ) GAME( 1993, gussun, riskchal, riskchal, riskchal, 0, ROT0, "Irem", "Gussun Oyoyo (Japan)", GAME_IMPERFECT_GRAPHICS )
GAME( 1993, matchit2, 0, quizf1, matchit2, matchit2, ROT0, "Tamtex", "Match It II", GAME_NO_COCKTAIL ) GAME( 1993, matchit2, 0, matchit2, matchit2, 0, ROT0, "Tamtex", "Match It II", GAME_NO_COCKTAIL )
GAME( 1993, shisen2, matchit2, quizf1, shisen2, matchit2, ROT0, "Tamtex", "Shisensho II", GAME_NO_COCKTAIL ) GAME( 1993, shisen2, matchit2, matchit2, shisen2, 0, ROT0, "Tamtex", "Shisensho II", GAME_NO_COCKTAIL )

View File

@ -195,6 +195,7 @@ Notes:
#include "machine/irem_cpu.h" #include "machine/irem_cpu.h"
#include "sound/2151intf.h" #include "sound/2151intf.h"
#include "sound/iremga20.h" #include "sound/iremga20.h"
#include "cpu/nec/nec.h"
static UINT8 irqvector; static UINT8 irqvector;
static UINT16 sound_status; static UINT16 sound_status;
@ -958,7 +959,7 @@ static MACHINE_DRIVER_START( m92 )
MDRV_CPU_PROGRAM_MAP(m92_map,0) MDRV_CPU_PROGRAM_MAP(m92_map,0)
MDRV_CPU_IO_MAP(m92_portmap,0) MDRV_CPU_IO_MAP(m92_portmap,0)
MDRV_CPU_ADD(V30, 14318180/2) /* 14.31818 MHz */ MDRV_CPU_ADD_TAG("sound" ,V30, 14318180/2) /* 14.31818 MHz */
MDRV_CPU_PROGRAM_MAP(sound_map,0) MDRV_CPU_PROGRAM_MAP(sound_map,0)
MDRV_MACHINE_START(m92) MDRV_MACHINE_START(m92)
@ -991,22 +992,107 @@ static MACHINE_DRIVER_START( m92 )
MACHINE_DRIVER_END MACHINE_DRIVER_END
static const nec_config gunforce_config ={ gunforce_decryption_table, };
static MACHINE_DRIVER_START( gunforce )
MDRV_IMPORT_FROM( m92 )
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(gunforce_config)
MACHINE_DRIVER_END
static const nec_config bmaster_config ={ bomberman_decryption_table, };
static MACHINE_DRIVER_START( bmaster )
MDRV_IMPORT_FROM( m92 )
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(bmaster_config)
MACHINE_DRIVER_END
static const nec_config lethalth_config ={ lethalth_decryption_table, };
static MACHINE_DRIVER_START( lethalth ) static MACHINE_DRIVER_START( lethalth )
MDRV_IMPORT_FROM(m92) MDRV_IMPORT_FROM(m92)
/* basic machine hardware */
MDRV_CPU_MODIFY("main") MDRV_CPU_MODIFY("main")
MDRV_CPU_PROGRAM_MAP(lethalth_map,0) MDRV_CPU_PROGRAM_MAP(lethalth_map,0)
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(lethalth_config)
MACHINE_DRIVER_END
static const nec_config uccops_config ={ dynablaster_decryption_table, };
static MACHINE_DRIVER_START( uccops )
MDRV_IMPORT_FROM(m92)
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(uccops_config)
MACHINE_DRIVER_END
static const nec_config mysticri_config ={ mysticri_decryption_table, };
static MACHINE_DRIVER_START( mysticri )
MDRV_IMPORT_FROM(m92)
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(mysticri_config)
MACHINE_DRIVER_END
static const nec_config majtitl2_config ={ majtitl2_decryption_table, };
static MACHINE_DRIVER_START( majtitl2 )
MDRV_IMPORT_FROM(m92)
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(majtitl2_config)
MACHINE_DRIVER_END
static const nec_config hook_config ={ hook_decryption_table, };
static MACHINE_DRIVER_START( hook )
MDRV_IMPORT_FROM(m92)
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(hook_config)
MACHINE_DRIVER_END
static const nec_config rtypeleo_config ={ rtypeleo_decryption_table, };
static MACHINE_DRIVER_START( rtypeleo )
MDRV_IMPORT_FROM(m92)
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(rtypeleo_config)
MACHINE_DRIVER_END MACHINE_DRIVER_END
static const nec_config inthunt_config ={ inthunt_decryption_table, };
static MACHINE_DRIVER_START( inthunt )
MDRV_IMPORT_FROM(m92)
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(inthunt_config)
MACHINE_DRIVER_END
static const nec_config nbbatman_config ={ leagueman_decryption_table, };
static MACHINE_DRIVER_START( nbbatman )
MDRV_IMPORT_FROM(m92)
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(nbbatman_config)
MACHINE_DRIVER_END
static const nec_config psoldier_config ={ psoldier_decryption_table, };
static MACHINE_DRIVER_START( psoldier ) static MACHINE_DRIVER_START( psoldier )
MDRV_IMPORT_FROM(m92) MDRV_IMPORT_FROM(m92)
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(psoldier_config)
/* video hardware */ /* video hardware */
MDRV_GFXDECODE(2) MDRV_GFXDECODE(2)
MACHINE_DRIVER_END MACHINE_DRIVER_END
static const nec_config dsoccr94_config ={ dsoccr94_decryption_table, };
static MACHINE_DRIVER_START( dsccr94j )
MDRV_IMPORT_FROM(m92)
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(dsoccr94_config)
/* video hardware */
MDRV_GFXDECODE(2)
MACHINE_DRIVER_END
static const nec_config gunforc2_config ={ lethalth_decryption_table, };
static MACHINE_DRIVER_START( gunforc2 )
MDRV_IMPORT_FROM(m92)
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(gunforc2_config)
MACHINE_DRIVER_END
/***************************************************************************/ /***************************************************************************/
ROM_START( bmaster ) /* M92-B-B PCB used for program rom locations */ ROM_START( bmaster ) /* M92-B-B PCB used for program rom locations */
@ -1899,7 +1985,7 @@ ROM_START( geostorm )
ROM_END ROM_END
static void init_m92(running_machine *machine, const UINT8 *decryption_table, int hasbanks) static void init_m92(running_machine *machine, int hasbanks)
{ {
UINT8 *RAM = memory_region(REGION_CPU1); UINT8 *RAM = memory_region(REGION_CPU1);
@ -1922,49 +2008,48 @@ static void init_m92(running_machine *machine, const UINT8 *decryption_table, in
m92_sprite_buffer_busy=1; m92_sprite_buffer_busy=1;
setvector_callback(machine, NULL, VECTOR_INIT); setvector_callback(machine, NULL, VECTOR_INIT);
irem_cpu_decrypt(1,decryption_table);
} }
static DRIVER_INIT( bmaster ) static DRIVER_INIT( bmaster )
{ {
init_m92(machine, bomberman_decryption_table, 1); init_m92(machine, 1);
} }
static DRIVER_INIT( gunforce ) static DRIVER_INIT( gunforce )
{ {
init_m92(machine, gunforce_decryption_table, 1); init_m92(machine, 1);
} }
static DRIVER_INIT( hook ) static DRIVER_INIT( hook )
{ {
init_m92(machine, hook_decryption_table, 1); init_m92(machine, 1);
} }
static DRIVER_INIT( mysticri ) static DRIVER_INIT( mysticri )
{ {
init_m92(machine, mysticri_decryption_table, 1); init_m92(machine, 1);
} }
static DRIVER_INIT( uccops ) static DRIVER_INIT( uccops )
{ {
init_m92(machine, dynablaster_decryption_table, 1); init_m92(machine, 1);
} }
static DRIVER_INIT( rtypeleo ) static DRIVER_INIT( rtypeleo )
{ {
init_m92(machine, rtypeleo_decryption_table, 1); init_m92(machine, 1);
m92_irq_vectorbase=0x20; m92_irq_vectorbase=0x20;
} }
static DRIVER_INIT( rtypelej ) static DRIVER_INIT( rtypelej )
{ {
init_m92(machine, rtypeleo_decryption_table, 1); init_m92(machine, 1);
m92_irq_vectorbase=0x20; m92_irq_vectorbase=0x20;
} }
static DRIVER_INIT( majtitl2 ) static DRIVER_INIT( majtitl2 )
{ {
init_m92(machine, majtitl2_decryption_table, 1); init_m92(machine, 1);
/* This game has an eprom on the game board */ /* This game has an eprom on the game board */
memory_install_read16_handler(0, ADDRESS_SPACE_PROGRAM, 0xf0000, 0xf3fff, 0, 0, m92_eeprom_r); memory_install_read16_handler(0, ADDRESS_SPACE_PROGRAM, 0xf0000, 0xf3fff, 0, 0, m92_eeprom_r);
@ -1975,18 +2060,18 @@ static DRIVER_INIT( majtitl2 )
static DRIVER_INIT( kaiteids ) static DRIVER_INIT( kaiteids )
{ {
init_m92(machine, inthunt_decryption_table, 1); init_m92(machine, 1);
} }
static DRIVER_INIT( inthunt ) static DRIVER_INIT( inthunt )
{ {
init_m92(machine, inthunt_decryption_table, 1); init_m92(machine, 1);
} }
static DRIVER_INIT( lethalth ) static DRIVER_INIT( lethalth )
{ {
init_m92(machine, lethalth_decryption_table, 0); init_m92(machine, 0);
m92_irq_vectorbase=0x20; m92_irq_vectorbase=0x20;
/* NOP out the bankswitcher */ /* NOP out the bankswitcher */
@ -1997,14 +2082,14 @@ static DRIVER_INIT( nbbatman )
{ {
UINT8 *RAM = memory_region(REGION_CPU1); UINT8 *RAM = memory_region(REGION_CPU1);
init_m92(machine, leagueman_decryption_table, 1); init_m92(machine, 1);
memcpy(RAM+0x80000,RAM+0x100000,0x20000); memcpy(RAM+0x80000,RAM+0x100000,0x20000);
} }
static DRIVER_INIT( ssoldier ) static DRIVER_INIT( ssoldier )
{ {
init_m92(machine, psoldier_decryption_table, 1); init_m92(machine, 1);
m92_irq_vectorbase=0x20; m92_irq_vectorbase=0x20;
/* main CPU expects an answer even before writing the first command */ /* main CPU expects an answer even before writing the first command */
sound_status = 0x80; sound_status = 0x80;
@ -2012,7 +2097,7 @@ static DRIVER_INIT( ssoldier )
static DRIVER_INIT( psoldier ) static DRIVER_INIT( psoldier )
{ {
init_m92(machine, psoldier_decryption_table, 1); init_m92(machine, 1);
m92_irq_vectorbase=0x20; m92_irq_vectorbase=0x20;
/* main CPU expects an answer even before writing the first command */ /* main CPU expects an answer even before writing the first command */
sound_status = 0x80; sound_status = 0x80;
@ -2020,46 +2105,46 @@ static DRIVER_INIT( psoldier )
static DRIVER_INIT( dsccr94j ) static DRIVER_INIT( dsccr94j )
{ {
init_m92(machine, dsoccr94_decryption_table, 1); init_m92(machine, 1);
} }
static DRIVER_INIT( gunforc2 ) static DRIVER_INIT( gunforc2 )
{ {
UINT8 *RAM = memory_region(REGION_CPU1); UINT8 *RAM = memory_region(REGION_CPU1);
init_m92(machine, lethalth_decryption_table, 1); init_m92(machine, 1);
memcpy(RAM+0x80000,RAM+0x100000,0x20000); memcpy(RAM+0x80000,RAM+0x100000,0x20000);
} }
/***************************************************************************/ /***************************************************************************/
GAME( 1991, gunforce, 0, m92, gunforce, gunforce, ROT0, "Irem", "Gunforce - Battle Fire Engulfed Terror Island (World)", 0 ) GAME( 1991, gunforce, 0, gunforce, gunforce, gunforce, ROT0, "Irem", "Gunforce - Battle Fire Engulfed Terror Island (World)", 0 )
GAME( 1991, gunforcj, gunforce, m92, gunforce, gunforce, ROT0, "Irem", "Gunforce - Battle Fire Engulfed Terror Island (Japan)", 0 ) GAME( 1991, gunforcj, gunforce, gunforce, gunforce, gunforce, ROT0, "Irem", "Gunforce - Battle Fire Engulfed Terror Island (Japan)", 0 )
GAME( 1991, gunforcu, gunforce, m92, gunforce, gunforce, ROT0, "Irem America", "Gunforce - Battle Fire Engulfed Terror Island (US)", 0 ) GAME( 1991, gunforcu, gunforce, gunforce, gunforce, gunforce, ROT0, "Irem America", "Gunforce - Battle Fire Engulfed Terror Island (US)", 0 )
GAME( 1991, bmaster, 0, m92, bmaster, bmaster, ROT0, "Irem", "Blade Master (World)", 0 ) GAME( 1991, bmaster, 0, bmaster, bmaster, bmaster, ROT0, "Irem", "Blade Master (World)", 0 )
GAME( 1991, crossbld, bmaster, m92, bmaster, bmaster, ROT0, "Irem", "Cross Blades! (Japan)", 0 ) GAME( 1991, crossbld, bmaster, bmaster, bmaster, bmaster, ROT0, "Irem", "Cross Blades! (Japan)", 0 )
GAME( 1991, lethalth, 0, lethalth, lethalth, lethalth, ROT270, "Irem", "Lethal Thunder (World)", 0 ) GAME( 1991, lethalth, 0, lethalth, lethalth, lethalth, ROT270, "Irem", "Lethal Thunder (World)", 0 )
GAME( 1991, thndblst, lethalth, lethalth, lethalth, lethalth, ROT270, "Irem", "Thunder Blaster (Japan)", 0 ) GAME( 1991, thndblst, lethalth, lethalth, lethalth, lethalth, ROT270, "Irem", "Thunder Blaster (Japan)", 0 )
GAME( 1992, uccops, 0, m92, uccops, uccops, ROT0, "Irem", "Undercover Cops (World)", 0 ) GAME( 1992, uccops, 0, uccops, uccops, uccops, ROT0, "Irem", "Undercover Cops (World)", 0 )
GAME( 1992, uccopsar, uccops, m92, uccops, uccops, ROT0, "Irem", "Undercover Cops (Alpha Renewal Version)", 0 ) GAME( 1992, uccopsar, uccops, uccops, uccops, uccops, ROT0, "Irem", "Undercover Cops (Alpha Renewal Version)", 0 )
GAME( 1992, uccopsj, uccops, m92, uccops, uccops, ROT0, "Irem", "Undercover Cops (Japan)", 0 ) GAME( 1992, uccopsj, uccops, uccops, uccops, uccops, ROT0, "Irem", "Undercover Cops (Japan)", 0 )
GAME( 1992, mysticri, 0, m92, mysticri, mysticri, ROT0, "Irem", "Mystic Riders (World)", 0 ) GAME( 1992, mysticri, 0, mysticri, mysticri, mysticri, ROT0, "Irem", "Mystic Riders (World)", 0 )
GAME( 1992, gunhohki, mysticri, m92, mysticri, mysticri, ROT0, "Irem", "Gun Hohki (Japan)", 0 ) GAME( 1992, gunhohki, mysticri, mysticri, mysticri, mysticri, ROT0, "Irem", "Gun Hohki (Japan)", 0 )
GAME( 1992, majtitl2, 0, m92, majtitl2, majtitl2, ROT0, "Irem", "Major Title 2 (World)", 0 ) GAME( 1992, majtitl2, 0, majtitl2, majtitl2, majtitl2, ROT0, "Irem", "Major Title 2 (World)", 0 )
GAME( 1992, majtit2j, majtitl2, m92, majtitl2, majtitl2, ROT0, "Irem", "Major Title 2 (Japan)", 0 ) GAME( 1992, majtit2j, majtitl2, majtitl2, majtitl2, majtitl2, ROT0, "Irem", "Major Title 2 (Japan)", 0 )
GAME( 1992, skingame, majtitl2, m92, majtitl2, majtitl2, ROT0, "Irem America", "The Irem Skins Game (US set 1)", 0 ) GAME( 1992, skingame, majtitl2, majtitl2, majtitl2, majtitl2, ROT0, "Irem America", "The Irem Skins Game (US set 1)", 0 )
GAME( 1992, skingam2, majtitl2, m92, majtitl2, majtitl2, ROT0, "Irem America", "The Irem Skins Game (US set 2)", 0 ) GAME( 1992, skingam2, majtitl2, majtitl2, majtitl2, majtitl2, ROT0, "Irem America", "The Irem Skins Game (US set 2)", 0 )
GAME( 1992, hook, 0, m92, hook, hook, ROT0, "Irem", "Hook (World)", 0 ) GAME( 1992, hook, 0, hook, hook, hook, ROT0, "Irem", "Hook (World)", 0 )
GAME( 1992, hooku, hook, m92, hook, hook, ROT0, "Irem America", "Hook (US)", 0 ) GAME( 1992, hooku, hook, hook, hook, hook, ROT0, "Irem America", "Hook (US)", 0 )
GAME( 1992, hookj, hook, m92, hook, hook, ROT0, "Irem", "Hook (Japan)", 0 ) GAME( 1992, hookj, hook, hook, hook, hook, ROT0, "Irem", "Hook (Japan)", 0 )
GAME( 1992, rtypeleo, 0, m92, rtypeleo, rtypeleo, ROT0, "Irem", "R-Type Leo (World)", 0 ) GAME( 1992, rtypeleo, 0, rtypeleo, rtypeleo, rtypeleo, ROT0, "Irem", "R-Type Leo (World)", 0 )
GAME( 1992, rtypelej, rtypeleo, m92, rtypeleo, rtypelej, ROT0, "Irem", "R-Type Leo (Japan)", 0 ) GAME( 1992, rtypelej, rtypeleo, rtypeleo, rtypeleo, rtypelej, ROT0, "Irem", "R-Type Leo (Japan)", 0 )
GAME( 1993, inthunt, 0, m92, inthunt, inthunt, ROT0, "Irem", "In The Hunt (World)", 0 ) GAME( 1993, inthunt, 0, inthunt, inthunt, inthunt, ROT0, "Irem", "In The Hunt (World)", 0 )
GAME( 1993, inthuntu, inthunt, m92, inthunt, inthunt, ROT0, "Irem America", "In The Hunt (US)", 0 ) GAME( 1993, inthuntu, inthunt, inthunt, inthunt, inthunt, ROT0, "Irem America", "In The Hunt (US)", 0 )
GAME( 1993, kaiteids, inthunt, m92, inthunt, kaiteids, ROT0, "Irem", "Kaitei Daisensou (Japan)", 0 ) GAME( 1993, kaiteids, inthunt, inthunt, inthunt, kaiteids, ROT0, "Irem", "Kaitei Daisensou (Japan)", 0 )
GAME( 1993, nbbatman, 0, m92, nbbatman, nbbatman, ROT0, "Irem America", "Ninja Baseball Batman (US)", GAME_IMPERFECT_GRAPHICS ) GAME( 1993, nbbatman, 0, nbbatman, nbbatman, nbbatman, ROT0, "Irem America", "Ninja Baseball Batman (US)", GAME_IMPERFECT_GRAPHICS )
GAME( 1993, leaguemn, nbbatman, m92, nbbatman, nbbatman, ROT0, "Irem", "Yakyuu Kakutou League-Man (Japan)", GAME_IMPERFECT_GRAPHICS ) GAME( 1993, leaguemn, nbbatman, nbbatman, nbbatman, nbbatman, ROT0, "Irem", "Yakyuu Kakutou League-Man (Japan)", GAME_IMPERFECT_GRAPHICS )
GAME( 1993, ssoldier, 0, psoldier, psoldier, ssoldier, ROT0, "Irem America", "Superior Soldiers (US)", GAME_IMPERFECT_SOUND ) GAME( 1993, ssoldier, 0, psoldier, psoldier, ssoldier, ROT0, "Irem America", "Superior Soldiers (US)", GAME_IMPERFECT_SOUND )
GAME( 1993, psoldier, ssoldier, psoldier, psoldier, psoldier, ROT0, "Irem", "Perfect Soldiers (Japan)", GAME_IMPERFECT_SOUND ) GAME( 1993, psoldier, ssoldier, psoldier, psoldier, psoldier, ROT0, "Irem", "Perfect Soldiers (Japan)", GAME_IMPERFECT_SOUND )
GAME( 1994, dsccr94j, dsoccr94, psoldier, dsccr94j, dsccr94j, ROT0, "Irem", "Dream Soccer '94 (Japan)", 0 ) GAME( 1994, dsccr94j, dsoccr94, dsccr94j, dsccr94j, dsccr94j, ROT0, "Irem", "Dream Soccer '94 (Japan)", 0 )
GAME( 1994, gunforc2, 0, m92, gunforc2, gunforc2, ROT0, "Irem", "Gunforce 2 (US)", 0 ) GAME( 1994, gunforc2, 0, gunforc2, gunforc2, gunforc2, ROT0, "Irem", "Gunforce 2 (US)", 0 )
GAME( 1994, geostorm, gunforc2, m92, gunforc2, gunforc2, ROT0, "Irem", "Geostorm (Japan)", 0 ) GAME( 1994, geostorm, gunforc2, gunforc2, gunforc2, gunforc2, ROT0, "Irem", "Geostorm (Japan)", 0 )

View File

@ -1,9 +1,10 @@
/***************************************************************************** /*****************************************************************************
Irem Custom V30 CPU: Irem Custom V35+ CPU
-- has internal 256 byte lookup table, handled in realtime. Bomberman
It uses a simple opcode lookup encryption, the painful part is that it's World runs encrypted code from RAM, Risky Challenge expects to be able
preprogrammed into the cpu and isn't a algorithmic based one. to run code in emulation (non-encrypted) mode for some subroutines..
Hasamu Nanao 08J27261A1 011 9102KK700 Hasamu Nanao 08J27261A1 011 9102KK700
Gunforce Nanao 08J27261A1 011 9106KK701 Gunforce Nanao 08J27261A1 011 9106KK701
@ -36,10 +37,11 @@
*****************************************************************************/ *****************************************************************************/
#include "driver.h" #include "driver.h"
#include "irem_cpu.h" #include "irem_cpu.h"
int m90_game_kludge;
// CAVEATS: // CAVEATS:
// 0x80 and 0x82 pre- opcodes can easily be confused. They perform exactly the same // 0x80 and 0x82 pre- opcodes can easily be confused. They perform exactly the same
@ -299,34 +301,34 @@ const UINT8 inthunt_decryption_table[256] = {
// 0xb8 (0x2b) not sure, could be 0x1b // 0xb8 (0x2b) not sure, could be 0x1b
const UINT8 gussun_decryption_table[256] = { const UINT8 gussun_decryption_table[256] = {
0xcd,xxxx,xxxx,0x36,xxxx,0x52,0xb1,0x5b, 0x68,0xcd,xxxx,xxxx,xxxx,0xa8,xxxx,xxxx, /* 00 */ 0x63,xxxx,xxxx,0x36,xxxx,0x52,0xb1,0x5b, 0x68,0xcd,xxxx,xxxx,xxxx,0xa8,xxxx,xxxx, /* 00 */
// 0x63 gggg gggg gggg // 0x63 gggg gggg gggg
xxxx,xxxx,0x75,0x24,0x08,0x83,0x32,0xe9, xxxx,0x79,xxxx,0x8f,0x22,xxxx,0xac,xxxx, /* 10 */ xxxx,xxxx,0x75,0x24,0x08,0x83,0x32,0xe9, xxxx,0x79,xxxx,0x8f,0x22,xxxx,0xac,xxxx, /* 10 */
// ???? pppp gggg // ???? pppp gggg
0x5d,0xa5,0x11,0x51,0x0a,0x29,xxxx,xxxx ,0xf8,0x98,0x91,0x40,0x28,0x00,0x03,0x5f, /* 20 */ 0x5d,0xa5,0x11,0x51,0x0a,0x29,xxxx,xxxx ,0xf8,0x98,0x91,0x40,0x28,0x00,0x03,0x5f, /* 20 */
// gggg pppp gggg gggg gggg gggg pppp // gggg gggg gggg gggg gggg gggg pppp
0x26,xxxx,xxxx,0x8b,0x2f,0x02,xxxx,xxxx, 0x8e,0xab,xxxx,xxxx,0xbc,0xf1,0xb3,xxxx, /* 30 */ 0x26,xxxx,xxxx,0x8b,0x2f,0x02,xxxx,xxxx, 0x8e,0xab,xxxx,xxxx,0xbc,0x90,0xb3,xxxx, /* 30 */
// gggg 0x90 // gggg
0x19,xxxx,0xc6,xxxx,xxxx,0x3a,xxxx,xxxx, xxxx,0x74,0x61,xxxx,0x33,xxxx,xxxx,xxxx, /* 40 */ 0x09,xxxx,0xc6,xxxx,xxxx,0x3a,xxxx,xxxx, xxxx,0x74,0x61,xxxx,0x33,xxxx,xxxx,xxxx, /* 40 */
// ???? // gggg
xxxx,0x53,0xa0,0xc0,0xc3,0x41,0xfc,0xe7, xxxx,0x2c,0x7c,0x2b,xxxx,xxxx,0xba,0x2a, /* 50 */ xxxx,0x53,0xa0,0xc0,0xc3,0x41,0xfc,0xe7, xxxx,0x2c,0x7c,0x2b,xxxx,0x4f,0xba,0x2a, /* 50 */
// gggg gggg gggg pppp gggg // gggg gggg gggg pppp gggg gggg
0xb0,xxxx,0x29,0x79,xxxx,xxxx,0xb5,0x07, 0xb9,xxxx,0x27,0x46,0xf9,xxxx,xxxx,xxxx, /* 60 */ 0xb0,xxxx,0x21,0x7d,xxxx,xxxx,0xb5,0x07, 0xb9,xxxx,0x27,0x46,0xf9,xxxx,xxxx,xxxx, /* 60 */
// ???? pppp gggg gggg // pppp pppp gggg gggg
xxxx,0xea,0x72,0x73,0xad,0xd1,0x3b,0x5e, 0xe5,0x57,xxxx,0x0d,xxxx,xxxx,0x42,0x3c, /* 70 */ xxxx,0xea,0x72,0x73,0xad,0xd1,0x3b,0x5e, 0xe5,0x57,xxxx,0x0d,0xfd,xxxx,0x92,0x3c, /* 70 */
// gggg pppp ???? // gggg pppp gggg gggg
xxxx,0x86,0x78,0x7d,0x30,0x25,0x2d,xxxx, 0x9a,0xeb,0x04,0x0b,0xa2,0xb8,0xf6,xxxx, /* 80 */ xxxx,0x86,0x78,0x7f,0x18,0x25,0x2d,xxxx, 0x9a,0xeb,0x04,0x0b,0xa2,0xb8,0xf6,xxxx, /* 80 */
// ???? pppp ???? pppp gggg // pppp pppp ???? pppp gggg
xxxx,xxxx,0x9d,xxxx,0xbb,xxxx,xxxx,0xcb, 0xa9,0xcf,xxxx,0x60,0x43,0x56,xxxx,xxxx, /* 90 */ xxxx,xxxx,0x9d,xxxx,0xbb,xxxx,xxxx,0xcb, 0xa9,0xcf,xxxx,0x60,0x43,0x56,xxxx,xxxx, /* 90 */
// gggg gggg // gggg gggg
xxxx,0xa3,xxxx,xxxx,xxxx,xxxx,0xfa,0xb4, xxxx,0x81,0xe6,0x48,0x80,0x8c,0xd4,xxxx, /* a0 */ xxxx,0xa3,xxxx,xxxx,0x82,xxxx,0xfa,0xb4, xxxx,0x81,0xe6,0x48,0x80,0x8c,0xd4,xxxx, /* a0 */
// gggg ???? gggg gggg // ???? gggg ???? gggg gggg
xxxx,xxxx,0x84,0xb6,0x77,0x3d,0x3e,xxxx, xxxx,0xb7,0x4b,xxxx,xxxx,xxxx,xxxx,xxxx, /* b0 */ 0x42,xxxx,0x84,0xb6,0x77,0x3d,0x3e,xxxx, xxxx,0xb7,0x4b,xxxx,0xa4,xxxx,xxxx,xxxx, /* b0 */
// gggg ???? gggg gggg ???? pppp // gggg gggg ???? gggg gggg ???? pppp gggg
xxxx,0xff,0x47,xxxx,0x55,0x1e,xxxx,0x59, 0x93,xxxx,xxxx,xxxx,0x88,0xc1,0x01,0xb2, /* c0 */ xxxx,0xff,0x47,xxxx,0x55,0x1e,xxxx,0x59, 0x93,xxxx,xxxx,xxxx,0x88,0xc1,0x01,0xb2, /* c0 */
// gggg pppp // gggg pppp
0x01,0x2e,0x06,0xc7,0x05,xxxx,0x8a,0x5a, 0x58,0xbe,xxxx,0x4e,xxxx,0x1f,0x23,xxxx, /* d0 */ 0x85,0x2e,0x06,0xc7,0x05,xxxx,0x8a,0x5a, 0x58,0xbe,xxxx,0x4e,xxxx,0x1f,0x23,xxxx, /* d0 */
// ???? gggg // gggg gggg
0xe8,xxxx,0x89,0xa1,0xd0,xxxx,xxxx,0xe2, 0x38,0xfe,0x50,0x9c,xxxx,xxxx,xxxx,0x49, /* e0 */ 0xe8,xxxx,0x89,0xa1,0xd0,xxxx,xxxx,0xe2, 0x38,0xfe,0x50,0x9c,xxxx,xxxx,xxxx,0x49, /* e0 */
// gggg gggg // gggg gggg
0xfb,0x20,0xf3,xxxx,xxxx,0x0f,xxxx,xxxx, xxxx,0x76,0xf7,0xbd,0x39,0x7e,0xbf,xxxx, /* f0 */ 0xfb,0x20,0xf3,xxxx,xxxx,0x0f,xxxx,xxxx, xxxx,0x76,0xf7,0xbd,0x39,0x7e,0xbf,xxxx, /* f0 */
@ -752,94 +754,3 @@ const UINT8 test_decryption_table[256] = {
xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, /* E0 */ xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, /* E0 */
xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, /* F0 */ xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, /* F0 */
}; };
static const UINT8 byte_count_table[256] = {
2,2,2,2,2,3,1,1, 2,2,2,2,2,3,1,0, /* 00 */
2,2,2,2,2,3,1,1, 2,2,2,2,2,3,1,1, /* 10 */
2,2,2,2,2,3,1,1, 2,2,2,2,2,3,1,1, /* 20 */
2,2,2,2,2,3,1,1, 2,2,2,2,2,3,1,1, /* 30 */
1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, /* 40 */
1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, /* 50 */
1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, /* 60 */
1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, /* 70 */
3,3,3,3,2,2,2,2, 2,2,2,2,0,0,0,0, /* 80 */
1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0, /* 90 */
0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, /* A0 */
2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3, /* B0 */
0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, /* C0 */
0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, /* D0 */
0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, /* E0 */
0,0,0,0,0,0,0,0, 1,1,1,1,1,1,0,0, /* F0 */
};
UINT8 *irem_cpu_decrypted;
void irem_cpu_decrypt(int cpu,const UINT8 *decryption_table)
{
int A,size;
UINT8 *rom;
// int t[256];
#ifdef MAME_DEBUG
// extern char *opmap1[];
#endif
rom = memory_region(cpu+REGION_CPU1);
size = memory_region_length(cpu+REGION_CPU1);
irem_cpu_decrypted = auto_malloc(size);
memory_set_decrypted_region(cpu,0,size-1,irem_cpu_decrypted);
for (A = 0;A < size; A++)
irem_cpu_decrypted[A] = decryption_table[rom[A]];
// robiza note:
// for "gussun" and "riskchal" is necessary an hack to not decrypt not encrypted routines
// we need a real nec v25+/35+ core to support 0x63 (brkn for "break native") instruction
// for now we use "cd" (int) instruction + hack
if (m90_game_kludge==1) // for riskchal
{
for (A = 0xa8fd;A < 0xa90c; A++)
irem_cpu_decrypted[A] = rom[A];
for (A = 0x12b3a;A < 0x12b4b; A++)
irem_cpu_decrypted[A] = rom[A];
for (A = 0x13500;A < 0x13510; A++)
irem_cpu_decrypted[A] = rom[A];
for (A = 0x14be5;A < 0x14bf5; A++)
irem_cpu_decrypted[A] = rom[A];
for (A = 0x130de;A < 0x130eb; A++)
irem_cpu_decrypted[A] = rom[A];
for (A = 0x147a4;A < 0x147bf; A++)
irem_cpu_decrypted[A] = rom[A];
}
if (m90_game_kludge==2) // for gussun
{
for (A = 0xa8fd;A < 0xa90c; A++)
irem_cpu_decrypted[A] = rom[A];
for (A = 0x1369c;A < 0x136ac; A++)
irem_cpu_decrypted[A] = rom[A];
for (A = 0x14ec8;A < 0x14ed8; A++)
irem_cpu_decrypted[A] = rom[A];
for (A = 0x13246;A < 0x13253; A++)
irem_cpu_decrypted[A] = rom[A];
for (A = 0x14a7d;A < 0x14a98; A++)
irem_cpu_decrypted[A] = rom[A];
}
/*
for (A=0; A<256; A++) {
t[A]=0;
for (diff=0; diff<256; diff++)
if (decryption_table[diff]==A) {
t[A]++;
}
#ifdef MAME_DEBUG
// if (t[A]==0) logerror("Unused: [%d] %02x\t%s\n",byte_count_table[A],A,opmap1[A]);
// if (t[A]>1) logerror("DUPLICATE: %02x\t%s\n",A,opmap1[A]);
#else
if (t[A]==0) logerror("Unused: [%d] %02x\n",byte_count_table[A],A);
if (t[A]>1) logerror("DUPLICATE: %02x\n",A);
#endif
}
*/
}