diff options
| author | StapleButter <thetotalworm@gmail.com> | 2017-01-22 20:34:59 +0100 | 
|---|---|---|
| committer | StapleButter <thetotalworm@gmail.com> | 2017-01-22 20:34:59 +0100 | 
| commit | ac8936539eed2aa5b8a32761fd5a064110139608 (patch) | |
| tree | 364936efb028aa3ef1c9f6d5890ac71139f0695b /NDS.cpp | |
| parent | 62ed28d5c8a6af554f4af9d3dd5853b656174e55 (diff) | |
some attempt at cart support
Diffstat (limited to 'NDS.cpp')
| -rw-r--r-- | NDS.cpp | 239 | 
1 files changed, 114 insertions, 125 deletions
@@ -21,6 +21,7 @@  #include "NDS.h"  #include "ARM.h"  #include "CP15.h" +#include "NDSCart.h"  #include "DMA.h"  #include "FIFO.h"  #include "GPU.h" @@ -28,12 +29,6 @@  #include "RTC.h"  #include "Wifi.h" -// derp -namespace SPI_Firmware -{ -    extern u8* Firmware; -} -  namespace NDS  { @@ -74,6 +69,11 @@ u32 ARM9ITCMSize;  u8 ARM9DTCM[0x4000];  u32 ARM9DTCMBase, ARM9DTCMSize; +u16 ExMemCnt[2]; + +u8 ROMSeed0[2*8]; +u8 ROMSeed1[2*8]; +  // IO shit  u32 IME[2];  u32 IE[2], IF[2]; @@ -99,12 +99,6 @@ u32 DivDenominator[2];  u32 DivQuotient[2];  u32 DivRemainder[2]; -u32 ROMSPIControl; -u32 ROMControl; -u8 ROMCommand[8]; -u8 ROMCurCommand[8]; -u32 ROMReadPos, ROMReadSize; -  u32 KeyInput;  u16 _soundbias; // temp @@ -129,6 +123,7 @@ void Init()      IPCFIFO9 = new FIFO(16);      IPCFIFO7 = new FIFO(16); +    NDSCart::Init();      GPU::Init();      SPI::Init();      RTC::Init(); @@ -220,6 +215,11 @@ void Reset()      ARM9DTCMBase = 0xFFFFFFFF;      ARM9DTCMSize = 0; +    ExMemCnt[0] = 0; +    ExMemCnt[1] = 0; +    memset(ROMSeed0, 0, 2*8); +    memset(ROMSeed1, 0, 2*8); +      IME[0] = 0;      IME[1] = 0; @@ -237,10 +237,6 @@ void Reset()      DivCnt = 0; -    ROMSPIControl = 0; -    ROMControl = 0; -    memset(ROMCommand, 0, 8); -      ARM9->Reset();      ARM7->Reset();      CP15::Reset(); @@ -250,6 +246,7 @@ void Reset()      for (i = 0; i < 8; i++) DMAs[i]->Reset();      memset(DMA9Fill, 0, 4*4); +    NDSCart::Reset();      GPU::Reset();      SPI::Reset();      RTC::Reset(); @@ -269,6 +266,7 @@ void Reset()      // test      //LoadROM();      //LoadFirmware(); +    NDSCart::LoadROM("rom/nsmb.nds");      Running = true; // hax  } @@ -512,6 +510,17 @@ bool HaltInterrupted(u32 cpu) +void CheckDMAs(u32 cpu, u32 mode) +{ +    cpu <<= 2; +    DMAs[cpu+0]->StartIfNeeded(mode); +    DMAs[cpu+1]->StartIfNeeded(mode); +    DMAs[cpu+2]->StartIfNeeded(mode); +    DMAs[cpu+3]->StartIfNeeded(mode); +} + + +  const s32 TimerPrescaler[4] = {2, 128, 512, 2048};  void TimerIncrement(u32 param) @@ -579,78 +588,6 @@ void TimerStart(u32 id, u16 cnt) -void ROMEndTransfer(u32 cpu) -{ -    ROMControl &= ~(1<<23); -    ROMControl &= ~(1<<31); - -    if (ROMSPIControl & (1<<14)) -        TriggerIRQ(cpu, IRQ_CartSendDone); -} - -void ROMStartTransfer(u32 cpu) -{ -    u32 datasize = (ROMControl >> 24) & 0x7; -    if (datasize == 7) -        datasize = 4; -    else if (datasize > 0) -        datasize = 0x100 << datasize; - -    //datasize += (ROMControl & 0x1FFF); // KEY1 gap - -    ROMReadPos = 0; -    ROMReadSize = datasize; - -    *(u32*)&ROMCurCommand[0] = *(u32*)&ROMCommand[0]; -    *(u32*)&ROMCurCommand[4] = *(u32*)&ROMCommand[4]; - -    printf("ROM COMMAND %04X %08X %02X%02X%02X%02X%02X%02X%02X%02X SIZE %04X\n", -           ROMSPIControl, ROMControl, -           ROMCommand[0], ROMCommand[1], ROMCommand[2], ROMCommand[3], -           ROMCommand[4], ROMCommand[5], ROMCommand[6], ROMCommand[7], -           datasize); - -    ROMControl |= (1<<23); - -    if (datasize == 0) -    { -        // hax -        /*if (ROMCommand[0] == 0xBA) -            ScheduleEvent(0x910*5*2, ROMEndTransfer, cpu); -        else*/ -        ROMEndTransfer(cpu); -        printf("ROM transfer done. %08X %08X\n", ARM7Read32(0x03FFFFF8), ARM7Read32(0x03FFFFFC)); -    } -} - -u32 ROMReadData(u32 cpu) -{ -    u32 ret = 0; - -    switch (ROMCurCommand[0]) -    { -    case 0x9F: ret = 0xFFFFFFFF; break; - -    case 0x00: -        // TODO: feed an actual cart header! -        ret = 0; -        break; - -    case 0x90: -        // chip ID -        ret = 0; -        break; -    } - -    ROMReadPos += 4; -    if (ROMReadPos >= ROMReadSize) -        ROMEndTransfer(cpu); - -    return ret; -} - - -  void StartDiv()  {      // TODO: division isn't instant! @@ -1398,8 +1335,9 @@ u16 ARM9IORead16(u32 addr)              return val;          } -    case 0x04000204: return 0;//0xFFFF; +    case 0x040001A0: return NDSCart::SPICnt; +    case 0x04000204: return ExMemCnt[0];      case 0x04000208: return IME[0];      case 0x04000280: return DivCnt; @@ -1450,6 +1388,8 @@ u32 ARM9IORead32(u32 addr)      case 0x04000108: return Timers[2].Counter | (Timers[2].Control << 16);      case 0x0400010C: return Timers[3].Counter | (Timers[3].Control << 16); +    case 0x040001A4: return NDSCart::ROMCnt; +      case 0x04000208: return IME[0];      case 0x04000210: return IE[0];      case 0x04000214: return IF[0]; @@ -1483,6 +1423,10 @@ u32 ARM9IORead32(u32 addr)          }          else              return IPCFIFO7->Peek(); + +    case 0x04100010: +        if (!(ExMemCnt[0] & (1<<11))) return NDSCart::ReadData(); +        return 0;      }      if (addr >= 0x04000000 && addr < 0x04000060) @@ -1503,14 +1447,29 @@ void ARM9IOWrite8(u32 addr, u8 val)      switch (addr)      {      case 0x040001A0: -        ROMSPIControl &= 0xFF00; -        ROMSPIControl |= val; +        if (!(ExMemCnt[0] & (1<<11))) +        { +            NDSCart::SPICnt &= 0xFF00; +            NDSCart::SPICnt |= val; +        }          return;      case 0x040001A1: -        ROMSPIControl &= 0x00FF; -        ROMSPIControl |= (val << 8); +        if (!(ExMemCnt[0] & (1<<11))) +        { +            NDSCart::SPICnt &= 0x00FF; +            NDSCart::SPICnt |= (val << 8); +        }          return; +    case 0x040001A8: NDSCart::ROMCommand[0] = val; return; +    case 0x040001A9: NDSCart::ROMCommand[1] = val; return; +    case 0x040001AA: NDSCart::ROMCommand[2] = val; return; +    case 0x040001AB: NDSCart::ROMCommand[3] = val; return; +    case 0x040001AC: NDSCart::ROMCommand[4] = val; return; +    case 0x040001AD: NDSCart::ROMCommand[5] = val; return; +    case 0x040001AE: NDSCart::ROMCommand[6] = val; return; +    case 0x040001AF: NDSCart::ROMCommand[7] = val; return; +      case 0x04000208: IME[0] = val & 0x1; return;      case 0x04000240: GPU::MapVRAM_AB(0, val); return; @@ -1584,7 +1543,15 @@ void ARM9IOWrite16(u32 addr, u16 val)          return;      case 0x040001A0: -        ROMSPIControl = val; +        if (!(ExMemCnt[0] & (1<<11))) NDSCart::SPICnt = val; +        return; + +    case 0x040001B8: ROMSeed0[4] = val & 0x7F; return; +    case 0x040001BA: ROMSeed1[4] = val & 0x7F; return; + +    case 0x04000204: +        ExMemCnt[0] = val; +        ExMemCnt[1] = (ExMemCnt[1] & 0x007F) | (val & 0xFF80);          return;      case 0x04000208: IME[0] = val & 0x1; return; @@ -1689,15 +1656,19 @@ void ARM9IOWrite32(u32 addr, u32 val)          return;      case 0x040001A0: -        ROMSPIControl = val & 0xFFFF; -        // TODO: SPI shit +        if (!(ExMemCnt[0] & (1<<11))) +        { +            NDSCart::SPICnt = val & 0xFFFF; +            // TODO: SPI shit +        }          return;      case 0x040001A4: -        val &= ~0x00800000; -        ROMControl = val; -        if (val & 0x80000000) ROMStartTransfer(0); +        if (!(ExMemCnt[0] & (1<<11))) NDSCart::WriteCnt(val);          return; +    case 0x040001B0: *(u32*)&ROMSeed0[0] = val; return; +    case 0x040001B4: *(u32*)&ROMSeed1[0] = val; return; +      case 0x04000208: IME[0] = val & 0x1; return;      case 0x04000210: IE[0] = val; if (val&~0x000F0F7D)printf("unusual IRQ %08X\n",val);return;      case 0x04000214: IF[0] &= ~val; return; @@ -1754,10 +1725,6 @@ u8 ARM7IORead8(u32 addr)      case 0x04000241: return WRAMCnt;      case 0x04000300: return PostFlag7; - -    //case 0x04000403: -        //Halt(); -        //return 0;      }      if (addr >= 0x04000400 && addr < 0x04000520) @@ -1803,9 +1770,12 @@ u16 ARM7IORead16(u32 addr)              return val;          } +    case 0x040001A0: return NDSCart::SPICnt; +      case 0x040001C0: return SPI::ReadCnt();      case 0x040001C2: return SPI::ReadData(); +    case 0x04000204: return ExMemCnt[1];      case 0x04000208: return IME[1];      case 0x04000300: return PostFlag7; @@ -1848,8 +1818,7 @@ u32 ARM7IORead32(u32 addr)      case 0x04000108: return Timers[6].Counter | (Timers[6].Control << 16);      case 0x0400010C: return Timers[7].Counter | (Timers[7].Control << 16); -    case 0x040001A4: -        return ROMControl; +    case 0x040001A4: return NDSCart::ROMCnt;      case 0x040001C0:          return SPI::ReadCnt() | (SPI::ReadData() << 16); @@ -1879,7 +1848,9 @@ u32 ARM7IORead32(u32 addr)          else              return IPCFIFO9->Peek(); -    case 0x04100010: return ROMReadData(1); +    case 0x04100010: +        if (ExMemCnt[0] & (1<<11)) return NDSCart::ReadData(); +        return 0;      }      if (addr >= 0x04000400 && addr < 0x04000520) @@ -1899,22 +1870,28 @@ void ARM7IOWrite8(u32 addr, u8 val)      case 0x04000138: RTC::Write(val, true); return;      case 0x040001A0: -        ROMSPIControl &= 0xFF00; -        ROMSPIControl |= val; +        if (ExMemCnt[0] & (1<<11)) +        { +            NDSCart::SPICnt &= 0xFF00; +            NDSCart::SPICnt |= val; +        }          return;      case 0x040001A1: -        ROMSPIControl &= 0x00FF; -        ROMSPIControl |= (val << 8); +        if (ExMemCnt[0] & (1<<11)) +        { +            NDSCart::SPICnt &= 0x00FF; +            NDSCart::SPICnt |= (val << 8); +        }          return; -    case 0x040001A8: ROMCommand[0] = val; return; -    case 0x040001A9: ROMCommand[1] = val; return; -    case 0x040001AA: ROMCommand[2] = val; return; -    case 0x040001AB: ROMCommand[3] = val; return; -    case 0x040001AC: ROMCommand[4] = val; return; -    case 0x040001AD: ROMCommand[5] = val; return; -    case 0x040001AE: ROMCommand[6] = val; return; -    case 0x040001AF: ROMCommand[7] = val; return; +    case 0x040001A8: NDSCart::ROMCommand[0] = val; return; +    case 0x040001A9: NDSCart::ROMCommand[1] = val; return; +    case 0x040001AA: NDSCart::ROMCommand[2] = val; return; +    case 0x040001AB: NDSCart::ROMCommand[3] = val; return; +    case 0x040001AC: NDSCart::ROMCommand[4] = val; return; +    case 0x040001AD: NDSCart::ROMCommand[5] = val; return; +    case 0x040001AE: NDSCart::ROMCommand[6] = val; return; +    case 0x040001AF: NDSCart::ROMCommand[7] = val; return;      case 0x040001C2:          SPI::WriteData(val); @@ -1986,9 +1963,13 @@ void ARM7IOWrite16(u32 addr, u16 val)          return;      case 0x040001A0: -        ROMSPIControl = val; +        if (ExMemCnt[0] & (1<<11)) +            NDSCart::SPICnt = val;          return; +    case 0x040001B8: ROMSeed0[12] = val & 0x7F; return; +    case 0x040001BA: ROMSeed1[12] = val & 0x7F; return; +      case 0x040001C0:          SPI::WriteCnt(val);          return; @@ -1997,6 +1978,10 @@ void ARM7IOWrite16(u32 addr, u16 val)          SPI::WriteData(val & 0xFF);          return; +    case 0x04000204: +        ExMemCnt[1] = (ExMemCnt[1] & 0xFF80) | (val & 0x007F); +        return; +      case 0x04000208: IME[1] = val & 0x1; return;      case 0x04000300: @@ -2008,7 +1993,7 @@ void ARM7IOWrite16(u32 addr, u16 val)      case 0x04000304: PowerControl7 = val; return; -    case 0x04000504: +    case 0x04000504: // removeme          _soundbias = val & 0x3FF;          return;      } @@ -2072,15 +2057,19 @@ void ARM7IOWrite32(u32 addr, u32 val)          return;      case 0x040001A0: -        ROMSPIControl = val & 0xFFFF; -        // TODO: SPI shit +        if (ExMemCnt[0] & (1<<11)) +        { +            NDSCart::SPICnt = val & 0xFFFF; +            // TODO: SPI shit +        }          return;      case 0x040001A4: -        val &= ~0x00800000; -        ROMControl = val; -        if (val & 0x80000000) ROMStartTransfer(1); +        if (ExMemCnt[0] & (1<<11)) NDSCart::WriteCnt(val);          return; +    case 0x040001B0: *(u32*)&ROMSeed0[8] = val; return; +    case 0x040001B4: *(u32*)&ROMSeed1[8] = val; return; +      case 0x04000208: IME[1] = val & 0x1; return;      case 0x04000210: IE[1] = val; return;      case 0x04000214: IF[1] &= ~val; return;  |