OSDN Git Service

flash mode gui 対応, log 出力を stdout 以外に対応。
authornaruko <naruko@24ea1065-a21e-4ca1-99c9-f5125deb0858>
Sun, 17 Oct 2010 19:15:53 +0000 (19:15 +0000)
committernaruko <naruko@24ea1065-a21e-4ca1-99c9-f5125deb0858>
Sun, 17 Oct 2010 19:15:53 +0000 (19:15 +0000)
git-svn-id: svn+ssh://svn.osdn.net/svnroot/unagi@369 24ea1065-a21e-4ca1-99c9-f5125deb0858

client/trunk/anago/anago_wxframe_main.cpp
client/trunk/anago/flash_device.c
client/trunk/anago/script_dump.c
client/trunk/anago/script_flash.c
client/trunk/anago/script_flash.h
client/trunk/anago/squirrel_wrap.c
client/trunk/anago/squirrel_wrap.h

index 9915c9a..f8435e2 100644 (file)
@@ -8,8 +8,10 @@
 //#include "reader_kazzo.h"
 extern const struct reader_driver DRIVER_KAZZO;
 extern "C"{
-#include "script_dump.h"
+#include "header.h"
 #include "flash_device.h"
+#include "script_dump.h"
+#include "script_flash.h"
 }
 
 static void value_set(void *gauge, int value)
@@ -84,9 +86,9 @@ private:
        {
                c->Clear();
                c->Append(wxString("full"));
-               c->Append(wxString("empty"));
                c->Append(wxString("top"));
                c->Append(wxString("bottom"));
+               c->Append(wxString("empty"));
                c->Select(0);
        }
        void program_form_init(void)
@@ -102,20 +104,22 @@ private:
                m_choice_ppu_trans->Show();
                m_choice_ppu_device->Show();
        }
+       void gauge_init(struct gauge *t)
+       {
+               t->label_set = label_set;
+               t->range_set = range_set;
+               t->value_set = value_set;
+       }
        void dump_execute(void)
        {
                struct config_dump config;
                config.gauge_cpu.bar = m_gauge_cpu;
                config.gauge_cpu.label = m_label_cpu;
-               config.gauge_cpu.label_set = label_set;
-               config.gauge_cpu.range_set = range_set;
-               config.gauge_cpu.value_set = value_set;
+               gauge_init(&config.gauge_cpu);
 
                config.gauge_ppu.bar = m_gauge_ppu;
                config.gauge_ppu.label = m_label_ppu;
-               config.gauge_ppu.label_set = label_set;
-               config.gauge_ppu.range_set = range_set;
-               config.gauge_ppu.value_set = value_set;
+               gauge_init(&config.gauge_ppu);
                
                config.log.object = m_log;
                config.log.append = text_append;
@@ -172,11 +176,122 @@ private:
                        m_text_forcemapper->Enable();
                }
        }
