Skip to content

scc68070: limit external memory addresses to 24 bits #13321

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions src/devices/cpu/m68000/scc68070.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,34 @@ void scc68070_base_device::device_start()
{
m68000_musashi_device::device_start();
init_cpu_scc68070();

m_readimm16 = [this](offs_t address) -> u16 { return m_oprogram16.read_word(translate_addr(address)); };
m_read8 = [this](offs_t address) -> u8 { return m_program16.read_byte(translate_addr(address)); };
m_read16 = [this](offs_t address) -> u16 { return m_program16.read_word(translate_addr(address)); };
m_read32 = [this](offs_t address) -> u32 { return m_program16.read_dword(translate_addr(address)); };
m_write8 = [this](offs_t address, u8 data)
{
address = translate_addr(address);
m_program16.write_word(address & ~1, data | (data << 8), address & 1 ? 0x00ff : 0xff00);
};
m_write16 = [this](offs_t address, u16 data) { m_program16.write_word(translate_addr(address), data); };
m_write32 = [this](offs_t address, u32 data) { m_program16.write_dword(translate_addr(address), data); };
}

offs_t scc68070_base_device::translate_addr(offs_t address) const
{
// internal addresses (0x80000000-bfffffff) are only accessible in supervisor mode;
// all other accesses use the external 24-bit address bus.
if (!(supervisor_mode() && (address >> 30) == 0x2))
address &= 0xffffff;

return address;
}

bool scc68070_base_device::memory_translate(int spacenum, int intention, offs_t &address, address_space *&target_space)
{
target_space = &space(spacenum);
if (spacenum == AS_PROGRAM)
address = translate_addr(address);
return true;
}
4 changes: 4 additions & 0 deletions src/devices/cpu/m68000/scc68070.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ class scc68070_base_device : public m68000_musashi_device
// device-level overrides
virtual void device_start() override ATTR_COLD;

offs_t translate_addr(offs_t address) const;

virtual bool memory_translate(int spacenum, int intention, offs_t &address, address_space *&target_space) override;

scc68070_base_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock,
const device_type type, address_map_constructor internal_map);
};
Expand Down
Loading