OSDN Git Service

unicode support
authornaruko <naruko@24ea1065-a21e-4ca1-99c9-f5125deb0858>
Fri, 29 Oct 2010 05:40:09 +0000 (05:40 +0000)
committernaruko <naruko@24ea1065-a21e-4ca1-99c9-f5125deb0858>
Fri, 29 Oct 2010 05:40:09 +0000 (05:40 +0000)
git-svn-id: svn+ssh://svn.osdn.net/svnroot/unagi@382 24ea1065-a21e-4ca1-99c9-f5125deb0858

26 files changed:
client/trunk/anago/Makefile.unix
client/trunk/anago/Makefile.windows
client/trunk/anago/anago.mk
client/trunk/anago/anago_cui.c
client/trunk/anago/anago_frame.cpp
client/trunk/anago/cui_gauge.c
client/trunk/anago/cui_gauge.h
client/trunk/anago/flash_device.c
client/trunk/anago/flash_device.h
client/trunk/anago/script_common.c
client/trunk/anago/script_common.h
client/trunk/anago/script_dump.c
client/trunk/anago/script_dump.h
client/trunk/anago/script_program.c
client/trunk/anago/script_program.h
client/trunk/anago/squirrel_wrap.c
client/trunk/anago/squirrel_wrap.h
client/trunk/file.c
client/trunk/file.h
client/trunk/header.c
client/trunk/header.h
client/trunk/reader_kazzo.c
client/trunk/reader_master.h
client/trunk/type.h
client/trunk/widget.c
client/trunk/widget.h

index 480440a..439dcde 100644 (file)
@@ -4,5 +4,6 @@ LIBUSB =
 SQUIRREL = ../SQUIRREL2\r
 KAZZO = ../../kazzo/firmware\r
 WX_CONFIG = wx-config\r
-\r
+CPPFLAGS =\r
+CXXFLAGS = \r
 include anago.mk\r
index 87d86b9..e7adfcc 100644 (file)
@@ -3,6 +3,7 @@ APP_GUI = anago_wx.exe
 LIBUSB = d:/dev/LibUSB-Win32\r
 SQUIRREL = ../SQUIRREL2\r
 KAZZO = ../../kazzo/firmware\r
-WX_CONFIG = /d/dev/wxWidgets/build_release/wx-config\r
-CXXFLAGS = -finput-charset=utf-8 -fexec-charset=cp932\r
+WX_CONFIG = /d/dev/wxWidgets/build_unicode_sound3/wx-config\r
+CPPFLAGS =  -D_UNICODE\r
+CXXFLAGS = #-finput-charset=utf-8 -fexec-charset=cp932\r
 include anago.mk\r
index cf98dc4..61346a1 100644 (file)
@@ -1,11 +1,11 @@
 all: $(APP_GUI) $(APP_CUI)
 VPATH = ..
 ifeq ($(RELEASE),1)
-  CPPFLAGS = -O2 -DNDEBUG
+  CPPFLAGS += -O2 -DNDEBUG
 else
-  CPPFLAGS = -g -O0
+  CPPFLAGS += -g -O0
 endif
-CPPFLAGS += -Wall -Werror -DDEBUG=1 -DANAGO=1
+CPPFLAGS += -Wall -Werror -DDEBUG=1
 CFLAGS = -I.. -I$(SQUIRREL)/include -I$(KAZZO)
 ifneq ($(strip $(LIBUSB)),)
   CFLAGS += -I$(LIBUSB)/include
index 51389e0..4ab7842 100644 (file)
 #include "flash_device.h"
 #include "script_program.h"
 
-static void text_append_va(void *obj, const char *format, va_list list)
+static void text_append_va(void *obj, const wgChar *format, va_list list)
 {
-       vprintf(format, list);
+       vwprintf(format, list);
 }
 
-static void text_append(void *obj, const char *format, ...)
+static void text_append(void *obj, const wgChar *format, ...)
 {
        va_list list;
        va_start(list, format);
@@ -33,17 +33,27 @@ static void log_set(struct textcontrol *log)
        log->append_va = text_append_va;
 }
 
-static void except(const char *str)
+#ifdef _UNICODE
+  #define PUTS _putws
+#else
+  #define PUTS puts
+#endif
+
+static void except(const wgChar *str)
 {
-       puts(str);
+       PUTS(str);
        exit(0);
 }
 
