jak-project/game/overlord/jak1/dma.cpp
Tyler Wilding 5e987cc0e2
jak2: overlord rework (#2544)
Fixes #2545
Fixes #2546
Fixes #2547
Fixes #2548
Fixes #2549
Fixes #2550
Fixes #2551
Fixes #2552
Fixes #2553
Fixes #2554
Fixes #2555
Fixes #2556
Fixes #2557
Fixes #2558
Fixes #2559
Fixes #2560
Fixes #2561
Fixes #2562
Fixes #2563
Fixes #2564
Fixes #2565
Fixes #2567
Fixes #2566
Fixes #2568
Fixes #2569
Fixes #2570
Fixes #2522
Fixes #2571

---------

Co-authored-by: water <awaterford111445@gmail.com>
Co-authored-by: Hat Kid <6624576+Hat-Kid@users.noreply.github.com>
Co-authored-by: ManDude <7569514+ManDude@users.noreply.github.com>
2023-04-29 16:13:57 -04:00

51 lines
1.1 KiB
C++

/*!
* @file dma.cpp
* DMA Related functions for Overlord.
* This code is not great.
*/
#include "dma.h"
#include <cstdio>
#include <cstring>
#include "common/common_types.h"
#include "game/sce/iop.h"
#include "game/sound/sdshim.h"
#include "game/sound/sndshim.h"
using namespace iop;
namespace jak1 {
u32 strobe; // ?? mysterious sound DMA flag.
void dma_init_globals() {
strobe = 0;
}
/*!
* SPU DMA interrupt handler.
*/
s32 intr(s32 /*channel*/, void* /*userdata*/) {
strobe = 1;
return 0;
}
bool DMA_SendToSPUAndSync(void* src_addr, u32 size, u32 dst_addr) {
s32 channel = snd_GetFreeSPUDMA();
if (channel == -1)
return false;
strobe = 0;
sceSdSetTransIntrHandler(channel, intr, nullptr);
// Skip this, we end up memcpy's from OOB (which trips asan)
// u32 size_aligned = (size + 63) & 0xFFFFFFF0;
u32 size_aligned = size;
u32 transferred = sceSdVoiceTrans(channel, 0, src_addr, dst_addr, size_aligned);
while (!strobe)
;
sceSdSetTransIntrHandler(channel, nullptr, nullptr);
snd_FreeSPUDMA(channel);
return transferred >= size_aligned;
}
} // namespace jak1