int vic20cart_snapshot_read_module(snapshot_t *s) { BYTE vmajor, vminor; snapshot_module_t *m; int new_cart_type, cartridge_reset; int ret = 0; m = snapshot_module_open(s, SNAP_MODULE_NAME, &vmajor, &vminor); if (m == NULL) { return -1; } if (vmajor != VIC20CART_DUMP_VER_MAJOR) { snapshot_module_close(m); return -1; } if (SMR_DW_INT(m, &new_cart_type) < 0) { snapshot_module_close(m); return -1; } snapshot_module_close(m); /* disable cartridge reset while detaching old cart */ resources_get_int("CartridgeReset", &cartridge_reset); resources_set_int("CartridgeReset", 0); cartridge_detach_image(-1); resources_set_int("CartridgeReset", cartridge_reset); /* disallow "set as default" and write back */ cartridge_is_from_snapshot = 1; vic20cart_type = new_cart_type; mem_cartridge_type = new_cart_type; switch (vic20cart_type) { case CARTRIDGE_VIC20_GENERIC: ret = generic_snapshot_read_module(s); break; case CARTRIDGE_VIC20_FP: ret = vic_fp_snapshot_read_module(s); break; case CARTRIDGE_VIC20_MEGACART: ret = megacart_snapshot_read_module(s); break; case CARTRIDGE_VIC20_FINAL_EXPANSION: ret = finalexpansion_snapshot_read_module(s); break; case CARTRIDGE_NONE: /* cart already detached, nothing to do */ break; default: /* unknown cart */ ret = -1; break; } if (ret < 0) { vic20cart_type = CARTRIDGE_NONE; mem_cartridge_type = CARTRIDGE_NONE; } return ret; }
int vic20cart_snapshot_read_module(snapshot_t *s) { BYTE vmajor, vminor; snapshot_module_t *m; int new_cart_type, cartridge_reset; BYTE i; BYTE number_of_carts; int cart_ids[VIC20CART_DUMP_MAX_CARTS]; m = snapshot_module_open(s, SNAP_MODULE_NAME, &vmajor, &vminor); if (m == NULL) { return -1; } if (vmajor != VIC20CART_DUMP_VER_MAJOR) { goto fail; } if (SMR_DW_INT(m, &new_cart_type) < 0) { goto fail; } if (SMR_B(m, &number_of_carts) < 0) { goto fail; } /* Not much to do if no carts in snapshot */ if (number_of_carts == 0) { return snapshot_module_close(m); } if (number_of_carts > VIC20CART_DUMP_MAX_CARTS) { DBG(("CART snapshot read: carts %i > max %i\n", number_of_carts, VIC20CART_DUMP_MAX_CARTS)); goto fail; } /* Read cart IDs */ for (i = 0; i < number_of_carts; i++) { if (SMR_DW_INT(m, &cart_ids[i]) < 0) { goto fail; } } snapshot_module_close(m); /* disable cartridge reset while detaching old cart */ resources_get_int("CartridgeReset", &cartridge_reset); resources_set_int("CartridgeReset", 0); cartridge_detach_image(-1); resources_set_int("CartridgeReset", cartridge_reset); /* disallow "set as default" and write back */ cartridge_is_from_snapshot = 1; vic20cart_type = new_cart_type; mem_cartridge_type = new_cart_type; /* Read individual cart data */ for (i = 0; i < number_of_carts; i++) { switch (cart_ids[i]) { case CARTRIDGE_VIC20_FINAL_EXPANSION: if (finalexpansion_snapshot_read_module(s) < 0) { return -1; } break; case CARTRIDGE_VIC20_IO2_RAM: if (ioramcart_io2_snapshot_read_module(s) < 0) { return -1; } break; case CARTRIDGE_VIC20_IO3_RAM: if (ioramcart_io3_snapshot_read_module(s) < 0) { return -1; } break; case CARTRIDGE_VIC20_MEGACART: if (megacart_snapshot_read_module(s) < 0) { return -1; } break; case CARTRIDGE_VIC20_UM: if (vic_um_snapshot_read_module(s) < 0) { return -1; } break; case CARTRIDGE_VIC20_IEEE488: if (vic20_ieee488_snapshot_read_module(s) < 0) { return -1; } break; #ifdef HAVE_MIDI case CARTRIDGE_MIDI_MAPLIN: if (vic20_midi_snapshot_read_module(s) < 0) { return -1; } break; #endif case CARTRIDGE_VIC20_SIDCART: if (sidcart_snapshot_read_module(s) < 0) { return -1; } break; case CARTRIDGE_VIC20_FP: if (vic_fp_snapshot_read_module(s) < 0) { return -1; } break; case CARTRIDGE_ACIA: if (aciacart_snapshot_read_module(s) < 0) { return -1; } break; case CARTRIDGE_DIGIMAX: if (digimax_snapshot_read_module(s) < 0) { return -1; } break; case CARTRIDGE_DS12C887RTC: if (ds12c887rtc_snapshot_read_module(s) < 0) { return -1; } break; case CARTRIDGE_GEORAM: if (georam_read_snapshot_module(s) < 0) { return -1; } break; case CARTRIDGE_SFX_SOUND_EXPANDER: if (sfx_soundexpander_snapshot_read_module(s) < 0) { return -1; } break; case CARTRIDGE_SFX_SOUND_SAMPLER: if (sfx_soundsampler_snapshot_read_module(s) < 0) { return -1; } break; #ifdef HAVE_TFE case CARTRIDGE_TFE: if (tfe_snapshot_read_module(s) < 0) { return -1; } break; #endif } } if (vic20cart_type == CARTRIDGE_VIC20_GENERIC) { if (generic_snapshot_read_module(s) < 0) { return -1; } } return 0; fail: snapshot_module_close(m); return -1; }