smsplus/cpu/memory.h
2016-09-21 19:54:51 -04:00

110 lines
4 KiB
C

/***************************************************************************
memory.h
Functions which handle the CPU memory and I/O port access.
***************************************************************************/
#ifndef _MEMORY_H
#define _MEMORY_H
#include "osd_cpu.h"
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* Versions of GNU C earlier that 2.7 appear to have problems with the
* __attribute__ definition of UNUSEDARG, so we act as if it was not a
* GNU compiler.
*/
#ifdef __GNUC__
#if (__GNUC__ < 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ <= 7))
#define UNUSEDARG
#else
#define UNUSEDARG __attribute__((__unused__))
#endif
#else
#define UNUSEDARG
#endif
/***************************************************************************
Basic type definitions
These types are used for memory handlers.
***************************************************************************/
/* ----- typedefs for data and offset types ----- */
typedef UINT8 data8_t;
typedef UINT16 data16_t;
typedef UINT32 data32_t;
typedef UINT32 offs_t;
/* ----- typedefs for the various common memory/port handlers ----- */
typedef data8_t (*read8_handler) (UNUSEDARG offs_t offset);
typedef void (*write8_handler) (UNUSEDARG offs_t offset, UNUSEDARG data8_t data);
typedef data16_t (*read16_handler) (UNUSEDARG offs_t offset, UNUSEDARG data16_t mem_mask);
typedef void (*write16_handler)(UNUSEDARG offs_t offset, UNUSEDARG data16_t data, UNUSEDARG data16_t mem_mask);
typedef data32_t (*read32_handler) (UNUSEDARG offs_t offset, UNUSEDARG data32_t mem_mask);
typedef void (*write32_handler)(UNUSEDARG offs_t offset, UNUSEDARG data32_t data, UNUSEDARG data32_t mem_mask);
typedef offs_t (*opbase_handler) (UNUSEDARG offs_t address);
/* ----- typedefs for the various common memory handlers ----- */
typedef read8_handler mem_read_handler;
typedef write8_handler mem_write_handler;
typedef read16_handler mem_read16_handler;
typedef write16_handler mem_write16_handler;
typedef read32_handler mem_read32_handler;
typedef write32_handler mem_write32_handler;
/* ----- typedefs for the various common port handlers ----- */
typedef read8_handler port_read_handler;
typedef write8_handler port_write_handler;
typedef read16_handler port_read16_handler;
typedef write16_handler port_write16_handler;
typedef read32_handler port_read32_handler;
typedef write32_handler port_write32_handler;
/* ----- macros for declaring the various common memory/port handlers ----- */
#define READ_HANDLER(name) data8_t name(UNUSEDARG offs_t offset)
#define WRITE_HANDLER(name) void name(UNUSEDARG offs_t offset, UNUSEDARG data8_t data)
#define READ16_HANDLER(name) data16_t name(UNUSEDARG offs_t offset, UNUSEDARG data16_t mem_mask)
#define WRITE16_HANDLER(name) void name(UNUSEDARG offs_t offset, UNUSEDARG data16_t data, UNUSEDARG data16_t mem_mask)
#define READ32_HANDLER(name) data32_t name(UNUSEDARG offs_t offset, UNUSEDARG data32_t mem_mask)
#define WRITE32_HANDLER(name) void name(UNUSEDARG offs_t offset, UNUSEDARG data32_t data, UNUSEDARG data32_t mem_mask)
#define OPBASE_HANDLER(name) offs_t name(UNUSEDARG offs_t address)
/* ----- macros for accessing bytes and words within larger chunks ----- */
#ifdef LSB_FIRST
#define BYTE_XOR_BE(a) ((a) ^ 1) /* read/write a byte to a 16-bit space */
#define BYTE_XOR_LE(a) (a)
#define BYTE4_XOR_BE(a) ((a) ^ 3) /* read/write a byte to a 32-bit space */
#define BYTE4_XOR_LE(a) (a)
#define WORD_XOR_BE(a) ((a) ^ 2) /* read/write a word to a 32-bit space */
#define WORD_XOR_LE(a) (a)
#else
#define BYTE_XOR_BE(a) (a)
#define BYTE_XOR_LE(a) ((a) ^ 1) /* read/write a byte to a 16-bit space */
#define BYTE4_XOR_BE(a) (a)
#define BYTE4_XOR_LE(a) ((a) ^ 3) /* read/write a byte to a 32-bit space */
#define WORD_XOR_BE(a) (a)
#define WORD_XOR_LE(a) ((a) ^ 2) /* read/write a word to a 32-bit space */
#endif
#ifdef __cplusplus
}
#endif
#endif /* !_MEMORY_H */