OSDN Git Service

[BUILD] Set SOVERSION and GIT hash automatically.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pc8801 / pc8801.cpp
index ce24acf..55e651c 100644 (file)
@@ -23,6 +23,7 @@
 #include "../z80.h"
 
 #include "../disk.h"
+#include "../noise.h"
 #include "../pc80s31k.h"
 #include "../upd765a.h"
 
@@ -33,9 +34,6 @@
 #ifdef SUPPORT_PC88_PCG8100
 #include "../i8253.h"
 #endif
-#if defined(USE_SOUND_FILES)
-#include "../wav_sounder.h"
-#endif
 
 #include "pc88.h"
 
@@ -43,7 +41,7 @@
 // initialize
 // ----------------------------------------------------------------------------
 
-VM::VM(EMU* parent_emu) : emu(parent_emu)
+VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu)
 {
        // check configs
        boot_mode = config.boot_mode;
@@ -53,70 +51,73 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
        dummy = new DEVICE(this, emu);  // must be 1st device
        
        pc88event = new EVENT(this, emu);
+       pc88event->set_device_name(_T("Event Manager (PC-8801)"));
 //     pc88event->set_frames_per_sec(60);
 //     pc88event->set_lines_per_frame(260);
-#if defined(_USE_QT)
        dummy->set_device_name(_T("1st Dummy"));
-       pc88event->set_device_name(_T("EVENT"));
-#endif 
-       
        pc88 = new PC88(this, emu);
-#if defined(_USE_QT)
+
   #if defined(_PC8001) || defined(_PC8001MK2) || defined(_PC8001SR)
        pc88->set_device_name(_T("PC8001 MAIN"));
   #else
        pc88->set_device_name(_T("PC8801 MAIN"));
   #endif
-#endif 
 //     pc88->set_context_event_manager(pc88event);
        pc88sio = new I8251(this, emu);
+//     pc88sio->set_device_name(_T("8251 SIO (PC-8801)"));
 //     pc88sio->set_context_event_manager(pc88event);
        pc88pio = new I8255(this, emu);
+//     pc88pio->set_device_name(_T("8255 PIO (PC-8801)"));
 //     pc88pio->set_context_event_manager(pc88event);
        pc88pcm = new PCM1BIT(this, emu);
+//     pc88pcm->set_device_name(_T("1-Bit PCM Sound (PC-8801)"));
 //     pc88pcm->set_context_event_manager(pc88event);
        pc88rtc = new UPD1990A(this, emu);
+//     pc88rtc->set_device_name(_T("uPD1990A RTC (PC-8801)"));
 //     pc88rtc->set_context_event_manager(pc88event);
-       // config.sound_device_type
+       // config.sound_type
        //      0: 44h:OPNA A4h:None            PC-8801FH/MH or later
-       //      1: 44h:OPN  A4h:None            PC-8801mkIISR/TR/MR/FR
-       //      2: 44h:OPN  A4h:OPNA            PC-8801mkIISR/TR/MR/FR + PC-8801-23
+       //      1: 44h:OPN  A4h:None            PC-8801mkIISR/TR/FR/MR
+       //      2: 44h:OPN  A4h:OPNA            PC-8801mkIISR/TR/FR/MR + PC-8801-23
+       //      3: 44h:OPN  A4h:OPN             PC-8801mkIISR/TR/FR/MR + PC-8801-11
+       //      4: 44h:OPNA A4h:OPNA            PC-8801FH/MH or later  + PC-8801-24
+       //      5: 44h:OPNA A4h:OPN             PC-8801FH/MH or later  + PC-8801-11
        pc88opn = new YM2203(this, emu);
 //     pc88opn->set_context_event_manager(pc88event);
-#ifdef USE_SOUND_DEVICE_TYPE
+#ifdef USE_SOUND_TYPE
 #ifdef SUPPORT_PC88_OPNA
-       pc88opn->is_ym2608 = (config.sound_device_type == 0);
-  #if defined(_USE_QT)
-       pc88opn->set_device_name(_T("YM2608 OPNA"));
-  #endif       
-#else
-  #if defined(_USE_QT)
-       pc88opn->set_device_name(_T("YM2203 OPN"));
-  #endif       
+       if(config.sound_type == 0 || config.sound_type == 4 || config.sound_type == 5) {
+               pc88opn->is_ym2608 = true;
+               pc88opn->set_device_name(_T("YM2608 OPNA"));
+       } else {
+               pc88opn->is_ym2608 = false;
+               pc88opn->set_device_name(_T("YM2203 OPN"));
+       }
 #endif
 #ifdef SUPPORT_PC88_SB2
-       if(config.sound_device_type == 2) {
+       if(config.sound_type >= 2) {
                pc88sb2 = new YM2203(this, emu);
+//             pc88sb2->set_context_event_manager(pc88event);
 #ifdef SUPPORT_PC88_OPNA
-               pc88sb2->is_ym2608 = true;
+               if(config.sound_type == 2 || config.sound_type == 4) {
+                       pc88sb2->is_ym2608 = true;
+                       pc88sb2->set_device_name(_T("YM2608 OPNA (SB2)"));
+               } else {
+                       pc88sb2->is_ym2608 = false;
+#endif
+                       pc88sb2->set_device_name(_T("YM2203 OPN (SB2)"));
+#ifdef SUPPORT_PC88_OPNA
+               }
 #endif
-  #if defined(_USE_QT)
-    #ifdef SUPPORT_PC88_OPNA
-               pc88sb2->set_device_name(_T("YM2608 OPNA(SB2)"));
-    #else
-               pc88sb2->set_device_name(_T("YM2203 OPN(SB2)"));
-    #endif
-  #endif       
-//             pc88sb2->set_context_event_manager(pc88event);
        } else {
                pc88sb2 = NULL;
        }
 #endif
 #endif
-       if(config.printer_device_type == 0) {
+       if(config.printer_type == 0) {
                pc88prn = new PRNFILE(this, emu);
 //             pc88prn->set_context_event_manager(pc88event);
-//     } else if(config.printer_device_type == 1) {
+//     } else if(config.printer_type == 1) {
 //             pc88prn = new PCPR201(this, emu);
 //             pc88prn->set_context_event_manager(pc88event);
        } else {
@@ -126,48 +127,46 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
        dummycpu = new DEVICE(this, emu);
        pc88cpu = new Z80(this, emu);
 //     pc88cpu->set_context_event_manager(pc88event);
-#if defined(_USE_QT)
        dummycpu->set_device_name(_T("DUMMY CPU"));
        pc88cpu->set_device_name(_T("MAIN CPU(Z80)"));
-#endif
        
        pc88sub = new PC80S31K(this, emu);
+       pc88sub->set_device_name(_T("PC-80S31K (Sub)"));
 //     pc88sub->set_context_event_manager(pc88event);
        pc88pio_sub = new I8255(this, emu);
+       pc88pio_sub->set_device_name(_T("8255 PIO (Sub)"));
 //     pc88pio_sub->set_context_event_manager(pc88event);
        pc88fdc_sub = new UPD765A(this, emu);
+       pc88fdc_sub->set_device_name(_T("uPD765A FDC (Sub)"));
 //     pc88fdc_sub->set_context_event_manager(pc88event);
+       pc88noise_seek = new NOISE(this, emu);
+//     pc88noise_seek->set_context_event_manager(pc88event);
+       pc88noise_head_down = new NOISE(this, emu);
+//     pc88noise_head_down->set_context_event_manager(pc88event);
+       pc88noise_head_up = new NOISE(this, emu);
+//     pc88noise_head_up->set_context_event_manager(pc88event);
        pc88cpu_sub = new Z80(this, emu);
+       pc88cpu_sub->set_device_name(_T("Z80 CPU (Sub)"));
 //     pc88cpu_sub->set_context_event_manager(pc88event);
-#if defined(_USE_QT)
-       pc88sub->set_device_name(_T("PC-80S31K FDD I/F"));
-       pc88pio_sub->set_device_name(_T("i8255 PIO(FDD)"));
-       pc88fdc_sub->set_device_name(_T("uPD765A FDC(FDD)"));
-       pc88cpu_sub->set_device_name(_T("Z80 CPU(FDD)"));
-#endif
-#if defined(USE_SOUND_FILES)
-       pc88fdc_seeksnd = new WAV_SOUNDER(this, emu);
-#endif
+
 #ifdef SUPPORT_PC88_PCG8100
        pc88pit = new I8253(this, emu);
 //     pc88pit->set_context_event_manager(pc88event);
        pc88pcm0 = new PCM1BIT(this, emu);
-//     pc88pcm->set_context_event_manager(pc88event);
+//     pc88pcm0->set_context_event_manager(pc88event);
        pc88pcm1 = new PCM1BIT(this, emu);
-//     pc88pcm->set_context_event_manager(pc88event);
+//     pc88pcm1->set_context_event_manager(pc88event);
        pc88pcm2 = new PCM1BIT(this, emu);
-//     pc88pcm->set_context_event_manager(pc88event);
-  #if defined(_USE_QT)
-       pc88pit->set_device_name(_T("i8253 PIT(PCG8100)"));
-       pc88pcm0->set_device_name(_T("SOUND #1(PCG8100)"));
-       pc88pcm1->set_device_name(_T("SOUND #2(PCG8100)"));
-       pc88pcm2->set_device_name(_T("SOUND #3(PCG8100)"));
-  #endif
+//     pc88pcm2->set_context_event_manager(pc88event);
+       pc88pit->set_device_name(_T("i8253 PIT (PCG8100)"));
+       pc88pcm0->set_device_name(_T("SOUND #1 (PCG8100)"));
+       pc88pcm1->set_device_name(_T("SOUND #2 (PCG8100)"));
+       pc88pcm2->set_device_name(_T("SOUND #3 (PCG8100)"));
 #endif
        
        pc88event->set_context_cpu(dummycpu, 3993624 / 4);
 #ifdef SUPPORT_PC88_HIGH_CLOCK
-       pc88event->set_context_cpu(pc88cpu, (config.cpu_type != 0) ? 3993624 : 7987248);
+       pc88event->set_context_cpu(pc88cpu, (config.cpu_type == 1) ? 3993624 : 7987248);
 #else
        pc88event->set_context_cpu(pc88cpu, 3993624);
 #endif
@@ -184,12 +183,9 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
        pc88event->set_context_sound(pc88pcm1);
        pc88event->set_context_sound(pc88pcm2);
 #endif
-#if defined(USE_SOUND_FILES)
-       if(pc88fdc_seeksnd->load_data(_T("FDDSEEK.WAV"))) {
-               pc88event->set_context_sound(pc88fdc_seeksnd);
-               pc88fdc_sub->set_context_seek(pc88fdc_seeksnd);
-       }
-#endif 
+       pc88event->set_context_sound(pc88noise_seek);
+       pc88event->set_context_sound(pc88noise_head_down);
+       pc88event->set_context_sound(pc88noise_head_up);
        pc88->set_context_cpu(pc88cpu);
        pc88->set_context_opn(pc88opn);
 #ifdef SUPPORT_PC88_SB2
@@ -235,6 +231,9 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
        pc88pio_sub->set_context_port_c(pc88pio, SIG_I8255_PORT_C, 0xf0, -4);
        pc88pio_sub->clear_ports_by_cmdreg = true;
        pc88fdc_sub->set_context_irq(pc88cpu_sub, SIG_CPU_IRQ, 1);
+       pc88fdc_sub->set_context_noise_seek(pc88noise_seek);
+       pc88fdc_sub->set_context_noise_head_down(pc88noise_head_down);
+       pc88fdc_sub->set_context_noise_head_up(pc88noise_head_up);
        pc88cpu_sub->set_context_mem(pc88sub);
        pc88cpu_sub->set_context_io(pc88sub);
        pc88cpu_sub->set_context_intr(pc88sub);
@@ -250,11 +249,14 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
        pc88pit->set_constant_clock(1, 3993624);
        pc88pit->set_constant_clock(2, 3993624);
 #endif
-       
        // initialize all devices
+#if defined(__GIT_REPO_VERSION)
+       strncpy(_git_revision, __GIT_REPO_VERSION, sizeof(_git_revision) - 1);
+#endif
        for(DEVICE* device = first_device; device; device = device->next_device) {
                device->initialize();
        }
+       decl_state();
 }
 
 VM::~VM()
@@ -333,11 +335,6 @@ void VM::draw_screen()
        pc88->draw_screen();
 }
 
-uint32_t VM::get_access_lamp_status()
-{
-       return pc88fdc_sub->read_signal(0);
-}
-
 // ----------------------------------------------------------------------------
 // soud manager
 // ----------------------------------------------------------------------------
@@ -404,6 +401,7 @@ void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r)
                if(pc88sb2 != NULL) {
                        pc88sb2->set_volume(1, decibel_l, decibel_r);
                }
+#ifdef SUPPORT_PC88_OPNA
        } else if(ch-- == 0) {
                if(pc88sb2 != NULL) {
                        pc88sb2->set_volume(2, decibel_l, decibel_r);
@@ -413,6 +411,7 @@ void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r)
                        pc88sb2->set_volume(3, decibel_l, decibel_r);
                }
 #endif
