OSDN Git Service

ram mode, database に対応,
[unagi/old-svn-converted.git] / client / trunk / anago / script_program.c
index 9631f0d..a6c680b 100644 (file)
@@ -6,12 +6,11 @@
 #include <kazzo_task.h>
 #include "type.h"
 #include "widget.h"
-#include "header.h"
+#include "romimage.h"
 #include "memory_manage.h"
 #include "reader_master.h"
 #include "squirrel_wrap.h"
 #include "flash_device.h"
-#include "progress.h"
 #include "script_common.h"
 #include "script_program.h"
 
@@ -44,7 +43,7 @@ static SQInteger command_set(HSQUIRRELVM v, struct flash_memory_driver *t)
                t->c5555 = d;
                break;
        default:
-               return sq_throwerror(v, "unknown command address");
+               return sq_throwerror(v, wgT("unknown command address"));
        }
        t->command_change = true;
        return 0;
@@ -67,7 +66,7 @@ static SQInteger ppu_command(HSQUIRRELVM v)
        }
        return command_set(v, &d->ppu);
 }
-static SQInteger write_memory(HSQUIRRELVM v, const int *h, struct flash_memory_driver *t)
+static SQInteger write_memory(HSQUIRRELVM v, const struct reader_handle *h, struct flash_memory_driver *t)
 {
        long address, data;
        SQRESULT r = qr_argument_get(v, 2, &address, &data);
@@ -87,13 +86,13 @@ static SQInteger cpu_write(HSQUIRRELVM v)
        }
        return write_memory(v, d->handle, &d->cpu);
 }
-static SQInteger erase_set(HSQUIRRELVM v, const int *h, struct flash_memory_driver *t, struct textcontrol *log)
+static SQInteger erase_set(HSQUIRRELVM v, const struct reader_handle *h, struct flash_memory_driver *t, struct textcontrol *log)
 {
        t->access->flash_config(h, t->c000x, t->c2aaa, t->c5555, t->flash.pagesize, t->flash.retry);
        t->command_change = false;
        if(t->flash.erase_require == true){
                t->access->flash_erase(h, t->c2aaa, false);
-               t->gauge.label_set(t->gauge.label, "erasing ");
+               t->gauge.label_set(t->gauge.label, wgT("erasing "));
        }
        return 0;
 }
@@ -115,7 +114,7 @@ static SQInteger ppu_erase(HSQUIRRELVM v)
        }
        return erase_set(v, d->handle, &d->ppu, &d->log);
 }
