static void update_processor (AppData *data) { if (data->mem) memory_free (data->mem); if (data->regs) registers_free (data->regs); if (data->symtable) symbol_table_free (data->symtable); /* Create empty symbol table (to be populated during parse) */ data->symtable = symbol_table_new (); /* Create registers */ data->regs = registers_new (g_key_file_get_integer (data->settings, "processor", "no_registers", NULL)); /* Create designated memory segments */ data->mem = memory_new (); memory_add_data_segment (data->mem, MEM_SEG_DATA, g_key_file_get_integer (data->settings, "data segment", "origin", NULL), g_key_file_get_integer (data->settings, "data segment", "size", NULL)); memory_add_data_segment (data->mem, MEM_SEG_CODE, g_key_file_get_integer (data->settings, "code segment", "origin", NULL), g_key_file_get_integer (data->settings, "code segment", "size", NULL)); update_symtable (data); update_mcode (data); update_data (data); update_regs (data); }
int main(int argc, char** argv) { int i; unsigned int cmd; unsigned int val; unsigned int addr; char* file_path; clear_screen(); #ifdef DEBUG_MODE for (i = 0; i < argc; ++i) debug_message("argv[%2d] : '%s'", i, argv[i]); #endif printf("This is NES emulator.\n"); if (argc >= 2) { char* arg = argv[1]; int arg_len = strlen(arg); if (arg_len == 2) { if (arg[0] == '-' && (arg[1] == 't' || arg[1] == 'T')) // TEST ROM init_test_rom(&hdr, ROM, pattern_table); else if (arg[0] == '-' && (arg[1] == 'd' || arg[1] == 'D')) // Dumped image { FILE* rom_image; FILE* chr_image; if (argc < 3) return 1; #if defined _WIN32 && defined _MSC_VER fopen_s(&rom_image, argv[2], "rb"); fopen_s(&chr_image, argv[3], "rb"); #elif defined __linux__ || defined __GNUC__ rom_image = fopen(argv[2], "rb"); chr_image = fopen(argv[3], "rb"); #endif if (!rom_image || !chr_image) { debug_message("Could not open dumped ROM image!"); return 1; } if (fread(ROM, ROM_SIZE, 1, rom_image) != 1) return 1; if (fread(pattern_table, PPU_PATTERN_TABLE_SIZE, 1, chr_image) != 1) return 1; fclose(rom_image); fclose(chr_image); } else if (arg[0] == '-' && (arg[1] == 'r' || arg[1] == 'R')) { if (argc < 3) { debug_message("File name required."); return 1; } if (dump_test_rom(argv[2]) != 1) { debug_message("Could not dump test ROM!"); return 1; } debug_message("Test ROM dumped!"); return 0; } else { debug_message("Invalid command line arguments!"); return 1; } } else { file_path = argv[1]; if (read_rom_image(file_path) != 1) { printf("Reading ROM image failed!\n"); return 1; } } } else if (argc < 2) { printf("Emulation failed! No ROM image supplied!\n"); return 1; } if (emulator_init() != 1) { printf("Emulator initialization failed!\n"); return 1; } run(); // Comment this line for debuging. //clear_screen(); gotoxy(REGS_X, REGS_Y); update_regs(); gotoxy(CMD_X, CMD_Y); while (!finished_emulation) { clear_cmd_line(); cmd = getch(); putchar(cmd); switch (cmd) { case 's': case 'S': step(); update_regs(); break; // Finish emulation case 'q': case 'Q': finished_emulation = 1; break; case 'w': case 'W': if (scanf_s("%4x %2x", &addr, &val)) write(addr, val); break; case 'r': case 'R': if (scanf_s("%4x", &addr)) { val = read(addr); printf(" $%04x : %02X", addr, val); } break; case 'd': case 'D': if (scanf_s("%4x %u", &addr, &val)) for (i = 0; i < (int)val; ++i) printf("\n %04X : %02X\n", addr + i, read(addr + i)); break; case 'h': case 'H': printf("\n" " S : Step\n" " Q : Quit\n" " W Addr Val : Write memory\n" " R Addr : Read memory\n" " D Addr Sz : Dump memory\n" " C Val : Run for Val cycles\n" " H : Help\n" " E : Run to PC equals to Val\n" ); break; case 'a': case 'A': if (scanf_s("%2x", &val)) write_a(&p, val); break; case 'x': case 'X': if (scanf_s("%2x", &val)) write_x(&p, val); break; case 'y': case 'Y': if (scanf_s("%2x", &val)) write_y(&p, val); break; case 'p': case 'P': if (scanf_s("%2x", &val)) write_p(&p, val | FLAG_1); break; case 'c': case 'C': if (scanf_s("%u", &val)) { run_cycles(val); update_regs(); } break; case 'e': case 'E': if (scanf_s("%4x", &val)) { while (p.pc.w != val) step(); update_regs(); } break; default: break; } } emulator_close(); return 0; }
void on_wtools_1_combo_cpu_changed (GtkComboBox *widget, gpointer user_data) { /* c == 0 means ARM9 */ cpu=gtk_combo_box_get_active(widget); update_regs(); }
gboolean on_wtools_1_draw_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { update_regs(); return TRUE; }
gboolean on_wtools_1_draw_button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { // clear the red marks :) if (event->button==1) update_regs(); return TRUE; }
int main(int argc, char** argv) { int i; int cmd; unsigned int val; unsigned int addr; printf("This is Atari 2600 emulator!\n\n"); // Print command line arguments. debug_message("argc : %d", argc); #if DEBUG_MODE for (i = 0; i < argc; ++i) debug_message("argv[%2d] : %s", i, argv[i]); #endif if (argc < 2) { printf("Emulation failed! No ROM image supplied!\n"); return 1; } if (emulator_init() != 1) { printf("Emulator initialization failed!\n"); return 1; } init_console(); gotoxy(REGS_X, REGS_Y); update_regs(); while (!finished_emulation) { clear_cmd_line(); cmd = getch(); switch (cmd) { case 'q': case 'Q': finished_emulation = 1; break; case 's': case 'S': step(); update_regs(); break; case 'c': case 'C': if (scanf_s("%u", &val)) { run_cycles((int)val); update_regs(); } break; case 'r': case 'R': if (scanf_s("%4x", &addr)) { val = read((uint16_t)addr); printf(" $%04x : $%02x", addr, val); } break; } } emulator_close(); return 0; }