+#endif
 #ifdef SUPPORT_PC88_PCG8100
        } else if(ch-- == 0) {
                pc88pcm0->set_volume(0, decibel_l, decibel_r);
@@ -421,12 +420,11 @@ void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r)
 #endif
        } else if(ch-- == 0) {
                pc88pcm->set_volume(0, decibel_l, decibel_r);
+       } else if(ch-- == 0) {
+               pc88noise_seek->set_volume(0, decibel_l, decibel_r);
+               pc88noise_head_down->set_volume(0, decibel_l, decibel_r);
+               pc88noise_head_up->set_volume(0, decibel_l, decibel_r);
        }
-#if defined(USE_SOUND_FILES)
-    else if(ch-- == 0) {
-               if(pc88fdc_seeksnd != NULL) pc88fdc_seeksnd->set_volume(0, decibel_l, decibel_r);
-       }
-#endif
 }
 #endif
 
@@ -443,6 +441,16 @@ void VM::key_up(int code)
 {
 }
 
+bool VM::get_caps_locked()
+{
+       return pc88->get_caps_locked();
+}
+
+bool VM::get_kana_locked()
+{
+       return pc88->get_kana_locked();
+}
+
 // ----------------------------------------------------------------------------
 // user interface
 // ----------------------------------------------------------------------------
