Improve disk quick save/restore

- Flush disk I/O on save
    - Ignore ephemeral track_valid/track_dirty bits
    - Insure disks are ejected if there was a problem loading state
This commit is contained in:
Aaron Culliney 2015-12-12 00:21:27 -08:00
parent 0aed046b5e
commit edf42b81f9

View File

@ -945,6 +945,8 @@ bool disk6_saveState(StateHelper_s *helper) {
break; break;
} }
disk6_flush(i);
state = (uint8_t)disk6.disk[i].is_protected; state = (uint8_t)disk6.disk[i].is_protected;
if (!helper->save(fd, &state, 1)) { if (!helper->save(fd, &state, 1)) {
break; break;
@ -976,17 +978,17 @@ bool disk6_saveState(StateHelper_s *helper) {
LOG("SAVE disk[%lu] (0) <NULL>", i); LOG("SAVE disk[%lu] (0) <NULL>", i);
} }
state = (uint8_t)disk6.disk[i].track_valid; // Save unused placeholder -- backwards compatibility
state = 0x0;
if (!helper->save(fd, &state, 1)) { if (!helper->save(fd, &state, 1)) {
break; break;
} }
LOG("SAVE track_valid[%lu] = %02x", i, state);
state = (uint8_t)disk6.disk[i].track_dirty; // Save unused placeholder -- backwards compatibility
state = 0x0;
if (!helper->save(fd, &state, 1)) { if (!helper->save(fd, &state, 1)) {
break; break;
} }
LOG("SAVE track_dirty[%lu] = %02x", i, state);
state = (uint8_t)disk6.disk[i].phase; state = (uint8_t)disk6.disk[i].phase;
if (!helper->save(fd, &state, 1)) { if (!helper->save(fd, &state, 1)) {
@ -1080,25 +1082,28 @@ bool disk6_loadState(StateHelper_s *helper) {
break; break;
} }
snprintf(namebuf+namelen, gzlen, "%s", EXT_GZ); namebuf[namelen] = '\0';
namebuf[namelen+gzlen] = '\0'; if (disk6_insert(i, namebuf, disk6.disk[i].is_protected)) {
LOG("LOAD disk[%lu] : (%u) %s", i, namelen, namebuf); snprintf(namebuf+namelen, gzlen, "%s", EXT_GZ);
disk6_insert(i, namebuf, disk6.disk[i].is_protected); namebuf[namelen+gzlen] = '\0';
LOG("LOAD disk[%lu] : (%u) %s", i, namelen, namebuf);
if (disk6_insert(i, namebuf, disk6.disk[i].is_protected)) {
break;
}
}
FREE(namebuf); FREE(namebuf);
} }
// load placeholder
if (!helper->load(fd, &state, 1)) { if (!helper->load(fd, &state, 1)) {
break; break;
} }
disk6.disk[i].track_valid = state;
LOG("LOAD track_valid[%lu] = %02x", i, disk6.disk[i].track_valid);
// load placeholder
if (!helper->load(fd, &state, 1)) { if (!helper->load(fd, &state, 1)) {
break; break;
} }
disk6.disk[i].track_dirty = state;
LOG("LOAD track_dirty[%lu] = %02x", i, disk6.disk[i].track_dirty);
if (!helper->load(fd, &state, 1)) { if (!helper->load(fd, &state, 1)) {
break; break;
@ -1115,6 +1120,8 @@ bool disk6_loadState(StateHelper_s *helper) {
} }
if (!loaded_drives) { if (!loaded_drives) {
disk6_eject(0);
disk6_eject(1);
break; break;
} }