snes9xgx/source/ngc/aram.cpp

82 lines
1.9 KiB
C++
Raw Normal View History

/****************************************************************************
* Snes9x 1.51 Nintendo Wii/Gamecube Port
*
* softdev July 2006
*
* aram.cpp
*
* Gamecube Audio RAM storage
***************************************************************************/
#include <gccore.h>
#include <string.h>
#include "aram.h"
#define ARAM_READ 1
#define ARAM_WRITE 0
#define TEMPSIZE 32768
static char tempbuffer[TEMPSIZE] ATTRIBUTE_ALIGN (32);
/****************************************************************************
* ARAMPut
*
* Move data from MAIN memory to ARAM
***************************************************************************/
void
ARAMPut (char *src, char *dst, int len)
{
DCFlushRange (src, len);
AR_StartDMA (ARAM_WRITE, (u32) src, (u32) dst, len);
while (AR_GetDMAStatus());
}
/****************************************************************************
* ARAMFetch
*
* This function will move data from ARAM to MAIN memory
***************************************************************************/
void
ARAMFetch (char *dst, char *src, int len)
{
DCInvalidateRange (dst, len);
AR_StartDMA (ARAM_READ, (u32) dst, (u32) src, len);
while (AR_GetDMAStatus ());
}
/****************************************************************************
* ARAMFetchSlow
*
* Required as SNES memory may NOT be 32-byte aligned
***************************************************************************/
void
ARAMFetchSlow (char *dst, char *src, int len)
{
int t;
if (len > TEMPSIZE)
{
t = 0;
while (t < len)
{
ARAMFetch (tempbuffer, src + t, TEMPSIZE);
if (t + TEMPSIZE > len)
{
memcpy (dst + t, tempbuffer, len - t);
}
else
memcpy (dst + t, tempbuffer, TEMPSIZE);
t += TEMPSIZE;
}
}
else
{
ARAMFetch (tempbuffer, src, len);
memcpy (dst, tempbuffer, len);
}
}