-static bool program_rom_set(const char *device, char trans, struct memory *m, struct flash_device *f)
+static bool program_rom_set(const wgChar *device, wgChar trans, struct memory *m, struct flash_device *f)
 {
        m->offset = 0;
        if(flash_device_get(device, f) == false){
+#ifdef _UNICODE
+               wprintf(L"unknown flash memory device %s\n", device);
+#else
                printf("unknown flash memory device %s\n", device);
+#endif
                return false;
        }
        switch(trans){
@@ -64,7 +74,7 @@ static bool program_rom_set(const char *device, char trans, struct memory *m, st
        return true;
 }
 
-static void program(int c, char **v)
+static void program(int c, wgChar **v)
 {
        struct program_config config;
        config.cpu.memory.data = NULL;
@@ -88,28 +98,28 @@ static void program(int c, char **v)
 
        switch(c){
        case 5: {//mode script target cpu_flash_device
-               char trans = 'f';
-               if(v[1][1] != '\0'){
+               wgChar trans = wgT('f');
+               if(v[1][1] != wgT('\0')){
                        trans = v[1][1];
                }
                if(program_rom_set(v[4], trans, &config.cpu.memory, &config.cpu.flash) == false){
                        return;
                }
-               if(program_rom_set("dummy", 'e', &config.ppu.memory, &config.ppu.flash) == false){
+               if(program_rom_set(wgT("dummy"), wgT('e'), &config.ppu.memory, &config.ppu.flash) == false){
                        assert(0);
                        return;
                }
                }break;
        case 6: { //mode script target cpu_flash_device ppu_flash_device
-               char trans = 'f';
-               if(v[1][1] != '\0'){
+               wgChar trans = wgT('f');
+               if(v[1][1] != wgT('\0')){
                        trans = v[1][1];
                }
                if(program_rom_set(v[4], trans, &config.cpu.memory, &config.cpu.flash) == false){
                        return;
                }
-               trans = 'f';
-               if(v[1][1] != '\0' && v[1][2] != '\0'){
+               trans = wgT('f');
+               if(v[1][1] != wgT('\0') && v[1][2] != wgT('\0')){
                        trans = v[1][2];
                }
                if(program_rom_set(v[5], trans, &config.ppu.memory, &config.ppu.flash) == false){
@@ -117,47 +127,47 @@ static void program(int c, char **v)
                }
                }break;
        default:
-               puts("mode script target cpu_flash_device ppu_flash_device");
+               PUTS(wgT("mode script target cpu_flash_device ppu_flash_device"));
                return;
        }
        log_set(&config.log);
-       cui_gauge_new(&config.cpu.gauge, "Program  Flash", 2, -2);
-       cui_gauge_new(&config.ppu.gauge, "Charcter Flash", 1, -1);
+       cui_gauge_new(&config.cpu.gauge, wgT("Program  Flash"), 2, -2);
+       cui_gauge_new(&config.ppu.gauge, wgT("Charcter Flash"), 1, -1);
        config.except = except;
        script_program_execute(&config);
        cui_gauge_destory(&config.cpu.gauge);
        cui_gauge_destory(&config.ppu.gauge);
 }
 
-static void dump(int c, char **v)
+static void dump(int c, wgChar **v)
 {
        struct dump_config config;
        if(c < 4){
-               puts("argument error");
+               PUTS(wgT("argument error"));
                return;
        }
        config.cpu.increase = 1;
        config.ppu.increase = 1;
        config.progress = true;
        switch(v[1][0]){
-       case 'D':
+       case wgT('D'):
                config.progress = false;
                break;
        }
        switch(v[1][1]){
-       case '2':
+       case wgT('2'):
                config.cpu.increase = 2;
                break;
-       case '4':
+       case wgT('4'):
                config.cpu.increase = 4;
                break;
        }
-       if(v[1][1] != '\0'){
+       if(v[1][1] != wgT('\0')){
                switch(v[1][2]){
-               case '2':
+               case wgT('2'):
                        config.ppu.increase = 2;
                        break;
-               case '4':
+               case wgT('4'):
                        config.ppu.increase = 4;
                        break;
                }
@@ -167,12 +177,16 @@ static void dump(int c, char **v)
        config.control = &DRIVER_KAZZO.control;
        config.cpu.access = &DRIVER_KAZZO.cpu;
        config.ppu.access = &DRIVER_KAZZO.ppu;
-       cui_gauge_new(&config.cpu.gauge, "Program  ROM", 2, -2);
-       cui_gauge_new(&config.ppu.gauge, "Charcter ROM", 1, -1);
+       cui_gauge_new(&config.cpu.gauge, wgT("Program  ROM"), 2, -2);
+       cui_gauge_new(&config.ppu.gauge, wgT("Charcter ROM"), 1, -1);
        config.except = except;
        config.mappernum = -1;
        if(c == 5){
+#ifdef _UNICODE
+               config.mappernum = _wtoi(v[4]);
+#else
                config.mappernum = atoi(v[4]);
+#endif
        }
        config.battery = false;
        log_set(&config.log);
@@ -181,34 +195,54 @@ static void dump(int c, char **v)
        cui_gauge_destory(&config.ppu.gauge);
 }
 
-static void usage(const char *v)
+static void usage(const wgChar *v)
 {
-       puts("famicom bus simluator 'anago'");
+       PUTS(wgT("famicom bus simluator 'anago'"));
+#ifdef _UNICODE
+       wprintf(L"%s [mode] [script] [target] ....\n", v);
+#else
        printf("%s [mode] [script] [target] ....\n", v);
+#endif
 }
 
 #ifdef WIN32
-int main(int c, char **v)
+int main(int c, char **vv)
 #else
-int anago_cui(int c, char **v)
+int anago_cui(int c, wgChar **v)
 #endif
 {
        mm_init();
        if(c >= 2){
+#ifdef _UNICODE
+               int i;
+               wchar_t **v;
+               v = Malloc(sizeof(wchar_t *) * c);
+               for(i = 0; i < c; i++){
+                       size_t len = strlen(vv[i]);
+                       v[i] = Malloc(sizeof(wchar_t) * (len + 1));
+                       mbstowcs(v[i], vv[i], len + 1);
+               }
+#endif
                switch(v[1][0]){
-               case 'a': case 'f': case 'F':
+               case wgT('a'): case wgT('f'): case wgT('F'):
                        program(c, v);
                        break;
-               case 'd': case 'D':
+               case wgT('d'): case wgT('D'):
                        dump(c,v);
                        break;
                default:
                        usage(v[0]);
-                       puts("mode are d, D, f, g");
+                       PUTS(wgT("mode are d, D, f, g"));
                        break;
                }
+#ifdef _UNICODE
+               for(i = 0; i < c; i++){
+                       Free(v[i]);
+               }
+               Free(v);
+#endif
        }else{
-               usage(v[0]);
+               //usage(v[0]);
        }
        mm_end();
        return 0;
index 490deaa..255f03e 100644 (file)
@@ -4,6 +4,7 @@
 #include <wx/dir.h>
 #include <wx/sound.h>
 #include <cstdarg>
+#include "type.h"
 #include "anago_gui.h"
 #include "widget.h"
 #include "reader_master.h"
@@ -15,9 +16,13 @@ extern "C"{
   #include "script_program.h"
   void qr_version_print(const struct textcontrol *l);
 }
-
+#ifdef _UNICODE
+  #define STRNCPY wcsncpy
+#else
+  #define STRNCPY strncpy
+#endif
 //---- C++ -> C -> C++ wrapping functions ----
-static void throw_error(const char *t)
+static void throw_error(const wxChar *t)
 {
        throw t;
 }
@@ -52,7 +57,7 @@ static void range_set(void *gauge, int value)
        g->SetRange(value);
 }
 
-static void text_append_va(void *log, const char *format, va_list list)
+static void text_append_va(void *log, const wxChar *format, va_list list)
 {
        wxTextCtrl *l = static_cast<wxTextCtrl *>(log);
        wxString str;
@@ -63,7 +68,7 @@ static void text_append_va(void *log, const char *format, va_list list)
        wxMutexGuiLeave();
 }
 
-static void text_append(void *log, const char *format, ...)
+static void text_append(void *log, const wxChar *format, ...)
 {
        va_list list;
        va_start(list, format);
@@ -71,7 +76,7 @@ static void text_append(void *log, const char *format, ...)
        va_end(list);
 }
 
-static void version_append_va(void *log, const char *format, va_list list)
+static void version_append_va(void *log, const wxChar *format, va_list list)
 {
        wxTextCtrl *l = static_cast<wxTextCtrl *>(log);
        wxString str;
@@ -80,7 +85,7 @@ static void version_append_va(void *log, const char *format, va_list list)
        *l << str;
 }
 
-static void version_append(void *log, const char *format, ...)
+static void version_append(void *log, const wxChar *format, ...)
 {
        va_list list;
        va_start(list, format);
@@ -88,7 +93,7 @@ static void version_append(void *log, const char *format, ...)
        va_end(list);
 }
 
-static void label_set(void *label, const char *format, ...)
+static void label_set(void *label, const wxChar *format, ...)
 {
        wxStaticText *l = static_cast<wxStaticText *>(label);
        wxString str;
@@ -103,7 +108,7 @@ static void label_set(void *label, const char *format, ...)
        wxMutexGuiLeave();
 }
 
-void choice_append(void *choice, const char *str)
+void choice_append(void *choice, const wxChar *str)
 {
        wxChoice *c = static_cast<wxChoice *>(choice);
        c->Append(wxString(str));
@@ -225,9 +230,9 @@ private:
                config.battery = m_dump_check_battery->GetValue();
                {
                        wxString str_script = m_dump_script_choice->GetStringSelection();
-                       char *t = new char[str_script.Length() + 1];
+                       wxChar *t = new wxChar[str_script.Length() + 1];
                        config.script = t;
-                       strncpy(t, str_script.fn_str(), str_script.Length() + 1);
+                       STRNCPY(t, str_script.fn_str(), str_script.Length() + 1);
                }
 
                {
@@ -245,13 +250,13 @@ private:
                {
                        wxTextCtrl *text = m_dump_romimage_picker->GetTextCtrl();
                        wxString str_rom = text->GetValue();
-                       char *t = new char[str_rom.Length() + 1];
+                       wxChar *t = new wxChar[str_rom.Length() + 1];
                        if(text->IsEmpty() == true){
                                *m_log << wxT("Enter filename to ROM image\n");
                                return;
                        }
                        config.target = t;
-                       strncpy(t, str_rom.fn_str(), str_rom.Length() + 1);
+                       STRNCPY(t, str_rom.fn_str(), str_rom.Length() + 1);
                }
 
                config.control = &DRIVER_KAZZO.control;
@@ -334,8 +339,8 @@ private:
                
                {
                        wxString str_script = m_program_script_choice->GetStringSelection();
-                       char *t = new char[str_script.Length() + 1];
-                       strncpy(t, str_script.fn_str(), str_script.Length() + 1);
+                       wxChar *t = new wxChar[str_script.Length() + 1];
+                       STRNCPY(t, str_script.fn_str(), str_script.Length() + 1);
                        f.script = t;
                }
 
@@ -346,8 +351,8 @@ private:
                                *m_log << wxT("Enter filename to ROM image\n");
                                return;
                        }
-                       char *t = new char[str_rom.Length() + 1];
-                       strncpy(t, str_rom.fn_str(), str_rom.Length() + 1);
+                       wxChar *t = new wxChar[str_rom.Length() + 1];
+                       STRNCPY(t, str_rom.fn_str(), str_rom.Length() + 1);
                        f.target = t;
                }
                f.compare = m_program_compare->GetValue();
@@ -463,7 +468,7 @@ public:
 
 //version infomation
                struct textcontrol detail;
-               *m_version_detail << wxT("anago build at ") << __DATE__ << wxT("\n\n");
+               *m_version_detail << wxT("anago build at ") << wxT(__DATE__) << wxT("\n\n");
                detail.object = m_version_detail;
                detail.append = version_append;
                detail.append_va = version_append_va;
@@ -499,11 +504,6 @@ public:
 
        void DumpThreadFinish(void)
        {
-/*             wxSound sound(wxT("tinkalink2.wav"), false);
-               if(sound.IsOk() == true){
-                       sound.Play();
-               }*/
-               
                m_dump_script_choice->Enable();
                m_dump_romimage_picker->Enable();
                m_dump_check_battery->Enable();
@@ -529,7 +529,7 @@ public:
                m_program_ppu_device->Enable();
                m_status = STATUS_IDLE;
        }
-       void LogAppend(const char *t)
+       void LogAppend(const wxChar *t)
        {
                *m_log << t;
        }
@@ -540,7 +540,16 @@ void *anago_dumper::Entry(void)
 {
        try{
                script_dump_execute(&m_config);
-       }catch(const char *t){
+
+               wxSound sound(wxT("tinkalink2.wav"), false);
+               if(sound.IsOk() == true){
+                       sound.Play();
+               }
+       }catch(const wxChar *t){
+               wxSound sound(wxT("doggrowl.wav"), false);
+               if(sound.IsOk() == true){
+                       sound.Play();
+               }
                m_frame->LogAppend(t);
        }
        m_frame->DumpThreadFinish();
@@ -551,7 +560,16 @@ void *anago_programmer::Entry(void)
 {
        try{
                script_program_execute(&m_config);
-       }catch(const char *t){
+
+               wxSound sound(wxT("cuckoo.wav"), false);
+               if(sound.IsOk() == true){
+                       sound.Play();
+               }
+       }catch(const wxChar *t){
+               wxSound sound(wxT("doggrowl.wav"), false);
+               if(sound.IsOk() == true){
+                       sound.Play();
+               }
                m_frame->LogAppend(t);
        }
        m_frame->ProgramThreadFinish();
@@ -560,9 +578,9 @@ void *anago_programmer::Entry(void)
 
 #ifndef WIN32
 extern "C"{
-  int anago_cui(int c, char **v);
+  int anago_cui(int c, wxChar **v);
 }
-int main(int c, char **v)
+int main(int c, wxChar **v)
 {
        if(c < 2){
                return wxEntry(c, v);
index d07c72d..399f874 100644 (file)
@@ -5,11 +5,12 @@
 #ifdef WIN32
   #include <windows.h>
 #endif
+#include "type.h"
 #include "memory_manage.h"
 #include "widget.h"
 
 struct cui_gauge{
-       const char *name;
+       const wgChar *name;
        int value, range;
        int lineback, lineforward;
 };
@@ -20,6 +21,13 @@ static void range_set(void *obj, int value)
        t->range = value;
 }
 
+#ifdef _UNICODE
+  #define PRINTF wprintf
+  #define VPRINTF vwprintf
+#else
+  #define PRINTF printf
+  #define VPRINTF vprintf
+#endif
 static void console_move(int line)
 {
        if(line == 0){
@@ -32,15 +40,15 @@ static void console_move(int line)
        if(GetConsoleScreenBufferInfo(c, &info) == 0){
                //command.com, cygwin shell, mingw shell
                if(line < 0){
-                       printf("\x1b[%dA", -line);
+                       PRINTF(wgT("\x1b[%dA"), -line);
                }else if(line == 1){
-                       printf("\n");
+                       PRINTF(wgT("\n"));
                        fflush(stdout);
                }else{
-                       printf("\n");
+                       PRINTF(wgT("\n"));
                        fflush(stdout);
-                       printf("\x1b[%dB", line - 1);
-//                     printf("\x1b[%dB", line - 1);
+                       PRINTF(wgT("\x1b[%dB"), line - 1);
+//                     PRINTF(wgT("\x1b[%dB"), line - 1);
 //                     fflush(stdout);
                }
        }else{
@@ -51,9 +59,9 @@ static void console_move(int line)
        }
 #else
        if(line < 0){
-               printf("\x1b[%dA\x1b[35D", -line);
+               PRINTF(wgT("\x1b[%dA\x1b[35D"), -line);
        }else{
-               printf("\x1b[%dB\x1b[35D", line);
+               PRINTF(wgT("\x1b[%dB\x1b[35D"), line);
        }
 #endif
 //     fflush(stdout);
@@ -64,27 +72,27 @@ static void draw(const struct cui_gauge *t)
        const int barnum = 16;
        const int unit = t->range / barnum;
        int igeta = t->value / unit;
-       char bar[barnum + 3 + 1];
-       char *text = bar;
+       wgChar bar[barnum + 3 + 1];
+       wgChar *text = bar;
        int i;
        assert(igeta <= barnum);
-       printf("%s 0x%06x/0x%06x ", t->name, (int) t->value, (int) t->range);
-       *text++ = '|';
+       PRINTF(wgT("%s 0x%06x/0x%06x "), t->name, (int) t->value, (int) t->range);
+       *text++ = wgT('|');
        for(i = 0; i < igeta; i++){
                if(i == barnum / 2){
-                       *text++ = '|';
+                       *text++ = wgT('|');
                }
-               *text++ = '#';
+               *text++ = wgT('#');
        }
        for(; i < barnum; i++){
                if(i == barnum / 2){
-                       *text++ = '|';
+                       *text++ = wgT('|');
                }
-               *text++ = ' ';
+               *text++ = wgT(' ');
        }
-       *text++ = '|';
-       *text = '\0';
-       printf(bar);
+       *text++ = wgT('|');
+       *text = wgT('\0');
+       PRINTF(bar);
 //     fflush(stdout);
 }
 
@@ -108,7 +116,7 @@ static void value_add(void *obj, void *d, int value)
        console_move(t->lineforward);
 }
 
-static void name_set(void *obj, const char *name, int lineforward, int lineback)
+static void name_set(void *obj, const wgChar *name, int lineforward, int lineback)
 {
        struct cui_gauge *t = (struct cui_gauge *) obj;
        t->name = name;
@@ -116,20 +124,20 @@ static void name_set(void *obj, const char *name, int lineforward, int lineback)
        t->lineback = lineback;
 }
 
-static void label_set(void *obj, const char *format, ...)
+static void label_set(void *obj, const wgChar *format, ...)
 {
        va_list list;
        const struct cui_gauge *t = (const struct cui_gauge *) obj;
 
        va_start(list, format);
        console_move(t->lineback);
-       printf("%s ", t->name);
-       vprintf(format, list);
+       PRINTF(wgT("%s "), t->name);
+       VPRINTF(format, list);
        console_move(t->lineforward);
        va_end(list);
 }
 
-void cui_gauge_new(struct gauge *t, const char *name, int lineforward, int lineback)
+void cui_gauge_new(struct gauge *t, const wgChar *name, int lineforward, int lineback)
 {
        t->bar =  Malloc(sizeof(struct cui_gauge));
        t->label = t->bar;
index 9c8cc6a..c47df25 100644 (file)
@@ -1,6 +1,6 @@
 #ifndef _CUI_GAUGE_H_
 #define _CUI_GAUGE_H_
 struct gauge;
-void cui_gauge_new(struct gauge *t, const char *name, int lineforward, int lineback);
+void cui_gauge_new(struct gauge *t, const wgChar *name, int lineforward, int lineback);
 void cui_gauge_destory(struct gauge *t);
 #endif
index 94322a3..4da009c 100644 (file)
@@ -9,19 +9,19 @@
 #include "squirrel_wrap.h"
 #include "flash_device.h"
 
-static void call(HSQUIRRELVM v, const char *devicename)
+static void call(HSQUIRRELVM v, const wgChar *devicename)
 {
        sq_pushroottable(v);
        sq_pushstring(v, _SC("flash_device_get"), -1);
        if(SQ_SUCCEEDED(sq_get(v,-2))){
                sq_pushroottable(v);
-               sq_pushstring(v, _SC(devicename), -1);
+               sq_pushstring(v, devicename, -1);
                sq_call(v, 2, SQTrue, SQTrue);
        }
 }
-static bool long_get(HSQUIRRELVM v, const char *field, long *ret)
+static bool long_get(HSQUIRRELVM v, const wgChar *field, long *ret)
 {
-       sq_pushstring(v, _SC(field), -1);
+       sq_pushstring(v, field, -1);
        SQRESULT r = sq_get(v, -2);
        if(r != SQ_OK){
                return false;
@@ -38,9 +38,9 @@ static bool long_get(HSQUIRRELVM v, const char *field, long *ret)
        sq_pop(v, 1);
        return true;
 }
-static bool bool_get(HSQUIRRELVM v, const char *field, bool *ret)
+static bool bool_get(HSQUIRRELVM v, const wgChar *field, bool *ret)
 {
-       sq_pushstring(v, _SC(field), -1);
+       sq_pushstring(v, field, -1);
        SQRESULT r = sq_get(v, -2);
        if(r != SQ_OK){
                return false;
@@ -61,11 +61,10 @@ static bool bool_get(HSQUIRRELVM v, const char *field, bool *ret)
        sq_pop(v, 1);
        return true;
 }
-bool flash_device_get(const char *name, struct flash_device *t)
+bool flash_device_get(const wgChar *name, struct flash_device *t)
 {
        HSQUIRRELVM v = qr_open(NULL); 
        if(SQ_FAILED(sqstd_dofile(v, _SC("flashdevice.nut"), SQFalse, SQTrue))){
-               puts("flash device script error");
                qr_close(v);
                return false;
        }
@@ -75,30 +74,30 @@ bool flash_device_get(const char *name, struct flash_device *t)
                goto field_error;
        }
        t->name = name;
-       if(long_get(v, "capacity", &t->capacity) == false){
+       if(long_get(v, _SC("capacity"), &t->capacity) == false){
                goto field_error;
        }
-       if(long_get(v, "pagesize", &t->pagesize) == false){
+       if(long_get(v, _SC("pagesize"), &t->pagesize) == false){
                goto field_error;
        }
-       if(long_get(v, "erase_wait", &t->erase_wait) == false){
+       if(long_get(v, _SC("erase_wait"), &t->erase_wait) == false){
                goto field_error;
        }
-       if(bool_get(v, "erase_require", &t->erase_require) == false){
+       if(bool_get(v, _SC("erase_require"), &t->erase_require) == false){
                goto field_error;
        }
-       if(bool_get(v, "retry", &t->retry) == false){
+       if(bool_get(v, _SC("retry"), &t->retry) == false){
                goto field_error;
        }
-       if(long_get(v, "command_mask", &t->command_mask) == false){
+       if(long_get(v, _SC("command_mask"), &t->command_mask) == false){
                goto field_error;
        }
        long dd;
-       if(long_get(v, "id_manufacurer", &dd) == false){
+       if(long_get(v, _SC("id_manufacurer"), &dd) == false){
                goto field_error;
        }
        t->id_manufacurer = dd;
-       if(long_get(v, "id_device", &dd) == false){
+       if(long_get(v, _SC("id_device"), &dd) == false){
                goto field_error;
        }
        t->id_device = dd;
@@ -107,7 +106,7 @@ bool flash_device_get(const char *name, struct flash_device *t)
        return true;
 
 field_error:
-       puts("script field error");
+//     puts("script field error");
        qr_close(v);
        return false;
 }
@@ -132,7 +131,7 @@ static int flash_device_number_get(HSQUIRRELVM v)
        return i;
 }
 
-static int flash_device_name_get(HSQUIRRELVM v, int index, const char **str)
+static int flash_device_name_get(HSQUIRRELVM v, int index, const wgChar **str)
 {
        sq_pushroottable(v);
        sq_pushstring(v, _SC("flash_device_name_get"), -1);
@@ -152,9 +151,14 @@ static int flash_device_name_get(HSQUIRRELVM v, int index, const char **str)
        return 1;
 }
 
+#ifdef _UNICODE
+  #define STRNCMP wcsncmp
+#else
+  #define STRNCMP strncmp
+#endif
 void flash_device_listup(struct flash_listup *t)
 {
-       const char *str;
+       const wgChar *str;
        HSQUIRRELVM v = qr_open(NULL);
        SQInteger top = sq_gettop(v);
 
@@ -170,7 +174,7 @@ void flash_device_listup(struct flash_listup *t)
 
        for(i = 0; i < device_num; i++){
                flash_device_name_get(v, i, &str);
-               if(strncmp(str, "dummy", 6) != 0){
+               if(STRNCMP(str, _SC("dummy"), 6) != 0){
                        t->append(t->obj_cpu, str);
                        t->append(t->obj_ppu, str);
                }
index 5861b9e..0c8b726 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef _FLASH_DEVICE_H_
 #define _FLASH_DEVICE_H_
 struct flash_device{
-       const char *name;
+       const wgChar *name;
        long capacity, pagesize;
        long erase_wait; //unit is msec
        bool erase_require, retry;
@@ -9,7 +9,7 @@ struct flash_device{
        long command_mask;
 };
 
-bool flash_device_get(const char *name, struct flash_device *t);
+bool flash_device_get(const wgChar *name, struct flash_device *t);
 //0x80 °Ê¹ß¤ÏËÜÅö¤Î¥Ç¥Ð¥¤¥¹½ÅÊ£¤·¤Ê¤¤¤È»×¤¦. Ã¯¤« JEDEC ¤Î¤È¤³¤ò¤·¤é¤Ù¤Æ.
 enum{
        FLASH_ID_DEVICE_SRAM = 0xf0, 
@@ -18,7 +18,7 @@ enum{
 //for GUI device listup
 struct flash_listup{
        void *obj_cpu, *obj_ppu;
-       void (*append)(void *obj, const char *str);
+       void (*append)(void *obj, const wgChar *str);
 };
 void flash_device_listup(struct flash_listup *t);
 #endif
index 0f381ae..7e2aa31 100644 (file)
@@ -14,12 +14,12 @@ SQInteger script_nop(HSQUIRRELVM v)
        return 0;
 }
 
-SQInteger range_check(HSQUIRRELVM v, const char *name, long target, const struct range *range)
+SQInteger range_check(HSQUIRRELVM v, const wgChar *name, long target, const struct range *range)
 {
        if((target < range->start) || (target > range->end)){
                SQPRINTFUNCTION f = sq_getprintfunc(v);
-               f(v, "%s range must be 0x%06x to 0x%06x", name, (int) range->start, (int) range->end);
-               return sq_throwerror(v, "script logical error");
+               f(v, wgT("%s range must be 0x%06x to 0x%06x"), name, (int) range->start, (int) range->end);
+               return sq_throwerror(v, wgT("script logical error"));
        }
        return 0;
 }
@@ -33,27 +33,27 @@ SQInteger cpu_write_check(HSQUIRRELVM v)
        if(SQ_FAILED(r)){
                return r;
        }
-       r = range_check(v, "address", address, &range_address);
+       r = range_check(v, wgT("address"), address, &range_address);
        if(SQ_FAILED(r)){
                return r;
        }
-       return range_check(v, "data", data, &range_data);
+       return range_check(v, wgT("data"), data, &range_data);
 }
 
 SQInteger script_require(HSQUIRRELVM v)
 {
        if(sq_gettop(v) != 2){
-               return sq_throwerror(v, "argument number error");
+               return sq_throwerror(v, wgT("argument number error"));
        }
        if(sq_gettype(v, 2) != OT_STRING){
-               return sq_throwerror(v, "argument type error");
+               return sq_throwerror(v, wgT("argument type error"));
        }
        const SQChar *file;
        if(SQ_FAILED(sq_getstring(v, 2, &file))){
-               return sq_throwerror(v, "require error");
+               return sq_throwerror(v, wgT("require error"));
        }
-       if(SQ_FAILED(sqstd_dofile(v, _SC(file), SQFalse, SQTrue))){
-               return sq_throwerror(v, "require error");
+       if(SQ_FAILED(sqstd_dofile(v, file, SQFalse, SQTrue))){
+               return sq_throwerror(v, wgT("require error"));
        }
        return 0;
 }
@@ -68,7 +68,7 @@ static bool connection_check_main(const struct reader_handle *h, const struct te
        for(i = 0; i < 3; i++){
                m->memory_read(h, &GAUGE_DUMMY, address, size, test_m);
                if(memcmp(test1, test_m, size) != 0){
-                       text->append(text->object, "maybe cartridge connection error\n");
+                       text->append(text->object, wgT("maybe cartridge connection error\n"));
                        return false;
                }
        }
index 3190c67..5039c44 100644 (file)
@@ -4,7 +4,7 @@ struct range{
        long start, end;
 };
 SQInteger script_nop(HSQUIRRELVM v);
-SQInteger range_check(HSQUIRRELVM v, const char *name, long target, const struct range *range);
+SQInteger range_check(HSQUIRRELVM v, const wgChar *name, long target, const struct range *range);
 SQInteger cpu_write_check(HSQUIRRELVM v);
 SQInteger script_require(HSQUIRRELVM v);
 
index e1a2dca..aab1ae5 100644 (file)
@@ -40,23 +40,35 @@ static void buffer_show(struct memory *t, long length)
 {
        int i;
        const uint8_t *buf = t->data + t->offset;
+#ifdef _UNICODE
+       wprintf(L"%s 0x%06x:", t->name, t->offset);
+#else
        printf("%s 0x%06x:", t->name, t->offset);
+#endif
        for(i = 0; i < 0x10; i++){
-               char dump[3+1];
+               wgChar dump[3+1];
+#ifdef _UNICODE
+               //wsprintf(dump, L"%02x", buf[i]);
+#else
                sprintf(dump, "%02x", buf[i]);
+#endif
                switch(i){
                case 7:
-                       dump[2] = '-';
+                       dump[2] = wgT('-');
                        break;
                case 0x0f:
-                       dump[2] = '\0';
+                       dump[2] = wgT('\0');
                        break;
                default:
-                       dump[2] = ' ';
+                       dump[2] = wgT(' ');
                        break;
                }
-               dump[3] = '\0';
+               dump[3] = wgT('\0');
+#ifdef _UNICODE
+               wprintf(L"%s", dump);
+#else
                printf("%s", dump);
+#endif
        }
        int sum = 0;
        while(length != 0){
@@ -64,7 +76,11 @@ static void buffer_show(struct memory *t, long length)
                buf++;
                length--;
        }
+#ifdef _UNICODE
+       wprintf(L":0x%06x\n", sum);
+#else
        printf(":0x%06x\n", sum);
+#endif
        fflush(stdout);
 }
 
@@ -217,16 +233,16 @@ static SQInteger length_check(HSQUIRRELVM v)
                cpu = false;
        }
        if(cpu == false){
-               d->log.append(d->log.object, "cpu_romsize is not connected 0x%06x/0x%06x\n", (int) d->cpu.read_count, (int) d->cpu.memory.size);
+               d->log.append(d->log.object, wgT("cpu_romsize is not connected 0x%06x/0x%06x\n"), (int) d->cpu.read_count, (int) d->cpu.memory.size);
        }
        if(d->ppu.memory.size != d->ppu.read_count){
                ppu = false;
        }
        if(ppu == false){
-               d->log.append(d->log.object, "ppu_romsize is not connected 0x%06x/0x%06x\n", (int) d->ppu.read_count, (int) d->ppu.memory.size);
+               d->log.append(d->log.object, wgT("ppu_romsize is not connected 0x%06x/0x%06x\n"), (int) d->ppu.read_count, (int) d->ppu.memory.size);
        }
        if(cpu == false || ppu == false){
-               r = sq_throwerror(v, "script logical error");
+               r = sq_throwerror(v, wgT("script logical error"));
        }
        return r;
 }
@@ -238,13 +254,13 @@ static SQInteger read_count(HSQUIRRELVM v, const struct textcontrol *l, struct d
        if(SQ_FAILED(r)){
                return r;
        }
-       r = range_check(v, "length", length, range_length);
+       r = range_check(v, wgT("length"), length, range_length);
        if(SQ_FAILED(r)){
                return r;
        }
        if((address < range_address->start) || ((address + length) > range_address->end)){
-               l->append(l->object, "address range must be 0x%06x to 0x%06x", (int) range_address->start, (int) range_address->end);
-               return sq_throwerror(v, "script logical error");;
+               l->append(l->object, wgT("address range must be 0x%06x to 0x%06x"), (int) range_address->start, (int) range_address->end);
+               return sq_throwerror(v, wgT("script logical error"));;
        }
        t->read_count += length;
        return 0;
@@ -289,14 +305,14 @@ static bool script_execute(HSQUIRRELVM v, struct dump_config *d)
 {
        bool ret = true;
        if(SQ_FAILED(sqstd_dofile(v, _SC("dumpcore.nut"), SQFalse, SQTrue))){
-               d->log.append(d->log.object, "dump core script error\n");
+               d->log.append(d->log.object, wgT("dump core script error\n"));
                ret = false;
-       }else if(SQ_FAILED(sqstd_dofile(v, _SC(d->script), SQFalse, SQTrue))){
-               d->log.append(d->log.object, "%s open error\n", d->script);
+       }else if(SQ_FAILED(sqstd_dofile(v, d->script, SQFalse, SQTrue))){
+               d->log.append(d->log.object, wgT("%s open error\n"), d->script);
                ret = false;
        }else{
                SQRESULT r = qr_call(
-                       v, "dump", (SQUserPointer) d, true, 
+                       v, wgT("dump"), (SQUserPointer) d, true, 
                        3, d->mappernum, d->cpu.increase, d->ppu.increase
                );
                if(SQ_FAILED(r)){
@@ -323,20 +339,20 @@ static void dump_memory_driver_init(struct dump_memory_driver *dd)
 void script_dump_execute(struct dump_config *d)
 {
        dump_memory_driver_init(&d->cpu);
-       d->cpu.memory.name = "Program";
+       d->cpu.memory.name = wgT("Program");
        
        dump_memory_driver_init(&d->ppu);
-       d->ppu.memory.name = "Charcter";
+       d->ppu.memory.name = wgT("Charcter");
        
        {
                HSQUIRRELVM v = qr_open(&d->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_size_set);
-               qr_function_register_global(v, "nesfile_save", length_check);
-               qr_function_register_global(v, "cpu_read", cpu_read_count);
-               qr_function_register_global(v, "ppu_read", ppu_read_count);
-               qr_function_register_global(v, "require", script_require);
+               qr_function_register_global(v, wgT("ppu_ramfind"), script_nop);
+               qr_function_register_global(v, wgT("cpu_write"), cpu_write_check);
+               qr_function_register_global(v, wgT("memory_new"), memory_size_set);
+               qr_function_register_global(v, wgT("nesfile_save"), length_check);
+               qr_function_register_global(v, wgT("cpu_read"), cpu_read_count);
+               qr_function_register_global(v, wgT("ppu_read"), ppu_read_count);
+               qr_function_register_global(v, wgT("require"), script_require);
                if(script_execute(v, d) == false){
                        qr_close(v);
                        return;
@@ -348,7 +364,7 @@ void script_dump_execute(struct dump_config *d)
        }*/
        d->handle = d->control->open(d->except);
        if(d->handle == NULL){
-               d->log.append(d->log.object, "reader open error\n");
+               d->log.append(d->log.object, wgT("reader open error\n"));
                return;
        }
        d->control->init(d->handle);
@@ -357,13 +373,13 @@ void script_dump_execute(struct dump_config *d)
        }
        {
                HSQUIRRELVM v = qr_open(&d->log); 
-               qr_function_register_global(v, "memory_new", memory_new);
-               qr_function_register_global(v, "nesfile_save", nesfile_save);
-               qr_function_register_global(v, "cpu_write", cpu_write);
-               qr_function_register_global(v, "cpu_read", cpu_read);
-               qr_function_register_global(v, "ppu_read", ppu_read);
-               qr_function_register_global(v, "ppu_ramfind", ppu_ramfind);
-               qr_function_register_global(v, "require", script_require);
+               qr_function_register_global(v, wgT("memory_new"), memory_new);
+               qr_function_register_global(v, wgT("nesfile_save"), nesfile_save);
+               qr_function_register_global(v, wgT("cpu_write"), cpu_write);
+               qr_function_register_global(v, wgT("cpu_read"), cpu_read);
+               qr_function_register_global(v, wgT("ppu_read"), ppu_read);
+               qr_function_register_global(v, wgT("ppu_ramfind"), ppu_ramfind);
+               qr_function_register_global(v, wgT("require"), script_require);
                script_execute(v, d);
                qr_close(v);
        }
index 545718f..8cdaad9 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef _SCRIPT_DUMP_H_
 #define _SCRIPT_DUMP_H_
 struct dump_config{
-       const char *script;
-       const char *target;
+       const wgChar *script;
+       const wgChar *target;
        const struct reader_handle *handle;
        const struct reader_control *control;
        struct dump_memory_driver{
@@ -15,7 +15,7 @@ struct dump_config{
        bool progress;
        bool battery;
        struct textcontrol log;
-       void (*except)(const char *str);
+       void (*except)(const wgChar *str);
 };
 void script_dump_execute(struct dump_config *c);
 #endif
index 40f6d16..ee4ce9b 100644 (file)
@@ -44,7 +44,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;
@@ -93,7 +93,7 @@ static SQInteger erase_set(HSQUIRRELVM v, const struct reader_handle *h, struct
        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;
 }
@@ -234,7 +234,7 @@ 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.label_set(t->gauge.label, wgT("skip"));
        }
 }
 
@@ -243,7 +243,7 @@ static bool program_memoryarea(HSQUIRRELVM co, const struct reader_handle *h, st
        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\n"), t->memory.name);
                                return false;
                        }
                }
@@ -259,7 +259,7 @@ static bool program_memoryarea(HSQUIRRELVM co, const struct reader_handle *h, st
 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 +268,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 +302,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,14 +337,14 @@ 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");
+               c->log.append(c->log.object, wgT("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);
+       }else if(SQ_FAILED(sqstd_dofile(v, c->script, SQFalse, SQTrue))){
+               c->log.append(c->log.object, wgT("%s open error\n"), c->script);
                ret = false;
        }else{
                SQRESULT r = qr_call(
@@ -364,24 +364,24 @@ static void 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;
                }
@@ -389,12 +389,12 @@ static void zendan(struct program_config *c)
                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);
+                       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;
                }
                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);
+                               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;
                        }
                }
@@ -406,17 +406,17 @@ 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);
        }
 }
@@ -435,7 +435,7 @@ 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;
@@ -446,17 +446,17 @@ void 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");
+               c->log.append(c->log.object, wgT("ROM image open error"));
                return;
        }
 //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;
        }
-       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;
@@ -464,7 +464,7 @@ void script_program_execute(struct program_config *c)
 //reader initalize
        c->handle = c->control->open(c->except);
        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;
        }
index d1c3197..cc5ccdb 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef _SCRIPT_PROGRAM_H_
 #define _SCRIPT_PROGRAM_H_
 struct program_config{
-       const char *script;
-       const char *target;
+       const wgChar *script;
+       const wgChar *target;
        const struct reader_handle *handle;
        const struct reader_control *control;
        struct flash_memory_driver{
@@ -19,7 +19,7 @@ struct program_config{
        long mappernum;
        bool compare, testrun;
        struct textcontrol log;
-       void (*except)(const char *str);
+       void (*except)(const wgChar *str);
 };
 void script_program_execute(struct program_config *c);
 #endif
index c0a66b3..632f9ca 100644 (file)
@@ -5,6 +5,7 @@
 #include <squirrel.h>
 #include <sqstdio.h>
 #include <sqstdaux.h>
+#include "type.h"
 #include "widget.h"
 
 #ifdef SQUNICODE 
@@ -46,7 +47,7 @@ HSQUIRRELVM qr_open(const struct textcontrol *p)
 }
 
 //SQInteger 
-void qr_function_register_global(HSQUIRRELVM v, const char *name, SQFUNCTION f)
+void qr_function_register_global(HSQUIRRELVM v, const SQChar *name, SQFUNCTION f)
 {
        sq_pushroottable(v);
        sq_pushstring(v, name, -1);
@@ -60,7 +61,7 @@ SQRESULT qr_call(HSQUIRRELVM v, const SQChar *functionname, SQUserPointer up, bo
        SQRESULT r = SQ_ERROR;
        SQInteger top = sq_gettop(v);
        sq_pushroottable(v);
-       sq_pushstring(v, _SC(functionname), -1);
+       sq_pushstring(v, functionname, -1);
        if(SQ_SUCCEEDED(sq_get(v,-2))){
                int i;
                va_list ap;
@@ -101,13 +102,13 @@ SQRESULT qr_argument_get(HSQUIRRELVM v, SQInteger num, ...)
 {
        va_list ap;
        if(sq_gettop(v) != (num + 2)){ //roottable, up, arguments...
-               return sq_throwerror(v, "argument number error");
+               return sq_throwerror(v, _SC("argument number error"));
        }
        va_start(ap, num);
        SQInteger i;
        for(i = 0; i < num; i++){
                if(long_get(v, i + 3, va_arg(ap, long *)) == false){
-                       return sq_throwerror(v, "argument type error");
+                       return sq_throwerror(v, _SC("argument type error"));
                }
        }
        return SQ_OK;
@@ -119,13 +120,13 @@ SQRESULT qr_userpointer_get(HSQUIRRELVM v, SQUserPointer *up)
        assert(sq_gettype(v, 2) == OT_USERPOINTER);
        r = sq_getuserpointer(v, 2, up);
        if(SQ_FAILED(r)){
-               return sq_throwerror(v, "1st argument must be d (userpointer)");
+               return sq_throwerror(v, _SC("1st argument must be d (userpointer)"));
        }
        return r;
 }
 
 void qr_version_print(const struct textcontrol *l)
 {
-       l->append(l->object, SQUIRREL_VERSION " ");
-       l->append(l->object, SQUIRREL_COPYRIGHT "\n");
+       l->append(l->object, SQUIRREL_VERSION _SC(" "));
+       l->append(l->object, SQUIRREL_COPYRIGHT _SC("\n"));
 }
index 98f8594..44ea69b 100644 (file)
@@ -2,7 +2,7 @@
 #define _SQUIRREL_WRAP_H_
 struct textcontrol;
 HSQUIRRELVM qr_open(struct textcontrol *p);
-void qr_function_register_global(HSQUIRRELVM v, const char *name, SQFUNCTION f);
+void qr_function_register_global(HSQUIRRELVM v, const wgChar *name, SQFUNCTION f);
 SQRESULT qr_call(HSQUIRRELVM v, const SQChar *functionname, SQUserPointer up, bool settop, int argnum, ...);
 void qr_close(HSQUIRRELVM v);
 SQRESULT qr_argument_get(HSQUIRRELVM v, SQInteger num, ...);
index 595e1c4..3663a0c 100644 (file)
@@ -1,28 +1,35 @@
 #include <stdio.h>
+#include "type.h"
 #include "memory_manage.h"
 #include "file.h"
 
-int buf_load(u8 *buf, const char *file, int size)
+#ifdef _UNICODE
+  #define FOPEN(name, mode) _wfopen(name, L##mode)
+#else
+  #define FOPEN(name, mode) _fopen(name, mode)
+#endif
+
+int buf_load(uint8_t *buf, const wgChar *file, int size)
 {
        FILE *fp;
 
-       fp = fopen(file, "rb");
+       fp = FOPEN(file, "rb");
        if(fp == NULL){
                return NG;
        }
        fseek(fp, 0, SEEK_SET);
-       fread(buf, sizeof(u8), size, fp);
+       fread(buf, sizeof(uint8_t), size, fp);
        fclose(fp);
        return OK;
 }
 
-void* buf_load_full(const char *file, int *size)
+void* buf_load_full(const wgChar *file, int *size)
 {
        FILE *fp;
-       u8 *buf;
+       uint8_t *buf;
 
        *size = 0;
-       fp = fopen(file, "rb");
+       fp = FOPEN(file, "rb");
        if(fp == NULL){
                return NULL;
        }
@@ -34,18 +41,18 @@ void* buf_load_full(const char *file, int *size)
        }
        fseek(fp, 0, SEEK_SET);
        buf = Malloc(*size);
-       fread(buf, sizeof(u8), *size, fp);
+       fread(buf, sizeof(uint8_t), *size, fp);
        fclose(fp);
        return buf;
 }
 
-void buf_save(const void *buf, const char *file, int size)
+void buf_save(const void *buf, const wgChar *file, int size)
 {
        FILE *fp;
 
-       fp = fopen(file, "wb");
+       fp = FOPEN(file, "wb");
        fseek(fp, 0, SEEK_SET);
-       fwrite(buf, sizeof(u8), size, fp);
+       fwrite(buf, sizeof(uint8_t), size, fp);
        fclose(fp);
 }
 
index f2384cf..f52bdaf 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef _FILE_H_
 #define _FILE_H_
 #include "type.h"
-int buf_load(u8 *buf, const char *file, int size);
-void* buf_load_full(const char *file, int *size);
-void buf_save(const void *buf, const char *file, int size);
+int buf_load(uint8_t *buf, const wgChar *file, int size);
+void* buf_load_full(const wgChar *file, int *size);
+void buf_save(const void *buf, const wgChar *file, int size);
 #endif
index 5b9a503..f904e12 100644 (file)
@@ -19,7 +19,7 @@ enum{
        PROGRAM_ROM_MIN = 0x4000,
        CHARCTER_ROM_MIN = 0x2000
 };
-static const u8 NES_HEADER_INIT[NES_HEADER_SIZE] = {
+static const uint8_t NES_HEADER_INIT[NES_HEADER_SIZE] = {
        'N', 'E', 'S', 0x1a, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0
 };
@@ -27,7 +27,7 @@ static const u8 NES_HEADER_INIT[NES_HEADER_SIZE] = {
 #ifndef HEADEROUT
 static 
 #endif
-void nesheader_set(const struct romimage *r, u8 *header)
+void nesheader_set(const struct romimage *r, uint8_t *header)
 {
        memcpy(header, NES_HEADER_INIT, NES_HEADER_SIZE);
        header[4] = r->cpu_rom.size / PROGRAM_ROM_MIN;
@@ -51,13 +51,13 @@ static int mirroring_fix(const struct textcontrol *l, struct memory *m, long min
 {
        long mirror_size = m->size / 2;
        while(mirror_size >= min){
-               const u8 *halfbuf;
+               const uint8_t *halfbuf;
                halfbuf = m->data;
                halfbuf += mirror_size;
                if(memcmp(m->data, halfbuf, mirror_size) != 0){
                        const long ret = mirror_size * 2;
                        if(m->size != ret){
-                               l->append(l->object, "mirroring %s ROM fixed\n", m->name);
+                               l->append(l->object, wgT("mirroring %s ROM fixed\n"), m->name);
                                m->size = ret;
                        }
                        return 0;
@@ -65,15 +65,15 @@ static int mirroring_fix(const struct textcontrol *l, struct memory *m, long min
                mirror_size /= 2;
        }
        
-       u8 *ffdata;
+       uint8_t *ffdata;
        int ret = 0;
        ffdata = Malloc(min);
        memset(ffdata, 0xff, min);
        if(memcmp(ffdata, m->data, min) == 0){
-               l->append(l->object, "error: data is all 0xff\n");
+               l->append(l->object, wgT("error: data is all 0xff\n"));
                ret = 1;
        }else if(m->size != min){
-               l->append(l->object, "mirroring %s ROM fixed\n", m->name);
+               l->append(l->object, wgT("mirroring %s ROM fixed\n"), m->name);
                m->size = min;
        }
        Free(ffdata);
@@ -86,13 +86,13 @@ static void rominfo_print(const struct textcontrol *l, const struct memory *m)
 {
        if(m->size != 0){
                const uint32_t crc = crc32_get(m->data, m->size);
-               l->append(l->object, "%s ROM: size 0x%06x, crc32 0x%08x\n", m->name, m->size, (const int) crc);
+               l->append(l->object, wgT("%s ROM: size 0x%06x, crc32 0x%08x\n"), m->name, m->size, (const int) crc);
        }else{
-               l->append(l->object, "%s RAM\n", m->name);
+               l->append(l->object, wgT("%s RAM\n"), m->name);
        }
 }
 
-void nesfile_create(const struct textcontrol *l, struct romimage *r, const char *romfilename)
+void nesfile_create(const struct textcontrol *l, struct romimage *r, const wgChar *romfilename)
 {
        int error = 0;
        //RAM adapter bios size 0x2000 ¤ÏÊѹ¹¤·¤Ê¤¤
@@ -106,22 +106,26 @@ void nesfile_create(const struct textcontrol *l, struct romimage *r, const char
                return;
        }
        //½¤ÀµºÑ¤ß ROM ¾ðÊóɽ¼¨
-       l->append(l->object, "%s, mapper %d\n", romfilename, (int) r->mappernum);
+       l->append(l->object, wgT("%s, mapper %d\n"), romfilename, (int) r->mappernum);
        rominfo_print(l, &(r->cpu_rom));
        rominfo_print(l, &(r->ppu_rom));
 
        FILE *f;
-       u8 header[NES_HEADER_SIZE];
+       uint8_t header[NES_HEADER_SIZE];
        nesheader_set(r, header);
+#ifdef _UNICODE
+       f = _wfopen(romfilename, L"wb");
+#else
        f = fopen(romfilename, "wb");
+#endif
        fseek(f, 0, SEEK_SET);
        //RAM adapter bios ¤Ë¤Ï NES ¥Ø¥Ã¥À¤òºî¤é¤Ê¤¤
        if(r->cpu_rom.size >= PROGRAM_ROM_MIN){ 
-               fwrite(header, sizeof(u8), NES_HEADER_SIZE, f);
+               fwrite(header, sizeof(uint8_t), NES_HEADER_SIZE, f);
        }
-       fwrite(r->cpu_rom.data, sizeof(u8), r->cpu_rom.size, f);
+       fwrite(r->cpu_rom.data, sizeof(uint8_t), r->cpu_rom.size, f);
        if(r->ppu_rom.size != 0){
-               fwrite(r->ppu_rom.data, sizeof(u8), r->ppu_rom.size, f);
+               fwrite(r->ppu_rom.data, sizeof(uint8_t), r->ppu_rom.size, f);
        }
        fclose(f);
 }
@@ -164,7 +168,7 @@ void nesbuffer_free(struct romimage *r, int mode)
        }
 }
 
-void backupram_create(const struct memory *r, const char *ramfilename)
+void backupram_create(const struct memory *r, const wgChar *ramfilename)
 {
        buf_save(r->data, ramfilename, r->size);
 }
@@ -209,9 +213,9 @@ int memorysize_check(const long size, int region)
 romimage ¤¬ bank ¤ÎÄêµÁÃͤè¤ê¾®¤µ¤¤¾ì¹ç¤Ï romarea ¤ÎËöÈø¤ËÄ¥¤ë¡£ 
 Æ±¤¸¥Ç¡¼¥¿¤ò memcpy ¤·¤¿¤Û¤¦¤¬°ÂÁ´¤À¤¬¡¢¤È¤ê¤¢¤¨¤º¤Ç¡£
 */
-static void nesfile_datapointer_set(const u8 *buf, struct memory *m, long size)
+static void nesfile_datapointer_set(const uint8_t *buf, struct memory *m, long size)
 {
-       u8 *data;
+       uint8_t *data;
        assert((size % CHARCTER_ROM_MIN) == 0);
        assert((m->size % CHARCTER_ROM_MIN) == 0);
        data = Malloc(size);
@@ -227,10 +231,10 @@ static void nesfile_datapointer_set(const u8 *buf, struct memory *m, long size)
 }
 
 //flashmemory device capacity check ¤¬È´¤±¤Æ¤ë¤±¤É¤É¤³¤Ç¤ä¤ë¤«Ì¤Äê
-bool nesfile_load(const struct textcontrol *l, const char *file, struct romimage *r)
+bool nesfile_load(const struct textcontrol *l, const wgChar *file, struct romimage *r)
 {
        int imagesize;
-       u8 *buf;
+       uint8_t *buf;
        
        buf = buf_load_full(file, &imagesize);
        if(buf == NULL || imagesize < (NES_HEADER_SIZE + PROGRAM_ROM_MIN)){
@@ -239,7 +243,7 @@ bool nesfile_load(const struct textcontrol *l, const char *file, struct romimage
        }
        //nes header check
        if(memcmp(buf, NES_HEADER_INIT, 4) != 0){
-               l->append(l->object, "NES header identify error\n");
+               l->append(l->object, wgT("NES header identify error\n"));
                Free(buf);
                return false;
        }
@@ -269,7 +273,7 @@ bool nesfile_load(const struct textcontrol *l, const char *file, struct romimage
                r->ppu_rom.size = ppusize;
                //NESfilesize
                if(offset != imagesize){
-                       l->append(l->object, "NES header filesize error\n");
+                       l->append(l->object, wgT("NES header filesize error\n"));
                        Free(buf);
                        return false;
                }
@@ -278,7 +282,7 @@ bool nesfile_load(const struct textcontrol *l, const char *file, struct romimage
        image pointer set/ memcpy
        */
        {
-               u8 *d;
+               uint8_t *d;
                d = buf;
                d += NES_HEADER_SIZE;
                nesfile_datapointer_set(d, &r->cpu_rom, cpusize);
index 10a91bb..99745e0 100644 (file)
@@ -1,9 +1,5 @@
 #ifndef _HEADER_H_
 #define _HEADER_H_
-#if ANAGO==0
-#include "flashmemory.h"
-#endif
-
 enum trastype{
        TRANSTYPE_EMPTY,
        TRANSTYPE_TOP,
@@ -14,7 +10,7 @@ enum memory_attribute{
        MEMORY_ATTR_READ, MEMORY_ATTR_WRITE, MEMORY_ATTR_NOTUSE
 };
 struct memory{
-       const char *name;
+       const wgChar *name;
        int size, offset;
        enum memory_attribute attribute;
        enum trastype transtype;
@@ -46,9 +42,6 @@ enum vram_mirroring{
 };
 struct romimage{
        struct memory cpu_rom, ppu_rom, cpu_ram;
-#if ANAGO==0
-       struct flash_order cpu_flash, ppu_flash;
-#endif
        long mappernum;
        enum vram_mirroring mirror;
        int backupram;
@@ -61,9 +54,9 @@ enum{
 void nesheader_set(const struct romimage *r, uint8_t *header);
 #endif
 bool nesbuffer_malloc(struct romimage *r, int mode);
-void nesfile_create(const struct textcontrol *l, struct romimage *r, const char *romfilename);
+void nesfile_create(const struct textcontrol *l, struct romimage *r, const wgChar *romfilename);
 void nesbuffer_free(struct romimage *r, int mode);
-void backupram_create(const struct memory *r, const char *ramfilename);
+void backupram_create(const struct memory *r, const wgChar *ramfilename);
 int memorysize_check(const long size, int region);
-bool nesfile_load(const struct textcontrol *l, const char *file, struct romimage *r);
+bool nesfile_load(const struct textcontrol *l, const wgChar *file, struct romimage *r);
 #endif
index 247d6b7..c2233c8 100644 (file)
@@ -4,6 +4,7 @@
 #include <usb.h>
 #include <kazzo_request.h>
 #include <kazzo_task.h>
+#include "type.h"
 #include "memory_manage.h"
 #include "reader_master.h"
 #include "usb_device.h"
@@ -31,10 +32,10 @@ static inline usb_dev_handle *device_open(void)
 
 struct reader_handle{
        usb_dev_handle *handle;
-       void (*except)(const char *str);
+       void (*except)(const wgChar *str);
 };
 
-static const struct reader_handle *kazzo_open(void (*except)(const char *str))
+static const struct reader_handle *kazzo_open(void (*except)(const wgChar *str))
 {
        struct reader_handle *h;
        usb_dev_handle *usb = device_open();
@@ -52,6 +53,20 @@ static void kazzo_close(const struct reader_handle *h)
        usb_close(h->handle);
        Free((void *) h);
 }
+
+static void throw(const struct reader_handle *h)
+{
+#ifdef _UNICODE
+               size_t length = strlen(usb_strerror());
+               wchar_t *mm = Malloc(sizeof(wchar_t) * (length + 1));
+               mbstowcs(mm, usb_strerror(), length + 1);
+               h->except(mm);
+               Free(mm);
+#else
+               h->except(usb_strerror());
+#endif
+}
+
 enum{
        TIMEOUT = 4000
 };
@@ -65,7 +80,7 @@ static void device_read(const struct reader_handle *h, enum request r, enum inde
                index, (char *) data, length, TIMEOUT
        );
        if(cnt != length){
-               h->except(usb_strerror());
+               throw(h);
 //             puts(__FUNCTION__);
 //             puts(usb_strerror());
 //             exit(1);
@@ -119,10 +134,10 @@ static void device_write(const struct reader_handle *h, enum request w, enum ind
                index, (char *) d, length, TIMEOUT
        );
        if(cnt != length){
+               throw(h);
 //             puts(__FUNCTION__);
 //             puts(usb_strerror());
 //             exit(1);
-               h->except(usb_strerror());
        }
        Free(d);
 }
@@ -309,7 +324,7 @@ const struct reader_driver DRIVER_KAZZO = {
                .flash_program = kazzo_ppu_flash_program,
                .flash_device_get = kazzo_ppu_flash_device_get
        }, .control  = {
-               .name = "kazzo",
+               .name = wgT("kazzo"),
                .open = kazzo_open, .close = kazzo_close,
                .init = kazzo_init,
                .flash_status = kazzo_flash_status,
index 2e97ce6..a149628 100644 (file)
@@ -20,8 +20,8 @@ struct reader_memory_access{
        void (*flash_device_get)(const struct reader_handle *h, uint8_t s[2]);
 };
 struct reader_control{
-       const char *name;
-       const struct reader_handle *(*open)(void (*except)(const char *str));
+       const wgChar *name;
+       const struct reader_handle *(*open)(void (*except)(const wgChar *str));
        void (*close)(const struct reader_handle *h);
        void (*init)(const struct reader_handle *h);
        void (*flash_status)(const struct reader_handle *h, uint8_t s[2]);
index 57678cd..7243298 100644 (file)
@@ -1,9 +1,19 @@
 #ifndef _TYPE_H_
 #define _TYPE_H_
 #include <stdint.h>
-#include <stdbool.h>
-typedef uint8_t u8;
+#ifndef __cplusplus 
+  #include <stdbool.h>
+#endif
+
 enum{
        OK = 0, NG
 };
+#ifdef _UNICODE
+  #include <wchar.h>
+  typedef wchar_t wgChar;
+  #define wgT(x) L##x
+#else
+  typedef char wgChar;
+  #define wgT(x) x
+#endif
 #endif
index cdbad58..74bb441 100644 (file)
@@ -1,4 +1,5 @@
 #include <stddef.h>
+#include "type.h"
 #include "widget.h"
 
 static void gauge_range_nothing(void *a, int b)
@@ -7,7 +8,7 @@ static void gauge_range_nothing(void *a, int b)
 static void gauge_value_nothing(void *a, void *b, int c)
 {
 }
-static void label_nothing(void *a, const char *str, ...)
+static void label_nothing(void *a, const wgChar *str, ...)
 {
 }
 const struct gauge GAUGE_DUMMY = {
index 0ec23b8..f6c9c59 100644 (file)
@@ -11,12 +11,12 @@ struct gauge{
        void (*range_set)(void *, int range);
        void (*value_set)(void *, void *, int value);
        void (*value_add)(void *, void *, int value);
-       void (*label_set)(void *, const char *str, ...);
+       void (*label_set)(void *, const wgChar *str, ...);
 };
 struct textcontrol{
        void *object;
-       void (*append)(void *, const char *, ...);
-       void (*append_va)(void *, const char *, va_list);
+       void (*append)(void *, const wgChar *, ...);
+       void (*append_va)(void *, const wgChar *, va_list);
 };
 extern const struct gauge GAUGE_DUMMY;
 #endif