From 849ed3456b39dd49d4a923e63b05d1cbdaf9856a Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 16 Oct 2021 12:55:48 +0300 Subject: [PATCH] FloppyBridge fixes. --- disk.cpp | 84 ++++++++++++++++++++++++++------------------------------ 1 file changed, 39 insertions(+), 45 deletions(-) diff --git a/disk.cpp b/disk.cpp index 5880d8be..c47d028d 100644 --- a/disk.cpp +++ b/disk.cpp @@ -229,6 +229,7 @@ typedef struct { #endif #ifdef FLOPPYBRIDGE FloppyDiskBridge *bridge; + bool writepending; #endif } drive; @@ -658,7 +659,7 @@ static void drive_settype_id (drive *drv) 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; @@ -668,11 +669,10 @@ static void drive_settype_id (drive *drv) 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 @@ -2416,7 +2416,7 @@ static void check_valid_mfm (uae_u16 *mbuf, int words, int sector) } #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; @@ -2431,7 +2431,9 @@ static int decode_buffer (uae_u16 *mbuf, int cyl, int drvsec, int ddhd, int file 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; @@ -2458,7 +2460,7 @@ static int decode_buffer (uae_u16 *mbuf, int cyl, int drvsec, int ddhd, int file 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; @@ -2482,8 +2484,8 @@ static int decode_buffer (uae_u16 *mbuf, int cyl, int drvsec, int ddhd, int file } 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; } @@ -2493,7 +2495,7 @@ static int decode_buffer (uae_u16 *mbuf, int cyl, int drvsec, int ddhd, int file 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; @@ -2521,7 +2523,7 @@ static int decode_buffer (uae_u16 *mbuf, int cyl, int drvsec, int ddhd, int file 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; @@ -2542,9 +2544,9 @@ static int decode_buffer (uae_u16 *mbuf, int cyl, int drvsec, int ddhd, int file 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; } @@ -2676,7 +2678,7 @@ static int drive_write_adf_amigados (drive *drv) 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; @@ -2830,6 +2832,7 @@ static void drive_write_data (drive * drv) 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 @@ -3513,13 +3516,13 @@ uae_u8 DISK_status_ciaa(void) 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 */ @@ -3539,7 +3542,7 @@ uae_u8 DISK_status_ciaa(void) 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))) { @@ -3808,31 +3811,11 @@ static void disk_doupdate_write(int floppybits, int trackspeed) 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; } @@ -3970,7 +3953,6 @@ static int doreaddma (void) } } if (disk_fifostatus () > 0) { - write_log (_T("doreaddma() fifo overflow detected, retrying..\n")); return -1; } else { DSKDAT (word); @@ -4331,6 +4313,16 @@ void DISK_hsync (void) } } +#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) @@ -4845,22 +4837,24 @@ static void floppybridge_read_track(drive *drv) 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--; @@ -5057,7 +5051,7 @@ static void load_track (int num, int cyl, int side, int *sectable) 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; @@ -5267,7 +5261,7 @@ int DISK_examine_image(struct uae_prefs *p, int num, struct diskinfo *di, bool d 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; @@ -5340,6 +5334,7 @@ end: } } end2: + load_track(num, oldcyl, oldside, sectable); drive_image_free (drv); if (wasdelayed > 1) { drive_eject (drv); @@ -5347,7 +5342,6 @@ end2: drv->dskchange_time = wasdelayed; disk_insert (num, drv->newname); } - load_track(num, oldcyl, oldside, sectable); return ret; } -- 2.47.3