+       
+       bool rom_set(const char *area, wxString device, int trans, struct memory *m, struct flash_device *f)
+       {
+               m->offset = 0;
+               if(flash_device_get(device, f) == false){
+                       *m_log << "unknown flash memory device ";
+                       *m_log << device << "\n";
+                       return false;
+               }
+               switch(trans){
+               case 0: 
+                       m->transtype = TRANSTYPE_FULL;
+                       break;
+               case 1: 
+                       m->transtype = TRANSTYPE_TOP;
+                       break;
+               case 2: 
+                       m->transtype = TRANSTYPE_BOTTOM;
+                       break;
+               default: 
+                       m->transtype = TRANSTYPE_EMPTY;
+                       break;
+               }
+               if(m->size == 0){
+                       m->transtype = TRANSTYPE_EMPTY;
+               }
+               if(f->capacity < m->size){
+                       *m_log << area << "area ROM image size is larger than target device";
+                       return false;
+               }
+               return true;
+       }
+       void program_execute(void)
+       {
+               struct config_flash f;
+               
+               f.gauge_cpu.bar = m_gauge_cpu;
+               f.gauge_cpu.label = m_label_cpu;
+               gauge_init(&f.gauge_cpu);
+
+               f.gauge_ppu.bar = m_gauge_ppu;
+               f.gauge_ppu.label = m_label_ppu;
+               gauge_init(&f.gauge_ppu);
+               
+               f.log.object = m_log;
+               f.log.append = text_append;
+               
+               wxString str_script = m_choice_script->GetStringSelection();
+               f.script = str_script.fn_str();
+
+               wxTextCtrl *text = m_picker_romimage->GetTextCtrl();
+               wxString str_rom = text->GetValue();
+               if(text->IsEmpty() == true){
+                       *m_log << "Enter filename to ROM image\n";
+                       return;
+               }
+               f.target = str_rom.fn_str();
+               f.compare = false;
+               f.testrun = false;
+               if(nesfile_load(__FUNCTION__, f.target, &f.rom) == false){
+                       return;
+               }
+               if(rom_set(
+                       "CPU", m_choice_cpu_device->GetStringSelection(), 
+                       m_choice_cpu_trans->GetSelection(),
+                       &f.rom.cpu_rom, &f.flash_cpu
+               ) == false){
+                       return;
+               }
+               if(rom_set(
+                       "PPU", m_choice_ppu_device->GetStringSelection(), 
+                       m_choice_ppu_trans->GetSelection(),
+                       &f.rom.ppu_rom, &f.flash_ppu
+               ) == false){
+                       return;
+               }
+
+               f.reader = &DRIVER_KAZZO;
+               if(f.reader->open_or_close(READER_OPEN) == NG){
+                       *m_log << "reader open error\n";
+                       return;
+               }
+
+               m_choice_script->Disable();
+               m_picker_romimage->Disable();
+               m_button_execute->Disable();
+               m_choice_cpu_trans->Disable();
+               m_choice_cpu_device->Disable();
+               m_choice_ppu_trans->Disable();
+               m_choice_ppu_device->Disable();
+               f.reader->init();
+               script_flash_execute(&f);
+
+               nesbuffer_free(&f.rom, 0);
+               f.reader->open_or_close(READER_CLOSE);
+
+               m_choice_script->Enable();
+               m_picker_romimage->Enable();
+               m_button_execute->Enable();
+               m_choice_cpu_trans->Enable();
+               m_choice_cpu_device->Enable();
+               m_choice_ppu_trans->Enable();
+               m_choice_ppu_device->Enable();
+       }
 protected:
        // Handlers for frame_main events.
        void OnButtonClick( wxCommandEvent& event )
        {
-               this->dump_execute();
+               switch(m_mode){
+               case MODE_DUMP:
+                       this->dump_execute();
+                       break;
+               case MODE_PROGRAM:
+                       this->program_execute();
+                       break;
+               }
        }
 
        void mapper_change_check(wxCommandEvent& event)
