OSDN Git Service

dump, workram, program script を統合, cpu_write の引数に配列も対応
authornaruko <naruko@24ea1065-a21e-4ca1-99c9-f5125deb0858>
Tue, 16 Nov 2010 04:42:12 +0000 (04:42 +0000)
committernaruko <naruko@24ea1065-a21e-4ca1-99c9-f5125deb0858>
Tue, 16 Nov 2010 04:42:12 +0000 (04:42 +0000)
git-svn-id: svn+ssh://svn.osdn.net/svnroot/unagi@390 24ea1065-a21e-4ca1-99c9-f5125deb0858

12 files changed:
client/trunk/anago/anago.mk
client/trunk/anago/anago_cui.c
client/trunk/anago/anago_frame.cpp
client/trunk/anago/dumpcore.nut
client/trunk/anago/programcore.nut
client/trunk/anago/reader_dummy.c
client/trunk/anago/script_common.c
client/trunk/anago/script_common.h
client/trunk/anago/script_dump.c
client/trunk/anago/script_program.c
client/trunk/anago/squirrel_wrap.c
client/trunk/anago/squirrel_wrap.h

index 2237b27..9704262 100644 (file)
@@ -36,7 +36,7 @@ else
 endif
 
 $(APP_GUI): $(OBJ_GUI) 
-       g++ -o $@ $(LDFLAG) $(OBJ_GUI) `$(WX_CONFIG) --libs core,adv` -lusb -lsqstdlib -lsquirrel
+       g++ -o $@ $(LDFLAG) $(OBJ_GUI) `$(WX_CONFIG) --libs core,adv,xml` -lusb -lsqstdlib -lsquirrel
 $(APP_CUI): $(OBJ_CUI) 
        g++ -o $@ $(LDFLAG) $(OBJ_CUI) -lusb -lsqstdlib -lsquirrel
 clean:
index eb82d03..84239e3 100644 (file)
@@ -10,6 +10,7 @@
 #include "romimage.h"
 #include "reader_master.h"
 #include "reader_kazzo.h"
+#include "reader_dummy.h"
 #include "script_dump.h"
 #include "flash_device.h"
 #include "script_program.h"
@@ -152,7 +153,7 @@ static void dump(int c, wgChar **v, const struct reader_driver *r)
        config.ppu.increase = 1;
        config.progress = true;
        switch(v[1][0]){
-       case wgT('d'):
+       case wgT('d'): case wgT('z'):
                config.mode = MODE_ROM_DUMP;
                break;
        case wgT('D'):
@@ -222,12 +223,16 @@ static void usage(const wgChar *v)
 {
        PUTS(wgT("famicom bus simluator 'anago'"));
        PRINTF(wgT("%s [mode] [script] [target] ....\n"), v);
+       PUTS(wgT("d - ROM dump with kazzo"));
+       PUTS(wgT("f - flash program with kazzo"));
+       PUTS(wgT("r - workram read with kazzo"));
+       PUTS(wgT("w - workram write with kazzo"));
+       PUTS(wgT("z - ROM dump for test"));
+       PUTS(wgT("x - flash program for test"));
+       PUTS(wgT("R - workram read for test"));
+       PUTS(wgT("W - workram write for test"));
 }
 
-#if DEBUG==1
-extern const struct reader_driver DRIVER_DUMMY;
-#endif
-
 #ifdef WIN32
 int main(int c, char **vv)
 #else
@@ -248,17 +253,13 @@ int anago_cui(int c, wgChar **v)
                }
 #endif
                switch(v[1][0]){
-#if DEBUG==1
                case wgT('x'):
                        r = &DRIVER_DUMMY; //though down
-#endif
                case wgT('f'): case wgT('F'):
                        program(c, v, r);
                        break;
-#if DEBUG==1
                case wgT('z'): case wgT('R'): case wgT('W'): 
                        r = &DRIVER_DUMMY; //though down
-#endif
                case wgT('d'): case wgT('D'):
                case wgT('r'): case wgT('w'):
                        dump(c,v, r);
index 9ea5082..d713f96 100644 (file)
@@ -126,10 +126,6 @@ static void choice_append(void *choice, const wxChar *str)
 }
 
 //---- script execute thread ----
