endif
$(APP_GUI): $(OBJ_GUI)
- g++ -o $@ $(LDFLAG) $(OBJ_GUI) `$(WX_CONFIG) --libs core,adv` -lusb -lsqstdlib -lsquirrel
+ g++ -o $@ $(LDFLAG) $(OBJ_GUI) `$(WX_CONFIG) --libs core,adv,xml` -lusb -lsqstdlib -lsquirrel
$(APP_CUI): $(OBJ_CUI)
g++ -o $@ $(LDFLAG) $(OBJ_CUI) -lusb -lsqstdlib -lsquirrel
clean:
#include "romimage.h"
#include "reader_master.h"
#include "reader_kazzo.h"
+#include "reader_dummy.h"
#include "script_dump.h"
#include "flash_device.h"
#include "script_program.h"
config.ppu.increase = 1;
config.progress = true;
switch(v[1][0]){
- case wgT('d'):
+ case wgT('d'): case wgT('z'):
config.mode = MODE_ROM_DUMP;
break;
case wgT('D'):
{
PUTS(wgT("famicom bus simluator 'anago'"));
PRINTF(wgT("%s [mode] [script] [target] ....\n"), v);
+ PUTS(wgT("d - ROM dump with kazzo"));
+ PUTS(wgT("f - flash program with kazzo"));
+ PUTS(wgT("r - workram read with kazzo"));
+ PUTS(wgT("w - workram write with kazzo"));
+ PUTS(wgT("z - ROM dump for test"));
+ PUTS(wgT("x - flash program for test"));
+ PUTS(wgT("R - workram read for test"));
+ PUTS(wgT("W - workram write for test"));
}
-#if DEBUG==1
-extern const struct reader_driver DRIVER_DUMMY;
-#endif
-
#ifdef WIN32
int main(int c, char **vv)
#else
}
#endif
switch(v[1][0]){
-#if DEBUG==1
case wgT('x'):
r = &DRIVER_DUMMY; //though down
-#endif
case wgT('f'): case wgT('F'):
program(c, v, r);
break;
-#if DEBUG==1
case wgT('z'): case wgT('R'): case wgT('W'):
r = &DRIVER_DUMMY; //though down
-#endif
case wgT('d'): case wgT('D'):
case wgT('r'): case wgT('w'):
dump(c,v, r);
}
//---- script execute thread ----
-class anago_frame;
-//class anago_panel_dump;
-class anago_panel_program;
-
class anago_dumper : public wxThread
{
private:
void *Entry(void)
{
try{
- bool r;
+ bool r = false;
switch(m_config.mode){
case MODE_ROM_DUMP:
r = script_dump_execute(&m_config);
c->Select(0);
}
}
-
+/*
static void script_choice_init(wxControlWithItems *c, wxString filespec, wxTextCtrl *log)
{
wxArrayString spec;
spec.Add(filespec);
script_choice_init(c, spec, log);
-}
+}*/
static void gauge_init(struct gauge *t)
{
wxArrayString ar;
ar.Add(wxT("*.ad"));
ar.Add(wxT("*.ae"));
+ ar.Add(wxT("*.af"));
+ ar.Add(wxT("*.ag"));
script_choice_init(m_script_choice, ar, log);
this->increase_init(m_cpu_increase);
m_cpu_increase->Append(wxT("Auto"));
{
config->Read(wxT("program.sound.success"), &m_sound_success, wxT("cuckoo.wav"));
config->Read(wxT("program.sound.fail"), &m_sound_fail, wxT("doggrowl.wav"));
- script_choice_init(m_script_choice, wxT("*.af"), m_log);
+ {
+ wxArrayString t;
+ t.Add(wxT("*.af"));
+ t.Add(wxT("*.ag"));
+ script_choice_init(m_script_choice, t, m_log);
+ }
{
struct flash_listup list;
list.obj_cpu = m_cpu_device;
config->Read(wxT("workram.sound.success"), &m_sound_success, wxT("tinkalink2.wav"));
config->Read(wxT("workram.sound.fail"), &m_sound_fail, wxT("doggrowl.wav"));
- script_choice_init(m_read_script, wxT("*.ae"), log);
- script_choice_init(m_write_script, wxT("*.ae"), log);
+ wxArrayString ar;
+ ar.Add(wxT("*.ae"));
+ ar.Add(wxT("*.ag"));
+ script_choice_init(m_read_script, ar, log);
+ script_choice_init(m_write_script, ar, log);
if(DEBUG == 1){
m_read_picker->GetTextCtrl()->SetLabel(wxT("t.sav"));
dofile(script);
local cpu_dumpsize = dumpsize_get(board.cpu_ram, increase_cpu);
memory_new(d, cpu_dumpsize, 0);
- cpu_ram_access(d, cpu_dumpsize / board.cpu_ram.banksize, cpu_dumpsize);
+ cpu_ram_access(d, cpu_dumpsize / board.cpu_ram.banksize, board.cpu_ram.banksize);
memory_finalize(d);
}
-mega <- 0x20000;
function loopsize_get(t, trans, image_size, device_size)
{
local trans_full = 3, trans_top = 1, trans_bottom = 2; //header.h enum transtype
local loop = {start = 0, end = 0};
switch(trans){
case trans_full:{
- local size = device_size < t.maxsize ? device_size : t.maxsize;
+ local size = device_size < t.size_max ? device_size : t.size_max;
loop.end = size / t.banksize;
}break;
case trans_top:
loop.end = image_size / t.banksize;
break;
case trans_bottom:
- loop.start = (t.maxsize - image_size) / t.banksize;
- loop.end = t.maxsize / t.banksize;
+ loop.start = (t.size_max - image_size) / t.banksize;
+ loop.end = t.size_max / t.banksize;
break;
default:
loop.start = 0;
ppu_trans, ppu_image_size, ppu_device_size
)
{
+ const mega = 0x20000;
local trans_empty = 0;
dofile(script);
+
if((board.mappernum != mapper) && (mapper != 0)){
print("mapper number are not connected\n");
- print("af:" + board.mappernum + " image:" + mapper + "\n");
+ print("script:" + board.mappernum + " image:" + mapper + "\n");
}
- local cpu_loop = loopsize_get(board.cpu, cpu_trans, cpu_image_size, cpu_device_size);
- local ppu_loop = loopsize_get(board.ppu, ppu_trans, ppu_image_size, ppu_device_size);
+ local cpu_loop = loopsize_get(board.cpu_rom, cpu_trans, cpu_image_size, cpu_device_size);
+ local ppu_loop = loopsize_get(board.ppu_rom, ppu_trans, ppu_image_size, ppu_device_size);
if(board.vram_mirrorfind == true){
vram_mirrorfind(d);
}
- initalize(d, board.cpu.banksize, board.ppu.banksize);
+ program_initalize(d, board.cpu_rom.banksize, board.ppu_rom.banksize);
if(cpu_trans != trans_empty){
- cpu_transfer(d, cpu_loop.start, cpu_loop.end, board.cpu.banksize);
+ cpu_transfer(d, cpu_loop.start, cpu_loop.end, board.cpu_rom.banksize);
}
if(ppu_trans != trans_empty){
- ppu_transfer(d, ppu_loop.start, ppu_loop.end, board.ppu.banksize);
+ ppu_transfer(d, ppu_loop.start, ppu_loop.end, board.ppu_rom.banksize);
}
}
ppu_trans, ppu_image_size, ppu_device_size
)
{
+ const mega = 0x20000;
local trans_empty = 0;
dofile(script);
+
if((board.mappernum != mapper) && (mapper != 0)){
return;
}
- local cpu_loop = loopsize_get(board.cpu, cpu_trans, cpu_image_size, cpu_device_size);
- local ppu_loop = loopsize_get(board.ppu, ppu_trans, ppu_image_size, ppu_device_size);
+ local cpu_loop = loopsize_get(board.cpu_rom, cpu_trans, cpu_image_size, cpu_device_size);
+ local ppu_loop = loopsize_get(board.ppu_rom, ppu_trans, ppu_image_size, ppu_device_size);
local co_cpu = newthread(cpu_transfer);
local co_ppu = newthread(ppu_transfer);
- initalize(d, board.cpu.banksize, board.ppu.banksize);
+ program_initalize(d, board.cpu_rom.banksize, board.ppu_rom.banksize);
if(cpu_trans != trans_empty){
cpu_erase(d);
}
}
erase_wait(d);
if(cpu_trans != trans_empty){
- co_cpu.call(d, cpu_loop.start, cpu_loop.end, board.cpu.banksize);
+ co_cpu.call(d, cpu_loop.start, cpu_loop.end, board.cpu_rom.banksize);
}
if(ppu_trans != trans_empty){
- co_ppu.call(d, ppu_loop.start, ppu_loop.end, board.ppu.banksize);
+ co_ppu.call(d, ppu_loop.start, ppu_loop.end, board.ppu_rom.banksize);
}
program_main(d, co_cpu, co_ppu)
}
static void dummy_cpu_write(const struct reader_handle *h, long address, long length, const uint8_t *data)
{
- if(length == 1){
- h->log->append(h->log->object, wgT(" cpu_write $%04x <- $%02x\n"), (int) address, *data);
+ if(length <= 8){
+ long i;
+ for(i = 0; i < length; i++){
+ h->log->append(h->log->object, wgT(" cpu_write $%04x <- $%02x\n"), (int) address, *data);
+ address++;
+ data++;
+ }
}
- Sleep(4);
+ wait(4);
}
static void dummy_write(const struct reader_handle *h, long address, long length, const uint8_t *data)
{
- Sleep(4);
+ wait(4);
}
static void dummy_flash_config(const struct reader_handle *h, long c000x, long c2aaa, long c5555, long unit, bool retry)
#include <sqstdio.h>
#include <sqstdaux.h>
#include "type.h"
+#include "memory_manage.h"
#include "squirrel_wrap.h"
#include "reader_master.h"
#include "widget.h"
{
static const struct range range_address = {0x4000, 0x10000};
static const struct range range_data = {0x0, 0xff};
- long address, data;
- SQRESULT r = qr_argument_get(v, 2, &address, &data);
- if(SQ_FAILED(r)){
- return r;
+ const SQInteger data_index = 4;
+ long address;
+ switch(sq_gettype(v, data_index)){
+ case OT_INTEGER:{
+ long data;
+ SQRESULT r = qr_argument_get(v, 2, &address, &data);
+ if(SQ_FAILED(r)){
+ return r;
+ }
+ r = range_check(v, wgT("address"), address, &range_address);
+ if(SQ_FAILED(r)){
+ return r;
+ }
+ return range_check(v, wgT("data"), data, &range_data);}
+ case OT_ARRAY:{
+ SQInteger i;
+ if(qr_long_get(v, 3, &address) == false){
+ return sq_throwerror(v, _SC("argument number error"));
+ }
+ for(i = 0; i < sq_getsize(v, data_index); i++){
+ long data;
+ SQRESULT r = range_check(v, wgT("address"), address, &range_address);
+ if(SQ_FAILED(r)){
+ return r;
+ }
+ sq_pushinteger(v, i);
+ if(SQ_FAILED(sq_get(v, -2))){
+ return r;
+ }
+ if(qr_long_get(v, -1, &data) == false){
+ return sq_throwerror(v, wgT("script type error"));
+ }
+ sq_pop(v, 1);
+ r = range_check(v, wgT("data"), data, &range_data);
+ if(SQ_FAILED(r)){
+ return r;
+ }
+ address++;
+ }
+ return 0;}
+ default:
+ return sq_throwerror(v, wgT("script type error"));
}
- r = range_check(v, wgT("address"), address, &range_address);
- if(SQ_FAILED(r)){
- return r;
+ return 0;
+}
+
+void cpu_write_execute(HSQUIRRELVM v, const struct reader_handle *h, const struct reader_memory_access *t)
+{
+ const SQInteger data_index = 4;
+ long address;
+ switch(sq_gettype(v, data_index)){
+ case OT_INTEGER:{
+ long data;
+ uint8_t d8;
+ SQRESULT r = qr_argument_get(v, 2, &address, &data);
+ assert(r == SQ_OK);
+ d8 = (uint8_t) (data & 0xff);
+ t->memory_write(h, address, 1, &d8);
+ }break;
+ case OT_ARRAY:{
+ long i;
+ bool rr = qr_long_get(v, 3, &address);
+ assert(rr == true);
+
+ const long size = (long) sq_getsize(v, data_index);
+ uint8_t *const d8 = Malloc(size * sizeof(uint8_t));
+
+ for(i = 0; i < size; i++){
+ long data;
+ SQRESULT r;
+ sq_pushinteger(v, i);
+ r = sq_get(v, -2);
+ assert(r == SQ_OK);
+ rr = qr_long_get(v, -1, &data);
+ assert(rr = true);
+ sq_pop(v, 1);
+ d8[i] = (uint8_t) (data & 0xff);
+ }
+ t->memory_write(h, address, size, d8);
+ Free(d8);
+ }break;
+ default:
+ assert(0);
+ break;
}
- return range_check(v, wgT("data"), data, &range_data);
+ return;
}
static bool connection_check_main(const struct reader_handle *h, const struct textcontrol *text, const struct reader_memory_access *m, long address)
SQInteger script_nop(HSQUIRRELVM v);
SQInteger range_check(HSQUIRRELVM v, const wgChar *name, long target, const struct range *range);
SQInteger cpu_write_check(HSQUIRRELVM v);
+void cpu_write_execute(HSQUIRRELVM v, const struct reader_handle *h, const struct reader_memory_access *t);
struct reader_handle;
struct reader_memory_access;
#include "script_common.h"
#include "script_dump.h"
-static SQInteger cpu_write_1byte(HSQUIRRELVM v)
+static SQInteger cpu_write(HSQUIRRELVM v)
{
struct dump_config *d;
- long address, data;
SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
- r = qr_argument_get(v, 2, &address, &data);
- if(SQ_FAILED(r)){
- return r;
- }
- uint8_t d8 = (uint8_t) data;
- d->cpu.access->memory_write(d->handle, address, 1, &d8);
+ cpu_write_execute(v, d->handle, d->cpu.access);
return 0;
}
HSQUIRRELVM v = qr_open(&d->log);
qr_function_register_global(v, wgT("memory_new"), memory_new);
qr_function_register_global(v, wgT("nesfile_save"), nesfile_save);
- qr_function_register_global(v, wgT("cpu_write"), cpu_write_1byte);
+ qr_function_register_global(v, wgT("cpu_write"), cpu_write);
qr_function_register_global(v, wgT("cpu_read"), cpu_read);
qr_function_register_global(v, wgT("ppu_read"), ppu_read);
qr_function_register_global(v, wgT("ppu_ramfind"), ppu_ramfind);
}
{
HSQUIRRELVM v = qr_open(&d->log);
- qr_function_register_global(v, wgT("cpu_write"), cpu_write_1byte);
+ qr_function_register_global(v, wgT("cpu_write"), cpu_write);
switch(d->mode){
case MODE_RAM_READ:
qr_function_register_global(v, wgT("memory_new"), script_nop);
}
return command_set(v, &d->ppu);
}
-static SQInteger write_memory(HSQUIRRELVM v, const struct reader_handle *h, struct flash_memory_driver *t)
-{
- long address, data;
- SQRESULT r = qr_argument_get(v, 2, &address, &data);
- if(SQ_FAILED(r)){
- return r;
- }
- uint8_t d8 = (uint8_t) data;
- t->access->memory_write(h, address, 1, &d8);
- return 0;
-}
+
static SQInteger cpu_write(HSQUIRRELVM v)
{
struct program_config *d;
if(SQ_FAILED(r)){
return r;
}
- return write_memory(v, d->handle, &d->cpu);
+ cpu_write_execute(v, d->handle, d->cpu.access);
+ return 0;
}
+
static SQInteger erase_set(HSQUIRRELVM v, const struct reader_handle *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);
sq_close(v);
}
-static bool long_get(HSQUIRRELVM v, SQInteger index, long *d)
+bool qr_long_get(HSQUIRRELVM v, SQInteger index, long *d)
{
if(sq_gettype(v, index) != OT_INTEGER){
return false;
va_start(ap, num);
SQInteger i;
for(i = 0; i < num; i++){
- if(long_get(v, i + 3, va_arg(ap, long *)) == false){
+ if(qr_long_get(v, i + 3, va_arg(ap, long *)) == false){
return sq_throwerror(v, _SC("argument type error"));
}
}
struct textcontrol;
HSQUIRRELVM qr_open(struct textcontrol *p);
void qr_function_register_global(HSQUIRRELVM v, const wgChar *name, SQFUNCTION f);
+bool qr_long_get(HSQUIRRELVM v, SQInteger index, long *d);
SQRESULT qr_call(HSQUIRRELVM v, const SQChar *functionname, SQUserPointer up, const SQChar *scriptfile, int argnum, ...);
void qr_close(HSQUIRRELVM v);
SQRESULT qr_argument_get(HSQUIRRELVM v, SQInteger num, ...);