index 2246aea..49e3060 100644 (file)
@@ -65,7 +65,7 @@ static bool bool_get(HSQUIRRELVM v, const char *field, bool *ret)
 }
 bool flash_device_get(const char *name, struct flash_device *t)
 {
-       HSQUIRRELVM v = qr_open(); 
+       HSQUIRRELVM v = qr_open(NULL); 
        if(SQ_FAILED(sqstd_dofile(v, _SC("flashdevice.nut"), SQFalse, SQTrue))){
                puts("flash device script error");
                qr_close(v);
@@ -157,7 +157,7 @@ static int flash_device_name_get(HSQUIRRELVM v, int index, const char **str)
 void flash_device_listup(struct flash_listup *t)
 {
        const char *str;
-       HSQUIRRELVM v = qr_open();
+       HSQUIRRELVM v = qr_open(NULL);
        SQInteger top = sq_gettop(v);
 
        if(SQ_FAILED(sqstd_dofile(v, _SC("flashdevice.nut"), SQFalse, SQTrue))){
index e7d94e4..9ce3663 100644 (file)
@@ -364,7 +364,7 @@ void script_dump_execute(struct config_dump *c)
                .log = &c->log
        };
        {
-               HSQUIRRELVM v = qr_open(); 
+               HSQUIRRELVM v = qr_open(&c->log); 
                qr_function_register_global(v, "ppu_ramfind", script_nop);
                qr_function_register_global(v, "cpu_write", cpu_write_check);
                qr_function_register_global(v, "memory_new", memory_new);
@@ -382,7 +382,7 @@ void script_dump_execute(struct config_dump *c)
                progress_init();
        }
        {
-               HSQUIRRELVM v = qr_open(); 
+               HSQUIRRELVM v = qr_open(&c->log); 
                qr_function_register_global(v, "memory_new", script_nop);
                qr_function_register_global(v, "nesfile_save", nesfile_save);
                qr_function_register_global(v, "cpu_write", cpu_write);
index 43777a6..d45b074 100644 (file)
@@ -31,11 +31,13 @@ struct anago_driver{
                void (*const read)(long address, long length, u8 *data);
                void (*const erase)(long address, bool dowait);
                long (*const program)(long address, long length, const u8 *data, bool dowait, bool skip);
+               struct gauge *const gauge;
        }order_cpu, order_ppu;
        void (*const flash_status)(uint8_t s[2]);
        uint8_t (*const vram_connection)(void);
        const enum vram_mirroring vram_mirroring;
        bool compare, testrun;
+       struct textcontrol *const log;
 };
 
 static SQInteger vram_mirrorfind(HSQUIRRELVM v)
@@ -46,7 +48,7 @@ static SQInteger vram_mirrorfind(HSQUIRRELVM v)
                return r;
        }
        if((d->vram_connection() == 0x05) != (d->vram_mirroring == MIRROR_VERTICAL)){
-               puts("warning: vram mirroring is inconnect");
+               d->log->append(d->log->object, "warning: vram mirroring is inconnect");
        }
        return 0;
 }
@@ -113,13 +115,15 @@ static SQInteger cpu_write(HSQUIRRELVM v)
        }
        return write_memory(v, &d->order_cpu);
 }
-static SQInteger erase_set(HSQUIRRELVM v, struct anago_flash_order *t, const char *region)
+static SQInteger erase_set(HSQUIRRELVM v, struct anago_flash_order *t, const char *region, struct textcontrol *log)
 {
        t->config(t->c000x, t->c2aaa, t->c5555, t->device->pagesize, t->device->retry);
        t->command_change = false;
        if(t->device->erase_require == true){
+               char str[80];
                t->erase(t->c2aaa, false);
-               printf("erasing %s memory...\n", region);
+               snprintf(str, 80, "erasing %s memory...\n", region);
+               log->append(log->object, str);
                fflush(stdout);
        }
        return 0;
@@ -131,7 +135,7 @@ static SQInteger cpu_erase(HSQUIRRELVM v)
        if(SQ_FAILED(r)){
                return r;
        }
-       return erase_set(v, &d->order_cpu, "program");
+       return erase_set(v, &d->order_cpu, "program", d->log);
 }
 static SQInteger ppu_erase(HSQUIRRELVM v)
 {
@@ -140,7 +144,7 @@ static SQInteger ppu_erase(HSQUIRRELVM v)
        if(SQ_FAILED(r)){
                return r;
        }
-       return erase_set(v, &d->order_ppu, "charcter");
+       return erase_set(v, &d->order_ppu, "charcter", d->log);
 }
 static SQInteger program_regist(HSQUIRRELVM v, const char *name, struct anago_flash_order *t)
 {
@@ -248,12 +252,35 @@ static SQInteger erase_wait(HSQUIRRELVM v)
        return 0;
 }
 
