OSDN Git Service

[VM][FM7] Add sounds; FDD Seeking and Relay.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 2 Oct 2016 16:46:43 +0000 (01:46 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 2 Oct 2016 16:46:43 +0000 (01:46 +0900)
source/src/vm/fm7/fm7.cpp
source/src/vm/fm7/fm7.h
source/src/vm/fm7/fm7_mainio.cpp
source/src/vm/fm7/fm7_mainio.h

index ad7e183..80ec677 100644 (file)
@@ -44,7 +44,9 @@
 #define SIG_DUMMYDEVICE_BIT1 1
 #define SIG_DUMMYDEVICE_BIT2 2
 #endif
-
+#if defined(USE_SOUND_FILES)
+#include "../wav_sounder.h"
+#endif
 #include "./fm7_mainio.h"
 #include "./fm7_mainmem.h"
 #include "./fm7_display.h"
@@ -151,7 +153,11 @@ VM::VM(EMU* parent_emu): emu(parent_emu)
 #else
        led_terminate = new DEVICE(this, emu);
 #endif
-
+#if defined(USE_SOUND_FILES)
+       fdd_seek = new WAV_SOUNDER(this, emu);
+       cmt_relay_on = new WAV_SOUNDER(this, emu);
+       cmt_relay_off = new WAV_SOUNDER(this, emu);
+#endif 
 #if defined(_USE_QT)
        event->set_device_name(_T("EVENT"));
        dummy->set_device_name(_T("1st Dummy"));
@@ -281,6 +287,15 @@ void VM::connect_bus(void)
        event->set_context_sound(psg);
 # endif
        event->set_context_sound(drec);
+#if defined(USE_SOUND_FILES)
+       fdd_seek->load_data(_T("FDDSEEK.WAV"));
+       event->set_context_sound(fdd_seek);
+       
+       cmt_relay_on->load_data(_T("RELAY_ON.WAV"));
+       cmt_relay_off->load_data(_T("RELAYOFF.WAV"));
+       event->set_context_sound(cmt_relay_on);
+       event->set_context_sound(cmt_relay_off);
+#endif
 # if defined(_FM77AV_VARIANTS)
        event->set_context_sound(keyboard_beep);
 # endif
@@ -363,6 +378,11 @@ void VM::connect_bus(void)
                fdc->set_context_irq(mainio, FM7_MAINIO_FDC_IRQ, 0x1);
                fdc->set_context_drq(mainio, FM7_MAINIO_FDC_DRQ, 0x1);
                mainio->set_context_fdc(fdc);
+#if defined(USE_SOUND_FILES)
+               fdc->set_context_seek(fdd_seek);
+               mainio->set_context_relay_on(cmt_relay_on);
+               mainio->set_context_relay_off(cmt_relay_off);
+#endif
 #if defined(_FM8) || (_FM7) || (_FMNEW7)
        }
 #endif 
@@ -626,7 +646,15 @@ void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r)
         else if(ch-- == 0) {
                keyboard_beep->set_volume(0, decibel_l, decibel_r);
        }
-#endif 
+#endif
+#if defined(USE_SOUND_FILES)
+        else if(ch-- == 0) {
+                fdd_seek->set_volume(0, decibel_l, decibel_r);
+        } else if(ch-- == 0) {
+                cmt_relay_on->set_volume(0, decibel_l, decibel_r);
+                cmt_relay_off->set_volume(0, decibel_l, decibel_r);
+        }
+#endif
 }
 #endif
 
index 9264a87..1a8b3dd 100644 (file)
@@ -38,7 +38,9 @@
 #define USE_DEBUGGER
 #define DATAREC_SOUND
 #define USE_DIG_RESOLUTION
-
+#if defined(_USE_QT)
+#define USE_SOUND_FILES 3
+#endif
 #if defined(_FM8)
 #define DEVICE_NAME            "FUJITSU FM-8"
 #define CONFIG_NAME            "fm8"
 #define SOUND_DEVICE_TYPE_DEFAULT      1
 #endif
 
-#if defined(_FM8)
-#define USE_SOUND_VOLUME       3
+#if defined(USE_SOUND_FILES)
+# if defined(_FM8)
+#define USE_SOUND_VOLUME       5
+# else
+#define USE_SOUND_VOLUME       11
+# endif
 #else
+# if defined(_FM8)
+#define USE_SOUND_VOLUME       3
+# else
 #define USE_SOUND_VOLUME       9
+# endif
 #endif
+
 #define IGNORE_DISK_CRC_DEFAULT                true
 // device informations for virtual machine
 
