diff options
author | AJR <ajrhacker@users.noreply.github.com> | 2019-07-13 08:19:12 -0400 |
---|---|---|
committer | AJR <ajrhacker@users.noreply.github.com> | 2019-07-13 08:19:40 -0400 |
commit | 744839a514dd9107a5c8c79d3ec60548e6b7ce84 (patch) | |
tree | 0975ed64141ff2c81b5081c5effa5d095813744d | |
parent | ddafcbcbfc96c5abefdfccbdbd1e2bb3139f90ee (diff) |
theboat: More accurate ROM banking (nw)
-rw-r--r-- | src/mame/drivers/tvg01.cpp | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/src/mame/drivers/tvg01.cpp b/src/mame/drivers/tvg01.cpp index 7d280fea3e7..fbbe4141b04 100644 --- a/src/mame/drivers/tvg01.cpp +++ b/src/mame/drivers/tvg01.cpp @@ -72,6 +72,7 @@ public: tvg01_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_player_inputs{{*this, "INP1.%u", 0U}, {*this, "INP2.%u", 0U}} + , m_banked_rom(*this, "banked_rom") { } @@ -83,20 +84,23 @@ protected: private: template <int P> void input_select_w(u8 data); u8 player_inputs_r(); + void bank_select_w(u8 data); + u8 bank_r(offs_t offset); void mem_map(address_map &map); void io_map(address_map &map); required_ioport_array<6> m_player_inputs[2]; + required_region_ptr<u8> m_banked_rom; u8 m_input_select[2]; + u8 m_bank_select; }; void tvg01_state::machine_start() { - membank("gfxbank")->configure_entries(0, 4, memregion("gfx")->base(), 0x4000); - save_item(NAME(m_input_select)); + save_item(NAME(m_bank_select)); } template <int P> @@ -117,11 +121,27 @@ u8 tvg01_state::player_inputs_r() return result; } +void tvg01_state::bank_select_w(u8 data) +{ + m_bank_select = data; +} + +u8 tvg01_state::bank_r(offs_t offset) +{ + u8 result = 0xff; + + for (int i = 0; i < 4; i++) + if (!BIT(m_bank_select, i)) + result &= m_banked_rom[i * 0x4000 + offset]; + + return result; +} + void tvg01_state::mem_map(address_map &map) { map(0x0000, 0x7fff).rom().region("program", 0); map(0x8000, 0x87ff).ram().share("nvram"); - map(0xc000, 0xffff).bankr("gfxbank"); + map(0xc000, 0xffff).r(FUNC(tvg01_state::bank_r)); } void tvg01_state::io_map(address_map &map) @@ -260,7 +280,7 @@ void tvg01_state::theboat(machine_config &config) i8255_device &ppi1(I8255(config, "ppi1")); // D8255AC-2 ppi1.in_pa_callback().set_ioport("INP0"); - ppi1.out_pb_callback().set_membank("gfxbank").mask(0x03); + ppi1.out_pb_callback().set(FUNC(tvg01_state::bank_select_w)); i8255_device &ppi2(I8255(config, "ppi2")); // D8255AC-2 ppi2.out_pa_callback().set(FUNC(tvg01_state::input_select_w<0>)); @@ -286,10 +306,10 @@ ROM_START(theboat) ROM_LOAD("1.ic3", 0x0000, 0x4000, CRC(04a0ef56) SHA1(40256f858032efa1375d336f141dbbd08a8802f7)) ROM_LOAD("2.ic5", 0x4000, 0x4000, CRC(c18d4a61) SHA1(c40a8b7dcaa90ed871be20605fc853949361257e)) - ROM_REGION(0x10000, "gfx", 0) - ROM_LOAD("3.ic8", 0x8000, 0x4000, CRC(74b44e32) SHA1(b36c90a13511c5bf4aef079ac506605096e39067)) + ROM_REGION(0x10000, "banked_rom", 0) // contains both code and data + ROM_LOAD("3.ic8", 0x0000, 0x4000, CRC(74b44e32) SHA1(b36c90a13511c5bf4aef079ac506605096e39067)) ROM_LOAD("4.ic11", 0x4000, 0x4000, CRC(4ea36fa3) SHA1(b020a478e8dd72154916c67d71255b5a6a822d6d)) - ROM_LOAD("5.ic14", 0xc000, 0x4000, CRC(7899a587) SHA1(13cbb7e837e14bc49d8b34dbf876b666cdf48979)) + ROM_LOAD("5.ic14", 0x8000, 0x4000, CRC(7899a587) SHA1(13cbb7e837e14bc49d8b34dbf876b666cdf48979)) // Empty socket for one more ROM (IC16), ROM_END |