diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 437b686cd..6fa7b7e50 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -9,7 +9,7 @@ * Implementation of the CD-ROM drive with SCSI(-like) * commands, for both ATAPI and SCSI usage. * - * Version: @(#)cdrom.c 1.0.41 2018/03/18 + * Version: @(#)cdrom.c 1.0.42 2018/03/19 * * Author: Miran Grca, * @@ -332,7 +332,6 @@ static const mode_sense_pages_t cdrom_mode_sense_pages_changeable = static mode_sense_pages_t cdrom_mode_sense_pages_saved[CDROM_NUM]; -#define ENABLE_CDROM_LOG 1 #ifdef ENABLE_CDROM_LOG int cdrom_do_log = ENABLE_CDROM_LOG; #endif diff --git a/src/floppy/fdd_imd.c b/src/floppy/fdd_imd.c index c78e85692..49eca94e4 100644 --- a/src/floppy/fdd_imd.c +++ b/src/floppy/fdd_imd.c @@ -8,7 +8,7 @@ * * Implementation of the IMD floppy image format. * - * Version: @(#)fdd_imd.c 1.0.5 2018/03/17 + * Version: @(#)fdd_imd.c 1.0.6 2018/03/19 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -590,6 +590,7 @@ imd_load(int drive, wchar_t *fn) uint32_t raw_tsize = 0; uint32_t minimum_gap3 = 0; uint32_t minimum_gap4 = 0; + uint8_t converted_rate; d86f_unregister(drive); @@ -690,6 +691,7 @@ imd_load(int drive, wchar_t *fn) dev->tracks[track][side].side_flags |= 0x20; if ((dev->tracks[track][side].side_flags & 7) == 1) dev->tracks[track][side].side_flags |= 0x20; + /* pclog("Side flags for (%02i)(%01i): %02X\n", track, side, dev->tracks[track][side].side_flags); */ dev->tracks[track][side].is_present = 1; dev->tracks[track][side].file_offs = (buffer2 - buffer); memcpy(dev->tracks[track][side].params, buffer2, 5); @@ -748,30 +750,45 @@ imd_load(int drive, wchar_t *fn) /* Not leaving even GAP1: 146 : 73 */ raw_tsize = get_raw_tsize(dev->tracks[track][side].side_flags, 0); minimum_gap3 = 12 * track_spt; - if ((raw_tsize - track_total + (mfm ? 146 : 73)) < (minimum_gap3 + minimum_gap4)) { - /* If we can't fit the sectors with a reasonable minimum gap at perfect RPM, let's try 2% slower. */ - raw_tsize = get_raw_tsize(dev->tracks[track][side].side_flags, 1); - /* Set disk flags so that rotation speed is 2% slower. */ - dev->disk_flags |= (3 << 5); + + if ((dev->tracks[track][side].side_flags == 0x0A) || (dev->tracks[track][side].side_flags == 0x29)) + converted_rate = 2; + else if (dev->tracks[track][side].side_flags == 0x28) + converted_rate = 4; + else + converted_rate = dev->tracks[track][side].side_flags & 0x03; + + if (gap3_sizes[converted_rate][sector_size][track_spt] == 0x00) { if ((raw_tsize - track_total + (mfm ? 146 : 73)) < (minimum_gap3 + minimum_gap4)) { - /* If we can't fit the sectors with a reasonable minimum gap even at 2% slower RPM, abort. */ - pclog("IMD: Unable to fit the %i sectors in a track\n", track_spt); - fclose(dev->f); - free(dev); - imd[drive] = NULL; - memset(floppyfns[drive], 0, sizeof(floppyfns[drive])); - return; + /* If we can't fit the sectors with a reasonable minimum gap at perfect RPM, let's try 2% slower. */ + raw_tsize = get_raw_tsize(dev->tracks[track][side].side_flags, 1); + /* Set disk flags so that rotation speed is 2% slower. */ + dev->disk_flags |= (3 << 5); + if ((raw_tsize - track_total + (mfm ? 146 : 73)) < (minimum_gap3 + minimum_gap4)) { + /* If we can't fit the sectors with a reasonable minimum gap even at 2% slower RPM, abort. */ + pclog("IMD: Unable to fit the %i sectors in a track\n", track_spt); + fclose(dev->f); + free(dev); + imd[drive] = NULL; + memset(floppyfns[drive], 0, sizeof(floppyfns[drive])); + return; + } } - } - dev->tracks[track][side].gap3_len = (raw_tsize - track_total - minimum_gap4 + (mfm ? 146 : 73)) / track_spt; + dev->tracks[track][side].gap3_len = (raw_tsize - track_total - minimum_gap4 + (mfm ? 146 : 73)) / track_spt; + } else if (gap3_sizes[converted_rate][sector_size][track_spt] != 0x00) + dev->tracks[track][side].gap3_len = gap3_sizes[converted_rate][sector_size][track_spt]; - dev->track_count++; + /* pclog("GAP3 length for (%02i)(%01i): %i bytes\n", track, side, dev->tracks[track][side].gap3_len); */ + + if (track > dev->track_count) + dev->track_count = track; if (last_offset >= fsize) break; } /* If more than 43 tracks, then the tracks are thin (96 tpi). */ + dev->track_count++; dev->track_width = 0; if (dev->track_count > 43) dev->track_width = 1; @@ -780,6 +797,8 @@ imd_load(int drive, wchar_t *fn) if (dev->sides == 2) dev->disk_flags |= 8; + /* pclog("%i tracks, %i sides\n", dev->track_count, dev->sides); */ + /* Attach this format to the D86F engine. */ d86f_handler[drive].disk_flags = disk_flags; d86f_handler[drive].side_flags = side_flags; diff --git a/src/floppy/fdd_td0.c b/src/floppy/fdd_td0.c index b5558437f..8968694c8 100644 --- a/src/floppy/fdd_td0.c +++ b/src/floppy/fdd_td0.c @@ -8,7 +8,7 @@ * * Implementation of the Teledisk floppy image format. * - * Version: @(#)fdd_td0.c 1.0.4 2018/03/17 + * Version: @(#)fdd_td0.c 1.0.5 2018/03/19 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -784,7 +784,8 @@ td0_initialize(int drive) track_size += (pre_sector + size + 2); } - track_count = track; + if (track > track_count) + track_count = track; if (track_spt != 255) { dev->track_spt[track][head] = track_spt; diff --git a/src/game/gameport.c b/src/game/gameport.c index c1f06ecb5..1550e4eab 100644 --- a/src/game/gameport.c +++ b/src/game/gameport.c @@ -8,7 +8,7 @@ * * Implementation of a generic Game Port. * - * Version: @(#)gameport.c 1.0.3 2018/03/15 + * Version: @(#)gameport.c 1.0.4 2018/03/19 * * Authors: Miran Grca, * Sarah Walker, @@ -193,7 +193,7 @@ gameport_write(uint16_t addr, uint8_t val, void *priv) static uint8_t gameport_read(uint16_t addr, void *priv) { - gameport_t *p = (gameport_t *)p; + gameport_t *p = (gameport_t *)priv; uint8_t ret; timer_clock();