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