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 "necintrf.h"
/* default configuration */
static const nec_config default_config =
{
NULL
};
extern int necv_dasm_one(char *buffer, UINT32 eip, const UINT8 *oprom);
/* NEC registers */
@ -158,6 +165,10 @@ typedef struct
int (*irq_callback)(int irqline);
memory_interface mem;
const nec_config *config;
} nec_Regs;
/***************************************************************************/
@ -185,10 +196,26 @@ static char seg_prefix; /* prefix segment indicator */
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)
{
const nec_config *config;
unsigned int i,j,c;
static const BREGS reg_name[8]={ AL, CL, DL, BL, AH, CH, DH, BH };
int (*save_irqcallback)(int);
@ -196,9 +223,12 @@ static void nec_reset (void)
save_irqcallback = I.irq_callback;
save_mem = I.mem;
config = I.config;
memset( &I, 0, sizeof(I) );
I.irq_callback = save_irqcallback;
I.mem = save_mem;
I.config = config;
I.sregs[PS] = 0xffff;
@ -214,6 +244,9 @@ static void nec_reset (void)
I.ZeroVal = I.ParityVal = 1;
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++)
{
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)
{
nec_instruction[FETCHOP]();
nec_instruction[fetchop()]();
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( 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( 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( 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( 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( 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( 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( 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( 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( 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( 0x3c, i_cmp_ald8 ) { DEF_ald8; SUBB; 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( 0x40, i_inc_ax ) { IncWordReg(AW); CLK(2); }
@ -464,12 +497,13 @@ OP( 0x62, i_chkind ) {
nec_ICount-=20;
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 */
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 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 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 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;
}
switch(next) {
@ -492,12 +526,12 @@ OP( 0x64, i_repnc ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW];
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 */
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 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 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 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;
}
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( 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( 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 ) {
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( 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 */
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 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 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 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;
}
switch(next) {
@ -868,12 +902,12 @@ OP( 0xf2, i_repne ) { UINT32 next = FETCHOP; UINT16 c = I.regs.w[CW];
}
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 */
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 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 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 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;
}
switch(next) {
@ -1013,10 +1047,16 @@ static offs_t nec_dasm(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8
}
#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"};
I.config = config;
state_save_register_item_array(names[type], index, I.regs.w);
state_save_register_item_array(names[type], index, I.sregs);
@ -1180,7 +1220,7 @@ static int v20_execute(int cycles)
I.no_interrupt--;
CALL_DEBUGGER((I.sregs[PS]<<4) + I.ip);
nec_instruction[FETCHOP]();
nec_instruction[fetchop()]();
}
return cycles - nec_ICount;
}
@ -1211,7 +1251,7 @@ static int v30_execute(int cycles) {
I.no_interrupt--;
CALL_DEBUGGER((I.sregs[PS]<<4) + I.ip);
nec_instruction[FETCHOP]();
nec_instruction[fetchop()]();
}
return cycles - nec_ICount;
}
@ -1243,7 +1283,7 @@ static int v33_execute(int cycles)
I.no_interrupt--;
CALL_DEBUGGER((I.sregs[PS]<<4) + I.ip);
nec_instruction[FETCHOP]();
nec_instruction[fetchop()]();
}
return cycles - nec_ICount;

View File

@ -1,5 +1,12 @@
#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 { 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 (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 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; }

View File

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

View File

@ -19,6 +19,7 @@
#include "machine/irem_cpu.h"
#include "sound/2151intf.h"
#include "sound/iremga20.h"
#include "cpu/nec/nec.h"
#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 )
/* basic machine hardware */
@ -482,9 +485,9 @@ static MACHINE_DRIVER_START( firebarr )
MDRV_CPU_PROGRAM_MAP(main_map,0)
MDRV_CPU_IO_MAP(main_portmap,0)
MDRV_CPU_ADD(V30, 14318000/2)
/* audio CPU */ /* 14.318 MHz */
MDRV_CPU_ADD_TAG("sound", V30, 14318000/2)
MDRV_CPU_PROGRAM_MAP(sound_map,0)
MDRV_CPU_CONFIG(firebarr_config)
MDRV_MACHINE_START(m107)
MDRV_MACHINE_RESET(m107)
@ -516,17 +519,28 @@ static MACHINE_DRIVER_START( firebarr )
MDRV_SOUND_ROUTE(1, "right", 1.0)
MACHINE_DRIVER_END
static const nec_config dsoccr94_config ={ dsoccr94_decryption_table, };
static MACHINE_DRIVER_START( dsoccr94 )
MDRV_IMPORT_FROM(firebarr)
/* basic machine hardware */
MDRV_CPU_REPLACE("main", V33, 20000000/2) /* NEC V33, Could be 28MHz clock? */
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(dsoccr94_config)
/* video hardware */
MDRV_GFXDECODE(m107)
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 )
@ -632,8 +646,6 @@ static DRIVER_INIT( firebarr )
RAM = memory_region(REGION_CPU2);
memcpy(RAM+0xffff0,RAM+0x1fff0,0x10); /* Sound cpu Start vector */
irem_cpu_decrypt(1,rtypeleo_decryption_table);
m107_irq_vectorbase=0x20;
m107_spritesystem = 1;
}
@ -648,8 +660,6 @@ static DRIVER_INIT( dsoccr94 )
RAM = memory_region(REGION_CPU2);
memcpy(RAM+0xffff0,RAM+0x1fff0,0x10); /* Sound cpu Start vector */
irem_cpu_decrypt(1,dsoccr94_decryption_table);
m107_irq_vectorbase=0x80;
m107_spritesystem = 0;
}
@ -664,7 +674,6 @@ static DRIVER_INIT( wpksoc )
RAM = memory_region(REGION_CPU2);
memcpy(RAM+0xffff0,RAM+0x1fff0,0x10); /* Sound cpu Start vector */
irem_cpu_decrypt(1,leagueman_decryption_table);
m107_irq_vectorbase=0x80;
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( 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/2151intf.h"
#include "m72.h"
#include "cpu/nec/nec.h"
#define MASTER_CLOCK XTAL_32MHz
@ -1920,11 +1921,11 @@ static const struct YM2151interface ym2151_interface =
static MACHINE_DRIVER_START( rtype )
/* 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_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_IO_MAP(sound_portmap,0)
/* IRQs are generated by main Z80 and YM2151 */
@ -1986,11 +1987,11 @@ ADDRESS_MAP_END
static MACHINE_DRIVER_START( m72 )
/* 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_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_IO_MAP(sound_portmap,0)
MDRV_CPU_VBLANK_INT(fake_nmi,128) /* clocked by V1? (Vigilante) */
@ -2027,7 +2028,7 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( m72_8751 )
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_DATA_MAP(mcu_data_map,0)
MDRV_CPU_VBLANK_INT(irq0_line_pulse,1)
@ -2037,11 +2038,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( dkgenm72 )
/* 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_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_IO_MAP(sound_portmap,0)
MDRV_CPU_VBLANK_INT(fake_nmi,128) /* clocked by V1? (Vigilante) */
@ -2079,11 +2080,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( xmultipl )
/* 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_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_IO_MAP(sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2121,11 +2122,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( dbreed )
/* 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_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_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2162,11 +2163,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( dbreed72 )
/* 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_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_IO_MAP(sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2204,11 +2205,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( rtype2 )
/* 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_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_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2245,11 +2246,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( majtitle )
/* 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_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_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2286,11 +2287,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( hharry )
/* 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_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_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2328,11 +2329,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( hharryu )
/* 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_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_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
@ -2370,11 +2371,11 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( poundfor )
/* 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_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_IO_MAP(poundfor_sound_portmap,0)
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)
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( kengo )
static MACHINE_DRIVER_START( cosmccop )
/* 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_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_IO_MAP(rtype2_sound_portmap,0)
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)
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, 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, 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( 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, 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
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"
@ -34,13 +30,12 @@ Notes:
#include "audio/m72.h"
#include "sound/dac.h"
#include "sound/2151intf.h"
#include "cpu/nec/nec.h"
static UINT32 bankaddress;
extern UINT16 *m90_video_data;
extern int m90_game_kludge;
VIDEO_UPDATE( m90 );
VIDEO_UPDATE( m90_bootleg );
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 )
/* 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_IO_MAP(main_cpu_io,0)
MDRV_CPU_VBLANK_INT(m90_interrupt,1)
@ -697,18 +691,47 @@ static MACHINE_DRIVER_START( m90 )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
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_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
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 )
/* 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_IO_MAP(main_cpu_io,0)
MDRV_CPU_VBLANK_INT(m90_interrupt,1)
@ -746,11 +769,14 @@ static MACHINE_DRIVER_START( bombrman )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
MACHINE_DRIVER_END
static const nec_config dynablaster_config ={ dynablaster_decryption_table, };
static MACHINE_DRIVER_START( bbmanw )
/* 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_IO_MAP(main_cpu_io,0)
MDRV_CPU_VBLANK_INT(m90_interrupt,1)
@ -788,18 +814,25 @@ static MACHINE_DRIVER_START( bbmanw )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
MACHINE_DRIVER_END
static const nec_config no_table ={ NULL, };
static MACHINE_DRIVER_START( bomblord )
MDRV_IMPORT_FROM( bbmanw )
MDRV_CPU_MODIFY("main")
MDRV_CPU_CONFIG(no_table)
MDRV_CPU_VBLANK_INT(bomblord_interrupt,1)
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( bootleg )
/* 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_IO_MAP(main_cpu_io,0)
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 )
{
m90_game_kludge=0;
irem_cpu_decrypt(0,lethalth_decryption_table);
bankaddress = 0;
set_m90_bank();
@ -1163,30 +1157,13 @@ static DRIVER_INIT( quizf1 )
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 )
{
UINT8 *RAM = memory_region(REGION_CPU1);
int i;
m90_game_kludge=0;
for (i=0; i<0x100000; i+=8)
{
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, dynablst, 0, bombrman, dynablst, bombrman, 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, atompunk, dynablst, bombrman, atompunk, bombrman, ROT0, "Irem America (licensed from Hudson Soft)", "Atomic Punk (US)", GAME_NO_COCKTAIL )
GAME( 1991, hasamu, 0, hasamu, hasamu, 0, ROT0, "Irem", "Hasamu (Japan)", 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, 0, ROT0, "Irem (licensed from Hudson Soft)", "Bomber Man (Japan)", 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( 1992, bbmanw, 0, bbmanw, bbmanw, bbmanw, 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, newapunk, bbmanw, bbmanw, bbmanwj, bbmanw, ROT0, "Irem America", "New Atomic Punk - Global Quest (US)", 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, bbmanw, bbmanwj, 0, ROT0, "Irem", "Bomber Man World (Japan)", 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, 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, gussun, riskchal, m90, riskchal, gussun, ROT0, "Irem", "Gussun Oyoyo (Japan)", GAME_NOT_WORKING | GAME_NO_COCKTAIL )
GAME( 1993, matchit2, 0, quizf1, matchit2, matchit2, ROT0, "Tamtex", "Match It II", GAME_NO_COCKTAIL )
GAME( 1993, shisen2, matchit2, quizf1, shisen2, matchit2, ROT0, "Tamtex", "Shisensho II", GAME_NO_COCKTAIL )
GAME( 1993, riskchal, 0, riskchal, riskchal, 0, ROT0, "Irem", "Risky Challenge", GAME_IMPERFECT_GRAPHICS )
GAME( 1993, gussun, riskchal, riskchal, riskchal, 0, ROT0, "Irem", "Gussun Oyoyo (Japan)", GAME_IMPERFECT_GRAPHICS )
GAME( 1993, matchit2, 0, matchit2, matchit2, 0, ROT0, "Tamtex", "Match It 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 "sound/2151intf.h"
#include "sound/iremga20.h"
#include "cpu/nec/nec.h"
static UINT8 irqvector;
static UINT16 sound_status;
@ -958,7 +959,7 @@ static MACHINE_DRIVER_START( m92 )
MDRV_CPU_PROGRAM_MAP(m92_map,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_MACHINE_START(m92)
@ -991,22 +992,107 @@ static MACHINE_DRIVER_START( m92 )
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 )
MDRV_IMPORT_FROM(m92)
/* basic machine hardware */
MDRV_CPU_MODIFY("main")
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
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 )
MDRV_IMPORT_FROM(m92)
MDRV_CPU_MODIFY("sound")
MDRV_CPU_CONFIG(psoldier_config)
/* video hardware */
MDRV_GFXDECODE(2)
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 */
@ -1899,7 +1985,7 @@ ROM_START( geostorm )
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);
@ -1922,49 +2008,48 @@ static void init_m92(running_machine *machine, const UINT8 *decryption_table, in
m92_sprite_buffer_busy=1;
setvector_callback(machine, NULL, VECTOR_INIT);
irem_cpu_decrypt(1,decryption_table);
}
static DRIVER_INIT( bmaster )
{
init_m92(machine, bomberman_decryption_table, 1);
init_m92(machine, 1);
}
static DRIVER_INIT( gunforce )
{
init_m92(machine, gunforce_decryption_table, 1);
init_m92(machine, 1);
}
static DRIVER_INIT( hook )
{
init_m92(machine, hook_decryption_table, 1);
init_m92(machine, 1);
}
static DRIVER_INIT( mysticri )
{
init_m92(machine, mysticri_decryption_table, 1);
init_m92(machine, 1);
}
static DRIVER_INIT( uccops )
{
init_m92(machine, dynablaster_decryption_table, 1);
init_m92(machine, 1);
}
static DRIVER_INIT( rtypeleo )
{
init_m92(machine, rtypeleo_decryption_table, 1);
init_m92(machine, 1);
m92_irq_vectorbase=0x20;
}
static DRIVER_INIT( rtypelej )
{
init_m92(machine, rtypeleo_decryption_table, 1);
init_m92(machine, 1);
m92_irq_vectorbase=0x20;
}
static DRIVER_INIT( majtitl2 )
{
init_m92(machine, majtitl2_decryption_table, 1);
init_m92(machine, 1);
/* This game has an eprom on the game board */
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 )
{
init_m92(machine, inthunt_decryption_table, 1);
init_m92(machine, 1);
}
static DRIVER_INIT( inthunt )
{
init_m92(machine, inthunt_decryption_table, 1);
init_m92(machine, 1);
}
static DRIVER_INIT( lethalth )
{
init_m92(machine, lethalth_decryption_table, 0);
init_m92(machine, 0);
m92_irq_vectorbase=0x20;
/* NOP out the bankswitcher */
@ -1997,14 +2082,14 @@ static DRIVER_INIT( nbbatman )
{
UINT8 *RAM = memory_region(REGION_CPU1);
init_m92(machine, leagueman_decryption_table, 1);
init_m92(machine, 1);
memcpy(RAM+0x80000,RAM+0x100000,0x20000);
}
static DRIVER_INIT( ssoldier )
{
init_m92(machine, psoldier_decryption_table, 1);
init_m92(machine, 1);
m92_irq_vectorbase=0x20;
/* main CPU expects an answer even before writing the first command */
sound_status = 0x80;
@ -2012,7 +2097,7 @@ static DRIVER_INIT( ssoldier )
static DRIVER_INIT( psoldier )
{
init_m92(machine, psoldier_decryption_table, 1);
init_m92(machine, 1);
m92_irq_vectorbase=0x20;
/* main CPU expects an answer even before writing the first command */
sound_status = 0x80;
@ -2020,46 +2105,46 @@ static DRIVER_INIT( psoldier )
static DRIVER_INIT( dsccr94j )
{
init_m92(machine, dsoccr94_decryption_table, 1);
init_m92(machine, 1);
}
static DRIVER_INIT( gunforc2 )
{
UINT8 *RAM = memory_region(REGION_CPU1);
init_m92(machine, lethalth_decryption_table, 1);
init_m92(machine, 1);
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, gunforcj, gunforce, m92, 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, bmaster, 0, m92, bmaster, bmaster, ROT0, "Irem", "Blade Master (World)", 0 )
GAME( 1991, crossbld, bmaster, m92, bmaster, bmaster, ROT0, "Irem", "Cross Blades! (Japan)", 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( 1992, uccops, 0, m92, 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, uccopsj, uccops, m92, uccops, uccops, ROT0, "Irem", "Undercover Cops (Japan)", 0 )
GAME( 1992, mysticri, 0, m92, mysticri, mysticri, ROT0, "Irem", "Mystic Riders (World)", 0 )
GAME( 1992, gunhohki, mysticri, m92, mysticri, mysticri, ROT0, "Irem", "Gun Hohki (Japan)", 0 )
GAME( 1992, majtitl2, 0, m92, 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, skingame, majtitl2, m92, 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, hook, 0, m92, hook, hook, ROT0, "Irem", "Hook (World)", 0 )
GAME( 1992, hooku, hook, m92, hook, hook, ROT0, "Irem America", "Hook (US)", 0 )
GAME( 1992, hookj, hook, m92, hook, hook, ROT0, "Irem", "Hook (Japan)", 0 )
GAME( 1992, rtypeleo, 0, m92, rtypeleo, rtypeleo, ROT0, "Irem", "R-Type Leo (World)", 0 )
GAME( 1992, rtypelej, rtypeleo, m92, 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, inthuntu, inthunt, m92, 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, nbbatman, 0, m92, 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, 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( 1994, dsccr94j, dsoccr94, psoldier, dsccr94j, dsccr94j, ROT0, "Irem", "Dream Soccer '94 (Japan)", 0 )
GAME( 1994, gunforc2, 0, m92, gunforc2, gunforc2, ROT0, "Irem", "Gunforce 2 (US)", 0 )
GAME( 1994, geostorm, gunforc2, m92, gunforc2, gunforc2, ROT0, "Irem", "Geostorm (Japan)", 0 )
GAME( 1991, gunforce, 0, gunforce, gunforce, gunforce, ROT0, "Irem", "Gunforce - Battle Fire Engulfed Terror Island (World)", 0 )
GAME( 1991, gunforcj, gunforce, gunforce, gunforce, gunforce, ROT0, "Irem", "Gunforce - Battle Fire Engulfed Terror Island (Japan)", 0 )
GAME( 1991, gunforcu, gunforce, gunforce, gunforce, gunforce, ROT0, "Irem America", "Gunforce - Battle Fire Engulfed Terror Island (US)", 0 )
GAME( 1991, bmaster, 0, bmaster, bmaster, bmaster, ROT0, "Irem", "Blade Master (World)", 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, thndblst, lethalth, lethalth, lethalth, lethalth, ROT270, "Irem", "Thunder Blaster (Japan)", 0 )
GAME( 1992, uccops, 0, uccops, uccops, uccops, ROT0, "Irem", "Undercover Cops (World)", 0 )
GAME( 1992, uccopsar, uccops, uccops, uccops, uccops, ROT0, "Irem", "Undercover Cops (Alpha Renewal Version)", 0 )
GAME( 1992, uccopsj, uccops, uccops, uccops, uccops, ROT0, "Irem", "Undercover Cops (Japan)", 0 )
GAME( 1992, mysticri, 0, mysticri, mysticri, mysticri, ROT0, "Irem", "Mystic Riders (World)", 0 )
GAME( 1992, gunhohki, mysticri, mysticri, mysticri, mysticri, ROT0, "Irem", "Gun Hohki (Japan)", 0 )
GAME( 1992, majtitl2, 0, majtitl2, majtitl2, majtitl2, ROT0, "Irem", "Major Title 2 (World)", 0 )
GAME( 1992, majtit2j, majtitl2, majtitl2, majtitl2, majtitl2, ROT0, "Irem", "Major Title 2 (Japan)", 0 )
GAME( 1992, skingame, majtitl2, majtitl2, majtitl2, majtitl2, ROT0, "Irem America", "The Irem Skins Game (US set 1)", 0 )
GAME( 1992, skingam2, majtitl2, majtitl2, majtitl2, majtitl2, ROT0, "Irem America", "The Irem Skins Game (US set 2)", 0 )
GAME( 1992, hook, 0, hook, hook, hook, ROT0, "Irem", "Hook (World)", 0 )
GAME( 1992, hooku, hook, hook, hook, hook, ROT0, "Irem America", "Hook (US)", 0 )
GAME( 1992, hookj, hook, hook, hook, hook, ROT0, "Irem", "Hook (Japan)", 0 )
GAME( 1992, rtypeleo, 0, rtypeleo, rtypeleo, rtypeleo, ROT0, "Irem", "R-Type Leo (World)", 0 )
GAME( 1992, rtypelej, rtypeleo, rtypeleo, rtypeleo, rtypelej, ROT0, "Irem", "R-Type Leo (Japan)", 0 )
GAME( 1993, inthunt, 0, inthunt, inthunt, inthunt, ROT0, "Irem", "In The Hunt (World)", 0 )
GAME( 1993, inthuntu, inthunt, inthunt, inthunt, inthunt, ROT0, "Irem America", "In The Hunt (US)", 0 )
GAME( 1993, kaiteids, inthunt, inthunt, inthunt, kaiteids, ROT0, "Irem", "Kaitei Daisensou (Japan)", 0 )
GAME( 1993, nbbatman, 0, nbbatman, nbbatman, nbbatman, ROT0, "Irem America", "Ninja Baseball Batman (US)", 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, psoldier, ssoldier, psoldier, psoldier, psoldier, ROT0, "Irem", "Perfect Soldiers (Japan)", GAME_IMPERFECT_SOUND )
GAME( 1994, dsccr94j, dsoccr94, dsccr94j, dsccr94j, dsccr94j, ROT0, "Irem", "Dream Soccer '94 (Japan)", 0 )
GAME( 1994, gunforc2, 0, gunforc2, gunforc2, gunforc2, ROT0, "Irem", "Gunforce 2 (US)", 0 )
GAME( 1994, geostorm, gunforc2, gunforc2, gunforc2, gunforc2, ROT0, "Irem", "Geostorm (Japan)", 0 )

View File

@ -1,9 +1,10 @@
/*****************************************************************************
Irem Custom V30 CPU:
It uses a simple opcode lookup encryption, the painful part is that it's
preprogrammed into the cpu and isn't a algorithmic based one.
Irem Custom V35+ CPU
-- has internal 256 byte lookup table, handled in realtime. Bomberman
World runs encrypted code from RAM, Risky Challenge expects to be able
to run code in emulation (non-encrypted) mode for some subroutines..
Hasamu Nanao 08J27261A1 011 9102KK700
Gunforce Nanao 08J27261A1 011 9106KK701
@ -36,10 +37,11 @@
*****************************************************************************/
#include "driver.h"
#include "irem_cpu.h"
int m90_game_kludge;
// CAVEATS:
// 0x80 and 0x82 pre- opcodes can easily be confused. They perform exactly the same
@ -299,38 +301,38 @@ const UINT8 inthunt_decryption_table[256] = {
// 0xb8 (0x2b) not sure, could be 0x1b
const UINT8 gussun_decryption_table[256] = {
0xcd,xxxx,xxxx,0x36,xxxx,0x52,0xb1,0x5b, 0x68,0xcd,xxxx,xxxx,xxxx,0xa8,xxxx,xxxx, /* 00 */
// 0x63 gggg gggg gggg
xxxx,xxxx,0x75,0x24,0x08,0x83,0x32,0xe9, xxxx,0x79,xxxx,0x8f,0x22,xxxx,0xac,xxxx, /* 10 */
// ???? pppp gggg
0x5d,0xa5,0x11,0x51,0x0a,0x29,xxxx,xxxx ,0xf8,0x98,0x91,0x40,0x28,0x00,0x03,0x5f, /* 20 */
// gggg pppp gggg gggg gggg gggg pppp
0x26,xxxx,xxxx,0x8b,0x2f,0x02,xxxx,xxxx, 0x8e,0xab,xxxx,xxxx,0xbc,0xf1,0xb3,xxxx, /* 30 */
// gggg 0x90
0x19,xxxx,0xc6,xxxx,xxxx,0x3a,xxxx,xxxx, xxxx,0x74,0x61,xxxx,0x33,xxxx,xxxx,xxxx, /* 40 */
// ????
xxxx,0x53,0xa0,0xc0,0xc3,0x41,0xfc,0xe7, xxxx,0x2c,0x7c,0x2b,xxxx,xxxx,0xba,0x2a, /* 50 */
// gggg gggg gggg pppp gggg
0xb0,xxxx,0x29,0x79,xxxx,xxxx,0xb5,0x07, 0xb9,xxxx,0x27,0x46,0xf9,xxxx,xxxx,xxxx, /* 60 */
// ???? pppp gggg gggg
xxxx,0xea,0x72,0x73,0xad,0xd1,0x3b,0x5e, 0xe5,0x57,xxxx,0x0d,xxxx,xxxx,0x42,0x3c, /* 70 */
// gggg pppp ????
xxxx,0x86,0x78,0x7d,0x30,0x25,0x2d,xxxx, 0x9a,0xeb,0x04,0x0b,0xa2,0xb8,0xf6,xxxx, /* 80 */
// ???? pppp ???? pppp gggg
xxxx,xxxx,0x9d,xxxx,0xbb,xxxx,xxxx,0xcb, 0xa9,0xcf,xxxx,0x60,0x43,0x56,xxxx,xxxx, /* 90 */
// gggg gggg
xxxx,0xa3,xxxx,xxxx,xxxx,xxxx,0xfa,0xb4, xxxx,0x81,0xe6,0x48,0x80,0x8c,0xd4,xxxx, /* a0 */
// gggg ???? gggg gggg
xxxx,xxxx,0x84,0xb6,0x77,0x3d,0x3e,xxxx, xxxx,0xb7,0x4b,xxxx,xxxx,xxxx,xxxx,xxxx, /* b0 */
// gggg ???? gggg gggg ???? pppp
xxxx,0xff,0x47,xxxx,0x55,0x1e,xxxx,0x59, 0x93,xxxx,xxxx,xxxx,0x88,0xc1,0x01,0xb2, /* c0 */
// gggg pppp
0x01,0x2e,0x06,0xc7,0x05,xxxx,0x8a,0x5a, 0x58,0xbe,xxxx,0x4e,xxxx,0x1f,0x23,xxxx, /* d0 */
// ???? gggg
0xe8,xxxx,0x89,0xa1,0xd0,xxxx,xxxx,0xe2, 0x38,0xfe,0x50,0x9c,xxxx,xxxx,xxxx,0x49, /* e0 */
// gggg gggg
0xfb,0x20,0xf3,xxxx,xxxx,0x0f,xxxx,xxxx, xxxx,0x76,0xf7,0xbd,0x39,0x7e,0xbf,xxxx, /* f0 */
// pppp gggg gggg gggg
0x63,xxxx,xxxx,0x36,xxxx,0x52,0xb1,0x5b, 0x68,0xcd,xxxx,xxxx,xxxx,0xa8,xxxx,xxxx, /* 00 */
// 0x63 gggg gggg gggg
xxxx,xxxx,0x75,0x24,0x08,0x83,0x32,0xe9, xxxx,0x79,xxxx,0x8f,0x22,xxxx,0xac,xxxx, /* 10 */
// ???? pppp gggg
0x5d,0xa5,0x11,0x51,0x0a,0x29,xxxx,xxxx ,0xf8,0x98,0x91,0x40,0x28,0x00,0x03,0x5f, /* 20 */
// gggg gggg gggg gggg gggg gggg pppp
0x26,xxxx,xxxx,0x8b,0x2f,0x02,xxxx,xxxx, 0x8e,0xab,xxxx,xxxx,0xbc,0x90,0xb3,xxxx, /* 30 */
// gggg
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,0x4f,0xba,0x2a, /* 50 */
// gggg gggg gggg pppp gggg gggg
0xb0,xxxx,0x21,0x7d,xxxx,xxxx,0xb5,0x07, 0xb9,xxxx,0x27,0x46,0xf9,xxxx,xxxx,xxxx, /* 60 */
// pppp pppp gggg gggg
xxxx,0xea,0x72,0x73,0xad,0xd1,0x3b,0x5e, 0xe5,0x57,xxxx,0x0d,0xfd,xxxx,0x92,0x3c, /* 70 */
// gggg pppp gggg gggg
xxxx,0x86,0x78,0x7f,0x18,0x25,0x2d,xxxx, 0x9a,0xeb,0x04,0x0b,0xa2,0xb8,0xf6,xxxx, /* 80 */
// pppp pppp ???? pppp gggg
xxxx,xxxx,0x9d,xxxx,0xbb,xxxx,xxxx,0xcb, 0xa9,0xcf,xxxx,0x60,0x43,0x56,xxxx,xxxx, /* 90 */
// gggg gggg
xxxx,0xa3,xxxx,xxxx,0x82,xxxx,0xfa,0xb4, xxxx,0x81,0xe6,0x48,0x80,0x8c,0xd4,xxxx, /* a0 */
// ???? gggg ???? gggg gggg
0x42,xxxx,0x84,0xb6,0x77,0x3d,0x3e,xxxx, xxxx,0xb7,0x4b,xxxx,0xa4,xxxx,xxxx,xxxx, /* b0 */
// gggg gggg ???? gggg gggg ???? pppp gggg
xxxx,0xff,0x47,xxxx,0x55,0x1e,xxxx,0x59, 0x93,xxxx,xxxx,xxxx,0x88,0xc1,0x01,0xb2, /* c0 */
// gggg pppp
0x85,0x2e,0x06,0xc7,0x05,xxxx,0x8a,0x5a, 0x58,0xbe,xxxx,0x4e,xxxx,0x1f,0x23,xxxx, /* d0 */
// gggg gggg
0xe8,xxxx,0x89,0xa1,0xd0,xxxx,xxxx,0xe2, 0x38,0xfe,0x50,0x9c,xxxx,xxxx,xxxx,0x49, /* e0 */
// gggg gggg
0xfb,0x20,0xf3,xxxx,xxxx,0x0f,xxxx,xxxx, xxxx,0x76,0xf7,0xbd,0x39,0x7e,0xbf,xxxx, /* f0 */
// pppp gggg gggg gggg
};
@ -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, /* 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
}
*/
}