OSDN Git Service

[BUILD] Set SOVERSION and GIT hash automatically.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pc8801 / pc8801.cpp
index 414cb72..55e651c 100644 (file)
@@ -23,6 +23,7 @@
 #include "../z80.h"
 
 #include "../disk.h"
+#include "../noise.h"
 #include "../pc80s31k.h"
 #include "../upd765a.h"
 
@@ -40,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;
@@ -50,79 +51,123 @@ 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);
-       
+       dummy->set_device_name(_T("1st Dummy"));
        pc88 = new PC88(this, emu);
+
+  #if defined(_PC8001) || defined(_PC8001MK2) || defined(_PC8001SR)
+       pc88->set_device_name(_T("PC8001 MAIN"));
+  #else
+       pc88->set_device_name(_T("PC8801 MAIN"));
+  #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(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
-//             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 {
                pc88prn = dummy;
        }
+
+       dummycpu = new DEVICE(this, emu);
        pc88cpu = new Z80(this, emu);
 //     pc88cpu->set_context_event_manager(pc88event);
-       dummycpu = new DEVICE(this, emu);
+       dummycpu->set_device_name(_T("DUMMY CPU"));
+       pc88cpu->set_device_name(_T("MAIN CPU(Z80)"));
        
        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);
-       
+
 #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);
+//     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(dummycpu, 7987248 / 8);
-       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(dummycpu, 3993624 / 4);
        pc88event->set_context_cpu(pc88cpu, 3993624);
 #endif
        pc88event->set_context_cpu(pc88cpu_sub, 3993624);
@@ -138,6 +183,9 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
        pc88event->set_context_sound(pc88pcm1);
        pc88event->set_context_sound(pc88pcm2);
 #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
@@ -183,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);
@@ -198,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()
@@ -241,7 +295,7 @@ void VM::reset()
        }
        
        // initial device settings
-       pc88opn->SetReg(0x29, 3); // for Misty Blue
+       pc88opn->set_reg(0x29, 3); // for Misty Blue
        pc88pio->write_signal(SIG_I8255_PORT_C, 0, 0xff);
        pc88pio_sub->write_signal(SIG_I8255_PORT_C, 0, 0xff);
 }
@@ -251,9 +305,9 @@ void VM::run()
        pc88event->drive();
 }
 
-double VM::frame_rate()
+double VM::get_frame_rate()
 {
-       return pc88event->frame_rate();
+       return pc88event->get_frame_rate();
 }
 
 // ----------------------------------------------------------------------------
@@ -281,11 +335,6 @@ void VM::draw_screen()
        pc88->draw_screen();
 }
 
-int VM::access_lamp()
-{
-       return pc88fdc_sub->read_signal(0);
-}
-
 // ----------------------------------------------------------------------------
 // soud manager
 // ----------------------------------------------------------------------------
@@ -298,36 +347,36 @@ void VM::initialize_sound(int rate, int samples)
        // init sound gen
 #ifdef SUPPORT_PC88_OPNA
        if(pc88opn->is_ym2608) {
-               pc88opn->init(rate, 7987248, samples, 0, 0);
+               pc88opn->initialize_sound(rate, 7987248, samples, 0, 0);
        } else
 #endif
-       pc88opn->init(rate, 3993624, samples, 0, 0);
+       pc88opn->initialize_sound(rate, 3993624, samples, 0, 0);
 #ifdef SUPPORT_PC88_SB2
        if(pc88sb2 != NULL) {
 #ifdef SUPPORT_PC88_OPNA
                if(pc88sb2->is_ym2608) {
-                       pc88sb2->init(rate, 7987248, samples, 0, 0);
+                       pc88sb2->initialize_sound(rate, 7987248, samples, 0, 0);
                } else
 #endif
-               pc88sb2->init(rate, 3993624, samples, 0, 0);
+               pc88sb2->initialize_sound(rate, 3993624, samples, 0, 0);
        }
 #endif
-       pc88pcm->init(rate, 8000);
+       pc88pcm->initialize_sound(rate, 8000);
 #ifdef SUPPORT_PC88_PCG8100
