Various fixes to the IMD loader - 5.25" 2DD IMD images now work correctly in thin track drives;

A slight fix to TD0 loading;
Ported the small gameport bugfix from VARCem;
Disabled CD-ROM logging.
This commit is contained in:
OBattler
2018-03-19 02:35:11 +01:00
parent d2b5bf9200
commit 895e30bb37
4 changed files with 41 additions and 22 deletions

View File

@@ -9,7 +9,7 @@
* Implementation of the CD-ROM drive with SCSI(-like) * Implementation of the CD-ROM drive with SCSI(-like)
* commands, for both ATAPI and SCSI usage. * 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, <mgrca8@gmail.com> * Author: Miran Grca, <mgrca8@gmail.com>
* *
@@ -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]; static mode_sense_pages_t cdrom_mode_sense_pages_saved[CDROM_NUM];
#define ENABLE_CDROM_LOG 1
#ifdef ENABLE_CDROM_LOG #ifdef ENABLE_CDROM_LOG
int cdrom_do_log = ENABLE_CDROM_LOG; int cdrom_do_log = ENABLE_CDROM_LOG;
#endif #endif

View File

@@ -8,7 +8,7 @@
* *
* Implementation of the IMD floppy image format. * 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, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -590,6 +590,7 @@ imd_load(int drive, wchar_t *fn)
uint32_t raw_tsize = 0; uint32_t raw_tsize = 0;
uint32_t minimum_gap3 = 0; uint32_t minimum_gap3 = 0;
uint32_t minimum_gap4 = 0; uint32_t minimum_gap4 = 0;
uint8_t converted_rate;
d86f_unregister(drive); d86f_unregister(drive);
@@ -690,6 +691,7 @@ imd_load(int drive, wchar_t *fn)
dev->tracks[track][side].side_flags |= 0x20; dev->tracks[track][side].side_flags |= 0x20;
if ((dev->tracks[track][side].side_flags & 7) == 1) if ((dev->tracks[track][side].side_flags & 7) == 1)
dev->tracks[track][side].side_flags |= 0x20; 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].is_present = 1;
dev->tracks[track][side].file_offs = (buffer2 - buffer); dev->tracks[track][side].file_offs = (buffer2 - buffer);
memcpy(dev->tracks[track][side].params, buffer2, 5); 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 */ /* Not leaving even GAP1: 146 : 73 */
raw_tsize = get_raw_tsize(dev->tracks[track][side].side_flags, 0); raw_tsize = get_raw_tsize(dev->tracks[track][side].side_flags, 0);
minimum_gap3 = 12 * track_spt; 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. */ if ((dev->tracks[track][side].side_flags == 0x0A) || (dev->tracks[track][side].side_flags == 0x29))
raw_tsize = get_raw_tsize(dev->tracks[track][side].side_flags, 1); converted_rate = 2;
/* Set disk flags so that rotation speed is 2% slower. */ else if (dev->tracks[track][side].side_flags == 0x28)
dev->disk_flags |= (3 << 5); 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 ((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. */ /* If we can't fit the sectors with a reasonable minimum gap at perfect RPM, let's try 2% slower. */
pclog("IMD: Unable to fit the %i sectors in a track\n", track_spt); raw_tsize = get_raw_tsize(dev->tracks[track][side].side_flags, 1);
fclose(dev->f); /* Set disk flags so that rotation speed is 2% slower. */
free(dev); dev->disk_flags |= (3 << 5);
imd[drive] = NULL; if ((raw_tsize - track_total + (mfm ? 146 : 73)) < (minimum_gap3 + minimum_gap4)) {
memset(floppyfns[drive], 0, sizeof(floppyfns[drive])); /* If we can't fit the sectors with a reasonable minimum gap even at 2% slower RPM, abort. */
return; 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 (last_offset >= fsize) break;
} }
/* If more than 43 tracks, then the tracks are thin (96 tpi). */ /* If more than 43 tracks, then the tracks are thin (96 tpi). */
dev->track_count++;
dev->track_width = 0; dev->track_width = 0;
if (dev->track_count > 43) if (dev->track_count > 43)
dev->track_width = 1; dev->track_width = 1;
@@ -780,6 +797,8 @@ imd_load(int drive, wchar_t *fn)
if (dev->sides == 2) if (dev->sides == 2)
dev->disk_flags |= 8; dev->disk_flags |= 8;
/* pclog("%i tracks, %i sides\n", dev->track_count, dev->sides); */
/* Attach this format to the D86F engine. */ /* Attach this format to the D86F engine. */
d86f_handler[drive].disk_flags = disk_flags; d86f_handler[drive].disk_flags = disk_flags;
d86f_handler[drive].side_flags = side_flags; d86f_handler[drive].side_flags = side_flags;

View File

@@ -8,7 +8,7 @@
* *
* Implementation of the Teledisk floppy image format. * 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, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -784,7 +784,8 @@ td0_initialize(int drive)
track_size += (pre_sector + size + 2); track_size += (pre_sector + size + 2);
} }
track_count = track; if (track > track_count)
track_count = track;
if (track_spt != 255) { if (track_spt != 255) {
dev->track_spt[track][head] = track_spt; dev->track_spt[track][head] = track_spt;

View File

@@ -8,7 +8,7 @@
* *
* Implementation of a generic Game Port. * 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, <mgrca8@gmail.com> * Authors: Miran Grca, <mgrca8@gmail.com>
* Sarah Walker, <tommowalker@tommowalker.co.uk> * Sarah Walker, <tommowalker@tommowalker.co.uk>
@@ -193,7 +193,7 @@ gameport_write(uint16_t addr, uint8_t val, void *priv)
static uint8_t static uint8_t
gameport_read(uint16_t addr, void *priv) gameport_read(uint16_t addr, void *priv)
{ {
gameport_t *p = (gameport_t *)p; gameport_t *p = (gameport_t *)priv;
uint8_t ret; uint8_t ret;
timer_clock(); timer_clock();