};
static struct variable_manage variable_bank[VARIABLE_MAX];
static int variable_num = 0;
-/*
-CPU_ROMSIZE, PPU_ROMSIZE ¦¤ÇÄêµÁ¤µ¤ì¤ëÄê¿ô̾¤Ï¤½¤ì¤¾¤ì C, P
-*/
-enum{
- STEP_CONST_CPUAREA = 'C',
- STEP_CONST_PPUAREA = 'P',
- STEP_CONST_UNDEF = 0x4649
-};
-static long step_const_cpuarea = STEP_CONST_UNDEF;
-static long step_const_ppuarea = STEP_CONST_UNDEF;
-
-static long constant_get(char v)
-{
- switch(v){
- case STEP_CONST_CPUAREA:
- return step_const_cpuarea;
- case STEP_CONST_PPUAREA:
- return step_const_ppuarea;
- }
- return STEP_CONST_UNDEF;
-}
static void variable_init_single(int num)
{
return OK;
}
+static int strto_enum(const char **t, const char *word, int start, long *val)
+{
+ long i = start;
+ while(*t != NULL){
+ if(strcmp(*t, word) == 0){
+ *val = i;
+ return OK;
+ }
+ i++;
+ t++;
+ }
+ return NG;
+}
+
static const char SYNTAX_ERROR_PREFIX[] = "syntax error:";
/*
}
}break;
case SYNTAX_ARGVTYPE_CONSTANT:{
- const char v = word[j][0];
if(value_get(word[j], &(s->value[j])) == OK){
break;
- }else if(v == STEP_CONST_CPUAREA || v == STEP_CONST_PPUAREA){
- s->value[j] = VALUE_CONSTANT;
- s->constant = v;
+ }else if(strto_enum(STR_CONSTANTNAME, word[j], VALUE_CONTANT_CPU_STEP_START, &(s->value[j])) == OK){
+ break;
}else{
printf("%d:%s constant error %s %s\n", s->line, SYNTAX_ERROR_PREFIX, opword, word[j]);
return 1;
}
}break;
+ case SYNTAX_ARGVTYPE_TRANSTYPE:{
+ if(strto_enum(STR_TRANSTYPE, word[j], VALUE_TRANSTYPE_EMPTY, &(s->value[j])) == NG){
+ printf("%d:%s unknown trans type %s\n", s->line, SYNTAX_ERROR_PREFIX, word[j]);
+ return 1;
+ }
+ }break;
default:
s->value[j] = VALUE_UNDEF;
break;
static const char LOGICAL_ERROR_PREFIX[] = "logical error:";
enum{
SCRIPT_PPUSIZE_0 = 0,
- SCRIPT_MEMORYSIZE = 4,
+ SCRIPT_MEMORYSIZE = 10,
};
struct logical_romsize{
- const struct script *data[SCRIPT_MEMORYSIZE];
+ const struct script *data[SCRIPT_MEMORYSIZE], *constant;
int count;
};
-static int logical_romsize_set(int region, long size, struct logical_romsize *l, const struct script *s)
+static int logical_flashsize_set(int region, struct logical_romsize *l, const struct script *s)
{
//PPU Íѥǡ¼¥¿¤Î 0 ¤Ï size 0, Äê¿ô 0 ¤È¤·¤ÆͽÌ󤵤ì¤Æ¤ª¤ê¡¢0¤Î¾ì¹ç¤Ï¤³¤³¤ò¾å½ñ¤¤¹¤ë
- if((region == MEMORY_AREA_PPU) && (size == 0)){
+ if((region == MEMORY_AREA_PPU) && (s->value[0] == 0)){
l->data[SCRIPT_PPUSIZE_0] = s;
return OK;
}
if(l->count >= SCRIPT_MEMORYSIZE){
const char *opstr;
+ opstr = OPSTR_CPU_ROMSIZE; //warning Âкö
switch(region){
case MEMORY_AREA_CPU_ROM:
opstr = OPSTR_CPU_ROMSIZE;
return OK;
}
-static long logical_romsize_get(long size, const struct logical_romsize *l)
+static int logical_flashsize_get(long transtype, long size, struct logical_romsize *l)
{
int i;
for(i = 0; i < l->count; i++){
const struct script *s;
s = l->data[i];
- if(s->value[0] == size){
- return s->value[1];
+ if((s->value[0] == size) && (
+ (s->value[1] == transtype) ||
+ (s->value[1] == VALUE_TRANSTYPE_FULL)
+ )){
+ l->constant = s;
+ return OK;
+ }else if((s->value[0] == size) && (s->value[1] == VALUE_TRANSTYPE_EMPTY)){
+ l->constant = s;
+ return OK;
}
}
- printf("%s romsize error\n", LOGICAL_ERROR_PREFIX);
- return STEP_CONST_UNDEF;
+ printf("%s flashsize not found\n", LOGICAL_ERROR_PREFIX);
+ return NG;
+}
+
+static long constant_get(long val, const struct script *cpu, const struct script *ppu)
+{
+ switch(val){
+ case VALUE_CONTANT_CPU_STEP_START:
+ return cpu->value[2];
+ case VALUE_CONTANT_CPU_STEP_END:
+ return cpu->value[3];
+ case VALUE_CONTANT_PPU_STEP_START:
+ return ppu->value[2];
+ case VALUE_CONTANT_PPU_STEP_END:
+ return ppu->value[3];
+ }
+ assert(0);
+ return -1;
}
static void logical_print_capacityerror(int line, const char *area)
static const struct script SCRIPT_PPU_ROMSIZE_0 = {
.opcode = SCRIPT_OPCODE_PPU_ROMSIZE,
.line = -1,
- .value = {0, 0, 0, 0},
+ .value = {0, VALUE_TRANSTYPE_EMPTY, 0, 0},
//.expression, .variable ̤ÄêµÁ
- .constant = 0
};
static int logical_check(const struct script *s, const struct st_config *c, struct romimage *r)
int imagesize = 0; //for write or program mode
int status = SETTING;
//override (CPU|PPU)_ROMSIZE pointer. Program mode only
- struct logical_romsize script_cpu_romsize = {
- .data = {NULL, NULL, NULL, NULL},
+ struct logical_romsize script_cpu_flashsize = {
+ .constant = NULL,
.count = 0
};
- struct logical_romsize script_ppu_romsize = {
- .data = {&SCRIPT_PPU_ROMSIZE_0, NULL, NULL, NULL},
+ struct logical_romsize script_ppu_flashsize = {
+ .constant = NULL,
.count = 1
};
+ script_ppu_flashsize.data[0] = &SCRIPT_PPU_ROMSIZE_0;
//logical error count. Ìá¤êÃÍ
int error = 0;
if(nesfile_load(LOGICAL_ERROR_PREFIX, c->romimage, r)== NG){
error += 1;
}
- step_const_cpuarea = logical_romsize_get(r->cpu_rom.size, &script_cpu_romsize);
//Äê¿ôÀë¸À¥¨¥é¡¼¤Ï̵¸Â¥ë¡¼¥×¤Î²ÄǽÀ¤¬¤¢¤ë¤Î¤Ç¥¹¥¯¥ê¥×¥ÈÆâÉô¥Á¥§¥Ã¥¯¤ò¤»¤º¤Ë»ß¤á¤ë
- if(step_const_cpuarea == STEP_CONST_UNDEF){
+ if(logical_flashsize_get(c->transtype_cpu, r->cpu_rom.size, &script_cpu_flashsize) == NG){
return error + 1;
}
- step_const_ppuarea = logical_romsize_get(r->ppu_rom.size, &script_ppu_romsize);
- if(step_const_ppuarea == STEP_CONST_UNDEF){
+ if(logical_flashsize_get(c->transtype_ppu, r->ppu_rom.size, &script_ppu_flashsize) == NG){
return error + 1;
}
+ //flash memory capacity check
+ if(r->cpu_rom.size > c->cpu_flash_driver->capacity){
+ logical_print_capacityerror(s->line, r->cpu_rom.name);
+ error += 1;
+ }
+ if((r->ppu_rom.size != 0) && (r->ppu_rom.size > c->ppu_flash_driver->capacity)){
+ logical_print_capacityerror(s->line, r->ppu_rom.name);
+ error += 1;
+ }
imagesize = -1;
break;
default:
break;
case SCRIPT_OPCODE_CPU_ROMSIZE:{
const long size = s->value[0];
- if(c->mode == MODE_ROM_PROGRAM){
- if(logical_romsize_set(MEMORY_AREA_CPU_ROM, size, &script_cpu_romsize, s) == NG){
- error += 1;
- }
- }else{
- r->cpu_rom.size = size;
- }
+ r->cpu_rom.size = size;
if(memorysize_check(size, MEMORY_AREA_CPU_ROM)){
printf("%s %s length error\n", LOGICAL_ERROR_PREFIX, OPSTR_CPU_ROMSIZE);
error += 1;
}
- //flash memory capacity check
- else if((c->mode == MODE_ROM_PROGRAM) && (size > c->cpu_flash_driver->capacity)){
- logical_print_capacityerror(s->line, r->cpu_rom.name);
+ }break;
+ case SCRIPT_OPCODE_CPU_FLASHSIZE:
+ if(logical_flashsize_set(MEMORY_AREA_CPU_ROM, &script_cpu_flashsize, s) == NG){
error += 1;
- }
}break;
case SCRIPT_OPCODE_CPU_RAMSIZE:
//memory size ¤Ï̤³ÎÄêÍ×ÁǤ¬Â¿¤¤¤Î¤Ç check ¤òÈ´¤¯
break;
case SCRIPT_OPCODE_PPU_ROMSIZE:{
const long size = s->value[0];
- if(c->mode == MODE_ROM_PROGRAM){
- if(logical_romsize_set(MEMORY_AREA_PPU, size, &script_ppu_romsize, s) == NG){
- error += 1;
- }
- }else{
- r->ppu_rom.size = size;
- }
+ r->ppu_rom.size = size;
if(memorysize_check(size, MEMORY_AREA_PPU)){
printf("%s %s length error\n", LOGICAL_ERROR_PREFIX, OPSTR_PPU_ROMSIZE);
error += 1;
}
- else if((c->mode == MODE_ROM_PROGRAM) && (size > c->ppu_flash_driver->capacity)){
- logical_print_capacityerror(s->line, r->ppu_rom.name);
+ }break;
+ case SCRIPT_OPCODE_PPU_FLASHSIZE:
+ if(logical_flashsize_set(MEMORY_AREA_PPU, &script_ppu_flashsize, s) == NG){
error += 1;
}
- }
break;
case SCRIPT_OPCODE_PPU_COMMAND:
if(command_mask(MEMORY_AREA_PPU, s->value[0], s->value[1], s->value[2], &(r->ppu_flash)) == NG){
}
break;
case SCRIPT_OPCODE_STEP_START:{
- const struct {
+ const struct step_syntax{
long start, end;
int constant;
+ const char *name;
} RANGE[STEP_NUM] = {
- {.start = 0, .end = 0, .constant = NG},
- {.start = 0, .end = 0xff, .constant = OK},
- {.start = 0, .end = 0x100, .constant = OK},
- {.start = 1, .end = 0x100, .constant = NG}
+ {.start = 0, .end = 0, .constant = NG, .name = "variable"},
+ {.start = 0, .end = 0xff, .constant = OK, .name = "start"},
+ {.start = 0, .end = 0x100, .constant = OK, .name = "end"},
+ {.start = 1, .end = 0x100, .constant = NG, .name = "next"}
};
- const char *NAME[STEP_NUM] = {
- "variable", "start", "end", "next"
- };
- long val[STEP_NUM];
int i;
for(i = STEP_START; i < STEP_NUM; i++){
- long v = s->value[i];
- if((RANGE[i].constant == OK) && (v == VALUE_CONSTANT)){
- v = constant_get(s->constant);
+ const struct step_syntax *ss;
+ ss = &RANGE[i];
+ //Äê¿ôobject ¤ò¼Â¿ô¤ËÊÑ´¹¤¹¤ë¤¿¤á¡¢const ¤ò³°¤·¤Æ½ñ¤´¹¤¨¤ë
+ long *v;
+ v = (long *) &s->value[i];
+ if((ss->constant == OK) && (is_range(*v, VALUE_CONTANT_CPU_STEP_START, VALUE_CONTANT_PPU_STEP_END))){
+ *v = constant_get(*v, script_cpu_flashsize.constant, script_ppu_flashsize.constant);
}
- if(!is_range(v, RANGE[i].start, RANGE[i].end)){
- printf("%d:%s step %s must %d-0x%x 0x%x\n", s->line, NAME[i], LOGICAL_ERROR_PREFIX, (int) RANGE[i].start, (int) RANGE[i].end, (int) v);
+ if(!is_range(*v, ss->start, ss->end)){
+ printf("%d:%s step %s must %d-0x%x 0x%x\n", s->line, ss->name, LOGICAL_ERROR_PREFIX, (int) ss->start, (int) ss->end, (int) *v);
error += 1;
}
- val[i] = v;
}
//PPU RAM ¤ÎÍÍ¤Ë step ÆâÉô¤ò¹Ô¤ï¤Ê¤¤¾ì¹ç¤Îscript¾õÂÖ¤ÎÊѹ¹
- if(val[STEP_START] >= val[STEP_END]){
+ if(s->value[STEP_START] >= s->value[STEP_END]){
status = STEP_THOUGH;
}
//¥ë¡¼¥×¤ÎÌá¤êÀè¤Ï¤³¤ÎÌ¿Îá¤Î¼¡¤Ê¤Î¤Ç s[1]
- else if(step_new(s->variable, val[STEP_START], val[STEP_END], val[STEP_NEXT], &s[1]) == NG){
+ else if(step_new(s->variable, s->value[STEP_START], s->value[STEP_END], s->value[STEP_NEXT], &s[1]) == NG){
printf("%d:%s step loop too much\n", s->line, LOGICAL_ERROR_PREFIX);
error += 1;
return error;
fflush(stdout);
}
-static void execute_program_begin(const struct memory *m)
+static void execute_program_begin(const struct memory *m, const long length)
{
- if(0){ //DEBUG==1){
- return;
- }
- printf("writing %s area 0x%06x ... ", m->name, m->offset);
+ int tail = m->offset + (int) length - 1;
+ printf("writing %s area 0x%06x-0x%06x ... ", m->name, m->offset, tail);
fflush(stdout);
}
}
const long address = s->value[0];
const long length = s->value[1];
- execute_program_begin(&cpu_rom);
+ execute_program_begin(&cpu_rom, length);
c->cpu_flash_driver->write(
&(r->cpu_flash),
address, length,
}
const long address = s->value[0];
const long length = s->value[1];
- execute_program_begin(&ppu_rom);
+ execute_program_begin(&ppu_rom, length);
c->ppu_flash_driver->write(
&(r->ppu_flash),
address, length,
}
break;
case SCRIPT_OPCODE_STEP_START:{
- long val[STEP_NUM];
- int i;
- //start ¤È end ¤ÎÄê¿ôŸ³«¤ò¹Ô¤¦
- for(i=STEP_START; i<STEP_NEXT; i++){
- val[i] = s->value[i];
- if(val[i] == VALUE_CONSTANT){
- val[i] = constant_get(s->constant);
- }
- }
-
- if(val[STEP_START] >= val[STEP_END]){
+ if(s->value[STEP_START] >= s->value[STEP_END]){
status = STEP_THOUGH;
}else{
//¥ë¡¼¥×¤ÎÌá¤êÀè¤Ï¤³¤ÎÌ¿Îá¤Î¼¡¤Ê¤Î¤Ç &s[1]
- step_new(s->variable, val[STEP_START], val[STEP_END], s->value[STEP_NEXT], &s[1]);
+ step_new(s->variable, s->value[STEP_START], s->value[STEP_END], s->value[STEP_NEXT], &s[1]);
}
}break;
case SCRIPT_OPCODE_DUMP_END:
SYNTAX_ARGVTYPE_HV,
SYNTAX_ARGVTYPE_EXPRESSION,
SYNTAX_ARGVTYPE_VARIABLE,
- SYNTAX_ARGVTYPE_CONSTANT
+ SYNTAX_ARGVTYPE_CONSTANT,
+ SYNTAX_ARGVTYPE_TRANSTYPE
};
enum{
SYNTAX_COMPARE_EQ,
SCRIPT_OPCODE_MIRROR,
SCRIPT_OPCODE_CPU_ROMSIZE,
SCRIPT_OPCODE_CPU_RAMSIZE,
+ SCRIPT_OPCODE_CPU_FLASHSIZE,
SCRIPT_OPCODE_PPU_ROMSIZE,
+ SCRIPT_OPCODE_PPU_FLASHSIZE,
SCRIPT_OPCODE_DUMP_START,
SCRIPT_OPCODE_CPU_COMMAND,
SCRIPT_OPCODE_CPU_READ,
};
static const char OPSTR_CPU_ROMSIZE[] = "CPU_ROMSIZE";
static const char OPSTR_CPU_RAMSIZE[] = "CPU_RAMSIZE";
+static const char OPSTR_CPU_FLASHSIZE[] = "CPU_FLASHSIZE";
static const char OPSTR_PPU_ROMSIZE[] = "PPU_ROMSIZE";
+static const char OPSTR_PPU_FLASHSIZE[] = "PPU_FLASHSIZE";
static const char OPSTR_CPU_RAMRW[] = "CPU_RAMRW";
static const int ARGV_TYPE_VALUE_ONLY[SYNTAX_ARGV_TYPE_NUM] = {
SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_NULL,
SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_VALUE,
SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_NULL
};
+static const int ARGV_TYPE_FLASHSIZE[SYNTAX_ARGV_TYPE_NUM] = {
+ SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_TRANSTYPE,
+ SYNTAX_ARGVTYPE_VALUE, SYNTAX_ARGVTYPE_VALUE
+};
static const struct script_syntax SCRIPT_SYNTAX[] = {
{
name: "MAPPER",
},{
name: OPSTR_CPU_ROMSIZE,
script_opcode: SCRIPT_OPCODE_CPU_ROMSIZE,
- permittion: PERMITTION_ROM_DUMP | PERMITTION_ROM_PROGRAM,
- argc: 1, compare: SYNTAX_COMPARE_GT,
- argv_type: ARGV_TYPE_ADDRESS_LENGTH
+ permittion: PERMITTION_ROM_DUMP,
+ argc: 1, compare: SYNTAX_COMPARE_EQ,
+ argv_type: ARGV_TYPE_VALUE_ONLY
},{
name: OPSTR_CPU_RAMSIZE,
script_opcode: SCRIPT_OPCODE_CPU_RAMSIZE,
argc: 1, compare: SYNTAX_COMPARE_EQ,
argv_type: ARGV_TYPE_VALUE_ONLY
},{
+ name: OPSTR_CPU_FLASHSIZE,
+ script_opcode: SCRIPT_OPCODE_CPU_FLASHSIZE,
+ permittion: PERMITTION_ROM_PROGRAM,
+ argc: 4, compare: SYNTAX_COMPARE_EQ,
+ argv_type: ARGV_TYPE_FLASHSIZE
+ },{
name: OPSTR_PPU_ROMSIZE,
script_opcode: SCRIPT_OPCODE_PPU_ROMSIZE,
- permittion: PERMITTION_ROM_DUMP | PERMITTION_ROM_PROGRAM,
- argc: 1, compare: SYNTAX_COMPARE_GT,
- argv_type: ARGV_TYPE_ADDRESS_LENGTH
+ permittion: PERMITTION_ROM_DUMP,
+ argc: 1, compare: SYNTAX_COMPARE_EQ,
+ argv_type: ARGV_TYPE_VALUE_ONLY
+ },{
+ name: OPSTR_PPU_FLASHSIZE,
+ script_opcode: SCRIPT_OPCODE_PPU_FLASHSIZE,
+ permittion: PERMITTION_ROM_PROGRAM,
+ argc: 4, compare: SYNTAX_COMPARE_EQ,
+ argv_type: ARGV_TYPE_FLASHSIZE
},{
name: "CPU_COMMAND",
script_opcode: SCRIPT_OPCODE_CPU_COMMAND,
}
};
+static const char *STR_TRANSTYPE[] = {
+ "EMPTY", "TOP", "BOTTOM", "FULL", NULL
+};
+
+static const char *STR_CONSTANTNAME[] = {
+ "C_START", "C_END",
+ "P_START", "P_END", NULL
+};