summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorPierre Bourdon <delroth@gmail.com>2017-04-08 17:22:47 +0200
committerGitHub <noreply@github.com>2017-04-08 17:22:47 +0200
commite863604b7ea53c98f3c4ee7bfebea949482d9eae (patch)
treeb63f640fcf67714b904ec230c2632fb3e1e84588 /Source/Core
parentf41557b1c3e781d2da2ef2018e5f57d245b5eeb2 (diff)
parentcd2d0897d6edafcb85763957401ced8004a02aa7 (diff)
Merge pull request #5211 from MerryMage/ax
AX: Implement loop_counter and support UCodes without LPF
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp4
-rw-r--r--Source/Core/Core/HW/DSPHLE/UCodes/AXStructs.h5
-rw-r--r--Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h64
-rw-r--r--Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp4
4 files changed, 65 insertions, 12 deletions
diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp
index 7d8e4522f2..7c9e745fd1 100644
--- a/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp
+++ b/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp
@@ -422,7 +422,7 @@ void AXUCode::ProcessPBList(u32 pb_addr)
m_samples_auxA_right, m_samples_auxA_surround, m_samples_auxB_left,
m_samples_auxB_right, m_samples_auxB_surround}};
- ReadPB(pb_addr, pb);
+ ReadPB(pb_addr, pb, m_crc);
u32 updates_addr = HILO_TO_32(pb.updates.data);
u16* updates = (u16*)HLEMemory_Get_Pointer(updates_addr);
@@ -439,7 +439,7 @@ void AXUCode::ProcessPBList(u32 pb_addr)
buffers.ptrs[i] += spms;
}
- WritePB(pb_addr, pb);
+ WritePB(pb_addr, pb, m_crc);
pb_addr = HILO_TO_32(pb.next_pb);
}
}
diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AXStructs.h b/Source/Core/Core/HW/DSPHLE/UCodes/AXStructs.h
index 6ba6b794c7..098e05073f 100644
--- a/Source/Core/Core/HW/DSPHLE/UCodes/AXStructs.h
+++ b/Source/Core/Core/HW/DSPHLE/UCodes/AXStructs.h
@@ -252,9 +252,10 @@ struct AXPB
PBADPCMInfo adpcm;
PBSampleRateConverter src;
PBADPCMLoopInfo adpcm_loop_info;
- PBLowPassFilter lpf;
+ PBLowPassFilter lpf; // Skipped when writing to/reading from MRAM/ARAM for certain AX UCodes
+ u16 loop_counter;
- u16 padding[25];
+ u16 padding[24];
};
struct PBBiquadFilter
diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h b/Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h
index f4f6c4898e..b7fca29356 100644
--- a/Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h
+++ b/Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h
@@ -80,18 +80,63 @@ union AXBuffers
#endif
};
+// Determines if this version of the UCode has a PBLowPassFilter in its AXPB layout.
+bool HasLpf(u32 crc)
+{
+ switch (crc)
+ {
+ case 0x4E8A8B21:
+ return false;
+ default:
+ return true;
+ }
+}
+
// Read a PB from MRAM/ARAM
-void ReadPB(u32 addr, PB_TYPE& pb)
+void ReadPB(u32 addr, PB_TYPE& pb, u32 crc)
{
- u16* dst = (u16*)&pb;
- Memory::CopyFromEmuSwapped<u16>(dst, addr, sizeof(pb));
+ if (HasLpf(crc))
+ {
+ u16* dst = (u16*)&pb;
+ Memory::CopyFromEmuSwapped<u16>(dst, addr, sizeof(pb));
+ }
+ else
+ {
+ // The below is a terrible hack in order to support two different AXPB layouts.
+ // We skip lpf in this layout.
+
+ char* dst = (char*)&pb;
+
+ constexpr size_t lpf_off = offsetof(AXPB, lpf);
+ constexpr size_t lc_off = offsetof(AXPB, loop_counter);
+
+ Memory::CopyFromEmuSwapped<u16>((u16*)dst, addr, lpf_off);
+ memset(dst + lpf_off, 0, lc_off - lpf_off);
+ Memory::CopyFromEmuSwapped<u16>((u16*)(dst + lc_off), addr + lpf_off, sizeof(pb) - lc_off);
+ }
}
// Write a PB back to MRAM/ARAM
-void WritePB(u32 addr, const PB_TYPE& pb)
+void WritePB(u32 addr, const PB_TYPE& pb, u32 crc)
{
- const u16* src = (const u16*)&pb;
- Memory::CopyToEmuSwapped<u16>(addr, src, sizeof(pb));
+ if (HasLpf(crc))
+ {
+ const u16* src = (const u16*)&pb;
+ Memory::CopyToEmuSwapped<u16>(addr, src, sizeof(pb));
+ }
+ else
+ {
+ // The below is a terrible hack in order to support two different AXPB layouts.
+ // We skip lpf in this layout.
+
+ const char* src = (const char*)&pb;
+
+ constexpr size_t lpf_off = offsetof(AXPB, lpf);
+ constexpr size_t lc_off = offsetof(AXPB, loop_counter);
+
+ Memory::CopyToEmuSwapped<u16>(addr, (const u16*)src, lpf_off);
+ Memory::CopyToEmuSwapped<u16>(addr + lpf_off, (const u16*)(src + lc_off), sizeof(pb) - lc_off);
+ }
}
#if 0
@@ -234,6 +279,13 @@ u16 AcceleratorGetSample()
acc_pb->adpcm.yn1 = acc_pb->adpcm_loop_info.yn1;
acc_pb->adpcm.yn2 = acc_pb->adpcm_loop_info.yn2;
}
+#ifdef AX_GC
+ else
+ {
+ // If we're streaming, increment the loop counter.
+ acc_pb->loop_counter++;
+ }
+#endif
}
else
{
diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp
index 22e2268168..4c77f35224 100644
--- a/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp
+++ b/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp
@@ -451,7 +451,7 @@ void AXWiiUCode::ProcessPBList(u32 pb_addr)
m_samples_aux1, m_samples_wm2, m_samples_aux2,
m_samples_wm3, m_samples_aux3}};
- ReadPB(pb_addr, pb);
+ ReadPB(pb_addr, pb, m_crc);
u16 num_updates[3];
u16 updates[1024];
@@ -476,7 +476,7 @@ void AXWiiUCode::ProcessPBList(u32 pb_addr)
m_coeffs_available ? m_coeffs : nullptr);
}
- WritePB(pb_addr, pb);
+ WritePB(pb_addr, pb, m_crc);
pb_addr = HILO_TO_32(pb.next_pb);
}
}