OSDN Git Service

[General] Merge Updtream 2020-08-10.
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz2500 / mz2500.cpp
index 4177279..6f082a4 100644 (file)
 #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);
@@ -107,7 +133,7 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_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);
@@ -293,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();
 }
 
@@ -504,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)
@@ -521,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();
 }
 
@@ -551,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);
 }
@@ -562,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);
 }
@@ -584,7 +626,19 @@ void VM::update_config()
        }
 }
 
-#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)
 {
@@ -596,7 +650,7 @@ 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) {
@@ -618,6 +672,6 @@ bool VM::process_state(FILEIO* state_fio, bool loading)
                }
        }
        // Machine specified.
-       state_fio->StateInt32(monitor_type);
+       state_fio->StateValue(monitor_type);
        return true;
 }