// add cheat code to freeze the value static void OnCheatSearchDlg_FreezeClicked(GtkWidget *widget, gpointer user_data) { GtkWidget *dlg; GtkWidget *box, *hbox, *label, *descr_edit, *value_edit; char buf[256]; u32 addr, val = 0; addr = SearchResults[GetSelectedResultIndex()]; dlg = gtk_dialog_new_with_buttons(_("Freeze value"), GTK_WINDOW(CheatListDlg), GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); box = GTK_WIDGET(gtk_dialog_get_content_area(GTK_DIALOG(dlg))); label = gtk_label_new(_("Description:")); gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 5); gtk_widget_show(label); descr_edit = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(box), descr_edit, FALSE, FALSE, 10); gtk_widget_show(descr_edit); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 15); label = gtk_label_new(_("Value:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_widget_show(label); value_edit = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox), value_edit, FALSE, FALSE, 10); gtk_widget_show(value_edit); switch (current_searchtype) { case SEARCHTYPE_8BIT: val = PSXMu8(addr); break; case SEARCHTYPE_16BIT: val = PSXMu16(addr); break; case SEARCHTYPE_32BIT: val = PSXMu32(addr); break; default: assert(FALSE); // should not reach here break; } sprintf(buf, "%u", val); gtk_entry_set_text(GTK_ENTRY(value_edit), buf); sprintf(buf, "%.8X", addr); gtk_entry_set_text(GTK_ENTRY(descr_edit), buf); gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER); gtk_widget_show_all(dlg); if (gtk_dialog_run(GTK_DIALOG(dlg)) == GTK_RESPONSE_ACCEPT) { val = 0; sscanf(gtk_entry_get_text(GTK_ENTRY(value_edit)), "%u", &val); switch (current_searchtype) { case SEARCHTYPE_8BIT: if (val > (u32)0xFF) { val = 0xFF; } sprintf(buf, "%.8X %.4X", (addr & 0x1FFFFF) | (CHEAT_CONST8 << 24), val); break; case SEARCHTYPE_16BIT: if (val > (u32)0xFFFF) { val = 0xFFFF; } sprintf(buf, "%.8X %.4X", (addr & 0x1FFFFF) | (CHEAT_CONST16 << 24), val); break; case SEARCHTYPE_32BIT: sprintf(buf, "%.8X %.4X\n%.8X %.4X", (addr & 0x1FFFFF) | (CHEAT_CONST16 << 24), val & 0xFFFF, ((addr + 2) & 0x1FFFFF) | (CHEAT_CONST16 << 24), ((val & 0xFFFF0000) >> 16) & 0xFFFF); break; default: assert(FALSE); // should not reach here break; } if (AddCheat(gtk_entry_get_text(GTK_ENTRY(descr_edit)), buf) == 0) { Cheats[NumCheats - 1].Enabled = 1; } }
int nextPsxRegUse(u32 pc, int psxreg) { #if 1 if (psxreg == 0) return REGUSE_WRITE; // pretend we are writing to it to fool compiler #ifdef SAME_CYCLE_MODE return REGUSE_READ; #else return _nextPsxRegUse(pc, psxreg, 80); #endif #else u32 code, bPC = 0; int use, reguse = 0, reguse1 = 0, b = 0, i, index = 0; retry: for (i=index; i<80; i++) { code = PSXMu32(pc); use = getRegUse(code); reguse = useOfPsxReg(code, use, psxreg); if (reguse != REGUSE_NONE) break; pc += 4; if ((use & REGUSE_TYPEM) == REGUSE_BRANCH) { if (b == 0) { bPC = _fImm_(code) * 4 + pc; index = i+1; } b += 1; // TODO: follow branches continue; } else if ((use & REGUSE_TYPEM) == REGUSE_JUMP) { if (b == 0) { bPC = _fTarget_(code) * 4 + (pc & 0xf0000000); } b = 2; continue; } else if ((use & REGUSE_TYPEM) == REGUSE_JUMPR || (use & REGUSE_TYPEM) == REGUSE_SYS) { b = 2; continue; } if (b == 2 && bPC && index == 0) { pc = bPC; bPC = 0; b = 1; } if (b >= 2) break; // only follow 1 branch } if (reguse == REGUSE_NONE) return reguse; if (bPC) { reguse1 = reguse; pc = bPC; bPC = 0; b = 1; goto retry; } return reguse1 | reguse; #endif }
// update the cheat search dialog static void UpdateCheatSearchDialog() { char buf[256]; int i; u32 addr; GtkListStore *store = gtk_list_store_new(1, G_TYPE_STRING); GtkTreeIter iter; GtkWidget *widget; widget = gtk_builder_get_object(builder, "GtkCList_Result"); gtk_combo_box_set_active(GTK_COMBO_BOX(gtk_builder_get_object(builder, "combo_searchfor")), current_search); gtk_combo_box_set_active(GTK_COMBO_BOX(gtk_builder_get_object(builder, "combo_datatype")), current_searchtype); gtk_combo_box_set_active(GTK_COMBO_BOX(gtk_builder_get_object(builder, "combo_database")), current_searchbase); if (current_searchbase == SEARCHBASE_DEC) { sprintf(buf, "%u", current_valuefrom); gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(builder, "entry_value")), buf); sprintf(buf, "%u", current_valueto); gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(builder, "entry_valueto")), buf); } else { sprintf(buf, "%X", current_valuefrom); gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(builder, "entry_value")), buf); sprintf(buf, "%X", current_valueto); gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(builder, "entry_valueto")), buf); } if (current_search == SEARCH_RANGE) { gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(builder, "label_valueto"))); gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(builder, "entry_valueto"))); } else { gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(builder, "label_valueto"))); gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(builder, "entry_valueto"))); } if (current_search >= SEARCH_INC) { gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "entry_value")), FALSE); } else { gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "entry_value")), TRUE); } if (current_search >= SEARCH_INCBY && prevM == NULL) { gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "btn_start")), FALSE); } else { gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "btn_start")), TRUE); } gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "btn_freeze")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "btn_modify")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "btn_copy")), FALSE); if (prevM != NULL) { gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "combo_datatype")), FALSE); if (NumSearchResults > 100) { // too many results to be shown gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, _("Too many addresses found."), -1); gtk_widget_set_sensitive(widget, FALSE); } else { for (i = 0; i < NumSearchResults; i++) { addr = SearchResults[i]; switch (current_searchtype) { case SEARCHTYPE_8BIT: sprintf(buf, _("%.8X Current: %u (%.2X), Previous: %u (%.2X)"), addr, PSXMu8(addr), PSXMu8(addr), PrevMu8(addr), PrevMu8(addr)); break; case SEARCHTYPE_16BIT: sprintf(buf, _("%.8X Current: %u (%.4X), Previous: %u (%.4X)"), addr, PSXMu16(addr), PSXMu16(addr), PrevMu16(addr), PrevMu16(addr)); break; case SEARCHTYPE_32BIT: sprintf(buf, _("%.8X Current: %u (%.8X), Previous: %u (%.8X)"), addr, PSXMu32(addr), PSXMu32(addr), PrevMu32(addr), PrevMu32(addr)); break; default: assert(FALSE); // impossible break; } gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, buf, -1); } gtk_widget_set_sensitive(widget, TRUE); } sprintf(buf, _("Founded Addresses: %d"), NumSearchResults); gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(builder, "label_resultsfound")), buf); } else { gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "combo_datatype")), TRUE); gtk_widget_set_sensitive(widget, FALSE); gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(builder, "label_resultsfound")), _("Enter the values and start your search.")); } gtk_tree_view_set_model(GTK_TREE_VIEW(widget), GTK_TREE_MODEL(store)); g_object_unref(G_OBJECT(store)); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(widget), TRUE); gtk_widget_show(widget); }