#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 };