OSDN Git Service

client 0.5.1 release
[unagi/old-svn-converted.git] / client / tag / 0.5.1 / unagi.c
diff --git a/client/tag/0.5.1/unagi.c b/client/tag/0.5.1/unagi.c
new file mode 100644 (file)
index 0000000..950635b
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+famicom ROM cartridge utility - unagi
+command line interface, config file pharser
+
+Copyright (C) 2008  sato_tiff
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "type.h"
+#include "driver_master.h"
+#include "giveio.h"
+#include "file.h"
+#include "script.h"
+#include "header.h"
+#include "textutil.h"
+
+static void test(const char *drivername, const char *file)
+{
+       const struct driver *d;
+       d = driver_get(drivername);
+       if(d == NULL){
+               printf("%s: driver not found\n", __FUNCTION__);
+               return;
+       }
+       const int gg = giveio_start();
+       switch(gg){
+       case GIVEIO_OPEN:
+       case GIVEIO_START:
+       case GIVEIO_WIN95:
+               d->init();
+               break;
+       default:
+       case GIVEIO_ERROR:
+               printf("Can't Access Direct IO %d\n", gg);
+               return;
+       }
+
+       switch(file[0]){
+       case 'p':
+               //printf("%d\n", ppu_ramtest(d));
+               break;
+       case 'b':{
+               const int testbufsize = 0x100;
+               u8 testbuf[testbufsize];
+               int i;
+               d->cpu_read(0x6000, testbufsize, testbuf);
+               for(i=0;i<0x10;i++){
+                       printf("%02x ", testbuf[i]);
+               }
+               }break;
+       }
+       
+       if(gg != GIVEIO_WIN95){
+               giveio_stop(GIVEIO_STOP);
+       }
+       return;
+}
+
+static int flag_get(const char *flag, struct st_config *c)
+{
+       while(*flag != '\0'){
+               switch(*flag){
+               case 'S': case 's':
+                       c->backupram = CONFIG_OVERRIDE_TRUE;
+                       break;
+               case 'H': case 'h':
+                       c->mirror = MIRROR_HORIZONAL;
+                       break;
+               case 'V': case 'v':
+                       c->mirror = MIRROR_VERTICAL;
+                       break;
+               case '_':
+                       break;
+               default:
+                       return NG;
+               }
+               flag++;
+       }
+       return OK;
+}
+
+static const char PREFIX_CONFIG_ERROR[] = "config error:";
+static int config_file_load(struct st_config *c)
+{
+       char *buf;
+       int size = 0;
+       c->driver[0] = '\0';
+       buf = buf_load_full("unagi.cfg", &size);
+       if(buf == NULL){
+               printf("%s config file open error\n", PREFIX_CONFIG_ERROR);
+               return NG;
+       }
+       char **text;
+       text = malloc(sizeof(char*) * TEXT_MAXLINE);
+       const int text_num = text_load(buf, size, text);
+       if(text_num == 0){
+               printf("%s script line too much\n", PREFIX_CONFIG_ERROR);
+               free(buf);
+               free(text);
+               return NG;
+       }
+       int i;
+       for(i=0; i<text_num; i++){
+               char *word[TEXT_MAXWORD];
+               word_load(text[i], word);
+               if(word[0][0] == '#'){
+                       continue;
+               }
+               if(strcmp("DRIVER", word[0]) == 0){
+                       strncpy(c->driver, word[1], 20);
+               }else{
+                       printf("%s unknown config title %s", PREFIX_CONFIG_ERROR, word[1]);
+                       free(buf);
+                       free(text);
+                       return NG;
+               }
+       }
+       free(text);
+       if(c->driver[0] == '\0'){
+               printf("%s hardware not selected\n", PREFIX_CONFIG_ERROR);
+               free(buf);
+               return NG;
+       }
+       free(buf);
+       return OK;
+}
+
+static int config_init(int argc, const char *mode, const char *script, const char *file, const char *flag, const char *mapper, struct st_config *c)
+{
+       c->romimage = NULL;
+       c->ramimage_read = NULL;
+       c->ramimage_write = NULL;
+       switch(mode[0]){
+       case 'd':
+               c->mode = MODE_ROM_DUMP;
+               c->romimage = file;
+               break;
+       case 'r':
+               c->mode = MODE_RAM_READ;
+               c->ramimage_read = file;
+               break;
+       case 'w':
+               c->mode = MODE_RAM_WRITE;
+               c->ramimage_write = file;
+               break;
+       default:
+               printf("%s unkown mode %s\n", PREFIX_CONFIG_ERROR, mode);
+               return NG;
+       };
+       switch(c->mode){
+       case MODE_RAM_READ:
+       case MODE_RAM_WRITE:
+               if(argc != 4){
+                       printf("%s too many argument\n", PREFIX_CONFIG_ERROR);
+                       return NG;
+               }
+       }
+       
+       c->script = script;
+       c->mapper = CONFIG_OVERRIDE_UNDEF;
+       c->mirror = CONFIG_OVERRIDE_UNDEF;
+       c->backupram = CONFIG_OVERRIDE_UNDEF;
+       c->mapper = CONFIG_OVERRIDE_UNDEF;
+       {
+               int flag_error = OK, mapper_error = OK;
+               switch(argc){
+               case 5:
+                       flag_error = flag_get(flag, c);
+                       break;
+               case 6:
+                       flag_error = flag_get(flag, c);
+                       mapper_error = value_get(mapper, &c->mapper);
+                       break;
+               }
+               if(flag_error != OK){
+                       printf("%s unknown flag %s\n", PREFIX_CONFIG_ERROR, flag);
+                       return NG;
+               }
+               if(mapper_error != OK){
+                       printf("%s unknown mapper %s\n", PREFIX_CONFIG_ERROR, flag);
+                       return NG;
+               }
+       }
+
+       if(config_file_load(c) == NG){
+               return NG;
+       }
+       return OK;
+}
+
+int main(int c, char **v)
+{
+       struct st_config config;
+       int config_result;
+       switch(c){
+       case 3:
+               if(DEBUG==1){
+                       test(v[1], v[2]);
+               }else{
+                       goto usage;
+               }
+               return 0;
+       case 4: //mode script target
+               config_result = config_init(c, v[1], v[2], v[3], NULL, NULL, &config);
+               break;
+       case 5: //mode script target flag
+               config_result = config_init(c, v[1], v[2], v[3], v[4], NULL, &config);
+               break;
+       case 6: //mode script target flag mapper
+               config_result = config_init(c, v[1], v[2], v[3], v[4], v[5], &config);
+               break;
+       usage:
+       default:
+               printf("famicom ROM cartridge utility - unagi version 0.5.1\n");
+               printf("%s [mode] [mapper script] [target file] [flag]\n", v[0]);
+               printf("mode - [d]ump ROM / [r]ead RAM/ [w]rite RAM\n");
+               return 0;
+       }
+       if(config_result == OK){
+               script_load(&config);
+       }
+       return 0;
+}