From 4ad494ec67f87f440076e4c078eba5a505159fd2 Mon Sep 17 00:00:00 2001 From: sato_tiff Date: Thu, 20 Nov 2008 04:06:12 +0000 Subject: [PATCH] =?utf8?q?CPU=5FRAMRW=20script=20=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: svn+ssh://svn.osdn.net/svnroot/unagi@50 24ea1065-a21e-4ca1-99c9-f5125deb0858 --- client/trunk/header.c | 12 ++-- client/trunk/header.h | 10 +++- client/trunk/paralellport.c | 1 - client/trunk/script.c | 137 +++++++++++++++++++++++++++++++++++++++----- client/trunk/script.h | 2 +- client/trunk/unagi.c | 32 ++++++----- 6 files changed, 160 insertions(+), 34 deletions(-) diff --git a/client/trunk/header.c b/client/trunk/header.c index 7dbbd60..e50439a 100644 --- a/client/trunk/header.c +++ b/client/trunk/header.c @@ -31,7 +31,7 @@ static void nesheader_set(const struct romimage *r, u8 *header) if(r->mirror == MIRROR_VERTICAL){ header[6] |= 0x01; } - if(r->cpu_ram.size != 0){ + if(r->cpu_ram_read.size != 0){ header[6] |= 0x02; } //4 screen ¤Ï̵»ë @@ -100,21 +100,23 @@ NES file int nesbuffer_malloc(struct romimage *r) { u8 *p; - const int nessize = NES_HEADER_SIZE + r->cpu_rom.size + r->ppu_rom.size + r->cpu_ram.size; + const int nessize = NES_HEADER_SIZE + r->cpu_rom.size + r->ppu_rom.size + r->cpu_ram_read.size; r->neshead = malloc(nessize); if(r->neshead == NULL){ printf("%s: malloc failed\n", __FUNCTION__); return NG; } p = r->neshead + NES_HEADER_SIZE; - r->cpu_rom.data = p; + if(r->cpu_rom.size != 0){ + r->cpu_rom.data = p; + } p += r->cpu_rom.size; if(r->ppu_rom.size != 0){ r->ppu_rom.data = p; } p += r->ppu_rom.size; - if(r->cpu_ram.size != 0){ - r->cpu_ram.data = p; + if(r->cpu_ram_read.size != 0){ + r->cpu_ram_read.data = p; } return OK; } diff --git a/client/trunk/header.h b/client/trunk/header.h index cc80dea..980dc21 100644 --- a/client/trunk/header.h +++ b/client/trunk/header.h @@ -7,7 +7,9 @@ struct memory{ }; struct romimage{ u8 *neshead; - struct memory cpu_rom, cpu_ram, ppu_rom; + struct memory cpu_rom, ppu_rom, cpu_ram_read, cpu_ram_write; + int mode; + const char *ramfile; int mappernum; int mirror; }; @@ -17,6 +19,12 @@ enum{ MIRROR_VERTICAL, MIRROR_PROGRAMABLE = MIRROR_HORIZONAL }; +enum{ + MODE_ROM_DUMP, + MODE_RAM_DUMP, + MODE_RAM_WRITE +}; + int nesbuffer_malloc(struct romimage *r); void nesfile_create(struct romimage *r, const char *romfilename); void nesbuffer_free(struct romimage *r); diff --git a/client/trunk/paralellport.c b/client/trunk/paralellport.c index 4cf102d..3777fa7 100644 --- a/client/trunk/paralellport.c +++ b/client/trunk/paralellport.c @@ -209,7 +209,6 @@ enum{ static void fc_bus_read(long address, long length, u8 *data, int control, int m2_control) { address_set(address, control); - bus_control(control); if(m2_control == M2_CONTROL_TRUE){ control = bit_clear(control, BITNUM_CPU_M2); bus_control(control); //H->L: mapper ¤¬¥¢¥É¥ì¥¹¤ò¼è¤Ã¤Æ¤¯¤ë diff --git a/client/trunk/script.c b/client/trunk/script.c index cca9fb2..8e78b01 100644 --- a/client/trunk/script.c +++ b/client/trunk/script.c @@ -59,6 +59,7 @@ enum{ SCRIPT_OPCODE_DUMP_START, SCRIPT_OPCODE_CPU_READ, SCRIPT_OPCODE_CPU_WRITE, + SCRIPT_OPCODE_CPU_RAMRW, SCRIPT_OPCODE_PPU_RAMTEST, SCRIPT_OPCODE_PPU_READ, SCRIPT_OPCODE_PPU_WRITE, @@ -75,11 +76,12 @@ static const struct script_syntax SCRIPT_SYNTAX[] = { {"MAPPER", SCRIPT_OPCODE_MAPPER, 1, SYNTAX_COMPARE_EQ, {SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL}}, {"MIRROR", SCRIPT_OPCODE_MIRROR, 1, SYNTAX_COMPARE_EQ, {SYNTAX_ARGVTYPE_HV, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL}}, {OPSTR_CPU_ROMSIZE, SCRIPT_OPCODE_CPU_ROMSIZE, 1, SYNTAX_COMPARE_EQ, {SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL}}, -// {OPSTR_CPU_RAMSIZE, SCRIPT_OPCODE_CPU_RAMSIZE, 1, SYNTAX_COMPARE_EQ, {SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL}}, + {OPSTR_CPU_RAMSIZE, SCRIPT_OPCODE_CPU_RAMSIZE, 1, SYNTAX_COMPARE_EQ, {SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL}}, {OPSTR_PPU_ROMSIZE, SCRIPT_OPCODE_PPU_ROMSIZE, 1, SYNTAX_COMPARE_EQ, {SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL}}, {"DUMP_START", SCRIPT_OPCODE_DUMP_START, 0, SYNTAX_COMPARE_EQ, {SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL}}, {"CPU_READ", SCRIPT_OPCODE_CPU_READ, 2, SYNTAX_COMPARE_EQ, {SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL}}, {"CPU_WRITE", SCRIPT_OPCODE_CPU_WRITE, 2, SYNTAX_COMPARE_GT, {SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_EXPRESSION, SYNTAX_ARGVTYPE_EXPRESSION, SYNTAX_ARGVTYPE_EXPRESSION}}, + {"CPU_RAMRW", SCRIPT_OPCODE_CPU_RAMRW, 2, SYNTAX_COMPARE_EQ, {SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL}}, {"PPU_RAMTEST", SCRIPT_OPCODE_PPU_RAMTEST, 0, SYNTAX_COMPARE_EQ, {SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL}}, {"PPU_READ", SCRIPT_OPCODE_PPU_READ, 2, SYNTAX_COMPARE_EQ, {SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_NULL, SYNTAX_ARGVTYPE_NULL}}, #if OP_PPU_WRITE_ENABLE==1 @@ -467,7 +469,8 @@ static int logical_check(const struct script *s, struct romimage *r, const int t r->cpu_rom.size = s->value[0]; break; case SCRIPT_OPCODE_CPU_RAMSIZE: - r->cpu_ram.size = s->value[0]; + r->cpu_ram_read.size = s->value[0]; + r->cpu_ram_write.size = s->value[0]; break; case SCRIPT_OPCODE_PPU_ROMSIZE: r->ppu_rom.size = s->value[0]; @@ -488,7 +491,7 @@ static int logical_check(const struct script *s, struct romimage *r, const int t else if(address < 0x6000 || address >= 0x10000){ logical_print_illgalarea(STR_REGION_CPU, address); error += 1; - }else if (end >= 0x10000){ + }else if(end >= 0x10000){ logical_print_overdump(STR_REGION_CPU, address, end); error += 1; } @@ -524,6 +527,43 @@ static int logical_check(const struct script *s, struct romimage *r, const int t setting = DUMP; } break; + case SCRIPT_OPCODE_CPU_RAMRW:{ + if(r->mode == MODE_ROM_DUMP){ + printf("%s cannot use CPU_RAMRW on ROMDUMP mode\n", LOGICAL_ERROR_PREFIX); + error += 1; + } + const long address = s->value[0]; + const long length = s->value[1]; + const long end = address + length - 1; + //length filter. 0 ¤Ï¤À¤á + if(!is_range(length, 1, 0x2000)){ + logical_print_illgallength(STR_REGION_CPU, length); + error += 1; + } + //address filter + else if(address < 0x6000 || address >= 0x8000){ + logical_print_illgalarea(STR_REGION_CPU, address); + error += 1; + }else if(end >= 0x8000){ + logical_print_overdump(STR_REGION_CPU, address, end); + error += 1; + } + cpu_ramsize += length; + if(r->mode == MODE_RAM_WRITE){ + r->cpu_ram_write.data = buf_load_full(r->ramfile, &(r->cpu_ram_write.size)); + if(r->cpu_ram_write.data == NULL){ + printf("%s RAM image open error\n.", LOGICAL_ERROR_PREFIX); + error += 1; + }else if(r->cpu_ram_read.size != r->cpu_ram_write.size){ + printf("%s RAM image size is not same.\n", LOGICAL_ERROR_PREFIX); + free(r->cpu_ram_write.data); + r->cpu_ram_write.data = NULL; + error += 1; + } + } + setting = DUMP; + } + break; case SCRIPT_OPCODE_PPU_RAMTEST: //logical check ¤Ç¤Ï¤Ê¤Ë¤â¤·¤Ê¤¤ break; @@ -622,7 +662,7 @@ static int logical_check(const struct script *s, struct romimage *r, const int t } //dump length conform error += dump_length_conform(OPSTR_CPU_ROMSIZE, cpu_romsize, r->cpu_rom.size); - error += dump_length_conform(OPSTR_CPU_RAMSIZE, cpu_ramsize, r->cpu_ram.size); + error += dump_length_conform(OPSTR_CPU_RAMSIZE, cpu_ramsize, r->cpu_ram_read.size); error += dump_length_conform(OPSTR_PPU_ROMSIZE, ppu_romsize, r->ppu_rom.size); return error; } @@ -714,6 +754,30 @@ static void read_result_print(const struct memory *m, long length) checksum_print(m->data, length); } +static void execute_cpu_ramrw(const struct memory *w, struct memory *r, int mode, long address, long length) +{ + if(mode == MODE_RAM_WRITE){ + const u8 *writedata; + long a = address; + long l = length; + writedata = w->data; + while(l != 0){ + cpu_write(a++, *writedata); + writedata += 1; + l--; + } + } + cpu_read(address, length, r->data); + if(mode == MODE_RAM_DUMP){ + return; + } + if(memcmp(r->data, w->data, length) == 0){ + printf("RAM data write success.\n"); + }else{ + printf("RAM data write failed.\n"); + } +} + static int execute(const struct script *s, struct romimage *r) { const int gg = giveio_start(); @@ -730,7 +794,7 @@ static int execute(const struct script *s, struct romimage *r) } struct memory cpu_rom, cpu_ram, ppu_rom; cpu_rom = r->cpu_rom; - cpu_ram = r->cpu_ram; + cpu_ram = r->cpu_ram_read; ppu_rom = r->ppu_rom; variable_init_all(); @@ -756,6 +820,17 @@ static int execute(const struct script *s, struct romimage *r) cpu_write(s->value[0], data); } break; + case SCRIPT_OPCODE_CPU_RAMRW:{ + const long length = s->value[1]; + execute_cpu_ramrw(&r->cpu_ram_write, &cpu_ram, r->mode, s->value[0], length); + cpu_ram.data += length; + cpu_ram.offset += length; + if(r->mode == MODE_RAM_WRITE){ + r->cpu_ram_write.data += length; + r->cpu_ram_write.offset += length; + } + } + break; case SCRIPT_OPCODE_PPU_RAMTEST: if(ppu_ramtest() == PPU_TEST_RAM){ printf("PPU_RAMTEST: charcter RAM found\n"); @@ -807,8 +882,24 @@ static int execute(const struct script *s, struct romimage *r) return OK; } -void script_load(const char *scriptfile, const char *nesfile, const int test_only) +void script_load(const char *inmode, const char *scriptfile, const char *targetfile, const int test_only) { + int mode; + switch(inmode[0]){ + case 'd': + mode = MODE_ROM_DUMP; + break; + case 'r': + mode = MODE_RAM_DUMP; + break; + case 'w': + mode = MODE_RAM_WRITE; + break; + default: + printf("unknown mode %s\n", inmode); + return; + } + struct script *s; { int scriptsize = 0; @@ -847,36 +938,56 @@ void script_load(const char *scriptfile, const char *nesfile, const int test_onl data: NULL, name: STR_REGION_CPU }, - cpu_ram: { + ppu_rom: { + size: 0, offset: 0, + data: NULL, + name: STR_REGION_PPU + }, + cpu_ram_read: { size: 0, offset: 0, data: NULL, name: STR_REGION_CPU }, - ppu_rom: { + cpu_ram_write: { size: 0, offset: 0, data: NULL, - name: STR_REGION_PPU + name: STR_REGION_CPU }, neshead: NULL, mappernum: 0, - mirror: MIRROR_PROGRAMABLE + mirror: MIRROR_PROGRAMABLE, + mode: mode, + ramfile: NULL }; + if(mode == MODE_RAM_WRITE){ + r.ramfile = targetfile; + } if((logical_check(s, &r, test_only) == 0) && (test_only == 0)){ //dump RAM Îΰè¼èÆÀ if(nesbuffer_malloc(&r) == NG){ free(s); + if(r.cpu_ram_write.data != NULL){ + free(r.cpu_ram_write.data); + } return; } //dump if(execute(s, &r) == OK){ //À®²Ì½ÐÎÏ - nesfile_create(&r, nesfile); - if(r.cpu_ram.size != 0){ - backupram_create(&(r.cpu_ram), "hoe.sav"); + switch(r.mode){ + case MODE_ROM_DUMP: + nesfile_create(&r, targetfile); + break; + case MODE_RAM_DUMP: + backupram_create(&(r.cpu_ram_read), targetfile); + break; } } //dump RAM Îΰè²òÊü nesbuffer_free(&r); + if(r.cpu_ram_write.data != NULL){ + free(r.cpu_ram_write.data); + } } free(s); } diff --git a/client/trunk/script.h b/client/trunk/script.h index a76dadf..6fbe6ac 100644 --- a/client/trunk/script.h +++ b/client/trunk/script.h @@ -1,7 +1,7 @@ #ifndef _SCRIPT_H_ #define _SCRIPT_H_ int ppu_ramtest(void); -void script_load(const char *scriptfile, const char *nesfile, const int test_only); +void script_load(const char *inmode, const char *scriptfile, const char *targetfile, const int test_only); struct st_variable{ int type; diff --git a/client/trunk/unagi.c b/client/trunk/unagi.c index 21f94ad..0a024f0 100644 --- a/client/trunk/unagi.c +++ b/client/trunk/unagi.c @@ -14,6 +14,7 @@ todo: #include "file.h" #include "script.h" +#if DEBUG==1 static void backupram_test(const char *file) { const int gg = giveio_start(); @@ -37,17 +38,18 @@ static void backupram_test(const char *file) const int testbufsize = 0x2000; u8 testbuf[testbufsize]; int i; - /*cpu_write(0x8000, 0x80); - cpu_write(0xe000, 0); - cpu_write(0xe000, 0); - cpu_write(0xe000, 0); - cpu_write(0xe000, 0); - cpu_write(0xe000, 0);*/ - for(i=0;i<0x10;i++){ - cpu_write(0x6000 + i, i); + cpu_write(0x8000, 0x80); + for(i=0; i <5; i++){ + cpu_write(0xe000, 0); + } + for(i=0; i <5; i++){ + cpu_write(0xa000, 0); } cpu_read(0x6000, testbufsize, testbuf); buf_save(testbuf, file, testbufsize); + for(i=0;i<0x10;i++){ + printf("%02x ", testbuf[i]); + } }break; } @@ -56,21 +58,25 @@ static void backupram_test(const char *file) } return; } +#endif int main(int c, char **v) { switch(c){ +#if DEBUG==1 case 2: backupram_test(v[1]); break; - case 3: - script_load(v[1], v[2], 0); - break; +#endif case 4: - script_load(v[1], v[2], 1); + script_load(v[1], v[2], v[3], 0); + break; + case 5: + script_load(v[1], v[2], v[3], 1); break; default: - printf("%s [mapper script] [dump file]", v[0]); + printf("%s [mode] [mapper script] [target file]\n", v[0]); + printf("mode - [d]ump ROM / [r]ead RAM/ [w]rite RAM\n"); } return 0; } -- 2.11.0