fix SCSP UNPACK sign extension (nw)

This commit is contained in:
Vas Crabb 2017-05-17 15:47:14 +10:00
parent 1f62d6ecd1
commit 4325f253c3

View File

@ -3,6 +3,9 @@
#include "emu.h" #include "emu.h"
#include "scspdsp.h" #include "scspdsp.h"
#include <cstring>
namespace { namespace {
uint16_t PACK(int32_t val) uint16_t PACK(int32_t val)
@ -34,7 +37,7 @@ static int32_t UNPACK(uint16_t val)
int const sign = BIT(val, 15); int const sign = BIT(val, 15);
int exponent = (val >> 11) & 0xF; int exponent = (val >> 11) & 0xF;
int const mantissa = val & 0x7FF; int const mantissa = val & 0x7FF;
uint32_t uval = mantissa << 11; int32_t uval = mantissa << 11;
if (exponent > 11) if (exponent > 11)
{ {
exponent = 11; exponent = 11;
@ -57,7 +60,7 @@ static int32_t UNPACK(uint16_t val)
void SCSPDSP::Init() void SCSPDSP::Init()
{ {
memset(this, 0, sizeof(*this)); std::memset(this, 0, sizeof(*this));
RBL = 0x8000; RBL = 0x8000;
Stopped = 1; Stopped = 1;
} }
@ -86,7 +89,7 @@ void SCSPDSP::Step()
for (int step = 0; step < /*128*/LastStep; ++step) for (int step = 0; step < /*128*/LastStep; ++step)
{ {
uint16_t *const IPtr = MPRO + step*4; uint16_t *const IPtr = MPRO + (step * 4);
//if (!IPtr[0] && !IPtr[1] && !IPtr[2] && !IPtr[3]) //if (!IPtr[0] && !IPtr[1] && !IPtr[2] && !IPtr[3])
//break; //break;
@ -133,7 +136,6 @@ void SCSPDSP::Step()
if (f) if (f)
{ {
#define DUMP(v) fprintf(f, " " #v ": %04X", v); #define DUMP(v) fprintf(f, " " #v ": %04X", v);
fprintf(f, "%d: ", step); fprintf(f, "%d: ", step);
DUMP(ACC); DUMP(ACC);
DUMP(SHIFTED); DUMP(SHIFTED);
@ -147,6 +149,7 @@ void SCSPDSP::Step()
DUMP(ADDR); DUMP(ADDR);
DUMP(ADRS_REG); DUMP(ADRS_REG);
fprintf(f, "\n"); fprintf(f, "\n");
#undef DUMP
} }
#endif #endif
@ -221,13 +224,9 @@ void SCSPDSP::Step()
//Shifter //Shifter
if (SHIFT == 0) if (SHIFT == 0)
{
SHIFTED = std::max<int32_t>(std::min<int32_t>(ACC, 0x007FFFFF), -0x00800000); SHIFTED = std::max<int32_t>(std::min<int32_t>(ACC, 0x007FFFFF), -0x00800000);
}
else if (SHIFT == 1) else if (SHIFT == 1)
{
SHIFTED = std::max<int32_t>(std::min<int32_t>(ACC * 2, 0x007FFFFF), -0x00800000); SHIFTED = std::max<int32_t>(std::min<int32_t>(ACC * 2, 0x007FFFFF), -0x00800000);
}
else if (SHIFT == 2) else if (SHIFT == 2)
{ {
SHIFTED = ACC * 2; SHIFTED = ACC * 2;
@ -312,7 +311,6 @@ void SCSPDSP::Step()
if (EWT) if (EWT)
EFREG[EWA] += SHIFTED >> 8; EFREG[EWA] += SHIFTED >> 8;
} }
--DEC; --DEC;
std::fill(std::begin(MIXS), std::end(MIXS), 0); std::fill(std::begin(MIXS), std::end(MIXS), 0);