inline static void debug_history_step(const char *st) { if (event_record_active()) { if (debug_buffer_ptr + DEBUG_MAXLINELEN >= DEBUG_HISTORY_MAXFILESIZE) { debug_create_new_file(); } debug_buffer_ptr += sprintf(debug_buffer + debug_buffer_ptr, "%s\n", st); } if (event_playback_active()) { char tempstr[DEBUG_MAXLINELEN]; int line_len = sprintf(tempstr, "%s\n", st); if (debug_buffer_ptr >= debug_buffer_size) { debug_open_new_file(); } debug_file_line++; if (strncmp(st, debug_buffer + debug_buffer_ptr, strlen(st)) != 0) { event_playback_stop(); ui_error(translate_text(IDGS_PLAYBACK_ERROR_DIFFERENT) , st, debug_file_line, debug_file_current - 1); } debug_buffer_ptr += line_len; } }
void debug_check_autoplay_mode(void) { if (debug.trace_mode != DEBUG_AUTOPLAY) { return; } if (debug_autoplay_nextmode == 2) { event_playback_start(); debug_autoplay_nextmode = 0; return; } if (debug_autoplay_nextmode == 1) { /* AUTPLAY mode needs to start recording */ event_record_start(); debug_autoplay_nextmode = 0; return; } debug_autoplay_current_frame++; if (debug_autoplay_current_frame >= debug_autoplay_frames) { debug_autoplay_current_frame = 0; if (event_record_active()) { event_record_stop(); debug_autoplay_nextmode = 2; /* start playback next */ return; } } }
/* Autostart disk image `file_name'. */ int autostart_disk(const char *file_name, const char *program_name, unsigned int program_number, unsigned int runmode) { char *name = NULL; if (network_connected() || event_record_active() || event_playback_active() || !file_name || !autostart_enabled) return -1; /* Get program name first to avoid more than one file handle open on image. */ if (!program_name && program_number > 0) name = image_contents_filename_by_number(diskcontents_filesystem_read(file_name), program_number); else name = lib_stralloc(program_name ? program_name : "*"); if (name) { autostart_disk_cook_name(&name); if (!(file_system_attach_disk(8, file_name) < 0)) { log_message(autostart_log, "Attached file `%s' as a disk image.", file_name); reboot_for_autostart(name, AUTOSTART_HASDISK, runmode); lib_free(name); return 0; } } autostartmode = AUTOSTART_ERROR; deallocate_program_name(); lib_free(name); return -1; }
/* Autostart PRG file `file_name'. The PRG file can either be a raw CBM file or a P00 file */ int autostart_prg(const char *file_name, unsigned int runmode) { fileio_info_t *finfo; int result; const char *boot_file_name; int mode; if (event_record_active() || event_playback_active()) return -1; /* open prg file */ finfo = fileio_open(file_name, NULL, FILEIO_FORMAT_RAW | FILEIO_FORMAT_P00, FILEIO_COMMAND_READ | FILEIO_COMMAND_FSNAME, FILEIO_TYPE_PRG); /* can't open file */ if (finfo == NULL) { #ifdef CELL_DEBUG printf("ERROR: Cannot open `%s'.\n", file_name); #endif return -1; } /* determine how to load file */ switch(AutostartPrgMode) { case AUTOSTART_PRG_MODE_VFS: //log_message(autostart_log, "Loading PRG file `%s' with virtual FS on unit #8.", file_name); result = autostart_prg_with_virtual_fs(file_name, finfo); mode = AUTOSTART_HASDISK; boot_file_name = (const char *)finfo->name; break; case AUTOSTART_PRG_MODE_INJECT: //log_message(autostart_log, "Loading PRG file `%s' with direct RAM injection.", file_name); result = autostart_prg_with_ram_injection(file_name, finfo); mode = AUTOSTART_INJECT; boot_file_name = NULL; break; case AUTOSTART_PRG_MODE_DISK: //log_message(autostart_log, "Loading PRG file `%s' with autostart disk image.", file_name); result = autostart_prg_with_disk_image(file_name, finfo, AutostartPrgDiskImage); mode = AUTOSTART_HASDISK; boot_file_name = "*"; break; default: //log_error(autostart_log, "Invalid PRG autostart mode: %d", AutostartPrgMode); result = -1; break; } /* Now either proceed with disk image booting or prg injection after reset */ if (result >= 0) { ui_update_menus(); reboot_for_autostart(boot_file_name, mode, runmode); } /* close prg file */ fileio_close(finfo); return result; }
/* Autostart snapshot file `file_name'. */ int autostart_snapshot(const char *file_name, const char *program_name) { BYTE vmajor, vminor; snapshot_t *snap; if (network_connected() || event_record_active() || event_playback_active() || file_name == NULL || !autostart_enabled) return -1; deallocate_program_name(); /* not needed at all */ if (!(snap = snapshot_open(file_name, &vmajor, &vminor, machine_get_name())) ) { autostartmode = AUTOSTART_ERROR; return -1; } log_message(autostart_log, "Loading snapshot file `%s'.", file_name); snapshot_close(snap); /*autostart_program_name = lib_stralloc(file_name); interrupt_maincpu_trigger_trap(load_snapshot_trap, 0);*/ /* use for snapshot */ reboot_for_autostart(file_name, AUTOSTART_HASSNAPSHOT, AUTOSTART_MODE_RUN); return 0; }
/* Autostart `file_name', trying to auto-detect its type. */ int autostart_autodetect(const char *file_name, const char *program_name, unsigned int program_number, unsigned int runmode) { if (network_connected() || event_record_active() || event_playback_active() || file_name == NULL) { return -1; } if (!autostart_enabled) { log_error(autostart_log, "Autostart is not available on this setup."); return -1; } log_message(autostart_log, "Autodetecting image type of `%s'.", file_name); if (autostart_disk(file_name, program_name, program_number, runmode) == 0) { log_message(autostart_log, "`%s' recognized as disk image.", file_name); return 0; } if (machine_class != VICE_MACHINE_C64DTV && machine_class != VICE_MACHINE_SCPU64) { if (autostart_tape(file_name, program_name, program_number, runmode) == 0) { log_message(autostart_log, "`%s' recognized as tape image.", file_name); return 0; } } if (autostart_snapshot(file_name, program_name) == 0) { log_message(autostart_log, "`%s' recognized as snapshot image.", file_name); return 0; } if ((machine_class == VICE_MACHINE_C64) || (machine_class == VICE_MACHINE_C64SC) || (machine_class == VICE_MACHINE_SCPU64) ||(machine_class == VICE_MACHINE_C128)) { if (cartridge_attach_image(CARTRIDGE_CRT, file_name) == 0) { log_message(autostart_log, "`%s' recognized as cartridge image.", file_name); return 0; } } if (autostart_prg(file_name, runmode) == 0) { log_message(autostart_log, "`%s' recognized as program/p00 file.", file_name); return 0; } log_error(autostart_log, "`%s' is not a valid file.", file_name); return -1; }
/* Autostart the image attached to device `num'. */ int autostart_device(int num) { if (network_connected() || event_playback_active() || event_record_active() || !autostart_enabled) return -1; switch (num) { case 8: reboot_for_autostart(NULL, AUTOSTART_HASDISK, AUTOSTART_MODE_RUN); return 0; case 1: reboot_for_autostart(NULL, AUTOSTART_HASTAPE, AUTOSTART_MODE_RUN); return 0; } return -1; }
/* Autostart tape image `file_name'. */ int autostart_tape(const char *file_name, const char *program_name, unsigned int program_number, unsigned int runmode) { char *name = NULL; if (event_record_active() || event_playback_active() || !file_name || !autostart_enabled) return -1; /* Get program name first to avoid more than one file handle open on image. */ if (!program_name && program_number > 0) name = image_contents_filename_by_number(tapecontents_read(file_name), program_number); else name = lib_stralloc(program_name ? program_name : ""); if (!(tape_image_attach(1, file_name) < 0)) { //log_message(autostart_log, "Attached file `%s' as a tape image.", file_name); if (tape_tap_attched()) { if (program_number > 0) { lib_free(name); name = NULL; /* program numbers in tape_seek_to_file() start at 0 */ tape_seek_to_file(tape_image_dev1, program_number-1); } else { tape_seek_start(tape_image_dev1); } } resources_set_int("VirtualDevices", 1); /* Kludge: iAN CooG - for t64 images we need devtraps ON */ reboot_for_autostart(name, AUTOSTART_HASTAPE, runmode); lib_free(name); return 0; } autostartmode = AUTOSTART_ERROR; deallocate_program_name(); lib_free(name); return -1; }
/* Autostart tape image `file_name'. */ int autostart_tape(const char *file_name, const char *program_name, unsigned int program_number, unsigned int runmode) { BYTE do_seek = 1; if (network_connected() || event_record_active() || event_playback_active() || !file_name || !autostart_enabled) { return -1; } if (!(tape_image_attach(1, file_name) < 0)) { log_message(autostart_log, "Attached file `%s' as a tape image.", file_name); if (!tape_tap_attached()) { if (program_number == 0 || program_number == 1) { do_seek = 0; } program_number -= 1; } if (do_seek) { if (program_number > 0) { /* program numbers in tape_seek_to_file() start at 0 */ tape_seek_to_file(tape_image_dev1, program_number - 1); } else { tape_seek_start(tape_image_dev1); } } if (!tape_tap_attached()) { resources_set_int("VirtualDevices", 1); /* Kludge: for t64 images we need devtraps ON */ } reboot_for_autostart(program_name, AUTOSTART_HASTAPE, runmode); return 0; } autostartmode = AUTOSTART_ERROR; deallocate_program_name(); return -1; }
/* Autostart `file_name', trying to auto-detect its type. */ int autostart_autodetect(const char *file_name, const char *program_name, unsigned int program_number, unsigned int runmode) { if (event_record_active() || event_playback_active() || file_name == NULL) return -1; if (!autostart_enabled) { //log_error(autostart_log, "Autostart is not available on this setup."); return -1; } //log_message(autostart_log, "Autodetecting image type of `%s'.", file_name); if (autostart_disk(file_name, program_name, program_number, runmode) == 0) { //log_message(autostart_log, "`%s' recognized as disk image.", file_name); return 0; } if (machine_class != VICE_MACHINE_C64DTV) { if (autostart_tape(file_name, program_name, program_number, runmode) == 0) { //log_message(autostart_log, "`%s' recognized as tape image.", file_name); return 0; } } if (autostart_snapshot(file_name, program_name) == 0) { //log_message(autostart_log, "`%s' recognized as snapshot image.", file_name); return 0; } if (autostart_prg(file_name, runmode) == 0) { //log_message(autostart_log, "`%s' recognized as program/p00 file.", file_name); return 0; } //log_error(autostart_log, "`%s' is not a valid file.", file_name); return -1; }
/* Autostart PRG file `file_name'. The PRG file can either be a raw CBM file or a P00 file */ int autostart_prg(const char *file_name, unsigned int runmode) { fileio_info_t *finfo; int result; const char *boot_file_name; int mode; if (network_connected() || event_record_active() || event_playback_active()) { return -1; } /* open prg file */ finfo = fileio_open(file_name, NULL, FILEIO_FORMAT_RAW | FILEIO_FORMAT_P00, FILEIO_COMMAND_READ | FILEIO_COMMAND_FSNAME, FILEIO_TYPE_PRG); /* can't open file */ if (finfo == NULL) { log_error(autostart_log, "Cannot open `%s'.", file_name); return -1; } /* determine how to load file */ switch (AutostartPrgMode) { case AUTOSTART_PRG_MODE_VFS: log_message(autostart_log, "Loading PRG file `%s' with virtual FS on unit #8.", file_name); result = autostart_prg_with_virtual_fs(file_name, finfo, autostart_log); mode = AUTOSTART_HASDISK; boot_file_name = (const char *)finfo->name; break; case AUTOSTART_PRG_MODE_INJECT: log_message(autostart_log, "Loading PRG file `%s' with direct RAM injection.", file_name); result = autostart_prg_with_ram_injection(file_name, finfo, autostart_log); mode = AUTOSTART_INJECT; boot_file_name = NULL; break; case AUTOSTART_PRG_MODE_DISK: { char *savedir; log_message(autostart_log, "Loading PRG file `%s' with autostart disk image.", file_name); /* create the directory where the image should be written first */ util_fname_split(AutostartPrgDiskImage, &savedir, NULL); ioutil_mkdir(savedir, IOUTIL_MKDIR_RWXU); lib_free(savedir); result = autostart_prg_with_disk_image(file_name, finfo, autostart_log, AutostartPrgDiskImage); mode = AUTOSTART_HASDISK; boot_file_name = "*"; } break; default: log_error(autostart_log, "Invalid PRG autostart mode: %d", AutostartPrgMode); result = -1; break; } /* Now either proceed with disk image booting or prg injection after reset */ if (result >= 0) { ui_update_menus(); reboot_for_autostart(boot_file_name, mode, runmode); } /* close prg file */ fileio_close(finfo); return result; }