#include "interrupt.h"
#include "joystick.h"
#include "keyboard.h"
-#include "memory.h"
+#include "./memory.h"
#include "mouse.h"
#include "mz1e26.h"
#include "mz1e30.h"
#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;
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);
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);
}
}
monitor_type = config.monitor_type;
- decl_state();
}
VM::~VM()
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();
}
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)
emu->lock_vm();
drec->close_tape();
emu->unlock_vm();
+ drec->set_remote(false);
cmt->close_tape();
}
void VM::push_play(int drv)
{
+ drec->set_remote(false);
drec->set_ff_rew(0);
drec->set_remote(true);
}
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);
}
}
}
-#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;
}
-