2008-08-06 03:09:59 +02:00
|
|
|
/****************************************************************************
|
2008-10-16 03:49:58 +02:00
|
|
|
* Snes9x 1.50
|
2008-08-06 03:09:59 +02:00
|
|
|
*
|
2008-10-16 03:49:58 +02:00
|
|
|
* Nintendo Gamecube Audio RAM
|
2008-09-12 07:28:40 +02:00
|
|
|
*
|
2008-10-16 03:49:58 +02:00
|
|
|
* softdev July 2006
|
|
|
|
****************************************************************************/
|
2008-08-06 03:09:59 +02:00
|
|
|
#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);
|
|
|
|
|
2008-10-16 03:49:58 +02:00
|
|
|
/**
|
2008-08-06 03:09:59 +02:00
|
|
|
* ARAMPut
|
|
|
|
*
|
|
|
|
* Move data from MAIN memory to ARAM
|
2008-10-16 03:49:58 +02:00
|
|
|
*/
|
2008-08-06 03:09:59 +02:00
|
|
|
void
|
|
|
|
ARAMPut (char *src, char *dst, int len)
|
|
|
|
{
|
|
|
|
DCFlushRange (src, len);
|
|
|
|
AR_StartDMA (ARAM_WRITE, (u32) src, (u32) dst, len);
|
|
|
|
while (AR_GetDMAStatus());
|
|
|
|
}
|
|
|
|
|
2008-10-16 03:49:58 +02:00
|
|
|
/**
|
2008-08-06 03:09:59 +02:00
|
|
|
* ARAMFetch
|
|
|
|
*
|
|
|
|
* This function will move data from ARAM to MAIN memory
|
2008-10-16 03:49:58 +02:00
|
|
|
*/
|
2008-08-06 03:09:59 +02:00
|
|
|
void
|
|
|
|
ARAMFetch (char *dst, char *src, int len)
|
|
|
|
{
|
|
|
|
DCInvalidateRange (dst, len);
|
|
|
|
AR_StartDMA (ARAM_READ, (u32) dst, (u32) src, len);
|
|
|
|
while (AR_GetDMAStatus ());
|
|
|
|
}
|
|
|
|
|
2008-10-16 03:49:58 +02:00
|
|
|
/**
|
2008-08-06 03:09:59 +02:00
|
|
|
* ARAMFetchSlow
|
|
|
|
*
|
|
|
|
* Required as SNES memory may NOT be 32-byte aligned
|
2008-10-16 03:49:58 +02:00
|
|
|
*/
|
2008-08-06 03:09:59 +02:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|