From cd05dc3c6b15c72f7a8b8ded3f58650cdfe9bede Mon Sep 17 00:00:00 2001 From: naruko Date: Thu, 18 Nov 2010 05:07:48 +0000 Subject: [PATCH] =?utf8?q?vram=20mirroring=20=E3=81=8C=E6=AD=A3=E3=81=97?= =?utf8?q?=E3=81=8F=E3=81=A8=E3=82=8C=E3=81=AA=E3=81=84=E3=83=90=E3=82=B0?= =?utf8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: svn+ssh://svn.osdn.net/svnroot/unagi@394 24ea1065-a21e-4ca1-99c9-f5125deb0858 --- client/trunk/anago/anago_cui.c | 20 +++++++-------- client/trunk/anago/programcore.nut | 2 +- client/trunk/anago/script_dump.c | 6 ++++- client/trunk/anago/script_program.c | 49 +++++++++++++++++++++++++++++++------ client/trunk/anago/script_program.h | 3 ++- 5 files changed, 59 insertions(+), 21 deletions(-) diff --git a/client/trunk/anago/anago_cui.c b/client/trunk/anago/anago_cui.c index 84239e3..a09724a 100644 --- a/client/trunk/anago/anago_cui.c +++ b/client/trunk/anago/anago_cui.c @@ -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); diff --git a/client/trunk/anago/programcore.nut b/client/trunk/anago/programcore.nut index afff593..9a2ba58 100644 --- a/client/trunk/anago/programcore.nut +++ b/client/trunk/anago/programcore.nut @@ -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); } diff --git a/client/trunk/anago/script_dump.c b/client/trunk/anago/script_dump.c index b3b02bb..6773919 100644 --- a/client/trunk/anago/script_dump.c +++ b/client/trunk/anago/script_dump.c @@ -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; diff --git a/client/trunk/anago/script_program.c b/client/trunk/anago/script_program.c index 0f45377..37a0f8b 100644 --- a/client/trunk/anago/script_program.c +++ b/client/trunk/anago/script_program.c @@ -16,11 +16,40 @@ 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); diff --git a/client/trunk/anago/script_program.h b/client/trunk/anago/script_program.h index b59dbb5..4767820 100644 --- a/client/trunk/anago/script_program.h +++ b/client/trunk/anago/script_program.h @@ -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); }; -- 2.11.0