// license:LGPL-2.1+
// copyright-holders:Angelo Salese, Olivier Galibert, David Haywood, Samuele Zannoli, R. Belmont, ElSemi
/***************************************************************************
Per-game specific JVS settings / idle loop skips for the MAME Naomi driver.
suchie3: check bp c0a6458 (might be protection related)
tetkiwam: check bp c09613a
vtennis: check wpset dee3ec8,8,w,wpdata==0xa8804000
vtennis2: check bp c020130 / wpset c013ff0,f,w,wpdata==0x3f800000 -> 0xc020434 (test mode)
smarinef: put cabinet in STD mode, bp c027968, wpset c0e66a6,4,w
hotd2: bp 0xc0ba235, modify work RAM 0xc9c35e8 to be zero, bpclear
hotd2o: bp 0xc0ba1f6, modify work RAM 0xc9c35a8 to be zero, bpclear
***************************************************************************/
#include "emu.h"
#include "includes/dc.h"
#include "includes/naomi.h"
#include "sound/aica.h"
READ64_MEMBER(naomi_state::naomi_biose_idle_skip_r )
{
// if (space.device().safe_pc()==0xc04173c)
// space.device().execute().spin_until_time(attotime::from_usec(500));
//space.device().execute().spin_until_interrupt();
// else
// printf("%08x\n", space.device().safe_pc());
return dc_ram[0x2ad238/8];
}
READ64_MEMBER(naomi_state::naomi_biosh_idle_skip_r )
{
// if (space.device().safe_pc()==0xc045ffc)
// space.device().execute().spin_until_time(attotime::from_usec(500));
// printf("%08x\n", space.device().safe_pc());
return dc_ram[0x2b0600/8];
}
READ64_MEMBER(naomi_state::naomi2_biose_idle_skip_r )
{
// if (space.device().safe_pc()==0xc04637c)
// space.device().execute().spin_until_time(attotime::from_usec(500));
//space.device().execute().spin_until_interrupt();
// else
// printf("%08x\n", space.device().safe_pc());
return dc_ram[0x2b0600/8];
}
UINT8 naomi_state::asciihex_to_dec(UINT8 in)
{
if (in>=0x30 && in<=0x39)
{
return in - 0x30;
}
else
if (in>=0x41 && in<=0x46)
{
return in - 0x37;
}
/*
else
if (in>=0x61 && in<=0x66)
{
return in - 0x57;
}
*/
else
{
fatalerror("unexpected value in asciihex_to_dec\n");
}
}
// development helper function
void naomi_state::create_pic_from_retdat()
{
{
UINT8* hexregion = memregion("pichex")->base();
UINT8* retregion = memregion("picreturn")->base();
UINT8* newregion = memregion("pic")->base();
int outcount = 0;
if (hexregion && retregion && newregion)
{
int hexoffs = 0;
int line;
hexoffs += 0x11; // skip first line // :020000040000FA
for (line=0;line<0x200;line++)
{
int offs2;
hexoffs+= 0x1; // skip :
hexoffs+= 0x8; // skip line # (:20xxxxxx incrementing in 0x2000)
for (offs2=0;offs2<0x20;offs2++)
{
UINT8 ascii1 = hexregion[hexoffs+0];
UINT8 ascii2 = hexregion[hexoffs+1];
UINT8 dec1 = asciihex_to_dec(ascii1);
UINT8 dec2 = asciihex_to_dec(ascii2);
UINT8 val = dec1 << 4 | dec2;
//printf("%02x%02x", ascii1, ascii2);
printf("%02x", val);
newregion[outcount] = val;
hexoffs+=2;
outcount++;
}
hexoffs+=0x4; // skip running checksum + newline
printf("\n");
}
{
int i;
printf("string 1 (key1)\n");
for (i=0;i<7;i++)
{
printf("%02x %02x\n", newregion[0x780+i*2], retregion[0x31+i]);
newregion[0x780+i*2] = retregion[0x31+i]; // patch with extracted data
}
printf("string 2 (key2)\n");
for (i=0;i<7;i++)
{
printf("%02x %02x\n", newregion[0x7a0+i*2], retregion[0x29+i]);
newregion[0x7a0+i*2] = retregion[0x29+i]; // patch with extracted data
}
printf("string 3 (filename)\n");
for (i=0;i<7;i++)
{
printf("%02x %02x\n", newregion[0x7c0+i*2], retregion[0x21+i]);
newregion[0x7c0+i*2] = retregion[0x21+i]; // patch with extracted data
}
printf("string 4 (filename?)\n");
for (i=0;i<7;i++)
{
printf("%02x %02x\n", newregion[0x7e0+i*2], retregion[0x19+i]);
newregion[0x7e0+i*2] = retregion[0x19+i]; // patch with extracted data
}
}
{
FILE *fp;
char filename[256];
sprintf(filename,"picbin_%s", machine().system().name);
fp=fopen(filename, "w+b");
if (fp)
{
fwrite(newregion, outcount, 1, fp);
fclose(fp);
}
printf("wrote %04x bytes\n", outcount);
}
// hex dumps end with
//:10400000000000000000000000000000000082002E
//:00000001FF
}
}
}
DRIVER_INIT_MEMBER(naomi_state,naomi)
{
//m_maincpu->space(AS_PROGRAM).install_read_handler(0xc2ad238, 0xc2ad23f, read64_delegate(FUNC(naomi_state::naomi_biose_idle_skip_r),this); // rev e bios
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc2b0600, 0xc2b0607, read64_delegate(FUNC(naomi_state::naomi_biosh_idle_skip_r),this)); // rev h bios
actel_id = 0xffff;
create_pic_from_retdat();
}
DRIVER_INIT_MEMBER(naomi_state,naomi2)
{
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc2b0600, 0xc2b0607, read64_delegate(FUNC(naomi_state::naomi2_biose_idle_skip_r),this)); // rev e bios
actel_id = 0xffff;
create_pic_from_retdat();
}
INPUT_CHANGED_MEMBER(naomi_state::naomi_mp_w)
{
m_mp_mux = newval;
}
CUSTOM_INPUT_MEMBER(naomi_state::naomi_mp_r)
{
const char *tagptr = (const char *)param;
UINT8 retval = 0;
for (int i = 0x80; i >= 0x08; i >>= 1)
{
if (m_mp_mux & i)
retval |= read_safe(ioport(tagptr), 0);
tagptr += strlen(tagptr) + 1;
}
return retval;
}
DRIVER_INIT_MEMBER(naomi_state,naomi_mp)
{
//m_maincpu->space(AS_PROGRAM).install_read_handler(0xc2ad238, 0xc2ad23f, read64_delegate(FUNC(naomi_state::naomi_biose_idle_skip_r),this); // rev e bios
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc2b0600, 0xc2b0607, read64_delegate(FUNC(naomi_state::naomi_biosh_idle_skip_r),this)); // rev h bios
actel_id = 0xffff;
m_mp_mux = 0;
create_pic_from_retdat();
}
DRIVER_INIT_MEMBER(naomi_state,naomigd)
{
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc2ad238, 0xc2ad23f, read64_delegate(FUNC(naomi_state::naomi_biose_idle_skip_r),this)); // rev e bios
//m_maincpu->space(AS_PROGRAM).install_read_handler(0xc2b0600, 0xc2b0607, read64_delegate(FUNC(naomi_state::naomi_biosh_idle_skip_r),this)); // rev h bios
actel_id = 0xffff;
create_pic_from_retdat();
}
DRIVER_INIT_MEMBER(naomi_state,naomigd_mp)
{
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc2ad238, 0xc2ad23f, read64_delegate(FUNC(naomi_state::naomi_biose_idle_skip_r),this)); // rev e bios
//m_maincpu->space(AS_PROGRAM).install_read_handler(0xc2b0600, 0xc2b0607, read64_delegate(FUNC(naomi_state::naomi_biosh_idle_skip_r),this)); // rev h bios
actel_id = 0xffff;
m_mp_mux = 0;
create_pic_from_retdat();
}
READ64_MEMBER(naomi_state::naomigd_ggxxsla_idle_skip_r )
{
// if (space.device().safe_pc()==0x0c0c9adc)
// space.device().execute().spin_until_time(attotime::from_usec(500));
return dc_ram[0x1aae18/8];
}
DRIVER_INIT_MEMBER(naomi_state,ggxxsla)
{
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc1aae18, 0xc1aae1f, read64_delegate(FUNC(naomi_state::naomigd_ggxxsla_idle_skip_r),this));
DRIVER_INIT_CALL(naomigd);
}
READ64_MEMBER(naomi_state::naomigd_ggxx_idle_skip_r )
{
// if (space.device().safe_pc()==0xc0b5c3c) // or 0xc0bab0c
// space.device().execute().spin_until_time(attotime::from_usec(500));
return dc_ram[0x1837b8/8];
}
DRIVER_INIT_MEMBER(naomi_state,ggxx)
{
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc1837b8, 0xc1837bf, read64_delegate(FUNC(naomi_state::naomigd_ggxx_idle_skip_r),this));
DRIVER_INIT_CALL(naomigd);
}
READ64_MEMBER(naomi_state::naomigd_ggxxrl_idle_skip_r )
{
// if (space.device().safe_pc()==0xc0b84bc) // or 0xc0bab0c
// space.device().execute().spin_until_time(attotime::from_usec(500));
//printf("%08x\n", space.device().safe_pc());
return dc_ram[0x18d6c8/8];
}
DRIVER_INIT_MEMBER(naomi_state,ggxxrl)
{
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc18d6c8, 0xc18d6cf, read64_delegate(FUNC(naomi_state::naomigd_ggxxrl_idle_skip_r),this));
DRIVER_INIT_CALL(naomigd);
}
/* at least speeds up the annoying copyright screens ;-) */
READ64_MEMBER(naomi_state::naomigd_sfz3ugd_idle_skip_r )
{
// if (space.device().safe_pc()==0xc36a2dc)
// space.device().execute().spin_until_time(attotime::from_usec(500));
return dc_ram[0x5dc900/8];
}
DRIVER_INIT_MEMBER(naomi_state,sfz3ugd)
{
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc5dc900, 0xc5dc907, read64_delegate(FUNC(naomi_state::naomigd_sfz3ugd_idle_skip_r),this));
DRIVER_INIT_CALL(naomigd);
}
DRIVER_INIT_MEMBER(naomi_state,qmegamis)
{
DRIVER_INIT_CALL(naomi);
actel_id = 0; //FIXME: correct value
}
DRIVER_INIT_MEMBER(naomi_state,mvsc2)
{
DRIVER_INIT_CALL(naomi);
actel_id = 0; //FIXME: correct value
}
DRIVER_INIT_MEMBER(naomi_state,gram2000)
{
DRIVER_INIT_CALL(naomi);
actel_id = 0; //FIXME: correct value
}
DRIVER_INIT_MEMBER(naomi_state,vf4evoct)
{
DRIVER_INIT_CALL(naomi2);
actel_id = 0; //FIXME: correct value
}
DRIVER_INIT_MEMBER(naomi_state,kick4csh)
{
DRIVER_INIT_CALL(naomi);
actel_id = 0; //FIXME: correct value
}
READ64_MEMBER(naomi_state::hotd2_idle_skip_r )
{
// if (space.device().safe_pc()==0xc0cfcbc)
// space.device().execute().spin_until_time(attotime::from_usec(500));
//space.device().execute().spin_until_interrupt();
// else
// printf("%08x\n", space.device().safe_pc());
return dc_ram[0xa25fb8/8];
}
DRIVER_INIT_MEMBER(naomi_state,hotd2)
{
m_maincpu->space(AS_PROGRAM).install_read_handler(0xca25fb8, 0xca25fbf, read64_delegate(FUNC(naomi_state::hotd2_idle_skip_r),this));
}
// f355 PC=0xc065f7c RAM=0xc26dafc