OSDN Git Service

[VM][FM7] Floppy working(at least reading).
authorK.Ohta <whatisthis.sowhat@gmail.com>
Thu, 12 Mar 2015 07:11:17 +0000 (16:11 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Thu, 12 Mar 2015 07:11:17 +0000 (16:11 +0900)
source/build-cmake/fm7/CMakeLists.txt
source/src/vm/fm7/fm7.cpp
source/src/vm/fm7/fm7.h
source/src/vm/fm7/fm7_common.h
source/src/vm/fm7/fm7_mainio.cpp
source/src/vm/fm7/fm7_mainio.h

index 945a039..f402509 100644 (file)
@@ -28,7 +28,7 @@ set(LOCAL_LIBS           vm_fm7
 set(VMFILES
                   mc6809.cpp
 #
-                  beep.cpp
+                  pcm1bit.cpp
                   mb8877.cpp
                   
                   ym2203.cpp
index 3b048e3..bf94524 100644 (file)
@@ -54,7 +54,7 @@ VM::VM(EMU* parent_emu): emu(parent_emu)
        // I/Os
        drec = new DATAREC(this, emu);
        //      keyboard = new FM7_KEYBOARD(this, emu);
-       beep = new BEEP(this, emu);
+       pcm1bit = new PCM1BIT(this, emu);
        fdc  = new MB8877(this, emu);
        
        switch(config.sound_device_type) {
@@ -99,6 +99,7 @@ VM::VM(EMU* parent_emu): emu(parent_emu)
        kanjiclass2 = new KANJIROM(this, emu, true);
 #endif
        connect_bus();
+       initialize();
 }
 
 VM::~VM()
@@ -199,12 +200,12 @@ void VM::connect_bus(void)
        mainio->set_context_display(display);
        
        //FDC
-       fdc->set_context_irq(mainio, FM7_MAINIO_FDC_IRQ, 0xffffffff);
-       fdc->set_context_drq(mainio, FM7_MAINIO_FDC_DRQ, 0xffffffff);
        mainio->set_context_fdc(fdc);
+       fdc->set_context_irq(mainio, FM7_MAINIO_FDC_IRQ, 0x1);
+       fdc->set_context_drq(mainio, FM7_MAINIO_FDC_DRQ, 0x1);
        // SOUND
-       mainio->set_context_beep(beep);
-       event->set_context_sound(beep);
+       mainio->set_context_beep(pcm1bit);
+       event->set_context_sound(pcm1bit);
        
        if(connect_opn) {
                opn[0]->set_context_irq(mainio, FM7_MAINIO_OPN_IRQ, 0xffffffff);
@@ -223,7 +224,10 @@ void VM::connect_bus(void)
        }
    
 #if !defined(_FM77AV_VARIANTS)
-       if(psg != NULL) event->set_context_sound(psg);
+       if(psg != NULL) {
+               mainio->set_context_psg(psg);
+               event->set_context_sound(psg);
+       }
 #endif
        if(connect_opn) {
                event->set_context_sound(opn[0]);
@@ -349,18 +353,20 @@ void VM::initialize_sound(int rate, int samples)
        if(opn[1] != NULL) opn[1]->init(rate, 1228800, samples, 0, 0);
        if(opn[2] != NULL) opn[2]->init(rate, 1228800, samples, 0, 0);
        if(psg != NULL) psg->init(rate, 1228800, samples, 0, 0);
-       beep->init(rate, 1200.0, -5);
-       drec->init_pcm(rate, -2);
+       pcm1bit->init(rate, 8000);
+       //      drec->init_pcm(rate, 0);
 }
 
 uint16* VM::create_sound(int* extra_frames)
 {
-       return event->create_sound(extra_frames);
+       uint16* p = event->create_sound(extra_frames);
+       return p;
 }
 
 int VM::sound_buffer_ptr()
 {
-       return event->sound_buffer_ptr();
+       int pos = event->sound_buffer_ptr();
+       return pos; 
 }
 
 // ----------------------------------------------------------------------------
index 2cd943c..f542b60 100644 (file)
 #define USE_DIPSWITCH
 #define USE_BOOT_MODE
 #define USE_CPU_TYPE
+//#define HAS_AY_3_8910
+// 4:3
+#define SCREEN_WIDTH_ASPECT 400 
+#define SCREEN_HEIGHT_ASPECT 300
 
 #define NOTIFY_KEY_DOWN
 #define NOTIFY_KEY_UP
@@ -120,7 +124,7 @@ class DEVICE;
 class EVENT;
 class FILEIO;
 
-class BEEP;
+class PCM1BIT;
 class MC6809;
 class YM2203;
 class MB8877;
@@ -152,7 +156,7 @@ protected:
        MB8877* fdc;
         YM2203* opn[3];
         YM2203* psg; // Is right? AY-3-8910 is right device.
-        BEEP* beep;
+        PCM1BIT* pcm1bit;
        DATAREC *drec;
    
 #ifdef  WITH_Z80
index e2503da..78f12b2 100644 (file)
@@ -53,6 +53,7 @@ enum {
 
 enum {
        EVENT_BEEP_OFF = 0,
+       EVENT_BEEP_CYCLE,
        EVENT_UP_BREAK,
        EVENT_FM7SUB_DISPLAY_NMI = 32,
        EVENT_FM7SUB_HDISP,
index 6bd906e..cd155cc 100644 (file)
@@ -19,7 +19,8 @@ void FM7_MAINIO::initialize(void)
 #else
        clock_fast = true;
 #endif
-   
+       //      connect_fdc = true;
+       event_beep = -1;
 }
 
 void FM7_MAINIO::set_clockmode(uint8 flags)
@@ -107,8 +108,17 @@ void FM7_MAINIO::do_irq(bool flag)
 
 void FM7_MAINIO::set_beep(uint32 data) // fd03
 {
-       beep->write_signal(SIG_BEEP_ON, data, 0b11000000);
-       beep->write_signal(SIG_BEEP_MUTE, data , 0b00000001);
+       beep_flag = ((data & 0xc0) != 0);
+       beep_flag &= (data & 0x01); 
+       //beep->write_signal(SIG_BEEP_ON, data, 0b11000000);
+       //beep->write_signal(SIG_BEEP_MUTE, ~data , 0b00000001);
+       if(beep_flag) {
+               beep_snd = true;
+               register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep);
+       } else {
+               if(event_beep >= 0) cancel_event(pcm1bit, event_beep);
+               event_beep = -1;
+       }
        if((data & 0x40) != 0) {
                // BEEP ON, after 205ms, BEEP OFF.  
                register_event(this, EVENT_BEEP_OFF, 205.0 * 1000.0, false, NULL); // NEXT CYCLE
@@ -158,14 +168,26 @@ void FM7_MAINIO::set_irq_keyboard(bool flag)
 void FM7_MAINIO::set_irq_mfd(bool flag)
 {
        fdc_irq = flag;
-       if(flag && !irqmask_mfd && connect_fdc) {
+       if(flag &&  connect_fdc) {
                irqstat_fdc |= 0b01000000;
-               do_irq(true);
-               return;
        }
        if((flag == false) && connect_fdc){
                irqstat_fdc &= 0b10111111;
        }
+       if(!irqmask_mfd) do_irq(flag);
+       return;
+}
+
+void FM7_MAINIO::set_drq_mfd(bool flag)
+{
+       fdc_irq = flag;
+       if(flag &&  connect_fdc) {
+               irqstat_fdc |= 0b10000000;
+       }
+       if((flag == false) && connect_fdc){
+               irqstat_fdc &= 0b01111111;
+       }
+       if(!irqmask_mfd) do_irq(flag);
        return;
 }
 
@@ -573,7 +595,10 @@ void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
                        extdet_neg = !val_b;
                        break;
                case FM7_MAINIO_BEEP:
-                       beep->write_signal(SIG_BEEP_ON, data, mask);
+                       beep_flag = true;
+                       beep_snd = true;
+                       register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep);
+                       //beep->write_signal(SIG_BEEP_ON, data, mask);
                        register_event(this, EVENT_BEEP_OFF, 205.0 * 1000.0, false, NULL); // NEXT CYCLE
                        break;
                case FM7_MAINIO_OPNPORTA_CHANGED:
@@ -597,21 +622,9 @@ void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
                        do_irq(val_b);
                                break;
                case FM7_MAINIO_FDC_DRQ:
-                       fdc_drq = val_b;
-                       if(fdc_drq) {
-                               irqstat_fdc |= 0b10000000;
-                       } else {
-                               irqstat_fdc &= 0b01111111;
-                       }
-                       set_irq_mfd(val_b);
+                       set_drq_mfd(val_b);
                        break;
                case FM7_MAINIO_FDC_IRQ:
-                       fdc_irq = val_b;
-                       if(val_b) {
-                               irqstat_fdc |= 0b01000000;
-                       } else {
-                               irqstat_fdc &= 0b10111111;
-                       }
                        set_irq_mfd(val_b);
                        break;
        }
@@ -657,16 +670,16 @@ void FM7_MAINIO::set_ext_fd17(uint8 data)
 
 /* FDD */
 
-void FM7_MAINIO::set_fdc_stat(uint8 val)
+void FM7_MAINIO::set_fdc_cmd(uint8 val)
 {
-       if(fdc == NULL) return;
-       fdc_statreg = val;
+       if(!connect_fdc) return;
+       fdc_cmdreg = val;
        fdc->write_io8(0, val & 0x00ff);
 }
 
 uint8 FM7_MAINIO::get_fdc_stat(void)
 {
-       if(fdc == NULL) return 0xff;
+       if(!connect_fdc) return 0xff;
        this->write_signal(FM7_MAINIO_FDC_IRQ, 0, 1);
        fdc_statreg =  fdc->read_io8(0);
        return fdc_statreg;
@@ -674,7 +687,7 @@ uint8 FM7_MAINIO::get_fdc_stat(void)
 
 void FM7_MAINIO::set_fdc_track(uint8 val)
 {
-       if(fdc == NULL) return;
+       if(!connect_fdc) return;
        // if mode is 2DD and type-of-image = 2D then val >>= 1;
        fdc_trackreg = val;
        fdc->write_io8(1, val & 0x00ff);
@@ -682,21 +695,21 @@ void FM7_MAINIO::set_fdc_track(uint8 val)
 
 uint8 FM7_MAINIO::get_fdc_track(void)
 {
-       if(fdc == NULL) return 0xff;
+       if(!connect_fdc) return 0xff;
        fdc_trackreg = fdc->read_io8(1);
        return fdc_trackreg;
 }
 
 void FM7_MAINIO::set_fdc_sector(uint8 val)
 {
-       if(fdc == NULL) return;
+       if(!connect_fdc) return;
        fdc_sectreg = val;
        fdc->write_io8(2, val & 0x00ff);
 }
 
 uint8 FM7_MAINIO::get_fdc_sector(void)
 {
-       if(fdc == NULL) return 0xff;
+       if(!connect_fdc) return 0xff;
        fdc_sectreg = fdc->read_io8(2);
        return fdc_sectreg;
 }
@@ -718,7 +731,7 @@ uint8 FM7_MAINIO::get_fdc_data(void)
 uint8 FM7_MAINIO::get_fdc_motor(void)
 {
        uint8 val = 0x00;
-       if(fdc == NULL) return 0xff;
+       if(!connect_fdc) return 0xff;
        if(fdc_motor) val = 0x80;
        val = val | (fdc_drvsel & 0x03);
        return val;
@@ -726,26 +739,27 @@ uint8 FM7_MAINIO::get_fdc_motor(void)
   
 void FM7_MAINIO::set_fdc_fd1c(uint8 val)
 {
-       if(fdc == NULL) return;
+       if(!connect_fdc) return;
        fdc_headreg = (val & 0x01) | 0xfe;
        fdc->write_signal(SIG_MB8877_SIDEREG, val, 0x01);
 }
 
 uint8 FM7_MAINIO::get_fdc_fd1c(void)
 {
-       if(fdc == NULL) return 0xff;
+       if(!connect_fdc) return 0xff;
        return fdc_headreg;
 }
 
 void FM7_MAINIO::set_fdc_fd1d(uint8 val)
 {
-       if(fdc == NULL) return;
+       if(!connect_fdc) return;
        if((val & 0x80) != 0) {
                fdc_motor = true;
        } else {
                fdc_motor = false;
        }
-       fdc->write_signal(SIG_MB8877_DRIVEREG, val, 0x07);
+       //      fdc->write_signal(SIG_MB8877_DRIVEREG, val, 0x07);
+       fdc->write_signal(SIG_MB8877_DRIVEREG, val, 0x03);
        fdc->write_signal(SIG_MB8877_MOTOR, val, 0x80);
        fdc_drvsel = val;
 }
@@ -852,7 +866,7 @@ uint32 FM7_MAINIO::read_data8(uint32 addr)
                        return (uint32) get_extirq_fd17();
                        break;
                case 0x18: // FDC: STATUS
-                       return (uint32) get_fdc_stat();
+                       return (uint32) get_fdc_stat();
                        break;
                case 0x19: // FDC: Track
                        return (uint32) get_fdc_track();
@@ -870,7 +884,7 @@ uint32 FM7_MAINIO::read_data8(uint32 addr)
                        return (uint32) get_fdc_motor();
                        break;
                case 0x1f:
-                       return (uint32) irqstat_fdc;
+                       return (uint32) fdc_getdrqirq();
                        break;
                case 0x22: // Kanji ROM
                        return (uint32) read_kanjidata_left();
@@ -957,8 +971,8 @@ void FM7_MAINIO::write_data8(uint32 addr, uint32 data)
                case 0x17:
                        set_ext_fd17((uint8)data);
                        break;
-               case 0x18: // FDC: STATUS
-                       set_fdc_stat((uint8)data);
+               case 0x18: // FDC: COMMAND
+                       set_fdc_cmd((uint8)data);
                        break;
                case 0x19: // FDC: Track
                        set_fdc_track((uint8)data);
@@ -1029,7 +1043,18 @@ void FM7_MAINIO::event_callback(int event_id, int err)
 {
        switch(event_id) {
                case EVENT_BEEP_OFF:
-                       beep->write_signal(SIG_BEEP_ON, 0x00, 0x01);
+                       //beep->write_signal(SIG_BEEP_ON, 0x00, 0x01);
+                       beep_flag = false;
+                       beep_snd = false;
+                       if(event_beep >= 0) {
+                               cancel_event(this, event_beep);
+                               event_beep = -1;
+                       }
+                       pcm1bit->write_signal(SIG_PCM1BIT_ON, 0, 1);
+                       break;
+               case EVENT_BEEP_CYCLE:
+                       beep_snd = !beep_snd;
+                       pcm1bit->write_signal(SIG_PCM1BIT_ON, beep_snd? 1 : 0, 1);
                        break;
                case EVENT_UP_BREAK:
                        set_break_key(false);
index 9c9aa90..bafee48 100644 (file)
@@ -18,7 +18,7 @@
 #include "../mb8877.h"
 #include "../disk.h"
 #include "../datarec.h"
-#include "../beep.h"
+#include "../pcm1bit.h"
 #include "../ym2203.h"
 
 #include "fm7_common.h"
@@ -27,7 +27,9 @@
 class FM7_MAINIO : public DEVICE {
  private:
        bool opn_psg_77av;
-  
+       bool beep_flag;
+       bool beep_snd;
+       int event_beep;  
  protected:
        VM* p_vm;
        EMU* p_emu;
@@ -204,6 +206,7 @@ class FM7_MAINIO : public DEVICE {
        void set_irq_keyboard(bool flag);
        void set_irq_opn(bool flag);
        void set_irq_mfd(bool flag);
+       void set_drq_mfd(bool flag);
        virtual void set_keyboard(uint32 data);  
 
        // FD04
@@ -263,7 +266,7 @@ class FM7_MAINIO : public DEVICE {
        void set_fdc_fd1d(uint8 val);
        
        uint8 get_fdc_stat(void);
-       void set_fdc_stat(uint8 val);
+       void set_fdc_cmd(uint8 val);
        uint8 fdc_getdrqirq(void);
 
        virtual void set_fdc_track(uint8 val);
@@ -282,7 +285,7 @@ class FM7_MAINIO : public DEVICE {
        DEVICE* psg; // FM-7/77 ONLY
        
        DEVICE* drec;
-        DEVICE* beep;
+        DEVICE* pcm1bit;
        DEVICE* fdc;
        //FM7_PRINTER *printer;
        //FM7_RS232C *rs232c;
@@ -424,7 +427,7 @@ class FM7_MAINIO : public DEVICE {
        }
        void set_context_beep(DEVICE *p)
        {
-               beep = p;
+               pcm1bit = p;
        }
        void set_context_datarec(DEVICE *p)
        {
@@ -435,12 +438,20 @@ class FM7_MAINIO : public DEVICE {
                if((ch < 0) || (ch > 2)) return;
                opn[ch] = p;
        }
+       void set_context_psg(DEVICE *p)
+       {
+               psg = p;
+       }
        void set_context_fdc(DEVICE *p){
                if(p == NULL) {
                        connect_fdc = false;
                } else {
                        connect_fdc = true;
                }
+               if(connect_fdc) {
+                       extdet_neg = true;
+               }
+               printf("FDC: connect=%d\n", connect_fdc);
                fdc = p;
        }
        void set_context_maincpu(MC6809 *p){