| 1 |
/*************************************************************************** |
| 2 |
|
| 3 |
memory.h |
| 4 |
|
| 5 |
Functions which handle the CPU memory and I/O port access. |
| 6 |
|
| 7 |
***************************************************************************/ |
| 8 |
|
| 9 |
#ifndef _MEMORY_H |
| 10 |
#define _MEMORY_H |
| 11 |
|
| 12 |
#include "osd_cpu.h" |
| 13 |
#include <stddef.h> |
| 14 |
|
| 15 |
#ifdef __cplusplus |
| 16 |
extern "C" { |
| 17 |
#endif |
| 18 |
|
| 19 |
/* |
| 20 |
* Versions of GNU C earlier that 2.7 appear to have problems with the |
| 21 |
* __attribute__ definition of UNUSEDARG, so we act as if it was not a |
| 22 |
* GNU compiler. |
| 23 |
*/ |
| 24 |
|
| 25 |
#ifdef __GNUC__ |
| 26 |
#if (__GNUC__ < 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ <= 7)) |
| 27 |
#define UNUSEDARG |
| 28 |
#else |
| 29 |
#define UNUSEDARG __attribute__((__unused__)) |
| 30 |
#endif |
| 31 |
#else |
| 32 |
#define UNUSEDARG |
| 33 |
#endif |
| 34 |
|
| 35 |
|
| 36 |
|
| 37 |
/*************************************************************************** |
| 38 |
|
| 39 |
Basic type definitions |
| 40 |
|
| 41 |
These types are used for memory handlers. |
| 42 |
|
| 43 |
***************************************************************************/ |
| 44 |
|
| 45 |
/* ----- typedefs for data and offset types ----- */ |
| 46 |
typedef UINT8 data8_t; |
| 47 |
typedef UINT16 data16_t; |
| 48 |
typedef UINT32 data32_t; |
| 49 |
typedef UINT32 offs_t; |
| 50 |
|
| 51 |
/* ----- typedefs for the various common memory/port handlers ----- */ |
| 52 |
typedef data8_t (*read8_handler) (UNUSEDARG offs_t offset); |
| 53 |
typedef void (*write8_handler) (UNUSEDARG offs_t offset, UNUSEDARG data8_t data); |
| 54 |
typedef data16_t (*read16_handler) (UNUSEDARG offs_t offset, UNUSEDARG data16_t mem_mask); |
| 55 |
typedef void (*write16_handler)(UNUSEDARG offs_t offset, UNUSEDARG data16_t data, UNUSEDARG data16_t mem_mask); |
| 56 |
typedef data32_t (*read32_handler) (UNUSEDARG offs_t offset, UNUSEDARG data32_t mem_mask); |
| 57 |
typedef void (*write32_handler)(UNUSEDARG offs_t offset, UNUSEDARG data32_t data, UNUSEDARG data32_t mem_mask); |
| 58 |
typedef offs_t (*opbase_handler) (UNUSEDARG offs_t address); |
| 59 |
|
| 60 |
/* ----- typedefs for the various common memory handlers ----- */ |
| 61 |
typedef read8_handler mem_read_handler; |
| 62 |
typedef write8_handler mem_write_handler; |
| 63 |
typedef read16_handler mem_read16_handler; |
| 64 |
typedef write16_handler mem_write16_handler; |
| 65 |
typedef read32_handler mem_read32_handler; |
| 66 |
typedef write32_handler mem_write32_handler; |
| 67 |
|
| 68 |
/* ----- typedefs for the various common port handlers ----- */ |
| 69 |
typedef read8_handler port_read_handler; |
| 70 |
typedef write8_handler port_write_handler; |
| 71 |
typedef read16_handler port_read16_handler; |
| 72 |
typedef write16_handler port_write16_handler; |
| 73 |
typedef read32_handler port_read32_handler; |
| 74 |
typedef write32_handler port_write32_handler; |
| 75 |
|
| 76 |
/* ----- typedefs for externally allocated memory ----- */ |
| 77 |
struct ExtMemory |
| 78 |
{ |
| 79 |
offs_t start, end; |
| 80 |
UINT8 region; |
| 81 |
UINT8 * data; |
| 82 |
}; |
| 83 |
|
| 84 |
|
| 85 |
|
| 86 |
/*************************************************************************** |
| 87 |
|
| 88 |
Basic macros |
| 89 |
|
| 90 |
***************************************************************************/ |
| 91 |
|
| 92 |
/* ----- macros for declaring the various common memory/port handlers ----- */ |
| 93 |
#define READ_HANDLER(name) data8_t name(UNUSEDARG offs_t offset) |
| 94 |
#define WRITE_HANDLER(name) void name(UNUSEDARG offs_t offset, UNUSEDARG data8_t data) |
| 95 |
#define READ16_HANDLER(name) data16_t name(UNUSEDARG offs_t offset, UNUSEDARG data16_t mem_mask) |
| 96 |
#define WRITE16_HANDLER(name) void name(UNUSEDARG offs_t offset, UNUSEDARG data16_t data, UNUSEDARG data16_t mem_mask) |
| 97 |
#define READ32_HANDLER(name) data32_t name(UNUSEDARG offs_t offset, UNUSEDARG data32_t mem_mask) |
| 98 |
#define WRITE32_HANDLER(name) void name(UNUSEDARG offs_t offset, UNUSEDARG data32_t data, UNUSEDARG data32_t mem_mask) |
| 99 |
#define OPBASE_HANDLER(name) offs_t name(UNUSEDARG offs_t address) |
| 100 |
|
| 101 |
/* ----- macros for accessing bytes and words within larger chunks ----- */ |
| 102 |
#ifdef LSB_FIRST |
| 103 |
#define BYTE_XOR_BE(a) ((a) ^ 1) /* read/write a byte to a 16-bit space */ |
| 104 |
#define BYTE_XOR_LE(a) (a) |
| 105 |
#define BYTE4_XOR_BE(a) ((a) ^ 3) /* read/write a byte to a 32-bit space */ |
| 106 |
#define BYTE4_XOR_LE(a) (a) |
| 107 |
#define WORD_XOR_BE(a) ((a) ^ 2) /* read/write a word to a 32-bit space */ |
| 108 |
#define WORD_XOR_LE(a) (a) |
| 109 |
#else |
| 110 |
#define BYTE_XOR_BE(a) (a) |
| 111 |
#define BYTE_XOR_LE(a) ((a) ^ 1) /* read/write a byte to a 16-bit space */ |
| 112 |
#define BYTE4_XOR_BE(a) (a) |
| 113 |
#define BYTE4_XOR_LE(a) ((a) ^ 3) /* read/write a byte to a 32-bit space */ |
| 114 |
#define WORD_XOR_BE(a) (a) |
| 115 |
#define WORD_XOR_LE(a) ((a) ^ 2) /* read/write a word to a 32-bit space */ |
| 116 |
#endif |
| 117 |
|
| 118 |
|
| 119 |
|
| 120 |
/*************************************************************************** |
| 121 |
|
| 122 |
Memory/port array constants |
| 123 |
|
| 124 |
These apply to values in the array of read/write handlers that is |
| 125 |
declared within each driver. |
| 126 |
|
| 127 |
***************************************************************************/ |
| 128 |
|
| 129 |
/* ----- memory/port width constants ----- */ |
| 130 |
#define MEMPORT_WIDTH_MASK 0x00000003 /* mask to get at the width bits */ |
| 131 |
#define MEMPORT_WIDTH_8 0x00000001 /* this memory/port array is for an 8-bit databus */ |
| 132 |
#define MEMPORT_WIDTH_16 0x00000002 /* this memory/port array is for a 16-bit databus */ |
| 133 |
#define MEMPORT_WIDTH_32 0x00000003 /* this memory/port array is for a 32-bit databus */ |
| 134 |
|
| 135 |
/* ----- memory/port type constants ----- */ |
| 136 |
#define MEMPORT_TYPE_MASK 0x30000000 /* mask to get at the type bits */ |
| 137 |
#define MEMPORT_TYPE_MEM 0x10000000 /* this memory/port array is for memory */ |
| 138 |
#define MEMPORT_TYPE_IO 0x20000000 /* this memory/port array is for ports */ |
| 139 |
|
| 140 |
/* ----- memory/port direction constants ----- */ |
| 141 |
#define MEMPORT_DIRECTION_MASK 0xc0000000 /* mask to get at the direction bits */ |
| 142 |
#define MEMPORT_DIRECTION_READ 0x40000000 /* this memory/port array is for reads */ |
| 143 |
#define MEMPORT_DIRECTION_WRITE 0x80000000 /* this memory/port array is for writes */ |
| 144 |
|
| 145 |
/* ----- memory/port address bits constants ----- */ |
| 146 |
#define MEMPORT_ABITS_MASK 0x08000000 /* set this bit to indicate the entry has address bits */ |
| 147 |
#define MEMPORT_ABITS_VAL_MASK 0x000000ff /* number of address bits */ |
| 148 |
|
| 149 |
/* ----- memory/port struct marker constants ----- */ |
| 150 |
#define MEMPORT_MARKER ((offs_t)~0) /* used in the end field to indicate end of array */ |
| 151 |
|
| 152 |
/* ----- static memory/port handler constants ----- */ |
| 153 |
#define STATIC_INVALID 0 /* invalid - should never be used */ |
| 154 |
#define STATIC_BANK1 1 /* banked memory #1 */ |
| 155 |
#define STATIC_BANK2 2 /* banked memory #2 */ |
| 156 |
#define STATIC_BANK3 3 /* banked memory #3 */ |
| 157 |
#define STATIC_BANK4 4 /* banked memory #4 */ |
| 158 |
#define STATIC_BANK5 5 /* banked memory #5 */ |
| 159 |
#define STATIC_BANK6 6 /* banked memory #6 */ |
| 160 |
#define STATIC_BANK7 7 /* banked memory #7 */ |
| 161 |
#define STATIC_BANK8 8 /* banked memory #8 */ |
| 162 |
#define STATIC_BANK9 9 /* banked memory #9 */ |
| 163 |
#define STATIC_BANK10 10 /* banked memory #10 */ |
| 164 |
#define STATIC_BANK11 11 /* banked memory #11 */ |
| 165 |
#define STATIC_BANK12 12 /* banked memory #12 */ |
| 166 |
#define STATIC_BANK13 13 /* banked memory #13 */ |
| 167 |
#define STATIC_BANK14 14 /* banked memory #14 */ |
| 168 |
#define STATIC_BANK15 15 /* banked memory #15 */ |
| 169 |
#define STATIC_BANK16 16 /* banked memory #16 */ |
| 170 |
#define STATIC_BANK17 17 /* banked memory #17 */ |
| 171 |
#define STATIC_BANK18 18 /* banked memory #18 */ |
| 172 |
#define STATIC_BANK19 19 /* banked memory #19 */ |
| 173 |
#define STATIC_BANK20 20 /* banked memory #20 */ |
| 174 |
#define STATIC_BANK21 21 /* banked memory #21 */ |
| 175 |
#define STATIC_BANK22 22 /* banked memory #22 */ |
| 176 |
#define STATIC_BANK23 23 /* banked memory #23 */ |
| 177 |
#define STATIC_BANK24 24 /* banked memory #24 */ |
| 178 |
#define STATIC_RAM 25 /* RAM - standard reads/writes */ |
| 179 |
#define STATIC_ROM 26 /* ROM - just like RAM, but writes to the bit-bucket */ |
| 180 |
#define STATIC_RAMROM 27 /* RAMROM - use for access in encrypted 8-bit systems */ |
| 181 |
#define STATIC_NOP 28 /* NOP - reads are 0, writes to the bit-bucket */ |
| 182 |
#define STATIC_UNUSED1 29 /* unused - reserved for future use */ |
| 183 |
#define STATIC_UNUSED2 30 /* unused - reserved for future use */ |
| 184 |
#define STATIC_UNMAP 31 /* unmapped - all unmapped memory goes here */ |
| 185 |
#define STATIC_COUNT 32 /* total number of static handlers */ |
| 186 |
|
| 187 |
/* ----- banking constants ----- */ |
| 188 |
#define MAX_BANKS 24 /* maximum number of banks */ |
| 189 |
#define STATIC_BANKMAX (STATIC_RAM - 1) /* handler constant of last bank */ |
| 190 |
|
| 191 |
|
| 192 |
|
| 193 |
/*************************************************************************** |
| 194 |
|
| 195 |
Constants for static entries in memory read/write arrays |
| 196 |
|
| 197 |
The first 32 entries in the memory lookup table are reserved for |
| 198 |
"static" handlers. These are internal handlers for RAM, ROM, banks, |
| 199 |
and unmapped memory areas. The following definitions are the |
| 200 |
properly-casted versions of the STATIC_ constants above. |
| 201 |
|
| 202 |
***************************************************************************/ |
| 203 |
|
| 204 |
/* 8-bit reads */ |
| 205 |
#define MRA_BANK1 ((mem_read_handler)STATIC_BANK1) |
| 206 |
#define MRA_BANK2 ((mem_read_handler)STATIC_BANK2) |
| 207 |
#define MRA_BANK3 ((mem_read_handler)STATIC_BANK3) |
| 208 |
#define MRA_BANK4 ((mem_read_handler)STATIC_BANK4) |
| 209 |
#define MRA_BANK5 ((mem_read_handler)STATIC_BANK5) |
| 210 |
#define MRA_BANK6 ((mem_read_handler)STATIC_BANK6) |
| 211 |
#define MRA_BANK7 ((mem_read_handler)STATIC_BANK7) |
| 212 |
#define MRA_BANK8 ((mem_read_handler)STATIC_BANK8) |
| 213 |
#define MRA_BANK9 ((mem_read_handler)STATIC_BANK9) |
| 214 |
#define MRA_BANK10 ((mem_read_handler)STATIC_BANK10) |
| 215 |
#define MRA_BANK11 ((mem_read_handler)STATIC_BANK11) |
| 216 |
#define MRA_BANK12 ((mem_read_handler)STATIC_BANK12) |
| 217 |
#define MRA_BANK13 ((mem_read_handler)STATIC_BANK13) |
| 218 |
#define MRA_BANK14 ((mem_read_handler)STATIC_BANK14) |
| 219 |
#define MRA_BANK15 ((mem_read_handler)STATIC_BANK15) |
| 220 |
#define MRA_BANK16 ((mem_read_handler)STATIC_BANK16) |
| 221 |
#define MRA_BANK17 ((mem_read_handler)STATIC_BANK17) |
| 222 |
#define MRA_BANK18 ((mem_read_handler)STATIC_BANK18) |
| 223 |
#define MRA_BANK19 ((mem_read_handler)STATIC_BANK19) |
| 224 |
#define MRA_BANK20 ((mem_read_handler)STATIC_BANK20) |
| 225 |
#define MRA_BANK21 ((mem_read_handler)STATIC_BANK21) |
| 226 |
#define MRA_BANK22 ((mem_read_handler)STATIC_BANK22) |
| 227 |
#define MRA_BANK23 ((mem_read_handler)STATIC_BANK23) |
| 228 |
#define MRA_BANK24 ((mem_read_handler)STATIC_BANK24) |
| 229 |
#define MRA_NOP ((mem_read_handler)STATIC_NOP) |
| 230 |
#define MRA_RAM ((mem_read_handler)STATIC_RAM) |
| 231 |
#define MRA_ROM ((mem_read_handler)STATIC_ROM) |
| 232 |
#define MRA_RAMROM ((mem_read_handler)STATIC_RAMROM) |
| 233 |
|
| 234 |
/* 8-bit writes */ |
| 235 |
#define MWA_BANK1 ((mem_write_handler)STATIC_BANK1) |
| 236 |
#define MWA_BANK2 ((mem_write_handler)STATIC_BANK2) |
| 237 |
#define MWA_BANK3 ((mem_write_handler)STATIC_BANK3) |
| 238 |
#define MWA_BANK4 ((mem_write_handler)STATIC_BANK4) |
| 239 |
#define MWA_BANK5 ((mem_write_handler)STATIC_BANK5) |
| 240 |
#define MWA_BANK6 ((mem_write_handler)STATIC_BANK6) |
| 241 |
#define MWA_BANK7 ((mem_write_handler)STATIC_BANK7) |
| 242 |
#define MWA_BANK8 ((mem_write_handler)STATIC_BANK8) |
| 243 |
#define MWA_BANK9 ((mem_write_handler)STATIC_BANK9) |
| 244 |
#define MWA_BANK10 ((mem_write_handler)STATIC_BANK10) |
| 245 |
#define MWA_BANK11 ((mem_write_handler)STATIC_BANK11) |
| 246 |
#define MWA_BANK12 ((mem_write_handler)STATIC_BANK12) |
| 247 |
#define MWA_BANK13 ((mem_write_handler)STATIC_BANK13) |
| 248 |
#define MWA_BANK14 ((mem_write_handler)STATIC_BANK14) |
| 249 |
#define MWA_BANK15 ((mem_write_handler)STATIC_BANK15) |
| 250 |
#define MWA_BANK16 ((mem_write_handler)STATIC_BANK16) |
| 251 |
#define MWA_BANK17 ((mem_write_handler)STATIC_BANK17) |
| 252 |
#define MWA_BANK18 ((mem_write_handler)STATIC_BANK18) |
| 253 |
#define MWA_BANK19 ((mem_write_handler)STATIC_BANK19) |
| 254 |
#define MWA_BANK20 ((mem_write_handler)STATIC_BANK20) |
| 255 |
#define MWA_BANK21 ((mem_write_handler)STATIC_BANK21) |
| 256 |
#define MWA_BANK22 ((mem_write_handler)STATIC_BANK22) |
| 257 |
#define MWA_BANK23 ((mem_write_handler)STATIC_BANK23) |
| 258 |
#define MWA_BANK24 ((mem_write_handler)STATIC_BANK24) |
| 259 |
#define MWA_NOP ((mem_write_handler)STATIC_NOP) |
| 260 |
#define MWA_RAM ((mem_write_handler)STATIC_RAM) |
| 261 |
#define MWA_ROM ((mem_write_handler)STATIC_ROM) |
| 262 |
#define MWA_RAMROM ((mem_write_handler)STATIC_RAMROM) |
| 263 |
|
| 264 |
/* 16-bit reads */ |
| 265 |
#define MRA16_BANK1 ((mem_read16_handler)STATIC_BANK1) |
| 266 |
#define MRA16_BANK2 ((mem_read16_handler)STATIC_BANK2) |
| 267 |
#define MRA16_BANK3 ((mem_read16_handler)STATIC_BANK3) |
| 268 |
#define MRA16_BANK4 ((mem_read16_handler)STATIC_BANK4) |
| 269 |
#define MRA16_BANK5 ((mem_read16_handler)STATIC_BANK5) |
| 270 |
#define MRA16_BANK6 ((mem_read16_handler)STATIC_BANK6) |
| 271 |
#define MRA16_BANK7 ((mem_read16_handler)STATIC_BANK7) |
| 272 |
#define MRA16_BANK8 ((mem_read16_handler)STATIC_BANK8) |
| 273 |
#define MRA16_BANK9 ((mem_read16_handler)STATIC_BANK9) |
| 274 |
#define MRA16_BANK10 ((mem_read16_handler)STATIC_BANK10) |
| 275 |
#define MRA16_BANK11 ((mem_read16_handler)STATIC_BANK11) |
| 276 |
#define MRA16_BANK12 ((mem_read16_handler)STATIC_BANK12) |
| 277 |
#define MRA16_BANK13 ((mem_read16_handler)STATIC_BANK13) |
| 278 |
#define MRA16_BANK14 ((mem_read16_handler)STATIC_BANK14) |
| 279 |
#define MRA16_BANK15 ((mem_read16_handler)STATIC_BANK15) |
| 280 |
#define MRA16_BANK16 ((mem_read16_handler)STATIC_BANK16) |
| 281 |
#define MRA16_BANK17 ((mem_read16_handler)STATIC_BANK17) |
| 282 |
#define MRA16_BANK18 ((mem_read16_handler)STATIC_BANK18) |
| 283 |
#define MRA16_BANK19 ((mem_read16_handler)STATIC_BANK19) |
| 284 |
#define MRA16_BANK20 ((mem_read16_handler)STATIC_BANK20) |
| 285 |
#define MRA16_BANK21 ((mem_read16_handler)STATIC_BANK21) |
| 286 |
#define MRA16_BANK22 ((mem_read16_handler)STATIC_BANK22) |
| 287 |
#define MRA16_BANK23 ((mem_read16_handler)STATIC_BANK23) |
| 288 |
#define MRA16_BANK24 ((mem_read16_handler)STATIC_BANK24) |
| 289 |
#define MRA16_NOP ((mem_read16_handler)STATIC_NOP) |
| 290 |
#define MRA16_RAM ((mem_read16_handler)STATIC_RAM) |
| 291 |
#define MRA16_ROM ((mem_read16_handler)STATIC_ROM) |
| 292 |
|
| 293 |
/* 16-bit writes */ |
| 294 |
#define MWA16_BANK1 ((mem_write16_handler)STATIC_BANK1) |
| 295 |
#define MWA16_BANK2 ((mem_write16_handler)STATIC_BANK2) |
| 296 |
#define MWA16_BANK3 ((mem_write16_handler)STATIC_BANK3) |
| 297 |
#define MWA16_BANK4 ((mem_write16_handler)STATIC_BANK4) |
| 298 |
#define MWA16_BANK5 ((mem_write16_handler)STATIC_BANK5) |
| 299 |
#define MWA16_BANK6 ((mem_write16_handler)STATIC_BANK6) |
| 300 |
#define MWA16_BANK7 ((mem_write16_handler)STATIC_BANK7) |
| 301 |
#define MWA16_BANK8 ((mem_write16_handler)STATIC_BANK8) |
| 302 |
#define MWA16_BANK9 ((mem_write16_handler)STATIC_BANK9) |
| 303 |
#define MWA16_BANK10 ((mem_write16_handler)STATIC_BANK10) |
| 304 |
#define MWA16_BANK11 ((mem_write16_handler)STATIC_BANK11) |
| 305 |
#define MWA16_BANK12 ((mem_write16_handler)STATIC_BANK12) |
| 306 |
#define MWA16_BANK13 ((mem_write16_handler)STATIC_BANK13) |
| 307 |
#define MWA16_BANK14 ((mem_write16_handler)STATIC_BANK14) |
| 308 |
#define MWA16_BANK15 ((mem_write16_handler)STATIC_BANK15) |
| 309 |
#define MWA16_BANK16 ((mem_write16_handler)STATIC_BANK16) |
| 310 |
#define MWA16_BANK17 ((mem_write16_handler)STATIC_BANK17) |
| 311 |
#define MWA16_BANK18 ((mem_write16_handler)STATIC_BANK18) |
| 312 |
#define MWA16_BANK19 ((mem_write16_handler)STATIC_BANK19) |
| 313 |
#define MWA16_BANK20 ((mem_write16_handler)STATIC_BANK20) |
| 314 |
#define MWA16_BANK21 ((mem_write16_handler)STATIC_BANK21) |
| 315 |
#define MWA16_BANK22 ((mem_write16_handler)STATIC_BANK22) |
| 316 |
#define MWA16_BANK23 ((mem_write16_handler)STATIC_BANK23) |
| 317 |
#define MWA16_BANK24 ((mem_write16_handler)STATIC_BANK24) |
| 318 |
#define MWA16_NOP ((mem_write16_handler)STATIC_NOP) |
| 319 |
#define MWA16_RAM ((mem_write16_handler)STATIC_RAM) |
| 320 |
#define MWA16_ROM ((mem_write16_handler)STATIC_ROM) |
| 321 |
|
| 322 |
/* 32-bit reads */ |
| 323 |
#define MRA32_BANK1 ((mem_read32_handler)STATIC_BANK1) |
| 324 |
#define MRA32_BANK2 ((mem_read32_handler)STATIC_BANK2) |
| 325 |
#define MRA32_BANK3 ((mem_read32_handler)STATIC_BANK3) |
| 326 |
#define MRA32_BANK4 ((mem_read32_handler)STATIC_BANK4) |
| 327 |
#define MRA32_BANK5 ((mem_read32_handler)STATIC_BANK5) |
| 328 |
#define MRA32_BANK6 ((mem_read32_handler)STATIC_BANK6) |
| 329 |
#define MRA32_BANK7 ((mem_read32_handler)STATIC_BANK7) |
| 330 |
#define MRA32_BANK8 ((mem_read32_handler)STATIC_BANK8) |
| 331 |
#define MRA32_BANK9 ((mem_read32_handler)STATIC_BANK9) |
| 332 |
#define MRA32_BANK10 ((mem_read32_handler)STATIC_BANK10) |
| 333 |
#define MRA32_BANK11 ((mem_read32_handler)STATIC_BANK11) |
| 334 |
#define MRA32_BANK12 ((mem_read32_handler)STATIC_BANK12) |
| 335 |
#define MRA32_BANK13 ((mem_read32_handler)STATIC_BANK13) |
| 336 |
#define MRA32_BANK14 ((mem_read32_handler)STATIC_BANK14) |
| 337 |
#define MRA32_BANK15 ((mem_read32_handler)STATIC_BANK15) |
| 338 |
#define MRA32_BANK16 ((mem_read32_handler)STATIC_BANK16) |
| 339 |
#define MRA32_BANK17 ((mem_read32_handler)STATIC_BANK17) |
| 340 |
#define MRA32_BANK18 ((mem_read32_handler)STATIC_BANK18) |
| 341 |
#define MRA32_BANK19 ((mem_read32_handler)STATIC_BANK19) |
| 342 |
#define MRA32_BANK20 ((mem_read32_handler)STATIC_BANK20) |
| 343 |
#define MRA32_BANK21 ((mem_read32_handler)STATIC_BANK21) |
| 344 |
#define MRA32_BANK22 ((mem_read32_handler)STATIC_BANK22) |
| 345 |
#define MRA32_BANK23 ((mem_read32_handler)STATIC_BANK23) |
| 346 |
#define MRA32_BANK24 ((mem_read32_handler)STATIC_BANK24) |
| 347 |
#define MRA32_NOP ((mem_read32_handler)STATIC_NOP) |
| 348 |
#define MRA32_RAM ((mem_read32_handler)STATIC_RAM) |
| 349 |
#define MRA32_ROM ((mem_read32_handler)STATIC_ROM) |
| 350 |
|
| 351 |
/* 32-bit writes */ |
| 352 |
#define MWA32_BANK1 ((mem_write32_handler)STATIC_BANK1) |
| 353 |
#define MWA32_BANK2 ((mem_write32_handler)STATIC_BANK2) |
| 354 |
#define MWA32_BANK3 ((mem_write32_handler)STATIC_BANK3) |
| 355 |
#define MWA32_BANK4 ((mem_write32_handler)STATIC_BANK4) |
| 356 |
#define MWA32_BANK5 ((mem_write32_handler)STATIC_BANK5) |
| 357 |
#define MWA32_BANK6 ((mem_write32_handler)STATIC_BANK6) |
| 358 |
#define MWA32_BANK7 ((mem_write32_handler)STATIC_BANK7) |
| 359 |
#define MWA32_BANK8 ((mem_write32_handler)STATIC_BANK8) |
| 360 |
#define MWA32_BANK9 ((mem_write32_handler)STATIC_BANK9) |
| 361 |
#define MWA32_BANK10 ((mem_write32_handler)STATIC_BANK10) |
| 362 |
#define MWA32_BANK11 ((mem_write32_handler)STATIC_BANK11) |
| 363 |
#define MWA32_BANK12 ((mem_write32_handler)STATIC_BANK12) |
| 364 |
#define MWA32_BANK13 ((mem_write32_handler)STATIC_BANK13) |
| 365 |
#define MWA32_BANK14 ((mem_write32_handler)STATIC_BANK14) |
| 366 |
#define MWA32_BANK15 ((mem_write32_handler)STATIC_BANK15) |
| 367 |
#define MWA32_BANK16 ((mem_write32_handler)STATIC_BANK16) |
| 368 |
#define MWA32_BANK17 ((mem_write32_handler)STATIC_BANK17) |
| 369 |
#define MWA32_BANK18 ((mem_write32_handler)STATIC_BANK18) |
| 370 |
#define MWA32_BANK19 ((mem_write32_handler)STATIC_BANK19) |
| 371 |
#define MWA32_BANK20 ((mem_write32_handler)STATIC_BANK20) |
| 372 |
#define MWA32_BANK21 ((mem_write32_handler)STATIC_BANK21) |
| 373 |
#define MWA32_BANK22 ((mem_write32_handler)STATIC_BANK22) |
| 374 |
#define MWA32_BANK23 ((mem_write32_handler)STATIC_BANK23) |
| 375 |
#define MWA32_BANK24 ((mem_write32_handler)STATIC_BANK24) |
| 376 |
#define MWA32_NOP ((mem_write32_handler)STATIC_NOP) |
| 377 |
#define MWA32_RAM ((mem_write32_handler)STATIC_RAM) |
| 378 |
#define MWA32_ROM ((mem_write32_handler)STATIC_ROM) |
| 379 |
|
| 380 |
|
| 381 |
|
| 382 |
/*************************************************************************** |
| 383 |
|
| 384 |
Constants for static entries in port read/write arrays |
| 385 |
|
| 386 |
***************************************************************************/ |
| 387 |
|
| 388 |
/* 8-bit port reads */ |
| 389 |
#define IORP_NOP ((port_read_handler)STATIC_NOP) |
| 390 |
|
| 391 |
/* 8-bit port writes */ |
| 392 |
#define IOWP_NOP ((port_write_handler)STATIC_NOP) |
| 393 |
|
| 394 |
/* 16-bit port reads */ |
| 395 |
#define IORP16_NOP ((port_read16_handler)STATIC_NOP) |
| 396 |
|
| 397 |
/* 16-bit port writes */ |
| 398 |
#define IOWP16_NOP ((port_write16_handler)STATIC_NOP) |
| 399 |
|
| 400 |
/* 32-bit port reads */ |
| 401 |
#define IORP32_NOP ((port_read32_handler)STATIC_NOP) |
| 402 |
|
| 403 |
/* 32-bit port writes */ |
| 404 |
#define IOWP32_NOP ((port_write32_handler)STATIC_NOP) |
| 405 |
|
| 406 |
|
| 407 |
|
| 408 |
/*************************************************************************** |
| 409 |
|
| 410 |
Memory/port array type definitions |
| 411 |
|
| 412 |
Note that the memory hooks are not passed the actual memory address |
| 413 |
where the operation takes place, but the offset from the beginning |
| 414 |
of the block they are assigned to. This makes handling of mirror |
| 415 |
addresses easier, and makes the handlers a bit more "object oriented". |
| 416 |
If you handler needs to read/write the main memory area, provide a |
| 417 |
"base" pointer: it will be initialized by the main engine to point to |
| 418 |
the beginning of the memory block assigned to the handler. You may |
| 419 |
also provided a pointer to "size": it will be set to the length of |
| 420 |
the memory area processed by the handler. |
| 421 |
|
| 422 |
***************************************************************************/ |
| 423 |
|
| 424 |
/* ----- structs for memory read arrays ----- */ |
| 425 |
struct Memory_ReadAddress |
| 426 |
{ |
| 427 |
offs_t start, end; /* start, end addresses, inclusive */ |
| 428 |
mem_read_handler handler; /* handler callback */ |
| 429 |
}; |
| 430 |
|
| 431 |
struct Memory_ReadAddress16 |
| 432 |
{ |
| 433 |
offs_t start, end; /* start, end addresses, inclusive */ |
| 434 |
mem_read16_handler handler; /* handler callback */ |
| 435 |
}; |
| 436 |
|
| 437 |
struct Memory_ReadAddress32 |
| 438 |
{ |
| 439 |
offs_t start, end; /* start, end addresses, inclusive */ |
| 440 |
mem_read32_handler handler; /* handler callback */ |
| 441 |
}; |
| 442 |
|
| 443 |
/* ----- structs for memory write arrays ----- */ |
| 444 |
struct Memory_WriteAddress |
| 445 |
{ |
| 446 |
offs_t start, end; /* start, end addresses, inclusive */ |
| 447 |
mem_write_handler handler; /* handler callback */ |
| 448 |
data8_t ** base; /* receives pointer to memory (optional) */ |
| 449 |
size_t * size; /* receives size of memory in bytes (optional) */ |
| 450 |
}; |
| 451 |
|
| 452 |
struct Memory_WriteAddress16 |
| 453 |
{ |
| 454 |
offs_t start, end; /* start, end addresses, inclusive */ |
| 455 |
mem_write16_handler handler; /* handler callback */ |
| 456 |
data16_t ** base; /* receives pointer to memory (optional) */ |
| 457 |
size_t * size; /* receives size of memory in bytes (optional) */ |
| 458 |
}; |
| 459 |
|
| 460 |
struct Memory_WriteAddress32 |
| 461 |
{ |
| 462 |
offs_t start, end; /* start, end addresses, inclusive */ |
| 463 |
mem_write32_handler handler; /* handler callback */ |
| 464 |
data32_t ** base; /* receives pointer to memory (optional) */ |
| 465 |
size_t * size; /* receives size of memory in bytes (optional) */ |
| 466 |
}; |
| 467 |
|
| 468 |
/* ----- structs for port read arrays ----- */ |
| 469 |
struct IO_ReadPort |
| 470 |
{ |
| 471 |
offs_t start, end; /* start, end addresses, inclusive */ |
| 472 |
port_read_handler handler; /* handler callback */ |
| 473 |
}; |
| 474 |
|
| 475 |
struct IO_ReadPort16 |
| 476 |
{ |
| 477 |
offs_t start, end; /* start, end addresses, inclusive */ |
| 478 |
port_read16_handler handler; /* handler callback */ |
| 479 |
}; |
| 480 |
|
| 481 |
struct IO_ReadPort32 |
| 482 |
{ |
| 483 |
offs_t start, end; /* start, end addresses, inclusive */ |
| 484 |
port_read32_handler handler; /* handler callback */ |
| 485 |
}; |
| 486 |
|
| 487 |
/* ----- structs for port write arrays ----- */ |
| 488 |
struct IO_WritePort |
| 489 |
{ |
| 490 |
offs_t start, end; /* start, end addresses, inclusive */ |
| 491 |
port_write_handler handler; /* handler callback */ |
| 492 |
}; |
| 493 |
|
| 494 |
struct IO_WritePort16 |
| 495 |
{ |
| 496 |
offs_t start, end; /* start, end addresses, inclusive */ |
| 497 |
port_write16_handler handler; /* handler callback */ |
| 498 |
}; |
| 499 |
|
| 500 |
struct IO_WritePort32 |
| 501 |
{ |
| 502 |
offs_t start, end; /* start, end addresses, inclusive */ |
| 503 |
port_write32_handler handler; /* handler callback */ |
| 504 |
}; |
| 505 |
|
| 506 |
|
| 507 |
|
| 508 |
/*************************************************************************** |
| 509 |
|
| 510 |
Memory/port array macros |
| 511 |
|
| 512 |
***************************************************************************/ |
| 513 |
|
| 514 |
/* ----- macros for identifying memory/port struct markers ----- */ |
| 515 |
#define IS_MEMPORT_MARKER(ma) ((ma)->start == MEMPORT_MARKER && (ma)->end < MEMPORT_MARKER) |
| 516 |
#define IS_MEMPORT_END(ma) ((ma)->start == MEMPORT_MARKER && (ma)->end == 0) |
| 517 |
|
| 518 |
/* ----- macros for defining the start/stop points ----- */ |
| 519 |
#define MEMPORT_ARRAY_START(t,n,f) const struct t n[] = { { MEMPORT_MARKER, (f) }, |
| 520 |
#define MEMPORT_ARRAY_END { MEMPORT_MARKER, 0 } }; |
| 521 |
|
| 522 |
/* ----- macros for setting the number of address bits ----- */ |
| 523 |
#define MEMPORT_SET_BITS(b) { MEMPORT_MARKER, MEMPORT_ABITS_MASK | (b) }, |
| 524 |
|
| 525 |
/* ----- macros for declaring the start of a memory struct array ----- */ |
| 526 |
#define MEMORY_READ_START(name) MEMPORT_ARRAY_START(Memory_ReadAddress, name, MEMPORT_DIRECTION_READ | MEMPORT_TYPE_MEM | MEMPORT_WIDTH_8) |
| 527 |
#define MEMORY_WRITE_START(name) MEMPORT_ARRAY_START(Memory_WriteAddress, name, MEMPORT_DIRECTION_WRITE | MEMPORT_TYPE_MEM | MEMPORT_WIDTH_8) |
| 528 |
#define MEMORY_READ16_START(name) MEMPORT_ARRAY_START(Memory_ReadAddress16, name, MEMPORT_DIRECTION_READ | MEMPORT_TYPE_MEM | MEMPORT_WIDTH_16) |
| 529 |
#define MEMORY_WRITE16_START(name) MEMPORT_ARRAY_START(Memory_WriteAddress16, name, MEMPORT_DIRECTION_WRITE | MEMPORT_TYPE_MEM | MEMPORT_WIDTH_16) |
| 530 |
#define MEMORY_READ32_START(name) MEMPORT_ARRAY_START(Memory_ReadAddress32, name, MEMPORT_DIRECTION_READ | MEMPORT_TYPE_MEM | MEMPORT_WIDTH_32) |
| 531 |
#define MEMORY_WRITE32_START(name) MEMPORT_ARRAY_START(Memory_WriteAddress32, name, MEMPORT_DIRECTION_WRITE | MEMPORT_TYPE_MEM | MEMPORT_WIDTH_32) |
| 532 |
|
| 533 |
#define MEMORY_ADDRESS_BITS(bits) MEMPORT_SET_BITS(bits) |
| 534 |
#define MEMORY_END MEMPORT_ARRAY_END |
| 535 |
|
| 536 |
/* ----- macros for declaring the start of a port struct array ----- */ |
| 537 |
#define PORT_READ_START(name) MEMPORT_ARRAY_START(IO_ReadPort, name, MEMPORT_DIRECTION_READ | MEMPORT_TYPE_IO | MEMPORT_WIDTH_8) |
| 538 |
#define PORT_WRITE_START(name) MEMPORT_ARRAY_START(IO_WritePort, name, MEMPORT_DIRECTION_WRITE | MEMPORT_TYPE_IO | MEMPORT_WIDTH_8) |
| 539 |
#define PORT_READ16_START(name) MEMPORT_ARRAY_START(IO_ReadPort16, name, MEMPORT_DIRECTION_READ | MEMPORT_TYPE_IO | MEMPORT_WIDTH_16) |
| 540 |
#define PORT_WRITE16_START(name) MEMPORT_ARRAY_START(IO_WritePort16, name, MEMPORT_DIRECTION_WRITE | MEMPORT_TYPE_IO | MEMPORT_WIDTH_16) |
| 541 |
#define PORT_READ32_START(name) MEMPORT_ARRAY_START(IO_ReadPort32, name, MEMPORT_DIRECTION_READ | MEMPORT_TYPE_IO | MEMPORT_WIDTH_32) |
| 542 |
#define PORT_WRITE32_START(name) MEMPORT_ARRAY_START(IO_WritePort32, name, MEMPORT_DIRECTION_WRITE | MEMPORT_TYPE_IO | MEMPORT_WIDTH_32) |
| 543 |
|
| 544 |
#define PORT_ADDRESS_BITS(bits) MEMPORT_SET_BITS(bits) |
| 545 |
#define PORT_END MEMPORT_ARRAY_END |
| 546 |
|
| 547 |
|
| 548 |
|
| 549 |
/*************************************************************************** |
| 550 |
|
| 551 |
Memory/port lookup constants |
| 552 |
|
| 553 |
These apply to values in the internal lookup table. |
| 554 |
|
| 555 |
***************************************************************************/ |
| 556 |
|
| 557 |
/* ----- memory/port lookup table definitions ----- */ |
| 558 |
#define SUBTABLE_COUNT 64 /* number of slots reserved for subtables */ |
| 559 |
#define SUBTABLE_MASK (SUBTABLE_COUNT-1) /* mask to get at the subtable index */ |
| 560 |
#define SUBTABLE_BASE (256-SUBTABLE_COUNT) /* first index of a subtable */ |
| 561 |
#define ENTRY_COUNT (SUBTABLE_BASE) /* number of legitimate (non-subtable) entries */ |
| 562 |
#define SUBTABLE_ALLOC 8 /* number of subtables to allocate at a time */ |
| 563 |
|
| 564 |
/* ----- bit counts ----- */ |
| 565 |
#define LEVEL1_BITS_PREF 12 /* preferred number of bits in the 1st level lookup */ |
| 566 |
#define LEVEL1_BITS_BIAS 4 /* number of bits used to bias the L1 bits computation */ |
| 567 |
#define SPARSE_THRESH 20 /* number of address bits above which we use sparse memory */ |
| 568 |
|
| 569 |
/* ----- external memory constants ----- */ |
| 570 |
#define MAX_EXT_MEMORY 64 /* maximum external memory areas we can allocate */ |
| 571 |
|
| 572 |
|
| 573 |
|
| 574 |
/*************************************************************************** |
| 575 |
|
| 576 |
Memory/port lookup macros |
| 577 |
|
| 578 |
These are used for accessing the internal lookup table. |
| 579 |
|
| 580 |
***************************************************************************/ |
| 581 |
|
| 582 |
/* ----- macros for determining the number of bits to use ----- */ |
| 583 |
#define LEVEL1_BITS(x) (((x) < (2*LEVEL1_BITS_PREF - LEVEL1_BITS_BIAS)) ? LEVEL1_BITS_PREF : ((x) + LEVEL1_BITS_BIAS) / 2) |
| 584 |
#define LEVEL2_BITS(x) ((x) - LEVEL1_BITS(x)) |
| 585 |
#define LEVEL1_MASK(x) ((1 << LEVEL1_BITS(x)) - 1) |
| 586 |
#define LEVEL2_MASK(x) ((1 << LEVEL2_BITS(x)) - 1) |
| 587 |
|
| 588 |
/* ----- table lookup helpers ----- */ |
| 589 |
#define LEVEL1_INDEX(a,b,m) ((a) >> (LEVEL2_BITS((b)-(m)) + (m))) |
| 590 |
#define LEVEL2_INDEX(e,a,b,m) ((1 << LEVEL1_BITS((b)-(m))) + (((e) & SUBTABLE_MASK) << LEVEL2_BITS((b)-(m))) + (((a) >> (m)) & LEVEL2_MASK((b)-(m)))) |
| 591 |
|
| 592 |
/* ----- sparse memory space detection ----- */ |
| 593 |
#define IS_SPARSE(a) ((a) > SPARSE_THRESH) |
| 594 |
|
| 595 |
|
| 596 |
|
| 597 |
/*************************************************************************** |
| 598 |
|
| 599 |
Macros to help declare handlers for core readmem/writemem routines |
| 600 |
|
| 601 |
***************************************************************************/ |
| 602 |
|
| 603 |
/* ----- for declaring 8-bit handlers ----- */ |
| 604 |
#define DECLARE_HANDLERS_8BIT(type, abits) \ |
| 605 |
data8_t cpu_read##type##abits (offs_t offset); \ |
| 606 |
void cpu_write##type##abits (offs_t offset, data8_t data); |
| 607 |
|
| 608 |
/* ----- for declaring 16-bit bigendian handlers ----- */ |
| 609 |
#define DECLARE_HANDLERS_16BIT_BE(type, abits) \ |
| 610 |
data8_t cpu_read##type##abits##bew (offs_t offset); \ |
| 611 |
data16_t cpu_read##type##abits##bew_word (offs_t offset); \ |
| 612 |
void cpu_write##type##abits##bew (offs_t offset, data8_t data); \ |
| 613 |
void cpu_write##type##abits##bew_word (offs_t offset, data16_t data); |
| 614 |
|
| 615 |
/* ----- for declaring 16-bit littleendian handlers ----- */ |
| 616 |
#define DECLARE_HANDLERS_16BIT_LE(type, abits) \ |
| 617 |
data8_t cpu_read##type##abits##lew (offs_t offset); \ |
| 618 |
data16_t cpu_read##type##abits##lew_word (offs_t offset); \ |
| 619 |
void cpu_write##type##abits##lew (offs_t offset, data8_t data); \ |
| 620 |
void cpu_write##type##abits##lew_word (offs_t offset, data16_t data); |
| 621 |
|
| 622 |
/* ----- for declaring 32-bit bigendian handlers ----- */ |
| 623 |
#define DECLARE_HANDLERS_32BIT_BE(type, abits) \ |
| 624 |
data8_t cpu_read##type##abits##bedw (offs_t offset); \ |
| 625 |
data16_t cpu_read##type##abits##bedw_word (offs_t offset); \ |
| 626 |
data32_t cpu_read##type##abits##bedw_dword (offs_t offset); \ |
| 627 |
void cpu_write##type##abits##bedw (offs_t offset, data8_t data); \ |
| 628 |
void cpu_write##type##abits##bedw_word (offs_t offset, data16_t data); \ |
| 629 |
void cpu_write##type##abits##bedw_dword(offs_t offset, data32_t data); |
| 630 |
|
| 631 |
/* ----- for declaring 32-bit littleendian handlers ----- */ |
| 632 |
#define DECLARE_HANDLERS_32BIT_LE(type, abits) \ |
| 633 |
data8_t cpu_read##type##abits##ledw (offs_t offset); \ |
| 634 |
data16_t cpu_read##type##abits##ledw_word (offs_t offset); \ |
| 635 |
data32_t cpu_read##type##abits##ledw_dword (offs_t offset); \ |
| 636 |
void cpu_write##type##abits##ledw (offs_t offset, data8_t data); \ |
| 637 |
void cpu_write##type##abits##ledw_word (offs_t offset, data16_t data); \ |
| 638 |
void cpu_write##type##abits##ledw_dword(offs_t offset, data32_t data); |
| 639 |
|
| 640 |
/* ----- for declaring memory handlers ----- */ |
| 641 |
#define DECLARE_MEM_HANDLERS_8BIT(abits) \ |
| 642 |
DECLARE_HANDLERS_8BIT(mem, abits) \ |
| 643 |
void cpu_setopbase##abits (offs_t pc); |
| 644 |
|
| 645 |
#define DECLARE_MEM_HANDLERS_16BIT_BE(abits) \ |
| 646 |
DECLARE_HANDLERS_16BIT_BE(mem, abits) \ |
| 647 |
void cpu_setopbase##abits##bew (offs_t pc); |
| 648 |
|
| 649 |
#define DECLARE_MEM_HANDLERS_16BIT_LE(abits) \ |
| 650 |
DECLARE_HANDLERS_16BIT_LE(mem, abits) \ |
| 651 |
void cpu_setopbase##abits##lew (offs_t pc); |
| 652 |
|
| 653 |
#define DECLARE_MEM_HANDLERS_32BIT_BE(abits) \ |
| 654 |
DECLARE_HANDLERS_32BIT_BE(mem, abits) \ |
| 655 |
void cpu_setopbase##abits##bedw (offs_t pc); |
| 656 |
|
| 657 |
#define DECLARE_MEM_HANDLERS_32BIT_LE(abits) \ |
| 658 |
DECLARE_HANDLERS_32BIT_LE(mem, abits) \ |
| 659 |
void cpu_setopbase##abits##ledw (offs_t pc); |
| 660 |
|
| 661 |
/* ----- for declaring port handlers ----- */ |
| 662 |
#define DECLARE_PORT_HANDLERS_8BIT(abits) \ |
| 663 |
DECLARE_HANDLERS_8BIT(port, abits) |
| 664 |
|
| 665 |
#define DECLARE_PORT_HANDLERS_16BIT_BE(abits) \ |
| 666 |
DECLARE_HANDLERS_16BIT_BE(port, abits) |
| 667 |
|
| 668 |
#define DECLARE_PORT_HANDLERS_16BIT_LE(abits) \ |
| 669 |
DECLARE_HANDLERS_16BIT_LE(port, abits) |
| 670 |
|
| 671 |
#define DECLARE_PORT_HANDLERS_32BIT_BE(abits) \ |
| 672 |
DECLARE_HANDLERS_32BIT_BE(port, abits) |
| 673 |
|
| 674 |
#define DECLARE_PORT_HANDLERS_32BIT_LE(abits) \ |
| 675 |
DECLARE_HANDLERS_32BIT_LE(port, abits) |
| 676 |
|
| 677 |
|
| 678 |
|
| 679 |
/*************************************************************************** |
| 680 |
|
| 681 |
Function prototypes for core readmem/writemem routines |
| 682 |
|
| 683 |
***************************************************************************/ |
| 684 |
|
| 685 |
/* ----- declare 8-bit handlers ----- */ |
| 686 |
DECLARE_MEM_HANDLERS_8BIT(16) |
| 687 |
DECLARE_MEM_HANDLERS_8BIT(17) |
| 688 |
DECLARE_MEM_HANDLERS_8BIT(20) |
| 689 |
DECLARE_MEM_HANDLERS_8BIT(21) |
| 690 |
DECLARE_MEM_HANDLERS_8BIT(24) |
| 691 |
#define change_pc16(pc) change_pc_generic(pc, 16, 0, cpu_setopbase16) |
| 692 |
#define change_pc17(pc) change_pc_generic(pc, 17, 0, cpu_setopbase17) |
| 693 |
#define change_pc20(pc) change_pc_generic(pc, 20, 0, cpu_setopbase20) |
| 694 |
#define change_pc21(pc) change_pc_generic(pc, 21, 0, cpu_setopbase21) |
| 695 |
#define change_pc24(pc) change_pc_generic(pc, 24, 0, cpu_setopbase24) |
| 696 |
|
| 697 |
/* ----- declare 16-bit bigendian handlers ----- */ |
| 698 |
DECLARE_MEM_HANDLERS_16BIT_BE(16) |
| 699 |
DECLARE_MEM_HANDLERS_16BIT_BE(24) |
| 700 |
DECLARE_MEM_HANDLERS_16BIT_BE(32) |
| 701 |
#define change_pc16bew(pc) change_pc_generic(pc, 16, 1, cpu_setopbase16bew) |
| 702 |
#define change_pc24bew(pc) change_pc_generic(pc, 24, 1, cpu_setopbase24bew) |
| 703 |
#define change_pc32bew(pc) change_pc_generic(pc, 32, 1, cpu_setopbase32bew) |
| 704 |
|
| 705 |
/* ----- declare 16-bit littleendian handlers ----- */ |
| 706 |
DECLARE_MEM_HANDLERS_16BIT_LE(16) |
| 707 |
DECLARE_MEM_HANDLERS_16BIT_LE(17) |
| 708 |
DECLARE_MEM_HANDLERS_16BIT_LE(24) |
| 709 |
DECLARE_MEM_HANDLERS_16BIT_LE(29) |
| 710 |
DECLARE_MEM_HANDLERS_16BIT_LE(32) |
| 711 |
#define change_pc16lew(pc) change_pc_generic(pc, 16, 1, cpu_setopbase16lew) |
| 712 |
#define change_pc17lew(pc) change_pc_generic(pc, 17, 1, cpu_setopbase17lew) |
| 713 |
#define change_pc24lew(pc) change_pc_generic(pc, 24, 1, cpu_setopbase24lew) |
| 714 |
#define change_pc29lew(pc) change_pc_generic(pc, 29, 1, cpu_setopbase29lew) |
| 715 |
#define change_pc32lew(pc) change_pc_generic(pc, 32, 1, cpu_setopbase32lew) |
| 716 |
|
| 717 |
/* ----- declare 32-bit bigendian handlers ----- */ |
| 718 |
DECLARE_MEM_HANDLERS_32BIT_BE(24) |
| 719 |
DECLARE_MEM_HANDLERS_32BIT_BE(29) |
| 720 |
DECLARE_MEM_HANDLERS_32BIT_BE(32) |
| 721 |
#define change_pc24bedw(pc) change_pc_generic(pc, 24, 2, cpu_setopbase24bedw) |
| 722 |
#define change_pc29bedw(pc) change_pc_generic(pc, 29, 2, cpu_setopbase29bedw) |
| 723 |
#define change_pc32bedw(pc) change_pc_generic(pc, 32, 2, cpu_setopbase32bedw) |
| 724 |
|
| 725 |
/* ----- declare 32-bit littleendian handlers ----- */ |
| 726 |
DECLARE_MEM_HANDLERS_32BIT_LE(26) |
| 727 |
DECLARE_MEM_HANDLERS_32BIT_LE(29) |
| 728 |
DECLARE_MEM_HANDLERS_32BIT_LE(32) |
| 729 |
#define change_pc26ledw(pc) change_pc_generic(pc, 26, 2, cpu_setopbase26ledw) |
| 730 |
#define change_pc29ledw(pc) change_pc_generic(pc, 29, 2, cpu_setopbase29ledw) |
| 731 |
#define change_pc32ledw(pc) change_pc_generic(pc, 32, 2, cpu_setopbase32ledw) |
| 732 |
|
| 733 |
/* ----- declare pdp1 handler ----- */ |
| 734 |
DECLARE_MEM_HANDLERS_32BIT_BE(18) |
| 735 |
#define change_pc28bedw(pc) change_pc_generic(pc, 18, 2, cpu_setopbase18bedw) |
| 736 |
|
| 737 |
|
| 738 |
/*************************************************************************** |
| 739 |
|
| 740 |
Function prototypes for core readport/writeport routines |
| 741 |
|
| 742 |
***************************************************************************/ |
| 743 |
|
| 744 |
/* ----- declare 8-bit handlers ----- */ |
| 745 |
DECLARE_PORT_HANDLERS_8BIT(16) |
| 746 |
|
| 747 |
/* ----- declare 16-bit bigendian handlers ----- */ |
| 748 |
DECLARE_PORT_HANDLERS_16BIT_BE(16) |
| 749 |
|
| 750 |
/* ----- declare 16-bit littleendian handlers ----- */ |
| 751 |
DECLARE_PORT_HANDLERS_16BIT_LE(16) |
| 752 |
DECLARE_PORT_HANDLERS_16BIT_LE(24) |
| 753 |
|
| 754 |
/* ----- declare 32-bit bigendian handlers ----- */ |
| 755 |
DECLARE_PORT_HANDLERS_32BIT_BE(16) |
| 756 |
|
| 757 |
/* ----- declare 32-bit littleendian handlers ----- */ |
| 758 |
DECLARE_PORT_HANDLERS_32BIT_LE(16) |
| 759 |
DECLARE_PORT_HANDLERS_32BIT_LE(24) |
| 760 |
|
| 761 |
|
| 762 |
/*************************************************************************** |
| 763 |
|
| 764 |
Function prototypes for core memory functions |
| 765 |
|
| 766 |
***************************************************************************/ |
| 767 |
|
| 768 |
/* ----- memory setup function ----- */ |
| 769 |
int memory_init(void); |
| 770 |
void memory_shutdown(void); |
| 771 |
void memory_set_context(int activecpu); |
| 772 |
void memory_set_unmap_value(data32_t value); |
| 773 |
|
| 774 |
/* ----- dynamic bank handlers ----- */ |
| 775 |
void memory_set_bankhandler_r(int bank, offs_t offset, mem_read_handler handler); |
| 776 |
void memory_set_bankhandler_w(int bank, offs_t offset, mem_write_handler handler); |
| 777 |
|
| 778 |
/* ----- opcode base control ---- */ |
| 779 |
opbase_handler memory_set_opbase_handler(int cpunum, opbase_handler function); |
| 780 |
|
| 781 |
/* ----- separate opcode/data encryption helpers ---- */ |
| 782 |
void memory_set_opcode_base(int cpunum, void *base); |
| 783 |
void memory_set_encrypted_opcode_range(int cpunum, offs_t min_address,offs_t max_address); |
| 784 |
extern offs_t encrypted_opcode_start[],encrypted_opcode_end[]; |
| 785 |
|
| 786 |
/* ----- return a base pointer to memory ---- */ |
| 787 |
void * memory_find_base(int cpunum, offs_t offset); |
| 788 |
|
| 789 |
/* ----- dynamic memory mapping ----- */ |
| 790 |
data8_t * install_mem_read_handler (int cpunum, offs_t start, offs_t end, mem_read_handler handler); |
| 791 |
data16_t * install_mem_read16_handler (int cpunum, offs_t start, offs_t end, mem_read16_handler handler); |
| 792 |
data32_t * install_mem_read32_handler (int cpunum, offs_t start, offs_t end, mem_read32_handler handler); |
| 793 |
data8_t * install_mem_write_handler (int cpunum, offs_t start, offs_t end, mem_write_handler handler); |
| 794 |
data16_t * install_mem_write16_handler (int cpunum, offs_t start, offs_t end, mem_write16_handler handler); |
| 795 |
data32_t * install_mem_write32_handler (int cpunum, offs_t start, offs_t end, mem_write32_handler handler); |
| 796 |
|
| 797 |
/* ----- dynamic port mapping ----- */ |
| 798 |
void install_port_read_handler (int cpunum, offs_t start, offs_t end, port_read_handler handler); |
| 799 |
void install_port_read16_handler (int cpunum, offs_t start, offs_t end, port_read16_handler handler); |
| 800 |
void install_port_read32_handler (int cpunum, offs_t start, offs_t end, port_read32_handler handler); |
| 801 |
void install_port_write_handler (int cpunum, offs_t start, offs_t end, port_write_handler handler); |
| 802 |
void install_port_write16_handler(int cpunum, offs_t start, offs_t end, port_write16_handler handler); |
| 803 |
void install_port_write32_handler(int cpunum, offs_t start, offs_t end, port_write32_handler handler); |
| 804 |
|
| 805 |
|
| 806 |
|
| 807 |
/*************************************************************************** |
| 808 |
|
| 809 |
Global variables |
| 810 |
|
| 811 |
***************************************************************************/ |
| 812 |
|
| 813 |
extern UINT8 opcode_entry; /* current entry for opcode fetching */ |
| 814 |
extern UINT8 * OP_ROM; /* opcode ROM base */ |
| 815 |
extern UINT8 * OP_RAM; /* opcode RAM base */ |
| 816 |
extern UINT8 * cpu_bankbase[]; /* array of bank bases */ |
| 817 |
extern UINT8 * readmem_lookup; /* pointer to the readmem lookup table */ |
| 818 |
extern offs_t mem_amask; /* memory address mask */ |
| 819 |
extern struct ExtMemory ext_memory[]; /* externally-allocated memory */ |
| 820 |
|
| 821 |
|
| 822 |
|
| 823 |
/*************************************************************************** |
| 824 |
|
| 825 |
Helper macros |
| 826 |
|
| 827 |
***************************************************************************/ |
| 828 |
|
| 829 |
/* ----- 16/32-bit memory accessing ----- */ |
| 830 |
#define COMBINE_DATA(varptr) (*(varptr) = (*(varptr) & mem_mask) | (data & ~mem_mask)) |
| 831 |
|
| 832 |
/* ----- 16-bit memory accessing ----- */ |
| 833 |
#define ACCESSING_LSB16 ((mem_mask & 0x00ff) == 0) |
| 834 |
#define ACCESSING_MSB16 ((mem_mask & 0xff00) == 0) |
| 835 |
#define ACCESSING_LSB ACCESSING_LSB16 |
| 836 |
#define ACCESSING_MSB ACCESSING_MSB16 |
| 837 |
|
| 838 |
/* ----- 32-bit memory accessing ----- */ |
| 839 |
#define ACCESSING_LSW32 ((mem_mask & 0x0000ffff) == 0) |
| 840 |
#define ACCESSING_MSW32 ((mem_mask & 0xffff0000) == 0) |
| 841 |
#define ACCESSING_LSB32 ((mem_mask & 0x000000ff) == 0) |
| 842 |
#define ACCESSING_MSB32 ((mem_mask & 0xff000000) == 0) |
| 843 |
|
| 844 |
/* ----- opcode reading ----- */ |
| 845 |
#define cpu_readop(A) (OP_ROM[(A) & mem_amask]) |
| 846 |
#define cpu_readop16(A) (*(data16_t *)&OP_ROM[(A) & mem_amask]) |
| 847 |
#define cpu_readop32(A) (*(data32_t *)&OP_ROM[(A) & mem_amask]) |
| 848 |
|
| 849 |
/* ----- opcode argument reading ----- */ |
| 850 |
#define cpu_readop_arg(A) (OP_RAM[(A) & mem_amask]) |
| 851 |
#define cpu_readop_arg16(A) (*(data16_t *)&OP_RAM[(A) & mem_amask]) |
| 852 |
#define cpu_readop_arg32(A) (*(data32_t *)&OP_RAM[(A) & mem_amask]) |
| 853 |
|
| 854 |
/* ----- bank switching for CPU cores ----- */ |
| 855 |
#define change_pc_generic(pc,abits,minbits,setop) \ |
| 856 |
do { \ |
| 857 |
if (readmem_lookup[LEVEL1_INDEX((pc) & mem_amask,abits,minbits)] != opcode_entry) \ |
| 858 |
setop(pc); \ |
| 859 |
} while (0) \ |
| 860 |
|
| 861 |
|
| 862 |
/* ----- forces the next branch to generate a call to the opbase handler ----- */ |
| 863 |
#define catch_nextBranch() (opcode_entry = 0xff) |
| 864 |
|
| 865 |
/* ----- bank switching macro ----- */ |
| 866 |
#define cpu_setbank(bank, base) \ |
| 867 |
do { \ |
| 868 |
if (bank >= STATIC_BANK1 && bank <= STATIC_BANKMAX) \ |
| 869 |
{ \ |
| 870 |
cpu_bankbase[bank] = (UINT8 *)(base); \ |
| 871 |
if (opcode_entry == bank && cpu_getactivecpu() >= 0) \ |
| 872 |
{ \ |
| 873 |
opcode_entry = 0xff; \ |
| 874 |
activecpu_set_op_base(activecpu_get_pc_byte()); \ |
| 875 |
} \ |
| 876 |
} \ |
| 877 |
} while (0) |
| 878 |
|
| 879 |
|
| 880 |
|
| 881 |
#ifdef __cplusplus |
| 882 |
} |
| 883 |
#endif |
| 884 |
|
| 885 |
#endif /* !_MEMORY_H */ |
| 886 |
|