mirror of
https://github.com/wavemotion-dave/NINTV-DS.git
synced 2025-06-19 06:15:40 -04:00
Version 4.7d which now enables Intellivoice for the DS-Lite/Phat on World Series Major League Baseball.
This commit is contained in:
parent
8efcf9d6f0
commit
35e6fa69f4
BIN
NINTV-DS.nds
BIN
NINTV-DS.nds
Binary file not shown.
@ -50,9 +50,9 @@ public:
|
|||||||
return ((UINT8*)image)[(location) - this->location];
|
return ((UINT8*)image)[(location) - this->location];
|
||||||
}
|
}
|
||||||
|
|
||||||
inline UINT8 peek8a(UINT16 location) // For when you know this can't be disabled (e.g. iVoice ROM)
|
inline UINT8 peek8_fast(UINT16 location) // For when you know this can't be disabled and can mask the ROM easily (e.g. iVoice ROM)
|
||||||
{
|
{
|
||||||
return ((UINT8*)image)[(location) - this->location];
|
return ((UINT8*)image)[location];
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is now optimized for 16-bit access... GROM and iVOICE ROM should always call the peek8() version above...
|
// This is now optimized for 16-bit access... GROM and iVOICE ROM should always call the peek8() version above...
|
||||||
|
@ -110,6 +110,7 @@ void SP0256::resetProcessor()
|
|||||||
fifoSize = 0;
|
fifoSize = 0;
|
||||||
speaking = FALSE;
|
speaking = FALSE;
|
||||||
sp_idle = 1;
|
sp_idle = 1;
|
||||||
|
cleared = true;
|
||||||
|
|
||||||
amplitude = 0;
|
amplitude = 0;
|
||||||
period = 0;
|
period = 0;
|
||||||
@ -222,7 +223,7 @@ ITCM_CODE INT32 SP0256::readBitsReverse(INT32 numBits)
|
|||||||
{
|
{
|
||||||
while (bitsLeft < numBits) {
|
while (bitsLeft < numBits) {
|
||||||
if (pc < 0x1800) {
|
if (pc < 0x1800) {
|
||||||
currentBits |= (ivoiceROM.peek8a((UINT16)pc) << bitsLeft);
|
currentBits |= (ivoiceROM.peek8_fast(pc & 0x7FF) << bitsLeft);
|
||||||
bitsLeft += 8;
|
bitsLeft += 8;
|
||||||
pc++;
|
pc++;
|
||||||
}
|
}
|
||||||
@ -251,7 +252,7 @@ ITCM_CODE INT32 SP0256::readBits(INT32 numBits)
|
|||||||
{
|
{
|
||||||
while (bitsLeft < numBits) {
|
while (bitsLeft < numBits) {
|
||||||
if (pc < 0x1800) {
|
if (pc < 0x1800) {
|
||||||
currentBits |= (ivoiceROM.peek8a((UINT16)pc) << bitsLeft);
|
currentBits |= (ivoiceROM.peek8_fast(pc & 0x7FF) << bitsLeft);
|
||||||
bitsLeft += 8;
|
bitsLeft += 8;
|
||||||
pc++;
|
pc++;
|
||||||
}
|
}
|
||||||
@ -797,8 +798,8 @@ void SP0256::PAUSE(INT32 immed4) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ITCM_CODE void SP0256::decode() {
|
ITCM_CODE void SP0256::decode() {
|
||||||
INT32 immed4 = readBits(4);
|
UINT8 immed4 = readBits(4);
|
||||||
INT32 nextInstruction = readBitsReverse(4);
|
UINT8 nextInstruction = readBitsReverse(4);
|
||||||
switch (nextInstruction) {
|
switch (nextInstruction) {
|
||||||
case 0x0:
|
case 0x0:
|
||||||
if (immed4 == 0)
|
if (immed4 == 0)
|
||||||
|
@ -118,14 +118,14 @@ class SP0256 : public Processor, public AudioProducer
|
|||||||
void decode();
|
void decode();
|
||||||
static INT32 flipEndian(INT32 value, INT32 bits);
|
static INT32 flipEndian(INT32 value, INT32 bits);
|
||||||
|
|
||||||
UINT8 idle;
|
UINT8 idle;
|
||||||
UINT8 lrqHigh;
|
UINT8 lrqHigh;
|
||||||
UINT8 speaking;
|
UINT8 speaking;
|
||||||
INT16 fifoHead;
|
INT16 fifoHead;
|
||||||
INT16 fifoSize;
|
INT16 fifoSize;
|
||||||
INT32 command;
|
INT32 command;
|
||||||
INT32 random;
|
INT32 random;
|
||||||
INT32 page;
|
INT32 page;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -24,39 +24,33 @@ void SP0256_Registers::init(SP0256* ms)
|
|||||||
|
|
||||||
ITCM_CODE void SP0256_Registers::poke(UINT16 location, UINT16 value)
|
ITCM_CODE void SP0256_Registers::poke(UINT16 location, UINT16 value)
|
||||||
{
|
{
|
||||||
switch(location) {
|
//$81 will reset the SP0256 or push an 16-bit value into the queue
|
||||||
//a poke of any value into $80 means that the SP0256 should
|
if (location & 1)
|
||||||
//start speaking
|
{
|
||||||
case 0x0080:
|
if (value & 0x0400) {
|
||||||
if (ms->lrqHigh) {
|
ms->resetProcessor();
|
||||||
ms->lrqHigh = FALSE;
|
}
|
||||||
|
else if (ms->fifoSize < FIFO_MAX_SIZE) {
|
||||||
|
fifoBytes[(ms->fifoHead+ms->fifoSize) & 0x3F] = value;
|
||||||
|
ms->fifoSize++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else //Any poke of any value into $80 means that the SP0256 should start speaking
|
||||||
|
{
|
||||||
|
if (ms->lrqHigh) {
|
||||||
|
ms->lrqHigh = FALSE;
|
||||||
|
|
||||||
ms->command = value & 0xFF;
|
ms->command = value & 0xFF;
|
||||||
|
|
||||||
if (!ms->speaking)
|
if (!ms->speaking)
|
||||||
ms->idle = FALSE;
|
ms->idle = FALSE;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
//$81 will reset the SP0256 or push an 8-bit value into the queue
|
|
||||||
case 0x0081:
|
|
||||||
if (value & 0x0400) {
|
|
||||||
ms->resetProcessor();
|
|
||||||
}
|
|
||||||
else if (ms->fifoSize < FIFO_MAX_SIZE) {
|
|
||||||
fifoBytes[(ms->fifoHead+ms->fifoSize) & 0x3F] = value;
|
|
||||||
ms->fifoSize++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ITCM_CODE UINT16 SP0256_Registers::peek(UINT16 location) {
|
ITCM_CODE UINT16 SP0256_Registers::peek(UINT16 location)
|
||||||
switch(location) {
|
{
|
||||||
case 0x0080:
|
if (location & 1) return (ms->fifoSize == FIFO_MAX_SIZE ? 0x8000 : 0);
|
||||||
return (ms->lrqHigh ? 0x8000 : 0);
|
return (ms->lrqHigh ? 0x8000 : 0);
|
||||||
case 0x0081:
|
|
||||||
default:
|
|
||||||
return (ms->fifoSize == FIFO_MAX_SIZE ? 0x8000 : 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user