// 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); }
// 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 main(int argc, const char *argv[]) { upse_module_t *mod; FILE *f; u8 *exebuf, *writer; u32 exesize, readaddr; upse_exe_header_t *head; upse_module_instance_t *ins; if (argc < 3) { printf("%s: usage: in.minipsf out.psf\n", argv[0]); return -1; } upse_module_init(); mod = upse_module_open(argv[1], &psf2exe_iofuncs); if (mod == NULL) return -1; ins = &mod->instance; printf("Reassembling %s into %s:\n\n", argv[1], argv[2]); exesize = (ins->highest_addr - ins->lowest_addr) + ins->highest_addr_size; printf("Lowest load address : 0x%.8X\n", ins->lowest_addr); printf("Highest load address: 0x%.8X\n", ins->highest_addr); printf("Total image size : 0x%.8X\n", exesize); printf("Entry point : 0x%.8X\n", ins->cpustate.pc); printf("GP base : 0x%.8X\n", ins->cpustate.GPR.n.gp); printf("Stack base : 0x%.8X\n", ins->cpustate.GPR.n.sp); exebuf = malloc(sizeof(upse_exe_header_t) + 0x800 + exesize); head = (upse_exe_header_t *) exebuf; printf("\nBuilding PS-X EXE header.\n"); head->id[0] = 'P'; head->id[1] = 'S'; head->id[2] = '-'; head->id[3] = 'X'; head->id[4] = ' '; head->id[5] = 'E'; head->id[6] = 'X'; head->id[7] = 'E'; head->text = 0; head->data = 0; head->pc0 = ins->cpustate.pc; head->gp0 = ins->cpustate.GPR.n.gp; head->t_addr = ins->lowest_addr; head->t_size = exesize + 0x4C; head->d_addr = 0; head->d_size = 0; head->b_addr = 0; head->b_size = 0; head->s_addr = ins->cpustate.GPR.n.sp; head->s_size = 0; head->SavedSP = 0; head->SavedFP = 0; head->SavedGP = 0; head->SavedRA = 0; head->SavedS0 = 0; printf("Assembling binary image.\n"); for (readaddr = ins->lowest_addr, writer = exebuf + 0x800; (writer - exebuf) < exesize; readaddr++, writer++) { *writer = PSXMu8(ins, readaddr); } printf("PS-X EXE image assembled.\n"); upse_module_close(mod); ins = NULL; f = fopen(argv[2], "wb"); if (f == NULL) { perror(argv[2]); return -1; } printf("\nOpened %s for writing.\n", argv[2]); fwrite(exebuf, 1, sizeof(upse_exe_header_t) + 0x800 + exesize, f); fclose(f); printf("Wrote %s successfully.\n", argv[2]); return 0; }