From 7dd472c53d0e2aad3ebbb403e5c9632bf5725b18 Mon Sep 17 00:00:00 2001 From: David Haywood <28625134+DavidHaywood@users.noreply.github.com> Date: Thu, 24 Sep 2020 17:45:48 +0100 Subject: machines promoted to WORKING (Plug and Play, vgtablet) (#7285) machines promoted to WORKING ---- VG Pocket Tablet (VG-4000) [David Haywood] * nes_vt - fixed logic for external memory / internal mapper selection * nes_vt - tweak vt control handling --- src/mame/drivers/nes_vt.cpp | 50 ++++++++++++++++++++++------------------- src/mame/machine/nes_vt_soc.cpp | 34 ++++++++++++++-------------- src/mame/machine/nes_vt_soc.h | 1 - 3 files changed, 44 insertions(+), 41 deletions(-) diff --git a/src/mame/drivers/nes_vt.cpp b/src/mame/drivers/nes_vt.cpp index 577ad9465d4..a09f9e2ce79 100644 --- a/src/mame/drivers/nes_vt.cpp +++ b/src/mame/drivers/nes_vt.cpp @@ -34,7 +34,8 @@ public: m_exin1(*this, "EXTRAIN1"), m_exin2(*this, "EXTRAIN2"), m_exin3(*this, "EXTRAIN3"), - m_prgrom(*this, "mainrom") + m_prgrom(*this, "mainrom"), + m_previous_port0(0) { } protected: @@ -75,6 +76,7 @@ protected: uint8_t upper_412c_r(); uint8_t upper_412d_r(); void upper_412c_w(uint8_t data); + int m_previous_port0; private: /* APU handling */ @@ -84,7 +86,6 @@ private: uint8_t extrain_1_r(); uint8_t extrain_2_r(); uint8_t extrain_3_r(); - }; class nes_vt_state : public nes_vt_base_state @@ -128,8 +129,6 @@ public: protected: required_device m_soc; - - void vt03_8000_mapper_w(offs_t offset, uint8_t data) { m_soc->vt03_8000_mapper_w(offset, data); } }; @@ -293,7 +292,6 @@ class nes_vt_cy_lexibook_state : public nes_vt_cy_state public: nes_vt_cy_lexibook_state(const machine_config& mconfig, device_type type, const char* tag) : nes_vt_cy_state(mconfig, type, tag), - m_previous_port0(0), m_latch0_bit(0), m_latch1_bit(0) { } @@ -306,7 +304,6 @@ protected: virtual void in0_w(uint8_t data) override; private: - int m_previous_port0; uint8_t m_latch0_bit; uint8_t m_latch1_bit; }; @@ -444,45 +441,45 @@ void nes_vt_base_state::vtspace_w(offs_t offset, uint8_t data) // VTxx can address 25-bit address space (32MB of ROM) so use maps with mirroring in depending on ROM size void nes_vt_state::vt_external_space_map_32mbyte(address_map &map) { - map(0x0000000, 0x1ffffff).rw(FUNC(nes_vt_state::vt_rom_r), FUNC(nes_vt_state::vt03_8000_mapper_w)); + map(0x0000000, 0x1ffffff).r(FUNC(nes_vt_state::vt_rom_r)); } void nes_vt_state::vt_external_space_map_16mbyte(address_map &map) { - map(0x0000000, 0x0ffffff).mirror(0x1000000).rw(FUNC(nes_vt_state::vt_rom_r), FUNC(nes_vt_state::vt03_8000_mapper_w)); + map(0x0000000, 0x0ffffff).mirror(0x1000000).r(FUNC(nes_vt_state::vt_rom_r)); } void nes_vt_state::vt_external_space_map_8mbyte(address_map &map) { - map(0x0000000, 0x07fffff).mirror(0x1800000).rw(FUNC(nes_vt_state::vt_rom_r), FUNC(nes_vt_state::vt03_8000_mapper_w)); + map(0x0000000, 0x07fffff).mirror(0x1800000).r(FUNC(nes_vt_state::vt_rom_r)); } void nes_vt_state::vt_external_space_map_4mbyte(address_map &map) { - map(0x0000000, 0x03fffff).mirror(0x1c00000).rw(FUNC(nes_vt_state::vt_rom_r), FUNC(nes_vt_state::vt03_8000_mapper_w)); + map(0x0000000, 0x03fffff).mirror(0x1c00000).r(FUNC(nes_vt_state::vt_rom_r)); } void nes_vt_state::vt_external_space_map_2mbyte(address_map &map) { - map(0x0000000, 0x01fffff).mirror(0x1e00000).rw(FUNC(nes_vt_state::vt_rom_r), FUNC(nes_vt_state::vt03_8000_mapper_w)); + map(0x0000000, 0x01fffff).mirror(0x1e00000).r(FUNC(nes_vt_state::vt_rom_r)); } void nes_vt_state::vt_external_space_map_1mbyte(address_map &map) { - map(0x0000000, 0x00fffff).mirror(0x1f00000).rw(FUNC(nes_vt_state::vt_rom_r), FUNC(nes_vt_state::vt03_8000_mapper_w)); + map(0x0000000, 0x00fffff).mirror(0x1f00000).r(FUNC(nes_vt_state::vt_rom_r)); } void nes_vt_state::vt_external_space_map_512kbyte(address_map &map) { - map(0x0000000, 0x007ffff).mirror(0x1f80000).rw(FUNC(nes_vt_state::vt_rom_r), FUNC(nes_vt_state::vt03_8000_mapper_w)); + map(0x0000000, 0x007ffff).mirror(0x1f80000).r(FUNC(nes_vt_state::vt_rom_r)); } // Win Lose Draw has RAM as well as ROM void nes_vt_swap_op_d5_d6_state::vt_external_space_map_senwld_512kbyte(address_map &map) { - map(0x0000000, 0x007ffff).rw(FUNC(nes_vt_swap_op_d5_d6_state::vt_rom_r), FUNC(nes_vt_swap_op_d5_d6_state::vtspace_w)); + map(0x0000000, 0x007ffff).r(FUNC(nes_vt_swap_op_d5_d6_state::vt_rom_r)); map(0x0100000, 0x010ffff).ram(); - map(0x0180000, 0x01fffff).rw(FUNC(nes_vt_swap_op_d5_d6_state::vt_rom_r), FUNC(nes_vt_swap_op_d5_d6_state::vtspace_w)); + map(0x0180000, 0x01fffff).r(FUNC(nes_vt_swap_op_d5_d6_state::vt_rom_r)); } // bitboy is 2 16Mbyte banks @@ -493,7 +490,7 @@ uint8_t nes_vt_cy_state::vt_rom_banked_r(offs_t offset) void nes_vt_cy_state::vt_external_space_map_bitboy_2x16mbyte(address_map &map) { - map(0x0000000, 0x0ffffff).mirror(0x1000000).rw(FUNC(nes_vt_cy_state::vt_rom_banked_r), FUNC(nes_vt_cy_state::vt03_8000_mapper_w)); + map(0x0000000, 0x0ffffff).mirror(0x1000000).r(FUNC(nes_vt_cy_state::vt_rom_banked_r)); } // fapocket is 4 16Mbyte banks @@ -504,7 +501,7 @@ uint8_t nes_vt_dg_state::vt_rom_banked_r(offs_t offset) void nes_vt_dg_state::vt_external_space_map_fapocket_4x16mbyte(address_map &map) { - map(0x0000000, 0x0ffffff).mirror(0x1000000).rw(FUNC(nes_vt_dg_state::vt_rom_banked_r), FUNC(nes_vt_dg_state::vt03_8000_mapper_w)); + map(0x0000000, 0x0ffffff).mirror(0x1000000).r(FUNC(nes_vt_dg_state::vt_rom_banked_r)); } uint8_t nes_vt_hh_state::vt_rom_banked_r(offs_t offset) @@ -514,7 +511,7 @@ uint8_t nes_vt_hh_state::vt_rom_banked_r(offs_t offset) void nes_vt_hh_state::vt_external_space_map_fp_2x32mbyte(address_map &map) { - map(0x0000000, 0x1ffffff).rw(FUNC(nes_vt_hh_state::vt_rom_banked_r), FUNC(nes_vt_hh_state::vt03_8000_mapper_w)); + map(0x0000000, 0x1ffffff).r(FUNC(nes_vt_hh_state::vt_rom_banked_r)); } uint8_t nes_vt_base_state::extrain_0_r() @@ -584,11 +581,18 @@ uint8_t nes_vt_base_state::in1_r() void nes_vt_base_state::in0_w(uint8_t data) { //logerror("%s: in0_w %02x\n", machine().describe_context(), data); - if (data & 0x01) - return; - m_latch0 = m_io0->read(); - m_latch1 = m_io1->read(); + // need to check this or some games (eg cybar120 Aero Engine) won't have working inputs as they repeatedly write a pattern of 02 / 00 here between fetches which resets the latch + if ((data & 0x01) != (m_previous_port0 & 0x01)) + { + if (data & 0x01) + { + m_latch0 = m_io0->read(); + m_latch1 = m_io1->read(); + } + } + + m_previous_port0 = data; } /* Lexibook I/O handlers */ @@ -2182,7 +2186,7 @@ CONS( 200?, mc_dgear, 0, 0, nes_vt_4mb, nes_vt, nes_vt_state, empty_init, // all software in this runs in the VT03 enhanced mode, it also includes an actual licensed VT03 port of Frogger. // all games work OK except Frogger which has serious graphical issues -CONS( 2006, vgtablet, 0, 0, nes_vt_vg_4mb_rasterhack, nes_vt, nes_vt_hh_state, empty_init, "Performance Designed Products (licensed by Konami)", "VG Pocket Tablet (VG-4000)", MACHINE_NOT_WORKING ) // raster timing for Frogger needs a hack, controls fail in several games eg Stellar Attack, River Quest +CONS( 2006, vgtablet, 0, 0, nes_vt_vg_4mb_rasterhack, nes_vt, nes_vt_hh_state, empty_init, "Performance Designed Products (licensed by Konami)", "VG Pocket Tablet (VG-4000)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // raster timing for Frogger needs a hack // There is a 2004 Majesco Frogger "TV game" that appears to contain the same version of Frogger as above but with no other games, so probably fits here. CONS( 2004, majkon, 0, 0, nes_vt_vg_1mb_majkon, nes_vt, nes_vt_hh_state, empty_init, "Majesco (licensed from Konami)", "Konami Collector's Series Arcade Advanced", MACHINE_NOT_WORKING ) // raster timing for Frogger needs a hack, Green Beret has other serious issues diff --git a/src/mame/machine/nes_vt_soc.cpp b/src/mame/machine/nes_vt_soc.cpp index a0174ffb3ca..1237c4e3584 100644 --- a/src/mame/machine/nes_vt_soc.cpp +++ b/src/mame/machine/nes_vt_soc.cpp @@ -300,8 +300,6 @@ uint32_t nes_vt_soc_device::get_banks(uint8_t bnk) // 8000 needs to bank in 60000 ( bank 0x30 ) void nes_vt_soc_device::update_banks() { - //uint32_t amod = m_ahigh >> 13; - uint8_t bank; // 8000-9fff @@ -315,11 +313,11 @@ void nes_vt_soc_device::update_banks() else bank = 0xfe; - m_bankaddr[0] = ((/*amod |*/ get_banks(bank)) ); + m_bankaddr[0] = get_banks(bank); // a000-bfff bank = m_410x[0x8]; - m_bankaddr[1] = ((/*amod |*/ get_banks(bank)) ); + m_bankaddr[1] = get_banks(bank); // c000-dfff if ((m_410x[0xb] & 0x40) != 0 || (m_410x[0x5] & 0x40) != 0) @@ -332,11 +330,11 @@ void nes_vt_soc_device::update_banks() else bank = 0xfe; - m_bankaddr[2] = ((/*amod |*/ get_banks(bank)) ); + m_bankaddr[2] = get_banks(bank); // e000 - ffff bank = m_initial_e000_bank; - m_bankaddr[3] = ((/*amod |*/ get_banks(bank)) ); + m_bankaddr[3] = get_banks(bank); } uint16_t nes_vt_soc_device::decode_nt_addr(uint16_t addr) @@ -762,7 +760,7 @@ int nes_vt_soc_device::calculate_real_video_address(int addr, int extended, int } } - return /*m_ahigh |*/ finaladdr; + return finaladdr; } /* @@ -770,16 +768,13 @@ int nes_vt_soc_device::calculate_real_video_address(int addr, int extended, int used for MMC3/other mapper compatibility some consoles have scrambled registers for crude copy protection - - is this always there with VT based games? it maps where mappers would be on a NES cartridge - but then seems to be able to alter internal state of extended PPU registers, which is awkward */ void nes_vt_soc_device::scrambled_8000_w(uint16_t offset, uint8_t data) { offset &= 0x7fff; - uint16_t addr = m_real_access_address; // we need the actual write address, not the translated one, to keep bittboy happy + uint16_t addr = offset+0x8000; if ((m_411d & 0x01) && (m_411d & 0x03)) { //CNROM compat @@ -1116,17 +1111,22 @@ uint8_t nes_vt_soc_device::external_space_read(offs_t offset) address_space& spc = this->space(AS_PROGRAM); int bank = (offset & 0x6000) >> 13; int address = (m_bankaddr[bank] * 0x2000) + (offset & 0x1fff); - m_real_access_address = offset + 0x8000; return spc.read_byte(address); } void nes_vt_soc_device::external_space_write(offs_t offset, uint8_t data) { - address_space& spc = this->space(AS_PROGRAM); - int bank = (offset & 0x6000) >> 13; - int address = (m_bankaddr[bank] * 0x2000) + (offset&0x1fff); - m_real_access_address = offset + 0x8000; - spc.write_byte(address, data); + if ((m_410x[0xb] & 0x08)) + { + address_space& spc = this->space(AS_PROGRAM); + int bank = (offset & 0x6000) >> 13; + int address = (m_bankaddr[bank] * 0x2000) + (offset & 0x1fff); + spc.write_byte(address, data); + } + else + { + vt03_8000_mapper_w(offset, data); + } }; void nes_vt_soc_device::nes_vt_map(address_map &map) diff --git a/src/mame/machine/nes_vt_soc.h b/src/mame/machine/nes_vt_soc.h index 118f5df0c63..c6695ecf812 100644 --- a/src/mame/machine/nes_vt_soc.h +++ b/src/mame/machine/nes_vt_soc.h @@ -142,7 +142,6 @@ private: address_space_config m_space_config; int m_bankaddr[4]; - uint16_t m_real_access_address; devcb_write8 m_write_0_callback; devcb_read8 m_read_0_callback; -- cgit v1.2.3