aboutsummaryrefslogtreecommitdiff
path: root/src/SPU.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/SPU.h')
-rw-r--r--src/SPU.h50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/SPU.h b/src/SPU.h
index 0687b41..a00e094 100644
--- a/src/SPU.h
+++ b/src/SPU.h
@@ -103,6 +103,56 @@ public:
void NextSample_Noise();
template<u32 type> void Run(s32* buf, u32 samples);
+
+ void DoRun(s32* buf, u32 samples)
+ {
+ switch ((Cnt >> 29) & 0x3)
+ {
+ case 0: Run<0>(buf, samples); break;
+ case 1: Run<1>(buf, samples); break;
+ case 2: Run<2>(buf, samples); break;
+ case 3:
+ if (Num >= 14) Run<4>(buf, samples);
+ else if (Num >= 8) Run<3>(buf, samples);
+ break;
+ }
+ }
+};
+
+class CaptureUnit
+{
+public:
+ CaptureUnit(u32 num);
+ ~CaptureUnit();
+ void Reset();
+
+ u32 Num;
+
+ u8 Cnt;
+ u32 DstAddr;
+ u16 TimerReload;
+ u32 Length;
+
+ u32 Timer;
+ s32 Pos;
+
+ void SetCnt(u8 val)
+ {
+ if ((val & 0x80) && !(Cnt & 0x80))
+ Start();
+
+ val &= 0x8F;
+ if (!(val & 0x80)) val &= ~0x01;
+ Cnt = val;
+ }
+
+ void SetDstAddr(u32 val) { DstAddr = val & 0x07FFFFFC; }
+ void SetTimerReload(u32 val) { TimerReload = val & 0xFFFF; }
+ void SetLength(u32 val) { Length = val << 2; if (Length == 0) Length = 4; }
+
+ void Start() { Timer = TimerReload; }
+
+ void Run(s32 sample);
};
}