]> gitweb.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Write to extended ADF fix long/short track support
authorToni Wilen <twilen@winuae.net>
Sun, 5 Jul 2026 17:32:10 +0000 (20:32 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 5 Jul 2026 17:32:10 +0000 (20:32 +0300)
disk.cpp

index 583a10284b958412be48302ab85de1589d54f6c2..2fa7e5078abe04952905e06d4f2eb28611fb79da 100644 (file)
--- 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;
                        }