Fix bug in command length override; fix some other stuff; logging galore

This commit is contained in:
Kagamiin~
2024-03-08 12:13:09 -03:00
parent c76ada30b7
commit d3aa111ba3
2 changed files with 71 additions and 11 deletions

View File

@@ -335,7 +335,10 @@ ess_mixer_read(uint16_t addr, void *priv)
return mixer->regs[mixer->index]; return mixer->regs[mixer->index];
case 0x40: case 0x40:
if (0)
{ {
// not on ES1688
uint8_t val = mixer->ess_id_str[mixer->ess_id_str_pos]; uint8_t val = mixer->ess_id_str[mixer->ess_id_str_pos];
uint8_t pos_log = mixer->ess_id_str_pos; /* TODO remove */ uint8_t pos_log = mixer->ess_id_str_pos; /* TODO remove */
mixer->ess_id_str_pos++; mixer->ess_id_str_pos++;
@@ -344,6 +347,11 @@ ess_mixer_read(uint16_t addr, void *priv)
pclog("ess: ID READ: %02X (pos %d)\n", val, pos_log); pclog("ess: ID READ: %02X (pos %d)\n", val, pos_log);
return val; return val;
} }
else
{
pclog("ess: Mixer Register READ: %02X\t%02X\n", mixer->index, mixer->regs[mixer->index]);
return mixer->regs[mixer->index];
}
default: default:
pclog("ess: Unknown mixer register READ: %02X\t%02X\n", mixer->index, mixer->regs[mixer->index]); pclog("ess: Unknown mixer register READ: %02X\t%02X\n", mixer->index, mixer->regs[mixer->index]);

View File

