10 #include "reader_master.h"
11 //#include "reader_kazzo.h"
12 extern const struct reader_driver DRIVER_KAZZO;
15 #include "flash_device.h"
16 #include "script_dump.h"
17 #include "script_program.h"
18 void qr_version_print(const struct textcontrol *l);
21 //---- C++ -> C -> C++ wrapping functions ----
22 static void value_set(void *gauge, void *label, int value)
24 wxGauge *g = static_cast<wxGauge *>(gauge);
25 wxStaticText *l = static_cast<wxStaticText *>(label);
27 str.Printf(wxT("0x%06x/0x%06x"), value, g->GetRange());
35 static void value_add(void *gauge, void *label, int value)
37 wxGauge *g = static_cast<wxGauge *>(gauge);
38 value += g->GetValue();
40 value_set(gauge, label, value);
43 static void range_set(void *gauge, int value)
45 wxGauge *g = static_cast<wxGauge *>(gauge);
52 static void text_append_va(void *log, const char *format, va_list list)
54 wxTextCtrl *l = static_cast<wxTextCtrl *>(log);
56 str.PrintfV(format, list);
63 static void text_append(void *log, const char *format, ...)
66 va_start(list, format);
67 text_append_va(log, format, list);
71 static void version_append_va(void *log, const char *format, va_list list)
73 wxTextCtrl *l = static_cast<wxTextCtrl *>(log);
75 str.PrintfV(format, list);
80 static void version_append(void *log, const char *format, ...)
83 va_start(list, format);
84 version_append_va(log, format, list);
88 static void label_set(void *label, const char *format, ...)
90 wxStaticText *l = static_cast<wxStaticText *>(label);
94 va_start(list, format);
95 str.PrintfV(format, list);
103 void choice_append(void *choice, const char *str)
105 wxChoice *c = static_cast<wxChoice *>(choice);
106 c->Append(wxString(str));
109 //---- script execute thread ----
111 class anago_dumper : public wxThread
114 anago_frame *m_frame;
115 struct dump_config m_config;
120 delete [] m_config.script;
121 delete [] m_config.target;
124 anago_dumper(anago_frame *f, const struct dump_config *d) : wxThread()
127 memcpy(&m_config, d, sizeof(struct dump_config));
131 class anago_programmer : public wxThread
134 anago_frame *m_frame;
135 struct program_config m_config;
140 delete [] m_config.script;
141 delete [] m_config.target;
144 anago_programmer(anago_frame *f, const struct program_config *d) : wxThread()
147 memcpy(&m_config, d, sizeof(struct program_config));
151 //---- main frame class ----
152 class anago_frame : public frame_main
155 wxThread *m_anago_thread;
157 STATUS_IDLE, STATUS_DUMPPING, STATUS_PROGRAMMING
159 void gauge_init(struct gauge *t)
161 t->label_set = label_set;
162 t->range_set = range_set;
163 t->value_set = value_set;
164 t->value_add = value_add;
166 void script_choice_init(wxChoice *c, wxString filespec)
168 wxDir dir(wxGetCwd());
172 if ( !dir.IsOpened() ){
175 bool cont = dir.GetFirst(&filename, filespec, wxDIR_FILES);
178 cont = dir.GetNext(&filename);
180 if(c->GetCount() == 0){
181 *m_log << wxT("warning: ") << filespec << wxT(" script not found.\n");
186 //---- dump mode functions ----
187 void dump_increase_init(wxChoice *c)
190 c->Append(wxT("x1"));
191 c->Append(wxT("x2"));
192 c->Append(wxT("x4"));
195 int dump_increase_get(wxChoice *c)
197 switch(c->GetSelection()){
204 void dump_execute(void)
206 struct dump_config config;
207 config.cpu.gauge.bar = m_dump_cpu_gauge;
208 config.cpu.gauge.label = m_dump_cpu_value;
209 gauge_init(&config.cpu.gauge);
211 config.ppu.gauge.bar = m_dump_ppu_gauge;
212 config.ppu.gauge.label = m_dump_ppu_value;
213 gauge_init(&config.ppu.gauge);
215 config.log.object = m_log;
216 config.log.append = text_append;
217 config.log.append_va = text_append_va;
218 config.cpu.increase = dump_increase_get(m_dump_cpu_increase);
219 config.ppu.increase = dump_increase_get(m_dump_ppu_increase);
220 config.progress = true;
221 config.battery = m_dump_check_battery->GetValue();
223 wxString str_script = m_dump_script_choice->GetStringSelection();
224 char *t = new char[str_script.Length() + 1];
226 strncpy(t, str_script.fn_str(), str_script.Length() + 1);
231 config.mappernum = -1;
232 if(m_dump_check_forcemapper->GetValue() == true){
233 str = m_dump_text_forcemapper->GetValue();
234 if(str.ToLong(&config.mappernum) == false){
235 *m_log << wxT("bad mapper number\n");
242 wxTextCtrl *text = m_dump_romimage_picker->GetTextCtrl();
243 wxString str_rom = text->GetValue();
244 char *t = new char[str_rom.Length() + 1];
245 if(text->IsEmpty() == true){
246 *m_log << wxT("Enter filename to ROM image\n");
250 strncpy(t, str_rom.fn_str(), str_rom.Length() + 1);
253 config.control = &DRIVER_KAZZO.control;
254 config.cpu.access = &DRIVER_KAZZO.cpu;
255 config.ppu.access = &DRIVER_KAZZO.ppu;
257 m_dump_script_choice->Disable();
258 m_dump_romimage_picker->Disable();
259 m_dump_check_battery->Disable();
260 m_dump_check_forcemapper->Disable();
261 m_dump_button->SetLabel(wxT("cancel"));
262 m_dump_text_forcemapper->Disable();
263 m_dump_cpu_increase->Disable();
264 m_dump_ppu_increase->Disable();
266 /* if(m_anago_thread != NULL){ //???
267 delete m_anago_thread;
269 m_anago_thread = new anago_dumper(this, &config);
270 if(m_anago_thread->Create() != wxTHREAD_NO_ERROR){
271 *m_log << wxT("thread creating error");
272 }else if(m_anago_thread->Run() != wxTHREAD_NO_ERROR){
273 *m_log << wxT("thread running error");
275 m_status = STATUS_DUMPPING;
279 //----- program mode functions ----
280 void program_padding_init(wxChoice *c)
283 c->Append(wxT("full"));
284 c->Append(wxT("top"));
285 c->Append(wxT("bottom"));
286 c->Append(wxT("empty"));
289 bool program_rom_set(wxString device, int trans, struct memory *m, struct flash_device *f)
292 if(flash_device_get(device, f) == false){
293 *m_log << wxT("unknown flash memory device ");
294 *m_log << device << wxT("\n");
299 m->transtype = TRANSTYPE_FULL;
302 m->transtype = TRANSTYPE_TOP;
305 m->transtype = TRANSTYPE_BOTTOM;
308 m->transtype = TRANSTYPE_EMPTY;
314 void program_execute(void)
316 struct program_config f;
318 f.cpu.gauge.bar = m_program_cpu_gauge;
319 f.cpu.gauge.label = m_program_cpu_value;
320 gauge_init(&f.cpu.gauge);
322 f.ppu.gauge.bar = m_program_ppu_gauge;
323 f.ppu.gauge.label = m_program_ppu_value;
324 gauge_init(&f.ppu.gauge);
326 f.log.object = m_log;
327 f.log.append = text_append;
328 f.log.append_va = text_append_va;
331 wxString str_script = m_program_script_choice->GetStringSelection();
332 char *t = new char[str_script.Length() + 1];
333 strncpy(t, str_script.fn_str(), str_script.Length() + 1);
338 wxTextCtrl *text = m_program_romimage_picker->GetTextCtrl();
339 wxString str_rom = text->GetValue();
340 if(text->IsEmpty() == true){
341 *m_log << wxT("Enter filename to ROM image\n");
344 char *t = new char[str_rom.Length() + 1];
345 strncpy(t, str_rom.fn_str(), str_rom.Length() + 1);
348 f.compare = m_program_compare->GetValue();
352 m_program_cpu_device->GetStringSelection(),
353 m_program_cpu_padding->GetSelection(),
354 &f.cpu.memory, &f.cpu.flash
359 m_program_ppu_device->GetStringSelection(),
360 m_program_ppu_padding->GetSelection(),
361 &f.ppu.memory, &f.ppu.flash
366 f.control = &DRIVER_KAZZO.control;
367 f.cpu.access = &DRIVER_KAZZO.cpu;
368 f.ppu.access = &DRIVER_KAZZO.ppu;
370 m_program_script_choice->Disable();
371 m_program_romimage_picker->Disable();
372 m_program_compare->Disable();
373 m_program_button->SetLabel(wxT("cancel"));
374 m_program_cpu_padding->Disable();
375 m_program_cpu_device->Disable();
376 m_program_ppu_padding->Disable();
377 m_program_ppu_device->Disable();
378 m_program_compare->Disable();
380 m_anago_thread = new anago_programmer(this, &f);
381 if(m_anago_thread->Create() != wxTHREAD_NO_ERROR){
382 *m_log << wxT("thread creating error");
383 }else if(m_anago_thread->Run() != wxTHREAD_NO_ERROR){
384 *m_log << wxT("thread running error");
386 m_status = STATUS_PROGRAMMING;
391 void dump_button_click(wxCommandEvent& event)
395 this->dump_execute();
397 case STATUS_DUMPPING:
398 m_anago_thread->Kill();
399 this->DumpThreadFinish();
400 m_status = STATUS_IDLE;
402 default: //do nothing
406 void program_button_click(wxCommandEvent& event)
410 this->program_execute();
412 case STATUS_PROGRAMMING:
413 m_anago_thread->Kill();
414 this->ProgramThreadFinish();
415 m_status = STATUS_IDLE;
417 default: //do nothing
421 void mapper_change_check(wxCommandEvent& event)
423 if(m_dump_check_forcemapper->GetValue() == true){
424 m_dump_text_forcemapper->Enable();
426 m_dump_text_forcemapper->Disable();
429 void menu_log_clean(wxCommandEvent& event)
435 anago_frame( wxWindow* parent ) : frame_main(parent)
437 this->script_choice_init(m_dump_script_choice, wxT("*.ad"));
438 this->script_choice_init(m_program_script_choice, wxT("*.af"));
439 this->dump_increase_init(m_dump_cpu_increase);
440 this->dump_increase_init(m_dump_ppu_increase);
442 struct flash_listup list;
443 list.obj_cpu = m_program_cpu_device;
444 list.obj_ppu = m_program_ppu_device;
445 list.append = choice_append;
446 flash_device_listup(&list);
447 if(m_program_cpu_device->GetCount() == 0){
448 *m_log << wxT("warning: flash device parameter not found\n");
450 m_program_cpu_device->Select(0);
451 m_program_ppu_device->Select(0);
453 this->program_padding_init(m_program_cpu_padding);
454 this->program_padding_init(m_program_ppu_padding);
456 m_anago_thread = NULL;
457 m_status = STATUS_IDLE;
460 struct textcontrol detail;
461 *m_version_detail << wxT("anago build at ") << __DATE__ << wxT("\n\n");
462 detail.object = m_version_detail;
463 detail.append = version_append;
464 detail.append_va = version_append_va;
465 qr_version_print(&detail);
466 *m_version_detail << wxVERSION_STRING << wxT(" (c) Julian Smar");
469 wxBitmap bitmap_okada(okada);
470 wxString tooltip(wxT(
471 "緑区 na6ko 町さん (28歳, 童貞)"
473 "28年間バカにされっぱなし、ミジメ過ぎた俺の人生が anago,\n"
474 "kazzo を持つようになった途端、突然ツキがめぐってきた。\n"
475 "競馬をやれば連戦連勝、夢にまでみた万馬券を当て、気がつくと\n"
476 "しんじられない事にギャンブルで稼いだお金が460万円!!\n"
477 "元手はたった9500円。しかもたった2ヶ月で人生大逆転!!\n"
478 "女は3P4Pヤリ放題!!勤めていた新聞屋も辞めギャンブルで\n"
479 "身を立てていこうと思っています。実は来月の11日にラスベガスに行き\n"
480 "勝負をかけます。結果はまた報告します。宜しく。")
482 m_version_photo->SetBitmap(bitmap_okada);
483 m_version_photo->SetToolTip(tooltip);
486 void DumpThreadFinish(void)
488 m_dump_script_choice->Enable();
489 m_dump_romimage_picker->Enable();
490 m_dump_check_battery->Enable();
491 m_dump_check_forcemapper->Enable();
492 m_dump_cpu_increase->Enable();
493 m_dump_ppu_increase->Enable();
494 m_dump_button->SetLabel(wxT("&dump"));
495 if(m_dump_check_forcemapper->GetValue() == true){
496 m_dump_text_forcemapper->Enable();
498 m_status = STATUS_IDLE;
501 void ProgramThreadFinish(void)
503 m_program_script_choice->Enable();
504 m_program_romimage_picker->Enable();
505 m_program_compare->Enable();
506 m_program_button->SetLabel(wxT("&program"));
507 m_program_cpu_padding->Enable();
508 m_program_cpu_device->Enable();
509 m_program_ppu_padding->Enable();
510 m_program_ppu_device->Enable();
511 m_status = STATUS_IDLE;
516 void *anago_dumper::Entry(void)
518 script_dump_execute(&m_config);
519 m_frame->DumpThreadFinish();
523 void *anago_programmer::Entry(void)
525 script_program_execute(&m_config);
526 m_frame->ProgramThreadFinish();
530 class MyApp : public wxApp
533 anago_frame *m_frame;
537 m_frame = new anago_frame(NULL);