summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libpcsxcore/mdec.c39
1 files changed, 32 insertions, 7 deletions
diff --git a/libpcsxcore/mdec.c b/libpcsxcore/mdec.c
index 2f4c565e..04476521 100644
--- a/libpcsxcore/mdec.c
+++ b/libpcsxcore/mdec.c
@@ -544,7 +544,9 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) {
image = (u16 *)PSXM(adr);
if (mdec.reg0 & MDEC0_RGB24) { // 15-b decoding
- dmacnt = 0;
+ dmacnt = 0;
+
+
size = size / ((16 * 16) / 2);
for (; size > 0; size--, image += (16 * 16)) {
mdec.rl = rl2blk(blk, mdec.rl);
@@ -553,10 +555,16 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) {
dmacnt++;
}
- // 300 blocks @ 30 fps
- dmacnt = dmacnt * PSXCLK / (300 * 30);
+
+ // macroblock size
+ dmacnt *= (16 * 16 * 2);
+
+ // macroblock cycles
+ dmacnt *= 1;
} else { // 24-b decoding
- dmacnt = 0;
+ dmacnt = 0;
+
+
size = size / ((24 * 16) / 2);
for (; size > 0; size--, image += (24 * 16)) {
mdec.rl = rl2blk(blk, mdec.rl);
@@ -565,8 +573,11 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) {
dmacnt++;
}
- // 300 blocks @ 30 fps
- dmacnt = dmacnt * PSXCLK / (300 * 30);
+ // macroblock size
+ dmacnt *= (16 * 16 * 3);
+
+ // macroblock cycles
+ dmacnt *= 1;
}
@@ -580,7 +591,21 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) {
}
- MDECOUTDMA_INT( dmacnt );
+ /*
+ current mblock speed = 1 cycle / byte
+
+
+ Destruction Derby Raw = ~1-2 macroblock cycles
+ - no movie hang
+
+ Rebel Assault 2 = ~0-1 macroblock cycles
+ - no hangs, chopped movies
+
+ Shadow Madness = ~1-4 macroblock cycles
+ - smoother videos, fixes boot
+ */
+
+ MDECOUTDMA_INT( dmacnt );
mdec.reg1 |= MDEC1_BUSY;