diff --git a/src/devices/disk/zip.c b/src/devices/disk/zip.c index 102a3da..1366083 100644 --- a/src/devices/disk/zip.c +++ b/src/devices/disk/zip.c @@ -773,10 +773,8 @@ read_capacity(void *p, uint8_t *cdb, uint8_t *buffer, uint32_t *len) zip_t *dev = (zip_t *)p; int size; - size = (dev->drv->is_250) ? dev->drv->medium_size : ZIP_SECTORS; - /* IMPORTANT: we return is the last LBA block. */ - size--; + size = dev->drv->medium_size - 1; memset(buffer, 0, 8); buffer[0] = (size >> 24) & 0xff; @@ -840,17 +838,10 @@ mode_sense(zip_t *dev, uint8_t *buf, uint32_t pos, uint8_t page, uint8_t block_d pf = (dev->drv->is_250) ? mode_sense_page_flags250 : mode_sense_page_flags; if (block_descriptor_len) { - if (dev->drv->is_250) { - buf[pos++] = ((dev->drv->medium_size >> 24) & 0xff); - buf[pos++] = ((dev->drv->medium_size >> 16) & 0xff); - buf[pos++] = ((dev->drv->medium_size >> 8) & 0xff); - buf[pos++] = ( dev->drv->medium_size & 0xff); - } else { - buf[pos++] = ((ZIP_SECTORS >> 24) & 0xff); - buf[pos++] = ((ZIP_SECTORS >> 16) & 0xff); - buf[pos++] = ((ZIP_SECTORS >> 8) & 0xff); - buf[pos++] = ( ZIP_SECTORS & 0xff); - } + buf[pos++] = ((dev->drv->medium_size >> 24) & 0xff); + buf[pos++] = ((dev->drv->medium_size >> 16) & 0xff); + buf[pos++] = ((dev->drv->medium_size >> 8) & 0xff); + buf[pos++] = ( dev->drv->medium_size & 0xff); buf[pos++] = 0; /* Reserved. */ buf[pos++] = 0; /* Block length (0x200 = 512 bytes). */ buf[pos++] = 2; @@ -1530,7 +1521,7 @@ zip_command(void *p, uint8_t *cdb) break; case GPCMD_FORMAT_UNIT: - if ((dev->drv->bus_type == ZIP_BUS_SCSI) && dev->drv->read_only) { + if (dev->drv->read_only) { write_protected(dev); return; } @@ -1696,7 +1687,7 @@ zip_command(void *p, uint8_t *cdb) set_phase(dev, SCSI_PHASE_DATA_OUT); alloc_length = 512; - if ((dev->drv->bus_type == ZIP_BUS_SCSI) && dev->drv->read_only) { + if (dev->drv->read_only) { write_protected(dev); return; } @@ -1724,18 +1715,10 @@ zip_command(void *p, uint8_t *cdb) break; } - if (dev->drv->is_250) { - if ((dev->sector_pos >= dev->drv->medium_size) || - ((dev->sector_pos + dev->sector_len - 1) >= dev->drv->medium_size)) { - lba_out_of_range(dev); - return; - } - } else { - if ((dev->sector_pos >= ZIP_SECTORS) || - ((dev->sector_pos + dev->sector_len - 1) >= ZIP_SECTORS)) { - lba_out_of_range(dev); - return; - } + if ((dev->sector_pos >= dev->drv->medium_size) || + ((dev->sector_pos + dev->sector_len - 1) >= dev->drv->medium_size)) { + lba_out_of_range(dev); + return; } if (! dev->sector_len) { @@ -1782,7 +1765,7 @@ zip_command(void *p, uint8_t *cdb) return; } - if ((dev->drv->bus_type == ZIP_BUS_SCSI) && dev->drv->read_only) { + if (dev->drv->read_only) { write_protected(dev); return; } @@ -1790,18 +1773,10 @@ zip_command(void *p, uint8_t *cdb) dev->sector_len = (cdb[7] << 8) | cdb[8]; dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; - if (dev->drv->is_250) { - if ((dev->sector_pos >= dev->drv->medium_size) || - ((dev->sector_pos + dev->sector_len - 1) >= dev->drv->medium_size)) { - lba_out_of_range(dev); - return; - } - } else { - if ((dev->sector_pos >= ZIP_SECTORS) || - ((dev->sector_pos + dev->sector_len - 1) >= ZIP_SECTORS)) { - lba_out_of_range(dev); - return; - } + if ((dev->sector_pos >= dev->drv->medium_size) || + ((dev->sector_pos + dev->sector_len - 1) >= dev->drv->medium_size)) { + lba_out_of_range(dev); + return; } if (! dev->sector_len) { @@ -2106,6 +2081,11 @@ atapi_out: /* Current/Maximum capacity header */ if (dev->drv->is_250) { + /* + * ZIP 250 also supports ZIP 100 media, so if the + * medium is inserted, we return the inserted + * medium's size, otherwise, the ZIP 250 size. + */ if (dev->drv->f != NULL) { dev->buffer[pos++] = (dev->drv->medium_size >> 24) & 0xff; dev->buffer[pos++] = (dev->drv->medium_size >> 16) & 0xff; @@ -2120,6 +2100,10 @@ atapi_out: dev->buffer[pos++] = 3; /* Maximum medium capacity */ } } else { + /* + * ZIP 100 only supports ZIP 100 media, so we + * always return the ZIP 100 size. + */ dev->buffer[pos++] = (ZIP_SECTORS >> 24) & 0xff; dev->buffer[pos++] = (ZIP_SECTORS >> 16) & 0xff; dev->buffer[pos++] = (ZIP_SECTORS >> 8) & 0xff; @@ -2195,10 +2179,7 @@ phase_data_out(zip_t *dev) case GPCMD_WRITE_SAME_10: if (!dev->current_cdb[7] && !dev->current_cdb[8]) { - if (dev->drv->is_250) - last_to_write = (dev->drv->medium_size - 1); - else - last_to_write = (ZIP_SECTORS - 1); + last_to_write = (dev->drv->medium_size - 1); } else last_to_write = dev->sector_pos + dev->sector_len - 1; diff --git a/src/devices/video/vid_s3_virge.c b/src/devices/video/vid_s3_virge.c index 711d74e..86c4a28 100644 --- a/src/devices/video/vid_s3_virge.c +++ b/src/devices/video/vid_s3_virge.c @@ -8,7 +8,7 @@ * * S3 ViRGE emulation. * - * Version: @(#)vid_s3_virge.c 1.0.13 2018/10/08 + * Version: @(#)vid_s3_virge.c 1.0.14 2018/10/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -638,7 +638,7 @@ static void s3_virge_recalctimings(svga_t *svga) } } - if (virge->chip == S3_VIRGEVX) + if (virge->chip != S3_VIRGEVX) { if ((svga->bpp == 15) || (svga->bpp == 16)) {