diff options
| author | PikalaxALT <pikalaxalt@gmail.com> | 2020-05-30 15:11:22 -0400 | 
|---|---|---|
| committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-05-30 15:11:22 -0400 | 
| commit | a4e406b821808db73574193e0bfdffd6ee756687 (patch) | |
| tree | dd3bff339f85de031af3c977f9d7f72c9164e5db /arm9/lib | |
| parent | 1d92bac012170fda7ec543433eb9572f75f9b710 (diff) | |
| parent | b45ab57b275ffbd0a46852c62f824e6cff73e116 (diff) | |
Merge branch 'master' of https://github.com/martmists/pokediamond into pikalax_work
Diffstat (limited to 'arm9/lib')
| -rw-r--r-- | arm9/lib/include/OS_reset.h | 1 | ||||
| -rw-r--r-- | arm9/lib/include/SND_main.h | 2 | ||||
| -rw-r--r-- | arm9/lib/include/registers.h | 4 | ||||
| -rw-r--r-- | arm9/lib/src/OS_reset.c | 63 | ||||
| -rw-r--r-- | arm9/lib/src/SND_alarm.c | 1 | ||||
| -rw-r--r-- | arm9/lib/src/SND_bank.c | 1 | ||||
| -rw-r--r-- | arm9/lib/src/SND_command.c | 46 | ||||
| -rw-r--r-- | arm9/lib/src/SND_interface.c | 12 | ||||
| -rw-r--r-- | arm9/lib/src/SND_main.c | 3 | 
9 files changed, 104 insertions, 29 deletions
| diff --git a/arm9/lib/include/OS_reset.h b/arm9/lib/include/OS_reset.h index 1efc3f2d..d3cb4355 100644 --- a/arm9/lib/include/OS_reset.h +++ b/arm9/lib/include/OS_reset.h @@ -18,6 +18,7 @@ static void OSi_SendToPxi(u16 data);  void OS_ResetSystem(u32 parameter);  void OSi_DoBoot(void);  static void OSi_CpuClear32(register u32 data, register void *destp, register u32 size); +void OSi_ReadCardRom32(u32 src, void *dst, s32 len);  static inline u32 OS_GetResetParameter(void)  { diff --git a/arm9/lib/include/SND_main.h b/arm9/lib/include/SND_main.h index 7412c1ae..e35f1ee1 100644 --- a/arm9/lib/include/SND_main.h +++ b/arm9/lib/include/SND_main.h @@ -19,7 +19,7 @@ struct SNDBinaryFileHeader {  typedef struct SNDBinaryBlockHeader {      u32 type;       // 0x0      u32 size;       // 0x4 -};  // size = 0x8 +} SNDBinaryBlockHeader;  // size = 0x8  struct SNDWaveParam {      u8 format;      // 0x0 diff --git a/arm9/lib/include/registers.h b/arm9/lib/include/registers.h index 366f4654..a1536eb8 100644 --- a/arm9/lib/include/registers.h +++ b/arm9/lib/include/registers.h @@ -98,9 +98,12 @@  #define reg_PXI_SEND_FIFO          (*(REGType32v *)0x4000188)  #define reg_MI_MCCNT0              (*(REGType16v *)0x40001a0) +#define reg_CARD_MASTERCNT         (*(REGType8v  *)0x40001a1) //?  #define reg_MI_MCD0                (*(REGType16v *)0x40001a2)  #define reg_MI_MCCNT1              (*(REGType32v *)0x40001a4) +#define reg_CARD_CNT               (*(REGType32v *)0x40001a4) //?  #define reg_MI_MCCMD0              (*(REGType32v *)0x40001a8) +#define reg_CARD_CMD               (*(REGType8v  *)0x40001a8) //?  #define reg_MI_MCCMD1              (*(REGType32v *)0x40001ac)  #define reg_MI_EXMEMCNT            (*(REGType16v *)0x4000204) @@ -355,6 +358,7 @@  #define reg_PXI_RECV_FIFO          (*(REGType32v *)0x4100000)  #define reg_MI_MCD1                (*(REGType32v *)0x4100010) +#define reg_CARD_DATA              (*(REGType32v *)0x4100010) //?  #define REG_PAD_KEYINPUT_L_SHIFT                           9  #define REG_PAD_KEYINPUT_L_SIZE                            1 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) +    { +        (®_CARD_CMD)[0] = (u8)(CARD_CMD_READ_PAGE); +        (®_CARD_CMD)[1] = (u8)(src >> 24); +        (®_CARD_CMD)[2] = (u8)(src >> 16); +        (®_CARD_CMD)[3] = (u8)(src >> 8); +        (®_CARD_CMD)[4] = (u8)(src >> 0); +        (®_CARD_CMD)[5] = 0; +        (®_CARD_CMD)[6] = 0; +        (®_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 *); | 
