From 8d42b1c7d7466abf80a61ea51ee3006110c15b65 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Tue, 8 Sep 2020 20:19:37 +0200 Subject: messin' around --- src/NDS.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/NDS.cpp') diff --git a/src/NDS.cpp b/src/NDS.cpp index f926399..90eaac5 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -1819,14 +1819,14 @@ void debug(u32 param) fclose(shit);*/ FILE* - shit = fopen("debug/picto9.bin", "wb"); + shit = fopen("debug/cam9.bin", "wb"); for (u32 i = 0x02000000; i < 0x04000000; i+=4) { u32 val = DSi::ARM9Read32(i); fwrite(&val, 4, 1, shit); } fclose(shit); - shit = fopen("debug/picto7.bin", "wb"); + shit = fopen("debug/cam7.bin", "wb"); for (u32 i = 0x02000000; i < 0x04000000; i+=4) { u32 val = DSi::ARM7Read32(i); -- cgit v1.2.3 From 9fdc1de6feba27a30ab15cab0be74bac04b797ae Mon Sep 17 00:00:00 2001 From: Arisotura Date: Sun, 25 Oct 2020 18:14:40 +0100 Subject: add a few missing 32bit I/O accesses (IPC, SPI) --- src/NDS.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src/NDS.cpp') diff --git a/src/NDS.cpp b/src/NDS.cpp index 90149ad..d42e735 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -3001,6 +3001,7 @@ u32 ARM9IORead32(u32 addr) case 0x04000130: return (KeyInput & 0xFFFF) | (KeyCnt << 16); case 0x04000180: return IPCSync9; + case 0x04000184: return ARM9IORead16(addr); case 0x040001A0: return NDSCart::SPICnt | (NDSCart::ReadSPIData() << 16); case 0x040001A4: return NDSCart::ROMCnt; @@ -3378,10 +3379,11 @@ void ARM9IOWrite32(u32 addr, u32 val) case 0x04000130: KeyCnt = val >> 16; return; + case 0x04000180: + case 0x04000184: ARM9IOWrite16(addr, val); return; - case 0x04000188: if (IPCFIFOCnt9 & 0x8000) { @@ -3640,6 +3642,7 @@ u32 ARM7IORead32(u32 addr) case 0x04000138: return RTC::Read(); case 0x04000180: return IPCSync7; + case 0x04000184: return ARM7IORead16(addr); case 0x040001A0: return NDSCart::SPICnt | (NDSCart::ReadSPIData() << 16); case 0x040001A4: return NDSCart::ROMCnt; @@ -3940,6 +3943,7 @@ void ARM7IOWrite32(u32 addr, u32 val) case 0x04000138: RTC::Write(val & 0xFFFF, false); return; case 0x04000180: + case 0x04000184: ARM7IOWrite16(addr, val); return; case 0x04000188: @@ -3984,6 +3988,11 @@ void ARM7IOWrite32(u32 addr, u32 val) case 0x040001B0: *(u32*)&ROMSeed0[8] = val; return; case 0x040001B4: *(u32*)&ROMSeed1[8] = val; return; + case 0x040001C0: + SPI::WriteCnt(val & 0xFFFF); + SPI::WriteData((val >> 16) & 0xFF); + return; + case 0x04000208: IME[1] = val & 0x1; UpdateIRQ(1); return; case 0x04000210: IE[1] = val; UpdateIRQ(1); return; case 0x04000214: IF[1] &= ~val; UpdateIRQ(1); return; -- cgit v1.2.3 From d2cd3eadbec9b9c7411f5653070bc6298e2023a2 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Tue, 27 Oct 2020 05:03:17 +0100 Subject: fix to timers (ZXDS no longer runs slow as shit) --- src/DSi_Camera.cpp | 2 +- src/NDS.cpp | 30 ++++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) (limited to 'src/NDS.cpp') diff --git a/src/DSi_Camera.cpp b/src/DSi_Camera.cpp index 746dc64..79cfe3f 100644 --- a/src/DSi_Camera.cpp +++ b/src/DSi_Camera.cpp @@ -320,7 +320,7 @@ u32 DSi_Camera::Read32(u32 addr) { case 0x04004204: { - return 0; + return 0xFC00801F; if (!(Cnt & (1<<15))) return 0; // CHECKME u32 ret = *(u32*)&FrameBuffer[TransferPos]; TransferPos += 4; diff --git a/src/NDS.cpp b/src/NDS.cpp index 5c368e3..1781dd5 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -1470,7 +1470,7 @@ void HandleTimerOverflow(u32 tid) { Timer* timer = &Timers[tid]; - timer->Counter += timer->Reload << 16; + timer->Counter += (timer->Reload << 10); if (timer->Cnt & (1<<6)) SetIRQ(tid >> 2, IRQ_Timer0 + (tid & 0x3)); @@ -1486,11 +1486,11 @@ void HandleTimerOverflow(u32 tid) if ((timer->Cnt & 0x84) != 0x84) break; - timer->Counter += 0x10000; - if (timer->Counter >> 16) + timer->Counter += (1 << 10); + if (!(timer->Counter >> 26)) break; - timer->Counter = timer->Reload << 16; + timer->Counter = timer->Reload << 10; if (timer->Cnt & (1<<6)) SetIRQ(tid >> 2, IRQ_Timer0 + (tid & 0x3)); @@ -1505,8 +1505,13 @@ void RunTimer(u32 tid, s32 cycles) u32 oldcount = timer->Counter; timer->Counter += (cycles << timer->CycleShift); - if (timer->Counter < oldcount) + //if (timer->Counter < oldcount) + // HandleTimerOverflow(tid); + while (timer->Counter >> 26) + { + timer->Counter -= (1 << 26); HandleTimerOverflow(tid); + } } void RunTimers(u32 cpu) @@ -1623,7 +1628,7 @@ u16 TimerGetCounter(u32 timer) RunTimers(timer>>2); u32 ret = Timers[timer].Counter; - return ret >> 16; + return ret >> 10; } void TimerStart(u32 id, u16 cnt) @@ -1633,11 +1638,11 @@ void TimerStart(u32 id, u16 cnt) u16 newstart = cnt & (1<<7); timer->Cnt = cnt; - timer->CycleShift = 16 - TimerPrescaler[cnt & 0x03]; + timer->CycleShift = 10 - TimerPrescaler[cnt & 0x03]; if ((!curstart) && newstart) { - timer->Counter = timer->Reload << 16; + timer->Counter = timer->Reload << 10; /*if ((cnt & 0x84) == 0x80) { @@ -1799,6 +1804,15 @@ void StartSqrt() void debug(u32 param) { + if (param==1312) + { + u32 timer = 0x10000 - (Timers[3].Counter >> 16); + timer *= 16; + timer += (0x10000 - (Timers[2].Counter >> 16)); + printf("TIMER=%d (%04X/%04X)\n", timer, (Timers[2].Counter >> 16), (Timers[3].Counter >> 16)); + return; + } + printf("ARM9 PC=%08X LR=%08X %08X\n", ARM9->R[15], ARM9->R[14], ARM9->R_IRQ[1]); printf("ARM7 PC=%08X LR=%08X %08X\n", ARM7->R[15], ARM7->R[14], ARM7->R_IRQ[1]); -- cgit v1.2.3 From 05e274a1f69b976ae5826e0660f9510c2b3878af Mon Sep 17 00:00:00 2001 From: Hypnotron Date: Thu, 29 Oct 2020 16:09:25 -0400 Subject: Added 8/16-bit IPCFIFOSEND writes --- src/NDS.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/NDS.cpp') diff --git a/src/NDS.cpp b/src/NDS.cpp index d42e735..aef4d3c 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -3116,6 +3116,10 @@ void ARM9IOWrite8(u32 addr, u8 val) NDSCart::WriteSPIData(val); return; + case 0x04000188: + ARM9IOWrite32(addr, val | (val << 8) | (val << 16) | (val << 24)); + return; + case 0x040001A8: NDSCart::ROMCommand[0] = val; return; case 0x040001A9: NDSCart::ROMCommand[1] = val; return; case 0x040001AA: NDSCart::ROMCommand[2] = val; return; @@ -3232,6 +3236,10 @@ void ARM9IOWrite16(u32 addr, u16 val) IPCFIFOCnt9 = val & 0x8404; return; + case 0x04000188: + ARM9IOWrite32(addr, val | (val << 16)); + return; + case 0x040001A0: if (!(ExMemCnt[0] & (1<<11))) NDSCart::WriteSPICnt(val); return; @@ -3719,6 +3727,10 @@ void ARM7IOWrite8(u32 addr, u8 val) case 0x04000138: RTC::Write(val, true); return; + case 0x04000188: + ARM7IOWrite32(addr, val | (val << 8) | (val << 16) | (val << 24)); + return; + case 0x040001A0: if (ExMemCnt[0] & (1<<11)) { @@ -3827,6 +3839,10 @@ void ARM7IOWrite16(u32 addr, u16 val) IPCFIFOCnt7 = val & 0x8404; return; + case 0x04000188: + ARM7IOWrite32(addr, val | (val << 16)); + return; + case 0x040001A0: if (ExMemCnt[0] & (1<<11)) NDSCart::WriteSPICnt(val); -- cgit v1.2.3 From 62e3f41f20866388287329218810d2fd8cea3515 Mon Sep 17 00:00:00 2001 From: RSDuck Date: Wed, 11 Nov 2020 13:38:05 +0100 Subject: delay savefile flush to the end of the frame --- src/NDS.cpp | 2 ++ src/NDSCart.cpp | 27 ++++++++++++++++++++------- src/NDSCart.h | 3 +++ 3 files changed, 25 insertions(+), 7 deletions(-) (limited to 'src/NDS.cpp') diff --git a/src/NDS.cpp b/src/NDS.cpp index aef4d3c..5181b34 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -1000,6 +1000,8 @@ u32 RunFrame() GPU3D::Timestamp-SysTimestamp); #endif + NDSCart::FlushSRAMFile(); + NumFrames++; return GPU::TotalScanlines; diff --git a/src/NDSCart.cpp b/src/NDSCart.cpp index 077bf48..2d8396a 100644 --- a/src/NDSCart.cpp +++ b/src/NDSCart.cpp @@ -37,6 +37,7 @@ u8* SRAM; u32 SRAMLength; char SRAMPath[1024]; +bool SRAMFileDirty; void (*WriteFunc)(u8 val, bool islast); @@ -445,14 +446,21 @@ void Write(u8 val, u32 hold) break; } - if (islast && (CurCmd == 0x02 || CurCmd == 0x0A) && (SRAMLength > 0)) + SRAMFileDirty |= islast && (CurCmd == 0x02 || CurCmd == 0x0A) && (SRAMLength > 0); +} + +void FlushSRAMFile() +{ + if (!SRAMFileDirty) + return; + + SRAMFileDirty = false; + + FILE* f = Platform::OpenFile(SRAMPath, "wb"); + if (f) { - FILE* f = Platform::OpenFile(SRAMPath, "wb"); - if (f) - { - fwrite(SRAM, SRAMLength, 1, f); - fclose(f); - } + fwrite(SRAM, SRAMLength, 1, f); + fclose(f); } } @@ -1034,6 +1042,11 @@ void RelocateSave(const char* path, bool write) NDSCart_SRAM::RelocateSave(path, write); } +void FlushSRAMFile() +{ + NDSCart_SRAM::FlushSRAMFile(); +} + int ImportSRAM(const u8* data, u32 length) { memcpy(NDSCart_SRAM::SRAM, data, std::min(length, NDSCart_SRAM::SRAMLength)); diff --git a/src/NDSCart.h b/src/NDSCart.h index 9fe916d..7d3f4a1 100644 --- a/src/NDSCart.h +++ b/src/NDSCart.h @@ -46,6 +46,9 @@ void DoSavestate(Savestate* file); void DecryptSecureArea(u8* out); bool LoadROM(const char* path, const char* sram, bool direct); + +void FlushSRAMFile(); + void RelocateSave(const char* path, bool write); int ImportSRAM(const u8* data, u32 length); -- cgit v1.2.3 From 05b94eff66e3ae0192dad2a638d18491b15654b0 Mon Sep 17 00:00:00 2001 From: RSDuck Date: Wed, 11 Nov 2020 17:54:27 +0100 Subject: make audio output thread safe(r?) --- src/NDS.cpp | 1 + src/SPU.cpp | 127 ++++++++++++++++++++++++++++++++++++++++++------------------ src/SPU.h | 1 + 3 files changed, 91 insertions(+), 38 deletions(-) (limited to 'src/NDS.cpp') diff --git a/src/NDS.cpp b/src/NDS.cpp index 5181b34..d68045b 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -999,6 +999,7 @@ u32 RunFrame() ARM7Timestamp-SysTimestamp, GPU3D::Timestamp-SysTimestamp); #endif + SPU::TransferOutput(); NDSCart::FlushSRAMFile(); diff --git a/src/SPU.cpp b/src/SPU.cpp index bb15244..fe798c7 100644 --- a/src/SPU.cpp +++ b/src/SPU.cpp @@ -18,6 +18,7 @@ #include #include +#include "Platform.h" #include "NDS.h" #include "DSi.h" #include "SPU.h" @@ -61,11 +62,15 @@ const s16 PSGTable[8][8] = {-0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF} }; -const u32 OutputBufferSize = 2*1024; -s16 OutputBuffer[2 * OutputBufferSize]; -volatile u32 OutputReadOffset; -volatile u32 OutputWriteOffset; +const u32 OutputBufferSize = 2*2048; +s16 OutputBackbuffer[2 * OutputBufferSize]; +u32 OutputBackbufferWritePosition; +s16 OutputFrontBuffer[2 * OutputBufferSize]; +u32 OutputFrontBufferWritePosition; +u32 OutputFrontBufferReadPosition; + +Platform::Mutex* AudioLock; u16 Cnt; u8 MasterVolume; @@ -83,6 +88,8 @@ bool Init() Capture[0] = new CaptureUnit(0); Capture[1] = new CaptureUnit(1); + AudioLock = Platform::Mutex_Create(); + return true; } @@ -93,6 +100,8 @@ void DeInit() delete Capture[0]; delete Capture[1]; + + Platform::Mutex_Free(AudioLock); } void Reset() @@ -114,10 +123,13 @@ void Reset() void Stop() { - memset(OutputBuffer, 0, 2*OutputBufferSize*2); + Platform::Mutex_Lock(AudioLock); + memset(OutputFrontBuffer, 0, 2*OutputBufferSize*2); - OutputReadOffset = 0; - OutputWriteOffset = 0; + OutputBackbufferWritePosition = 0; + OutputFrontBufferReadPosition = 0; + OutputFrontBufferWritePosition = 0; + Platform::Mutex_Unlock(AudioLock); } void DoSavestate(Savestate* file) @@ -704,59 +716,88 @@ void Mix(u32 dummy) if (rightoutput < -0x8000) rightoutput = -0x8000; else if (rightoutput > 0x7FFF) rightoutput = 0x7FFF; - OutputBuffer[OutputWriteOffset ] = leftoutput >> 1; - OutputBuffer[OutputWriteOffset + 1] = rightoutput >> 1; - OutputWriteOffset += 2; - OutputWriteOffset &= ((2*OutputBufferSize)-1); - if (OutputWriteOffset == OutputReadOffset) - { - //printf("!! SOUND FIFO OVERFLOW %d\n", OutputWriteOffset>>1); - // advance the read position too, to avoid losing the entire FIFO - OutputReadOffset += 2; - OutputReadOffset &= ((2*OutputBufferSize)-1); - } + // OutputBufferFrame can never get full because it's + // transfered to OutputBuffer at the end of the frame + OutputBackbuffer[OutputBackbufferWritePosition ] = leftoutput >> 1; + OutputBackbuffer[OutputBackbufferWritePosition + 1] = rightoutput >> 1; + OutputBackbufferWritePosition += 2; NDS::ScheduleEvent(NDS::Event_SPU, true, 1024, Mix, 0); } +void TransferOutput() +{ + Platform::Mutex_Lock(AudioLock); + for (u32 i = 0; i < OutputBackbufferWritePosition; i += 2) + { + OutputFrontBuffer[OutputFrontBufferWritePosition ] = OutputBackbuffer[i ]; + OutputFrontBuffer[OutputFrontBufferWritePosition + 1] = OutputBackbuffer[i + 1]; + + OutputFrontBufferWritePosition += 2; + OutputFrontBufferWritePosition &= OutputBufferSize*2-1; + if (OutputFrontBufferWritePosition == OutputFrontBufferReadPosition) + { + // advance the read position too, to avoid losing the entire FIFO + OutputFrontBufferReadPosition += 2; + OutputFrontBufferReadPosition &= OutputBufferSize*2-1; + } + } + OutputBackbufferWritePosition = 0; + Platform::Mutex_Unlock(AudioLock); +} void TrimOutput() { + Platform::Mutex_Lock(AudioLock); const int halflimit = (OutputBufferSize / 2); - int readpos = OutputWriteOffset - (halflimit*2); + int readpos = OutputFrontBufferWritePosition - (halflimit*2); if (readpos < 0) readpos += (OutputBufferSize*2); - OutputReadOffset = readpos; + OutputFrontBufferReadPosition = readpos; + Platform::Mutex_Unlock(AudioLock); } void DrainOutput() { - OutputReadOffset = 0; - OutputWriteOffset = 0; + Platform::Mutex_Lock(AudioLock); + OutputFrontBufferWritePosition = 0; + OutputFrontBufferReadPosition = 0; + Platform::Mutex_Unlock(AudioLock); } void InitOutput() { - memset(OutputBuffer, 0, 2*OutputBufferSize*2); - OutputReadOffset = 0; - OutputWriteOffset = OutputBufferSize; + Platform::Mutex_Lock(AudioLock); + memset(OutputBackbuffer, 0, 2*OutputBufferSize*2); + memset(OutputFrontBuffer, 0, 2*OutputBufferSize*2); + OutputFrontBufferReadPosition = 0; + OutputFrontBufferWritePosition = 0; + Platform::Mutex_Unlock(AudioLock); } int GetOutputSize() { + Platform::Mutex_Lock(AudioLock); + int ret; - if (OutputWriteOffset >= OutputReadOffset) - ret = OutputWriteOffset - OutputReadOffset; + if (OutputFrontBufferWritePosition >= OutputFrontBufferReadPosition) + ret = OutputFrontBufferWritePosition - OutputFrontBufferReadPosition; else - ret = (OutputBufferSize*2) - OutputReadOffset + OutputWriteOffset; + ret = (OutputBufferSize*2) - OutputFrontBufferReadPosition + OutputFrontBufferWritePosition; ret >>= 1; + + Platform::Mutex_Unlock(AudioLock); return ret; } void Sync(bool wait) { + // this function is currently not used anywhere + // depending on the usage context the thread safety measures could be made + // a lot faster + // sync to audio output in case the core is running too fast // * wait=true: wait until enough audio data has been played // * wait=false: merely skip some audio data to avoid a FIFO overflow @@ -770,32 +811,42 @@ void Sync(bool wait) } else if (GetOutputSize() > halflimit) { - int readpos = OutputWriteOffset - (halflimit*2); + Platform::Mutex_Lock(AudioLock); + + int readpos = OutputFrontBufferWritePosition - (halflimit*2); if (readpos < 0) readpos += (OutputBufferSize*2); - OutputReadOffset = readpos; + OutputFrontBufferReadPosition = readpos; + + Platform::Mutex_Unlock(AudioLock); } } int ReadOutput(s16* data, int samples) { - if (OutputReadOffset == OutputWriteOffset) + Platform::Mutex_Lock(AudioLock); + if (OutputFrontBufferReadPosition == OutputFrontBufferWritePosition) + { + Platform::Mutex_Unlock(AudioLock); return 0; + } for (int i = 0; i < samples; i++) { - *data++ = OutputBuffer[OutputReadOffset]; - *data++ = OutputBuffer[OutputReadOffset + 1]; + *data++ = OutputFrontBuffer[OutputFrontBufferReadPosition]; + *data++ = OutputFrontBuffer[OutputFrontBufferReadPosition + 1]; + + OutputFrontBufferReadPosition += 2; + OutputFrontBufferReadPosition &= ((2*OutputBufferSize)-1); - //if (OutputReadOffset != OutputWriteOffset) + if (OutputFrontBufferWritePosition == OutputFrontBufferReadPosition) { - OutputReadOffset += 2; - OutputReadOffset &= ((2*OutputBufferSize)-1); - } - if (OutputReadOffset == OutputWriteOffset) + Platform::Mutex_Unlock(AudioLock); return i+1; + } } + Platform::Mutex_Unlock(AudioLock); return samples; } diff --git a/src/SPU.h b/src/SPU.h index 397c733..c6b1c7f 100644 --- a/src/SPU.h +++ b/src/SPU.h @@ -41,6 +41,7 @@ void InitOutput(); int GetOutputSize(); void Sync(bool wait); int ReadOutput(s16* data, int samples); +void TransferOutput(); u8 Read8(u32 addr); u16 Read16(u32 addr); -- cgit v1.2.3 From 1085cc14a43fe09b423a0e4334acd32823873d1c Mon Sep 17 00:00:00 2001 From: RSDuck Date: Mon, 16 Nov 2020 17:03:24 +0100 Subject: prevent use after free --- src/NDS.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/NDS.cpp') diff --git a/src/NDS.cpp b/src/NDS.cpp index d68045b..2b468be 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -210,13 +210,13 @@ bool Init() void DeInit() { - delete ARM9; - delete ARM7; - #ifdef JIT_ENABLED ARMJIT::DeInit(); #endif + delete ARM9; + delete ARM7; + for (int i = 0; i < 8; i++) delete DMAs[i]; -- cgit v1.2.3 From 842379c4105954782e1145b919d468e596a090e8 Mon Sep 17 00:00:00 2001 From: RSDuck Date: Mon, 16 Nov 2020 17:22:34 +0100 Subject: harmless DMA micro optimisation --- src/DMA.cpp | 55 +++++++++++++++++++++++++++++-------------------------- src/DMA.h | 8 +++----- src/NDS.cpp | 26 +++++++++++++++----------- 3 files changed, 47 insertions(+), 42 deletions(-) (limited to 'src/NDS.cpp') diff --git a/src/DMA.cpp b/src/DMA.cpp index 18b8a2f..8ad3918 100644 --- a/src/DMA.cpp +++ b/src/DMA.cpp @@ -77,21 +77,6 @@ void DMA::Reset() Running = false; InProgress = false; - - if (NDS::ConsoleType == 1) - { - BusRead16 = (CPU==0) ? DSi::ARM9Read16 : DSi::ARM7Read16; - BusRead32 = (CPU==0) ? DSi::ARM9Read32 : DSi::ARM7Read32; - BusWrite16 = (CPU==0) ? DSi::ARM9Write16 : DSi::ARM7Write16; - BusWrite32 = (CPU==0) ? DSi::ARM9Write32 : DSi::ARM7Write32; - } - else - { - BusRead16 = (CPU==0) ? NDS::ARM9Read16 : NDS::ARM7Read16; - BusRead32 = (CPU==0) ? NDS::ARM9Read32 : NDS::ARM7Read32; - BusWrite16 = (CPU==0) ? NDS::ARM9Write16 : NDS::ARM7Write16; - BusWrite32 = (CPU==0) ? NDS::ARM9Write32 : NDS::ARM7Write32; - } } void DMA::DoSavestate(Savestate* file) @@ -198,13 +183,7 @@ void DMA::Start() NDS::StopCPU(CPU, 1< void DMA::Run9() { if (NDS::ARM9Timestamp >= NDS::ARM9Target) return; @@ -242,7 +221,10 @@ void DMA::Run9() { NDS::ARM9Timestamp += (unitcycles << NDS::ARM9ClockShift); - BusWrite16(CurDstAddr, BusRead16(CurSrcAddr)); + if (ConsoleType == 1) + DSi::ARM9Write16(CurDstAddr, DSi::ARM9Read16(CurSrcAddr)); + else + NDS::ARM9Write16(CurDstAddr, NDS::ARM9Read16(CurSrcAddr)); CurSrcAddr += SrcAddrInc<<1; CurDstAddr += DstAddrInc<<1; @@ -278,7 +260,10 @@ void DMA::Run9() { NDS::ARM9Timestamp += (unitcycles << NDS::ARM9ClockShift); - BusWrite32(CurDstAddr, BusRead32(CurSrcAddr)); + if (ConsoleType == 1) + DSi::ARM9Write32(CurDstAddr, DSi::ARM9Read32(CurSrcAddr)); + else + NDS::ARM9Write32(CurDstAddr, NDS::ARM9Read32(CurSrcAddr)); CurSrcAddr += SrcAddrInc<<2; CurDstAddr += DstAddrInc<<2; @@ -317,6 +302,7 @@ void DMA::Run9() NDS::ResumeCPU(0, 1< void DMA::Run7() { if (NDS::ARM7Timestamp >= NDS::ARM7Target) return; @@ -354,7 +340,10 @@ void DMA::Run7() { NDS::ARM7Timestamp += unitcycles; - BusWrite16(CurDstAddr, BusRead16(CurSrcAddr)); + if (ConsoleType == 1) + DSi::ARM7Write16(CurDstAddr, DSi::ARM7Read16(CurSrcAddr)); + else + NDS::ARM7Write16(CurDstAddr, NDS::ARM7Read16(CurSrcAddr)); CurSrcAddr += SrcAddrInc<<1; CurDstAddr += DstAddrInc<<1; @@ -390,7 +379,10 @@ void DMA::Run7() { NDS::ARM7Timestamp += unitcycles; - BusWrite32(CurDstAddr, BusRead32(CurSrcAddr)); + if (ConsoleType == 1) + DSi::ARM7Write32(CurDstAddr, DSi::ARM7Read32(CurSrcAddr)); + else + NDS::ARM7Write32(CurDstAddr, NDS::ARM7Read32(CurSrcAddr)); CurSrcAddr += SrcAddrInc<<2; CurDstAddr += DstAddrInc<<2; @@ -425,3 +417,14 @@ void DMA::Run7() InProgress = false; NDS::ResumeCPU(1, 1< +void DMA::Run() +{ + if (!Running) return; + if (CPU == 0) return Run9(); + else return Run7(); +} + +template void DMA::Run<0>(); +template void DMA::Run<1>(); \ No newline at end of file diff --git a/src/DMA.h b/src/DMA.h index 0344fba..b0b4ab2 100644 --- a/src/DMA.h +++ b/src/DMA.h @@ -34,9 +34,12 @@ public: void WriteCnt(u32 val); void Start(); + template void Run(); + template void Run9(); + template void Run7(); bool IsInMode(u32 mode) @@ -86,11 +89,6 @@ private: bool Stall; bool IsGXFIFODMA; - - u16 (*BusRead16)(u32 addr); - u32 (*BusRead32)(u32 addr); - void (*BusWrite16)(u32 addr, u16 val); - void (*BusWrite32)(u32 addr, u32 val); }; #endif diff --git a/src/NDS.cpp b/src/NDS.cpp index 2b468be..0b0263b 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -908,7 +908,7 @@ void RunSystem(u64 timestamp) } } -template +template u32 RunFrame() { FrameStartTimestamp = SysTimestamp; @@ -934,10 +934,10 @@ u32 RunFrame() } else if (CPUStop & 0x0FFF) { - DMAs[0]->Run(); - if (!(CPUStop & 0x80000000)) DMAs[1]->Run(); - if (!(CPUStop & 0x80000000)) DMAs[2]->Run(); - if (!(CPUStop & 0x80000000)) DMAs[3]->Run(); + DMAs[0]->Run(); + if (!(CPUStop & 0x80000000)) DMAs[1]->Run(); + if (!(CPUStop & 0x80000000)) DMAs[2]->Run(); + if (!(CPUStop & 0x80000000)) DMAs[3]->Run(); if (ConsoleType == 1) DSi::RunNDMAs(0); } else @@ -962,10 +962,10 @@ u32 RunFrame() if (CPUStop & 0x0FFF0000) { - DMAs[4]->Run(); - DMAs[5]->Run(); - DMAs[6]->Run(); - DMAs[7]->Run(); + DMAs[4]->Run(); + DMAs[5]->Run(); + DMAs[6]->Run(); + DMAs[7]->Run(); if (ConsoleType == 1) DSi::RunNDMAs(1); } else @@ -1012,10 +1012,14 @@ u32 RunFrame() { #ifdef JIT_ENABLED if (Config::JIT_Enable) - return RunFrame(); + return NDS::ConsoleType == 1 + ? RunFrame() + : RunFrame(); else #endif - return RunFrame(); + return NDS::ConsoleType == 0 + ? RunFrame() + : RunFrame(); } void Reschedule(u64 target) -- cgit v1.2.3 From 1ff4a1564f951ef1a60fe2f55afe78aedede674a Mon Sep 17 00:00:00 2001 From: RSDuck Date: Thu, 26 Nov 2020 00:04:19 +0100 Subject: fix DSi mode with interpreter I'm so stupid --- src/NDS.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/NDS.cpp') diff --git a/src/NDS.cpp b/src/NDS.cpp index 0b0263b..bdbdb97 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -1017,7 +1017,7 @@ u32 RunFrame() : RunFrame(); else #endif - return NDS::ConsoleType == 0 + return NDS::ConsoleType == 1 ? RunFrame() : RunFrame(); } -- cgit v1.2.3 From 1dbe69c6bec5e1b8e75108e5ccf11361acedc925 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Thu, 10 Dec 2020 18:09:11 +0100 Subject: remove some debug crap --- src/ARM.cpp | 2 -- src/DMA.cpp | 2 +- src/NDS.cpp | 15 +++------------ src/frontend/qt_sdl/main.cpp | 9 +++++---- 4 files changed, 9 insertions(+), 19 deletions(-) (limited to 'src/NDS.cpp') diff --git a/src/ARM.cpp b/src/ARM.cpp index c6c51ed..29110e5 100644 --- a/src/ARM.cpp +++ b/src/ARM.cpp @@ -570,8 +570,6 @@ void ARMv5::Execute() // actually execute u32 icode = (CurInstr >> 6) & 0x3FF; ARMInterpreter::THUMBInstrTable[icode](this); - - if (R[15]==0x0219A6B0) printf("CAM THREAD MSG: %02X %08X -> %08X\n", R[1], R[0], 0x0219A6B6+R[0]); } else { diff --git a/src/DMA.cpp b/src/DMA.cpp index 8ad3918..cd3465f 100644 --- a/src/DMA.cpp +++ b/src/DMA.cpp @@ -427,4 +427,4 @@ void DMA::Run() } template void DMA::Run<0>(); -template void DMA::Run<1>(); \ No newline at end of file +template void DMA::Run<1>(); diff --git a/src/NDS.cpp b/src/NDS.cpp index b313db0..b8b83f7 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -1811,15 +1811,6 @@ void StartSqrt() void debug(u32 param) { - if (param==1312) - { - u32 timer = 0x10000 - (Timers[3].Counter >> 16); - timer *= 16; - timer += (0x10000 - (Timers[2].Counter >> 16)); - printf("TIMER=%d (%04X/%04X)\n", timer, (Timers[2].Counter >> 16), (Timers[3].Counter >> 16)); - return; - } - printf("ARM9 PC=%08X LR=%08X %08X\n", ARM9->R[15], ARM9->R[14], ARM9->R_IRQ[1]); printf("ARM7 PC=%08X LR=%08X %08X\n", ARM7->R[15], ARM7->R[14], ARM7->R_IRQ[1]); @@ -1845,14 +1836,14 @@ void debug(u32 param) fclose(shit);*/ FILE* - shit = fopen("debug/cam9.bin", "wb"); + shit = fopen("debug/power9.bin", "wb"); for (u32 i = 0x02000000; i < 0x04000000; i+=4) { u32 val = DSi::ARM9Read32(i); fwrite(&val, 4, 1, shit); } fclose(shit); - shit = fopen("debug/cam7.bin", "wb"); + shit = fopen("debug/power7.bin", "wb"); for (u32 i = 0x02000000; i < 0x04000000; i+=4) { u32 val = DSi::ARM7Read32(i); @@ -3258,7 +3249,7 @@ void ARM9IOWrite16(u32 addr, u16 val) return; case 0x04000188: - ARM9IOWrite32(addr, val | (val << 16)); + ARM9IOWrite32(addr, val | (val << 16)); return; case 0x040001A0: diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index 6e27d61..0228446 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -371,7 +371,7 @@ void EmuThread::run() if (Input::HotkeyPressed(HK_Pause)) emit windowEmuPause(); if (Input::HotkeyPressed(HK_Reset)) emit windowEmuReset(); - + if (Input::HotkeyPressed(HK_FullscreenToggle)) emit windowFullscreenToggle(); if (GBACart::CartInserted && GBACart::HasSolarSensor) @@ -507,7 +507,7 @@ void EmuThread::run() frameLimitError = -practicalFramelimit; if (frameLimitError > practicalFramelimit) frameLimitError = practicalFramelimit; - + if (round(frameLimitError * 1000.0) > 0.0) { SDL_Delay(round(frameLimitError * 1000.0)); @@ -1324,6 +1324,7 @@ void MainWindow::keyPressEvent(QKeyEvent* event) { if (event->isAutoRepeat()) return; + // TODO!! REMOVE ME IN RELEASE BUILDS!! if (event->key() == Qt::Key_F11) NDS::debug(0); Input::KeyPress(event); @@ -1926,9 +1927,9 @@ void MainWindow::onTitleUpdate(QString title) void MainWindow::onFullscreenToggled() { - if (!mainWindow->isFullScreen()) + if (!mainWindow->isFullScreen()) { - mainWindow->showFullScreen(); + mainWindow->showFullScreen(); mainWindow->menuBar()->hide(); } else -- cgit v1.2.3 From 49317e9165263ba01df5d875f07081786a51241e Mon Sep 17 00:00:00 2001 From: Arisotura Date: Fri, 11 Dec 2020 18:06:26 +0100 Subject: don't axe error bits when writing to IPCFIFOCNT. fixes #801 --- src/NDS.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/NDS.cpp') diff --git a/src/NDS.cpp b/src/NDS.cpp index b8b83f7..8b49328 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -3245,7 +3245,7 @@ void ARM9IOWrite16(u32 addr, u16 val) SetIRQ(0, IRQ_IPCRecv); if (val & 0x4000) IPCFIFOCnt9 &= ~0x4000; - IPCFIFOCnt9 = val & 0x8404; + IPCFIFOCnt9 = (val & 0x8404) | (IPCFIFOCnt9 & 0x4000); return; case 0x04000188: @@ -3848,7 +3848,7 @@ void ARM7IOWrite16(u32 addr, u16 val) SetIRQ(1, IRQ_IPCRecv); if (val & 0x4000) IPCFIFOCnt7 &= ~0x4000; - IPCFIFOCnt7 = val & 0x8404; + IPCFIFOCnt7 = (val & 0x8404) | (IPCFIFOCnt7 & 0x4000); return; case 0x04000188: -- cgit v1.2.3