Updated the CDROM speed setting code some more, and fixed a bug.

This commit is contained in:
waltje
2018-03-20 20:58:35 -05:00
parent 1cf45a9724
commit e01f05c0f1
4 changed files with 17 additions and 21 deletions

View File

@@ -911,7 +911,6 @@ static void cdrom_command_common(uint8_t id)
case 0xb8: case 0xb8:
case 0xb9: case 0xb9:
case 0xbe: case 0xbe:
/* bytes_per_second = 150.0 * 1024.0; */
bytes_per_second = (1000000.0 / 12000.0) * 2048.0; /* Account for seek time. */ bytes_per_second = (1000000.0 / 12000.0) * 2048.0; /* Account for seek time. */
bytes_per_second *= (double)cdrom_speeds[dev->cur_speed].speed; bytes_per_second *= (double)cdrom_speeds[dev->cur_speed].speed;
break; break;
@@ -921,12 +920,13 @@ static void cdrom_command_common(uint8_t id)
dev->callback = -1LL; /* Speed depends on SCSI controller */ dev->callback = -1LL; /* Speed depends on SCSI controller */
return; return;
} }
break;
} }
period = 1000000.0 / bytes_per_second; period = 1000000.0 / bytes_per_second;
dusec = (double) TIMER_USEC; dusec = (double) TIMER_USEC;
dusec = dusec * period * (double) (dev->packet_len); dusec = dusec * period * (double) (dev->packet_len);
dev->callback = ((int64_t) dusec); dev->callback += ((int64_t) dusec);
} }
cdrom_set_callback(id); cdrom_set_callback(id);
} }
@@ -1573,10 +1573,11 @@ skip_ready_check:
void cdrom_clear_callback(uint8_t channel) void cdrom_clear_callback(uint8_t channel)
{ {
uint8_t id = atapi_cdrom_drives[channel]; uint8_t id = atapi_cdrom_drives[channel];
cdrom_t *dev = cdrom[id]; cdrom_t *dev;
if (id < CDROM_NUM) if (id < CDROM_NUM)
{ {
dev = cdrom[id];
dev->callback = 0LL; dev->callback = 0LL;
cdrom_set_callback(id); cdrom_set_callback(id);
} }
@@ -1826,9 +1827,7 @@ void cdrom_command(uint8_t id, uint8_t *cdb)
case GPCMD_SET_SPEED_ALT: case GPCMD_SET_SPEED_ALT:
len = (cdb[3] | (cdb[2] << 8)) / 176; len = (cdb[3] | (cdb[2] << 8)) / 176;
dev->cur_speed = cdrom_speed_idx(len); dev->cur_speed = cdrom_speed_idx(len);
if (dev->cur_speed < 1) if (dev->cur_speed > cdrom_drives[id].speed_idx)
dev->cur_speed = 0;
else if (dev->cur_speed > cdrom_drives[id].speed_idx)
dev->cur_speed = cdrom_drives[id].speed_idx; dev->cur_speed = cdrom_drives[id].speed_idx;
cdrom_set_phase(id, SCSI_PHASE_STATUS); cdrom_set_phase(id, SCSI_PHASE_STATUS);
cdrom_command_complete(id); cdrom_command_complete(id);
@@ -1988,6 +1987,9 @@ cdrom_readtoc_fallback:
break; break;
} }
dev->seek_diff = ABS((int) (pos - dev->seek_pos));
dev->seek_pos = dev->sector_pos;
if (!dev->sector_len) { if (!dev->sector_len) {
cdrom_set_phase(id, SCSI_PHASE_STATUS); cdrom_set_phase(id, SCSI_PHASE_STATUS);
/* cdrom_log("CD-ROM %i: All done - callback set\n", id); */ /* cdrom_log("CD-ROM %i: All done - callback set\n", id); */
@@ -2957,12 +2959,6 @@ int cdrom_read_from_ide_dma(uint8_t channel)
return 0; return 0;
} }
void cdrom_irq_raise(uint8_t id)
{
if (cdrom_drives[id].bus_type < CDROM_BUS_SCSI)
ide_irq_raise(&(ide_drives[cdrom_drives[id].ide_channel]));
}
int cdrom_read_from_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun) int cdrom_read_from_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun)
{ {
uint8_t id = scsi_cdrom_drives[scsi_id][scsi_lun]; uint8_t id = scsi_cdrom_drives[scsi_id][scsi_lun];
@@ -2978,6 +2974,12 @@ int cdrom_read_from_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun)
return 1; return 1;
} }
void cdrom_irq_raise(uint8_t id)
{
if (cdrom_drives[id].bus_type < CDROM_BUS_SCSI)
ide_irq_raise(&(ide_drives[cdrom_drives[id].ide_channel]));
}
int cdrom_read_from_dma(uint8_t id) int cdrom_read_from_dma(uint8_t id)
{ {
cdrom_t *dev = cdrom[id]; cdrom_t *dev = cdrom[id];

View File

@@ -8,7 +8,7 @@
* *
* CD-ROM image support. * CD-ROM image support.
* *
* Version: @(#)cdrom_image.cpp 1.0.5 2018/03/18 * Version: @(#)cdrom_image.cpp 1.0.6 2018/03/20
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -100,8 +100,6 @@ void image_audio_callback(uint8_t id, int16_t *output, int len)
{ {
cdrom_t *dev = cdrom[id]; cdrom_t *dev = cdrom[id];
return; /*FIXME: why? */
if (!cdrom_drives[id].sound_on || (dev->cd_state != CD_PLAYING) || cdrom_image[id].image_is_iso) if (!cdrom_drives[id].sound_on || (dev->cd_state != CD_PLAYING) || cdrom_image[id].image_is_iso)
{ {
cdrom_image_log("image_audio_callback(i): Not playing\n", id); cdrom_image_log("image_audio_callback(i): Not playing\n", id);

View File

@@ -11,7 +11,7 @@
* This header file lists the functions provided by * This header file lists the functions provided by
* various platform specific cdrom-ioctl files. * various platform specific cdrom-ioctl files.
* *
* Version: @(#)cdrom_image.h 1.0.1 2018/02/14 * Version: @(#)cdrom_image.h 1.0.2 2018/03/20
* *
* Authors: Miran Grca, <mgrca8@gmail.com> * Authors: Miran Grca, <mgrca8@gmail.com>
* RichardG, <richardg867@gmail.com> * RichardG, <richardg867@gmail.com>
@@ -52,9 +52,6 @@ extern void image_close(uint8_t id);
extern void cdrom_set_null_handler(uint8_t id); extern void cdrom_set_null_handler(uint8_t id);
//FIXME: delete this! --FvK
extern void update_status_bar_icon_state(int tag, int state);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@@ -9,7 +9,7 @@
* Implementation of the generic device interface to handle * Implementation of the generic device interface to handle
* all devices attached to the emulator. * all devices attached to the emulator.
* *
* Version: @(#)device.c 1.0.4 2018/03/15 * Version: @(#)device.c 1.0.5 2018/03/20
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -130,7 +130,6 @@ device_close_all(void)
for (c=0; c<DEVICE_MAX; c++) { for (c=0; c<DEVICE_MAX; c++) {
if (devices[c] != NULL) { if (devices[c] != NULL) {
pclog("DEVICE: closing device '%s'\n", devices[c]->name);
if (devices[c]->close != NULL) if (devices[c]->close != NULL)
devices[c]->close(device_priv[c]); devices[c]->close(device_priv[c]);
devices[c] = device_priv[c] = NULL; devices[c] = device_priv[c] = NULL;