-static bool program_memoryarea(HSQUIRRELVM co, struct anago_flash_order *t, bool compare, const char *region, SQInteger *state, bool *console_update)
+static void gauge_init(const char *area, struct anago_flash_order *t)
+{
+       t->gauge->range_set(t->gauge->bar, t->programming.count);
+       t->gauge->value_set(t->gauge->bar, t->programming.offset);
+       if(t->programming.count == 0){
+               char str[20];
+               snprintf(str, 20, "%s skip", area);
+               t->gauge->label_set(t->gauge->label, str);
+       }
+}
+
+static void gauge_update(const char *area, struct anago_flash_order *t)
+{
+       if(t->programming.count != 0){
+               char str[40];
+               snprintf(str, 40, "%s 0x%06x/0x%06x", area, (int) t->programming.offset, (int) t->programming.count);
+               t->gauge->label_set(t->gauge->label, str);
+               t->gauge->value_set(t->gauge->bar, t->programming.offset);
+       }
+}
+
+static bool program_memoryarea(HSQUIRRELVM co, struct anago_flash_order *t, bool compare, const char *region, SQInteger *state, bool *console_update, struct textcontrol *log)
 {
        if(t->programming.length == 0){
                if(t->programming.offset != 0 && compare == true){
                        if(program_compare(t) == false){
-                               printf("%s memory compare error\n", region);
+                               char str[80];
+                               snprintf(str, 80, "%s memory compare error\n", region);
+                               log->append(log->object, str);
                                return false;
                        }
                }
@@ -288,30 +315,34 @@ static SQInteger program_main(HSQUIRRELVM v)
        SQInteger state_ppu = sq_getvmstate(co_ppu);
        const long sleepms = d->compare == true ? 6 : 2; //W29C040 ¤Ç compare ¤ò¤¹¤ë¤È¡¢error ¤¬½Ð¤ë¤Î¤Ç½Ð¤Ê¤¤ÃͤËÄ´À° (¤ä¤Ã¤Ä¤±Âбþ)
        
-       progress_init();
+       //progress_init();
+       gauge_init("CPU", &d->order_cpu);
+       gauge_init("PPU", &d->order_ppu);
        while((state_cpu != SQ_VMSTATE_IDLE) || (state_ppu != SQ_VMSTATE_IDLE)){
                uint8_t s[2];
                bool console_update = false;
                wait(sleepms);
                d->flash_status(s);
                if(state_cpu != SQ_VMSTATE_IDLE && s[0] == KAZZO_TASK_FLASH_IDLE){
-                       if(program_memoryarea(co_cpu, &d->order_cpu, d->compare, "program", &state_cpu, &console_update) == false){
+                       if(program_memoryarea(co_cpu, &d->order_cpu, d->compare, "program", &state_cpu, &console_update, d->log) == false){
                                return 0;
                        }
                }
                if(state_ppu != SQ_VMSTATE_IDLE && s[1] == KAZZO_TASK_FLASH_IDLE){
-                       if(program_memoryarea(co_ppu, &d->order_ppu, d->compare, "charcter", &state_ppu, &console_update) == false){
+                       if(program_memoryarea(co_ppu, &d->order_ppu, d->compare, "charcter", &state_ppu, &console_update, d->log) == false){
                                return 0;
                        }
                }
                if((console_update == true) && (d->testrun == false)){
-                       progress_draw(d->order_cpu.programming.offset, d->order_cpu.programming.count, d->order_ppu.programming.offset, d->order_ppu.programming.count);
+                       //progress_draw(d->order_cpu.programming.offset, d->order_cpu.programming.count, d->order_ppu.programming.offset, d->order_ppu.programming.count);
+                       gauge_update("CPU", &d->order_cpu);
+                       gauge_update("PPU", &d->order_ppu);
                }
        }
        return 0;
 }
 
-static SQInteger program_count(HSQUIRRELVM v, struct anago_flash_order *t, const struct range *range_address, const struct range *range_length)
+static SQInteger program_count(HSQUIRRELVM v, struct anago_flash_order *t, const struct range *range_address, const struct range *range_length, struct textcontrol *log)
 {
        SQRESULT r = qr_argument_get(v, 2, &t->programming.address, &t->programming.length);
        if(SQ_FAILED(r)){
@@ -322,7 +353,9 @@ static SQInteger program_count(HSQUIRRELVM v, struct anago_flash_order *t, const
                return r;
        }
        if((t->programming.address < range_address->start) || ((t->programming.address + t->programming.length) > range_address->end)){
-               printf("address range must be 0x%06x to 0x%06x", (int) range_address->start, (int) range_address->end - 1);
+               char str[80];
+               snprintf(str, 80, "address range must be 0x%06x to 0x%06x", (int) range_address->start, (int) range_address->end - 1);
+               log->append(log->object, str);
                return sq_throwerror(v, "script logical error");;
        }
        t->programming.count += t->programming.length;
@@ -337,7 +370,7 @@ static SQInteger cpu_program_count(HSQUIRRELVM v)
        if(SQ_FAILED(r)){
                return r;
        }
-       return program_count(v, &d->order_cpu, &range_address, &range_length);
+       return program_count(v, &d->order_cpu, &range_address, &range_length, d->log);
 }
 
 static SQInteger ppu_program_count(HSQUIRRELVM v)
@@ -349,17 +382,20 @@ static SQInteger ppu_program_count(HSQUIRRELVM v)
        if(SQ_FAILED(r)){
                return r;
        }
-       return program_count(v, &d->order_ppu, &range_address, &range_length);
+       return program_count(v, &d->order_ppu, &range_address, &range_length, d->log);
 }
 
 static bool script_execute(HSQUIRRELVM v, const char *function, struct config_flash *c, struct anago_driver *d)
 {
        bool ret = true;
        if(SQ_FAILED(sqstd_dofile(v, _SC("flashcore.nut"), SQFalse, SQTrue))){
-               printf("flash core script error\n");
+               d->log->append(d->log->object, "flash core script error\n");
                ret = false;
        }else if(SQ_FAILED(sqstd_dofile(v, _SC(c->script), SQFalse, SQTrue))){
-               printf("%s open error\n", c->script);
+               char str[80];
+               
+               snprintf(str, 80, "%s open error\n", c->script);
+               d->log->append(d->log->object, str);
                ret = false;
        }else{
                SQRESULT r = qr_call(
@@ -390,7 +426,8 @@ void script_flash_execute(struct config_flash *c)
                        .write = c->reader->cpu_write_6502,
                        .read = c->reader->cpu_read,
                        .erase = c->reader->cpu_flash_erase,
-                       .program = c->reader->cpu_flash_program
+                       .program = c->reader->cpu_flash_program,
+                       .gauge = &c->gauge_cpu
                },
                .order_ppu = {
                        .command_change = true,
@@ -405,19 +442,21 @@ void script_flash_execute(struct config_flash *c)
                        .read = c->reader->ppu_read,
                        .erase = c->reader->ppu_flash_erase,
                        .program = c->reader->ppu_flash_program,
+                       .gauge = &c->gauge_ppu
                },
                .flash_status = c->reader->flash_status,
                .vram_connection = c->reader->vram_connection,
                .vram_mirroring = c->rom.mirror,
                .compare = c->compare,
-               .testrun = c->testrun
+               .testrun = c->testrun,
+               .log = &c->log
        };
        {
                static const char *functionname[] = {
                        "cpu_erase", "ppu_erase",
                        "erase_wait", "program_main"
                };
-               HSQUIRRELVM v = qr_open();
+               HSQUIRRELVM v = qr_open(&c->log);
                int i;
                for(i = 0; i < sizeof(functionname)/sizeof(char *); i++){
                        qr_function_register_global(v, functionname[i], script_nop);
@@ -436,13 +475,16 @@ void script_flash_execute(struct config_flash *c)
                }
                qr_close(v);
                assert(d.order_cpu.memory->size != 0);
+               char str[80];
                if(d.order_cpu.programming.count % d.order_cpu.memory->size  != 0){
-                       printf("logical error: cpu_programsize is not connected 0x%06x/0x%06x\n", (int) d.order_cpu.programming.count, (int) d.order_cpu.memory->size);
+                       snprintf(str, 80, "logical error: cpu_programsize is not connected 0x%06x/0x%06x\n", (int) d.order_cpu.programming.count, (int) d.order_cpu.memory->size);
+                       d.log->append(d.log->object, str);
                        return;
                }
                if(d.order_ppu.memory->size != 0){
                        if(d.order_ppu.programming.count % d.order_ppu.memory->size != 0){
-                               printf("logical error: ppu_programsize is not connected 0x%06x/0x%06x\n", (int) d.order_ppu.programming.count, (int) d.order_ppu.memory->size);
+                               snprintf(str, 80, "logical error: ppu_programsize is not connected 0x%06x/0x%06x\n", (int) d.order_ppu.programming.count, (int) d.order_ppu.memory->size);
+                               d.log->append(d.log->object, str);
                                return;
                        }
                }
@@ -450,7 +492,7 @@ void script_flash_execute(struct config_flash *c)
        d.order_cpu.command_change = true;
        d.order_ppu.command_change = true;
        {
-               HSQUIRRELVM v = qr_open(); 
+               HSQUIRRELVM v = qr_open(&c->log); 
                qr_function_register_global(v, "cpu_write", cpu_write);
                qr_function_register_global(v, "cpu_erase", cpu_erase);
                qr_function_register_global(v, "cpu_program", cpu_program_memory);
index e1d24c5..d0ffe1e 100644 (file)
@@ -6,6 +6,8 @@ struct config_flash{
        const struct reader_driver *reader;
        struct romimage rom;
        bool compare, testrun;
+       struct gauge gauge_cpu, gauge_ppu;
+       struct textcontrol log;
 };
 void script_flash_execute(struct config_flash *c);
 #endif
index 413acb3..174942f 100644 (file)
@@ -5,6 +5,7 @@
 #include <squirrel.h>
 #include <sqstdio.h>
 #include <sqstdaux.h>
+#include "widget.h"
 
 #ifdef SQUNICODE 
 #define scvprintf vwprintf 
@@ -19,12 +20,30 @@ static void printfunc(HSQUIRRELVM v, const SQChar *s, ...)
        va_end(arglist);
 }
 
-HSQUIRRELVM qr_open(void)
+static void print_other(HSQUIRRELVM v, const SQChar *s, ...)
+{
+       va_list arglist;
+       va_start(arglist, s);
+       char str[80];
+
+       vsnprintf(str, 80, s, arglist);
+       struct textcontrol *p = (struct textcontrol *) sq_getforeignptr(v);
+       p->append(p->object, str);
+
+       va_end(arglist);
+}
+
+HSQUIRRELVM qr_open(struct textcontrol *p)
 {
        HSQUIRRELVM v = sq_open(0x400);
        sqstd_seterrorhandlers(v);
        sqstd_register_iolib(v);
-       sq_setprintfunc(v, printfunc);
+       if(p == NULL){
+               sq_setprintfunc(v, printfunc);
+       }else{
+               sq_setforeignptr(v, (SQUserPointer) p);
+               sq_setprintfunc(v, print_other);
+       }
        sq_pushroottable(v);
        return v;
 }
index 4d64df1..98f8594 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef _SQUIRREL_WRAP_H_
 #define _SQUIRREL_WRAP_H_
-HSQUIRRELVM qr_open(void);
+struct textcontrol;
+HSQUIRRELVM qr_open(struct textcontrol *p);
 void qr_function_register_global(HSQUIRRELVM v, const char *name, SQFUNCTION f);
 SQRESULT qr_call(HSQUIRRELVM v, const SQChar *functionname, SQUserPointer up, bool settop, int argnum, ...);
 void qr_close(HSQUIRRELVM v);