OSDN Git Service

vram mirroring が正しくとれないバグを修正
authornaruko <naruko@24ea1065-a21e-4ca1-99c9-f5125deb0858>
Thu, 18 Nov 2010 05:07:48 +0000 (05:07 +0000)
committernaruko <naruko@24ea1065-a21e-4ca1-99c9-f5125deb0858>
Thu, 18 Nov 2010 05:07:48 +0000 (05:07 +0000)
git-svn-id: svn+ssh://svn.osdn.net/svnroot/unagi@394 24ea1065-a21e-4ca1-99c9-f5125deb0858

client/trunk/anago/anago_cui.c
client/trunk/anago/programcore.nut
client/trunk/anago/script_dump.c
client/trunk/anago/script_program.c
client/trunk/anago/script_program.h

index 84239e3..a09724a 100644 (file)
@@ -89,12 +89,8 @@ static void program(int c, wgChar **v, const struct reader_driver *r)
        config.cpu.access = &r->cpu;
        config.ppu.access = &r->ppu;
        config.compare = false;
-       config.testrun = false;
        switch(v[1][0]){
-       case 'a':
-               config.testrun = true;
-               break;
-       case 'F':
+       case wgT('F'): case wgT('X'):
                config.compare = true;
                break;
        }
@@ -224,13 +220,15 @@ 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("fF- 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){
+               PUTS(wgT("z - ROM dump for test"));
+               PUTS(wgT("xX- flash program for test"));
+               PUTS(wgT("R - workram read for test"));
+               PUTS(wgT("W - workram write for test"));
+       }
 }
 
 #ifdef WIN32
@@ -253,7 +251,7 @@ int anago_cui(int c, wgChar **v)
                }
 #endif
                switch(v[1][0]){
-               case wgT('x'):
+               case wgT('x'): case wgT('X'):
                        r = &DRIVER_DUMMY; //though down
                case wgT('f'): case wgT('F'):
                        program(c, v, r);
index afff593..9a2ba58 100644 (file)
@@ -81,5 +81,5 @@ function program(
        if(ppu_trans != trans_empty){
                co_ppu.call(d, ppu_loop.start, ppu_loop.end, board.ppu_rom.banksize);
        }
-       program_main(d, co_cpu, co_ppu)
+       program_main(d, co_cpu, co_ppu);
 }
index b3b02bb..6773919 100644 (file)
@@ -204,7 +204,11 @@ static SQInteger nesfile_save(HSQUIRRELVM v)
                if(DEBUG == 1){
                        d->log.append(d->log.object, wgT("vram connection %x\n"), c);
                }
-               if(c == 0x0a){
+/*
+kazzo 1.0 return value H:9 V:5
+kazzo 2.x return value H:C V:A
+*/
+               if(c == 0x05 || c == 0x0a){
                        image.mirror = MIRROR_VERTICAL;
                }else{
                        image.mirror = MIRROR_HORIZONAL;
index 0f45377..37a0f8b 100644 (file)
 
 static SQInteger vram_mirrorfind(HSQUIRRELVM v)
 {
-       struct flash_config *d;
-       SQRESULT r =  qr_userpointer_get(v, (SQUserPointer) &d);
+       struct program_config *d;
+       SQRESULT r = SQ_FAILED(qr_userpointer_get(v, (SQUserPointer) &d));
        if(SQ_FAILED(r)){
                return r;
        }
+       const uint8_t c = d->control->vram_connection(d->handle);
+       if(DEBUG == 1){
+               d->log.append(d->log.object, wgT("vram connection %x\n"), c);
+       }
+       if((c == 0x0a || c == 0x05) && d->vram_mirroring == MIRROR_VERTICAL){
+               return 0;
+       }else if((c == 0x0c || c == 0x09) && d->vram_mirroring == MIRROR_HORIZONAL){
+               return 0;
+       }else{
+               wgChar cartridge, image;
+               switch(c){
+               case 0x05: case 0x0a:
+                       image = wgT('V');
+                       break;
+               case 0x09: case 0x0c:
+                       image = wgT('H');
+                       break;
+               default:
+                       image = wgT('?');
+                       break;
+               }
+               if(d->vram_mirroring == MIRROR_HORIZONAL){
+                       cartridge = wgT('H');
+               }else{
+                       cartridge = wgT('V');
+               }
+               d->log.append(d->log.object, wgT("warning: vram connection is unmmacted\n"));
+               d->log.append(d->log.object, wgT("cartridge:%c romimage:%c\n"), cartridge, image);
+       }
        return 0;
 }
 static SQInteger command_set(HSQUIRRELVM v, struct flash_memory_driver *t)
@@ -213,7 +242,7 @@ static SQInteger erase_wait(HSQUIRRELVM v)
                do{
                        wait(2);
                        d->control->flash_status(d->handle, s);
-               //ËÜÍè¤Î°Õ¿Þ¤«¤é¤Ç¤Ï¤³¤³¤Î¾ò·ï¼°¤Ï && ¤Ç¤Ï¤Ê¤¯ || ¤À¤¬¡¢Àè¤Ë erase ¤¬½ª¤ï¤Ã¤¿¥Ç¥Ð¥¤¥¹¤¬Æ°¤«¤»¤ë¤Î¤Ç»Ä¤·¤Æ¤ª¤¯
+               //本来の意図からではここの条件式は && ではなく || だが、先に erase が終わったデバイスが動かせるので残しておく
                }while((s[0] != KAZZO_TASK_FLASH_IDLE) && (s[1] != KAZZO_TASK_FLASH_IDLE));
        }
        return 0;
@@ -231,7 +260,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, wgT("%s memory compare error, offset 0x%06x\n"), t->memory.name, t->programming.offset);
+                               log->append(log->object, wgT("%s memory compare failed, offset 0x%06x\n"), t->memory.name, t->programming.offset);
                                return false;
                        }
                }
