diff --git a/src/buslogic.c b/src/buslogic.c index d131846a3..293601837 100644 --- a/src/buslogic.c +++ b/src/buslogic.c @@ -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. */ } - memset(SCSIDevices[Id][Lun].CmdBuffer, 0, 390144); - //Finally, execute the SCSI command immediately and get the transfer length. SCSIPhase = SCSI_PHASE_COMMAND; @@ -1808,6 +1806,9 @@ static int BuslogicSCSIRequestSetup(Buslogic_t *Buslogic, uint32_t CCBPointer, M 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); if (!buslogic_scsi_drive_is_cdrom(Id, Lun)) diff --git a/src/cdrom.c b/src/cdrom.c index 02d693b43..20068125f 100644 --- a/src/cdrom.c +++ b/src/cdrom.c @@ -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)) { 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].total_length = cdrom[id].written_length = 0; 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: cdrom_log("CD-ROM %i: MODE SELECT page (%02X)\n", 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; default: 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: Request length: %04X\n", id, cdrom[id].request_length); -#if 0 +// #if 0 int CdbLength; for (CdbLength = 1; CdbLength < cdrom[id].cdb_len; CdbLength++) { cdrom_log("CD-ROM %i: CDB[%d] = 0x%02X\n", id, CdbLength, cdb[CdbLength]); } -#endif +// #endif } msf = cdb[1] & 2; @@ -2899,6 +2903,8 @@ int cdrom_read_from_dma(uint8_t id) int i = 0; int ret = 0; + int in_data_length = 0; + if (cdrom_drives[id].bus_type) { 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; } - 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_return(id, ret); diff --git a/src/gameport.c b/src/gameport.c index 6fa788491..7b135dc39 100644 --- a/src/gameport.c +++ b/src/gameport.c @@ -122,7 +122,7 @@ void gameport_write(uint16_t addr, uint8_t val, void *p) timer_clock(); 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[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 // 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); diff --git a/src/pc.c b/src/pc.c index 408133744..ab4e2f7b6 100644 --- a/src/pc.c +++ b/src/pc.c @@ -442,17 +442,6 @@ void resetpchard() vlan_reset(); //NETWORK } 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++) { @@ -467,6 +456,17 @@ void resetpchard() { 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(); diff --git a/src/sound.c b/src/sound.c index f7c40af6b..e6b51d6d0 100644 --- a/src/sound.c +++ b/src/sound.c @@ -164,9 +164,11 @@ static void sound_cd_thread(void *param) /* Then, adjust input from drive according to ATAPI/SCSI volume. */ 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] /= 255.0; + // cd_buffer_temp[1] /= 255.0; + cd_buffer_temp[1] /= 511.0; /*Apply ATAPI channel select*/ cd_buffer_temp2[0] = cd_buffer_temp2[1] = 0.0; @@ -229,11 +231,13 @@ void sound_init() 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_thread_h = thread_create(sound_cd_thread, NULL); } 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) @@ -333,11 +337,13 @@ void sound_cd_thread_reset() 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_thread_h = thread_create(sound_cd_thread, NULL); } 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_kill(sound_cd_thread_h); sound_cd_thread_h = NULL; diff --git a/src/sound_sb.c b/src/sound_sb.c index bb49d96d2..20baaa547 100644 --- a/src/sound_sb.c +++ b/src/sound_sb.c @@ -54,22 +54,22 @@ static void sb_get_buffer_opl2(int32_t *buffer, int len, void *p) { int32_t out_l, out_r; - out_l = ((sb->opl.buffer[c] * mixer->fm_l) >> 13); - out_r = ((sb->opl.buffer[c + 1] * mixer->fm_r) >> 13); + out_l = ((sb->opl.buffer[c] * mixer->fm_l) >> 16); + out_r = ((sb->opl.buffer[c + 1] * mixer->fm_r) >> 16); if (sb->mixer.filter) { - out_l += (int)(((sb_iir(0, (float)sb->dsp.buffer[c]) / 1.3) * mixer->voice_l) / 3) >> 13; - out_r += (int)(((sb_iir(1, (float)sb->dsp.buffer[c + 1]) / 1.3) * mixer->voice_r) / 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) >> 16; } else { - out_l += ((int32_t)(sb->dsp.buffer[c] * mixer->voice_l) / 3) >> 13; - out_r += ((int32_t)(sb->dsp.buffer[c + 1] * mixer->voice_r) / 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) >> 16; } - out_l = (out_l * mixer->master_l) >> 13; - out_r = (out_r * mixer->master_r) >> 13; + out_l = (out_l * mixer->master_l) >> 15; + 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) { @@ -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; int32_t out_l, out_r; - out_l = ((sb->opl.buffer[c] * mixer->fm_l) >> 13); - out_r = ((sb->opl.buffer[c + 1] * mixer->fm_r) >> 13); + out_l = ((sb->opl.buffer[c] * mixer->fm_l) >> 16); + out_r = ((sb->opl.buffer[c + 1] * mixer->fm_r) >> 16); if (sb->mixer.filter) { - out_l += (int)(((sb_iir(0, (float)sb->dsp.buffer[c]) / 1.3) * mixer->voice_l) / 3) >> 13; - out_r += (int)(((sb_iir(1, (float)sb->dsp.buffer[c + 1]) / 1.3) * mixer->voice_r) / 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) >> 16; } else { - out_l += ((int32_t)(sb->dsp.buffer[c] * mixer->voice_l) / 3) >> 13; - out_r += ((int32_t)(sb->dsp.buffer[c + 1] * mixer->voice_r) / 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) >> 16; } - out_l = (out_l * mixer->master_l) >> 13; - out_r = (out_r * mixer->master_r) >> 13; + out_l = (out_l * mixer->master_l) >> 15; + 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) { @@ -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; int32_t out_l, out_r; - out_l = (((int32_t)sb->opl.buffer[c] * (int32_t)mixer->fm_l) >> 13); - out_r = (((int32_t)sb->opl.buffer[c + 1] * (int32_t)mixer->fm_r) >> 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) >> 16); - out_l += ((sb->emu8k.buffer[c_emu8k] * mixer->fm_l) >> 13); - out_r += ((sb->emu8k.buffer[c_emu8k + 1] * 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) >> 16); if (sb->mixer.filter) { - out_l += (int)(((sb_iir(0, (float)sb->dsp.buffer[c]) / 1.3) * mixer->voice_l) / 3) >> 13; - out_r += (int)(((sb_iir(1, (float)sb->dsp.buffer[c + 1]) / 1.3) * mixer->voice_r) / 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) >> 16; } else { - out_l += ((int32_t)(sb->dsp.buffer[c] * mixer->voice_l) / 3) >> 13; - out_r += ((int32_t)(sb->dsp.buffer[c + 1] * mixer->voice_r) / 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) >> 16; } - out_l = (out_l * mixer->master_l) >> 13; - out_r = (out_r * mixer->master_r) >> 13; + out_l = (out_l * mixer->master_l) >> 15; + 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) { @@ -224,8 +224,8 @@ void sb_pro_mixer_write(uint16_t addr, uint8_t val, void *p) mixer->filter = !(mixer->regs[0xe] & 0x20); mixer->bass_l = mixer->bass_r = 8; mixer->treble_l = mixer->treble_r = 8; - sound_set_cd_volume(((uint32_t)mixer->master_l * (uint32_t)mixer->cd_l) / 8191, - ((uint32_t)mixer->master_r * (uint32_t)mixer->cd_r) / 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) / 65535); // 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); 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_r = mixer->regs[0x45] >> 4; mixer->filter = 0; - sound_set_cd_volume(((uint32_t)mixer->master_l * (uint32_t)mixer->cd_l) / 8191, - ((uint32_t)mixer->master_r * (uint32_t)mixer->cd_r) / 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) / 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("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->voice_l = mixer->voice_r = 65535; mixer->fm_l = mixer->fm_r = 65535; + mixer->cd_l = mixer->cd_r = 65535; mixer->bass_l = mixer->bass_r = 8; mixer->treble_l = mixer->treble_r = 8; 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() @@ -449,6 +452,7 @@ void *sb_pro_v1_init() sb->mixer.regs[0x22] = 0xff; sb->mixer.regs[0x04] = 0xff; sb->mixer.regs[0x26] = 0xff; + sb->mixer.regs[0x28] = 0xff; sb->mixer.regs[0xe] = 0; return sb; @@ -475,6 +479,7 @@ void *sb_pro_v2_init() sb->mixer.regs[0x22] = 0xff; sb->mixer.regs[0x04] = 0xff; sb->mixer.regs[0x26] = 0xff; + sb->mixer.regs[0x28] = 0xff; sb->mixer.regs[0xe] = 0; return sb; @@ -506,6 +511,8 @@ void *sb_16_init() sb->mixer.regs[0x33] = 31 << 3; sb->mixer.regs[0x34] = 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[0x45] = 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[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[0x28] = (sb->mixer.regs[0x36] & 0xf0) | (sb->mixer.regs[0x37] >> 4); return sb; } @@ -550,6 +558,8 @@ void *sb_awe32_init() sb->mixer.regs[0x33] = 31 << 3; sb->mixer.regs[0x34] = 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[0x45] = 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[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[0x28] = (sb->mixer.regs[0x36] & 0xf0) | (sb->mixer.regs[0x37] >> 4); return sb; } @@ -760,6 +771,14 @@ static device_config_t sb_16_config[] = .description = "0x240", .value = 0x240 }, + { + .description = "0x260", + .value = 0x260 + }, + { + .description = "0x280", + .value = 0x280 + }, { .description = "" } @@ -891,6 +910,14 @@ static device_config_t sb_awe32_config[] = .description = "0x240", .value = 0x240 }, + { + .description = "0x260", + .value = 0x260 + }, + { + .description = "0x280", + .value = 0x280 + }, { .description = "" }