#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);
interrupt = new INTERRUPT(this, emu);
joystick = new JOYSTICK(this, emu);
keyboard = new KEYBOARD(this, emu);
- memory = new MZ2500_MEMORY(this, emu);
+ memory = new MEMORY(this, emu);
mouse = new MOUSE(this, emu);
mz1e26 = new MZ1E26(this, emu);
mz1e30 = new MZ1E30(this, emu);
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
+double VM::get_current_usec()
+{
+ if(event == NULL) return 0.0;
+ return event->get_current_usec();
+}
+
+uint64_t VM::get_current_clock_uint64()
+{
+ if(event == NULL) return (uint64_t)0;
+ return event->get_current_clock_uint64();
+}
+
+#define STATE_VERSION 8
bool VM::process_state(FILEIO* state_fio, bool loading)
{
// 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 = strlen(name);
+ int len = (int)strlen(name);
if(!state_fio->StateCheckInt32(len)) {
if(loading) {
}
}
// Machine specified.
- state_fio->StateInt32(monitor_type);
+ state_fio->StateValue(monitor_type);
return true;
}