@@ -263,24 +292,26 @@ static SQInteger program_main(HSQUIRRELVM v)
        }
        SQInteger state_cpu = sq_getvmstate(co_cpu);
        SQInteger state_ppu = sq_getvmstate(co_ppu);
-       const long sleepms = d->compare == true ? 6 : 2; //W29C040 ¤Ç compare ¤ò¤¹¤ë¤È¡¢error ¤¬½Ð¤ë¤Î¤Ç½Ð¤Ê¤¤ÃͤËÄ´À° (¤ä¤Ã¤Ä¤±Âбþ)
+       const long sleepms = d->compare == true ? 6 : 2; //W29C040 で compare をすると、error が出るので出ない値に調整 (やっつけ対応)
        
        while((state_cpu != SQ_VMSTATE_IDLE) || (state_ppu != SQ_VMSTATE_IDLE)){
                uint8_t s[2];
-//             bool console_update = false;
                wait(sleepms);
                d->control->flash_status(d->handle, s);
                if(state_cpu != SQ_VMSTATE_IDLE && s[0] == KAZZO_TASK_FLASH_IDLE){
                        if(program_memoryarea(co_cpu, d->handle, &d->cpu, d->compare, &state_cpu, &d->log) == false){
+                               //sq_pushbool(v, SQFalse);
                                return 0;
                        }
                }
                if(state_ppu != SQ_VMSTATE_IDLE && s[1] == KAZZO_TASK_FLASH_IDLE){
                        if(program_memoryarea(co_ppu, d->handle, &d->ppu, d->compare, &state_ppu, &d->log) == false){
+                               //sq_pushbool(v, SQFalse);
                                return 0;
                        }
                }
        }
+       //sq_pushbool(v, SQTrue);
        return 0;
 }
 
@@ -385,6 +416,7 @@ static bool zendan(struct program_config *c)
                }
        }
 //script execute 
+       //SQBool ret;
        c->cpu.command_change = true;
        gauge_init(&c->cpu);
        c->ppu.command_change = true;
@@ -402,9 +434,11 @@ static bool zendan(struct program_config *c)
                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);
+               //assert(sq_gettype(v, -2) == OT_BOOL);
+               //sq_getbool(v, -1, &ret);
                qr_close(v);
        }
-       return true;
+       return true; //ret == SQTrue ? true : false;
 }
 
 static bool memory_image_init(const struct memory *from, struct flash_memory_driver *t, struct textcontrol *log)
@@ -437,6 +471,7 @@ bool script_program_execute(struct program_config *c)
        }
 //variable init
        c->mappernum = rom.mappernum;
+       c->vram_mirroring = rom.mirror;
        c->cpu.memory.name = wgT("Program Flash");
        if(memory_image_init(&rom.cpu_rom, &c->cpu, &c->log) == false){
                nesbuffer_free(&rom, 0);
index b59dbb5..4767820 100644 (file)
@@ -17,7 +17,8 @@ struct program_config{
                struct gauge gauge;
        }cpu, ppu;
        long mappernum;
-       bool compare, testrun;
+       enum vram_mirroring vram_mirroring;
+       bool compare;
        struct textcontrol log;
        void (*except)(const wgChar *str);
 };