replace Array with std::array

This commit is contained in:
Flyinghead 2020-01-25 11:00:34 +01:00
parent 12193f9510
commit 0d9214df40
7 changed files with 128 additions and 255 deletions

View File

@ -16,7 +16,7 @@
extern void dc_request_reset();
Array<RegisterStruct> sb_regs(0x540);
std::array<RegisterStruct, 0x540> sb_regs;
//(addr>= 0x005F6800) && (addr<=0x005F7CFF) -> 0x1500 bytes -> 0x540 possible registers , 125 actually exist only
// System Control Reg. //0x100 bytes
@ -127,9 +127,9 @@ void sb_rio_register(u32 reg_addr, RegIO flags, RegReadAddrFP* rf, RegWriteAddrF
{
u32 idx=(reg_addr-SB_BASE)/4;
verify(idx<sb_regs.Size);
verify(idx < sb_regs.size());
sb_regs[idx].flags = flags | REG_ACCESS_32;
sb_regs[idx].flags = flags;
if (flags == RIO_NO_ACCESS)
{
@ -180,12 +180,8 @@ void SB_SFRES_write32(u32 addr, u32 data)
}
void sb_Init()
{
sb_regs.Zero();
for (u32 i=0;i<sb_regs.Size;i++)
{
sb_rio_register(SB_BASE+i*4,RIO_NO_ACCESS);
}
for (u32 i = 0; i < sb_regs.size(); i++)
sb_rio_register(SB_BASE + i * 4, RIO_NO_ACCESS);
//0x005F6800 SB_C2DSTAT RW ch2-DMA destination address
sb_rio_register(SB_C2DSTAT_addr,RIO_DATA);
@ -612,8 +608,8 @@ void sb_Reset(bool hard)
{
if (hard)
{
for (u32 i = 0; i < sb_regs.Size; i++)
sb_regs[i].reset();
for (auto& reg : sb_regs)
reg.reset();
}
SB_ISTNRM = 0;
SB_FFST_rc = 0;

View File

@ -3,6 +3,7 @@
*/
#pragma once
#include <array>
#include "types.h"
@ -13,7 +14,7 @@ void sb_Init();
void sb_Reset(bool hard);
void sb_Term();
extern Array<RegisterStruct> sb_regs;
extern std::array<RegisterStruct, 0x540> sb_regs;
#define SB_BASE 0x005F6800
@ -314,7 +315,7 @@ extern Array<RegisterStruct> sb_regs;
//0x005F7CF8 SB_PDLEND R PVR-DMA transfer counter
#define SB_PDLEND_addr 0x005F7CF8
#define SB_REGN_32(addr) (sb_regs[(addr-SB_BASE)/4].data32)
#define SB_REGN_32(addr) (sb_regs[((addr) - SB_BASE) / 4].data32)
#define SB_REG_32(name) SB_REGN_32(SB_##name##_addr)
#define SB_REG_T(name) ((SB_name##_t&)SB_REG_T(name))

View File

@ -1,6 +1,7 @@
/*
Sh4 internal register routing (P4 & 'area 7')
*/
#include <array>
#include "types.h"
#include "sh4_mmr.h"
@ -11,45 +12,44 @@
//64bytes of sq // now on context ~
Array<u8> OnChipRAM;
std::array<u8, OnChipRAM_SIZE> OnChipRAM;
//All registers are 4 byte aligned
Array<RegisterStruct> CCN(18,true); //CCN : 16 registers
Array<RegisterStruct> UBC(9,true); //UBC : 9 registers
Array<RegisterStruct> BSC(19,true); //BSC : 18 registers
Array<RegisterStruct> DMAC(17,true); //DMAC : 17 registers
Array<RegisterStruct> CPG(5,true); //CPG : 5 registers
Array<RegisterStruct> RTC(16,true); //RTC : 16 registers
Array<RegisterStruct> INTC(5,true); //INTC : 5 registers
Array<RegisterStruct> TMU(12,true); //TMU : 12 registers
Array<RegisterStruct> SCI(8,true); //SCI : 8 registers
Array<RegisterStruct> SCIF(10,true); //SCIF : 10 registers
std::array<RegisterStruct, 18> CCN;
std::array<RegisterStruct, 9> UBC;
std::array<RegisterStruct, 19> BSC;
std::array<RegisterStruct, 17> DMAC;
std::array<RegisterStruct, 5> CPG;
std::array<RegisterStruct, 16> RTC;
std::array<RegisterStruct, 5> INTC;
std::array<RegisterStruct, 12> TMU;
std::array<RegisterStruct, 8> SCI;
std::array<RegisterStruct, 10> SCIF;
Array<RegisterStruct> * const AllRegisters[] = { &CCN, &UBC, &BSC, &DMAC, &CPG, &RTC, &INTC, &TMU, &SCI, &SCIF };
u32 sh4io_read_noacc(u32 addr)
static u32 sh4io_read_noacc(u32 addr)
{
INFO_LOG(SH4, "sh4io: Invalid read access @@ %08X", addr);
return 0;
}
void sh4io_write_noacc(u32 addr, u32 data)
static void sh4io_write_noacc(u32 addr, u32 data)
{
INFO_LOG(SH4, "sh4io: Invalid write access @@ %08X %08X", addr, data);
//verify(false);
}
void sh4io_write_const(u32 addr, u32 data)
static void sh4io_write_const(u32 addr, u32 data)
{
INFO_LOG(SH4, "sh4io: Const write ignored @@ %08X <- %08X", addr, data);
}
void sh4_rio_reg(Array<RegisterStruct>& arr, u32 addr, RegIO flags, u32 sz, RegReadAddrFP* rf, RegWriteAddrFP* wf)
template<class T>
void sh4_rio_reg(T& arr, u32 addr, RegIO flags, u32 sz, RegReadAddrFP* rf, RegWriteAddrFP* wf)
{
u32 idx=(addr&255)/4;
verify(idx<arr.Size);
verify(idx < arr.size());
arr[idx].flags = flags | REG_ACCESS_32;
arr[idx].flags = flags;
if (flags == RIO_NO_ACCESS)
{
@ -71,9 +71,18 @@ void sh4_rio_reg(Array<RegisterStruct>& arr, u32 addr, RegIO flags, u32 sz, RegR
arr[idx].writeFunctionAddr=wf==0?&sh4io_write_noacc:wf;
}
}
template void sh4_rio_reg(std::array<RegisterStruct, 5>& arr, u32 addr, RegIO flags, u32 sz, RegReadAddrFP* rf, RegWriteAddrFP* wf);
template void sh4_rio_reg(std::array<RegisterStruct, 8>& arr, u32 addr, RegIO flags, u32 sz, RegReadAddrFP* rf, RegWriteAddrFP* wf);
template void sh4_rio_reg(std::array<RegisterStruct, 9>& arr, u32 addr, RegIO flags, u32 sz, RegReadAddrFP* rf, RegWriteAddrFP* wf);
template void sh4_rio_reg(std::array<RegisterStruct, 10>& arr, u32 addr, RegIO flags, u32 sz, RegReadAddrFP* rf, RegWriteAddrFP* wf);
template void sh4_rio_reg(std::array<RegisterStruct, 12>& arr, u32 addr, RegIO flags, u32 sz, RegReadAddrFP* rf, RegWriteAddrFP* wf);
template void sh4_rio_reg(std::array<RegisterStruct, 16>& arr, u32 addr, RegIO flags, u32 sz, RegReadAddrFP* rf, RegWriteAddrFP* wf);
template void sh4_rio_reg(std::array<RegisterStruct, 17>& arr, u32 addr, RegIO flags, u32 sz, RegReadAddrFP* rf, RegWriteAddrFP* wf);
template void sh4_rio_reg(std::array<RegisterStruct, 18>& arr, u32 addr, RegIO flags, u32 sz, RegReadAddrFP* rf, RegWriteAddrFP* wf);
template void sh4_rio_reg(std::array<RegisterStruct, 19>& arr, u32 addr, RegIO flags, u32 sz, RegReadAddrFP* rf, RegWriteAddrFP* wf);
template<u32 sz>
u32 sh4_rio_read(Array<RegisterStruct>& sb_regs, u32 addr)
template<u32 sz, class T>
u32 sh4_rio_read(T& regs, u32 addr)
{
u32 offset = addr&255;
#ifdef TRACE
@ -86,21 +95,21 @@ u32 sh4_rio_read(Array<RegisterStruct>& sb_regs, u32 addr)
offset>>=2;
#ifdef TRACE
if (sb_regs[offset].flags & sz)
if (regs[offset].flags & sz)
{
#endif
if (!(sb_regs[offset].flags & REG_RF) )
if (!(regs[offset].flags & REG_RF) )
{
if (sz==4)
return sb_regs[offset].data32;
return regs[offset].data32;
else if (sz==2)
return sb_regs[offset].data16;
return regs[offset].data16;
else
return sb_regs[offset].data8;
return regs[offset].data8;
}
else
{
return sb_regs[offset].readFunctionAddr(addr);
return regs[offset].readFunctionAddr(addr);
}
#ifdef TRACE
}
@ -112,8 +121,8 @@ u32 sh4_rio_read(Array<RegisterStruct>& sb_regs, u32 addr)
return 0;
}
template<u32 sz>
void sh4_rio_write(Array<RegisterStruct>& sb_regs, u32 addr, u32 data)
template<u32 sz, class T>
void sh4_rio_write(T& regs, u32 addr, u32 data)
{
u32 offset = addr&255;
#ifdef TRACE
@ -124,23 +133,23 @@ void sh4_rio_write(Array<RegisterStruct>& sb_regs, u32 addr, u32 data)
#endif
offset>>=2;
#ifdef TRACE
if (sb_regs[offset].flags & sz)
if (regs[offset].flags & sz)
{
#endif
if (!(sb_regs[offset].flags & REG_WF) )
if (!(regs[offset].flags & REG_WF) )
{
if (sz==4)
sb_regs[offset].data32=data;
regs[offset].data32=data;
else if (sz==2)
sb_regs[offset].data16=(u16)data;
regs[offset].data16=(u16)data;
else
sb_regs[offset].data8=(u8)data;
regs[offset].data8=(u8)data;
return;
}
else
{
//printf("RSW: %08X\n",addr);
sb_regs[offset].writeFunctionAddr(addr,data);
regs[offset].writeFunctionAddr(addr,data);
return;
}
#ifdef TRACE
@ -794,25 +803,30 @@ void DYNACALL WriteMem_area7_OCR_T(u32 addr,T data)
}
}
template <class T>
static void init_regs(T& regs)
{
for (auto& reg : regs)
{
reg.flags = RIO_NO_ACCESS;
reg.readFunctionAddr = &sh4io_read_noacc;
reg.writeFunctionAddr = &sh4io_write_noacc;
}
}
//Init/Res/Term
void sh4_mmr_init()
{
OnChipRAM.Resize(OnChipRAM_SIZE,false);
for (u32 i=0;i<30;i++)
{
if (i<CCN.Size) sh4_rio_reg(CCN,CCN_BASE_addr+i*4,RIO_NO_ACCESS,32); //(16,true); //CCN : 14 registers
if (i<UBC.Size) sh4_rio_reg(UBC,UBC_BASE_addr+i*4,RIO_NO_ACCESS,32); //(9,true); //UBC : 9 registers
if (i<BSC.Size) sh4_rio_reg(BSC,BSC_BASE_addr+i*4,RIO_NO_ACCESS,32); //(19,true); //BSC : 18 registers
if (i<DMAC.Size) sh4_rio_reg(DMAC,DMAC_BASE_addr+i*4,RIO_NO_ACCESS,32); //(17,true); //DMAC : 17 registers
if (i<CPG.Size) sh4_rio_reg(CPG,CPG_BASE_addr+i*4,RIO_NO_ACCESS,32); //(5,true); //CPG : 5 registers
if (i<RTC.Size) sh4_rio_reg(RTC,RTC_BASE_addr+i*4,RIO_NO_ACCESS,32); //(16,true); //RTC : 16 registers
if (i<INTC.Size) sh4_rio_reg(INTC,INTC_BASE_addr+i*4,RIO_NO_ACCESS,32); //(4,true); //INTC : 4 registers
if (i<TMU.Size) sh4_rio_reg(TMU,TMU_BASE_addr+i*4,RIO_NO_ACCESS,32); //(12,true); //TMU : 12 registers
if (i<SCI.Size) sh4_rio_reg(SCI,SCI_BASE_addr+i*4,RIO_NO_ACCESS,32); //(8,true); //SCI : 8 registers
if (i<SCIF.Size) sh4_rio_reg(SCIF,SCIF_BASE_addr+i*4,RIO_NO_ACCESS,32); //(10,true); //SCIF : 10 registers
}
init_regs(CCN);
init_regs(UBC);
init_regs(BSC);
init_regs(DMAC);
init_regs(CPG);
init_regs(RTC);
init_regs(INTC);
init_regs(TMU);
init_regs(SCI);
init_regs(SCIF);
//initialise Register structs
bsc_init();
@ -830,11 +844,28 @@ void sh4_mmr_reset(bool hard)
{
if (hard)
{
for (int i = 0; i < ARRAY_SIZE(AllRegisters); i++)
for (int j = 0; j < AllRegisters[i]->Size; j++)
(*AllRegisters[i])[j].reset();
for (auto& reg : CCN)
reg.reset();
for (auto& reg : UBC)
reg.reset();
for (auto& reg : BSC)
reg.reset();
for (auto& reg : DMAC)
reg.reset();
for (auto& reg : CPG)
reg.reset();
for (auto& reg : RTC)
reg.reset();
for (auto& reg : INTC)
reg.reset();
for (auto& reg : TMU)
reg.reset();
for (auto& reg : SCI)
reg.reset();
for (auto& reg : SCIF)
reg.reset();
}
OnChipRAM.Zero();
OnChipRAM = {};
//Reset register values
bsc_reset(hard);
ccn_reset();
@ -859,7 +890,6 @@ void sh4_mmr_term()
cpg_term();
ccn_term();
bsc_term();
OnChipRAM.Free();
}
//Mem map :)

View File

@ -1,4 +1,5 @@
#pragma once
#include <array>
#include "types.h"
#include "../sh4/sh4_if.h"
@ -12,16 +13,16 @@ void map_p4();
#define sq_both ((u8*)sh4rcb.sq_buffer)
extern Array<RegisterStruct> CCN; //CCN : 14 registers
extern Array<RegisterStruct> UBC; //UBC : 9 registers
extern Array<RegisterStruct> BSC; //BSC : 18 registers
extern Array<RegisterStruct> DMAC; //DMAC : 17 registers
extern Array<RegisterStruct> CPG; //CPG : 5 registers
extern Array<RegisterStruct> RTC; //RTC : 16 registers
extern Array<RegisterStruct> INTC; //INTC : 4 registers
extern Array<RegisterStruct> TMU; //TMU : 12 registers
extern Array<RegisterStruct> SCI; //SCI : 8 registers
extern Array<RegisterStruct> SCIF; //SCIF : 10 registers
extern std::array<RegisterStruct, 18> CCN;
extern std::array<RegisterStruct, 9> UBC;
extern std::array<RegisterStruct, 19> BSC;
extern std::array<RegisterStruct, 17> DMAC;
extern std::array<RegisterStruct, 5> CPG;
extern std::array<RegisterStruct, 16> RTC;
extern std::array<RegisterStruct, 5> INTC;
extern std::array<RegisterStruct, 12> TMU;
extern std::array<RegisterStruct, 8> SCI;
extern std::array<RegisterStruct, 10> SCIF;
/*
//Region P4
@ -38,7 +39,8 @@ void sh4_mmr_init();
void sh4_mmr_reset(bool hard);
void sh4_mmr_term();
void sh4_rio_reg(Array<RegisterStruct>& arr, u32 addr, RegIO flags, u32 sz, RegReadAddrFP* rp=0, RegWriteAddrFP* wp=0);
template<typename T>
void sh4_rio_reg(T& arr, u32 addr, RegIO flags, u32 sz, RegReadAddrFP* rp=0, RegWriteAddrFP* wp=0);
#define A7_REG_HASH(addr) ((addr>>16)&0x1FFF)

View File

@ -5,6 +5,7 @@
#include "hw/aica/aica.h"
#include "hw/aica/sgc_if.h"
#include "hw/arm7/arm7.h"
#include "hw/holly/sb.h"
#include "hw/holly/sb_mem.h"
#include "hw/flashrom/flashrom.h"
#include "hw/mem/_vmem.h"
@ -69,7 +70,6 @@ extern s16 cdda_sector[CDDA_SIZE];
extern u32 cdda_index;
//./core/hw/holly/sb.o
extern Array<RegisterStruct> sb_regs;
extern u32 SB_ISTNRM;
extern u32 SB_FFST_rc;
extern u32 SB_FFST;
@ -151,17 +151,7 @@ extern bool pal_needs_update;
extern VArray2 vram;
//./core/hw/sh4/sh4_mmr.o
extern Array<u8> OnChipRAM;
extern Array<RegisterStruct> CCN; //CCN : 14 registers
extern Array<RegisterStruct> UBC; //UBC : 9 registers
extern Array<RegisterStruct> BSC; //BSC : 18 registers
extern Array<RegisterStruct> DMAC; //DMAC : 17 registers
extern Array<RegisterStruct> CPG; //CPG : 5 registers
extern Array<RegisterStruct> RTC; //RTC : 16 registers
extern Array<RegisterStruct> INTC; //INTC : 4 registers
extern Array<RegisterStruct> TMU; //TMU : 12 registers
extern Array<RegisterStruct> SCI; //SCI : 8 registers
extern Array<RegisterStruct> SCIF; //SCIF : 10 registers
extern std::array<u8, OnChipRAM_SIZE> OnChipRAM;
//./core/hw/sh4/sh4_mem.o
extern VArray2 mem_b;
@ -241,7 +231,7 @@ extern u32 reg_dimm_parameterl;
extern u32 reg_dimm_parameterh;
extern u32 reg_dimm_status;
bool rc_serialize(void *src, unsigned int src_size, void **dest, unsigned int *total_size)
bool rc_serialize(const void *src, unsigned int src_size, void **dest, unsigned int *total_size)
{
if ( *dest != NULL )
{
@ -265,33 +255,30 @@ bool rc_unserialize(void *src, unsigned int src_size, void **dest, unsigned int
return true ;
}
bool register_serialize(Array<RegisterStruct>& regs,void **data, unsigned int *total_size )
template<typename T>
bool register_serialize(const T& regs,void **data, unsigned int *total_size )
{
int i = 0 ;
for (const auto& reg : regs)
REICAST_S(reg.data32);
for ( i = 0 ; i < regs.Size ; i++ )
{
REICAST_S(regs.data[i].data32) ;
}
return true ;
return true;
}
bool register_unserialize(Array<RegisterStruct>& regs,void **data, unsigned int *total_size, serialize_version_enum version)
template<typename T>
bool register_unserialize(T& regs,void **data, unsigned int *total_size, serialize_version_enum version)
{
int i = 0 ;
u32 dummy = 0 ;
u32 dummy = 0;
for ( i = 0 ; i < regs.Size ; i++ )
for (auto& reg : regs)
{
if (version < V5)
REICAST_US(dummy); // regs.data[i].flags
if ( ! (regs.data[i].flags & REG_RF) )
REICAST_US(regs.data[i].data32) ;
if (!(reg.flags & REG_RF))
REICAST_US(reg.data32);
else
REICAST_US(dummy) ;
REICAST_US(dummy);
}
return true ;
return true;
}
bool dc_serialize(void **data, unsigned int *total_size)
@ -403,7 +390,7 @@ bool dc_serialize(void **data, unsigned int *total_size)
REICAST_SA(vram.data, vram.size);
REICAST_SA(OnChipRAM.data,OnChipRAM_SIZE);
REICAST_SA(OnChipRAM.data(), OnChipRAM_SIZE);
register_serialize(CCN, data, total_size) ;
register_serialize(UBC, data, total_size) ;
@ -664,7 +651,7 @@ static bool dc_unserialize_libretro(void **data, unsigned int *total_size)
REICAST_USA(vram.data, vram.size);
REICAST_USA(OnChipRAM.data,OnChipRAM_SIZE);
REICAST_USA(OnChipRAM.data(), OnChipRAM_SIZE);
register_unserialize(CCN, data, total_size, V9_LIBRETRO) ;
register_unserialize(UBC, data, total_size, V9_LIBRETRO) ;
@ -987,7 +974,7 @@ bool dc_unserialize(void **data, unsigned int *total_size)
REICAST_USA(vram.data, vram.size);
pal_needs_update = true;
REICAST_USA(OnChipRAM.data,OnChipRAM_SIZE);
REICAST_USA(OnChipRAM.data(), OnChipRAM_SIZE);
register_unserialize(CCN, data, total_size, version) ;
register_unserialize(UBC, data, total_size, version) ;

View File

@ -20,147 +20,6 @@
#define PAGE_MASK (PAGE_SIZE-1)
#endif
//Commonly used classes across the project
//Simple Array class for helping me out ;P
template<class T>
class Array
{
public:
T* data;
u32 Size;
Array(T* Source,u32 ellements)
{
//initialise array
data=Source;
Size=ellements;
}
Array(u32 ellements)
{
//initialise array
data=0;
Resize(ellements,false);
Size=ellements;
}
Array(u32 ellements,bool zero)
{
//initialise array
data=0;
Resize(ellements,zero);
Size=ellements;
}
Array()
{
//initialise array
data=0;
Size=0;
}
~Array()
{
if (data)
{
#ifdef MEM_ALLOC_TRACE
DEBUG_LOG(COMMON, "WARNING : DESTRUCTOR WITH NON FREED ARRAY [arrayid:%d]", id);
#endif
Free();
}
}
void SetPtr(T* Source,u32 ellements)
{
//initialise array
Free();
data=Source;
Size=ellements;
}
T* Resize(u32 size,bool bZero)
{
if (size==0)
{
if (data)
{
#ifdef MEM_ALLOC_TRACE
DEBUG_LOG(COMMON, "Freeing data -> resize to zero[Array:%d]", id);
#endif
Free();
}
}
if (!data)
data=(T*)malloc(size*sizeof(T));
else
data=(T*)realloc(data,size*sizeof(T));
//TODO : Optimise this
//if we allocated more , Zero it out
if (bZero)
{
if (size>Size)
{
for (u32 i=Size;i<size;i++)
{
u8*p =(u8*)&data[i];
for (size_t j=0;j<sizeof(T);j++)
{
p[j]=0;
}
}
}
}
Size=size;
return data;
}
void Zero()
{
memset(data,0,sizeof(T)*Size);
}
void Free()
{
if (Size != 0)
{
if (data)
free(data);
data = NULL;
}
}
INLINE T& operator [](const u32 i)
{
#ifdef MEM_BOUND_CHECK
if (i>=Size)
{
ERROR_LOG(COMMON, "Error: Array %d , index out of range (%d > %d)", id, i, Size - 1);
MEM_DO_BREAK;
}
#endif
return data[i];
}
INLINE T& operator [](const s32 i)
{
#ifdef MEM_BOUND_CHECK
if (!(i>=0 && i<(s32)Size))
{
ERROR_LOG(COMMON, "Error: Array %d , index out of range (%d > %d)", id, i, Size - 1);
MEM_DO_BREAK;
}
#endif
return data[i];
}
};
//Windoze code
//Threads
#if !defined(HOST_NO_THREADS)

View File

@ -302,7 +302,7 @@ using namespace std;
void os_DebugBreak();
#define dbgbreak os_DebugBreak()
bool rc_serialize(void *src, unsigned int src_size, void **dest, unsigned int *total_size) ;
bool rc_serialize(const void *src, unsigned int src_size, void **dest, unsigned int *total_size) ;
bool rc_unserialize(void *src, unsigned int src_size, void **dest, unsigned int *total_size);
bool dc_serialize(void **data, unsigned int *total_size);
bool dc_unserialize(void **data, unsigned int *total_size);
@ -341,8 +341,6 @@ typedef void RegWriteAddrFP(u32 addr, u32 data);
*/
enum RegStructFlags
{
REG_ACCESS_32=4,
REG_RF=8,
REG_WF=16,
REG_RO=32,