@@ -317,6 +328,9 @@ static const _TCHAR *sound_device_caption[] = {
        _T("PSG(Hack)"),
        _T("Beep"),
        _T("CMT"),
+# if defined(USE_SOUND_FILES)
+       _T("FDD SEEK"), _T("RELAY"),
+# endif
 #else
 # if !defined(_FM77AV_VARIANTS)
        _T("PSG"),
@@ -326,6 +340,9 @@ static const _TCHAR *sound_device_caption[] = {
 # if defined(_FM77AV_VARIANTS)
        _T("Keyboard"),
 # endif
+#if defined(USE_SOUND_FILES)
+       _T("FDD SEEK"), _T("RELAY"),
+#endif
 #endif 
 };
 #endif
@@ -380,7 +397,9 @@ class JOYSTICK;
 #if WITH_Z80
 class Z80;
 #endif
-
+#if defined(USE_SOUND_FILES)
+class WAV_SOUNDER;
+#endif
 class VM {
 protected:
        EMU* emu;
@@ -435,6 +454,11 @@ protected:
 #ifdef CAPABLE_KANJI_CLASS2
        KANJIROM *kanjiclass2;
 #endif
+#if defined(USE_SOUND_FILES)
+       WAV_SOUNDER *fdd_seek;
+       WAV_SOUNDER *cmt_relay_on;
+       WAV_SOUNDER *cmt_relay_off;
+#endif
        bool connect_320kfdc;
        bool connect_1Mfdc;
 public:
index bc6a9c0..fdda300 100644 (file)
@@ -21,6 +21,9 @@
 #if defined(_FM8)
 #include "bubblecasette.h"
 #endif
+#if defined(USE_SOUND_FILES)
+#include "../wav_sounder.h"
+#endif
 
 FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
 {
@@ -55,10 +58,15 @@ FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, paren
        bubble_casette[0] = NULL;
        bubble_casette[1] = NULL;
 #endif 
+#if defined(USE_SOUND_FILES)
+       dev_relay_sound_on = NULL;
+       dev_relay_sound_off = NULL;
+#endif
        // FD00
        clock_fast = true;
        lpt_strobe = false;  // bit6
        lpt_slctin = false;  // bit7
+       drec_flag = 0x00;
        // FD01
        lpt_outdata = 0x00;
        // FD02
@@ -267,7 +275,15 @@ void FM7_MAINIO::reset()
        irqreq_keyboard = false;
        // FD00
        drec->write_signal(SIG_DATAREC_MIC, 0x00, 0x01);
-       drec->set_remote(false);
+       drec->write_signal(SIG_DATAREC_REMOTE, 0x00, 0x02);
+#if defined(USE_SOUND_FILES)
+       if(drec_flag != 0x00) {
+               if(dev_relay_sound_off != NULL) {
+                       dev_relay_sound_off->write_signal(SIG_WAV_SOUNDER_ADD, 0x01, 0x01);
+               }
+       }
+#endif
+       drec_flag = 0x00;
        reset_fdc();
        reset_sound();
        
@@ -357,7 +373,24 @@ uint8_t FM7_MAINIO::get_port_fd00(void)
 void FM7_MAINIO::set_port_fd00(uint8_t data)
 {
        drec->write_signal(SIG_DATAREC_MIC, data, 0x01);
-       drec->set_remote(((data & 0x02) != 0));
+       
+       uint8_t drec_flag_b = data & 0x02;
+       drec->write_signal(SIG_DATAREC_REMOTE, drec_flag_b, 0x02);
+#if defined(USE_SOUND_FILES)
+       if(drec_flag != drec_flag_b) {
+               if(drec_flag_b == 0x02) {
+                       if(dev_relay_sound_on != NULL) {
+                               dev_relay_sound_on->write_signal(SIG_WAV_SOUNDER_ADD, 0x01, 0x01);
+                       }
+               } else {
+                       if(dev_relay_sound_off != NULL) {
+                               dev_relay_sound_off->write_signal(SIG_WAV_SOUNDER_ADD, 0x01, 0x01);
+                       }
+               }                       
+       }
+#endif
+       drec_flag = drec_flag_b;
+       
        lpt_slctin = ((data & 0x80) == 0);
        lpt_strobe = ((data & 0x40) != 0);
        this->write_signals(&printer_strobe_bus, lpt_strobe ? 0xffffffff : 0);
@@ -1628,7 +1661,7 @@ void FM7_MAINIO::event_vline(int v, int clock)
 {
 }
 
-#define STATE_VERSION 6
+#define STATE_VERSION 7
 void FM7_MAINIO::save_state(FILEIO *state_fio)
 {
        int ch;
@@ -1784,7 +1817,10 @@ void FM7_MAINIO::save_state(FILEIO *state_fio)
 #if defined(_FM77AV_VARIANTS)
                state_fio->FputUint8(reg_fd12);
 #endif         
-       }               
+       }
+       {
+               state_fio->FputUint8(drec_flag);
+       }
 }
 
 bool FM7_MAINIO::load_state(FILEIO *state_fio)
@@ -1943,6 +1979,9 @@ bool FM7_MAINIO::load_state(FILEIO *state_fio)
                reg_fd12 = state_fio->FgetUint8();
 #endif         
        }
+       {
+               drec_flag = state_fio->FgetUint8();
+       }
        if(version != STATE_VERSION) return false;
        return true;
 }
index cf1b981..798f75c 100644 (file)
@@ -53,6 +53,7 @@ class FM7_MAINIO : public DEVICE {
        /* FD00: W */
        bool lpt_strobe;  // bit6
        bool lpt_slctin;  // bit7
+       uint8_t drec_flag;
        /* FD01: W */
        uint8_t lpt_outdata; //
 
@@ -360,7 +361,11 @@ class FM7_MAINIO : public DEVICE {
 #if defined(_FM8)
        BUBBLECASETTE *bubble_casette[2];
 #endif
- public:
+#if defined(USE_SOUND_FILES)
+       DEVICE *dev_relay_sound_on;
+       DEVICE *dev_relay_sound_off;
+#endif
+public:
        FM7_MAINIO(VM* parent_vm, EMU* parent_emu);
        ~FM7_MAINIO();
        void event_vline(int v, int clock);
@@ -485,6 +490,14 @@ class FM7_MAINIO : public DEVICE {
        void set_context_printer_select(DEVICE *p, int id, uint32_t mask) {
                register_output_signal(&printer_select_bus, p, id, mask);
        }
+#if defined(USE_SOUND_FILES)
+       void set_context_relay_on(DEVICE *p) {
+               dev_relay_sound_on = p;
+       }
+       void set_context_relay_off(DEVICE *p) {
+               dev_relay_sound_off = p;
+       }
+#endif 
 #if defined(_FM8)
        void set_context_bubble(BUBBLECASETTE *p, int drive) {
                if(drive > 2) return;