6 #include "memory_manage.h"
11 #include "reader_master.h"
12 #include "reader_kazzo.h"
13 #include "script_dump.h"
14 #include "flash_device.h"
15 #include "script_program.h"
19 #define PRINTF wprintf
25 static void text_append_va(void *obj, const wgChar *format, va_list list)
28 vwprintf(format, list);
30 vprintf(format, list);
34 static void text_append(void *obj, const wgChar *format, ...)
37 va_start(list, format);
38 text_append_va(obj, format, list);
42 static void log_set(struct textcontrol *log)
45 log->append = text_append;
46 log->append_va = text_append_va;
49 static void except(const wgChar *str)
55 static bool program_rom_set(const wgChar *device, wgChar trans, struct memory *m, struct flash_device *f)
58 if(flash_device_get(device, f) == false){
59 PRINTF(wgT("unknown flash memory device %s\n"), device);
64 m->transtype = TRANSTYPE_FULL;
67 m->transtype = TRANSTYPE_TOP;
70 m->transtype = TRANSTYPE_BOTTOM;
74 m->transtype = TRANSTYPE_EMPTY;
80 static void program(int c, wgChar **v, const struct reader_driver *r)
82 struct program_config config;
83 config.cpu.memory.data = NULL;
84 config.ppu.memory.data = NULL;
87 config.control = &r->control;
88 config.cpu.access = &r->cpu;
89 config.ppu.access = &r->ppu;
90 config.compare = false;
91 config.testrun = false;
94 config.testrun = true;
97 config.compare = true;
102 case 5: {//mode script target cpu_flash_device
103 wgChar trans = wgT('f');
104 if(v[1][1] != wgT('\0')){
107 if(program_rom_set(v[4], trans, &config.cpu.memory, &config.cpu.flash) == false){
110 if(program_rom_set(wgT("dummy"), wgT('e'), &config.ppu.memory, &config.ppu.flash) == false){
115 case 6: { //mode script target cpu_flash_device ppu_flash_device
116 wgChar trans = wgT('f');
117 if(v[1][1] != wgT('\0')){
120 if(program_rom_set(v[4], trans, &config.cpu.memory, &config.cpu.flash) == false){
124 if(v[1][1] != wgT('\0') && v[1][2] != wgT('\0')){
127 if(program_rom_set(v[5], trans, &config.ppu.memory, &config.ppu.flash) == false){
132 PUTS(wgT("mode script target cpu_flash_device ppu_flash_device"));
135 log_set(&config.log);
136 cui_gauge_new(&config.cpu.gauge, wgT("Program Flash"), 2, -2);
137 cui_gauge_new(&config.ppu.gauge, wgT("Charcter Flash"), 1, -1);
138 config.except = except;
139 script_program_execute(&config);
140 cui_gauge_destory(&config.cpu.gauge);
141 cui_gauge_destory(&config.ppu.gauge);
144 static void dump(int c, wgChar **v, const struct reader_driver *r)
146 struct dump_config config;
148 PUTS(wgT("argument error"));
151 config.cpu.increase = 1;
152 config.ppu.increase = 1;
153 config.progress = true;
156 config.mode = MODE_ROM_DUMP;
159 config.mode = MODE_ROM_DUMP;
160 config.progress = false;
162 case wgT('r'): case wgT('R'):
163 config.mode = MODE_RAM_READ;
165 case wgT('w'): case wgT('W'):
166 config.mode = MODE_RAM_WRITE;
171 config.cpu.increase = 2;
174 config.cpu.increase = 4;
177 if(v[1][1] != wgT('\0')){
180 config.ppu.increase = 2;
183 config.ppu.increase = 4;
187 config.script = v[2];
188 config.target = v[3];
189 config.control = &r->control;
190 config.cpu.access = &r->cpu;
191 config.ppu.access = &r->ppu;
192 cui_gauge_new(&config.cpu.gauge, wgT("Program ROM"), 2, -2);
193 cui_gauge_new(&config.ppu.gauge, wgT("Charcter ROM"), 1, -1);
194 config.except = except;
195 config.mappernum = -1;
198 config.mappernum = _wtoi(v[4]);
200 config.mappernum = atoi(v[4]);
203 config.battery = false;
204 log_set(&config.log);
205 if(config.mode == MODE_ROM_DUMP){
206 script_dump_execute(&config);
208 script_workram_execute(&config);
210 cui_gauge_destory(&config.cpu.gauge);
211 cui_gauge_destory(&config.ppu.gauge);
214 static void usage(const wgChar *v)
216 PUTS(wgT("famicom bus simluator 'anago'"));
217 PRINTF(wgT("%s [mode] [script] [target] ....\n"), v);
221 extern const struct reader_driver DRIVER_DUMMY;
225 int main(int c, char **vv)
227 int anago_cui(int c, wgChar **v)
232 const struct reader_driver *r = &DRIVER_KAZZO;
236 v = Malloc(sizeof(wchar_t *) * c);
237 for(i = 0; i < c; i++){
238 size_t len = strlen(vv[i]) + 1;
239 v[i] = Malloc(sizeof(wchar_t) * len);
240 mbstowcs(v[i], vv[i], len);
246 r = &DRIVER_DUMMY; //though down
248 case wgT('f'): case wgT('F'):
252 case wgT('z'): case wgT('R'): case wgT('W'):
253 r = &DRIVER_DUMMY; //though down
255 case wgT('d'): case wgT('D'):
256 case wgT('r'): case wgT('w'):
261 PUTS(wgT("mode are d, D, f, g"));
265 for(i = 0; i < c; i++){
272 size_t len = strlen(vv[0]) + 1;
273 wchar_t *t = Malloc(sizeof(wchar_t) * len);
274 mbstowcs(t, vv[0], len);