sh-dis/c/ram.c
Zack Buhman 8a300ba4c6 initial SH4 emulator implementation in C
This currently only implements the SH2 instructions.
2024-04-22 20:53:36 +08:00

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