flycast/core/hw/arm7/arm_mem.h

60 lines
1.2 KiB
C
Raw Normal View History

2013-12-19 17:10:14 +00:00
#pragma once
#include "types.h"
#include "hw/aica/aica_if.h"
template <typename T> T arm_ReadReg(u32 addr);
template <typename T> void arm_WriteReg(u32 addr, T data);
2013-12-19 17:10:14 +00:00
template<typename T>
2013-12-19 17:10:14 +00:00
static inline T DYNACALL ReadMemArm(u32 addr)
{
addr &= 0x00FFFFFF;
if (addr < 0x800000)
2013-12-19 17:10:14 +00:00
{
T rv = *(T *)&aica_ram[addr & (ARAM_MASK - (sizeof(T) - 1))];
2013-12-19 17:10:14 +00:00
if (unlikely(sizeof(T) == 4 && (addr & 3) != 0))
2013-12-19 17:10:14 +00:00
{
u32 sf = (addr & 3) * 8;
return (rv >> sf) | (rv << (32 - sf));
2013-12-19 17:10:14 +00:00
}
else
return rv;
}
else
{
return arm_ReadReg<T>(addr);
2013-12-19 17:10:14 +00:00
}
}
template<typename T>
static inline void DYNACALL WriteMemArm(u32 addr, T data)
2013-12-19 17:10:14 +00:00
{
addr &= 0x00FFFFFF;
if (addr < 0x800000)
2013-12-19 17:10:14 +00:00
{
*(T *)&aica_ram[addr & (ARAM_MASK - (sizeof(T) - 1))] = data;
2013-12-19 17:10:14 +00:00
}
else
{
arm_WriteReg(addr, data);
2013-12-19 17:10:14 +00:00
}
}
#define arm_ReadMem8 ReadMemArm<u8>
#define arm_ReadMem16 ReadMemArm<u16>
#define arm_ReadMem32 ReadMemArm<u32>
2013-12-19 17:10:14 +00:00
#define arm_WriteMem8 WriteMemArm<u8>
#define arm_WriteMem16 WriteMemArm<u16>
#define arm_WriteMem32 WriteMemArm<u32>
2013-12-19 17:10:14 +00:00
2019-07-10 15:25:11 +00:00
extern bool aica_interr;
extern u32 aica_reg_L;
2013-12-19 17:10:14 +00:00
extern bool e68k_out;
2019-07-10 15:25:11 +00:00
extern u32 e68k_reg_L;
extern u32 e68k_reg_M;
2013-12-19 17:10:14 +00:00
void update_armintc();
void libARM_InterruptChange(u32 bits, u32 L);