/*************************************************************************** memory.h Functions which handle the CPU memory and I/O port access. ***************************************************************************/ #ifndef _MEMORY_H #define _MEMORY_H #include "osd_cpu.h" #include #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 */