mirror of
https://github.com/dborth/snes9xgx.git
synced 2024-12-27 11:41:49 +01:00
82 lines
1.9 KiB
C++
82 lines
1.9 KiB
C++
/****************************************************************************
|
|
* 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);
|
|
}
|
|
}
|