#pragma once #include "types.h" typedef u32 RegReadAddrFP(u32 addr); typedef void RegWriteAddrFP(u32 addr, u32 data); /* Read Write Const D D N -> 0 -> RIO_DATA D F N -> WF -> RIO_WF F F N -> RF|WF -> RIO_FUNC D X N -> RO|WF -> RIO_RO F X N -> RF|WF|RO -> RIO_RO_FUNC X F N -> RF|WF|WO -> RIO_WO_FUNC */ enum RegStructFlags { REG_RF = 8, REG_WF = 16, REG_RO = 32, REG_WO = 64, REG_NO_ACCESS = REG_RO | REG_WO, }; enum RegIO { RIO_DATA = 0, RIO_WF = REG_WF, RIO_FUNC = REG_WF | REG_RF, RIO_RO = REG_RO | REG_WF, RIO_RO_FUNC = REG_RO | REG_RF | REG_WF, RIO_WO_FUNC = REG_WF | REG_RF | REG_WO, RIO_NO_ACCESS = REG_WF | REG_RF | REG_NO_ACCESS }; struct RegisterStruct { union { u32 data32; // Register value RegReadAddrFP* readFunctionAddr; // Register read handler }; RegWriteAddrFP* writeFunctionAddr; // Register write handler u32 flags; // Access flags void reset() { if (!(flags & (REG_RO | REG_RF))) data32 = 0; } }; template T ReadMemArr(const u8 *array, u32 addr) { return *(const T *)&array[addr]; } template void WriteMemArr(u8 *array, u32 addr, T data) { *(T *)&array[addr] = data; }