summaryrefslogtreecommitdiff
path: root/arm9/lib/src
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/lib/src')
-rw-r--r--arm9/lib/src/OS_reset.c63
-rw-r--r--arm9/lib/src/SND_alarm.c1
-rw-r--r--arm9/lib/src/SND_bank.c1
-rw-r--r--arm9/lib/src/SND_command.c46
-rw-r--r--arm9/lib/src/SND_interface.c12
-rw-r--r--arm9/lib/src/SND_main.c3
6 files changed, 98 insertions, 28 deletions
diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c
index 6389fe45..a5ef6987 100644
--- a/arm9/lib/src/OS_reset.c
+++ b/arm9/lib/src/OS_reset.c
@@ -121,4 +121,67 @@ _01FF8284:
blt _01FF8284
bx lr
}
+
+enum
+{
+ CARD_MASTER_SELECT_ROM = 0x0,
+ CARD_MASTER_ENABLE = 0x80,
+ CARD_CMD_READ_PAGE = 0xb7,
+ CARD_CTRL_CMD_MASK = 0x07000000,
+ CARD_CTRL_CMD_PAGE = 0x01000000,
+ CARD_CTRL_READ = 0x00000000,
+ CARD_CTRL_RESET_HI = 0x20000000,
+ CARD_CTRL_START = 0x80000000,
+ CARD_CTRL_READY = 0x00800000,
+ CARD_ENUM_END
+};
+
+void OSi_ReadCardRom32(u32 src, void *dst, s32 len) //should be static, can't mark as such
+{
+ vu32 *const hdr_GAME_BUF = (vu32 *)(HW_ROM_HEADER_BUF + 0x60);
+
+ const u32 ctrl_start = (u32)((*hdr_GAME_BUF &~CARD_CTRL_CMD_MASK)
+ | (CARD_CTRL_CMD_PAGE | CARD_CTRL_READ
+ | CARD_CTRL_START | CARD_CTRL_RESET_HI));
+
+ s32 pos = -(s32)(src & 511);
+
+ while (reg_CARD_CNT & CARD_CTRL_START) {}
+ reg_CARD_MASTERCNT = (u32)(CARD_MASTER_SELECT_ROM | CARD_MASTER_ENABLE);
+
+ for (src = (u32)(src + pos); pos < len; src += 512)
+ {
+ (&reg_CARD_CMD)[0] = (u8)(CARD_CMD_READ_PAGE);
+ (&reg_CARD_CMD)[1] = (u8)(src >> 24);
+ (&reg_CARD_CMD)[2] = (u8)(src >> 16);
+ (&reg_CARD_CMD)[3] = (u8)(src >> 8);
+ (&reg_CARD_CMD)[4] = (u8)(src >> 0);
+ (&reg_CARD_CMD)[5] = 0;
+ (&reg_CARD_CMD)[6] = 0;
+ (&reg_CARD_CMD)[7] = 0;
+
+ reg_CARD_CNT = ctrl_start;
+ for (;;)
+ {
+ u32 ctrl = reg_CARD_CNT;
+
+ if ((ctrl & CARD_CTRL_READY))
+ {
+ const u32 data = reg_CARD_DATA;
+
+ if ((pos >= 0) && (pos < len))
+ {
+ *(u32 *)((u32)dst + pos) = data;
+ }
+
+ pos += sizeof(u32);
+ }
+
+ if (!(ctrl & CARD_CTRL_START))
+ {
+ break;
+ }
+ }
+ }
+}
#pragma section ITCM end
diff --git a/arm9/lib/src/SND_alarm.c b/arm9/lib/src/SND_alarm.c
index b6178c8d..e216c02c 100644
--- a/arm9/lib/src/SND_alarm.c
+++ b/arm9/lib/src/SND_alarm.c
@@ -4,6 +4,7 @@ struct AlarmCallback {
SNDAlarmCallback cb;
void *data;
u8 id;
+ u8 padding[3];
};
static struct AlarmCallback sCallbackTable[SND_ALARM_COUNT];
diff --git a/arm9/lib/src/SND_bank.c b/arm9/lib/src/SND_bank.c
index bc339234..7f5bd94a 100644
--- a/arm9/lib/src/SND_bank.c
+++ b/arm9/lib/src/SND_bank.c
@@ -95,6 +95,7 @@ ARM_FUNC void SND_DestroyWaveArc(struct SNDWaveArc *waveArc) {
}
ARM_FUNC struct SNDInstPos SND_GetFirstInstDataPos(const struct SNDBankData *bankData) {
+#pragma unused (bankData)
struct SNDInstPos retval;
retval.program = 0;
retval.index = 0;
diff --git a/arm9/lib/src/SND_command.c b/arm9/lib/src/SND_command.c
index 4a867ce3..11622761 100644
--- a/arm9/lib/src/SND_command.c
+++ b/arm9/lib/src/SND_command.c
@@ -21,6 +21,7 @@ static struct SNDCommand *sFreeList;
extern s32 PXI_SendWordByFifo(u32, u32, u32);
extern void PXI_SetFifoRecvCallback(u32, void (*)(s32, s32));
extern BOOL PXI_IsCallbackReady(u32, u32);
+extern void DC_FlushRange(void*, u32);
static void InitPXI(void);
static void RequestCommandProc(void);
@@ -52,7 +53,7 @@ ARM_FUNC void SND_CommandInit(void) {
cmd->id = SND_CMD_SET_SHARED_WORK;
cmd->arg[0] = (u32)SNDi_SharedWork;
SND_PushCommand(cmd);
- SND_FlushCommand(SND_CMD_FLAG_BLOCK);
+ (void)SND_FlushCommand(SND_CMD_FLAG_BLOCK);
}
ARM_FUNC const struct SNDCommand *SND_RecvCommandReply(u32 flags) {
@@ -61,7 +62,7 @@ ARM_FUNC const struct SNDCommand *SND_RecvCommandReply(u32 flags) {
if (flags & SND_CMD_FLAG_BLOCK) {
u32 tag = SNDi_GetFinishedCommandTag();
while (sFinishedTag == tag) {
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
OS_SpinWait(100);
oldirq = OS_DisableInterrupts();
tag = SNDi_GetFinishedCommandTag();
@@ -69,7 +70,7 @@ ARM_FUNC const struct SNDCommand *SND_RecvCommandReply(u32 flags) {
} else {
u32 tag = SNDi_GetFinishedCommandTag();
if (sFinishedTag == tag) {
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
return NULL;
}
}
@@ -93,7 +94,7 @@ ARM_FUNC const struct SNDCommand *SND_RecvCommandReply(u32 flags) {
sWaitingCommandListCount--;
sFinishedTag++;
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
return queueRead;
}
@@ -116,13 +117,13 @@ ARM_FUNC struct SNDCommand *SND_AllocCommand(u32 flags) {
if (cmd != NULL)
return cmd;
} else {
- SND_FlushCommand(SND_CMD_FLAG_BLOCK);
+ (void)SND_FlushCommand(SND_CMD_FLAG_BLOCK);
}
RequestCommandProc();
do {
- SND_RecvCommandReply(SND_CMD_FLAG_BLOCK);
+ (void)SND_RecvCommandReply(SND_CMD_FLAG_BLOCK);
cmd = AllocCommand();
} while (cmd == NULL);
return cmd;
@@ -142,25 +143,25 @@ ARM_FUNC void SND_PushCommand(struct SNDCommand *cmd) {
cmd->llNext = NULL;
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
}
ARM_FUNC BOOL SND_FlushCommand(u32 flags) {
OSIntrMode oldirq = OS_DisableInterrupts();
if (sReserveList == NULL) {
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
return TRUE;
}
if (sWaitingCommandListCount >= SND_CMD_WAIT_QUEUE_COUNT) {
if ((flags & SND_CMD_FLAG_BLOCK) == 0) {
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
return FALSE;
}
do {
- SND_RecvCommandReply(SND_CMD_FLAG_BLOCK);
+ (void)SND_RecvCommandReply(SND_CMD_FLAG_BLOCK);
} while (sWaitingCommandListCount >= SND_CMD_WAIT_QUEUE_COUNT);
}
@@ -169,13 +170,13 @@ ARM_FUNC BOOL SND_FlushCommand(u32 flags) {
s32 result = PXI_SendWordByFifo(7, (u32)sReserveList, 0);
if (result < 0) {
if ((flags & SND_CMD_FLAG_BLOCK) == 0) {
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
return FALSE;
}
result = PXI_SendWordByFifo(7, (u32)sReserveList, 0);
while (result < 0) {
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
OS_SpinWait(100);
oldirq = OS_DisableInterrupts();
result = PXI_SendWordByFifo(7, (u32)sReserveList, 0);
@@ -197,7 +198,7 @@ ARM_FUNC BOOL SND_FlushCommand(u32 flags) {
sWaitingCommandListCount++;
sCurrentTag++;
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
return TRUE;
}
@@ -216,7 +217,7 @@ ARM_FUNC void SND_WaitForCommandProc(u32 tag) {
return;
do {
- SND_RecvCommandReply(SND_CMD_FLAG_BLOCK);
+ (void)SND_RecvCommandReply(SND_CMD_FLAG_BLOCK);
} while (SND_IsFinishedCommandTag(tag) == 0);
}
@@ -229,7 +230,7 @@ ARM_FUNC u32 SND_GetCurrentCommandTag(void) {
else
retval = sCurrentTag;
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
return retval;
}
@@ -249,7 +250,7 @@ ARM_FUNC BOOL SND_IsFinishedCommandTag(u32 tag) {
result = FALSE;
}
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
return result;
}
@@ -260,7 +261,7 @@ ARM_FUNC s32 SND_CountFreeCommand(void) {
for (struct SNDCommand *cmd = sFreeList; cmd != NULL; cmd = cmd->llNext)
count++;
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
return count;
}
@@ -271,7 +272,7 @@ ARM_FUNC s32 SND_CountReservedCommand(void) {
for (struct SNDCommand *cmd = sReserveList; cmd != NULL; cmd = cmd->llNext)
count++;
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
return count;
}
@@ -280,9 +281,10 @@ ARM_FUNC s32 SND_CountWaitingCommand(void) {
}
ARM_FUNC static void PxiFifoCallback(s32 a, s32 b) {
+#pragma unused (a)
OSIntrMode oldirq = OS_DisableInterrupts();
SNDi_CallAlarmHandler(b);
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
}
ARM_FUNC static void InitPXI(void) {
@@ -306,7 +308,7 @@ ARM_FUNC static void RequestCommandProc(void) {
ARM_FUNC static struct SNDCommand *AllocCommand(void) {
OSIntrMode oldirq = OS_DisableInterrupts();
if (sFreeList == NULL) {
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
return NULL;
}
@@ -315,7 +317,7 @@ ARM_FUNC static struct SNDCommand *AllocCommand(void) {
sFreeList = sFreeList->llNext;
if (sFreeList == NULL)
sFreeListEnd = NULL;
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
return retval;
}
@@ -328,6 +330,6 @@ ARM_FUNC static BOOL IsCommandAvailable(void) {
// is this some kind of debug or ensata register?
*(vu32 *)0x4FFF200 = 0x10;
u32 resp = *(vu32 *)0x4FFF200;
- OS_RestoreInterrupts(oldirq);
+ (void)OS_RestoreInterrupts(oldirq);
return resp != 0;
}
diff --git a/arm9/lib/src/SND_interface.c b/arm9/lib/src/SND_interface.c
index e8369477..42b5ff42 100644
--- a/arm9/lib/src/SND_interface.c
+++ b/arm9/lib/src/SND_interface.c
@@ -30,11 +30,11 @@ ARM_FUNC void SND_PauseSeq(s32 player, BOOL flag) {
// ARM_FUNC void SND_SetPlayerTempoRatio(s32 player, s32 ratio) { }
ARM_FUNC void SND_SetPlayerVolume(s32 player, s32 volume) {
- SNDi_SetPlayerParam(player, 6, volume, 2);
+ SNDi_SetPlayerParam(player, 6, (u32)volume, 2);
}
ARM_FUNC void SND_SetPlayerChannelPriority(s32 player, s32 prio) {
- SNDi_SetPlayerParam(player, 4, prio, 1);
+ SNDi_SetPlayerParam(player, 4, (u32)prio, 1);
}
// ARM_FUNC void SND_SetPlayerLocalVariable(s32 player, s32 varNo, s16 var) { }
@@ -44,11 +44,11 @@ ARM_FUNC void SND_SetPlayerChannelPriority(s32 player, s32 prio) {
// ARM_FUNC void SND_SetTrackVolume(s32 player, u32 trackBitMask, s32 volume) { }
ARM_FUNC void SND_SetTrackPitch(s32 player, u32 trackBitMask, s32 pitch) {
- SNDi_SetTrackParam(player, trackBitMask, 12, pitch, 2);
+ SNDi_SetTrackParam(player, trackBitMask, 12, (u32)pitch, 2);
}
ARM_FUNC void SND_SetTrackPan(s32 player, u32 trackBitMask, s32 pan) {
- SNDi_SetTrackParam(player, trackBitMask, 9, pan, 1);
+ SNDi_SetTrackParam(player, trackBitMask, 9, (u32)pan, 1);
}
ARM_FUNC void SND_SetTrackAllocatableChannel(s32 player, u32 trackBitMask, u32 chnBitMask) {
@@ -65,7 +65,7 @@ ARM_FUNC void SND_StopTimer(u32 chnBitMask, u32 capBitMask, u32 alarmBitMask, u3
while (i < SND_ALARM_COUNT && tmpMask != 0) {
if (tmpMask & 1)
- SNDi_IncAlarmId(i);
+ SNDi_IncAlarmId((u32)i);
i++;
tmpMask >>= 1;
}
@@ -79,7 +79,7 @@ ARM_FUNC void SND_SetupCapture(s32 capture, s32 format, void *bufferPtr, u32 len
}
ARM_FUNC void SND_SetupAlarm(s32 alarm, u32 tick, u32 period, SNDAlarmCallback cb, void *userData) {
- PushCmd4(SND_CMD_SETUP_ALARM, alarm, tick, period, SNDi_SetAlarmHandler(alarm, cb, userData));
+ PushCmd4(SND_CMD_SETUP_ALARM, alarm, tick, period, SNDi_SetAlarmHandler((u32)alarm, cb, userData));
}
// ARM_FUNC void SND_SetTrackMute(s32 player, u32 trackBitMask, BOOL flag) { }
diff --git a/arm9/lib/src/SND_main.c b/arm9/lib/src/SND_main.c
index f533b87c..34b839b1 100644
--- a/arm9/lib/src/SND_main.c
+++ b/arm9/lib/src/SND_main.c
@@ -1,4 +1,6 @@
#include "SND_main.h"
+#include "SND_command.h"
+#include "SND_alarm.h"
#include "global.h"
#include "OS_mutex.h"
@@ -7,6 +9,7 @@ static struct OSMutex sSndMutex;
static s32 sSndInitialized;
// TODO remove these declarations once we have the functions in the headers
+void OS_InitMutex(struct OSMutex *);
void OS_UnlockMutex(struct OSMutex *);
void OS_LockMutex(struct OSMutex *);