-static SQInteger program_regist(HSQUIRRELVM v, const int *h, struct flash_memory_driver *t)
+static SQInteger program_regist(HSQUIRRELVM v, const struct reader_handle *h, struct flash_memory_driver *t)
 {
        SQRESULT r = qr_argument_get(v, 2, &t->programming.address, &t->programming.length);
        if(SQ_FAILED(r)){
@@ -131,11 +130,10 @@ static SQInteger program_regist(HSQUIRRELVM v, const int *h, struct flash_memory
                t->command_change = false;
        }
        
-/*     printf("programming %s ROM area 0x%06x...\n", name, t->memory->offset);
-       fflush(stdout);*/
        return sq_suspendvm(v);
 }
-static void program_execute(const int *h, struct flash_memory_driver *t)
+
+static void program_execute(const struct reader_handle *h, struct flash_memory_driver *t)
 {
        const long w = t->access->flash_program(
                h, &t->gauge, 
@@ -150,7 +148,7 @@ static void program_execute(const int *h, struct flash_memory_driver *t)
        t->programming.offset += w;
 }
 
-static bool program_compare(const int *h, struct flash_memory_driver *t)
+static bool program_compare(const struct reader_handle *h, struct flash_memory_driver *t)
 {
        uint8_t *comparea = Malloc(t->compare.length);
        bool ret = false;
@@ -193,7 +191,7 @@ static SQInteger ppu_program_memory(HSQUIRRELVM v)
        return program_regist(v, d->handle, &d->ppu);
 }
 
-static long erase_timer_get(const int *h, struct flash_memory_driver *t)
+static long erase_timer_get(const struct reader_handle *h, struct flash_memory_driver *t)
 {
        if(
                (t->memory.transtype != TRANSTYPE_EMPTY) && 
@@ -232,23 +230,21 @@ static SQInteger erase_wait(HSQUIRRELVM v)
 static void gauge_init(struct flash_memory_driver *t)
 {
        t->gauge.range_set(t->gauge.bar, t->programming.count);
-       t->gauge.value_set(t->gauge.bar, t->gauge.label, t->programming.offset);
-       if(t->programming.count == 0){
-               t->gauge.label_set(t->gauge.label, "skip");
-       }
+
+       t->gauge.value_set(t->gauge.bar, t->gauge.label, 0);
 }
 
-static bool program_memoryarea(HSQUIRRELVM co, const int *h, struct flash_memory_driver *t, bool compare, SQInteger *state, struct textcontrol *log)
+static bool program_memoryarea(HSQUIRRELVM co, const struct reader_handle *h, struct flash_memory_driver *t, bool compare, SQInteger *state, struct textcontrol *log)
 {
        if(t->programming.length == 0){
                if(t->programming.offset != 0 && compare == true){
                        if(program_compare(h, t) == false){
-                               log->append(log->object, "%s memory compare error\n", t->memory.name);
+                               log->append(log->object, wgT("%s memory compare error, offset 0x%06x\n"), t->memory.name, t->programming.offset);
                                return false;
                        }
                }
 
-               sq_wakeupvm(co, SQFalse, SQFalse, SQTrue/*, SQTrue*/);
+               sq_wakeupvm(co, SQFalse, SQFalse, SQTrue, SQFalse);
                *state = sq_getvmstate(co);
        }else{
                program_execute(h, t);
@@ -259,7 +255,7 @@ static bool program_memoryarea(HSQUIRRELVM co, const int *h, struct flash_memory
 static SQInteger program_main(HSQUIRRELVM v)
 {
        if(sq_gettop(v) != (1 + 3)){ //roottable, userpointer, co_cpu, co_ppu
-               return sq_throwerror(v, "argument number error");
+               return sq_throwerror(v, wgT("argument number error"));
        }
        struct program_config *d;
        SQRESULT r =  qr_userpointer_get(v, (SQUserPointer) &d);
@@ -268,10 +264,10 @@ static SQInteger program_main(HSQUIRRELVM v)
        }
        HSQUIRRELVM co_cpu, co_ppu;
        if(SQ_FAILED(sq_getthread(v, 3, &co_cpu))){
-               return sq_throwerror(v, "thread error");
+               return sq_throwerror(v, wgT("thread error"));
        }
        if(SQ_FAILED(sq_getthread(v, 4, &co_ppu))){
-               return sq_throwerror(v, "thread error");
+               return sq_throwerror(v, wgT("thread error"));
        }
        SQInteger state_cpu = sq_getvmstate(co_cpu);
        SQInteger state_ppu = sq_getvmstate(co_ppu);
@@ -302,13 +298,13 @@ static SQInteger program_count(HSQUIRRELVM v, struct flash_memory_driver *t, con
        if(SQ_FAILED(r)){
                return r;
        }
-       r = range_check(v, "length", t->programming.length, range_length);
+       r = range_check(v, wgT("length"), t->programming.length, range_length);
        if(SQ_FAILED(r)){
                return r;
        }
        if((t->programming.address < range_address->start) || ((t->programming.address + t->programming.length) > range_address->end)){
-               log->append(log->object, "address range must be 0x%06x to 0x%06x", (int) range_address->start, (int) range_address->end - 1);
-               return sq_throwerror(v, "script logical error");;
+               log->append(log->object, wgT("address range must be 0x%06x to 0x%06x"), (int) range_address->start, (int) range_address->end - 1);
+               return sq_throwerror(v, wgT("script logical error"));
        }
        t->programming.count += t->programming.length;
        return 0;
@@ -337,18 +333,15 @@ static SQInteger ppu_program_count(HSQUIRRELVM v)
        return program_count(v, &d->ppu, &range_address, &range_length, &d->log);
 }
 
-static bool script_execute(HSQUIRRELVM v, const char *function, struct program_config *c)
+static bool script_execute(HSQUIRRELVM v, const wgChar *function, struct program_config *c)
 {
        bool ret = true;
-       if(SQ_FAILED(sqstd_dofile(v, _SC("flashcore.nut"), SQFalse, SQTrue))){
-               c->log.append(c->log.object, "flash core script error\n");
-               ret = false;
-       }else if(SQ_FAILED(sqstd_dofile(v, _SC(c->script), SQFalse, SQTrue))){
-               c->log.append(c->log.object, "%s open error\n", c->script);
+       if(SQ_FAILED(sqstd_dofile(v, _SC("programcore.nut"), SQFalse, SQTrue))){
+               c->log.append(c->log.object, wgT("flash core script error\n"));
                ret = false;
        }else{
                SQRESULT r = qr_call(
-                       v, function, (SQUserPointer) c, true, 
+                       v, function, (SQUserPointer) c, c->script,
                        1 + 3 * 2, c->mappernum, 
                        c->cpu.memory.transtype, c->cpu.memory.size, c->cpu.flash.capacity,
                        c->ppu.memory.transtype, c->ppu.memory.size, c->cpu.flash.capacity
@@ -360,42 +353,42 @@ static bool script_execute(HSQUIRRELVM v, const char *function, struct program_c
        return ret;
 }
 
-static void zendan(struct program_config *c)
+static bool zendan(struct program_config *c)
 {
 //script test run
        {
-               static const char *functionname[] = {
-                       "cpu_erase", "ppu_erase",
-                       "erase_wait", "program_main"
+               static const wgChar *functionname[] = {
+                       wgT("cpu_erase"), wgT("ppu_erase"),
+                       wgT("erase_wait"), wgT("program_main")
                };
                HSQUIRRELVM v = qr_open(&c->log);
                int i;
-               for(i = 0; i < sizeof(functionname)/sizeof(char *); i++){
+               for(i = 0; i < sizeof(functionname)/sizeof(wgChar *); i++){
                        qr_function_register_global(v, functionname[i], script_nop);
                }
-               qr_function_register_global(v, "cpu_write", cpu_write_check);
-               qr_function_register_global(v, "cpu_command", cpu_command);
-               qr_function_register_global(v, "cpu_program", cpu_program_count);
+               qr_function_register_global(v, _SC("cpu_write"), cpu_write_check);
+               qr_function_register_global(v, _SC("cpu_command"), cpu_command);
+               qr_function_register_global(v, _SC("cpu_program"), cpu_program_count);
                
-               qr_function_register_global(v, "ppu_program", ppu_program_count);
-               qr_function_register_global(v, "ppu_command", ppu_command);
-               qr_function_register_global(v, "vram_mirrorfind", vram_mirrorfind);
+               qr_function_register_global(v, _SC("ppu_program"), ppu_program_count);
+               qr_function_register_global(v, _SC("ppu_command"), ppu_command);
+               qr_function_register_global(v, _SC("vram_mirrorfind"), vram_mirrorfind);
                
-               if(script_execute(v, "testrun", c) == false){
+               if(script_execute(v, wgT("testrun"), c) == false){
                        qr_close(v);
-                       return;
+                       return false;
                }
                qr_close(v);
                assert(c->cpu.memory.size != 0);
 
                if(c->cpu.programming.count % c->cpu.memory.size  != 0){
-                       c->log.append(c->log.object, "logical error: cpu_programsize is not connected 0x%06x/0x%06x\n", (int) c->cpu.programming.count, (int) c->cpu.memory.size);
-                       return;
+                       c->log.append(c->log.object, wgT("logical error: cpu_programsize is not connected 0x%06x/0x%06x\n"), (int) c->cpu.programming.count, (int) c->cpu.memory.size);
+                       return false;
                }
                if(c->ppu.memory.size != 0){
                        if(c->ppu.programming.count % c->ppu.memory.size != 0){
-                               c->log.append(c->log.object, "logical error: ppu_programsize is not connected 0x%06x/0x%06x\n", (int) c->ppu.programming.count, (int) c->ppu.memory.size);
-                               return;
+                               c->log.append(c->log.object, wgT("logical error: ppu_programsize is not connected 0x%06x/0x%06x\n"), (int) c->ppu.programming.count, (int) c->ppu.memory.size);
+                               return false;
                        }
                }
        }
@@ -406,19 +399,20 @@ static void zendan(struct program_config *c)
        gauge_init(&c->ppu);
        {
                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);
-               qr_function_register_global(v, "cpu_command", cpu_command);
-               qr_function_register_global(v, "ppu_erase", ppu_erase);
-               qr_function_register_global(v, "ppu_program", ppu_program_memory);
-               qr_function_register_global(v, "ppu_command", ppu_command);
-               qr_function_register_global(v, "program_main", program_main);
-               qr_function_register_global(v, "erase_wait", erase_wait);
-               qr_function_register_global(v, "vram_mirrorfind", script_nop);
-               script_execute(v, "program", c);
+               qr_function_register_global(v, _SC("cpu_write"), cpu_write);
+               qr_function_register_global(v, _SC("cpu_erase"), cpu_erase);
+               qr_function_register_global(v, _SC("cpu_program"), cpu_program_memory);
+               qr_function_register_global(v, _SC("cpu_command"), cpu_command);
+               qr_function_register_global(v, _SC("ppu_erase"), ppu_erase);
+               qr_function_register_global(v, _SC("ppu_program"), ppu_program_memory);
+               qr_function_register_global(v, _SC("ppu_command"), ppu_command);
+               qr_function_register_global(v, _SC("program_main"), program_main);
+               qr_function_register_global(v, _SC("erase_wait"), erase_wait);
+               qr_function_register_global(v, _SC("vram_mirrorfind"), script_nop);
+               script_execute(v, wgT("program"), c);
                qr_close(v);
        }
+       return true;
 }
 
 static bool memory_image_init(const struct memory *from, struct flash_memory_driver *t, struct textcontrol *log)
@@ -435,46 +429,48 @@ static bool memory_image_init(const struct memory *from, struct flash_memory_dri
        if(t->flash.capacity < from->size){
                log->append(log->object, t->memory.name);
                
-               log->append(log->object, " image size is larger than target device");
+               log->append(log->object, wgT(" image size is larger than target device"));
                return false;
        }
        return true;
 }
 
-void script_program_execute(struct program_config *c)
+bool script_program_execute(struct program_config *c)
 {
 //rom image load
        struct romimage rom;
        if(nesfile_load(&c->log, c->target, &rom) == false){
-               c->log.append(c->log.object, "ROM image open error");
-               return;
+               c->log.append(c->log.object, wgT("ROM image open error"));
+               return false;
        }
 //variable init
        c->mappernum = rom.mappernum;
-       c->cpu.memory.name = "Program Flash";
+       c->cpu.memory.name = wgT("Program Flash");
        if(memory_image_init(&rom.cpu_rom, &c->cpu, &c->log) == false){
                nesbuffer_free(&rom, 0);
-               return;
+               return false;
        }
-       c->ppu.memory.name = "Charcter Flash";
+       c->ppu.memory.name = wgT("Charcter Flash");
        if(memory_image_init(&rom.ppu_rom, &c->ppu, &c->log) == false){
                nesbuffer_free(&rom, 0);
-               return;
+               return false;
        }
 //reader initalize
-       c->handle = c->control->open();
+       c->handle = c->control->open(c->except, &c->log);
        if(c->handle == NULL){
-               c->log.append(c->log.object, "reader open error\n");
+               c->log.append(c->log.object, wgT("reader open error\n"));
                nesbuffer_free(&rom, 0);
-               return;
+               return false;
        }
 //program start, reader finalize
        if(connection_check(c->handle, &c->log, c->cpu.access, c->ppu.access) == false){
                nesbuffer_free(&rom, 0);
-               return;
+               c->control->close(c->handle);
+               return false;
        }
-       zendan(c);
+       bool ret = zendan(c);
        c->control->close(c->handle);
        c->handle = NULL;
        nesbuffer_free(&rom, 0);
+       return ret;
 }