dimemory, dirom: Add some documentation [O. Galibert]

This commit is contained in:
Olivier Galibert 2016-09-06 12:46:40 +02:00
parent e153f45560
commit a2c306e923
3 changed files with 173 additions and 0 deletions

View file

@ -0,0 +1,99 @@
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.

View file

@ -0,0 +1,72 @@
The device_rom_interface
========================
1. Capabilities
---------------
This interface is designed for devices which expect to have a rom
connected to them on a dedicated bus. It's mostly designed for sound
chips. Other devices types may be interested but other considerations
may make it impratical (graphics decode caching for instance). The
interface provides the capability of either connecting a ROM_REGION,
connecting an ADDRESS_MAP or dynamically setting up a block of memory
as rom. In the region/block cases, banking is automatically handled.
2. Setup
--------
| **device_rom_interface**\ (const machine_config &mconfig, device_t &device, UINT8 addrwidth, endianness_t endian = ENDIANNESS_LITTLE, UINT8 datawidth = 8)
The constructor of the interface wants, in addition to the standard
parameters, the address bus width of the dedicated bus. In addition
the endianness (if not little endian or byte-sized bus) and data bus
width (if not byte) can be provided.
| **MCFG_DEVICE_ADDRESS_MAP**\ (AS_0, map)
Use that method at machine config time to provide an address map for
the bus to connect to. It has priority over a rom region if one is
also present.
| **ROM_REGION**\ (length, tag, flags)
If a rom region with a tag identical to the device tag is provided in
the rom description for the system, it will be automatically picked up
as the connected rom. An address map has priority over the region if
present in the machine config.
| void **set_rom**\ (const void \*base, UINT32 size);
At any time post- **interface_pre_start**, a memory block can be
setup as the connected rom with that method. It overrides any
previous setup that may have been provided. It can be done multiple
times.
3. Rom access
-------------
| UINT8 **read_byte**\ (offs_t byteaddress)
| UINT16 **read_word**\ (offs_t byteaddress)
| UINT32 **read_dword**\ (offs_t byteaddress)
| UINT64 **read_qword**\ (offs_t byteaddress)
These methods provide read access to the connected rom. Out-of-bounds
access results in standard unmapped read logerror messages.
4. Rom banking
--------------
If the rom region or the memory block in set_rom is larger than the
address bus, banking is automatically setup.
| void **set_rom_bank**\ (int bank)
That method selects the current bank number.
5. Caveats
----------
Using that interface makes the device derive from
**device_memory_interface**. If the device wants to actually use the
memory interface for itself, remember that AS_0/AS_PROGRAM is used by
the rom interface, and don't forget to upcall **memory_space_config**.

View file

@ -6,6 +6,8 @@ This section covers technical specifications useful to programmers working on MA
.. toctree::
:titlesonly:
device_memory_interface
device_rom_interface
floppy
nscsi
luaengine