From 8d42b1c7d7466abf80a61ea51ee3006110c15b65 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Tue, 8 Sep 2020 20:19:37 +0200 Subject: messin' around --- src/ARM.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'src/ARM.cpp') diff --git a/src/ARM.cpp b/src/ARM.cpp index 7eeacb7..7fe3497 100644 --- a/src/ARM.cpp +++ b/src/ARM.cpp @@ -256,6 +256,18 @@ void ARMv5::JumpTo(u32 addr, bool restorecpsr) // aging cart debug crap //if (addr == 0x0201764C) printf("capture test %d: R1=%08X\n", R[6], R[1]); //if (addr == 0x020175D8) printf("capture test %d: res=%08X\n", R[6], R[0]); + if(addr==0x0219BA2D) printf("CAM RESET FROM %08X\n", R[15]); + if(addr==0x0219BB69) printf("CAM SHITO FROM %08X\n", R[15]); + if(addr==0x0200BA45) printf("CAM SHITO2 FROM %08X\n", R[15]); + if(addr==0x0200B9ED) printf("CAM SHITO3 FROM %08X\n", R[15]); + if(addr==0x0200B9BD) printf("CAM SETUP START FROM %08X\n", R[15]); + if(R[15]==0x0200B9E6) printf("CAM SETUP END FROM %08X\n", addr); + if(addr==0x0219AA5B) printf("CAM LOOP BACK FROM %08X\n", R[15]); + if(addr==0x0200BD0D) printf("GUILLOTINE FIVE MILLION %08X\n", R[15]); + if(addr==0x0200512D) printf("GUILLOTINE SIX MILLION %08X\n", R[15]); + if(addr==0x0219A585) printf("GUILLOTINE SEVEN MILLION %08X\n", R[15]); + if(addr==0x0219BAF1) printf("CAM GET DRQ BIT %08X\n", R[15]); + if(addr==0x0219BA91) printf("CAM STOP TRANSFER %08X\n", R[15]); u32 oldregion = R[15] >> 24; u32 newregion = addr >> 24; @@ -570,6 +582,8 @@ 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 { @@ -592,7 +606,7 @@ void ARMv5::Execute() else AddCycles_C(); } - + // TODO optimize this shit!!! if (Halted) { @@ -651,7 +665,7 @@ void ARMv5::ExecuteJIT() return; } - ARMJIT::JitBlockEntry block = ARMJIT::LookUpBlock(0, FastBlockLookup, + ARMJIT::JitBlockEntry block = ARMJIT::LookUpBlock(0, FastBlockLookup, instrAddr - FastBlockLookupStart, instrAddr); if (block) ARM_Dispatch(this, block); @@ -802,7 +816,7 @@ void ARMv4::ExecuteJIT() return; } - ARMJIT::JitBlockEntry block = ARMJIT::LookUpBlock(1, FastBlockLookup, + ARMJIT::JitBlockEntry block = ARMJIT::LookUpBlock(1, FastBlockLookup, instrAddr - FastBlockLookupStart, instrAddr); if (block) ARM_Dispatch(this, block); @@ -879,4 +893,4 @@ void ARMv4::FillPipeline() NextInstr[0] = CodeRead32(R[15] - 4); NextInstr[1] = CodeRead32(R[15]); } -} \ No newline at end of file +} -- cgit v1.2.3 From 81964a0f89eb479bc1a4e60111f5120cd2b1b8f0 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Mon, 26 Oct 2020 21:54:08 +0100 Subject: make things function atleast somewhat no pciture is being actually sent yet --- src/ARM.cpp | 12 ---------- src/DSi_Camera.cpp | 67 +++++++++++++++++++++++++++++++++++++++--------------- src/DSi_Camera.h | 4 +++- src/NDS.h | 3 ++- 4 files changed, 54 insertions(+), 32 deletions(-) (limited to 'src/ARM.cpp') diff --git a/src/ARM.cpp b/src/ARM.cpp index 7fe3497..c6c51ed 100644 --- a/src/ARM.cpp +++ b/src/ARM.cpp @@ -256,18 +256,6 @@ void ARMv5::JumpTo(u32 addr, bool restorecpsr) // aging cart debug crap //if (addr == 0x0201764C) printf("capture test %d: R1=%08X\n", R[6], R[1]); //if (addr == 0x020175D8) printf("capture test %d: res=%08X\n", R[6], R[0]); - if(addr==0x0219BA2D) printf("CAM RESET FROM %08X\n", R[15]); - if(addr==0x0219BB69) printf("CAM SHITO FROM %08X\n", R[15]); - if(addr==0x0200BA45) printf("CAM SHITO2 FROM %08X\n", R[15]); - if(addr==0x0200B9ED) printf("CAM SHITO3 FROM %08X\n", R[15]); - if(addr==0x0200B9BD) printf("CAM SETUP START FROM %08X\n", R[15]); - if(R[15]==0x0200B9E6) printf("CAM SETUP END FROM %08X\n", addr); - if(addr==0x0219AA5B) printf("CAM LOOP BACK FROM %08X\n", R[15]); - if(addr==0x0200BD0D) printf("GUILLOTINE FIVE MILLION %08X\n", R[15]); - if(addr==0x0200512D) printf("GUILLOTINE SIX MILLION %08X\n", R[15]); - if(addr==0x0219A585) printf("GUILLOTINE SEVEN MILLION %08X\n", R[15]); - if(addr==0x0219BAF1) printf("CAM GET DRQ BIT %08X\n", R[15]); - if(addr==0x0219BA91) printf("CAM STOP TRANSFER %08X\n", R[15]); u32 oldregion = R[15] >> 24; u32 newregion = addr >> 24; diff --git a/src/DSi_Camera.cpp b/src/DSi_Camera.cpp index 5ac4dfd..746dc64 100644 --- a/src/DSi_Camera.cpp +++ b/src/DSi_Camera.cpp @@ -32,7 +32,13 @@ u8 DSi_Camera::FrameBuffer[640*480*4]; u32 DSi_Camera::FrameLength; u32 DSi_Camera::TransferPos; -const u32 kCameraInterval = 1024*16; // interval between camera data blocks +// note on camera data/etc intervals +// on hardware those are likely affected by several factors +// namely, how long cameras take to process frames +// camera IRQ is fired at roughly 15FPS with default config + +const u32 kIRQInterval = 1120000; // ~30 FPS +const u32 kTransferStart = 60000; bool DSi_Camera::Init() @@ -61,34 +67,32 @@ void DSi_Camera::Reset() TransferPos = 0; FrameLength = 256*192*2; // TODO: make it check frame size, data type, etc - NDS::ScheduleEvent(NDS::Event_DSi_Camera, true, kCameraInterval, Process, 0); + NDS::ScheduleEvent(NDS::Event_DSi_CamIRQ, true, kIRQInterval, IRQ, 0); } -void DSi_Camera::Process(u32 param) +void DSi_Camera::IRQ(u32 param) { DSi_Camera* activecam = nullptr; // TODO: check which camera has priority if both are activated + // (or does it just jumble both data sources together, like it + // does for, say, overlapping VRAM?) if (DSi_Camera0->IsActivated()) activecam = DSi_Camera0; else if (DSi_Camera1->IsActivated()) activecam = DSi_Camera1; if (activecam) { - if (TransferPos == 0) - RequestFrame(activecam->Num); + RequestFrame(activecam->Num); - Cnt |= (1<<4); - if (Cnt & (1<<11)) NDS::SetIRQ(0, NDS::IRQ_DSi_Camera); - } - else - { - TransferPos = 0; + if (Cnt & (1<<11)) + NDS::SetIRQ(0, NDS::IRQ_DSi_Camera); + + if (Cnt & (1<<15)) + NDS::ScheduleEvent(NDS::Event_DSi_CamTransfer, false, kTransferStart, Transfer, 0); } - // TODO: check the interval for this? - // on hardware the delay is likely determined by how long the camera takes to process raw data - NDS::ScheduleEvent(NDS::Event_DSi_Camera, true, kCameraInterval, Process, 0); + NDS::ScheduleEvent(NDS::Event_DSi_CamIRQ, true, kIRQInterval, IRQ, 0); } void DSi_Camera::RequestFrame(u32 cam) @@ -112,6 +116,32 @@ void DSi_Camera::RequestFrame(u32 cam) } } +void DSi_Camera::Transfer(u32 pos) +{ + u32 numscan = (Cnt & 0x000F) + 1; + u32 numpix = numscan * 256; // CHECKME + + // TODO: present data + //printf("CAM TRANSFER POS=%d/%d\n", pos, 0x6000*2); + + DSi::CheckNDMAs(0, 0x0B); + + pos += numpix; + if (pos >= 0x6000*2) // HACK + { + // transfer done + } + else + { + // keep going + + // TODO: must be tweaked such that each block has enough time to transfer + u32 delay = numpix*2 + 16; + + NDS::ScheduleEvent(NDS::Event_DSi_CamTransfer, false, delay, Transfer, pos); + } +} + DSi_Camera::DSi_Camera(u32 num) { @@ -290,6 +320,7 @@ u32 DSi_Camera::Read32(u32 addr) { case 0x04004204: { + return 0; if (!(Cnt & (1<<15))) return 0; // CHECKME u32 ret = *(u32*)&FrameBuffer[TransferPos]; TransferPos += 4; @@ -346,22 +377,22 @@ void DSi_Camera::Write16(u32 addr, u16 val) u16 oldmask; if (Cnt & 0x8000) { - val &= 0x8F00; + val &= 0x8F20; oldmask = 0x601F; } else { - val &= 0xEF0F; + val &= 0xEF2F; oldmask = 0x0010; } - Cnt = (Cnt & oldmask) | val; + Cnt = (Cnt & oldmask) | (val & ~0x0020); if (val & (1<<5)) Cnt &= ~(1<<4); if ((val & (1<<15)) && !(Cnt & (1<<15))) { // start transfer - DSi::CheckNDMAs(0, 0x0B); + //DSi::CheckNDMAs(0, 0x0B); } } return; diff --git a/src/DSi_Camera.h b/src/DSi_Camera.h index 6022420..a8c0632 100644 --- a/src/DSi_Camera.h +++ b/src/DSi_Camera.h @@ -28,9 +28,11 @@ public: static void DeInit(); static void Reset(); - static void Process(u32 param); + static void IRQ(u32 param); static void RequestFrame(u32 cam); + static void Transfer(u32 pos); + DSi_Camera(u32 num); ~DSi_Camera(); diff --git a/src/NDS.h b/src/NDS.h index 89ef12f..98a0f7d 100644 --- a/src/NDS.h +++ b/src/NDS.h @@ -46,7 +46,8 @@ enum Event_DSi_SDMMCTransfer, Event_DSi_SDIOTransfer, Event_DSi_NWifi, - Event_DSi_Camera, + Event_DSi_CamIRQ, + Event_DSi_CamTransfer, Event_DSi_RAMSizeChange, -- 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/ARM.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