@@ -472,22 +480,27 @@ bool VM::is_floppy_disk_protected(int drv)
        return pc88fdc_sub->is_disk_protected(drv);
 }
 
-void VM::play_tape(const _TCHAR* file_path)
+uint32_t VM::is_floppy_disk_accessed()
+{
+       return pc88fdc_sub->read_signal(0);
+}
+
+void VM::play_tape(int drv, const _TCHAR* file_path)
 {
        pc88->play_tape(file_path);
 }
 
-void VM::rec_tape(const _TCHAR* file_path)
+void VM::rec_tape(int drv, const _TCHAR* file_path)
 {
        pc88->rec_tape(file_path);
 }
 
-void VM::close_tape()
+void VM::close_tape(int drv)
 {
        pc88->close_tape();
 }
 
-bool VM::is_tape_inserted()
+bool VM::is_tape_inserted(int drv)
 {
        return pc88->is_tape_inserted();
 }
@@ -511,21 +524,39 @@ void VM::update_config()
        }
 }
 
-#define STATE_VERSION  6
+#define STATE_VERSION  8
+
+#include "../../statesub.h"
+#include "../../qt/gui/csp_logger.h"
+extern CSP_Logger DLL_PREFIX_I *csp_logger;
+
+void VM::decl_state(void)
+{
+       state_entry = new csp_state_utils(STATE_VERSION, 0, (_TCHAR *)(_T("CSP::PC88_SERIES_HEAD")), csp_logger);
+       DECL_STATE_ENTRY_BOOL(boot_mode);
+       for(DEVICE* device = first_device; device; device = device->next_device) {
+               device->decl_state();
+       }
+}
 
 void VM::save_state(FILEIO* state_fio)
 {
-       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(boot_mode);
 }
 
 bool VM::load_state(FILEIO* state_fio)
 {
-       if(state_fio->FgetUint32() != STATE_VERSION) {
+       bool mb = false;
+       if(state_entry != NULL) {
+               mb = state_entry->load_state(state_fio);
+       }
+       if(!mb) {
+               emu->out_debug_log("INFO: HEADER DATA ERROR");
                return false;
        }
        for(DEVICE* device = first_device; device; device = device->next_device) {
@@ -533,7 +564,6 @@ bool VM::load_state(FILEIO* state_fio)
                        return false;
                }
        }
-       boot_mode = state_fio->FgetInt32();
        return true;
 }