From: Toni Wilen Date: Sun, 5 Jul 2026 17:32:10 +0000 (+0300) Subject: Write to extended ADF fix long/short track support X-Git-Url: https://gitweb.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=62802fab227ceceed3e5d7020818046bc80b76ce;p=francis%2Fwinuae.git Write to extended ADF fix long/short track support --- diff --git a/disk.cpp b/disk.cpp index 583a1028..2fa7e507 100644 --- a/disk.cpp +++ b/disk.cpp @@ -2837,26 +2837,33 @@ static int drive_write_adf_amigados (drive *drv) } /* write raw track to disk file */ -static int drive_write_ext2 (uae_u16 *bigmfmbuf, struct zfile *diskfile, trackid *ti, int tracklen) -{ - int len, i, offset; - - offset = 0; - len = (tracklen + 7) / 8; - if (len > ti->len) { - write_log (_T("disk raw write: image file's track %d is too small (%d < %d)!\n"), ti->track, ti->len, len); - offset = (len - ti->len) / 2; - len = ti->len; - } - diskfile_update (diskfile, ti, tracklen, TRACK_RAW); - for (i = 0; i < ti->len / 2; i++) { - uae_u16 *mfm = bigmfmbuf + ((i + offset) % MAXMFMBUF); - uae_u16 *mfmw = bigmfmbufw + ((i + offset) % MAXMFMBUF); - uae_u8 *data = (uae_u8 *) mfm; - *mfmw = 256 * *data + *(data + 1); - } - zfile_fseek (diskfile, ti->offs, SEEK_SET); - zfile_fwrite (bigmfmbufw, 1, len, diskfile); +static int drive_write_ext2(uae_u16 *bigmfmbuf, struct zfile *diskfile, trackid *ti, int tracklen) +{ + int len; + if (floppy_writemode <= 0) { + len = FLOPPY_WRITE_LEN * 2; + tracklen = len * 8; + } else { + len = (tracklen + 7) / 8; + if (len > ti->len) { + write_log(_T("disk raw write: image file's track %d is too small (%d < %d)!\n"), ti->track, ti->len, len); + } + } + if (len > 0) { + if (len > ti->len) { + len = ti->len; + } + int maxlen = len > MAXMFMBUF ? MAXMFMBUF : len; + for (int i = 0; i < ti->len / 2; i++) { + uae_u16 *mfm = bigmfmbuf + (i % maxlen); + uae_u16 *mfmw = bigmfmbufw + (i % maxlen); + uae_u8 *data = (uae_u8*)mfm; + *mfmw = 256 * *data + *(data + 1); + } + diskfile_update(diskfile, ti, tracklen, TRACK_RAW); + zfile_fseek(diskfile, ti->offs, SEEK_SET); + zfile_fwrite(bigmfmbufw, 1, maxlen, diskfile); + } return 1; } @@ -2914,7 +2921,7 @@ static bool convert_adf_to_ext2 (drive *drv, int mode) return true; } -static void drive_write_data (drive * drv) +static void drive_write_data (drive *drv) { int ret = -1; int tr = drv->cyl * 2 + side; @@ -4048,9 +4055,12 @@ static int disk_doupdate_write(int floppybits, int trackspeed) for (dr = 0; dr < MAX_FLOPPY_DRIVES; dr++) { drive *drv2 = &floppy[dr]; if (drives[dr]) { + if (!drv2->writtento) { + drv2->bigmfmbuf[((drv2->mfmpos >> 4) - 1) % drv2->tracklen] = 0x5555; + drv2->writtento = 1; + } drv2->bigmfmbuf[drv2->mfmpos >> 4] = w; - drv2->bigmfmbuf[(drv2->mfmpos >> 4) + 1] = 0x5555; - drv2->writtento = 1; + drv2->bigmfmbuf[((drv2->mfmpos >> 4) + 1) % drv2->tracklen] = 0x5555; #ifdef FLOPPYBRIDGE if (drv2->bridge) { wasBridge = true; @@ -4081,10 +4091,10 @@ static int disk_doupdate_write(int floppybits, int trackspeed) if ((selected | disabled) & (1 << dr)) continue; drive_write_data(drv); + } } } } - } if (canloaddskbytr()) { dskbytr_val = 0x8000; }