add/fix some undocumented sb16 dsp commands (asp/csp programming)
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3212
This commit is contained in:
parent
cbdb5b97fe
commit
ba077a4d76
1 changed files with 125 additions and 14 deletions
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/* $Id: sblaster.cpp,v 1.68 2008-08-06 18:32:35 c2woody Exp $ */
|
||||
/* $Id: sblaster.cpp,v 1.69 2008-08-28 17:37:23 c2woody Exp $ */
|
||||
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
|
@ -160,9 +160,32 @@ static SB_INFO sb;
|
|||
|
||||
static char const * const copyright_string="COPYRIGHT (C) CREATIVE TECHNOLOGY LTD, 1992.";
|
||||
|
||||
static Bit8u DSP_cmd_len[256] = {
|
||||
// 0,0,0,0, 1,2,0,0, 0,0,0,0, 0,0,2,1, // 0x00 for SB16. but breaks sbpro
|
||||
0,0,0,0, 0,2,0,0, 0,0,0,0, 0,0,2,1, // 0x00
|
||||
// number of bytes in input for commands (sb/sbpro)
|
||||
static Bit8u DSP_cmd_len_sb[256] = {
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x00
|
||||
1,0,0,0, 2,0,2,2, 0,0,0,0, 0,0,0,0, // 0x10
|
||||
0,0,0,0, 2,0,0,0, 0,0,0,0, 0,0,0,0, // 0x20
|
||||
0,0,0,0, 0,0,0,0, 1,0,0,0, 0,0,0,0, // 0x30
|
||||
|
||||
1,2,2,0, 0,0,0,0, 2,0,0,0, 0,0,0,0, // 0x40
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x50
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x60
|
||||
0,0,0,0, 2,2,2,2, 0,0,0,0, 0,0,0,0, // 0x70
|
||||
|
||||
2,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x80
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x90
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0xa0
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0xb0
|
||||
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0xc0
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0xd0
|
||||
1,0,1,0, 1,0,0,0, 0,0,0,0, 0,0,0,0, // 0xe0
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 // 0xf0
|
||||
};
|
||||
|
||||
// number of bytes in input for commands (sb16)
|
||||
static Bit8u DSP_cmd_len_sb16[256] = {
|
||||
0,0,0,0, 1,2,0,0, 1,0,0,0, 0,0,2,1, // 0x00
|
||||
1,0,0,0, 2,0,2,2, 0,0,0,0, 0,0,0,0, // 0x10
|
||||
0,0,0,0, 2,0,0,0, 0,0,0,0, 0,0,0,0, // 0x20
|
||||
0,0,0,0, 0,0,0,0, 1,0,0,0, 0,0,0,0, // 0x30
|
||||
|
@ -180,9 +203,12 @@ static Bit8u DSP_cmd_len[256] = {
|
|||
3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3, // 0xc0
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0xd0
|
||||
1,0,1,0, 1,0,0,0, 0,0,0,0, 0,0,0,0, // 0xe0
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 // 0xf0
|
||||
0,0,0,0, 0,0,0,0, 0,1,0,0, 0,0,0,0 // 0xf0
|
||||
};
|
||||
|
||||
static Bit8u ASP_regs[256];
|
||||
static bool ASP_init_in_progress = false;
|
||||
|
||||
static int E2_incr_table[4][9] = {
|
||||
{ 0x01, -0x02, -0x04, 0x08, -0x10, 0x20, 0x40, -0x80, -106 },
|
||||
{ -0x01, 0x02, -0x04, 0x08, 0x10, -0x20, 0x40, -0x80, 165 },
|
||||
|
@ -708,9 +734,56 @@ Bitu DEBUG_EnableDebugger(void);
|
|||
static void DSP_DoCommand(void) {
|
||||
// LOG_MSG("DSP Command %X",sb.dsp.cmd);
|
||||
switch (sb.dsp.cmd) {
|
||||
case 0x04: /* DSP Status SB 2.0/pro version. NOT SB16. */
|
||||
DSP_FlushData();
|
||||
DSP_AddData(0xff); //Everthing enabled
|
||||
case 0x04:
|
||||
if (sb.type == SBT_16) {
|
||||
/* SB16 ASP set mode register */
|
||||
if ((sb.dsp.in.data[0]&0xf1)==0xf1) ASP_init_in_progress=true;
|
||||
else ASP_init_in_progress=false;
|
||||
LOG(LOG_SB,LOG_NORMAL)("DSP Unhandled SB16ASP command %X (set mode register to %X)",sb.dsp.cmd,sb.dsp.in.data[0]);
|
||||
} else {
|
||||
/* DSP Status SB 2.0/pro version. NOT SB16. */
|
||||
DSP_FlushData();
|
||||
if (sb.type == SBT_2) DSP_AddData(0x88);
|
||||
else if ((sb.type == SBT_PRO1) || (sb.type == SBT_PRO2)) DSP_AddData(0x7b);
|
||||
else DSP_AddData(0xff); //Everything enabled
|
||||
}
|
||||
break;
|
||||
case 0x05: /* SB16 ASP set codec parameter */
|
||||
LOG(LOG_SB,LOG_NORMAL)("DSP Unhandled SB16ASP command %X (set codec parameter)",sb.dsp.cmd);
|
||||
break;
|
||||
case 0x08: /* SB16 ASP get version */
|
||||
LOG(LOG_SB,LOG_NORMAL)("DSP Unhandled SB16ASP command %X sub %X",sb.dsp.cmd,sb.dsp.in.data[0]);
|
||||
if (sb.type == SBT_16) {
|
||||
switch (sb.dsp.in.data[0]) {
|
||||
case 0x03:
|
||||
DSP_AddData(0x18); // version ID (??)
|
||||
break;
|
||||
default:
|
||||
LOG(LOG_SB,LOG_NORMAL)("DSP Unhandled SB16ASP command %X sub %X",sb.dsp.cmd,sb.dsp.in.data[0]);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
LOG(LOG_SB,LOG_NORMAL)("DSP Unhandled SB16ASP command %X sub %X",sb.dsp.cmd,sb.dsp.in.data[0]);
|
||||
}
|
||||
break;
|
||||
case 0x0e: /* SB16 ASP set register */
|
||||
if (sb.type == SBT_16) {
|
||||
// LOG(LOG_SB,LOG_NORMAL)("SB16 ASP set register %X := %X",sb.dsp.in.data[0],sb.dsp.in.data[1]);
|
||||
ASP_regs[sb.dsp.in.data[0]] = sb.dsp.in.data[1];
|
||||
} else {
|
||||
LOG(LOG_SB,LOG_NORMAL)("DSP Unhandled SB16ASP command %X (set register)",sb.dsp.cmd);
|
||||
}
|
||||
break;
|
||||
case 0x0f: /* SB16 ASP get register */
|
||||
if (sb.type == SBT_16) {
|
||||
if ((ASP_init_in_progress) && (sb.dsp.in.data[0]==0x83)) {
|
||||
ASP_regs[0x83] = ~ASP_regs[0x83];
|
||||
}
|
||||
// LOG(LOG_SB,LOG_NORMAL)("SB16 ASP get register %X == %X",sb.dsp.in.data[0],ASP_regs[sb.dsp.in.data[0]]);
|
||||
DSP_AddData(ASP_regs[sb.dsp.in.data[0]]);
|
||||
} else {
|
||||
LOG(LOG_SB,LOG_NORMAL)("DSP Unhandled SB16ASP command %X (get register)",sb.dsp.cmd);
|
||||
}
|
||||
break;
|
||||
case 0x10: /* Direct DAC */
|
||||
DSP_ChangeMode(MODE_DAC);
|
||||
|
@ -893,11 +966,45 @@ static void DSP_DoCommand(void) {
|
|||
case 0xa0: case 0xa8: /* Documented only for DSP 3.x */
|
||||
LOG(LOG_SB,LOG_ERROR)("DSP:Unimplemented input command %2X",sb.dsp.cmd);
|
||||
break;
|
||||
case 0x0f: /* SB16 ASP get register */
|
||||
DSP_AddData(0xff); //Fall through
|
||||
case 0x0e: /* SB16 ASP Command ? */
|
||||
case 0x05: /* SB16 ASP set register */
|
||||
LOG(LOG_SB,LOG_NORMAL)("DSP Unhandled SB16ASP command %X",sb.dsp.cmd);
|
||||
case 0xf9: /* SB16 ASP ??? */
|
||||
if (sb.type == SBT_16) {
|
||||
LOG(LOG_SB,LOG_NORMAL)("SB16 ASP unknown function %x",sb.dsp.in.data[0]);
|
||||
// just feed it what it expects
|
||||
switch (sb.dsp.in.data[0]) {
|
||||
case 0x0b:
|
||||
DSP_AddData(0x00);
|
||||
break;
|
||||
case 0x0e:
|
||||
DSP_AddData(0xff);
|
||||
break;
|
||||
case 0x0f:
|
||||
DSP_AddData(0x07);
|
||||
break;
|
||||
case 0x23:
|
||||
DSP_AddData(0x00);
|
||||
break;
|
||||
case 0x24:
|
||||
DSP_AddData(0x00);
|
||||
break;
|
||||
case 0x2b:
|
||||
DSP_AddData(0x00);
|
||||
break;
|
||||
case 0x2c:
|
||||
DSP_AddData(0x00);
|
||||
break;
|
||||
case 0x2d:
|
||||
DSP_AddData(0x00);
|
||||
break;
|
||||
case 0x37:
|
||||
DSP_AddData(0x38);
|
||||
break;
|
||||
default:
|
||||
DSP_AddData(0x00);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
LOG(LOG_SB,LOG_NORMAL)("SB16 ASP unknown function %X",sb.dsp.cmd);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
LOG(LOG_SB,LOG_ERROR)("DSP:Unhandled (undocumented) command %2X",sb.dsp.cmd);
|
||||
|
@ -912,7 +1019,8 @@ static void DSP_DoWrite(Bit8u val) {
|
|||
switch (sb.dsp.cmd) {
|
||||
case DSP_NO_COMMAND:
|
||||
sb.dsp.cmd=val;
|
||||
sb.dsp.cmd_len=DSP_cmd_len[val];
|
||||
if (sb.type == SBT_16) sb.dsp.cmd_len=DSP_cmd_len_sb16[val];
|
||||
else sb.dsp.cmd_len=DSP_cmd_len_sb[val];
|
||||
sb.dsp.in.pos=0;
|
||||
if (!sb.dsp.cmd_len) DSP_DoCommand();
|
||||
break;
|
||||
|
@ -1382,6 +1490,9 @@ public:
|
|||
ReadHandler[i].Install(sb.hw.base+i,read_sb,IO_MB);
|
||||
WriteHandler[i].Install(sb.hw.base+i,write_sb,IO_MB);
|
||||
}
|
||||
for (i=0;i<256;i++) ASP_regs[i] = 0;
|
||||
ASP_regs[5] = 0x01;
|
||||
ASP_regs[9] = 0xf8;
|
||||
DSP_Reset();
|
||||
CTMIXER_Reset();
|
||||
// The documentation does not specify if SB gets initialized with the speaker enabled
|
||||
|
|
Loading…
Add table
Reference in a new issue