static int userport_rtc_read_snapshot_module(snapshot_t *s) { BYTE major_version, minor_version; snapshot_module_t *m; /* enable device */ set_userport_rtc_enabled(1, NULL); m = snapshot_module_open(s, snap_module_name, &major_version, &minor_version); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (major_version > SNAP_MAJOR || minor_version > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } if (SMR_B_INT(m, &read_line_active) < 0) { goto fail; } snapshot_module_close(m); return rtc58321a_read_snapshot(rtc58321a_context, s); fail: snapshot_module_close(m); return -1; }
static int userport_digimax_read_snapshot_module(snapshot_t *s) { BYTE major_version, minor_version; snapshot_module_t *m; /* enable device */ set_digimax_enabled(1, NULL); m = snapshot_module_open(s, snap_module_name, &major_version, &minor_version); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (major_version > SNAP_MAJOR || minor_version > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } if (0 || (SMR_B(m, &userport_digimax_address) < 0) || (SMR_BA(m, digimax_sound_data, 4) < 0) || (SMR_B(m, &snd.voice0) < 0) || (SMR_B(m, &snd.voice1) < 0) || (SMR_B(m, &snd.voice2) < 0) || (SMR_B(m, &snd.voice3) < 0)) { goto fail; } return snapshot_module_close(m); fail: snapshot_module_close(m); return -1; }
static int dtlbasic_read_snapshot(struct snapshot_s *s) { BYTE major_version, minor_version; snapshot_module_t *m; /* enable device */ set_dtlbasic_dongle_enabled(1, NULL); m = snapshot_module_open(s, snap_module_name, &major_version, &minor_version); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (major_version > SNAP_MAJOR || minor_version > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } if (0 || SMR_DW_INT(m, &dtlbasic_counter) < 0 || SMR_DW_INT(m, &write_status) < 0 || SMR_DW_INT(m, &sense_status) < 0 || SMR_DW_INT(m, &dtlbasic_state) < 0) { goto fail; } return snapshot_module_close(m); fail: snapshot_module_close(m); return -1; }
static int paperclip64_read_snapshot(struct snapshot_s *s, int port) { BYTE major_version, minor_version; snapshot_module_t *m; m = snapshot_module_open(s, snap_module_name, &major_version, &minor_version); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (major_version > SNAP_MAJOR || minor_version > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } if (0 || SMR_DW_INT(m, &counter) < 0 || SMR_B(m, &command) < 0 || SMR_B_INT(m, &state) < 0) { goto fail; } return snapshot_module_close(m); fail: snapshot_module_close(m); return -1; }
int vic20_snapshot_read(const char *name, int event_mode) { snapshot_t *s; BYTE minor, major; s = snapshot_open(name, &major, &minor, machine_name); if (s == NULL) { return -1; } if (major != SNAP_MAJOR || minor != SNAP_MINOR) { log_error(LOG_DEFAULT, "Snapshot version (%d.%d) not valid: expecting %d.%d.", major, minor, SNAP_MAJOR, SNAP_MINOR); snapshot_set_error(SNAPSHOT_MODULE_INCOMPATIBLE); goto fail; } joyport_clear_devices(); /* FIXME: Missing sound. */ if (maincpu_snapshot_read_module(s) < 0 || vic20_snapshot_read_module(s) < 0 || vic_snapshot_read_module(s) < 0 || viacore_snapshot_read_module(machine_context.via1, s) < 0 || viacore_snapshot_read_module(machine_context.via2, s) < 0 || drive_snapshot_read_module(s) < 0 || event_snapshot_read_module(s, event_mode) < 0 || tapeport_snapshot_read_module(s) < 0 || keyboard_snapshot_read_module(s) < 0 || joyport_snapshot_read_module(s, JOYPORT_1) < 0 || userport_snapshot_read_module(s) < 0) { goto fail; } if (viacore_snapshot_read_module(machine_context.ieeevia1, s) < 0 || viacore_snapshot_read_module(machine_context.ieeevia2, s) < 0) { /* IEEE488 module not undumped */ resources_set_int("IEEE488", 0); } else { resources_set_int("IEEE488", 1); } snapshot_close(s); sound_snapshot_finish(); return 0; fail: if (s != NULL) { snapshot_close(s); } machine_trigger_reset(MACHINE_RESET_MODE_SOFT); return -1; }
int rtc72421_read_snapshot(rtc_72421_t *context, snapshot_t *s) { DWORD latch_lo = 0; DWORD latch_hi = 0; DWORD offset_lo = 0; DWORD offset_hi = 0; DWORD old_offset_lo = 0; DWORD old_offset_hi = 0; BYTE vmajor, vminor; snapshot_module_t *m; m = snapshot_module_open(s, snap_module_name, &vmajor, &vminor); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (vmajor > SNAP_MAJOR || vminor > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } if (0 || SMR_B_INT(m, &context->stop) < 0 || SMR_B_INT(m, &context->hour24) < 0 || SMR_DW(m, &latch_hi) < 0 || SMR_DW(m, &latch_lo) < 0 || SMR_DW(m, &offset_hi) < 0 || SMR_DW(m, &offset_lo) < 0 || SMR_DW(m, &old_offset_hi) < 0 || SMR_DW(m, &old_offset_lo) < 0 || SMR_STR(m, &context->device) < 0) { goto fail; } #if (SIZE_OF_TIME_T == 8) context->latch = (time_t)(latch_hi) << 32; context->latch |= latch_lo; context->offset = (time_t)(offset_hi) << 32; context->offset |= offset_lo; context->old_offset = (time_t)(old_offset_hi) << 32; context->old_offset |= old_offset_lo; #else context->latch = latch_lo; context->offset = offset_lo; context->old_offset = old_offset_lo; #endif return snapshot_module_close(m); fail: snapshot_module_close(m); return -1; }
int c64_snapshot_read(const char *name, int event_mode) { snapshot_t *s; uint8_t minor, major; s = snapshot_open(name, &major, &minor, machine_get_name()); if (s == NULL) { return -1; } if (major != SNAP_MAJOR || minor != SNAP_MINOR) { log_error(LOG_DEFAULT, "Snapshot version (%d.%d) not valid: expecting %d.%d.", major, minor, SNAP_MAJOR, SNAP_MINOR); snapshot_set_error(SNAPSHOT_MODULE_INCOMPATIBLE); goto fail; } vicii_snapshot_prepare(); joyport_clear_devices(); if (maincpu_snapshot_read_module(s) < 0 || c64_snapshot_read_module(s) < 0 || ciacore_snapshot_read_module(machine_context.cia1, s) < 0 || ciacore_snapshot_read_module(machine_context.cia2, s) < 0 || sid_snapshot_read_module(s) < 0 || drive_snapshot_read_module(s) < 0 || vicii_snapshot_read_module(s) < 0 || c64_glue_snapshot_read_module(s) < 0 || event_snapshot_read_module(s, event_mode) < 0 || memhacks_snapshot_read_modules(s) < 0 || tapeport_snapshot_read_module(s) < 0 || keyboard_snapshot_read_module(s) < 0 || joyport_snapshot_read_module(s, JOYPORT_1) < 0 || joyport_snapshot_read_module(s, JOYPORT_2) < 0 || userport_snapshot_read_module(s) < 0) { goto fail; } snapshot_close(s); sound_snapshot_finish(); return 0; fail: if (s != NULL) { snapshot_close(s); } machine_trigger_reset(MACHINE_RESET_MODE_SOFT); return -1; }
int c64_glue_snapshot_read_module(snapshot_t *s) { BYTE major_version, minor_version; int snap_type, snap_alarm_active; snapshot_module_t *m; m = snapshot_module_open(s, snap_module_name, &major_version, &minor_version); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (major_version > SNAP_MAJOR || minor_version > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } if (0 || SMR_B_INT(m, &snap_type) < 0 || SMR_B_INT(m, &old_vbank) < 0 || SMR_B_INT(m, &snap_alarm_active) < 0) { goto fail; } if (snap_type != glue_logic_type) { log_warning(LOG_DEFAULT, "GlueLogic: Snapshot type %i differs from selected type %i, changing.", snap_type, glue_logic_type); glue_logic_type = snap_type; } if (glue_alarm_active) { glue_alarm_unset(); } glue_alarm_active = snap_alarm_active; if (glue_alarm_active && (glue_logic_type == 1)) { glue_alarm_set(); } snapshot_module_close(m); return 0; fail: if (m != NULL) { snapshot_module_close(m); } return -1; }
int pet_snapshot_read(const char *name, int event_mode) { snapshot_t *s; BYTE minor, major; int ef = 0; s = snapshot_open(name, &major, &minor, machine_name); if (s == NULL) { return -1; } if (major != SNAP_MAJOR || minor != SNAP_MINOR) { log_error(LOG_DEFAULT, "Snapshot version (%d.%d) not valid: expecting %d.%d.", major, minor, SNAP_MAJOR, SNAP_MINOR); snapshot_set_error(SNAPSHOT_MODULE_INCOMPATIBLE); ef = -1; } if (ef || maincpu_snapshot_read_module(s) < 0 || cpu6809_snapshot_read_module(s) < 0 || pet_snapshot_read_module(s) < 0 || crtc_snapshot_read_module(s) < 0 || pia1_snapshot_read_module(s) < 0 || pia2_snapshot_read_module(s) < 0 || petdww_snapshot_read_module(s) < 0 || viacore_snapshot_read_module(machine_context.via, s) < 0 || drive_snapshot_read_module(s) < 0 || event_snapshot_read_module(s, event_mode) < 0 || tapeport_snapshot_read_module(s) < 0 || keyboard_snapshot_read_module(s) < 0 || userport_snapshot_read_module(s) < 0) { ef = -1; } if (!ef) { acia1_snapshot_read_module(s); /* optional, so no error check */ } snapshot_close(s); if (ef) { machine_trigger_reset(MACHINE_RESET_MODE_SOFT); } sound_snapshot_finish(); return ef; }
int cbm2_snapshot_read(const char *name, int event_mode) { snapshot_t *s; BYTE minor, major; s = snapshot_open(name, &major, &minor, machine_get_name()); if (s == NULL) { return -1; } if (major != SNAP_MAJOR || minor != SNAP_MINOR) { log_error(LOG_DEFAULT, "Snapshot version (%d.%d) not valid: expecting %d.%d.", major, minor, SNAP_MAJOR, SNAP_MINOR); snapshot_set_error(SNAPSHOT_MODULE_INCOMPATIBLE); goto fail; } if (maincpu_snapshot_read_module(s) < 0 || crtc_snapshot_read_module(s) < 0 || cbm2_snapshot_read_module(s) < 0 || ciacore_snapshot_read_module(machine_context.cia1, s) < 0 || tpicore_snapshot_read_module(machine_context.tpi1, s) < 0 || tpicore_snapshot_read_module(machine_context.tpi2, s) < 0 || acia1_snapshot_read_module(s) < 0 || sid_snapshot_read_module(s) < 0 || drive_snapshot_read_module(s) < 0 || event_snapshot_read_module(s, event_mode) < 0 || tapeport_snapshot_read_module(s) < 0 || keyboard_snapshot_read_module(s) < 0 || userport_snapshot_read_module(s) < 0) { goto fail; } sound_snapshot_finish(); return 0; fail: if (s != NULL) { snapshot_close(s); } machine_trigger_reset(MACHINE_RESET_MODE_SOFT); return -1; }
int freezemachine_snapshot_read_module(snapshot_t *s) { BYTE vmajor, vminor; snapshot_module_t *m; m = snapshot_module_open(s, snap_module_name, &vmajor, &vminor); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (vmajor > SNAP_MAJOR || vminor > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } if (0 || SMR_B_INT(m, &rom_A14) < 0 || SMR_B_INT(m, &roml_toggle) < 0) { goto fail; } /* new in 0.1 */ if (SNAPVAL(vmajor, vminor, 0, 1)) { if (SMR_B_INT(m, &allow_toggle) < 0) { goto fail; } } else { allow_toggle = 0; } if (0 || SMR_BA(m, roml_banks, 0x4000) < 0 || SMR_BA(m, romh_banks, 0x4000) < 0) { goto fail; } snapshot_module_close(m); return freezemachine_common_attach(); fail: snapshot_module_close(m); return -1; }
int freezeframe_snapshot_read_module(snapshot_t *s) { BYTE vmajor, vminor; snapshot_module_t *m; m = snapshot_module_open(s, snap_module_name, &vmajor, &vminor); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (vmajor > SNAP_MAJOR || vminor > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } /* new in 0.1 */ if (SNAPVAL(vmajor, vminor, 0, 1)) { if (0 || SMR_B_INT(m, &freezeframe_rom_8000) < 0 || SMR_B_INT(m, &freezeframe_rom_e000) < 0) { goto fail; } } else { freezeframe_rom_8000 = 0; freezeframe_rom_e000 = 0; } if (SMR_BA(m, roml_banks, FREEZE_FRAME_CART_SIZE) < 0) { goto fail; } snapshot_module_close(m); memcpy(romh_banks, roml_banks, FREEZE_FRAME_CART_SIZE); return freezeframe_common_attach(); fail: snapshot_module_close(m); return -1; }
int sidcart_snapshot_read_module(snapshot_t *s) { BYTE vmajor, vminor; snapshot_module_t *m; int tmp_address; int tmp_clock; m = snapshot_module_open(s, snap_module_name, &vmajor, &vminor); if (m == NULL) { return -1; } /* Do not allow versions higher than current */ if (vmajor > SNAP_MAJOR || vminor > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } set_sidcart_enabled(0, NULL); if (0 || SMR_W_INT(m, &tmp_address) < 0 || SMR_B_INT(m, &tmp_clock) < 0) { goto fail; } snapshot_module_close(m); set_sid_address(tmp_address, NULL); set_sid_clock(tmp_clock, NULL); set_sidcart_enabled(1, NULL); return sid_snapshot_read_module(s); fail: snapshot_module_close(m); return -1; }
int rex_snapshot_read_module(snapshot_t *s) { BYTE vmajor, vminor; snapshot_module_t *m; m = snapshot_module_open(s, snap_module_name, &vmajor, &vminor); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if ((vmajor != SNAP_MAJOR) || (vminor != SNAP_MINOR)) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } /* new in 0.1 */ if (SNAPVAL(vmajor, vminor, 0, 1)) { if (SMR_B_INT(m, &rex_active) < 0) { goto fail; } } else { rex_active = 0; } if (SMR_BA(m, roml_banks, 0x2000 * 64) < 0) { goto fail; } snapshot_module_close(m); return rex_common_attach(); fail: snapshot_module_close(m); return -1; }
int riotcore_snapshot_read_module(riot_context_t *riot_context, snapshot_t *p) { BYTE vmajor, vminor; BYTE byte_r_N; BYTE byte; WORD word_r_divider; WORD word_r_write_clk; snapshot_module_t *m; m = snapshot_module_open(p, riot_context->myname, &vmajor, &vminor); if (m == NULL) { log_message(riot_context->log, "Could not find snapshot module %s", riot_context->myname); return -1; } /* Do not accept versions higher than current */ if (vmajor > RIOT_DUMP_VER_MAJOR || vminor > RIOT_DUMP_VER_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); snapshot_module_close(m); return -1; } /* just to be safe */ alarm_unset(riot_context->alarm); if (0 || SMR_B(m, &(riot_context->riot_io)[0]) < 0 || SMR_B(m, &(riot_context->riot_io)[1]) < 0 || SMR_B(m, &(riot_context->riot_io)[2]) < 0 || SMR_B(m, &(riot_context->riot_io)[3]) < 0 || SMR_B(m, &(riot_context->r_edgectrl)) < 0 || SMR_B(m, &(riot_context->r_irqfl)) < 0 || SMR_B(m, &byte_r_N) < 0 || SMR_W(m, &word_r_divider) < 0 || SMR_W(m, &word_r_write_clk) < 0 || SMR_B(m, &byte) < 0) { snapshot_module_close(m); return -1; } riot_context->old_pa = riot_context->riot_io[0] | ~(riot_context->riot_io)[1]; riot_context->undump_pra(riot_context, riot_context->old_pa); riot_context->old_pb = riot_context->riot_io[2] | ~(riot_context->riot_io)[3]; riot_context->undump_prb(riot_context, riot_context->old_pb); riot_context->r_N = byte_r_N; riot_context->r_divider = word_r_divider; riot_context->r_write_clk = *(riot_context->clk_ptr) - word_r_write_clk; if (riot_context->r_irqfl & 1) { riot_context->r_irqline = 1; riot_context->restore_irq(riot_context, 1); } riot_context->r_irqfl &= 0xc0; riot_context->r_irqen = byte; if (riot_context->r_irqen) { alarm_set(riot_context->alarm, riot_context->r_write_clk + riot_context->r_N * riot_context->r_divider); } riot_context->read_clk = 0; return snapshot_module_close(m); }
static int tapelog_read_snapshot(struct snapshot_s *s) { BYTE major_version, minor_version; snapshot_module_t *m; /* enable device */ set_tapelog_enabled(1, NULL); m = snapshot_module_open(s, snap_module_name, &major_version, &minor_version); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (major_version > SNAP_MAJOR || minor_version > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } if (SMR_B(m, &tapelog_motor_out) < 0) { goto fail; } /* new in 0.1 */ if (SNAPVAL(major_version, minor_version, 0, 1)) { if (SMR_B(m, &tapelog_motor_in) < 0) { goto fail; } } else { tapelog_motor_in = 2; } if (0 || SMR_B(m, &tapelog_sense_in) < 0 || SMR_B(m, &tapelog_sense_out) < 0 || SMR_B(m, &tapelog_write_out) < 0) { goto fail; } /* new in 0.1 */ if (SNAPVAL(major_version, minor_version, 0, 1)) { if (0 || SMR_B(m, &tapelog_write_in) < 0 || SMR_B(m, &tapelog_read_out) < 0) { goto fail; } } else { tapelog_write_in = 2; tapelog_read_out = 2; } if (SMR_DW_UINT(m, &tapelog_read_in) < 0) { goto fail; } return snapshot_module_close(m); fail: snapshot_module_close(m); return -1; }
int tapeport_snapshot_read_module(snapshot_t *s) { BYTE major_version, minor_version; snapshot_module_t *m; int amount = 0; char **detach_resource_list = NULL; tapeport_device_list_t *current = tapeport_head.next; int *devices = NULL; tapeport_snapshot_list_t *c = NULL; int i = 0; /* detach all tapeport devices */ while (current) { ++amount; current = current->next; } if (amount) { detach_resource_list = lib_malloc(sizeof(char *) * (amount + 1)); memset(detach_resource_list, 0, sizeof(char *) * (amount + 1)); current = tapeport_head.next; while (current) { detach_resource_list[i++] = current->device->resource; current = current->next; } for (i = 0; i < amount; ++i) { resources_set_int(detach_resource_list[i], 0); } lib_free(detach_resource_list); } m = snapshot_module_open(s, snap_module_name, &major_version, &minor_version); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (major_version > SNAP_MAJOR || minor_version > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } if (0 || SMR_B_INT(m, &tapeport_active) < 0 || SMR_B_INT(m, &amount) < 0) { goto fail; } if (amount) { devices = lib_malloc(sizeof(int) * (amount + 1)); for (i = 0; i < amount; ++i) { if (SMR_B_INT(m, &devices[i]) < 0) { lib_free(devices); goto fail; } } snapshot_module_close(m); for (i = 0; i < amount; ++i) { c = tapeport_snapshot_head.next; while (c) { if (c->snapshot->id == devices[i]) { if (c->snapshot->read_snapshot) { if (c->snapshot->read_snapshot(s) < 0) { lib_free(devices); return -1; } } } c = c->next; } } return 0; } return snapshot_module_close(m); fail: snapshot_module_close(m); return -1; }
int shortbus_read_snapshot_module(snapshot_t *s) { BYTE major_version, minor_version; snapshot_module_t *m; int active_devices; int devices[4]; m = snapshot_module_open(s, snap_module_name, &major_version, &minor_version); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (major_version > SNAP_MAJOR || minor_version > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } if (0 || SMR_B_INT(m, &active_devices) < 0 || SMR_B_INT(m, &devices[0]) < 0 || SMR_B_INT(m, &devices[1]) < 0 || SMR_B_INT(m, &devices[2]) < 0 || SMR_B_INT(m, &devices[3]) < 0) { goto fail; } snapshot_module_close(m); if (active_devices) { if (devices[0]) { if (shortbus_digimax_read_snapshot_module(s) < 0) { return -1; } } #ifdef HAVE_PCAP if (devices[2]) { if (shortbus_etfe_read_snapshot_module(s) < 0) { return -1; } } #endif /* TODO */ #if 0 if (devices[1]) { if (shortbus_duart_read_snapshot_module(s) < 0) { return -1; } } if (devices[3]) { if (shortbus_eth64_read_snapshot_module(s) < 0) { return -1; } } #endif } return 0; fail: snapshot_module_close(m); return -1; }
int ds1216e_read_snapshot(rtc_ds1216e_t *context, snapshot_t *s) { DWORD latch_lo = 0; DWORD latch_hi = 0; DWORD offset_lo = 0; DWORD offset_hi = 0; DWORD old_offset_lo = 0; DWORD old_offset_hi = 0; BYTE vmajor, vminor; snapshot_module_t *m; m = snapshot_module_open(s, snap_module_name, &vmajor, &vminor); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (vmajor > SNAP_MAJOR || vminor > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } if (0 || SMR_B_INT(m, &context->reset) < 0 || SMR_B_INT(m, &context->inactive) < 0 || SMR_B_INT(m, &context->hours12) < 0 || SMR_B_INT(m, &context->pattern_pos) < 0 || SMR_B_INT(m, &context->pattern_ignore) < 0 || SMR_B_INT(m, &context->output) < 0 || SMR_B_INT(m, &context->output_pos) < 0 || SMR_DW(m, &latch_hi) < 0 || SMR_DW(m, &latch_lo) < 0 || SMR_DW(m, &offset_hi) < 0 || SMR_DW(m, &offset_lo) < 0 || SMR_DW(m, &old_offset_hi) < 0 || SMR_DW(m, &old_offset_lo) < 0 || SMR_BA(m, context->clock_regs, DS1216E_REG_SIZE) < 0 || SMR_BA(m, context->old_clock_regs, DS1216E_REG_SIZE) < 0 || SMR_BA(m, context->clock_regs_changed, DS1216E_REG_SIZE) < 0 || SMR_STR(m, &context->device) < 0) { goto fail; } #if (SIZE_OF_TIME_T == 8) context->latch = (time_t)(latch_hi) << 32; context->latch |= latch_lo; context->offset = (time_t)(offset_hi) << 32; context->offset |= offset_lo; context->old_offset = (time_t)(old_offset_hi) << 32; context->old_offset |= old_offset_lo; #else context->latch = latch_lo; context->offset = offset_lo; context->old_offset = old_offset_lo; #endif return snapshot_module_close(m); fail: snapshot_module_close(m); return -1; }
int ramcart_snapshot_read_module(snapshot_t *s) { uint8_t vmajor, vminor; snapshot_module_t *m; m = snapshot_module_open(s, snap_module_name, &vmajor, &vminor); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (vmajor > SNAP_MAJOR || vminor > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } if (0 || (SMR_B_INT(m, &ramcart_enabled) < 0) || (SMR_B_INT(m, &ramcart_readonly) < 0) || (SMR_DW_INT(m, &ramcart_size) < 0) || (SMR_B_INT(m, &ramcart_size_kb) < 0) || (SMR_BA(m, ramcart, 2) < 0)) { goto fail; } ramcart_ram = lib_malloc(ramcart_size); if (SMR_BA(m, ramcart_ram, ramcart_size) < 0) { snapshot_module_close(m); lib_free(ramcart_ram); ramcart_ram = NULL; return -1; } snapshot_module_close(m); /* ramcart_filetype = 0; */ ramcart_write_image = 0; ramcart_enabled = 1; /* FIXME: ugly code duplication to avoid cart_config_changed calls */ ramcart_io1_list_item = io_source_register(&ramcart_io1_device); ramcart_io2_list_item = io_source_register(&ramcart_io2_device); if (export_add(&export_res) < 0) { lib_free(ramcart_ram); ramcart_ram = NULL; io_source_unregister(ramcart_io1_list_item); io_source_unregister(ramcart_io2_list_item); ramcart_io1_list_item = NULL; ramcart_io2_list_item = NULL; ramcart_enabled = 0; return -1; } return 0; fail: snapshot_module_close(m); return -1; }