mirror of
https://github.com/holub/mame
synced 2025-04-26 18:23:08 +03:00

This effectively revertsb380514764
andc24473ddff
, restoring the state at598cd52272
. Before pushing, please check that what you're about to push is sane. Check your local commit log and ensure there isn't anything out-of-place before pushing to mainline. When things like this happen, it wastes everyone's time. I really don't need this in a week when real work™ is busting my balls and I'm behind where I want to be with preparing for MAME release.
117 lines
4.2 KiB
ReStructuredText
117 lines
4.2 KiB
ReStructuredText
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 an unlimited set of address spaces, numbered
|
|
with small positive values. The IDs should stay small because they
|
|
index vectors to keep the lookup fast. Spaces number 0-3 have an
|
|
associated constant name:
|
|
|
|
+----+---------------+
|
|
| ID | Name |
|
|
+====+===============+
|
|
| 0 | AS_PROGRAM |
|
|
+----+---------------+
|
|
| 1 | AS_DATA |
|
|
+----+---------------+
|
|
| 2 | AS_IO |
|
|
+----+---------------+
|
|
| 3 | AS_OPCODES |
|
|
+----+---------------+
|
|
|
|
Spaces 0 and 3, e.g. AS_PROGRAM and AS_OPCODE, are special for the
|
|
debugger and some CPUs. AS_PROGRAM is use by the debugger and the
|
|
cpus as the space from with the cpu reads its instructions for the
|
|
disassembler. When present, AS_OPCODE is used by the debugger and
|
|
some cpus to read the opcode part of the instruction. What opcode
|
|
means is device-dependant, for instance for the z80 it's the initial
|
|
byte(s) which are read with the M1 signal asserted. For the 68000 is
|
|
means every instruction word plus the PC-relative accesses. The main,
|
|
but not only, use of AS_OPCODE is to implement hardware decrypting
|
|
instructions separately from the data.
|
|
|
|
2. Setup
|
|
--------
|
|
|
|
| std::vector<std::pair<int, const address_space_config \*>>\ **memory_space_config**\ (int spacenum) const
|
|
|
|
The device must override that method to provide a vector of pairs
|
|
comprising of a space number and its associated
|
|
**address_space_config** describing its configuration. Some examples
|
|
to look up when needed:
|
|
|
|
* Standard two-space vector: v60_device
|
|
* Conditional AS_OPCODE: z80_device
|
|
* Inherit config and add a space: m6801_device
|
|
* Inherit config and patch a space: tmpz84c011_device
|
|
|
|
|
|
| bool **has_configured_map**\ () const
|
|
| bool **has_configured_map**\ (int 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_OPCODES in certain cpu cores. The
|
|
parameterless version tests for space 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_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
|
|
|
|
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
|
|
|
|
Indicates whether a given space actually exists. The parameterless
|
|
version tests for AS_PROGRAM/AS_0.
|
|
|
|
|
|
5. MMU support for disassembler
|
|
-------------------------------
|
|
|
|
| bool **translate**\ (int spacenum, int intention, offs_t &address)
|
|
|
|
Does a logical to physical address translation through the device's
|
|
MMU. spacenum gives the space number, intention the type of the
|
|
future access (TRANSLATE_(READ\|WRITE\|FETCH)(\|_USER\|_DEBUG)) and
|
|
address is an inout parameter with the address to translate and its
|
|
translated version. Should return true if the translation went
|
|
correctly, false if the address is unmapped.
|
|
|
|
Note that for some historical reason the device itself must override
|
|
the virtual method **memory_translate** with the same signature.
|