@@ -228,8 +228,11 @@ sb_update_status(sb_dsp_t *dsp, int bit, int set)
/* TODO: Investigate real hardware for this (the ES1887 datasheet documents this bit somewhat oddly.) */ /* TODO: Investigate real hardware for this (the ES1887 datasheet documents this bit somewhat oddly.) */
if (dsp->ess_playback_mode && bit <= 1 && set && !masked) { if (dsp->ess_playback_mode && bit <= 1 && set && !masked) {
if (!(ESSreg(0xB1) & 0x40)) // if ESS playback, and IRQ disabled, do not fire if (!(ESSreg(0xB1) & 0x40)) // if ESS playback, and IRQ disabled, do not fire
{
pclog("ess: IRQ was masked");
return; return;
} }
}
if (set && !masked) if (set && !masked)
dsp->irq_update(dsp->irq_priv, 1); dsp->irq_update(dsp->irq_priv, 1);
@@ -240,6 +243,7 @@ sb_update_status(sb_dsp_t *dsp, int bit, int set)
void void
sb_irq(sb_dsp_t *dsp, int irq8) sb_irq(sb_dsp_t *dsp, int irq8)
{ {
pclog("sb: IRQ raised\n");
sb_update_status(dsp, !irq8, 1); sb_update_status(dsp, !irq8, 1);
} }
@@ -330,6 +334,9 @@ sb_doreset(sb_dsp_t *dsp)
dsp->sb_asp_regs[5] = 0x01; dsp->sb_asp_regs[5] = 0x01;
dsp->sb_asp_regs[9] = 0xf8; dsp->sb_asp_regs[9] = 0xf8;
/* Initialize ESS registers */
ESSreg(0xA5) = 0xf8;
} }
void void
@@ -596,7 +603,6 @@ sb_ess_update_irq_drq_readback_regs(sb_dsp_t *dsp, bool legacy)
case 7: t |= 0xA; break; case 7: t |= 0xA; break;
case 10: t |= 0xF; break; case 10: t |= 0xF; break;
} }
pclog("ESSreg 0xB1 was %02X, irqnum is %d, t is %02X; new 0xB1 is %02X\n", ESSreg(0xB1), dsp->sb_irqnum, t, (ESSreg(0xB1) & 0xF0) | t);
ESSreg(0xB1) = (ESSreg(0xB1) & 0xF0) | t; ESSreg(0xB1) = (ESSreg(0xB1) & 0xF0) | t;
/* DRQ control */ /* DRQ control */
@@ -704,11 +710,16 @@ static void sb_ess_write_reg(sb_dsp_t *dsp, uint8_t reg, uint8_t data)
switch (reg) { switch (reg) {
case 0xA1: /* Extended Mode Sample Rate Generator */ case 0xA1: /* Extended Mode Sample Rate Generator */
{ {
double temp;
ESSreg(reg) = data; ESSreg(reg) = data;
if (data & 0x80) if (data & 0x80)
dsp->sb_freq = 795500UL / (256ul - data); dsp->sb_freq = 795500UL / (256ul - data);
else else
dsp->sb_freq = 397700UL / (128ul - data); dsp->sb_freq = 397700UL / (128ul - data);
temp = 1000000.0 / dsp->sb_freq;
dsp->sblatchi = dsp->sblatcho = TIMER_USEC * temp;
dsp->sb_timei = dsp->sb_timeo;
pclog("ess: Sample rate - %ihz (%f)\n", dsp->sb_freq, dsp->sblatcho);
break; break;
} }
@@ -720,6 +731,7 @@ static void sb_ess_write_reg(sb_dsp_t *dsp, uint8_t reg, uint8_t data)
case 0xA5: /* DMA Transfer Count Reload (high) */ case 0xA5: /* DMA Transfer Count Reload (high) */
ESSreg(reg) = data; ESSreg(reg) = data;
sb_ess_update_autolen(dsp); sb_ess_update_autolen(dsp);
pclog("ess: DMA Transfer Count Reload length set to %d samples\n", sb_ess_get_dma_len(dsp));
if ((dsp->sb_16_length < 0 && !dsp->sb_16_enable) && (dsp->sb_8_length < 0 && !dsp->sb_8_enable)) if ((dsp->sb_16_length < 0 && !dsp->sb_16_enable) && (dsp->sb_8_length < 0 && !dsp->sb_8_enable))
dsp->ess_reload_len = 1; dsp->ess_reload_len = 1;
break; break;
@@ -855,6 +867,7 @@ static void sb_ess_write_reg(sb_dsp_t *dsp, uint8_t reg, uint8_t data)
break; break;
default: default:
pclog("UNKNOWN ESS register write reg=%02xh val=%02xh\n",reg,data);
break; break;
} }
} }
@@ -870,8 +883,21 @@ sb_exec_command(sb_dsp_t *dsp)
/* Update 8051 ram with the current DSP command. /* Update 8051 ram with the current DSP command.
See https://github.com/joncampbell123/dosbox-x/issues/1044 */ See https://github.com/joncampbell123/dosbox-x/issues/1044 */
if (dsp->sb_type >= SB16) if (dsp->sb_type >= SB16)
{
dsp->sb_8051_ram[0x20] = dsp->sb_command; dsp->sb_8051_ram[0x20] = dsp->sb_command;
pclog("dsp->sb_command = 0x%X\n", dsp->sb_command); }
{
int i;
char data_s[256];
data_s[0] = '\0';
for (i = 0; i < sb_commands[dsp->sb_command]; i++)
{
snprintf(data_s, 256, " 0x%02X", dsp->sb_data[i]);
}
pclog("dsp->sb_command = 0x%02X%s, length %d\n", dsp->sb_command, data_s, sb_commands[dsp->sb_command]);
}
if (IS_ESS(dsp) && dsp->sb_command >= 0xA0 && dsp->sb_command <= 0xCF) { if (IS_ESS(dsp) && dsp->sb_command >= 0xA0 && dsp->sb_command <= 0xCF) {
if (dsp->sb_command == 0xC6 || dsp->sb_command == 0xC7) { if (dsp->sb_command == 0xC6 || dsp->sb_command == 0xC7) {
@@ -1083,7 +1109,8 @@ sb_exec_command(sb_dsp_t *dsp)
dsp->sblatcho = dsp->sblatchi = TIMER_USEC * (256 - dsp->sb_data[0]); dsp->sblatcho = dsp->sblatchi = TIMER_USEC * (256 - dsp->sb_data[0]);
temp = 256 - dsp->sb_data[0]; temp = 256 - dsp->sb_data[0];
temp = 1000000 / temp; temp = 1000000 / temp;
sb_dsp_log("Sample rate - %ihz (%i)\n", temp, dsp->sblatcho); sb_dsp_log("Sample rate - %ihz (%f)\n", temp, dsp->sblatcho);
pclog("Sample rate - %ihz (%f)\n", temp, dsp->sblatcho);
if ((dsp->sb_freq != temp) && (dsp->sb_type >= SB16)) if ((dsp->sb_freq != temp) && (dsp->sb_type >= SB16))
recalc_sb16_filter(0, temp); recalc_sb16_filter(0, temp);
dsp->sb_freq = temp; dsp->sb_freq = temp;
@@ -1095,7 +1122,8 @@ sb_exec_command(sb_dsp_t *dsp)
case 0x42: /* Set input sampling rate */ case 0x42: /* Set input sampling rate */
if (dsp->sb_type >= SB16) { if (dsp->sb_type >= SB16) {
dsp->sblatcho = (uint64_t) (TIMER_USEC * (1000000.0f / (float) (dsp->sb_data[1] + (dsp->sb_data[0] << 8)))); dsp->sblatcho = (uint64_t) (TIMER_USEC * (1000000.0f / (float) (dsp->sb_data[1] + (dsp->sb_data[0] << 8))));
sb_dsp_log("Sample rate - %ihz (%i)\n", dsp->sb_data[1] + (dsp->sb_data[0] << 8), dsp->sblatcho); sb_dsp_log("Sample rate - %ihz (%f)\n", dsp->sb_data[1] + (dsp->sb_data[0] << 8), dsp->sblatcho);
pclog("Sample rate - %ihz (%f)\n", dsp->sb_data[1] + (dsp->sb_data[0] << 8), dsp->sblatcho);
temp = dsp->sb_freq; temp = dsp->sb_freq;
dsp->sb_freq = dsp->sb_data[1] + (dsp->sb_data[0] << 8); dsp->sb_freq = dsp->sb_data[1] + (dsp->sb_data[0] << 8);
dsp->sb_timeo = 256LL + dsp->sb_freq; dsp->sb_timeo = 256LL + dsp->sb_freq;
@@ -1396,6 +1424,8 @@ sb_write(uint16_t a, uint8_t v, void *priv)
if (dsp->sb_type < SB16 && (!IS_ESS(dsp) || (IS_ESS(dsp) && ((a & 0xF) != 0xE)))) if (dsp->sb_type < SB16 && (!IS_ESS(dsp) || (IS_ESS(dsp) && ((a & 0xF) != 0xE))))
a &= 0xfffe; a &= 0xfffe;
//pclog("sb: port write %03x %02x\n", a, v);
switch (a & 0xF) { switch (a & 0xF) {
case 6: /* Reset */ case 6: /* Reset */
if (!dsp->uart_midi) { if (!dsp->uart_midi) {
@@ -1428,8 +1458,6 @@ sb_write(uint16_t a, uint8_t v, void *priv)
if (v == 0x01) if (v == 0x01)
sb_add_data(dsp, 0); sb_add_data(dsp, 0);
dsp->sb_data_stat++; dsp->sb_data_stat++;
} else {
dsp->sb_data[dsp->sb_data_stat++] = v;
if (IS_AZTECH(dsp)) { if (IS_AZTECH(dsp)) {
/* variable length commands */ /* variable length commands */
if (dsp->sb_command == 0x08 && dsp->sb_data_stat == 1 && dsp->sb_data[0] == 0x08) if (dsp->sb_command == 0x08 && dsp->sb_data_stat == 1 && dsp->sb_data[0] == 0x08)
@@ -1444,6 +1472,8 @@ sb_write(uint16_t a, uint8_t v, void *priv)
sb_commands[dsp->sb_command] = -1; sb_commands[dsp->sb_command] = -1;
} }
} }
} else {
dsp->sb_data[dsp->sb_data_stat++] = v;
} }
if (dsp->sb_data_stat == sb_commands[dsp->sb_command] || sb_commands[dsp->sb_command] == -1) { if (dsp->sb_data_stat == sb_commands[dsp->sb_command] || sb_commands[dsp->sb_command] == -1) {
sb_exec_command(dsp); sb_exec_command(dsp);
@@ -1469,7 +1499,13 @@ sb_read(uint16_t a, void *priv)
/* Sound Blasters prior to Sound Blaster 16 alias the I/O ports. */ /* Sound Blasters prior to Sound Blaster 16 alias the I/O ports. */
if (dsp->sb_type < SB16) if (dsp->sb_type < SB16)
{
/* Exception: ESS AudioDrive does not alias port base+0xf */
if (!IS_ESS(dsp) || !((a & 0xF) == 0xF))
{
a &= 0xfffe; a &= 0xfffe;
}
}
switch (a & 0xf) { switch (a & 0xf) {
case 0xA: /* Read data */ case 0xA: /* Read data */
@@ -1509,6 +1545,10 @@ sb_read(uint16_t a, void *priv)
break; break;
case 0xE: /* Read data ready */ case 0xE: /* Read data ready */
dsp->irq_update(dsp->irq_priv, 0); dsp->irq_update(dsp->irq_priv, 0);
if (dsp->sb_irq8 || dsp->sb_irq16)
{
pclog("sb: IRQ acknowledged\n");
}
dsp->sb_irq8 = dsp->sb_irq16 = 0; dsp->sb_irq8 = dsp->sb_irq16 = 0;
/* Only bit 7 is defined but aztech diagnostics fail if the others are set. Keep the original behavior to not interfere with what's already working. */ /* Only bit 7 is defined but aztech diagnostics fail if the others are set. Keep the original behavior to not interfere with what's already working. */
if (IS_AZTECH(dsp)) { if (IS_AZTECH(dsp)) {
@@ -1520,10 +1560,17 @@ sb_read(uint16_t a, void *priv)
} }
break; break;
case 0xF: /* 16-bit ack */ case 0xF: /* 16-bit ack */
if (!IS_ESS(dsp))
{
if (dsp->sb_irq16)
{
pclog("sb: 16-bit IRQ acknowledged");
}
dsp->sb_irq16 = 0; dsp->sb_irq16 = 0;
if (!dsp->sb_irq8) if (!dsp->sb_irq8)
dsp->irq_update(dsp->irq_priv, 0); dsp->irq_update(dsp->irq_priv, 0);
sb_dsp_log("SB 16-bit ACK read 0xFF\n"); sb_dsp_log("SB 16-bit ACK read 0xFF\n");
}
ret = 0xff; ret = 0xff;
break; break;
@@ -1531,6 +1578,8 @@ sb_read(uint16_t a, void *priv)
break; break;
} }
//pclog("sb: port read %03x %02x\n", a, ret);
return ret; return ret;
} }
@@ -1634,6 +1683,7 @@ sb_dsp_init(sb_dsp_t *dsp, int type, int subtype, void *parent)
dsp->sb_8051_ram[0x37] = 0x38; dsp->sb_8051_ram[0x37] = 0x38;
memset(dsp->sb_asp_ram, 0xff, sizeof(dsp->sb_asp_ram)); memset(dsp->sb_asp_ram, 0xff, sizeof(dsp->sb_asp_ram));
} }
void void
@@ -1692,6 +1742,7 @@ sb_ess_finish_dma(sb_dsp_t *dsp)
return; return;
ESSreg(0xB8) &= ~0x01; ESSreg(0xB8) &= ~0x01;
dma_set_drq(dsp->sb_8_dmanum, 0); dma_set_drq(dsp->sb_8_dmanum, 0);
pclog("ess: DMA finished");
} }
void void
@@ -1886,6 +1937,7 @@ pollsb(void *priv)
break; break;
} }
if (dsp->sb_8_length < 0) { if (dsp->sb_8_length < 0) {
if (dsp->sb_8_autoinit) if (dsp->sb_8_autoinit)
dsp->sb_8_length = dsp->sb_8_origlength = dsp->sb_8_autolen; dsp->sb_8_length = dsp->sb_8_origlength = dsp->sb_8_autolen;