OSDN Git Service

vram mirroring が正しくとれないバグを修正
[unagi/old-svn-converted.git] / client / trunk / anago / script_program.c
index 791196e..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)
@@ -66,17 +95,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 +103,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);
@@ -221,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;
@@ -239,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\n"), t->memory.name);
+                               log->append(log->object, wgT("%s memory compare failed, offset 0x%06x\n"), t->memory.name, t->programming.offset);
                                return false;
                        }
                }
@@ -271,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;
 }
 
@@ -393,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;
@@ -410,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)
@@ -445,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);