#script_flash.o\r
OBJ = anago_gui.o anago_frame.o\r
OBJ += header.o crc32.o file.o widget.o \\r
- script_flash.o script_dump.o script_common.o \\r
+ script_program.o script_dump.o script_common.o \\r
progress.o flash_device.o \\r
reader_kazzo.o usb_device.o squirrel_wrap.o memory_manage.o\r
\r
$(TARGET): $(OBJ) \r
g++ -o $@ $(OBJ) $(LDFLAG) `$(WX_CONFIG) --libs core` -lusb -lsqstdlib -lsquirrel\r
\r
-anago_gui.o: anago_gui.cpp anago_gui.h\r
-anago_frame.o: anago_frame.cpp anago_gui.h\r
+anago.d:\r
+ gcc -MM $(CFLAGS) $(CPPFLAGS) *.c > $@\r
+ g++ -MM $(CFLAGS) $(CXXFLAGS) *.cpp >> $@\r
+\r
+-include anago.d\r
#include "reader_master.h"
#include "reader_kazzo.h"
#include "reader_dummy.h"
-#include "script_flash.h"
+#include "script_program.h"
#include "script_dump.h"
static bool transtype_flash_set(char mode, struct memory *t)
#include <wx/thread.h>
#include <wx/app.h>
#include <cstring>
+#include <cstdarg>
#include "anago_gui.h"
#include "widget.h"
#include "reader_master.h"
#include "header.h"
#include "flash_device.h"
#include "script_dump.h"
-#include "script_flash.h"
+#include "script_program.h"
}
//---- C++ -> C -> C++ wrapping functions ----
g->SetRange(value);
}
-static void text_append(void *log, const char *str)
+static void text_append_va(void *log, const char *format, va_list list)
{
wxTextCtrl *l = static_cast<wxTextCtrl *>(log);
+ wxString str;
+ str.PrintfV(format, list);
+
wxMutexGuiEnter();
*l << str;
wxMutexGuiLeave();
}
-static void label_set(void *label, const char *str)
+static void text_append(void *log, const char *format, ...)
+{
+ va_list list;
+ va_start(list, format);
+ text_append_va(log, format, list);
+ va_end(list);
+}
+
+static void label_set(void *label, const char *format, ...)
{
wxStaticText *l = static_cast<wxStaticText *>(label);
+ wxString str;
+ va_list list;
+
+ va_start(list, format);
+ str.PrintfV(format, list);
+ va_end(list);
+
wxMutexGuiEnter();
l->SetLabel(str);
wxMutexGuiLeave();
anago_frame *m_frame;
struct dump_config m_config;
protected:
- virtual void *Entry(void);
+ void *Entry(void);
+ void OnExit()
+ {
+ delete [] m_config.script;
+ delete [] m_config.target;
+ }
public:
- anago_dumper(anago_frame *f, struct dump_config *d) : wxThread()
+ anago_dumper(anago_frame *f, const struct dump_config *d) : wxThread()
{
m_frame = f;
memcpy(&m_config, d, sizeof(struct dump_config));
anago_frame *m_frame;
struct program_config m_config;
protected:
- virtual void *Entry(void);
+ void *Entry(void);
+ void OnExit()
+ {
+ delete [] m_config.script;
+ delete [] m_config.target;
+ }
public:
- anago_programmer(anago_frame *f, struct program_config *d) : wxThread()
+ anago_programmer(anago_frame *f, const struct program_config *d) : wxThread()
{
m_frame = f;
memcpy(&m_config, d, sizeof(struct program_config));
config.log.object = m_log;
config.log.append = text_append;
+ config.log.append_va = text_append_va;
config.cpu.increase = dump_increase_get(m_dump_cpu_increase);
config.ppu.increase = dump_increase_get(m_dump_ppu_increase);
config.progress = true;
- wxString str_script = m_dump_script_choice->GetStringSelection();
- strncpy(config.script, str_script.fn_str(), DUMP_SCRIPT_STR_LENGTH);
+ config.battery = m_dump_check_battery->GetValue();
+ {
+ wxString str_script = m_dump_script_choice->GetStringSelection();
+ char *t = new char[str_script.Length() + 1];
+ config.script = t;
+ strncpy(t, str_script.fn_str(), str_script.Length() + 1);
+ }
{
wxString str;
}
}
- wxTextCtrl *text = m_dump_romimage_picker->GetTextCtrl();
- wxString str_rom = text->GetValue();
- if(text->IsEmpty() == true){
- *m_log << "Enter filename to ROM image\n";
- return;
+ {
+ wxTextCtrl *text = m_dump_romimage_picker->GetTextCtrl();
+ wxString str_rom = text->GetValue();
+ char *t = new char[str_rom.Length() + 1];
+ if(text->IsEmpty() == true){
+ *m_log << "Enter filename to ROM image\n";
+ return;
+ }
+ config.target = t;
+ strncpy(t, str_rom.fn_str(), str_rom.Length() + 1);
}
- strncpy(config.target, str_rom.fn_str(), DUMP_TARGET_STR_LENGTH);
config.control = &DRIVER_KAZZO.control;
config.cpu.access = &DRIVER_KAZZO.cpu;
config.ppu.access = &DRIVER_KAZZO.ppu;
- config.control->open(&config.handle);
- if(config.handle.handle == NULL){
- *m_log << "reader open error\n";
- return;
- }
+
m_dump_script_choice->Disable();
m_dump_romimage_picker->Disable();
m_dump_check_battery->Disable();
m_dump_cpu_increase->Disable();
m_dump_ppu_increase->Disable();
- config.control->init(&config.handle);
/* if(m_anago_thread != NULL){ //???
delete m_anago_thread;
}*/
}
return true;
}
-#if 1
+
void program_execute(void)
{
struct program_config f;
f.log.object = m_log;
f.log.append = text_append;
+ f.log.append_va = text_append_va;
- wxString str_script = m_program_script_choice->GetStringSelection();
- strncpy(f.script, str_script.fn_str(), PROGRAM_SCRIPT_STR_LENGTH);
+ {
+ wxString str_script = m_program_script_choice->GetStringSelection();
+ char *t = new char[str_script.Length() + 1];
+ strncpy(t, str_script.fn_str(), str_script.Length() + 1);
+ f.script = t;
+ }
- wxTextCtrl *text = m_program_romimage_picker->GetTextCtrl();
- wxString str_rom = text->GetValue();
- if(text->IsEmpty() == true){
- *m_log << "Enter filename to ROM image\n";
- return;
+ {
+ wxTextCtrl *text = m_program_romimage_picker->GetTextCtrl();
+ wxString str_rom = text->GetValue();
+ if(text->IsEmpty() == true){
+ *m_log << "Enter filename to ROM image\n";
+ return;
+ }
+ char *t = new char[str_rom.Length() + 1];
+ strncpy(t, str_rom.fn_str(), str_rom.Length() + 1);
+ f.target = t;
}
- strncpy(f.target, str_rom.fn_str(), PROGRAM_TARGET_STR_LENGTH);
f.compare = m_program_compare->GetValue();
f.testrun = false;
-#if 0
-// if(nesfile_load(__FUNCTION__, f.target, &f.rom) == false){
- if(nesfile_load(__FUNCTION__, str_rom.fn_str(), &f.rom) == false){
- *m_log << str_rom << " open error\n";
- return;
- }
-#endif
+
if(program_rom_set(
m_program_cpu_device->GetStringSelection(),
m_program_cpu_padding->GetSelection(),
f.control = &DRIVER_KAZZO.control;
f.cpu.access = &DRIVER_KAZZO.cpu;
f.ppu.access = &DRIVER_KAZZO.ppu;
- f.control->open(&f.handle);
m_program_script_choice->Disable();
m_program_romimage_picker->Disable();
void *anago_dumper::Entry(void)
{
script_dump_execute(&m_config);
- m_config.control->close(&m_config.handle);
- m_config.handle.handle = NULL;
m_frame->DumpThreadFinish();
return NULL;
}
+++ /dev/null
-#include <stdio.h>
-#include <stdbool.h>
-#include "lua.h"
-#include "lualib.h"
-#include "lauxlib.h"
-#include "type.h"
-#include "header.h"
-#include "reader_master.h"
-#include "script.h"
-
-static struct anago_flash_order{
- int program_count, command_change;
- long address, length;
- long c2aaa, c5555, unit;
- struct memory *memory;
- void (*config)(long c2aaa, long c5555, long unit);
- void (*write)(long address, long length, const uint8_t *data);
- void (*read)(long address, long length, u8 *data);
- void (*erase)(long address, bool dowait);
- long (*program)(long address, long length, u8 *data, bool dowait);
-}order_cpu, order_ppu;
-static inline long long_get(lua_State *t, int index)
-{
- lua_Number d = lua_tonumber(t, index);
- return (long) d;
-}
-static void command_set(lua_State *l, struct anago_flash_order *t)
-{
- long command = long_get(l, 1);
- long address = long_get(l, 2);
- long mask = long_get(l, 3);
- long d = command & (mask - 1);
- d |= address;
- switch(command){
- case 0x02aa: case 0x2aaa:
- t->c2aaa = d;
- break;
- case 0x0555: case 0x5555:
- t->c5555 = d;
- break;
- default:
- puts("unknown command address");
- return;
- }
- t->command_change += 1;
-}
-static int cpu_command(lua_State *l)
-{
- command_set(l, &order_cpu);
- return 0;
-}
-static int ppu_command(lua_State *l)
-{
- command_set(l, &order_ppu);
- return 0;
-}
-static int write(lua_State *l, struct anago_flash_order *t)
-{
- long address = long_get(l, 1);
- long data = long_get(l, 2);
- uint8_t d8 = (uint8_t) data;
- t->write(address, 1, &d8);
- return 0;
-}
-static int cpu_write(lua_State *l)
-{
- return write(l, &order_cpu);
-}
-static int program_regist(lua_State *l, const char *name, struct anago_flash_order *t)
-{
- t->address = long_get(l, 1);
- t->length = long_get(l, 2);
- if(t->command_change != 0){
- t->config(t->c2aaa, t->c5555, t->unit);
- t->command_change = 0;
- }
-
- printf("programming %s area 0x%06x...\n", name, t->memory->offset);
- fflush(stdout);
- return lua_yield(l, 0);
-}
-static void program_execute(struct anago_flash_order *t)
-{
- if(t->program_count == 0){
- t->erase(t->c2aaa, false);
- t->program_count += 1;
- printf("erase...\n");
- fflush(stdout);
- return;
- }
- t->program_count += 1;
-// printf("writing %06x\n", t->memory->offset);
-// fflush(stdout);
- const long w = t->program(t->address, t->length, t->memory->data + t->memory->offset, false);
- t->address += w;
- t->length -= w;
- t->memory->offset += w;
-}
-static int cpu_program(lua_State *l)
-{
- return program_regist(l, "program ROM", &order_cpu);
-}
-static int ppu_program(lua_State *l)
-{
- return program_regist(l, "charcter ROM", &order_ppu);
-}
-static int mmc1_write(lua_State *l)
-{
- long address = long_get(l, 1);
- uint8_t data = (uint8_t) long_get(l, 2);
- int i = 5;
- while(i != 0){
- order_cpu.write(address, 1, &data);
- data >>= 1;
- i--;
- }
- return 0;
-}
-
-void script_execute(struct config *c)
-{
- order_cpu.command_change = 0;
- order_cpu.program_count = 0;
- order_cpu.unit = c->flash_cpu->pagesize;
- order_cpu.memory = &c->rom.cpu_rom;
- order_cpu.config = c->reader->cpu_flash_config;
- order_cpu.write = c->reader->cpu_write_6502;
- order_cpu.read = c->reader->cpu_read;
- order_cpu.erase = c->reader->cpu_flash_erase;
- order_cpu.program = c->reader->cpu_flash_program;
-
- order_ppu.command_change = 0;
- order_ppu.program_count = 0;
- order_ppu.unit = c->flash_ppu->pagesize;
- order_ppu.memory = &c->rom.ppu_rom;
- order_ppu.config = c->reader->ppu_flash_config;
- order_ppu.write = c->reader->ppu_write; //warning ¤Ï̵»ë
- order_ppu.read = c->reader->ppu_read;
- order_ppu.erase = c->reader->ppu_flash_erase;
- order_ppu.program = c->reader->ppu_flash_program;
-
- lua_State *const l = lua_open();
- luaL_openlibs(l);
- lua_register(l, "cpu_write", cpu_write);
- lua_register(l, "cpu_program", cpu_program);
- lua_register(l, "cpu_command", cpu_command);
- lua_register(l, "ppu_program", ppu_program);
- lua_register(l, "ppu_command", ppu_command);
- lua_register(l, "mmc1_write", mmc1_write);
- if(luaL_loadfile(l, c->script) == LUA_ERRFILE){
- lua_close(l);
- return;
- }
- if(lua_pcall(l, 0, 0, 0) != 0){
- puts(lua_tostring(l, -1));
- return;
- }
- lua_getfield(l, LUA_GLOBALSINDEX, "initalize");
- lua_getglobal(l, "initalize");
- lua_call(l, 0, 0);
- lua_State *const co_cpu = lua_newthread(l);
- lua_State *const co_ppu = lua_newthread(l);
- lua_getglobal(co_cpu, "program_cpu");
- lua_getglobal(co_ppu, "program_ppu");
- int state_cpu = LUA_YIELD, state_ppu = LUA_YIELD;
- if(order_cpu.memory->size == 0 || c->flash_cpu->id_device == FLASH_ID_DEVICE_DUMMY){
- state_cpu = 0;
- }
- if(order_ppu.memory->size == 0 || c->flash_ppu->id_device == FLASH_ID_DEVICE_DUMMY){
- state_ppu = 0;
- }
- if(state_cpu != 0){
- state_cpu = lua_resume(co_cpu, 0);
- }
- if(state_ppu != 0){
- state_ppu = lua_resume(co_ppu, 0);
- }
- do{
- uint8_t s[2];
- Sleep(2);
- c->reader->flash_status(s);
- if(state_cpu != 0 && s[0] == 0){
- if(order_cpu.length == 0){
- state_cpu = lua_resume(co_cpu, 0);
- }else{
- program_execute(&order_cpu);
- }
- }
- if(state_ppu != 0 && s[1] == 0){
- if(order_ppu.length == 0){
- state_ppu = lua_resume(co_ppu, 0);
- }else{
- program_execute(&order_ppu);
- }
- }
- }while(state_cpu != 0 || state_ppu != 0);
- lua_close(l);
-}
#include <assert.h>
-#include <stdio.h>
#include <squirrel.h>
#include <sqstdio.h>
#include <sqstdaux.h>
#include "type.h"
#include "squirrel_wrap.h"
+#include "reader_master.h"
+#include "widget.h"
#include "script_common.h"
SQInteger script_nop(HSQUIRRELVM v)
SQInteger range_check(HSQUIRRELVM v, const char *name, long target, const struct range *range)
{
if((target < range->start) || (target > range->end)){
- printf("%s range must be 0x%06x to 0x%06x", name, (int) range->start, (int) range->end);
+ SQPRINTFUNCTION f = sq_getprintfunc(v);
+ f(v, "%s range must be 0x%06x to 0x%06x", name, (int) range->start, (int) range->end);
return sq_throwerror(v, "script logical error");
}
return 0;
}
return 0;
}
+
+static bool connection_check_main(const int *h, const struct textcontrol *text, const struct reader_memory_access *m, long address)
+{
+ const int size = 0x10;
+ uint8_t test1[size], test_m[size];
+ int i;
+
+ m->memory_read(h, &GAUGE_DUMMY, address, size, test1);
+ for(i = 0; i < 3; i++){
+ m->memory_read(h, &GAUGE_DUMMY, address, size, test_m);
+ if(memcmp(test1, test_m, size) != 0){
+ text->append(text->object, "maybe cartridge connection error\n");
+ return false;
+ }
+ }
+ return true;
+}
+bool connection_check(const int *h, const struct textcontrol *text, const struct reader_memory_access *cpu, const struct reader_memory_access *ppu)
+{
+ if(connection_check_main(h, text, cpu, 0xf000) == false){
+ return false;
+ }
+ if(connection_check_main(h, text, ppu, 0x0000) == false){
+ return false;
+ }
+ return true;
+}
SQInteger range_check(HSQUIRRELVM v, const char *name, long target, const struct range *range);
SQInteger cpu_write_check(HSQUIRRELVM v);
SQInteger script_require(HSQUIRRELVM v);
+
+struct reader_handle;
+struct reader_memory_access;
+bool connection_check(const int *h, const struct textcontrol *text, const struct reader_memory_access *cpu, const struct reader_memory_access *ppu);
#endif
#include "script_common.h"
#include "script_dump.h"
-static SQInteger write_memory(HSQUIRRELVM v, const struct reader_handle *h, struct dump_memory_driver *t)
+static SQInteger write_memory(HSQUIRRELVM v, const int *h, struct dump_memory_driver *t)
{
long address, data;
SQRESULT r = qr_argument_get(v, 2, &address, &data);
if(SQ_FAILED(r)){
return r;
}
- return write_memory(v, &d->handle, &d->cpu);
+ return write_memory(v, d->handle, &d->cpu);
}
//¤³¤³¤Î printf ¤Ï debug ÍѤ˻Ĥ·¤Æ¤ª¤¯
fflush(stdout);
}
-static SQInteger read_memory(HSQUIRRELVM v, const struct reader_handle *h, struct dump_memory_driver *t, bool progress)
+static SQInteger read_memory(HSQUIRRELVM v, const int *h, struct dump_memory_driver *t, bool progress)
{
long address, length;
SQRESULT r = qr_argument_get(v, 2, &address, &length);
buffer_show(&t->memory, length);
}
t->memory.offset += length;
- //progress_show(t);
return 0;
}
if(SQ_FAILED(r)){
return r;
}
- r = read_memory(v, &d->handle, &d->cpu, d->progress);
+ r = read_memory(v, d->handle, &d->cpu, d->progress);
return r;
}
if(SQ_FAILED(r)){
return r;
}
- r = read_memory(v, &d->handle, &d->ppu, d->progress);
+ r = read_memory(v, d->handle, &d->ppu, d->progress);
return r;
}
if(SQ_FAILED(r)){
return r;
}
- p->access->memory_write(&d->handle, testaddress, testsize, test_val);
- p->access->memory_read(&d->handle, &GAUGE_DUMMY, testaddress, testsize, test_result);
+ p->access->memory_write(d->handle, testaddress, testsize, test_val);
+ p->access->memory_read(d->handle, &GAUGE_DUMMY, testaddress, testsize, test_result);
if(memcmp(test_val, test_result, testsize) != 0){
sq_pushbool(v, SQFalse);
return 1;
}
- p->access->memory_write(&d->handle, testaddress, testsize, test_str);
- p->access->memory_read(&d->handle, &GAUGE_DUMMY, testaddress, testsize, test_result);
+ p->access->memory_write(d->handle, testaddress, testsize, test_str);
+ p->access->memory_read(d->handle, &GAUGE_DUMMY, testaddress, testsize, test_result);
if(memcmp(test_str, test_result, testsize) != 0){
sq_pushbool(v, SQFalse);
return 1;
{
d->memory.offset = 0;
d->memory.data = Malloc(d->memory.size);
- d->gauge.value_set(d->gauge.bar, d->gauge.label, 0);
d->gauge.range_set(d->gauge.bar, d->memory.size);
-// d->gauge.label_set(d->gauge.label, d->memory.name);
+ d->gauge.value_set(d->gauge.bar, d->gauge.label, 0);
}
//test »þ/1ÅÙÌܤΠcall ¤Ç»ÈÍÑ
if(SQ_FAILED(r)){
return r;
}
-/* d->cpu.memory.offset = 0;
- d->cpu.memory.data = Malloc(d->cpu.memory.size);
- d->cpu.gauge->value_set(0);
- d->cpu.gauge->range_set(d->cpu.gauge->object, d->cpu.memory.size);
- d->ppu.memory.offset = 0;
- d->ppu.memory.data = Malloc(d->ppu.memory.size);
- d->cpu.gauge->value_set(0);
- d->ppu.gauge->range_set(d->ppu.gauge->object, d->ppu.memory.size);*/
+
memory_new_init(&d->cpu);
memory_new_init(&d->ppu);
return 0;
image.ppu_rom = d->ppu.memory;
image.mirror = MIRROR_PROGRAMABLE;
if(mirrorfind == 1){
- if(d->control->vram_connection(&d->handle) == 0x05){
+ if(d->control->vram_connection(d->handle) == 0x05){
image.mirror = MIRROR_VERTICAL;
}else{
image.mirror = MIRROR_HORIZONAL;
}
}
image.backupram = 0;
+ if(d->battery == true){
+ image.backupram = 1;
+ }
nesfile_create(&d->log, &image, d->target);
nesbuffer_free(&image, 0); //0 is MODE_xxx_xxxx
if(d->cpu.memory.size != d->cpu.read_count){
cpu = false;
}
- char str[80];
if(cpu == false){
- snprintf(str, 80, "cpu_romsize is not connected 0x%06x/0x%06x\n", (int) d->cpu.read_count, (int) d->cpu.memory.size);
- d->log.append(d->log.object, str);
+ d->log.append(d->log.object, "cpu_romsize is not connected 0x%06x/0x%06x\n", (int) d->cpu.read_count, (int) d->cpu.memory.size);
}
if(d->ppu.memory.size != d->ppu.read_count){
ppu = false;
}
if(ppu == false){
- snprintf(str, 80, "ppu_romsize is not connected 0x%06x/0x%06x\n", (int) d->ppu.read_count, (int) d->ppu.memory.size);
- d->log.append(d->log.object, str);
+ d->log.append(d->log.object, "ppu_romsize is not connected 0x%06x/0x%06x\n", (int) d->ppu.read_count, (int) d->ppu.memory.size);
}
if(cpu == false || ppu == false){
r = sq_throwerror(v, "script logical error");
return r;
}
-static SQInteger read_count(HSQUIRRELVM v, struct textcontrol *l, struct dump_memory_driver *t, const struct range *range_address, const struct range *range_length)
+static SQInteger read_count(HSQUIRRELVM v, const struct textcontrol *l, struct dump_memory_driver *t, const struct range *range_address, const struct range *range_length)
{
long address, length;
SQRESULT r = qr_argument_get(v, 2, &address, &length);
return r;
}
if((address < range_address->start) || ((address + length) > range_address->end)){
- char str[80];
- snprintf(str, 80, "address range must be 0x%06x to 0x%06x", (int) range_address->start, (int) range_address->end);
- l->append(l->object, str);
+ l->append(l->object, "address range must be 0x%06x to 0x%06x", (int) range_address->start, (int) range_address->end);
return sq_throwerror(v, "script logical error");;
}
t->read_count += length;
return read_count(v, &d->log, &d->ppu, &range_address, &range_length);
}
+static SQInteger memory_size_set(HSQUIRRELVM v)
+{
+ struct dump_config *d;
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
+ if(SQ_FAILED(r)){
+ return r;
+ }
+ r = qr_argument_get(v, 2, &d->cpu.memory.size, &d->ppu.memory.size);
+ return r;
+}
+
static bool script_execute(HSQUIRRELVM v, struct dump_config *d)
{
bool ret = true;
d->log.append(d->log.object, "dump core script error\n");
ret = false;
}else if(SQ_FAILED(sqstd_dofile(v, _SC(d->script), SQFalse, SQTrue))){
- char str[80];
- snprintf(str, 80, "%s open error\n", d->script);
- d->log.append(d->log.object, str);
+ d->log.append(d->log.object, "%s open error\n", d->script);
ret = false;
}else{
SQRESULT r = qr_call(
}
return ret;
}
-void script_dump_execute(struct dump_config *d)
+
+static void dump_memory_driver_init(struct dump_memory_driver *dd)
{
- struct dump_memory_driver *dd = &d->cpu;
- dd->memory.name = "Program";
dd->memory.size = 0;
dd->memory.offset = 0;
dd->memory.attribute = MEMORY_ATTR_WRITE;
dd->memory.transtype = TRANSTYPE_FULL;
dd->memory.data = NULL;
dd->read_count = 0;
+}
+
+void script_dump_execute(struct dump_config *d)
+{
+ dump_memory_driver_init(&d->cpu);
+ d->cpu.memory.name = "Program";
- dd = &d->ppu;
- dd->memory.name = "Charcter";
- dd->memory.size = 0;
- dd->memory.offset = 0;
- dd->memory.attribute = MEMORY_ATTR_WRITE;
- dd->memory.transtype = TRANSTYPE_FULL;
- dd->memory.data = NULL;
- dd->read_count = 0;
+ dump_memory_driver_init(&d->ppu);
+ d->ppu.memory.name = "Charcter";
{
HSQUIRRELVM v = qr_open(&d->log);
qr_function_register_global(v, "ppu_ramfind", script_nop);
qr_function_register_global(v, "cpu_write", cpu_write_check);
- qr_function_register_global(v, "memory_new", memory_new);
+ qr_function_register_global(v, "memory_new", memory_size_set);
qr_function_register_global(v, "nesfile_save", length_check);
qr_function_register_global(v, "cpu_read", cpu_read_count);
qr_function_register_global(v, "ppu_read", ppu_read_count);
}
qr_close(v);
}
- if(d->progress == true){
+/* if(d->progress == true){
progress_init();
+ }*/
+ d->handle = d->control->open();
+ if(d->handle == NULL){
+ d->log.append(d->log.object, "reader open error\n");
+ return;
+ }
+ d->control->init(d->handle);
+ if(connection_check(d->handle, &d->log, d->cpu.access, d->ppu.access) == false){
+ return;
}
{
HSQUIRRELVM v = qr_open(&d->log);
- qr_function_register_global(v, "memory_new", script_nop);
+ qr_function_register_global(v, "memory_new", memory_new);
qr_function_register_global(v, "nesfile_save", nesfile_save);
qr_function_register_global(v, "cpu_write", cpu_write);
qr_function_register_global(v, "cpu_read", cpu_read);
script_execute(v, d);
qr_close(v);
}
+ d->control->close(d->handle);
+ d->handle = NULL;
}
#ifndef _SCRIPT_DUMP_H_
#define _SCRIPT_DUMP_H_
-enum{
- DUMP_SCRIPT_STR_LENGTH = 20,
- DUMP_TARGET_STR_LENGTH = 50
-};
struct dump_config{
- char script[DUMP_SCRIPT_STR_LENGTH];
- char target[DUMP_TARGET_STR_LENGTH];
- struct reader_handle handle;
+ const char *script;
+ const char *target;
+ const int *handle;
const struct reader_control *control;
struct dump_memory_driver{
const struct reader_memory_access *access;
struct gauge gauge;
}cpu, ppu;
long mappernum;
- //struct romimage rom;
bool progress;
+ bool battery;
struct textcontrol log;
};
void script_dump_execute(struct dump_config *c);
#include <assert.h>
-#include <stdio.h>
#include <string.h>
#include <squirrel.h>
#include <sqstdio.h>
#include "flash_device.h"
#include "progress.h"
#include "script_common.h"
-#include "script_flash.h"
+#include "script_program.h"
static SQInteger vram_mirrorfind(HSQUIRRELVM v)
{
}
return command_set(v, &d->ppu);
}
-static SQInteger write_memory(HSQUIRRELVM v, const struct reader_handle *h, struct flash_memory_driver *t)
+static SQInteger write_memory(HSQUIRRELVM v, const int *h, struct flash_memory_driver *t)
{
long address, data;
SQRESULT r = qr_argument_get(v, 2, &address, &data);
if(SQ_FAILED(r)){
return r;
}
- return write_memory(v, &d->handle, &d->cpu);
+ return write_memory(v, d->handle, &d->cpu);
}
-static SQInteger erase_set(HSQUIRRELVM v, const struct reader_handle *h, struct flash_memory_driver *t, struct textcontrol *log)
+static SQInteger erase_set(HSQUIRRELVM v, const int *h, struct flash_memory_driver *t, struct textcontrol *log)
{
t->access->flash_config(h, t->c000x, t->c2aaa, t->c5555, t->flash.pagesize, t->flash.retry);
t->command_change = false;
if(t->flash.erase_require == true){
t->access->flash_erase(h, t->c2aaa, false);
t->gauge.label_set(t->gauge.label, "erasing...");
- fflush(stdout);
}
return 0;
}
if(SQ_FAILED(r)){
return r;
}
- return erase_set(v, &d->handle, &d->cpu, &d->log);
+ return erase_set(v, d->handle, &d->cpu, &d->log);
}
static SQInteger ppu_erase(HSQUIRRELVM v)
{
if(SQ_FAILED(r)){
return r;
}
- return erase_set(v, &d->handle, &d->ppu, &d->log);
+ return erase_set(v, d->handle, &d->ppu, &d->log);
}
-static SQInteger program_regist(HSQUIRRELVM v, const struct reader_handle *h, struct flash_memory_driver *t)
+static SQInteger program_regist(HSQUIRRELVM v, const int *h, struct flash_memory_driver *t)
{
SQRESULT r = qr_argument_get(v, 2, &t->programming.address, &t->programming.length);
if(SQ_FAILED(r)){
fflush(stdout);*/
return sq_suspendvm(v);
}
-static void program_execute(const struct reader_handle *h, struct flash_memory_driver *t)
+static void program_execute(const int *h, struct flash_memory_driver *t)
{
const long w = t->access->flash_program(
h, &t->gauge,
t->programming.offset += w;
}
-static bool program_compare(const struct reader_handle *h, struct flash_memory_driver *t)
+static bool program_compare(const int *h, struct flash_memory_driver *t)
{
uint8_t *comparea = Malloc(t->compare.length);
bool ret = false;
if(SQ_FAILED(r)){
return r;
}
- return program_regist(v, &d->handle, &d->cpu);
+ return program_regist(v, d->handle, &d->cpu);
}
static SQInteger ppu_program_memory(HSQUIRRELVM v)
{
if(SQ_FAILED(r)){
return r;
}
- return program_regist(v, &d->handle, &d->ppu);
+ return program_regist(v, d->handle, &d->ppu);
}
-static long erase_timer_get(const struct reader_handle *h, struct flash_memory_driver *t)
+static long erase_timer_get(const int *h, struct flash_memory_driver *t)
{
if(
(t->memory.transtype != TRANSTYPE_EMPTY) &&
return r;
}
if(0){
- long timer_wait = erase_timer_get(&d->handle, &d->cpu);
- long timer_ppu = erase_timer_get(&d->handle, &d->ppu);
+ long timer_wait = erase_timer_get(d->handle, &d->cpu);
+ long timer_ppu = erase_timer_get(d->handle, &d->ppu);
if(timer_wait < timer_ppu){
timer_wait = timer_ppu;
}
uint8_t s[2];
do{
wait(2);
- d->control->flash_status(&d->handle, s);
+ d->control->flash_status(d->handle, s);
//ËÜÍè¤Î°Õ¿Þ¤«¤é¤Ç¤Ï¤³¤³¤Î¾ò·ï¼°¤Ï && ¤Ç¤Ï¤Ê¤¯ || ¤À¤¬¡¢Àè¤Ë erase ¤¬½ª¤ï¤Ã¤¿¥Ç¥Ð¥¤¥¹¤¬Æ°¤«¤»¤ë¤Î¤Ç»Ä¤·¤Æ¤ª¤¯
}while((s[0] != KAZZO_TASK_FLASH_IDLE) && (s[1] != KAZZO_TASK_FLASH_IDLE));
}
}
}
-static bool program_memoryarea(HSQUIRRELVM co, const struct reader_handle *h, struct flash_memory_driver *t, bool compare, SQInteger *state, struct textcontrol *log)
+static bool program_memoryarea(HSQUIRRELVM co, const int *h, struct flash_memory_driver *t, bool compare, SQInteger *state, struct textcontrol *log)
{
if(t->programming.length == 0){
if(t->programming.offset != 0 && compare == true){
if(program_compare(h, t) == false){
- char str[80];
- snprintf(str, 80, "%s memory compare error\n", t->memory.name);
- log->append(log->object, str);
+ log->append(log->object, "%s memory compare error\n", t->memory.name);
return false;
}
}
SQInteger state_ppu = sq_getvmstate(co_ppu);
const long sleepms = d->compare == true ? 6 : 2; //W29C040 ¤Ç compare ¤ò¤¹¤ë¤È¡¢error ¤¬½Ð¤ë¤Î¤Ç½Ð¤Ê¤¤ÃͤËÄ´À° (¤ä¤Ã¤Ä¤±Âбþ)
- //progress_init();
gauge_init(&d->cpu);
gauge_init(&d->ppu);
while((state_cpu != SQ_VMSTATE_IDLE) || (state_ppu != SQ_VMSTATE_IDLE)){
uint8_t s[2];
// bool console_update = false;
wait(sleepms);
- d->control->flash_status(&d->handle, s);
+ d->control->flash_status(d->handle, s);
if(state_cpu != SQ_VMSTATE_IDLE && s[0] == KAZZO_TASK_FLASH_IDLE){
- if(program_memoryarea(co_cpu, &d->handle, &d->cpu, d->compare, &state_cpu, &d->log) == false){
+ if(program_memoryarea(co_cpu, d->handle, &d->cpu, d->compare, &state_cpu, &d->log) == false){
return 0;
}
}
if(state_ppu != SQ_VMSTATE_IDLE && s[1] == KAZZO_TASK_FLASH_IDLE){
- if(program_memoryarea(co_ppu, &d->handle, &d->ppu, d->compare, &state_ppu, &d->log) == false){
+ if(program_memoryarea(co_ppu, d->handle, &d->ppu, d->compare, &state_ppu, &d->log) == false){
return 0;
}
}
-/* if((console_update == true) && (d->testrun == false)){
- gauge_update("CPU", &d->order_cpu);
- gauge_update("PPU", &d->order_ppu);
- }*/
}
return 0;
}
return r;
}
if((t->programming.address < range_address->start) || ((t->programming.address + t->programming.length) > range_address->end)){
- char str[80];
- snprintf(str, 80, "address range must be 0x%06x to 0x%06x", (int) range_address->start, (int) range_address->end - 1);
- log->append(log->object, str);
+ log->append(log->object, "address range must be 0x%06x to 0x%06x", (int) range_address->start, (int) range_address->end - 1);
return sq_throwerror(v, "script logical error");;
}
t->programming.count += t->programming.length;
c->log.append(c->log.object, "flash core script error\n");
ret = false;
}else if(SQ_FAILED(sqstd_dofile(v, _SC(c->script), SQFalse, SQTrue))){
- char str[80];
-
- snprintf(str, 80, "%s open error\n", c->script);
- c->log.append(c->log.object, str);
+ c->log.append(c->log.object, "%s open error\n", c->script);
ret = false;
}else{
SQRESULT r = qr_call(
}
qr_close(v);
assert(c->cpu.memory.size != 0);
- char str[80];
+
if(c->cpu.programming.count % c->cpu.memory.size != 0){
- snprintf(str, 80, "logical error: cpu_programsize is not connected 0x%06x/0x%06x\n", (int) c->cpu.programming.count, (int) c->cpu.memory.size);
- c->log.append(c->log.object, str);
+ c->log.append(c->log.object, "logical error: cpu_programsize is not connected 0x%06x/0x%06x\n", (int) c->cpu.programming.count, (int) c->cpu.memory.size);
return;
}
if(c->ppu.memory.size != 0){
if(c->ppu.programming.count % c->ppu.memory.size != 0){
- snprintf(str, 80, "logical error: ppu_programsize is not connected 0x%06x/0x%06x\n", (int) c->ppu.programming.count, (int) c->ppu.memory.size);
- c->log.append(c->log.object, str);
+ c->log.append(c->log.object, "logical error: ppu_programsize is not connected 0x%06x/0x%06x\n", (int) c->ppu.programming.count, (int) c->ppu.memory.size);
return;
}
}
{
//rom image load
struct romimage rom;
- if(nesfile_load(__FUNCTION__, c->target, &rom) == false){
+ if(nesfile_load(&c->log, c->target, &rom) == false){
c->log.append(c->log.object, "ROM image open error");
return;
}
return;
}
//reader initalize
- c->control->open(&c->handle);
- if(c->handle.handle == NULL){
+ c->handle = c->control->open();
+ if(c->handle == NULL){
c->log.append(c->log.object, "reader open error\n");
- }else{
+ nesbuffer_free(&rom, 0);
+ return;
+ }
//program start, reader finalize
- zendan(c);
- c->control->close(&c->handle);
- c->handle.handle = NULL;
+ if(connection_check(c->handle, &c->log, c->cpu.access, c->ppu.access) == false){
+ nesbuffer_free(&rom, 0);
+ return;
}
+ zendan(c);
+ c->control->close(c->handle);
+ c->handle = NULL;
nesbuffer_free(&rom, 0);
}
#ifndef _SCRIPT_PROGRAM_H_
#define _SCRIPT_PROGRAM_H_
-enum{
- PROGRAM_SCRIPT_STR_LENGTH = 20,
- PROGRAM_TARGET_STR_LENGTH = 80
-};
struct program_config{
- char script[PROGRAM_SCRIPT_STR_LENGTH];
- char target[PROGRAM_TARGET_STR_LENGTH];
- struct reader_handle handle;
+ const char *script;
+ const char *target;
+ const int *handle;
const struct reader_control *control;
struct flash_memory_driver{
const struct reader_memory_access *access;
static void print_other(HSQUIRRELVM v, const SQChar *s, ...)
{
va_list arglist;
+ const struct textcontrol *p = (const struct textcontrol *) sq_getforeignptr(v);
va_start(arglist, s);
- char str[80];
-
- vsnprintf(str, 80, s, arglist);
- struct textcontrol *p = (struct textcontrol *) sq_getforeignptr(v);
- p->append(p->object, str);
+ p->append_va(p->object, s, arglist);
va_end(arglist);
}
-HSQUIRRELVM qr_open(struct textcontrol *p)
+HSQUIRRELVM qr_open(const struct textcontrol *p)
{
HSQUIRRELVM v = sq_open(0x400);
sqstd_seterrorhandlers(v);
if(r->mirror == MIRROR_VERTICAL){
header[6] |= 0x01;
}
- if((r->cpu_ram.size != 0) || (r->backupram != 0)){
+ if((r->cpu_ram.size != 0) || (r->backupram == true)){
header[6] |= 0x02;
}
//4 screen ¤Ï̵»ë
/*
returnÃÍ: error count
*/
-static int mirroring_fix(struct textcontrol *l, struct memory *m, long min)
+static int mirroring_fix(const struct textcontrol *l, struct memory *m, long min)
{
- char str[80];
long mirror_size = m->size / 2;
while(mirror_size >= min){
const u8 *halfbuf;
if(memcmp(m->data, halfbuf, mirror_size) != 0){
const long ret = mirror_size * 2;
if(m->size != ret){
- snprintf(str, 80, "mirroring %s rom fixed\n", m->name);
- l->append(l->object, str);
+ l->append(l->object, "mirroring %s ROM fixed\n", m->name);
m->size = ret;
}
return 0;
l->append(l->object, "error: data is all 0xff\n");
ret = 1;
}else if(m->size != min){
- snprintf(str, 80, "mirroring %s rom fixed\n", m->name);
- l->append(l->object, str);
+ l->append(l->object, "mirroring %s ROM fixed\n", m->name);
m->size = min;
}
Free(ffdata);
}
//hash ¤Ï sha1 ¤Ë¤·¤¿¤¤¤¬Â¾¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ë¤¢¤ï¤»¤Æ crc32 ¤Ë¤·¤È¤¯
-static void rominfo_print(struct textcontrol *l, const struct memory *m)
+static void rominfo_print(const struct textcontrol *l, const struct memory *m)
{
- char str[80];
if(m->size != 0){
const uint32_t crc = crc32_get(m->data, m->size);
- snprintf(str, 80, "%s ROM: size 0x%06x, crc32 0x%08x\n", m->name, m->size, (const int) crc);
+ l->append(l->object, "%s ROM: size 0x%06x, crc32 0x%08x\n", m->name, m->size, (const int) crc);
}else{
- snprintf(str, 80, "%s RAM\n", m->name);
+ l->append(l->object, "%s RAM\n", m->name);
}
- l->append(l->object, str);
}
-void nesfile_create(struct textcontrol *l, struct romimage *r, const char *romfilename)
+void nesfile_create(const struct textcontrol *l, struct romimage *r, const char *romfilename)
{
int error = 0;
//RAM adapter bios size 0x2000 ¤ÏÊѹ¹¤·¤Ê¤¤
return;
}
//½¤ÀµºÑ¤ß ROM ¾ðÊóɽ¼¨
- {
- char str[80];
- snprintf(str, 80, "%s, mapper %d\n", romfilename, (int) r->mappernum);
- l->append(l->object, str);
- }
+ l->append(l->object, "%s, mapper %d\n", romfilename, (int) r->mappernum);
rominfo_print(l, &(r->cpu_rom));
rominfo_print(l, &(r->ppu_rom));
}
//flashmemory device capacity check ¤¬È´¤±¤Æ¤ë¤±¤É¤É¤³¤Ç¤ä¤ë¤«Ì¤Äê
-bool nesfile_load(const char *errorprefix, const char *file, struct romimage *r)
+bool nesfile_load(const struct textcontrol *l, const char *file, struct romimage *r)
{
int imagesize;
u8 *buf;
buf = buf_load_full(file, &imagesize);
if(buf == NULL || imagesize < (NES_HEADER_SIZE + PROGRAM_ROM_MIN)){
- printf("%s ROM image open error\n", errorprefix);
+// printf("%s ROM image open error\n", errorprefix);
return false;
}
//nes header check
if(memcmp(buf, NES_HEADER_INIT, 4) != 0){
- printf("%s NES header identify error\n", errorprefix);
+ l->append(l->object, "NES header identify error\n");
Free(buf);
return false;
}
{
long mapper = (buf[6] >> 4) & 0x0f;
mapper |= buf[7] & 0xf0;
-#if ANAGO == 1
r->mappernum = mapper;
-#else
- if(r->mappernum != mapper){
- printf("%s NES header mapper error\n", errorprefix);
- Free(buf);
- return false;
- }
-#endif
}
//NES/CPU/PPU imagesize check
long cpusize, ppusize;
r->ppu_rom.size = ppusize;
//NESfilesize
if(offset != imagesize){
- printf("%s NES header filesize error\n", errorprefix);
+ l->append(l->object, "NES header filesize error\n");
Free(buf);
return false;
}
void nesheader_set(const struct romimage *r, uint8_t *header);
#endif
bool nesbuffer_malloc(struct romimage *r, int mode);
-void nesfile_create(struct textcontrol *l, struct romimage *r, const char *romfilename);
+void nesfile_create(const struct textcontrol *l, struct romimage *r, const char *romfilename);
void nesbuffer_free(struct romimage *r, int mode);
void backupram_create(const struct memory *r, const char *ramfilename);
int memorysize_check(const long size, int region);
-bool nesfile_load(const char *errorprefix, const char *file, struct romimage *r);
+bool nesfile_load(const struct textcontrol *l, const char *file, struct romimage *r);
#endif
return NULL;
}
-static void kazzo_open(struct reader_handle *h)
+static const int *kazzo_open(void)
{
- h->handle = device_open();
+ return (const int *) device_open();
}
-static void kazzo_close(struct reader_handle *h)
+static void kazzo_close(const int *h)
{
- usb_close(h->handle);
+ usb_close((usb_dev_handle *) h);
}
enum{
TIMEOUT = 4000
exit(1);
}
}
-static void read_main(const struct reader_handle *d, const struct gauge *g, const enum request r, enum index index, long address, long length, uint8_t *data)
+static void read_main(const int *d, const struct gauge *g, const enum request r, enum index index, long address, long length, uint8_t *data)
{
const int packet = READ_PACKET_SIZE;
while(length >= packet){
device_read(
- (usb_dev_handle *) d->handle,
+ (usb_dev_handle *) d,
r, index, address, packet, data
);
data += packet;
}
if(length != 0){
device_read(
- (usb_dev_handle *) d->handle,
+ (usb_dev_handle *) d,
r, index, address, length, data
);
g->value_add(g->bar, g->label, packet);
}
}
-static void kazzo_cpu_read(const struct reader_handle *d, const struct gauge *g, long address, long length, uint8_t *data)
+static void kazzo_cpu_read(const int *d, const struct gauge *g, long address, long length, uint8_t *data)
{
read_main(d, g, REQUEST_CPU_READ, INDEX_IMPLIED, address, length, data);
// read_main(REQUEST_CPU_READ_6502, address, length, data);
}
-static void kazzo_ppu_read(const struct reader_handle *d, const struct gauge *g, long address, long length, uint8_t *data)
+static void kazzo_ppu_read(const int *d, const struct gauge *g, long address, long length, uint8_t *data)
{
read_main(d, g, REQUEST_PPU_READ, INDEX_IMPLIED, address, length, data);
}
Free(d);
}
-static void kazzo_init(const struct reader_handle *d)
+static void kazzo_init(const int *d)
{
- device_write((usb_dev_handle *) d->handle, REQUEST_PHI2_INIT, INDEX_IMPLIED, 0, 0, NULL);
+ device_write((usb_dev_handle *) d, REQUEST_PHI2_INIT, INDEX_IMPLIED, 0, 0, NULL);
}
-static void write_memory(const struct reader_handle *d, enum request r, long address, long length, const uint8_t *data)
+static void write_memory(const int *d, enum request r, long address, long length, const uint8_t *data)
{
while(length != 0){
long l = length >= FLASH_PACKET_SIZE ? FLASH_PACKET_SIZE : length;
- device_write((usb_dev_handle *) d->handle, r, INDEX_IMPLIED, address, l, data);
+ device_write((usb_dev_handle *) d, r, INDEX_IMPLIED, address, l, data);
address += l;
data += l;
length -= l;
}
}
-static void kazzo_cpu_write_6502(const struct reader_handle *d, long address, long length, const uint8_t *data)
+static void kazzo_cpu_write_6502(const int *d, long address, long length, const uint8_t *data)
{
write_memory(d, REQUEST_CPU_WRITE_6502, address, length, data);
}
-static void kazzo_ppu_write(const struct reader_handle *d, long address, long length, const uint8_t *data)
+static void kazzo_ppu_write(const int *d, long address, long length, const uint8_t *data)
{
write_memory(d, REQUEST_PPU_WRITE, address, length, data);
}
t[0] = l & 0xff;
t[1] = (l >> 8) & 0xff;
}
-static void flash_config(const struct reader_handle *d, enum request r, enum index index, long c000x, long c2aaa, long c5555, long unit, bool retry)
+static void flash_config(const int *d, enum request r, enum index index, long c000x, long c2aaa, long c5555, long unit, bool retry)
{
const int size = 2 * 4 + 1;
uint8_t buf[size];
pack_short_le(unit, t);
t += sizeof(uint16_t);
*t = retry == true ? 1 : 0;
- device_write((usb_dev_handle *) d->handle, r, index, 0, size, buf);
+ device_write((usb_dev_handle *) d, r, index, 0, size, buf);
}
-static void kazzo_cpu_flash_config(const struct reader_handle *d, long c000x, long c2aaa, long c5555, long unit, bool retry)
+static void kazzo_cpu_flash_config(const int *d, long c000x, long c2aaa, long c5555, long unit, bool retry)
{
flash_config(d, REQUEST_FLASH_CONFIG_SET, INDEX_CPU, c000x, c2aaa, c5555, unit, retry);
}
-static void kazzo_ppu_flash_config(const struct reader_handle *d, long c000x, long c2aaa, long c5555, long unit, bool retry)
+static void kazzo_ppu_flash_config(const int *d, long c000x, long c2aaa, long c5555, long unit, bool retry)
{
flash_config(d, REQUEST_FLASH_CONFIG_SET, INDEX_PPU, c000x, c2aaa, c5555, unit, retry);
}
-static inline void flash_execute(const struct reader_handle *d, enum request p, enum request s, enum index index, long address, const uint8_t *data, int size, bool dowait, bool skip)
+static inline void flash_execute(const int *d, enum request p, enum request s, enum index index, long address, const uint8_t *data, int size, bool dowait, bool skip)
{
uint8_t status;
int filled = 1;
Free(filldata);
}
if(filled != 0){
- device_write((usb_dev_handle *) d->handle, p, index, address, size, data);
+ device_write((usb_dev_handle *) d, p, index, address, size, data);
}
if(dowait == true){
do{
wait(10);
- device_read((usb_dev_handle *) d->handle, s, index, 0, 1, &status);
+ device_read((usb_dev_handle *) d, s, index, 0, 1, &status);
}while(status != KAZZO_TASK_FLASH_IDLE);
}
}
-static void kazzo_cpu_flash_erase(const struct reader_handle *d, long address, bool dowait)
+static void kazzo_cpu_flash_erase(const int *d, long address, bool dowait)
{
flash_execute(d, REQUEST_FLASH_ERASE, REQUEST_FLASH_STATUS, INDEX_CPU, address, NULL, 0, dowait, false);
}
-static void kazzo_ppu_flash_erase(const struct reader_handle *d, long address, bool dowait)
+static void kazzo_ppu_flash_erase(const int *d, long address, bool dowait)
{
flash_execute(d, REQUEST_FLASH_ERASE, REQUEST_FLASH_STATUS, INDEX_PPU, address, NULL, 0, dowait, false);
}
length -= 0x10;
}
}
-static long flash_program(const struct reader_handle *h, const struct gauge *g, enum index index, long address, long length, const uint8_t *data, bool dowait, bool skip)
+static long flash_program(const int *h, const struct gauge *g, enum index index, long address, long length, const uint8_t *data, bool dowait, bool skip)
{
enum request p = REQUEST_FLASH_PROGRAM;
enum request s = REQUEST_FLASH_STATUS;
Free(d);
return count;
}
-static long kazzo_cpu_flash_program(const struct reader_handle *d, const struct gauge *g, long address, long length, const uint8_t *data, bool dowait, bool skip)
+static long kazzo_cpu_flash_program(const int *d, const struct gauge *g, long address, long length, const uint8_t *data, bool dowait, bool skip)
{
return flash_program(d, g, INDEX_CPU, address, length, data, dowait, skip);
}
-static long kazzo_ppu_flash_program(const struct reader_handle *d, const struct gauge *g, long address, long length, const uint8_t *data, bool dowait, bool skip)
+static long kazzo_ppu_flash_program(const int *d, const struct gauge *g, long address, long length, const uint8_t *data, bool dowait, bool skip)
{
return flash_program(d, g, INDEX_PPU, address, length, data, dowait, skip);
}
-static void kazzo_flash_status(const struct reader_handle *d, uint8_t s[2])
+static void kazzo_flash_status(const int *d, uint8_t s[2])
{
read_main(d, &GAUGE_DUMMY, REQUEST_FLASH_STATUS, INDEX_BOTH, 0, 2, s);
}
-static void kazzo_cpu_flash_device_get(const struct reader_handle *d, uint8_t s[2])
+static void kazzo_cpu_flash_device_get(const int *d, uint8_t s[2])
{
read_main(d, &GAUGE_DUMMY, REQUEST_FLASH_DEVICE, INDEX_CPU, 0, 2, s);
}
-static void kazzo_ppu_flash_device_get(const struct reader_handle *d, uint8_t s[2])
+static void kazzo_ppu_flash_device_get(const int *d, uint8_t s[2])
{
read_main(d, &GAUGE_DUMMY, REQUEST_FLASH_DEVICE, INDEX_PPU, 0, 2, s);
}
-static uint8_t kazzo_vram_connection(const struct reader_handle *d)
+static uint8_t kazzo_vram_connection(const int *d)
{
uint8_t s;
read_main(d, &GAUGE_DUMMY, REQUEST_VRAM_CONNECTION, INDEX_IMPLIED, 0, 1, &s);
struct textcontrol;
struct gauge;
-struct reader_handle{
- void *handle;
- struct textcontrol *text;
-};
struct reader_memory_access{
- void (*memory_read)(const struct reader_handle *d, const struct gauge *g, long address, long length, uint8_t *data);
- void (*memory_write)(const struct reader_handle *d, long address, long length, const uint8_t *data);
- void (*flash_config)(const struct reader_handle *d, long c000x, long c2aaa, long c5555, long unit, bool retry);
- void (*flash_erase)(const struct reader_handle *d, long address, bool wait);
- long (*flash_program)(const struct reader_handle *d, const struct gauge *g, long address, long length, const uint8_t *data, bool wait, bool skip);
- void (*flash_device_get)(const struct reader_handle *d, uint8_t s[2]);
+ void (*memory_read)(const int *d, const struct gauge *g, long address, long length, uint8_t *data);
+ void (*memory_write)(const int *d, long address, long length, const uint8_t *data);
+ void (*flash_config)(const int *d, long c000x, long c2aaa, long c5555, long unit, bool retry);
+ void (*flash_erase)(const int *d, long address, bool wait);
+ long (*flash_program)(const int *d, const struct gauge *g, long address, long length, const uint8_t *data, bool wait, bool skip);
+ void (*flash_device_get)(const int *d, uint8_t s[2]);
};
struct reader_control{
const char *name;
- void (*open)(struct reader_handle *h);
- void (*close)(struct reader_handle *h);
- void (*init)(const struct reader_handle *d);
- void (*flash_status)(const struct reader_handle *d, uint8_t s[2]);
- uint8_t (*vram_connection)(const struct reader_handle *d);
+ const int *(*open)(void);
+ void (*close)(const int *h);
+ void (*init)(const int *d);
+ void (*flash_status)(const int *d, uint8_t s[2]);
+ uint8_t (*vram_connection)(const int *d);
};
struct reader_driver{
const struct reader_control control;
const struct reader_memory_access cpu, ppu;
};
-#if 0
-bool reader_driver_get(const char *name, struct reader_driver);
-enum{
- ADDRESS_MASK_A0toA12 = 0x1fff,
- ADDRESS_MASK_A0toA14 = 0x7fff,
- ADDRESS_MASK_A15 = 0x8000
-};
-enum{
- M2_CONTROL_TRUE, M2_CONTROL_FALSE
-};
-/*
-static inline は共有マクロ扱い
-*/
-static inline int bit_set(int data, const int bit)
-{
- data |= 1 << bit;
- return data;
-}
-
-static inline int bit_clear(int data, const int bit)
-{
- data &= ~(1 << bit);
- return data;
-}
-#endif
static inline void wait(long msec)
{
if(msec == 0){
static void gauge_value_nothing(void *a, void *b, int c)
{
}
-static void label_nothing(void *a, const char *str)
+static void label_nothing(void *a, const char *str, ...)
{
}
const struct gauge GAUGE_DUMMY = {
#ifndef _WIDGET_H_
#define _WIDGET_H_
+#ifndef __cplusplus
+ #include <stdarg.h>
+#else
+ #include <cstdarg>
+#endif
+
struct gauge{
void *bar, *label;
void (*range_set)(void *, int range);
void (*value_set)(void *, void *, int value);
void (*value_add)(void *, void *, int value);
- void (*label_set)(void *, const char *str);
+ void (*label_set)(void *, const char *str, ...);
};
struct textcontrol{
void *object;
- void (*append)(void *, const char *);
+ void (*append)(void *, const char *, ...);
+ void (*append_va)(void *, const char *, va_list);
};
extern const struct gauge GAUGE_DUMMY;
#endif