diff options
author | 2018-08-26 10:35:15 +0200 | |
---|---|---|
committer | 2018-08-26 10:36:30 +0200 | |
commit | dd64cdceee66f5b3f5b92eb8e62348f8c4a786cf (patch) | |
tree | 75bf0e751222849ae0a58a16438efa4bd1cb45d1 /src | |
parent | 03adeab064e844d8cb26dbb2c7ce56f2b1fb72f9 (diff) |
emumem: Fix ioports/membanks in internal maps [O. Galibert]
PS: That may break things, we'll see.
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/cpu/st62xx/st62xx.cpp | 58 | ||||
-rw-r--r-- | src/devices/cpu/st62xx/st62xx.h | 11 | ||||
-rw-r--r-- | src/emu/device.cpp | 17 | ||||
-rw-r--r-- | src/emu/device.h | 12 | ||||
-rw-r--r-- | src/emu/emumem.cpp | 36 | ||||
-rw-r--r-- | src/emu/emumem.h | 12 |
6 files changed, 57 insertions, 89 deletions
diff --git a/src/devices/cpu/st62xx/st62xx.cpp b/src/devices/cpu/st62xx/st62xx.cpp index 6aa7b94be84..7db029cf05b 100644 --- a/src/devices/cpu/st62xx/st62xx.cpp +++ b/src/devices/cpu/st62xx/st62xx.cpp @@ -30,29 +30,23 @@ st6228_device::st6228_device(const machine_config &mconfig, const char *tag, dev , m_portd_out{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}} , m_program(nullptr) , m_data(nullptr) - // FIXME: memory banks do not currently work with internal maps. - //, m_rambank(*this, "^rambank") - //, m_program_rombank(*this, "^program_rombank") - //, m_data_rombank(*this, "^data_rombank") + , m_rambank(*this, "rambank") + , m_program_rombank(*this, "program_rombank") + , m_data_rombank(*this, "data_rombank") , m_rom(*this, this->tag()) { } void st6228_device::st6228_program_map(address_map &map) { - // FIXME: memory banks do not currently work with internal maps. - //map(0x000, 0x7ff).bankr(m_program_rombank); - map(0x000, 0x7ff).r(FUNC(st6228_device::program_rombank_r)); + map(0x000, 0x7ff).bankr(m_program_rombank); map(0x800, 0xfff).rom().region(tag(), 0x800); } void st6228_device::st6228_data_map(address_map &map) { - // FIXME: memory banks do not currently work with internal maps. - //map(0x00, 0x3f).bankrw(m_rambank); - //map(0x40, 0x7f).bankr(m_data_rombank); - map(0x00, 0x3f).rw(FUNC(st6228_device::rambank_r), FUNC(st6228_device::rambank_w)); - map(0x40, 0x7f).r(FUNC(st6228_device::data_rombank_r)); + map(0x00, 0x3f).bankrw(m_rambank); + map(0x40, 0x7f).bankr(m_data_rombank); map(0x80, 0xff).rw(FUNC(st6228_device::regs_r), FUNC(st6228_device::regs_w)); } @@ -102,10 +96,9 @@ void st6228_device::device_start() // set our instruction counter set_icountptr(m_icount); - // FIXME: memory banks do not currently work with internal maps. - //m_rambank->configure_entries(0, 2, m_ram, 0x40); - //m_program_rombank->configure_entries(0, 4, m_rom, 0x800); - //m_data_rombank->configure_entries(0, 128, m_rom, 0x40); + m_rambank->configure_entries(0, 2, m_ram, 0x40); + m_program_rombank->configure_entries(0, 4, m_rom->base(), 0x800); + m_data_rombank->configure_entries(0, 128, m_rom->base(), 0x40); // TODO: magic numbers for (uint8_t bit = 0; bit < 6; bit++) @@ -141,10 +134,9 @@ void st6228_device::device_reset() m_mode = MODE_NMI; m_prev_mode = MODE_NORMAL; - // FIXME: memory banks do not currently work with internal maps. - //m_rambank->set_entry(0); - //m_program_rombank->set_entry(0); - //m_data_rombank->set_entry(0); + m_rambank->set_entry(0); + m_program_rombank->set_entry(0); + m_data_rombank->set_entry(0); m_regs[REG_TIMER_COUNT] = 0xff; m_regs[REG_TIMER_PRESCALE] = 0x7f; @@ -268,26 +260,6 @@ void st6228_device::update_port_mode(uint8_t index, uint8_t changed) } } -READ8_MEMBER(st6228_device::program_rombank_r) -{ - return m_rom->base()[(m_regs[REG_ROM_BANK_SELECT] & 3) * 0x800 + offset]; -} - -READ8_MEMBER(st6228_device::data_rombank_r) -{ - return m_rom->base()[(m_regs[REG_DATA_ROM_WINDOW] & 0x7f) * 0x40 + offset]; -} - -WRITE8_MEMBER(st6228_device::rambank_w) -{ - m_ram[(m_regs[REG_RAM_BANK_SELECT] & 1) * 0x40 + offset] = data; -} - -READ8_MEMBER(st6228_device::rambank_r) -{ - return m_ram[(m_regs[REG_RAM_BANK_SELECT] & 1) * 0x40 + offset]; -} - WRITE8_MEMBER(st6228_device::regs_w) { offset += 0x80; @@ -313,17 +285,17 @@ WRITE8_MEMBER(st6228_device::regs_w) case REG_DATA_ROM_WINDOW: m_regs[offset] = data; - //m_data_rombank->set_entry(data & 0x7f); + m_data_rombank->set_entry(data & 0x7f); break; case REG_ROM_BANK_SELECT: m_regs[offset] = data; - //m_program_rombank->set_entry(data & 3); + m_program_rombank->set_entry(data & 3); break; case REG_RAM_BANK_SELECT: m_regs[offset] = data; - //m_rambank->set_entry(data & 1); + m_rambank->set_entry(data & 1); break; case REG_PORTA_DATA: diff --git a/src/devices/cpu/st62xx/st62xx.h b/src/devices/cpu/st62xx/st62xx.h index f0748c44c95..9b0582afce6 100644 --- a/src/devices/cpu/st62xx/st62xx.h +++ b/src/devices/cpu/st62xx/st62xx.h @@ -108,11 +108,6 @@ protected: void update_port_mode(uint8_t index, uint8_t changed); void set_port_output_bit(uint8_t index, uint8_t bit, uint8_t state); - DECLARE_READ8_MEMBER(program_rombank_r); - DECLARE_READ8_MEMBER(data_rombank_r); - DECLARE_WRITE8_MEMBER(rambank_w); - DECLARE_READ8_MEMBER(rambank_r); - DECLARE_WRITE8_MEMBER(regs_w); DECLARE_READ8_MEMBER(regs_r); @@ -244,9 +239,9 @@ protected: address_space *m_data; // FIXME: memory banks do not currently work with internal maps. - //required_memory_bank m_rambank; - //required_memory_bank m_program_rombank; - //required_memory_bank m_data_rombank; + required_memory_bank m_rambank; + required_memory_bank m_program_rombank; + required_memory_bank m_data_rombank; required_memory_region m_rom; }; diff --git a/src/emu/device.cpp b/src/emu/device.cpp index 058ac84d7c4..aa6e2342411 100644 --- a/src/emu/device.cpp +++ b/src/emu/device.cpp @@ -127,10 +127,10 @@ device_t::~device_t() // info for a given region //------------------------------------------------- -memory_region *device_t::memregion(const char *_tag) const +memory_region *device_t::memregion(std::string _tag) const { // build a fully-qualified name and look it up - if (_tag) + if (_tag != "") { auto search = machine().memory().regions().find(subtag(_tag).c_str()); if (search != machine().memory().regions().end()) @@ -148,10 +148,10 @@ memory_region *device_t::memregion(const char *_tag) const // info for a given share //------------------------------------------------- -memory_share *device_t::memshare(const char *_tag) const +memory_share *device_t::memshare(std::string _tag) const { // build a fully-qualified name and look it up - if (_tag) + if (_tag != "") { auto search = machine().memory().shares().find(subtag(_tag).c_str()); if (search != machine().memory().shares().end()) @@ -169,9 +169,9 @@ memory_share *device_t::memshare(const char *_tag) const // bank info for a given bank //------------------------------------------------- -memory_bank *device_t::membank(const char *_tag) const +memory_bank *device_t::membank(std::string _tag) const { - if (_tag) + if (_tag != "") { auto search = machine().memory().banks().find(subtag(_tag).c_str()); if (search != machine().memory().banks().end()) @@ -189,7 +189,7 @@ memory_bank *device_t::membank(const char *_tag) const // object for a given port name //------------------------------------------------- -ioport_port *device_t::ioport(const char *tag) const +ioport_port *device_t::ioport(std::string tag) const { // build a fully-qualified name and look it up return machine().ioport().port(subtag(tag).c_str()); @@ -890,8 +890,9 @@ device_t *device_t::subdevice_slow(const char *tag) const // to our device based on the provided tag //------------------------------------------------- -std::string device_t::subtag(const char *tag) const +std::string device_t::subtag(std::string _tag) const { + const char *tag = _tag.c_str(); std::string result; // if the tag begins with a colon, ignore our path and start from the root if (*tag == ':') diff --git a/src/emu/device.h b/src/emu/device.h index e9d91bf4cf4..abaea74cb12 100644 --- a/src/emu/device.h +++ b/src/emu/device.h @@ -524,12 +524,12 @@ public: const subdevice_list &subdevices() const { return m_subdevices; } // device-relative tag lookups - std::string subtag(const char *tag) const; - std::string siblingtag(const char *tag) const { return (m_owner != nullptr) ? m_owner->subtag(tag) : std::string(tag); } - memory_region *memregion(const char *tag) const; - memory_share *memshare(const char *tag) const; - memory_bank *membank(const char *tag) const; - ioport_port *ioport(const char *tag) const; + std::string subtag(std::string tag) const; + std::string siblingtag(std::string tag) const { return (m_owner != nullptr) ? m_owner->subtag(tag) : tag; } + memory_region *memregion(std::string tag) const; + memory_share *memshare(std::string tag) const; + memory_bank *membank(std::string tag) const; + ioport_port *ioport(std::string tag) const; device_t *subdevice(const char *tag) const; device_t *siblingdevice(const char *tag) const; template<class DeviceClass> DeviceClass *subdevice(const char *tag) const { return downcast<DeviceClass *>(subdevice(tag)); } diff --git a/src/emu/emumem.cpp b/src/emu/emumem.cpp index f40d68b3c01..754f2ddca65 100644 --- a/src/emu/emumem.cpp +++ b/src/emu/emumem.cpp @@ -240,9 +240,9 @@ public: void unmap_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, read_or_write readorwrite, bool quiet) override; void install_ram_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, read_or_write readorwrite, void *baseptr) override; - void install_bank_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *rtag, const char *wtag) override; + void install_bank_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string rtag, std::string wtag) override; void install_bank_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, memory_bank *rbank, memory_bank *wbank) override; - void install_readwrite_port(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *rtag, const char *wtag) override; + void install_readwrite_port(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string rtag, std::string wtag) override; void install_device_delegate(offs_t addrstart, offs_t addrend, device_t &device, address_map_constructor &map, u64 unitmask = 0, int cswidth = 0) override; void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; @@ -1497,14 +1497,14 @@ void address_space::populate_map_entry(const address_map_entry &entry, read_or_w case AMH_PORT: install_readwrite_port(entry.m_addrstart, entry.m_addrend, entry.m_addrmirror, - (readorwrite == read_or_write::READ) ? data.m_tag : nullptr, - (readorwrite == read_or_write::WRITE) ? data.m_tag : nullptr); + (readorwrite == read_or_write::READ) ? entry.m_devbase.subtag(data.m_tag) : "", + (readorwrite == read_or_write::WRITE) ? entry.m_devbase.subtag(data.m_tag) : ""); break; case AMH_BANK: install_bank_generic(entry.m_addrstart, entry.m_addrend, entry.m_addrmirror, - (readorwrite == read_or_write::READ) ? data.m_tag : nullptr, - (readorwrite == read_or_write::WRITE) ? data.m_tag : nullptr); + (readorwrite == read_or_write::READ) ? entry.m_devbase.subtag(data.m_tag) : "", + (readorwrite == read_or_write::WRITE) ? entry.m_devbase.subtag(data.m_tag) : ""); break; case AMH_DEVICE_SUBMAP: @@ -1885,42 +1885,42 @@ template<int Width, int AddrShift, endianness_t Endian> void address_space_speci // handler into this address space //------------------------------------------------- -template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_port(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *rtag, const char *wtag) +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_port(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string rtag, std::string wtag) { VPRINTF(("address_space::install_readwrite_port(%s-%s mirror=%s, read=\"%s\" / write=\"%s\")\n", core_i64_hex_format(addrstart, m_addrchars), core_i64_hex_format(addrend, m_addrchars), core_i64_hex_format(addrmirror, m_addrchars), - (rtag != nullptr) ? rtag : "(none)", (wtag != nullptr) ? wtag : "(none)")); + rtag.empty() ? "(none)" : rtag.c_str(), wtag.empty() ? "(none)" : wtag.c_str())); offs_t nstart, nend, nmask, nmirror; check_optimize_mirror("install_readwrite_port", addrstart, addrend, addrmirror, nstart, nend, nmask, nmirror); // read handler - if (rtag != nullptr) + if (rtag != "") { // find the port ioport_port *port = device().owner()->ioport(rtag); if (port == nullptr) - throw emu_fatalerror("Attempted to map non-existent port '%s' for read in space %s of device '%s'\n", rtag, m_name, m_device.tag()); + throw emu_fatalerror("Attempted to map non-existent port '%s' for read in space %s of device '%s'\n", rtag.c_str(), m_name, m_device.tag()); // map the range and set the ioport auto hand_r = new handler_entry_read_ioport<Width, AddrShift, Endian>(this, port); m_root_read->populate(nstart, nend, nmirror, hand_r); } - if (wtag != nullptr) + if (wtag != "") { // find the port ioport_port *port = device().owner()->ioport(wtag); if (port == nullptr) - fatalerror("Attempted to map non-existent port '%s' for write in space %s of device '%s'\n", wtag, m_name, m_device.tag()); + fatalerror("Attempted to map non-existent port '%s' for write in space %s of device '%s'\n", wtag.c_str(), m_name, m_device.tag()); // map the range and set the ioport auto hand_w = new handler_entry_write_ioport<Width, AddrShift, Endian>(this, port); m_root_write->populate(nstart, nend, nmirror, hand_w); } - invalidate_caches(rtag ? wtag ? read_or_write::READWRITE : read_or_write::READ : read_or_write::WRITE); + invalidate_caches(rtag != "" ? wtag != "" ? read_or_write::READWRITE : read_or_write::READ : read_or_write::WRITE); } @@ -1929,18 +1929,18 @@ template<int Width, int AddrShift, endianness_t Endian> void address_space_speci // mapping to a particular bank //------------------------------------------------- -template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_bank_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *rtag, const char *wtag) +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_bank_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string rtag, std::string wtag) { VPRINTF(("address_space::install_readwrite_bank(%s-%s mirror=%s, read=\"%s\" / write=\"%s\")\n", core_i64_hex_format(addrstart, m_addrchars), core_i64_hex_format(addrend, m_addrchars), core_i64_hex_format(addrmirror, m_addrchars), - (rtag != nullptr) ? rtag : "(none)", (wtag != nullptr) ? wtag : "(none)")); + rtag.empty() ? "(none)" : rtag.c_str(), wtag.empty() ? "(none)" : wtag.c_str())); offs_t nstart, nend, nmask, nmirror; check_optimize_mirror("install_bank_generic", addrstart, addrend, addrmirror, nstart, nend, nmask, nmirror); // map the read bank - if (rtag != nullptr) + if (rtag != "") { std::string fulltag = device().siblingtag(rtag); memory_bank &bank = bank_find_or_allocate(fulltag.c_str(), addrstart, addrend, addrmirror, read_or_write::READ); @@ -1951,7 +1951,7 @@ template<int Width, int AddrShift, endianness_t Endian> void address_space_speci } // map the write bank - if (wtag != nullptr) + if (wtag != "") { std::string fulltag = device().siblingtag(wtag); memory_bank &bank = bank_find_or_allocate(fulltag.c_str(), addrstart, addrend, addrmirror, read_or_write::WRITE); @@ -1961,7 +1961,7 @@ template<int Width, int AddrShift, endianness_t Endian> void address_space_speci m_root_write->populate(nstart, nend, nmirror, hand_w); } - invalidate_caches(rtag ? wtag ? read_or_write::READWRITE : read_or_write::READ : read_or_write::WRITE); + invalidate_caches(rtag != "" ? wtag != "" ? read_or_write::READWRITE : read_or_write::READ : read_or_write::WRITE); } diff --git a/src/emu/emumem.h b/src/emu/emumem.h index 2e8668cdeac..21c603e2225 100644 --- a/src/emu/emumem.h +++ b/src/emu/emumem.h @@ -1320,11 +1320,11 @@ public: void install_ram(offs_t addrstart, offs_t addrend, void *baseptr = nullptr) { install_ram(addrstart, addrend, 0, baseptr); } // install ports, banks, RAM (with mirror/mask) - void install_read_port(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *rtag) { install_readwrite_port(addrstart, addrend, addrmirror, rtag, nullptr); } - void install_write_port(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *wtag) { install_readwrite_port(addrstart, addrend, addrmirror, nullptr, wtag); } - virtual void install_readwrite_port(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *rtag, const char *wtag) = 0; - void install_read_bank(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *tag) { install_bank_generic(addrstart, addrend, addrmirror, tag, nullptr); } - void install_write_bank(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *tag) { install_bank_generic(addrstart, addrend, addrmirror, nullptr, tag); } + void install_read_port(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *rtag) { install_readwrite_port(addrstart, addrend, addrmirror, rtag, ""); } + void install_write_port(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *wtag) { install_readwrite_port(addrstart, addrend, addrmirror, "", wtag); } + virtual void install_readwrite_port(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string rtag, std::string wtag) = 0; + void install_read_bank(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *tag) { install_bank_generic(addrstart, addrend, addrmirror, tag, ""); } + void install_write_bank(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *tag) { install_bank_generic(addrstart, addrend, addrmirror, "", tag); } void install_readwrite_bank(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *tag) { install_bank_generic(addrstart, addrend, addrmirror, tag, tag); } void install_read_bank(offs_t addrstart, offs_t addrend, offs_t addrmirror, memory_bank *bank) { install_bank_generic(addrstart, addrend, addrmirror, bank, nullptr); } void install_write_bank(offs_t addrstart, offs_t addrend, offs_t addrmirror, memory_bank *bank) { install_bank_generic(addrstart, addrend, addrmirror, nullptr, bank); } @@ -1544,7 +1544,7 @@ protected: void populate_map_entry(const address_map_entry &entry, read_or_write readorwrite); virtual void unmap_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, read_or_write readorwrite, bool quiet) = 0; virtual void install_ram_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, read_or_write readorwrite, void *baseptr) = 0; - virtual void install_bank_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *rtag, const char *wtag) = 0; + virtual void install_bank_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string rtag, std::string wtag) = 0; virtual void install_bank_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, memory_bank *rbank, memory_bank *wbank) = 0; void adjust_addresses(offs_t &start, offs_t &end, offs_t &mask, offs_t &mirror); void *find_backing_memory(offs_t addrstart, offs_t addrend); |