65 lines
1.5 KiB
C
65 lines
1.5 KiB
C
#include "ram.h"
|
|
|
|
#define TARGET_ENDIAN __ORDER_LITTLE_ENDIAN__
|
|
|
|
uint8_t ram__read_memory8(void * data, uint32_t address)
|
|
{
|
|
uint8_t * mem = (uint8_t *)data;
|
|
return mem[address];
|
|
}
|
|
|
|
uint16_t ram__read_memory16(void * data, uint32_t address)
|
|
{
|
|
uint16_t * mem = (uint16_t *)data;
|
|
uint16_t value = mem[address >> 1];
|
|
#if __BYTE_ORDER__ == TARGET_ENDIAN
|
|
return value;
|
|
#else
|
|
return __builtin_bswap16(value);
|
|
#endif
|
|
}
|
|
|
|
uint32_t ram__read_memory32(void * data, uint32_t address)
|
|
{
|
|
uint32_t * mem = (uint32_t *)data;
|
|
uint32_t value = mem[address >> 2];
|
|
#if __BYTE_ORDER__ == TARGET_ENDIAN
|
|
return value;
|
|
#else
|
|
return __builtin_bswap32(value);
|
|
#endif
|
|
}
|
|
|
|
void ram__write_memory8(void * data, uint32_t address, uint8_t value)
|
|
{
|
|
uint8_t * mem = (uint8_t *)data;
|
|
mem[address] = value;
|
|
}
|
|
|
|
void ram__write_memory16(void * data, uint32_t address, uint16_t value)
|
|
{
|
|
uint16_t * mem = (uint16_t *)data;
|
|
#if __BYTE_ORDER__ != TARGET_ENDIAN
|
|
value = __builtin_bswap16(value);
|
|
#endif
|
|
mem[address >> 1] = value;
|
|
}
|
|
|
|
void ram__write_memory32(void * data, uint32_t address, uint32_t value)
|
|
{
|
|
uint32_t * mem = (uint32_t *)data;
|
|
#if __BYTE_ORDER__ != TARGET_ENDIAN
|
|
value = __builtin_bswap32(value);
|
|
#endif
|
|
mem[address >> 2] = value;
|
|
}
|
|
|
|
struct memory_access ram__memory_access = {
|
|
.read_memory8 = &ram__read_memory8,
|
|
.read_memory16 = &ram__read_memory16,
|
|
.read_memory32 = &ram__read_memory32,
|
|
.write_memory8 = &ram__write_memory8,
|
|
.write_memory16 = &ram__write_memory16,
|
|
.write_memory32 = &ram__write_memory32
|
|
};
|