mirror of
https://github.com/0ldsk00l/smsplus.git
synced 2025-04-02 10:32:07 -04:00
110 lines
4 KiB
C
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 */
|
|
|