The SCSI data buffer is now zeroed before being allocated, MODE SELECT data is therefore no longer lost in transit;

SCSI DMA writes (for MODE SELECT) now correctly use InitLength instead of request_length when bus type is SCSI;
Fixed MODE SELECT page saving;
CD Audio volume is now correctly initialized on card initialization for all Sound Blaster variants, fixes CD Audio being muted when booting without the Sound Blaster initialization program;
Brought the Sound Blaster variants back to a sane sound volume but still louder than the old quietness;
Moved SCSI adapter initialization to before sound card initialization, fixes DOS SCSI CD-ROM driver hangs under some conditions.
This commit is contained in:
OBattler
2017-02-04 06:53:46 +01:00
parent 3c61b80a34
commit 22c3a74e3b
6 changed files with 105 additions and 54 deletions

View File

@@ -1724,8 +1724,6 @@ static void BuslogicCDROMCommand(Buslogic_t *Buslogic)
temp_cdb[1] &= 0x1f; /* Make sure the LUN field of the temporary CDB is always 0, otherwise Daemon Tools drives will misehave when a command is passed through to them. */ temp_cdb[1] &= 0x1f; /* Make sure the LUN field of the temporary CDB is always 0, otherwise Daemon Tools drives will misehave when a command is passed through to them. */
} }
memset(SCSIDevices[Id][Lun].CmdBuffer, 0, 390144);
//Finally, execute the SCSI command immediately and get the transfer length. //Finally, execute the SCSI command immediately and get the transfer length.
SCSIPhase = SCSI_PHASE_COMMAND; SCSIPhase = SCSI_PHASE_COMMAND;
@@ -1808,6 +1806,9 @@ static int BuslogicSCSIRequestSetup(Buslogic_t *Buslogic, uint32_t CCBPointer, M
SCSIDevices[Id][Lun].InitLength = 0; SCSIDevices[Id][Lun].InitLength = 0;
/* Do this here, so MODE SELECT data will does not get lost in transit. */
memset(SCSIDevices[Id][Lun].CmdBuffer, 0, 390144);
BuslogicDataBufferAllocate(BuslogicRequests, BuslogicRequests->Is24bit); BuslogicDataBufferAllocate(BuslogicRequests, BuslogicRequests->Is24bit);
if (!buslogic_scsi_drive_is_cdrom(Id, Lun)) if (!buslogic_scsi_drive_is_cdrom(Id, Lun))

View File

@@ -532,10 +532,6 @@ int cdrom_mode_select_terminate(uint8_t id, int force)
if (((cdrom[id].written_length >= cdrom[id].total_length) || force) && (cdrom[id].mode_select_phase != MODE_SELECT_PHASE_IDLE)) if (((cdrom[id].written_length >= cdrom[id].total_length) || force) && (cdrom[id].mode_select_phase != MODE_SELECT_PHASE_IDLE))
{ {
cdrom_log("CD-ROM %i: MODE SELECT terminate: %i\n", id, force); cdrom_log("CD-ROM %i: MODE SELECT terminate: %i\n", id, force);
if (!force && cdrom[id].do_page_save && (cdrom_mode_sense_pages_default[id][cdrom[id].current_page_pos][0] & 0x80))
{
cdrom_mode_sense_save(id);
}
cdrom[id].current_page_pos = cdrom[id].current_page_len = cdrom[id].block_descriptor_len = 0; cdrom[id].current_page_pos = cdrom[id].current_page_len = cdrom[id].block_descriptor_len = 0;
cdrom[id].total_length = cdrom[id].written_length = 0; cdrom[id].total_length = cdrom[id].written_length = 0;
cdrom[id].mode_select_phase = MODE_SELECT_PHASE_IDLE; cdrom[id].mode_select_phase = MODE_SELECT_PHASE_IDLE;
@@ -707,6 +703,14 @@ int cdrom_mode_select_write(uint8_t id, uint8_t val)
case MODE_SELECT_PHASE_PAGE: case MODE_SELECT_PHASE_PAGE:
cdrom_log("CD-ROM %i: MODE SELECT page (%02X)\n", id, val); cdrom_log("CD-ROM %i: MODE SELECT page (%02X)\n", id, val);
ret = cdrom_mode_select_page(id, val); ret = cdrom_mode_select_page(id, val);
if (cdrom[id].mode_select_phase == MODE_SELECT_PHASE_PAGE_HEADER)
{
if (cdrom[id].do_page_save && (cdrom_mode_sense_pages_default[id][cdrom[id].current_page_code][0] & 0x80))
{
cdrom_log("CD-ROM %i: Page %i finished, saving it...\n", id, cdrom[id].current_page_code);
cdrom_mode_sense_save(id);
}
}
break; break;
default: default:
cdrom_log("CD-ROM %i: MODE SELECT unknown phase (%02X)\n", id, val); cdrom_log("CD-ROM %i: MODE SELECT unknown phase (%02X)\n", id, val);
@@ -1791,13 +1795,13 @@ void cdrom_command(uint8_t id, uint8_t *cdb)
cdrom_log("CD-ROM %i: Command 0x%02X, Sense Key %02X, Asc %02X, Ascq %02X, %i, Unit attention: %i\n", id, cdb[0], cdrom_sense_key, cdrom_asc, cdrom_ascq, ins, cdrom[id].unit_attention); cdrom_log("CD-ROM %i: Command 0x%02X, Sense Key %02X, Asc %02X, Ascq %02X, %i, Unit attention: %i\n", id, cdb[0], cdrom_sense_key, cdrom_asc, cdrom_ascq, ins, cdrom[id].unit_attention);
cdrom_log("CD-ROM %i: Request length: %04X\n", id, cdrom[id].request_length); cdrom_log("CD-ROM %i: Request length: %04X\n", id, cdrom[id].request_length);
#if 0 // #if 0
int CdbLength; int CdbLength;
for (CdbLength = 1; CdbLength < cdrom[id].cdb_len; CdbLength++) for (CdbLength = 1; CdbLength < cdrom[id].cdb_len; CdbLength++)
{ {
cdrom_log("CD-ROM %i: CDB[%d] = 0x%02X\n", id, CdbLength, cdb[CdbLength]); cdrom_log("CD-ROM %i: CDB[%d] = 0x%02X\n", id, CdbLength, cdb[CdbLength]);
} }
#endif // #endif
} }
msf = cdb[1] & 2; msf = cdb[1] & 2;
@@ -2899,6 +2903,8 @@ int cdrom_read_from_dma(uint8_t id)
int i = 0; int i = 0;
int ret = 0; int ret = 0;
int in_data_length = 0;
if (cdrom_drives[id].bus_type) if (cdrom_drives[id].bus_type)
{ {
ret = cdrom_read_from_scsi_dma(cdrom_drives[id].scsi_device_id, cdrom_drives[id].scsi_device_lun); ret = cdrom_read_from_scsi_dma(cdrom_drives[id].scsi_device_id, cdrom_drives[id].scsi_device_lun);
@@ -2913,7 +2919,18 @@ int cdrom_read_from_dma(uint8_t id)
return 0; return 0;
} }
for (i = 0; i < cdrom[id].request_length; i++) if (cdrom_drives[id].bus_type)
{
in_data_length = SCSIDevices[cdrom_drives[id].scsi_device_id][cdrom_drives[id].scsi_device_lun].InitLength;
cdrom_log("CD-ROM %i: SCSI Input data length: %i\n", id, in_data_length);
}
else
{
in_data_length = cdrom[id].request_length;
cdrom_log("CD-ROM %i: ATAPI Input data length: %i\n", id, in_data_length);
}
for (i = 0; i < in_data_length; i++)
{ {
ret = cdrom_mode_select_write(id, cdbufferb[i]); ret = cdrom_mode_select_write(id, cdbufferb[i]);
ret = cdrom_mode_select_return(id, ret); ret = cdrom_mode_select_return(id, ret);

View File

@@ -122,7 +122,7 @@ void gameport_write(uint16_t addr, uint8_t val, void *p)
timer_clock(); timer_clock();
gameport->state |= 0x0f; gameport->state |= 0x0f;
// pclog("gameport_write : joysticks_present=%i\n", joysticks_present); pclog("gameport_write : joysticks_present=%i\n", joysticks_present);
gameport->axis[0].count = gameport_time(gameport->joystick->read_axis(gameport->joystick_dat, 0)); gameport->axis[0].count = gameport_time(gameport->joystick->read_axis(gameport->joystick_dat, 0));
gameport->axis[1].count = gameport_time(gameport->joystick->read_axis(gameport->joystick_dat, 1)); gameport->axis[1].count = gameport_time(gameport->joystick->read_axis(gameport->joystick_dat, 1));
@@ -145,7 +145,7 @@ uint8_t gameport_read(uint16_t addr, void *p)
// else // else
// ret = 0xff; // ret = 0xff;
// pclog("gameport_read: ret=%02x %08x:%08x isa_cycles=%i %i\n", ret, cs, cpu_state.pc, isa_cycles, gameport->axis[0].count); // pclog("gameport_read: ret=%02x %08x:%08x isa_cycles=%i %i\n", ret, cs, cpu_state.pc, isa_cycles, gameport->axis[0].count);
cycles -= ISA_CYCLES(8); cycles -= ISA_CYCLES(8);

View File

@@ -443,17 +443,6 @@ void resetpchard()
} }
network_card_init(network_card_current); network_card_init(network_card_current);
sound_card_init(sound_card_current);
if (GUS)
device_add(&gus_device);
if (GAMEBLASTER)
device_add(&cms_device);
if (SSI2001)
device_add(&ssi2001_device);
if (voodoo_enabled)
device_add(&voodoo_device);
pc_reset();
for (i = 0; i < CDROM_NUM; i++) for (i = 0; i < CDROM_NUM; i++)
{ {
if (cdrom_drives[i].bus_type) if (cdrom_drives[i].bus_type)
@@ -468,6 +457,17 @@ void resetpchard()
device_add(&BuslogicDevice); device_add(&BuslogicDevice);
} }
sound_card_init(sound_card_current);
if (GUS)
device_add(&gus_device);
if (GAMEBLASTER)
device_add(&cms_device);
if (SSI2001)
device_add(&ssi2001_device);
if (voodoo_enabled)
device_add(&voodoo_device);
pc_reset();
loadnvr(); loadnvr();
// cpuspeed2 = (AT)?2:1; // cpuspeed2 = (AT)?2:1;

View File

@@ -164,9 +164,11 @@ static void sound_cd_thread(void *param)
/* Then, adjust input from drive according to ATAPI/SCSI volume. */ /* Then, adjust input from drive according to ATAPI/SCSI volume. */
cd_buffer_temp[0] *= (float) audio_vol_l; cd_buffer_temp[0] *= (float) audio_vol_l;
cd_buffer_temp[0] /= 255.0; // cd_buffer_temp[0] /= 255.0;
cd_buffer_temp[0] /= 511.0;
cd_buffer_temp[1] *= (float) audio_vol_r; cd_buffer_temp[1] *= (float) audio_vol_r;
cd_buffer_temp[1] /= 255.0; // cd_buffer_temp[1] /= 255.0;
cd_buffer_temp[1] /= 511.0;
/*Apply ATAPI channel select*/ /*Apply ATAPI channel select*/
cd_buffer_temp2[0] = cd_buffer_temp2[1] = 0.0; cd_buffer_temp2[0] = cd_buffer_temp2[1] = 0.0;
@@ -229,11 +231,13 @@ void sound_init()
if (available_cdrom_drives) if (available_cdrom_drives)
{ {
// pclog("One or more CD-ROM drives are available, starting CD Audio thread...\n");
sound_cd_event = thread_create_event(); sound_cd_event = thread_create_event();
sound_cd_thread_h = thread_create(sound_cd_thread, NULL); sound_cd_thread_h = thread_create(sound_cd_thread, NULL);
} }
cd_thread_enable = available_cdrom_drives ? 1 : 0; cd_thread_enable = available_cdrom_drives ? 1 : 0;
// pclog("cd_thread_enable = %i\n", cd_thread_enable);
} }
void sound_add_handler(void (*get_buffer)(int32_t *buffer, int len, void *p), void *p) void sound_add_handler(void (*get_buffer)(int32_t *buffer, int len, void *p), void *p)
@@ -333,11 +337,13 @@ void sound_cd_thread_reset()
if (available_cdrom_drives && !cd_thread_enable) if (available_cdrom_drives && !cd_thread_enable)
{ {
// pclog("One or more CD-ROM drives are now available, but none was before, starting the CD Audio thread...\n");
sound_cd_event = thread_create_event(); sound_cd_event = thread_create_event();
sound_cd_thread_h = thread_create(sound_cd_thread, NULL); sound_cd_thread_h = thread_create(sound_cd_thread, NULL);
} }
else if (!available_cdrom_drives && cd_thread_enable) else if (!available_cdrom_drives && cd_thread_enable)
{ {
// pclog("No CD-ROM drives are now available, but one or more was before, killing the CD Audio thread...\n");
thread_destroy_event(sound_cd_event); thread_destroy_event(sound_cd_event);
thread_kill(sound_cd_thread_h); thread_kill(sound_cd_thread_h);
sound_cd_thread_h = NULL; sound_cd_thread_h = NULL;

View File

@@ -54,22 +54,22 @@ static void sb_get_buffer_opl2(int32_t *buffer, int len, void *p)
{ {
int32_t out_l, out_r; int32_t out_l, out_r;
out_l = ((sb->opl.buffer[c] * mixer->fm_l) >> 13); out_l = ((sb->opl.buffer[c] * mixer->fm_l) >> 16);
out_r = ((sb->opl.buffer[c + 1] * mixer->fm_r) >> 13); out_r = ((sb->opl.buffer[c + 1] * mixer->fm_r) >> 16);
if (sb->mixer.filter) if (sb->mixer.filter)
{ {
out_l += (int)(((sb_iir(0, (float)sb->dsp.buffer[c]) / 1.3) * mixer->voice_l) / 3) >> 13; out_l += (int)(((sb_iir(0, (float)sb->dsp.buffer[c]) / 1.3) * mixer->voice_l) / 3) >> 16;
out_r += (int)(((sb_iir(1, (float)sb->dsp.buffer[c + 1]) / 1.3) * mixer->voice_r) / 3) >> 13; out_r += (int)(((sb_iir(1, (float)sb->dsp.buffer[c + 1]) / 1.3) * mixer->voice_r) / 3) >> 16;
} }
else else
{ {
out_l += ((int32_t)(sb->dsp.buffer[c] * mixer->voice_l) / 3) >> 13; out_l += ((int32_t)(sb->dsp.buffer[c] * mixer->voice_l) / 3) >> 16;
out_r += ((int32_t)(sb->dsp.buffer[c + 1] * mixer->voice_r) / 3) >> 13; out_r += ((int32_t)(sb->dsp.buffer[c + 1] * mixer->voice_r) / 3) >> 16;
} }
out_l = (out_l * mixer->master_l) >> 13; out_l = (out_l * mixer->master_l) >> 15;
out_r = (out_r * mixer->master_r) >> 13; out_r = (out_r * mixer->master_r) >> 15;
if (mixer->bass_l != 8 || mixer->bass_r != 8 || mixer->treble_l != 8 || mixer->treble_r != 8) if (mixer->bass_l != 8 || mixer->bass_r != 8 || mixer->treble_l != 8 || mixer->treble_r != 8)
{ {
@@ -106,22 +106,22 @@ static void sb_get_buffer_opl3(int32_t *buffer, int len, void *p)
// int c_emu8k = (((c/2) * 44100) / 48000)*2; // int c_emu8k = (((c/2) * 44100) / 48000)*2;
int32_t out_l, out_r; int32_t out_l, out_r;
out_l = ((sb->opl.buffer[c] * mixer->fm_l) >> 13); out_l = ((sb->opl.buffer[c] * mixer->fm_l) >> 16);
out_r = ((sb->opl.buffer[c + 1] * mixer->fm_r) >> 13); out_r = ((sb->opl.buffer[c + 1] * mixer->fm_r) >> 16);
if (sb->mixer.filter) if (sb->mixer.filter)
{ {
out_l += (int)(((sb_iir(0, (float)sb->dsp.buffer[c]) / 1.3) * mixer->voice_l) / 3) >> 13; out_l += (int)(((sb_iir(0, (float)sb->dsp.buffer[c]) / 1.3) * mixer->voice_l) / 3) >> 16;
out_r += (int)(((sb_iir(1, (float)sb->dsp.buffer[c + 1]) / 1.3) * mixer->voice_r) / 3) >> 13; out_r += (int)(((sb_iir(1, (float)sb->dsp.buffer[c + 1]) / 1.3) * mixer->voice_r) / 3) >> 16;
} }
else else
{ {
out_l += ((int32_t)(sb->dsp.buffer[c] * mixer->voice_l) / 3) >> 13; out_l += ((int32_t)(sb->dsp.buffer[c] * mixer->voice_l) / 3) >> 16;
out_r += ((int32_t)(sb->dsp.buffer[c + 1] * mixer->voice_r) / 3) >> 13; out_r += ((int32_t)(sb->dsp.buffer[c + 1] * mixer->voice_r) / 3) >> 16;
} }
out_l = (out_l * mixer->master_l) >> 13; out_l = (out_l * mixer->master_l) >> 15;
out_r = (out_r * mixer->master_r) >> 13; out_r = (out_r * mixer->master_r) >> 15;
if (mixer->bass_l != 8 || mixer->bass_r != 8 || mixer->treble_l != 8 || mixer->treble_r != 8) if (mixer->bass_l != 8 || mixer->bass_r != 8 || mixer->treble_l != 8 || mixer->treble_r != 8)
{ {
@@ -160,25 +160,25 @@ static void sb_get_buffer_emu8k(int32_t *buffer, int len, void *p)
int c_emu8k = (((c/2) * 44100) / 48000)*2; int c_emu8k = (((c/2) * 44100) / 48000)*2;
int32_t out_l, out_r; int32_t out_l, out_r;
out_l = (((int32_t)sb->opl.buffer[c] * (int32_t)mixer->fm_l) >> 13); out_l = (((int32_t)sb->opl.buffer[c] * (int32_t)mixer->fm_l) >> 16);
out_r = (((int32_t)sb->opl.buffer[c + 1] * (int32_t)mixer->fm_r) >> 13); out_r = (((int32_t)sb->opl.buffer[c + 1] * (int32_t)mixer->fm_r) >> 16);
out_l += ((sb->emu8k.buffer[c_emu8k] * mixer->fm_l) >> 13); out_l += ((sb->emu8k.buffer[c_emu8k] * mixer->fm_l) >> 16);
out_r += ((sb->emu8k.buffer[c_emu8k + 1] * mixer->fm_l) >> 13); out_r += ((sb->emu8k.buffer[c_emu8k + 1] * mixer->fm_l) >> 16);
if (sb->mixer.filter) if (sb->mixer.filter)
{ {
out_l += (int)(((sb_iir(0, (float)sb->dsp.buffer[c]) / 1.3) * mixer->voice_l) / 3) >> 13; out_l += (int)(((sb_iir(0, (float)sb->dsp.buffer[c]) / 1.3) * mixer->voice_l) / 3) >> 16;
out_r += (int)(((sb_iir(1, (float)sb->dsp.buffer[c + 1]) / 1.3) * mixer->voice_r) / 3) >> 13; out_r += (int)(((sb_iir(1, (float)sb->dsp.buffer[c + 1]) / 1.3) * mixer->voice_r) / 3) >> 16;
} }
else else
{ {
out_l += ((int32_t)(sb->dsp.buffer[c] * mixer->voice_l) / 3) >> 13; out_l += ((int32_t)(sb->dsp.buffer[c] * mixer->voice_l) / 3) >> 16;
out_r += ((int32_t)(sb->dsp.buffer[c + 1] * mixer->voice_r) / 3) >> 13; out_r += ((int32_t)(sb->dsp.buffer[c + 1] * mixer->voice_r) / 3) >> 16;
} }
out_l = (out_l * mixer->master_l) >> 13; out_l = (out_l * mixer->master_l) >> 15;
out_r = (out_r * mixer->master_r) >> 13; out_r = (out_r * mixer->master_r) >> 15;
if (mixer->bass_l != 8 || mixer->bass_r != 8 || mixer->treble_l != 8 || mixer->treble_r != 8) if (mixer->bass_l != 8 || mixer->bass_r != 8 || mixer->treble_l != 8 || mixer->treble_r != 8)
{ {
@@ -224,8 +224,8 @@ void sb_pro_mixer_write(uint16_t addr, uint8_t val, void *p)
mixer->filter = !(mixer->regs[0xe] & 0x20); mixer->filter = !(mixer->regs[0xe] & 0x20);
mixer->bass_l = mixer->bass_r = 8; mixer->bass_l = mixer->bass_r = 8;
mixer->treble_l = mixer->treble_r = 8; mixer->treble_l = mixer->treble_r = 8;
sound_set_cd_volume(((uint32_t)mixer->master_l * (uint32_t)mixer->cd_l) / 8191, sound_set_cd_volume(((uint32_t)mixer->master_l * (uint32_t)mixer->cd_l) / 65535,
((uint32_t)mixer->master_r * (uint32_t)mixer->cd_r) / 8191); ((uint32_t)mixer->master_r * (uint32_t)mixer->cd_r) / 65535);
// pclog("%02X %02X %02X\n", mixer->regs[0x04], mixer->regs[0x22], mixer->regs[0x26]); // pclog("%02X %02X %02X\n", mixer->regs[0x04], mixer->regs[0x22], mixer->regs[0x26]);
// pclog("Mixer - %04X %04X %04X %04X %04X %04X\n", mixer->master_l, mixer->master_r, mixer->voice_l, mixer->voice_r, mixer->fm_l, mixer->fm_r); // pclog("Mixer - %04X %04X %04X %04X %04X %04X\n", mixer->master_l, mixer->master_r, mixer->voice_l, mixer->voice_r, mixer->fm_l, mixer->fm_r);
if (mixer->index == 0xe) if (mixer->index == 0xe)
@@ -299,8 +299,8 @@ void sb_16_mixer_write(uint16_t addr, uint8_t val, void *p)
mixer->treble_l = mixer->regs[0x44] >> 4; mixer->treble_l = mixer->regs[0x44] >> 4;
mixer->treble_r = mixer->regs[0x45] >> 4; mixer->treble_r = mixer->regs[0x45] >> 4;
mixer->filter = 0; mixer->filter = 0;
sound_set_cd_volume(((uint32_t)mixer->master_l * (uint32_t)mixer->cd_l) / 8191, sound_set_cd_volume(((uint32_t)mixer->master_l * (uint32_t)mixer->cd_l) / 65535,
((uint32_t)mixer->master_r * (uint32_t)mixer->cd_r) / 8191); ((uint32_t)mixer->master_r * (uint32_t)mixer->cd_r) / 65535);
// pclog("%02X %02X %02X %02X %02X %02X\n", mixer->regs[0x30], mixer->regs[0x31], mixer->regs[0x32], mixer->regs[0x33], mixer->regs[0x34], mixer->regs[0x35]); // pclog("%02X %02X %02X %02X %02X %02X\n", mixer->regs[0x30], mixer->regs[0x31], mixer->regs[0x32], mixer->regs[0x33], mixer->regs[0x34], mixer->regs[0x35]);
// pclog("Mixer - %04X %04X %04X %04X %04X %04X\n", mixer->master_l, mixer->master_r, mixer->voice_l, mixer->voice_r, mixer->fm_l, mixer->fm_r); // pclog("Mixer - %04X %04X %04X %04X %04X %04X\n", mixer->master_l, mixer->master_r, mixer->voice_l, mixer->voice_r, mixer->fm_l, mixer->fm_r);
} }
@@ -370,9 +370,12 @@ void sb_mixer_init(sb_mixer_t *mixer)
mixer->master_l = mixer->master_r = 65535; mixer->master_l = mixer->master_r = 65535;
mixer->voice_l = mixer->voice_r = 65535; mixer->voice_l = mixer->voice_r = 65535;
mixer->fm_l = mixer->fm_r = 65535; mixer->fm_l = mixer->fm_r = 65535;
mixer->cd_l = mixer->cd_r = 65535;
mixer->bass_l = mixer->bass_r = 8; mixer->bass_l = mixer->bass_r = 8;
mixer->treble_l = mixer->treble_r = 8; mixer->treble_l = mixer->treble_r = 8;
mixer->filter = 1; mixer->filter = 1;
sound_set_cd_volume(((uint32_t)mixer->master_l * (uint32_t)mixer->cd_l) / 65535,
((uint32_t)mixer->master_r * (uint32_t)mixer->cd_r) / 65535);
} }
void *sb_1_init() void *sb_1_init()
@@ -449,6 +452,7 @@ void *sb_pro_v1_init()
sb->mixer.regs[0x22] = 0xff; sb->mixer.regs[0x22] = 0xff;
sb->mixer.regs[0x04] = 0xff; sb->mixer.regs[0x04] = 0xff;
sb->mixer.regs[0x26] = 0xff; sb->mixer.regs[0x26] = 0xff;
sb->mixer.regs[0x28] = 0xff;
sb->mixer.regs[0xe] = 0; sb->mixer.regs[0xe] = 0;
return sb; return sb;
@@ -475,6 +479,7 @@ void *sb_pro_v2_init()
sb->mixer.regs[0x22] = 0xff; sb->mixer.regs[0x22] = 0xff;
sb->mixer.regs[0x04] = 0xff; sb->mixer.regs[0x04] = 0xff;
sb->mixer.regs[0x26] = 0xff; sb->mixer.regs[0x26] = 0xff;
sb->mixer.regs[0x28] = 0xff;
sb->mixer.regs[0xe] = 0; sb->mixer.regs[0xe] = 0;
return sb; return sb;
@@ -506,6 +511,8 @@ void *sb_16_init()
sb->mixer.regs[0x33] = 31 << 3; sb->mixer.regs[0x33] = 31 << 3;
sb->mixer.regs[0x34] = 31 << 3; sb->mixer.regs[0x34] = 31 << 3;
sb->mixer.regs[0x35] = 31 << 3; sb->mixer.regs[0x35] = 31 << 3;
sb->mixer.regs[0x36] = 31 << 3;
sb->mixer.regs[0x37] = 31 << 3;
sb->mixer.regs[0x44] = 8 << 4; sb->mixer.regs[0x44] = 8 << 4;
sb->mixer.regs[0x45] = 8 << 4; sb->mixer.regs[0x45] = 8 << 4;
sb->mixer.regs[0x46] = 8 << 4; sb->mixer.regs[0x46] = 8 << 4;
@@ -513,6 +520,7 @@ void *sb_16_init()
sb->mixer.regs[0x22] = (sb->mixer.regs[0x30] & 0xf0) | (sb->mixer.regs[0x31] >> 4); sb->mixer.regs[0x22] = (sb->mixer.regs[0x30] & 0xf0) | (sb->mixer.regs[0x31] >> 4);
sb->mixer.regs[0x04] = (sb->mixer.regs[0x32] & 0xf0) | (sb->mixer.regs[0x33] >> 4); sb->mixer.regs[0x04] = (sb->mixer.regs[0x32] & 0xf0) | (sb->mixer.regs[0x33] >> 4);
sb->mixer.regs[0x26] = (sb->mixer.regs[0x34] & 0xf0) | (sb->mixer.regs[0x35] >> 4); sb->mixer.regs[0x26] = (sb->mixer.regs[0x34] & 0xf0) | (sb->mixer.regs[0x35] >> 4);
sb->mixer.regs[0x28] = (sb->mixer.regs[0x36] & 0xf0) | (sb->mixer.regs[0x37] >> 4);
return sb; return sb;
} }
@@ -550,6 +558,8 @@ void *sb_awe32_init()
sb->mixer.regs[0x33] = 31 << 3; sb->mixer.regs[0x33] = 31 << 3;
sb->mixer.regs[0x34] = 31 << 3; sb->mixer.regs[0x34] = 31 << 3;
sb->mixer.regs[0x35] = 31 << 3; sb->mixer.regs[0x35] = 31 << 3;
sb->mixer.regs[0x36] = 31 << 3;
sb->mixer.regs[0x37] = 31 << 3;
sb->mixer.regs[0x44] = 8 << 4; sb->mixer.regs[0x44] = 8 << 4;
sb->mixer.regs[0x45] = 8 << 4; sb->mixer.regs[0x45] = 8 << 4;
sb->mixer.regs[0x46] = 8 << 4; sb->mixer.regs[0x46] = 8 << 4;
@@ -557,6 +567,7 @@ void *sb_awe32_init()
sb->mixer.regs[0x22] = (sb->mixer.regs[0x30] & 0xf0) | (sb->mixer.regs[0x31] >> 4); sb->mixer.regs[0x22] = (sb->mixer.regs[0x30] & 0xf0) | (sb->mixer.regs[0x31] >> 4);
sb->mixer.regs[0x04] = (sb->mixer.regs[0x32] & 0xf0) | (sb->mixer.regs[0x33] >> 4); sb->mixer.regs[0x04] = (sb->mixer.regs[0x32] & 0xf0) | (sb->mixer.regs[0x33] >> 4);
sb->mixer.regs[0x26] = (sb->mixer.regs[0x34] & 0xf0) | (sb->mixer.regs[0x35] >> 4); sb->mixer.regs[0x26] = (sb->mixer.regs[0x34] & 0xf0) | (sb->mixer.regs[0x35] >> 4);
sb->mixer.regs[0x28] = (sb->mixer.regs[0x36] & 0xf0) | (sb->mixer.regs[0x37] >> 4);
return sb; return sb;
} }
@@ -760,6 +771,14 @@ static device_config_t sb_16_config[] =
.description = "0x240", .description = "0x240",
.value = 0x240 .value = 0x240
}, },
{
.description = "0x260",
.value = 0x260
},
{
.description = "0x280",
.value = 0x280
},
{ {
.description = "" .description = ""
} }
@@ -891,6 +910,14 @@ static device_config_t sb_awe32_config[] =
.description = "0x240", .description = "0x240",
.value = 0x240 .value = 0x240
}, },
{
.description = "0x260",
.value = 0x260
},
{
.description = "0x280",
.value = 0x280
},
{ {
.description = "" .description = ""
} }