}
/* 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;
}
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;
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;
if ((selected | disabled) & (1 << dr))
continue;
drive_write_data(drv);
+ }
}
}
}
- }
if (canloaddskbytr()) {
dskbytr_val = 0x8000;
}