/* detach a cartridge. - carts that are not "main" cartridges can be disabled individually - if type is -1, then all carts will get detached - if type is 0, then cart in main slot will get detached - carts not in "Main Slot" must make sure their detach hook does not fail when it is called and the cart is not actually attached. */ void cartridge_detach_image(int type) { if (type == 0) { DBG(("CART: detach MAIN ID: %d\n", type)); cart_detach_slotmain(); } else if (type == -1) { cart_detach_all(); } else { DBG(("CART: detach ID: %d\n", type)); /* detach only given type */ if (cart_is_slotmain(type)) { cart_detach_slotmain(); } else { cart_detach(type); } } /* FIXME: cart_detach should take care of it */ DBG(("CART: unset cart config\n")); cart_config_changed_slotmain(CMODE_RAM, CMODE_RAM, CMODE_READ); cart_power_off(); }
void c64export_dump(void) { export_list_t *current = NULL; io_source_t *io; current = c64export_query_list(current); if (current == NULL) { mon_out("No expansion port devices.\n"); } else { while (current != NULL) { if (cart_is_slotmain(current->device->cartid)) { mon_out("* "); } else { mon_out(" "); } mon_out("%5d ", current->device->cartid); mon_out("%4s ", current->device->game ? "GAME" : "-"); mon_out("%5s ", current->device->exrom ? "EXROM" : "-"); io=current->device->io1; if (io) { mon_out("IO1:%04x-%04x ", io->start_address, io->end_address); } else { mon_out(" "); } io=current->device->io2; if (io) { mon_out("IO2:%04x-%04x ", io->start_address, io->end_address); } else { mon_out(" "); } mon_out("%s\n", current->device->name); current = current->next; } } }
/* Attach cartridge from snapshot Sets static variables related to the "Main Slot". This is needed for cart_getid_slotmain to return a proper value for cart_freeze and such. */ void cart_attach_from_snapshot(int type) { if (cart_is_slotmain(type)) { c64cart_type = type; } }
/* attach cartridge image type == -1 NONE type == 0 CRT format returns -1 on error, 0 on success */ int cartridge_attach_image(int type, const char *filename) { BYTE *rawcart; char *abs_filename; int carttype = CARTRIDGE_NONE; int cartid = CARTRIDGE_NONE; int oldmain = CARTRIDGE_NONE; int slotmain = 0; if (filename == NULL) { return -1; } /* Attaching no cartridge always works. */ if (type == CARTRIDGE_NONE || *filename == '\0') { return 0; } if (archdep_path_is_relative(filename)) { archdep_expand_path(&abs_filename, filename); } else { abs_filename = lib_stralloc(filename); } if (type == CARTRIDGE_CRT) { carttype = crt_getid(abs_filename); if (carttype == -1) { log_message(LOG_DEFAULT, "CART: '%s' is not a valid CRT file.", abs_filename); lib_free(abs_filename); return -1; } } else { carttype = type; } DBG(("CART: cartridge_attach_image type: %d ID: %d\n", type, carttype)); /* allocate temporary array */ rawcart = lib_malloc(C64CART_IMAGE_LIMIT); /* cart should always be detached. there is no reason for doing fancy checks here, and it will cause problems incase a cart MUST be detached before attaching another, or even itself. (eg for initialization reasons) most obvious reason: attaching a different ROM (software) for the same cartridge (hardware) */ slotmain = cart_is_slotmain(carttype); if (slotmain) { /* if the cart to be attached is in the "Main Slot", detach whatever cart currently is in the "Main Slot" */ oldmain = cart_getid_slotmain(); if (oldmain != CARTRIDGE_NONE) { DBG(("CART: detach slot main ID: %d\n", oldmain)); cartridge_detach_image(oldmain); } } if (oldmain != carttype) { DBG(("CART: detach %s ID: %d\n", slotmain ? "slot main" : "other slot", carttype)); cartridge_detach_image(carttype); } if (type == CARTRIDGE_CRT) { DBG(("CART: attach CRT ID: %d '%s'\n", carttype, filename)); cartid = crt_attach(abs_filename, rawcart); if (cartid == CARTRIDGE_NONE) { goto exiterror; } if (type < 0) { DBG(("CART: attach generic CRT ID: %d\n", type)); } } else { DBG(("CART: attach BIN ID: %d '%s'\n", carttype, filename)); cartid = carttype; if (cart_bin_attach(carttype, abs_filename, rawcart) < 0) { goto exiterror; } } if (cart_is_slotmain(cartid)) { DBG(("cartridge_attach MAIN ID: %d\n", cartid)); mem_cartridge_type = cartid; cart_romhbank_set_slotmain(0); cart_romlbank_set_slotmain(0); } else { DBG(("cartridge_attach (other) ID: %d\n", cartid)); } DBG(("CART: attach RAW ID: %d\n", cartid)); cart_attach(cartid, rawcart); cart_power_off(); if (cart_is_slotmain(cartid)) { /* "Main Slot" */ DBG(("CART: set main slot ID: %d type: %d\n", carttype, type)); c64cart_type = type; if (type == CARTRIDGE_CRT) { crttype = carttype; } util_string_set(&cartfile, abs_filename); } DBG(("CART: cartridge_attach_image type: %d ID: %d done.\n", type, carttype)); lib_free(rawcart); log_message(LOG_DEFAULT, "CART: attached '%s' as ID %d.", abs_filename, carttype); lib_free(abs_filename); return 0; exiterror: DBG(("CART: error\n")); lib_free(rawcart); log_message(LOG_DEFAULT, "CART: could not attach '%s'.", abs_filename); lib_free(abs_filename); return -1; }