X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=source%2Fsrc%2Fvm%2Fmz2500%2Fmz2500.cpp;h=6f082a4f4e9c0619ad827747998fa6e51e6804a0;hb=613717947af5068a9bf4477d6e4510576609b790;hp=11f5c30f63af896906078fa41f5ab4731e8e5ef1;hpb=80df61fb1e009ab0d229a335f546cd788d54b158;p=csp-qt%2Fcommon_source_project-fm7.git diff --git a/source/src/vm/mz2500/mz2500.cpp b/source/src/vm/mz2500/mz2500.cpp index 11f5c30f6..6f082a4f4 100644 --- a/source/src/vm/mz2500/mz2500.cpp +++ b/source/src/vm/mz2500/mz2500.cpp @@ -44,7 +44,7 @@ #include "interrupt.h" #include "joystick.h" #include "keyboard.h" -#include "memory.h" +#include "./memory.h" #include "mouse.h" #include "mz1e26.h" #include "mz1e30.h" @@ -54,11 +54,28 @@ #include "serial.h" #include "timer.h" +using MZ2500::CALENDAR; +using MZ2500::CMT; +using MZ2500::CRTC; +using MZ2500::FLOPPY; +using MZ2500::INTERRUPT; +using MZ2500::JOYSTICK; +using MZ2500::KEYBOARD; +using MZ2500::MEMORY; +using MZ2500::MOUSE; +using MZ2500::MZ1E26; +using MZ2500::MZ1E30; +using MZ2500::MZ1R13; +using MZ2500::MZ1R37; +using MZ2500::PRINTER; +using MZ2500::SERIAL; +using MZ2500::TIMER; + // ---------------------------------------------------------------------------- // initialize // ---------------------------------------------------------------------------- -VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) +VM::VM(EMU_TEMPLATE* parent_emu) : VM_TEMPLATE(parent_emu) { // create devices first_device = last_device = NULL; @@ -77,7 +94,13 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) fdc->set_context_noise_seek(new NOISE(this, emu)); fdc->set_context_noise_head_down(new NOISE(this, emu)); fdc->set_context_noise_head_up(new NOISE(this, emu)); +#ifdef USE_DEBUGGER +// fdc->set_context_debugger(new DEBUGGER(this, emu)); +#endif pcm = new PCM1BIT(this, emu); +#ifdef USE_DEBUGGER +// pcm->set_context_debugger(new DEBUGGER(this, emu)); +#endif rtc = new RP5C01(this, emu); // RP-5C15 sasi_host = new SCSI_HOST(this, emu); sasi_hdd = new SASI_HDD(this, emu); @@ -91,6 +114,9 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) sasi_host->set_context_target(sasi_hdd); w3100a = new W3100A(this, emu); opn = new YM2203(this, emu); +#ifdef USE_DEBUGGER + opn->set_context_debugger(new DEBUGGER(this, emu)); +#endif cpu = new Z80(this, emu); pio = new Z80PIO(this, emu); sio = new Z80SIO(this, emu); @@ -255,7 +281,6 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) } } monitor_type = config.monitor_type; - decl_state(); } VM::~VM() @@ -294,13 +319,13 @@ void VM::reset() opn->write_signal(SIG_YM2203_PORT_B, (monitor_type & 2) ? 0x77 : 0x37, 0xff); } -void VM::special_reset() +void VM::special_reset(int num) { // reset all devices // for(DEVICE* device = first_device; device; device = device->next_device) { // device->special_reset(); // } - memory->special_reset(); + memory->special_reset(num); cpu->reset(); } @@ -505,16 +530,28 @@ uint32_t VM::is_hard_disk_accessed() void VM::play_tape(int drv, const _TCHAR* file_path) { - bool value = drec->play_tape(file_path); + bool remote = drec->get_remote(); + bool opened = drec->play_tape(file_path); + + if(opened && remote) { + // if machine already sets remote on, start playing now + push_play(drv); + } cmt->close_tape(); - cmt->play_tape(value); + cmt->play_tape(opened); } void VM::rec_tape(int drv, const _TCHAR* file_path) { - bool value = drec->rec_tape(file_path); + bool remote = drec->get_remote(); + bool opened = drec->rec_tape(file_path); + + if(opened && remote) { + // if machine already sets remote on, start recording now + push_play(drv); + } cmt->close_tape(); - cmt->rec_tape(value); + cmt->rec_tape(opened); } void VM::close_tape(int drv) @@ -522,6 +559,7 @@ void VM::close_tape(int drv) emu->lock_vm(); drec->close_tape(); emu->unlock_vm(); + drec->set_remote(false); cmt->close_tape(); } @@ -552,6 +590,7 @@ const _TCHAR* VM::get_tape_message(int drv) void VM::push_play(int drv) { + drec->set_remote(false); drec->set_ff_rew(0); drec->set_remote(true); } @@ -563,12 +602,14 @@ void VM::push_stop(int drv) void VM::push_fast_forward(int drv) { + drec->set_remote(false); drec->set_ff_rew(1); drec->set_remote(true); } void VM::push_fast_rewind(int drv) { + drec->set_remote(false); drec->set_ff_rew(-1); drec->set_remote(true); } @@ -585,50 +626,52 @@ void VM::update_config() } } -#define STATE_VERSION 7 - -#include "../../statesub.h" -#include "../../qt/gui/csp_logger.h" -extern CSP_Logger DLL_PREFIX_I *csp_logger; - -void VM::decl_state(void) +double VM::get_current_usec() { - state_entry = new csp_state_utils(STATE_VERSION, 0, (_TCHAR *)(_T("CSP::MZ2500_SERIES_HEAD")), csp_logger); - DECL_STATE_ENTRY_BOOL(monitor_type); - for(DEVICE* device = first_device; device; device = device->next_device) { - device->decl_state(); - } + if(event == NULL) return 0.0; + return event->get_current_usec(); } -void VM::save_state(FILEIO* state_fio) +uint64_t VM::get_current_clock_uint64() { - //state_fio->FputUint32(STATE_VERSION); - if(state_entry != NULL) { - state_entry->save_state(state_fio); - } - for(DEVICE* device = first_device; device; device = device->next_device) { - device->save_state(state_fio); - } - - //state_fio->FputInt32(monitor_type); + if(event == NULL) return (uint64_t)0; + return event->get_current_clock_uint64(); } -bool VM::load_state(FILEIO* state_fio) +#define STATE_VERSION 8 + +bool VM::process_state(FILEIO* state_fio, bool loading) { - bool mb = false; - if(state_entry != NULL) { - mb = state_entry->load_state(state_fio); + if(!state_fio->StateCheckUint32(STATE_VERSION)) { + return false; } - if(!mb) return false; - //if(state_fio->FgetUint32() != STATE_VERSION) { - // return false; - //} - for(DEVICE* device = first_device; device; device = device->next_device) { - if(!device->load_state(state_fio)) { + for(DEVICE* device = first_device; device; device = device->next_device) { + // Note: typeid(foo).name is fixed by recent ABI.Not dec 6. + // const char *name = typeid(*device).name(); + // But, using get_device_name() instead of typeid(foo).name() 20181008 K.O + const char *name = device->get_device_name(); + int len = (int)strlen(name); + + if(!state_fio->StateCheckInt32(len)) { + if(loading) { + printf("Class name len Error: DEVID=%d EXPECT=%s\n", device->this_device_id, name); + } return false; } - } - //monitor_type = state_fio->FgetInt32(); + if(!state_fio->StateCheckBuffer(name, len, 1)) { + if(loading) { + printf("Class name Error: DEVID=%d EXPECT=%s\n", device->this_device_id, name); + } + return false; + } + if(!device->process_state(state_fio, loading)) { + if(loading) { + printf("Data loading Error: DEVID=%d\n", device->this_device_id); + } + return false; + } + } + // Machine specified. + state_fio->StateValue(monitor_type); return true; } -