viper: unknown serial device at 0xff300000 (nw)

This commit is contained in:
Ville Linde 2016-02-06 19:53:49 +02:00
parent 26b1bd7acb
commit 2c764cad88

View File

@ -385,6 +385,11 @@ public:
int m_cf_card_ide; int m_cf_card_ide;
int m_unk1_bit; int m_unk1_bit;
UINT32 m_voodoo3_pci_reg[0x100]; UINT32 m_voodoo3_pci_reg[0x100];
int m_unk_serial_bit_w;
UINT16 m_unk_serial_cmd;
UINT16 m_unk_serial_data;
UINT16 m_unk_serial_data_r;
UINT8 m_unk_serial_regs[0x80];
DECLARE_READ32_MEMBER(epic_r); DECLARE_READ32_MEMBER(epic_r);
DECLARE_WRITE32_MEMBER(epic_w); DECLARE_WRITE32_MEMBER(epic_w);
@ -413,9 +418,12 @@ public:
DECLARE_WRITE64_MEMBER(cf_card_w); DECLARE_WRITE64_MEMBER(cf_card_w);
DECLARE_READ64_MEMBER(ata_r); DECLARE_READ64_MEMBER(ata_r);
DECLARE_WRITE64_MEMBER(ata_w); DECLARE_WRITE64_MEMBER(ata_w);
DECLARE_READ64_MEMBER(unk_serial_r);
DECLARE_WRITE64_MEMBER(unk_serial_w);
DECLARE_WRITE_LINE_MEMBER(voodoo_vblank); DECLARE_WRITE_LINE_MEMBER(voodoo_vblank);
DECLARE_DRIVER_INIT(viper); DECLARE_DRIVER_INIT(viper);
DECLARE_DRIVER_INIT(vipercf); DECLARE_DRIVER_INIT(vipercf);
DECLARE_DRIVER_INIT(viperhd);
virtual void machine_start() override; virtual void machine_start() override;
virtual void machine_reset() override; virtual void machine_reset() override;
UINT32 screen_update_viper(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); UINT32 screen_update_viper(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@ -1970,6 +1978,68 @@ READ64_MEMBER(viper_state::e00000_r)
return r; return r;
} }
READ64_MEMBER(viper_state::unk_serial_r)
{
UINT64 r = 0;
if (ACCESSING_BITS_16_31)
{
int bit = m_unk_serial_data_r & 0x1;
m_unk_serial_data_r >>= 1;
r |= bit << 17;
}
return r;
}
WRITE64_MEMBER(viper_state::unk_serial_w)
{
if (ACCESSING_BITS_16_31)
{
if (data & 0x10000)
{
int bit = (data & 0x20000) ? 1 : 0;
if (m_unk_serial_bit_w < 8)
{
if (m_unk_serial_bit_w > 0)
m_unk_serial_cmd <<= 1;
m_unk_serial_cmd |= bit;
}
else
{
if (m_unk_serial_bit_w > 8)
m_unk_serial_data <<= 1;
m_unk_serial_data |= bit;
}
m_unk_serial_bit_w++;
if (m_unk_serial_bit_w == 8)
{
if ((m_unk_serial_cmd & 0x80) == 0) // register read
{
int reg = m_unk_serial_cmd & 0x7f;
UINT8 data = m_unk_serial_regs[reg];
m_unk_serial_data_r = ((data & 0x1) << 7) | ((data & 0x2) << 5) | ((data & 0x4) << 3) | ((data & 0x8) << 1) | ((data & 0x10) >> 1) | ((data & 0x20) >> 3) | ((data & 0x40) >> 5) | ((data & 0x80) >> 7);
printf("unk_serial read reg %02X: %04X\n", reg, data);
}
}
if (m_unk_serial_bit_w == 16)
{
if (m_unk_serial_cmd & 0x80) // register write
{
int reg = m_unk_serial_cmd & 0x7f;
m_unk_serial_regs[reg] = m_unk_serial_data;
printf("unk_serial write reg %02X: %04X\n", reg, m_unk_serial_data);
}
m_unk_serial_bit_w = 0;
m_unk_serial_cmd = 0;
m_unk_serial_data = 0;
}
}
}
}
/*****************************************************************************/ /*****************************************************************************/
@ -1984,7 +2054,7 @@ static ADDRESS_MAP_START(viper_map, AS_PROGRAM, 64, viper_state )
AM_RANGE(0xfee00000, 0xfeefffff) AM_READWRITE(pci_config_data_r, pci_config_data_w) AM_RANGE(0xfee00000, 0xfeefffff) AM_READWRITE(pci_config_data_r, pci_config_data_w)
// 0xff000000, 0xff000fff - cf_card_data_r/w (installed in DRIVER_INIT(vipercf)) // 0xff000000, 0xff000fff - cf_card_data_r/w (installed in DRIVER_INIT(vipercf))
// 0xff200000, 0xff200fff - cf_card_r/w (installed in DRIVER_INIT(vipercf)) // 0xff200000, 0xff200fff - cf_card_r/w (installed in DRIVER_INIT(vipercf))
AM_RANGE(0xff300000, 0xff300fff) AM_READWRITE(ata_r, ata_w) // 0xff300000, 0xff300fff - ata_r/w (installed in DRIVER_INIT(viperhd))
AM_RANGE(0xffe00000, 0xffe00007) AM_READ(e00000_r) AM_RANGE(0xffe00000, 0xffe00007) AM_READ(e00000_r)
AM_RANGE(0xffe00008, 0xffe0000f) AM_READWRITE(e00008_r, e00008_w) AM_RANGE(0xffe00008, 0xffe0000f) AM_READWRITE(e00008_r, e00008_w)
AM_RANGE(0xffe10000, 0xffe10007) AM_READ(unk1_r) AM_RANGE(0xffe10000, 0xffe10007) AM_READ(unk1_r)
@ -2135,12 +2205,21 @@ DRIVER_INIT_MEMBER(viper_state,viper)
// m_maincpu->space(AS_PROGRAM).install_legacy_readwrite_handler( *ide, 0xff200000, 0xff207fff, FUNC(hdd_r), FUNC(hdd_w) ); //TODO // m_maincpu->space(AS_PROGRAM).install_legacy_readwrite_handler( *ide, 0xff200000, 0xff207fff, FUNC(hdd_r), FUNC(hdd_w) ); //TODO
} }
DRIVER_INIT_MEMBER(viper_state,viperhd)
{
DRIVER_INIT_CALL(viper);
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xff300000, 0xff300fff, read64_delegate(FUNC(viper_state::ata_r), this), write64_delegate(FUNC(viper_state::ata_w), this));
}
DRIVER_INIT_MEMBER(viper_state,vipercf) DRIVER_INIT_MEMBER(viper_state,vipercf)
{ {
DRIVER_INIT_CALL(viper); DRIVER_INIT_CALL(viper);
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xff000000, 0xff000fff, read64_delegate(FUNC(viper_state::cf_card_data_r), this), write64_delegate(FUNC(viper_state::cf_card_data_w), this) ); m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xff000000, 0xff000fff, read64_delegate(FUNC(viper_state::cf_card_data_r), this), write64_delegate(FUNC(viper_state::cf_card_data_w), this) );
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xff200000, 0xff200fff, read64_delegate(FUNC(viper_state::cf_card_r), this), write64_delegate(FUNC(viper_state::cf_card_w), this) ); m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xff200000, 0xff200fff, read64_delegate(FUNC(viper_state::cf_card_r), this), write64_delegate(FUNC(viper_state::cf_card_w), this) );
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xff300000, 0xff300fff, read64_delegate(FUNC(viper_state::unk_serial_r), this), write64_delegate(FUNC(viper_state::unk_serial_w), this) );
} }
@ -2631,7 +2710,7 @@ ROM_END
/* Viper BIOS */ /* Viper BIOS */
GAME(1999, kviper, 0, viper, viper, viper_state, viper, ROT0, "Konami", "Konami Viper BIOS", MACHINE_IS_BIOS_ROOT) GAME(1999, kviper, 0, viper, viper, viper_state, viper, ROT0, "Konami", "Konami Viper BIOS", MACHINE_IS_BIOS_ROOT)
GAME(2001, ppp2nd, kviper, viper, viper, viper_state, viper, ROT0, "Konami", "ParaParaParadise 2nd Mix", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) GAME(2001, ppp2nd, kviper, viper, viper, viper_state, viperhd, ROT0, "Konami", "ParaParaParadise 2nd Mix", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
GAME(2001, boxingm, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "Boxing Mania (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) GAME(2001, boxingm, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "Boxing Mania (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
GAME(2000, code1d, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "Code One Dispatch (ver D)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) GAME(2000, code1d, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "Code One Dispatch (ver D)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)