mirror of
https://github.com/dborth/snes9xgx.git
synced 2024-11-28 05:24:21 +01:00
78 lines
1.4 KiB
C++
78 lines
1.4 KiB
C++
|
/****************************************************************************
|
||
|
* Snes9x 1.50
|
||
|
*
|
||
|
* Nintendo Gamecube Audio RAM
|
||
|
*
|
||
|
* softdev July 2006
|
||
|
****************************************************************************/
|
||
|
#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);
|
||
|
}
|
||
|
}
|