-class anago_frame;
-//class anago_panel_dump;
-class anago_panel_program;
-
 class anago_dumper : public wxThread
 {
 private:
@@ -143,7 +139,7 @@ protected:
        void *Entry(void)
        {
                try{
-                       bool r;
+                       bool r = false;
                        switch(m_config.mode){
                        case MODE_ROM_DUMP:
                                r = script_dump_execute(&m_config);
@@ -256,13 +252,13 @@ static void script_choice_init(wxControlWithItems *c, wxArrayString filespec, wx
                c->Select(0);
        }
 }
-
+/*
 static void script_choice_init(wxControlWithItems *c, wxString filespec, wxTextCtrl *log)
 {
        wxArrayString spec;
        spec.Add(filespec);
        script_choice_init(c, spec, log);
-}
+}*/
 
 static void gauge_init(struct gauge *t)
 {
@@ -419,6 +415,8 @@ public:
                wxArrayString ar;
                ar.Add(wxT("*.ad"));
                ar.Add(wxT("*.ae"));
+               ar.Add(wxT("*.af"));
+               ar.Add(wxT("*.ag"));
                script_choice_init(m_script_choice, ar, log);
                this->increase_init(m_cpu_increase);
                m_cpu_increase->Append(wxT("Auto"));
@@ -604,7 +602,12 @@ public:
        {
                config->Read(wxT("program.sound.success"), &m_sound_success, wxT("cuckoo.wav"));
                config->Read(wxT("program.sound.fail"), &m_sound_fail, wxT("doggrowl.wav"));
-               script_choice_init(m_script_choice, wxT("*.af"), m_log);
+               {
+                       wxArrayString t;
+                       t.Add(wxT("*.af"));
+                       t.Add(wxT("*.ag"));
+                       script_choice_init(m_script_choice, t, m_log);
+               }
                {
                        struct flash_listup list;
                        list.obj_cpu = m_cpu_device;
@@ -753,8 +756,11 @@ public:
                config->Read(wxT("workram.sound.success"), &m_sound_success, wxT("tinkalink2.wav"));
                config->Read(wxT("workram.sound.fail"), &m_sound_fail, wxT("doggrowl.wav"));
 
-               script_choice_init(m_read_script, wxT("*.ae"), log);
-               script_choice_init(m_write_script, wxT("*.ae"), log);
+               wxArrayString ar;
+               ar.Add(wxT("*.ae"));
+               ar.Add(wxT("*.ag"));
+               script_choice_init(m_read_script, ar, log);
+               script_choice_init(m_write_script, ar, log);
                
                if(DEBUG == 1){
                        m_read_picker->GetTextCtrl()->SetLabel(wxT("t.sav"));
index ec3df38..eec4c6b 100644 (file)
@@ -52,6 +52,6 @@ function workram_rw(d, script, increase_cpu)
        dofile(script);
        local cpu_dumpsize = dumpsize_get(board.cpu_ram, increase_cpu);
        memory_new(d, cpu_dumpsize, 0);
-       cpu_ram_access(d, cpu_dumpsize / board.cpu_ram.banksize, cpu_dumpsize);
+       cpu_ram_access(d, cpu_dumpsize / board.cpu_ram.banksize, board.cpu_ram.banksize);
        memory_finalize(d);
 }
index f6d49b0..afff593 100644 (file)
@@ -1,19 +1,18 @@
-mega <- 0x20000;
 function loopsize_get(t, trans, image_size, device_size)
 {
        local trans_full = 3, trans_top = 1, trans_bottom = 2; //header.h enum transtype
        local loop = {start = 0, end = 0};
        switch(trans){
        case trans_full:{
-               local size = device_size < t.maxsize ? device_size : t.maxsize;
+               local size = device_size < t.size_max ? device_size : t.size_max;
                loop.end = size / t.banksize;
                }break;
        case trans_top:
                loop.end = image_size / t.banksize;
                break;
        case trans_bottom:
-               loop.start = (t.maxsize - image_size) / t.banksize;
-               loop.end = t.maxsize / t.banksize;
+               loop.start = (t.size_max - image_size) / t.banksize;
+               loop.end = t.size_max / t.banksize;
                break;
        default:
                loop.start = 0;
@@ -29,23 +28,25 @@ function testrun(
        ppu_trans, ppu_image_size, ppu_device_size
 )
 {
+       const mega = 0x20000;
        local trans_empty = 0;
        dofile(script);
+
        if((board.mappernum != mapper) && (mapper != 0)){
                print("mapper number are not connected\n");
-               print("af:" + board.mappernum + " image:" + mapper + "\n");
+               print("script:" + board.mappernum + " image:" + mapper + "\n");
        }
-       local cpu_loop = loopsize_get(board.cpu, cpu_trans, cpu_image_size, cpu_device_size);
-       local ppu_loop = loopsize_get(board.ppu, ppu_trans, ppu_image_size, ppu_device_size);
+       local cpu_loop = loopsize_get(board.cpu_rom, cpu_trans, cpu_image_size, cpu_device_size);
+       local ppu_loop = loopsize_get(board.ppu_rom, ppu_trans, ppu_image_size, ppu_device_size);
        if(board.vram_mirrorfind == true){
                vram_mirrorfind(d);
        }
-       initalize(d, board.cpu.banksize, board.ppu.banksize);
+       program_initalize(d, board.cpu_rom.banksize, board.ppu_rom.banksize);
        if(cpu_trans != trans_empty){
-               cpu_transfer(d, cpu_loop.start, cpu_loop.end, board.cpu.banksize);
+               cpu_transfer(d, cpu_loop.start, cpu_loop.end, board.cpu_rom.banksize);
        }
        if(ppu_trans != trans_empty){
-               ppu_transfer(d, ppu_loop.start, ppu_loop.end, board.ppu.banksize);
+               ppu_transfer(d, ppu_loop.start, ppu_loop.end, board.ppu_rom.banksize);
        }
 }
 
@@ -55,16 +56,18 @@ function program(
        ppu_trans, ppu_image_size, ppu_device_size
 )
 {
+       const mega = 0x20000;
        local trans_empty = 0;
        dofile(script);
+
        if((board.mappernum != mapper) && (mapper != 0)){
                return;
        }
-       local cpu_loop = loopsize_get(board.cpu, cpu_trans, cpu_image_size, cpu_device_size);
-       local ppu_loop = loopsize_get(board.ppu, ppu_trans, ppu_image_size, ppu_device_size);
+       local cpu_loop = loopsize_get(board.cpu_rom, cpu_trans, cpu_image_size, cpu_device_size);
+       local ppu_loop = loopsize_get(board.ppu_rom, ppu_trans, ppu_image_size, ppu_device_size);
        local co_cpu = newthread(cpu_transfer);
        local co_ppu = newthread(ppu_transfer);
-       initalize(d, board.cpu.banksize, board.ppu.banksize);
+       program_initalize(d, board.cpu_rom.banksize, board.ppu_rom.banksize);
        if(cpu_trans != trans_empty){
                cpu_erase(d);
        }
@@ -73,10 +76,10 @@ function program(
        }
        erase_wait(d);
        if(cpu_trans != trans_empty){
-               co_cpu.call(d, cpu_loop.start, cpu_loop.end, board.cpu.banksize);
+               co_cpu.call(d, cpu_loop.start, cpu_loop.end, board.cpu_rom.banksize);
        }
        if(ppu_trans != trans_empty){
-               co_ppu.call(d, ppu_loop.start, ppu_loop.end, board.ppu.banksize);
+               co_ppu.call(d, ppu_loop.start, ppu_loop.end, board.ppu_rom.banksize);
        }
        program_main(d, co_cpu, co_ppu)
 }
index 64c0284..9e7c90d 100644 (file)
@@ -58,15 +58,20 @@ static void dummy_init(const struct reader_handle *h)
 
 static void dummy_cpu_write(const struct reader_handle *h, long address, long length, const uint8_t *data)
 {
-       if(length == 1){
-               h->log->append(h->log->object, wgT(" cpu_write $%04x <- $%02x\n"), (int) address, *data);
+       if(length <= 8){
+               long i;
+               for(i = 0; i < length; i++){
+                       h->log->append(h->log->object, wgT(" cpu_write $%04x <- $%02x\n"), (int) address, *data);
+                       address++;
+                       data++;
+               }
        }
-       Sleep(4);
+       wait(4);
 }
 
 static void dummy_write(const struct reader_handle *h, long address, long length, const uint8_t *data)
 {
-       Sleep(4);
+       wait(4);
 }
 
 static void dummy_flash_config(const struct reader_handle *h, long c000x, long c2aaa, long c5555, long unit, bool retry)
index b8f0abb..738434a 100644 (file)
@@ -4,6 +4,7 @@
 #include <sqstdio.h>
 #include <sqstdaux.h>
 #include "type.h"
+#include "memory_manage.h"
 #include "squirrel_wrap.h"
 #include "reader_master.h"
 #include "widget.h"
@@ -28,16 +29,92 @@ SQInteger cpu_write_check(HSQUIRRELVM v)
 {
        static const struct range range_address = {0x4000, 0x10000};
        static const struct range range_data = {0x0, 0xff};
-       long address, data;
-       SQRESULT r = qr_argument_get(v, 2, &address, &data);
-       if(SQ_FAILED(r)){
-               return r;
+       const SQInteger data_index = 4;
+       long address;
+       switch(sq_gettype(v, data_index)){
+       case OT_INTEGER:{
+               long data;
+               SQRESULT r = qr_argument_get(v, 2, &address, &data);
+               if(SQ_FAILED(r)){
+                       return r;
+               }
+               r = range_check(v, wgT("address"), address, &range_address);
+               if(SQ_FAILED(r)){
+                       return r;
+               }
+               return range_check(v, wgT("data"), data, &range_data);}
+       case OT_ARRAY:{
+               SQInteger i;
+               if(qr_long_get(v, 3, &address) == false){
+                       return sq_throwerror(v, _SC("argument number error"));
+               }
+               for(i = 0; i < sq_getsize(v, data_index); i++){
+                       long data;
+                       SQRESULT r = range_check(v, wgT("address"), address, &range_address);
+                       if(SQ_FAILED(r)){
+                               return r;
+                       }
+                       sq_pushinteger(v, i);
+                       if(SQ_FAILED(sq_get(v, -2))){
+                               return r;
+                       }
+                       if(qr_long_get(v, -1, &data) == false){
+                               return sq_throwerror(v, wgT("script type error"));
+                       }
+                       sq_pop(v, 1);
+                       r = range_check(v, wgT("data"), data, &range_data);
+                       if(SQ_FAILED(r)){
+                               return r;
+                       }
+                       address++;
+               }
+               return 0;}
+       default:
+               return sq_throwerror(v, wgT("script type error"));
        }
-       r = range_check(v, wgT("address"), address, &range_address);
-       if(SQ_FAILED(r)){
-               return r;
+       return 0;
+}
+
+void cpu_write_execute(HSQUIRRELVM v, const struct reader_handle *h, const struct reader_memory_access *t)
+{
+       const SQInteger data_index = 4;
+       long address;
+       switch(sq_gettype(v, data_index)){
+       case OT_INTEGER:{
+               long data;
+               uint8_t d8;
+               SQRESULT r = qr_argument_get(v, 2, &address, &data);
+               assert(r == SQ_OK);
+               d8 = (uint8_t) (data & 0xff);
+               t->memory_write(h, address, 1, &d8);
+               }break;
+       case OT_ARRAY:{
+               long i;
+               bool rr = qr_long_get(v, 3, &address);
+               assert(rr == true);
+               
+               const long size = (long) sq_getsize(v, data_index);
+               uint8_t *const d8 = Malloc(size * sizeof(uint8_t));
+               
+               for(i = 0; i < size; i++){
+                       long data;
+                       SQRESULT r;
+                       sq_pushinteger(v, i);
+                       r = sq_get(v, -2);
+                       assert(r == SQ_OK);
+                       rr = qr_long_get(v, -1, &data);
+                       assert(rr = true);
+                       sq_pop(v, 1);
+                       d8[i] = (uint8_t) (data & 0xff);
+               }
+               t->memory_write(h, address, size, d8);
+               Free(d8);
+               }break;
+       default:
+               assert(0);
+               break;
        }
-       return range_check(v, wgT("data"), data, &range_data);
+       return;
 }
 
 static bool connection_check_main(const struct reader_handle *h, const struct textcontrol *text, const struct reader_memory_access *m, long address)
index 38e1ef0..8bf4957 100644 (file)
@@ -6,6 +6,7 @@ struct range{
 SQInteger script_nop(HSQUIRRELVM v);
 SQInteger range_check(HSQUIRRELVM v, const wgChar *name, long target, const struct range *range);
 SQInteger cpu_write_check(HSQUIRRELVM v);
+void cpu_write_execute(HSQUIRRELVM v, const struct reader_handle *h, const struct reader_memory_access *t);
 
 struct reader_handle;
 struct reader_memory_access;
index d113d36..079b732 100644 (file)
 #include "script_common.h"
 #include "script_dump.h"
 
-static SQInteger cpu_write_1byte(HSQUIRRELVM v)
+static SQInteger cpu_write(HSQUIRRELVM v)
 {
        struct dump_config *d;
-       long address, data;
 
        SQRESULT r =  qr_userpointer_get(v, (SQUserPointer) &d);
        if(SQ_FAILED(r)){
                return r;
        }
-       r = qr_argument_get(v, 2, &address, &data);
-       if(SQ_FAILED(r)){
-               return r;
-       }
-       uint8_t d8 = (uint8_t) data;
-       d->cpu.access->memory_write(d->handle, address, 1, &d8);
+       cpu_write_execute(v, d->handle, d->cpu.access);
        return 0;
 }
 
@@ -375,7 +369,7 @@ bool script_dump_execute(struct dump_config *d)
                HSQUIRRELVM v = qr_open(&d->log); 
                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_1byte);
+               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);
@@ -520,7 +514,7 @@ bool script_workram_execute(struct dump_config *d)
        }
        {
                HSQUIRRELVM v = qr_open(&d->log); 
-               qr_function_register_global(v, wgT("cpu_write"), cpu_write_1byte);
+               qr_function_register_global(v, wgT("cpu_write"), cpu_write);
                switch(d->mode){
                case MODE_RAM_READ:
                        qr_function_register_global(v, wgT("memory_new"), script_nop);
index a6c680b..0f45377 100644 (file)
@@ -66,17 +66,7 @@ static SQInteger ppu_command(HSQUIRRELVM v)
        }
        return command_set(v, &d->ppu);
 }
-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);
-       if(SQ_FAILED(r)){
-               return r;
-       }
-       uint8_t d8 = (uint8_t) data;
-       t->access->memory_write(h, address, 1, &d8);
-       return 0;
-}
+
 static SQInteger cpu_write(HSQUIRRELVM v)
 {
        struct program_config *d;
@@ -84,8 +74,10 @@ static SQInteger cpu_write(HSQUIRRELVM v)
        if(SQ_FAILED(r)){
                return r;
        }
-       return write_memory(v, d->handle, &d->cpu);
+       cpu_write_execute(v, d->handle, d->cpu.access);
+       return 0;
 }
+
 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);
index 751fb1d..bfe72c0 100644 (file)
@@ -86,7 +86,7 @@ void qr_close(HSQUIRRELVM v)
        sq_close(v); 
 }
 
-static bool long_get(HSQUIRRELVM v, SQInteger index, long *d)
+bool qr_long_get(HSQUIRRELVM v, SQInteger index, long *d)
 {
        if(sq_gettype(v, index) != OT_INTEGER){
                return false;
@@ -108,7 +108,7 @@ SQRESULT qr_argument_get(HSQUIRRELVM v, SQInteger num, ...)
        va_start(ap, num);
        SQInteger i;
        for(i = 0; i < num; i++){
-               if(long_get(v, i + 3, va_arg(ap, long *)) == false){
+               if(qr_long_get(v, i + 3, va_arg(ap, long *)) == false){
                        return sq_throwerror(v, _SC("argument type error"));
                }
        }
index cbf3ba0..7c47a4a 100644 (file)
@@ -3,6 +3,7 @@
 struct textcontrol;
 HSQUIRRELVM qr_open(struct textcontrol *p);
 void qr_function_register_global(HSQUIRRELVM v, const wgChar *name, SQFUNCTION f);
+bool qr_long_get(HSQUIRRELVM v, SQInteger index, long *d);
 SQRESULT qr_call(HSQUIRRELVM v, const SQChar *functionname, SQUserPointer up, const SQChar *scriptfile, int argnum, ...);
 void qr_close(HSQUIRRELVM v);
 SQRESULT qr_argument_get(HSQUIRRELVM v, SQInteger num, ...);