--- uae/src/disk.c 2018/04/24 17:01:46 1.1.1.12 +++ uae/src/disk.c 2018/04/24 17:12:21 1.1.1.17 @@ -33,9 +33,10 @@ #include "execlib.h" #include "savestate.h" -#define FLOPPY_GAP_LEN 360 /* writable track length with normal 2us bitcell/300RPM motor */ -#define FLOPPY_WRITE_LEN 6250 +#define FLOPPY_WRITE_LEN (12650 / 2) +/* This works out to 341 */ +#define FLOPPY_GAP_LEN (FLOPPY_WRITE_LEN - 11 * 544) /* (cycles/bitcell) << 8, normal = ((2us/280ns)<<8) = ~1830 */ #define NORMAL_FLOPPY_SPEED 1830 @@ -730,10 +731,12 @@ void DISK_check_change (void) for (i = 0; i < 4; i++) { drive *drv = floppy + i; + gui_lock (); if (strcmp (currprefs.df[i], changed_prefs.df[i])) { strcpy (currprefs.df[i], changed_prefs.df[i]); disk_insert (i, currprefs.df[i]); } + gui_unlock (); /* emulate drive motor turn on time */ if (drv->dskready_time) { drv->dskready_time--; @@ -863,7 +866,7 @@ static uae_u32 dskpt; static void disk_dmafinished (void) { INTREQ (0x8002); - dskdmaen = 1; /* surprise, it isn't set to zero! */ + dskdmaen = 0; /* ??? */ #ifdef DISK_DEBUG write_log("disk dma finished %08.8X\n", dskpt); #endif @@ -1034,6 +1037,35 @@ static void dodmafetch (void) dma_tab[0] = 0xffffffff; } +/* this is very unoptimized. DSKBYTR is used very rarely, so it should not matter. */ + +uae_u16 DSKBYTR (int hpos) +{ + uae_u16 v; + int i; + + i = 0; + while (hpos > dskbytr_cycle[i + 1]) + i++; + v = dskbytr_tab[i]; + dskbytr_tab[i] &= ~0x8000; + if (wordsync_cycle[0] != 255) { + i = 0; + while (hpos < wordsync_cycle[i]) + i++; + if (hpos - wordsync_cycle[i] <= WORDSYNC_CYCLES) + v |= 0x1000; + } + if (dskdmaen && (dmacon & 0x210) == 0x210) + v |= 0x4000; + if (dskdmaen == 3) + v |= 0x2000; + + disk_data_used = 0; + + return v; +} + static void DISK_start (void) { int dr; @@ -1192,35 +1224,6 @@ void DSKLEN (uae_u16 v, int hpos) } } -/* this is very unoptimized. DSKBYTR is used very rarely, so it should not matter. */ - -uae_u16 DSKBYTR (int hpos) -{ - uae_u16 v; - int i; - - i = 0; - while (hpos > dskbytr_cycle[i + 1]) - i++; - v = dskbytr_tab[i]; - dskbytr_tab[i] &= ~0x8000; - if (wordsync_cycle[0] != 255) { - i = 0; - while (hpos < wordsync_cycle[i]) - i++; - if (hpos - wordsync_cycle[i] <= WORDSYNC_CYCLES) - v |= 0x1000; - } - if (dskdmaen && (dmacon & 0x210) == 0x210) - v |= 0x4000; - if (dskdmaen == 3) - v |= 0x2000; - - disk_data_used = 0; - - return v; -} - /* not a real hardware register */ uae_u16 DSKDATR (int hpos) { @@ -1277,6 +1280,10 @@ void DISK_init (void) void DISK_reset (void) { int i; + + if (savestate_state) + return; + disk_hpos = 0; disk_data_used = 0; disabled = 0; @@ -1318,17 +1325,24 @@ void DISK_restore_custom (uae_u32 pdskpt uae_u8 *restore_disk(int num,uae_u8 *src) { drive *drv; + int state; drv = &floppy[num]; + disabled &= ~(1 << num); drv->drive_id = restore_u32 (); - drv->motoroff = restore_u8 () ? 0 : 1; + state = restore_u8 (); + if (state & 2) + disabled |= 1 << num; + else + drv->motoroff = (state & 1) ? 0 : 1; drv->cyl = restore_u8 (); drv->dskready = restore_u8 (); drv->drive_id_scnt = restore_u8 (); drv->mfmpos = restore_u32 (); restore_u32 (); - strncpy(currprefs.df[num],src,255); - src+=strlen(src)+1; + strncpy(changed_prefs.df[num],src,255); + changed_prefs.df[num][255] = 0; + src += strlen(src) + 1; return src; } @@ -1341,7 +1355,7 @@ uae_u8 *save_disk(int num,int *len) drv = &floppy[num]; dstbak = dst = malloc (2+1+1+1+1+4+4+256); save_u32 (drv->drive_id); /* drive type ID */ - save_u8 (drv->motoroff ? 0:1); /* motor state */ + save_u8 ((drv->motoroff ? 0:1) | ((disabled & (1 << num)) ? 2 : 0)); /* state */ save_u8 (drv->cyl); /* cylinder */ save_u8 (drv->dskready); /* dskready */ save_u8 (drv->drive_id_scnt); /* id mode position */