-       pc88pcm0->init(rate, 8000);
-       pc88pcm1->init(rate, 8000);
-       pc88pcm2->init(rate, 8000);
+       pc88pcm0->initialize_sound(rate, 8000);
+       pc88pcm1->initialize_sound(rate, 8000);
+       pc88pcm2->initialize_sound(rate, 8000);
 #endif
 }
 
-uint16* VM::create_sound(int* extra_frames)
+uint16_t* VM::create_sound(int* extra_frames)
 {
        return pc88event->create_sound(extra_frames);
 }
 
-int VM::sound_buffer_ptr()
+int VM::get_sound_buffer_ptr()
 {
-       return pc88event->sound_buffer_ptr();
+       return pc88event->get_sound_buffer_ptr();
 }
 
 #ifdef USE_SOUND_VOLUME
@@ -352,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);
@@ -361,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);
@@ -369,6 +420,10 @@ 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);
        }
 }
 #endif
@@ -386,77 +441,78 @@ 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
 // ----------------------------------------------------------------------------
 
-void VM::open_disk(int drv, const _TCHAR* file_path, int bank)
+void VM::open_floppy_disk(int drv, const _TCHAR* file_path, int bank)
 {
        pc88fdc_sub->open_disk(drv, file_path, bank);
 }
 
-void VM::close_disk(int drv)
+void VM::close_floppy_disk(int drv)
 {
        pc88fdc_sub->close_disk(drv);
 }
 
-bool VM::disk_inserted(int drv)
+bool VM::is_floppy_disk_inserted(int drv)
+{
+       return pc88fdc_sub->is_disk_inserted(drv);
+}
+
+void VM::is_floppy_disk_protected(int drv, bool value)
 {
-       return pc88fdc_sub->disk_inserted(drv);
+       pc88fdc_sub->is_disk_protected(drv, value);
 }
 
-void VM::set_disk_protected(int drv, bool value)
+bool VM::is_floppy_disk_protected(int drv)
 {
-       pc88fdc_sub->set_disk_protected(drv, value);
+       return pc88fdc_sub->is_disk_protected(drv);
 }
 
-bool VM::get_disk_protected(int drv)
+uint32_t VM::is_floppy_disk_accessed()
 {
-       return pc88fdc_sub->get_disk_protected(drv);
+       return pc88fdc_sub->read_signal(0);
 }
 
-void VM::play_tape(const _TCHAR* file_path)
+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::tape_inserted()
+bool VM::is_tape_inserted(int drv)
 {
-       return pc88->tape_inserted();
+       return pc88->is_tape_inserted();
 }
 
-bool VM::now_skip()
+bool VM::is_frame_skippable()
 {
-//     return event->now_skip();
-       return pc88->now_skip();
+//     return event->is_frame_skippable();
+       return pc88->is_frame_skippable();
 }
 
 void VM::update_config()
 {
-       int ii;
-       uint32 vol1, vol2;
-#ifdef USE_MULTIPLE_SOUNDCARDS
-       vol1 = vol2 = 256; // Card1
-       pc88opn->write_signal(SIG_YM2203_LVOLUME, vol1, 0xffffffff); // OPN: LEFT
-       pc88opn->write_signal(SIG_YM2203_RVOLUME, vol2, 0xffffffff); // OPN: RIGHT
-# ifdef SUPPORT_PC88_SB2
-       if(pc88sb2 != NULL) {
-               vol1 = vol2 = 256; // Card2
-               pc88sb2->write_signal(SIG_YM2203_LVOLUME, vol1, 0xffffffff); // OPN: LEFT
-               pc88sb2->write_signal(SIG_YM2203_RVOLUME, vol2, 0xffffffff); // OPN: RIGHT
-       }
-# endif
-#endif
        if(boot_mode != config.boot_mode) {
                // boot mode is changed !!!
                boot_mode = config.boot_mode;
@@ -468,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) {
@@ -490,7 +564,6 @@ bool VM::load_state(FILEIO* state_fio)
                        return false;
                }
        }
-       boot_mode = state_fio->FgetInt32();
        return true;
 }