OSDN Git Service

CPU_RAMRW script 追加
authorsato_tiff <sato_tiff@24ea1065-a21e-4ca1-99c9-f5125deb0858>
Thu, 20 Nov 2008 04:06:12 +0000 (04:06 +0000)
committersato_tiff <sato_tiff@24ea1065-a21e-4ca1-99c9-f5125deb0858>
Thu, 20 Nov 2008 04:06:12 +0000 (04:06 +0000)
git-svn-id: svn+ssh://svn.osdn.net/svnroot/unagi@50 24ea1065-a21e-4ca1-99c9-f5125deb0858

client/trunk/header.c
client/trunk/header.h
client/trunk/paralellport.c
client/trunk/script.c
client/trunk/script.h
client/trunk/unagi.c

index 7dbbd60..e50439a 100644 (file)
@@ -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;
 }
index cc80dea..980dc21 100644 (file)
@@ -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);
index 4cf102d..3777fa7 100644 (file)
@@ -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 ¤¬¥¢¥É¥ì¥¹¤ò¼è¤Ã¤Æ¤¯¤ë
index cca9fb2..8e78b01 100644 (file)
@@ -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);
 }
index a76dadf..6fbe6ac 100644 (file)
@@ -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;
index 21f94ad..0a024f0 100644 (file)
@@ -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;
 }