The device_memory_interface

1. Capabilities

The device memory interface provides devices with the capability of creating address spaces, to which address maps can be associated. It’s used for any device that provides a (logically) address/data bus other devices can be connected to. It’s mainly, but not only, cpus.

The interface allows for up to four address spaces, numbered 0-3, with symbolic names associated to them in emumem.h for historical reasons.

Numeric ID Symbolic ID Symbolic name
0 AS_0 AS_PROGRAM
1 AS_1 AS_DATA
2 AS_2 AS_IO
3 AS_3 AS_DECRYPTED_OPCODES

2. Setup

const address_space_config **memory_space_config*(address_spacenum spacenum) const

The device must override that method to provide, for each of the four address spaces, either an address_space_config describing the space’s configucation or nullptr if the space is not to be created.

bool has_configured_map() const
bool has_configured_map(int index) const
bool has_configured_map(address_spacenum index) const

The has_configured_map method allows to test in the memory_space_config method whether an address_map has been associated with a given space. That allows to implement optional memory spaces, such as AS_DECRYPTED_OPCODES in certain cpu cores. The parameterless version tests for AS_PROGRAM/AS_0.

3. Associating maps to spaces

Associating maps to spaces is done at the machine config level, after the device declaration.

MCFG_DEVICE_ADDRESS_MAP(_space, _map)
MCFG_DEVICE_PROGRAM_MAP(_map)
MCFG_DEVICE_DATA_MAP(_map)
MCFG_DEVICE_IO_MAP(_map)
MCFG_DEVICE_DECRYPTED_OPCODES_MAP(_map)

The generic macro and the four specific ones associate a map to a given space. Address maps associated to non-existing spaces are ignored (no warning given). devcpu.h defines MCFG_CPU_*_MAP aliases to the specific macros.

MCFG_DEVICE_REMOVE_ADDRESS_MAP(_space)

That macro removes a memory map associated to a given space. Useful when removing a map for an optional space in a machine config derivative.

4. Accessing the spaces

address_space &space() const
address_space &space(int index) const
address_space &space(address_spacenum index) const

Returns a given address space post-initialization. The parameterless version tests for AS_PROGRAM/AS_0. Aborts if the space doesn’t exist.

bool has_space() const
bool has_space(int index) const
bool has_space(address_spacenum index) const

Indicates whether a given space actually exists. The parameterless version tests for AS_PROGRAM/AS_0.

5. Weird/to deprecate stuff

bool translate(address_spacenum spacenum, int intention, offs_t &address)
bool read(address_spacenum spacenum, offs_t offset, int size, UINT64 &value)
bool write(address_spacenum spacenum, offs_t offset, int size, UINT64 value)
bool readop(offs_t offset, int size, UINT64 &value)

These methods override how the debugger accesses memory for a cpu. Avoid them if you can. Otherwise, prepare for heavy-duty spelunking in complicated code.

If really required, should probably be part of cpu_device directly.