diff --git a/src/mame/drivers/viper.cpp b/src/mame/drivers/viper.cpp index 8f4bd3cfbd1..12a63346d22 100644 --- a/src/mame/drivers/viper.cpp +++ b/src/mame/drivers/viper.cpp @@ -385,6 +385,11 @@ public: int m_cf_card_ide; int m_unk1_bit; 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_WRITE32_MEMBER(epic_w); @@ -413,9 +418,12 @@ public: DECLARE_WRITE64_MEMBER(cf_card_w); DECLARE_READ64_MEMBER(ata_r); DECLARE_WRITE64_MEMBER(ata_w); + DECLARE_READ64_MEMBER(unk_serial_r); + DECLARE_WRITE64_MEMBER(unk_serial_w); DECLARE_WRITE_LINE_MEMBER(voodoo_vblank); DECLARE_DRIVER_INIT(viper); DECLARE_DRIVER_INIT(vipercf); + DECLARE_DRIVER_INIT(viperhd); virtual void machine_start() override; virtual void machine_reset() override; 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; } +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) // 0xff000000, 0xff000fff - cf_card_data_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(0xffe00008, 0xffe0000f) AM_READWRITE(e00008_r, e00008_w) 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 } +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_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(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 */ 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(2000, code1d, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "Code One Dispatch (ver D)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)