#endif
#ifdef FLOPPYBRIDGE
FloppyDiskBridge *bridge;
+ bool writepending;
#endif
} drive;
drv->drive_id = DRIVE_ID_35DD;
break;
case FloppyDiskBridge::DriveTypeID::dti35HD:
- if (t == DRV_35_HD && mode != FloppyBridgeAPI::BridgeDensityMode::bdmDDOnly) {
+ if (mode != FloppyBridgeAPI::BridgeDensityMode::bdmDDOnly) {
drv->drive_id = DRIVE_ID_35HD;
} else {
drv->drive_id = DRIVE_ID_35DD;
drv->drive_id = DRIVE_ID_525SD;
break;
}
- drv->ddhd = drv->bridge->getDriveTypeID() == FloppyDiskBridge::DriveTypeID::dti35HD ? 2 : 1;
} else {
drv->drive_id = DRIVE_ID_35DD;
- drv->ddhd = 1;
}
+ drv->ddhd = drv->drive_id == DRIVE_ID_35HD ? 2 : 1;
return;
}
#endif
}
#endif
-static int decode_buffer (uae_u16 *mbuf, int cyl, int drvsec, int ddhd, int filetype, int *drvsecp, int *sectable, int checkmode)
+static int decode_buffer(drive *drv, uae_u16 *mbuf, int cyl, int drvsec, int ddhd, int filetype, int *drvsecp, int *sectable, int checkmode)
{
int i, secwritten = 0;
int fwlen = FLOPPY_WRITE_LEN * ddhd;
memset (sectable, 0, MAX_SECTORS * sizeof (int));
mstart = mbuf;
- memcpy (mbuf + fwlen, mbuf, fwlen * sizeof (uae_u16));
+ if (!drv->bridge) {
+ memcpy(mbuf + fwlen, mbuf, fwlen * sizeof(uae_u16));
+ }
mend -= (4 + 16 + 8 + 512);
while (secwritten < drvsec) {
int trackoffs;
trackoffs = (id & 0xff00) >> 8;
if (trackoffs + 1 > drvsec) {
- write_log (_T("Disk decode: weird sector number %d (%08x, %ld)\n"), trackoffs, id, mbuf - mstart);
+ write_log (_T("Disk decode: track %d, weird sector number %d (%08x, %ld)\n"), cyl * 2 + side, trackoffs, id, mbuf - mstart);
if (filetype == ADF_EXT2)
return 2;
continue;
}
if (issechead) {
if (filetype != ADF_NORMAL_HEADER) {
- write_log(_T("Disk decode: sector %d header: %08X %08X %08X %08X\n"),
- trackoffs, sechead[0], sechead[1], sechead[2], sechead[3]);
+ write_log(_T("Disk decode: track %d, sector %d header: %08X %08X %08X %08X\n"),
+ cyl * 2 + side, trackoffs, sechead[0], sechead[1], sechead[2], sechead[3]);
if (filetype == ADF_EXT2)
return 6;
}
even = getmfmlong (mbuf + 2, shift);
mbuf += 4;
if (((odd << 1) | even) != chksum) {
- write_log (_T("Disk decode: checksum error on sector %d header\n"), trackoffs);
+ write_log (_T("Disk decode: track %d, checksum error on sector %d header\n"), cyl * 2 + side, trackoffs);
if (filetype == ADF_EXT2)
return 3;
continue;
chksum ^= odd ^ even;
}
if (chksum) {
- write_log (_T("Disk decode: sector %d, data checksum error\n"), trackoffs);
+ write_log (_T("Disk decode: track %d, sector %d, data checksum error\n"), cyl * 2 + side, trackoffs);
if (filetype == ADF_EXT2)
return 4;
continue;
if (filetype == ADF_EXT2 && (secwritten == 0 || secwritten < 0))
return 5;
if (secwritten == 0)
- write_log (_T("Disk decode: unsupported format\n"));
+ write_log (_T("Disk decode: track %d, unsupported format\n"), cyl * 2 + side);
if (secwritten < 0)
- write_log (_T("Disk decode: sector labels ignored\n"));
+ write_log (_T("Disk decode: track %d, sector labels ignored\n"), cyl * 2 + side);
*drvsecp = drvsec;
return 0;
}
int drvsec;
int sectable[MAX_SECTORS];
- if (decode_buffer (drv->bigmfmbuf, drv->cyl, drv->num_secs, drv->ddhd, drv->filetype, &drvsec, sectable, 0))
+ if (decode_buffer (drv, drv->bigmfmbuf, drv->cyl, drv->num_secs, drv->ddhd, drv->filetype, &drvsec, sectable, 0))
return 2;
if (!drvsec)
return 2;
if (drv->bridge) {
// Request to commit the buffer we have collected to disk - this should hardly ever be triggered
drv->tracklen = drv->bridge->commitWriteBuffer(side, drv->cyl);
+ drv->writepending = true;
}
break;
#endif
st &= ~0x20;
#endif
} else {
- if (drive_diskready(drv) && !drv->indexhack && (currprefs.floppyslots[dr].dfxtype != DRV_35_DD_ESCOM || drv->bridge))
+ if (drive_diskready(drv) && !drv->indexhack && currprefs.floppyslots[dr].dfxtype != DRV_35_DD_ESCOM)
st &= ~0x20;
}
} else {
if (currprefs.cs_df0idhw || dr > 0) {
/* report drive ID */
- if (drv->idbit && (currprefs.floppyslots[dr].dfxtype != DRV_35_DD_ESCOM || (drv->bridge->getDriveTypeID() != FloppyDiskBridge::DriveTypeID::dti35DD)))
+ if (drv->idbit && currprefs.floppyslots[dr].dfxtype != DRV_35_DD_ESCOM)
st &= ~0x20;
} else {
/* non-ID internal drive: mirror real dskready */
if (catweasel_disk_changed (drv->catweasel))
st &= ~4;
#endif
- } else if (drive_diskchange(drv) && (currprefs.floppyslots[dr].dfxtype != DRV_525_SD || drv->bridge)) {
+ } else if (drive_diskchange(drv) && currprefs.floppyslots[dr].dfxtype != DRV_525_SD) {
st &= ~4;
}
} else if (!((selected | disabled) & (1 << dr))) {
continue;
if ((selected | disabled) & (1 << dr))
continue;
- drive_write_data (drv);
+ drive_write_data(drv);
}
}
}
}
-
-#ifdef FLOPPYBRIDGE
- // Bridge pass check
- if (dsklength <= 0) {
- for (int dr = 0; dr < MAX_FLOPPY_DRIVES; dr++) {
- drive *drv = &floppy[dr];
- if (drv->bridge && drives[dr]) {
- drv->writtento = 0;
- if (drv->motoroff)
- continue;
- if ((selected | disabled) & (1 << dr))
- continue;
- // With bridge we wait for the disk to commit the data before fireing the DMA
- if (drv->bridge->isWriteComplete()) {
- disk_dmafinished();
- }
- }
- }
- }
-#endif
}
floppybits -= trackspeed;
}
}
}
if (disk_fifostatus () > 0) {
- write_log (_T("doreaddma() fifo overflow detected, retrying..\n"));
return -1;
} else {
DSKDAT (word);
}
}
+#ifdef FLOPPYBRIDGE
+ if (drv->bridge && drv->writepending) {
+ // With bridge we wait for the disk to commit the data before fireing the DMA
+ if (drv->bridge->isWriteComplete()) {
+ disk_dmafinished();
+ drv->writepending = false;
+ }
+ }
+#endif
+
}
if (indexdecay)
if (!b->isDiskInDrive() || timeout < 0) {
break;
}
- int totalbits = FLOPPY_WRITE_LEN_NTSC * 8 * drv->ddhd;
- int pos = 0;
+ int totalbits = FLOPPY_WRITE_MAXLEN * 8 * drv->ddhd;
+ int pos = 0, bitcnt = 0;
uae_u16 *p = drv->bigmfmbuf;
uae_u16 w = 0;
timeout = 5000 / 10;
- int max = b->maxMFMBitPosition();
+ drv->tracklen = totalbits;
while (totalbits > 0 && timeout > 0) {
while (b->isMFMDataAvailable() && totalbits > 0) {
uae_u8 bit = b->getMFMBit(pos);
+ int max = b->maxMFMBitPosition();
pos++;
if (pos >= max) {
pos = 0;
}
w <<= 1;
w |= bit;
- if ((pos & 15) == 0) {
+ bitcnt++;
+ if ((bitcnt & 15) == 0) {
*p++ = w;
}
totalbits--;
side = 0;
drv->buffered_cyl = -1;
drive_fill_bigbuf (drv, -1);
- decode_buffer (drv->bigmfmbuf, drv->cyl, 11, drv->ddhd, drv->filetype, &drvsec, sectable, 1);
+ decode_buffer (drv, drv->bigmfmbuf, drv->cyl, 11, drv->ddhd, drv->filetype, &drvsec, sectable, 1);
drv->cyl = oldcyl;
side = oldside;
drv->buffered_cyl = -1;
di->image_crc_value = true;
}
di->unreadable = false;
- decode_buffer(drv->bigmfmbuf, drv->cyl, 11, drv->ddhd, drv->filetype, &drvsec, sectable, 1);
+ decode_buffer(drv, drv->bigmfmbuf, drv->cyl, 11, drv->ddhd, drv->filetype, &drvsec, sectable, 1);
di->hd = drv->ddhd == 2;
drv->cyl = oldcyl;
side = oldside;
}
}
end2:
+ load_track(num, oldcyl, oldside, sectable);
drive_image_free (drv);
if (wasdelayed > 1) {
drive_eject (drv);
drv->dskchange_time = wasdelayed;
disk_insert (num, drv->newname);
}
- load_track(num, oldcyl, oldside, sectable);
return ret;
}