OSDN Git Service

[GENERAL] Merge upstream 2018-02-25.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Tue, 27 Feb 2018 15:27:37 +0000 (00:27 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Tue, 27 Feb 2018 15:27:37 +0000 (00:27 +0900)
45 files changed:
source/history.txt
source/src/config.cpp
source/src/res/mz1500.rc
source/src/res/mz2200.rc
source/src/res/mz2500.rc
source/src/res/mz800.rc
source/src/res/mz80a.rc
source/src/res/mz80b.rc
source/src/res/pc100.rc
source/src/res/x1turbo.rc
source/src/res/x1turboz.rc
source/src/vm/disk.cpp
source/src/vm/disk.h
source/src/vm/fm16pi/fm16pi.cpp
source/src/vm/fmr30/floppy.cpp
source/src/vm/fmr30/floppy.h
source/src/vm/fmr50/bios.cpp
source/src/vm/fmr50/bios.h
source/src/vm/fmr50/floppy.cpp
source/src/vm/fmr50/floppy.h
source/src/vm/hc20/hc20.cpp
source/src/vm/mb8877.cpp
source/src/vm/mb8877.h
source/src/vm/msx/memory.cpp
source/src/vm/msx/memory_ex.cpp
source/src/vm/mz2500/mz80b.cpp
source/src/vm/mz2500/mz80b.h
source/src/vm/mz2800/floppy.cpp
source/src/vm/mz2800/floppy.h
source/src/vm/mz3500/mz3500.cpp
source/src/vm/mz700/mz700.cpp
source/src/vm/mz700/mz700.h
source/src/vm/mz80k/mz80k.cpp
source/src/vm/mz80k/mz80k.h
source/src/vm/pc100/ioctrl.cpp
source/src/vm/pc100/pc100.cpp
source/src/vm/pc100/pc100.h
source/src/vm/pc6001/floppy.cpp
source/src/vm/pc6031.cpp
source/src/vm/pc98ha/floppy.cpp
source/src/vm/ptf20.cpp
source/src/vm/x1/floppy.cpp
source/src/vm/x1/floppy.h
source/src/vm/x1/x1.cpp
source/src/vm/x1/x1.h

index b3c477a..715749a 100644 (file)
@@ -1,3 +1,26 @@
+2/25/2018
+
+[VM/DISK] improve for case 2D/2DD disk is inserted to 2DD/2D drive
+
+[FMR30/FLOPPY] support to change drive type 2DD/2HD
+[FMR30/FLOPPY] support to get media type 2D/2DD/2HD
+[FMR50/BIOS] suppoert int 93h, ah=00h/01h to set/get drive type
+[FMR50/BIOS] improve int 93h, ah=02h to get sector size and media type
+[FMR50/FLOPPY] support to change drive type 2DD/2HD
+[MZ80A] support to select floppy drive type 2D/2DD
+[MZ80B] support to select floppy drive type 2D/2DD
+[MZ80B] support to select cpu clock 4MHz/6MHz
+[MZ800] support to select floppy drive type 2D/2DD
+[MZ1500] support to select floppy drive type 2D/2DD
+[MZ2200] support to select floppy drive type 2D/2DD
+[MZ2200] support to select cpu clock 4MHz/6MHz
+[MZ2800/FLOPPY] support to change drive type 2DD/2HD
+[PC100] support to select floppy drive type 2D/2DD
+[PC100/IOCTRL] improve dipswitch value for floppy drive type 2D/2DD
+[X1TURBO] support to select floppy drive type 2D/2DD/2HD
+[X1TURBO/FLOPPY] support to change drive type 2D/2DD/2HD
+
+
 2/23/2018
 
 [VM/DISK] support two side
index 3a1ec40..8a7246b 100644 (file)
@@ -58,7 +58,6 @@ void initialize_config()
        config.full_speed = false;      
        
        // control
-       
        #if defined(USE_BOOT_MODE) && defined(BOOT_MODE_DEFAULT)
                config.boot_mode = BOOT_MODE_DEFAULT;
        #endif
index 6ba2ccc..b576689 100644 (file)
@@ -172,6 +172,11 @@ BEGIN
     END
     POPUP "Device"
     BEGIN
+        POPUP "Drive"
+        BEGIN
+            MENUITEM "Floppy Drive 2D",         ID_VM_DRIVE_TYPE0
+            MENUITEM "Floppy Drive 2DD",        ID_VM_DRIVE_TYPE1
+        END
         POPUP "Sound"
         BEGIN
             MENUITEM "Play FDD Noise",          ID_VM_SOUND_NOISE_FDD
index 1d84291..4429404 100644 (file)
@@ -81,8 +81,8 @@ IDR_MENU1 MENU DISCARDABLE
 BEGIN
     POPUP "Control"
     BEGIN
-        MENUITEM "Reset",                       ID_SPECIAL_RESET
         MENUITEM "IPL Reset",                   ID_RESET
+        MENUITEM "Reset",                       ID_SPECIAL_RESET
         MENUITEM SEPARATOR
         MENUITEM "CPU x1",                      ID_CPU_POWER0
         MENUITEM "CPU x2",                      ID_CPU_POWER1
@@ -197,6 +197,16 @@ BEGIN
     END
     POPUP "Device"
     BEGIN
+        POPUP "CPU"
+        BEGIN
+            MENUITEM "4MHz",                    ID_VM_CPU_TYPE0
+            MENUITEM "6MHz",                    ID_VM_CPU_TYPE1
+        END
+        POPUP "Drive"
+        BEGIN
+            MENUITEM "Floppy Drive 2D",         ID_VM_DRIVE_TYPE0
+            MENUITEM "Floppy Drive 2DD",        ID_VM_DRIVE_TYPE1
+        END
         POPUP "Sound"
         BEGIN
             MENUITEM "Play FDD Noise",          ID_VM_SOUND_NOISE_FDD
index 05b2e73..be99ddd 100644 (file)
@@ -82,8 +82,8 @@ IDR_MENU1 MENU DISCARDABLE
 BEGIN
     POPUP "Control"
     BEGIN
-        MENUITEM "Reset",                       ID_SPECIAL_RESET
         MENUITEM "IPL Reset",                   ID_RESET
+        MENUITEM "Reset",                       ID_SPECIAL_RESET
         MENUITEM SEPARATOR
         MENUITEM "CPU x1",                      ID_CPU_POWER0
         MENUITEM "CPU x2",                      ID_CPU_POWER1
index 2103386..31b78eb 100644 (file)
@@ -176,6 +176,11 @@ BEGIN
             MENUITEM "MZ-800"                   ID_VM_BOOT_MODE0
             MENUITEM "MZ-700"                   ID_VM_BOOT_MODE1
         END
+        POPUP "Drive"
+        BEGIN
+            MENUITEM "Floppy Drive 2D",         ID_VM_DRIVE_TYPE0
+            MENUITEM "Floppy Drive 2DD",        ID_VM_DRIVE_TYPE1
+        END
         POPUP "Sound"
         BEGIN
             MENUITEM "Play FDD Noise",          ID_VM_SOUND_NOISE_FDD
index 1455f89..868d682 100644 (file)
@@ -187,6 +187,11 @@ BEGIN
     END
     POPUP "Device"
     BEGIN
+        POPUP "Drive"
+        BEGIN
+            MENUITEM "Floppy Drive 2D",         ID_VM_DRIVE_TYPE0
+            MENUITEM "Floppy Drive 2DD",        ID_VM_DRIVE_TYPE1
+        END
         POPUP "Option"
         BEGIN
             MENUITEM "PCG-8000",                ID_VM_DIPSWITCH0
index 33fcf7d..03a04d7 100644 (file)
@@ -81,8 +81,8 @@ IDR_MENU1 MENU DISCARDABLE
 BEGIN
     POPUP "Control"
     BEGIN
-        MENUITEM "Reset",                       ID_SPECIAL_RESET
         MENUITEM "IPL Reset",                   ID_RESET
+        MENUITEM "Reset",                       ID_SPECIAL_RESET
         MENUITEM SEPARATOR
         MENUITEM "CPU x1",                      ID_CPU_POWER0
         MENUITEM "CPU x2",                      ID_CPU_POWER1
@@ -189,6 +189,16 @@ BEGIN
     END
     POPUP "Device"
     BEGIN
+        POPUP "CPU"
+        BEGIN
+            MENUITEM "4MHz",                    ID_VM_CPU_TYPE0
+            MENUITEM "6MHz",                    ID_VM_CPU_TYPE1
+        END
+        POPUP "Drive"
+        BEGIN
+            MENUITEM "Floppy Drive 2D",         ID_VM_DRIVE_TYPE0
+            MENUITEM "Floppy Drive 2DD",        ID_VM_DRIVE_TYPE1
+        END
         POPUP "Sound"
         BEGIN
             MENUITEM "Play FDD Noise",          ID_VM_SOUND_NOISE_FDD
index 283619c..27d7a07 100644 (file)
@@ -151,6 +151,11 @@ BEGIN
     END
     POPUP "Device"
     BEGIN
+        POPUP "Drive"
+        BEGIN
+            MENUITEM "Floppy Drive 2D",         ID_VM_DRIVE_TYPE0
+            MENUITEM "Floppy Drive 2DD",        ID_VM_DRIVE_TYPE1
+        END
         POPUP "Sound"
         BEGIN
             MENUITEM "Play FDD Noise",          ID_VM_SOUND_NOISE_FDD
index 6af920c..747f7d4 100644 (file)
@@ -174,7 +174,8 @@ BEGIN
         POPUP "Drive"
         BEGIN
             MENUITEM "Floppy Drive 2D",         ID_VM_DRIVE_TYPE0
-            MENUITEM "Floppy Drive 2HD",        ID_VM_DRIVE_TYPE1
+            MENUITEM "Floppy Drive 2DD",        ID_VM_DRIVE_TYPE1
+            MENUITEM "Floppy Drive 2HD",        ID_VM_DRIVE_TYPE2
         END
         POPUP "Keyboard"
         BEGIN
index 87f875a..2ca4cbc 100644 (file)
@@ -174,7 +174,8 @@ BEGIN
         POPUP "Drive"
         BEGIN
             MENUITEM "Floppy Drive 2D",         ID_VM_DRIVE_TYPE0
-            MENUITEM "Floppy Drive 2HD",        ID_VM_DRIVE_TYPE1
+            MENUITEM "Floppy Drive 2DD",        ID_VM_DRIVE_TYPE1
+            MENUITEM "Floppy Drive 2HD",        ID_VM_DRIVE_TYPE2
         END
         POPUP "Keyboard"
         BEGIN
index 1011424..c4ee30f 100644 (file)
@@ -917,6 +917,16 @@ void DISK::save_as_d88(const _TCHAR* file_path)
 
 bool DISK::get_track(int trk, int side)
 {
+       if(media_type == MEDIA_TYPE_2D && drive_type == DRIVE_TYPE_2DD) {
+               trk >>= 1;
+       } else if(media_type == MEDIA_TYPE_2DD && drive_type == DRIVE_TYPE_2D) {
+               trk <<= 1;
+       }
+       return get_track_tmp(trk, side);
+}
+
+bool DISK::get_track_tmp(int trk, int side)
+{
        sector_size.sd = sector_num.sd = 0;
        invalid_format = false;
 //     no_skew = true;
@@ -1063,9 +1073,19 @@ bool DISK::get_track(int trk, int side)
 
 bool DISK::make_track(int trk, int side)
 {
+       if(media_type == MEDIA_TYPE_2D && drive_type == DRIVE_TYPE_2DD) {
+               trk >>= 1;
+       } else if(media_type == MEDIA_TYPE_2DD && drive_type == DRIVE_TYPE_2D) {
+               trk <<= 1;
+       }
+       return make_track_tmp(trk, side);
+}
+
+bool DISK::make_track_tmp(int trk, int side)
+{
        int track_size = get_track_size();
        
-       if(!get_track(trk, side)) {
+       if(!get_track_tmp(trk, side)) {
                // create a dummy track
                for(int i = 0; i < track_size; i++) {
                        track[i] = rand();
@@ -1158,6 +1178,16 @@ bool DISK::make_track(int trk, int side)
 
 bool DISK::get_sector(int trk, int side, int index)
 {
+       if(media_type == MEDIA_TYPE_2D && drive_type == DRIVE_TYPE_2DD) {
+               trk >>= 1;
+       } else if(media_type == MEDIA_TYPE_2DD && drive_type == DRIVE_TYPE_2D) {
+               trk <<= 1;
+       }
+       return get_sector_tmp(trk, side, index);
+}
+
+bool DISK::get_sector_tmp(int trk, int side, int index)
+{
        sector_size.sd = sector_num.sd = 0;
        sector = NULL;
        
@@ -1270,6 +1300,16 @@ void DISK::set_data_mark_missing()
 
 bool DISK::format_track(int trk, int side)
 {
+       if(media_type == MEDIA_TYPE_2D && drive_type == DRIVE_TYPE_2DD) {
+               trk >>= 1;
+       } else if(media_type == MEDIA_TYPE_2DD && drive_type == DRIVE_TYPE_2D) {
+               trk <<= 1;
+       }
+       return format_track_tmp(trk, side);
+}
+
+bool DISK::format_track_tmp(int trk, int side)
+{
        // disk not inserted or invalid media type
        if(!(inserted && check_media_type())) {
                return false;
@@ -1404,6 +1444,17 @@ void DISK::trim_buffer()
        memcpy(buffer, tmp_buffer, min(sizeof(buffer), file_size.d));
 }
 
+int DISK::get_max_tracks()
+{
+       if(drive_type != DRIVE_TYPE_UNK) {
+               return (drive_type != DRIVE_TYPE_2D) ? 84 : 42;
+       } else if(inserted) {
+               return (drive_type != MEDIA_TYPE_2D) ? 84 : 42;
+       } else {
+               return 84; // 2DD or 2HD
+       }
+}
+
 int DISK::get_rpm()
 {
        if(drive_rpm != 0) {
@@ -1445,11 +1496,7 @@ bool DISK::check_media_type()
 {
        switch(drive_type) {
        case DRIVE_TYPE_2D:
-               if(type_fm77av_2dd) {
                        return (media_type == MEDIA_TYPE_2D || media_type == MEDIA_TYPE_2DD);
-               } else {
-                       return (media_type == MEDIA_TYPE_2D);
-               }
        case DRIVE_TYPE_2DD:
                return (media_type == MEDIA_TYPE_2D || media_type == MEDIA_TYPE_2DD);
        case DRIVE_TYPE_2HD:
index 7e1f1a7..539f035 100644 (file)
@@ -117,6 +117,12 @@ private:
        bool solid_to_d88(FILEIO *fio, int type, int ncyl, int nside, int nsec, int size, bool mfm);
        void setup_fd_formats(void);
        
+       // internal routines for track
+       bool get_track_tmp(int trk, int side);
+       bool make_track_tmp(int trk, int side);
+       bool get_sector_tmp(int trk, int side, int index);
+       bool format_track_tmp(int trk, int side);
+       
 public:
 #ifndef _ANY2D88
        DISK(EMU* parent_emu) : emu(parent_emu)
@@ -174,6 +180,7 @@ public:
        void insert_sector(uint8_t c, uint8_t h, uint8_t r, uint8_t n, bool deleted, bool data_crc_error, uint8_t fill_data, int length);
        void sync_buffer();
        
+       int get_max_tracks();
        int get_rpm();
        int get_track_size();
        double get_usec_per_track();
index 2556ba5..f131fb2 100644 (file)
@@ -12,6 +12,7 @@
 #include "../device.h"
 #include "../event.h"
 
+#include "../disk.h"
 #include "../i8251.h"
 #include "../i8253.h"
 #include "../i8255.h"
@@ -252,6 +253,9 @@ VM::~VM()
                delete device;
                device = next_device;
        }
+       for(int i = 0; i < MAX_DRIVE; i++) {
+               fdc->set_drive_type(i, DRIVE_TYPE_2D);
+       }
 }
 
 DEVICE* VM::get_device(int id)
index 1c80505..9fa5194 100644 (file)
@@ -8,6 +8,7 @@
 */
 
 #include "floppy.h"
+#include "../disk.h"
 #include "../i8259.h"
 #include "../mb8877.h"
 
@@ -21,6 +22,13 @@ void FLOPPY::initialize()
        changed[0] = changed[1] = changed[2] = changed[3] = false;
 }
 
+void FLOPPY::reset()
+{
+       for(int i = 0; i < MAX_DRIVE; i++) {
+               d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
+       }
+}
+
 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
 {
        switch(addr & 0xffff) {
@@ -39,6 +47,11 @@ void FLOPPY::write_io8(uint32_t addr, uint32_t data)
                        fdst = changed[drvsel] ? 1 : 0;
                        changed[drvsel] = false;
                }
+               if((drvsel & 2) ? (data & 0x80) : (data & 0x40)) {
+                       d_fdc->set_drive_type(drvsel, DRIVE_TYPE_2DD);
+               } else {
+                       d_fdc->set_drive_type(drvsel, DRIVE_TYPE_2HD);
+               }
                d_fdc->write_signal(SIG_MB8877_MOTOR, 1, 1);
                break;
        case 0x36:
@@ -56,7 +69,13 @@ uint32_t FLOPPY::read_io8(uint32_t addr)
        case 0x34:
                return fdcr;
        case 0x35:
-               return fdsl;
+               {
+                       uint32_t value = fdsl & 0x3f;
+                       if(d_fdc->media_type(drvsel) == MEDIA_TYPE_2D || d_fdc->media_type(drvsel) == MEDIA_TYPE_2DD) {
+                               drvsel |= (drvsel & 2) ? 0x80 : 0x40;
+                       }
+                       return value;
+               }
        case 0x36:
                return fdst;
        }
index a197500..e36acc6 100644 (file)
 
 #define SIG_FLOPPY_IRQ 0
 
+class MB8877;
+
 class FLOPPY : public DEVICE
 {
 private:
-       DEVICE *d_fdc, *d_pic;
+       MB8877 *d_fdc;
+       DEVICE *d_pic;
        
        uint8_t fdcr, fdsl, fdst;
        int drvsel;
@@ -35,6 +38,7 @@ public:
        
        // common functions
        void initialize();
+       void reset();
        void write_io8(uint32_t addr, uint32_t data);
        uint32_t read_io8(uint32_t addr);
        void write_signal(int id, uint32_t data, uint32_t mask);
@@ -42,7 +46,7 @@ public:
        bool load_state(FILEIO* state_fio);
        
        // unique functions
-       void set_context_fdc(DEVICE* device)
+       void set_context_fdc(MB8877* device)
        {
                d_fdc = device;
        }
index 15e2d6d..ad22eb0 100644 (file)
@@ -294,6 +294,8 @@ void BIOS::reset()
 {
        for(int i = 0; i < MAX_DRIVE; i++) {
                access_fdd[i] = false;
+               drive_mode1[i] = 0x03;  // MFM, 2HD, 1024B
+               drive_mode2[i] = 0x208; // 2 Heads, 8 sectors
        }
        for(int i = 0; i < MAX_SCSI; i++) {
                access_scsi[i] = false;
@@ -319,7 +321,36 @@ bool BIOS::bios_call_far_i86(uint32_t PC, uint16_t regs[], uint16_t sregs[], int
 //             emu->out_debug_log(_T("%6x\tDISK BIOS: AH=%2x,AL=%2x,CX=%4x,DX=%4x,BX=%4x,DS=%2x,DI=%2x\n"), get_cpu_pc(0), AH,AL,CX,DX,BX,DS,DI);
                //printf(_T("%6x\tDISK BIOS: AH=%2x,AL=%2x,CX=%4x,DX=%4x,BX=%4x,DS=%2x,DI=%2x\n"), get_cpu_pc(0), AH,AL,CX,DX,BX,DS,DI);
 //#endif
-               if(AH == 2) {
+               if(AH == 0) {
+                       // set drive mode
+                       if(!(drv < MAX_DRIVE)) {
+                               AH = 2;
+                               *CarryFlag = 1;
+                               return true;
+                       }
+                       AH = 0;
+                       drive_mode1[drv] = DL;
+                       drive_mode2[drv] = BX;
+                       switch(DL & 0x30) {
+                       case 0x00: disk[drv]->drive_type = DRIVE_TYPE_2HD; break;
+                       case 0x10: disk[drv]->drive_type = DRIVE_TYPE_2DD; break;
+                       case 0x20: disk[drv]->drive_type = DRIVE_TYPE_2D ; break;
+                       }
+                       *CarryFlag = 0;
+                       return true;
+               } else if(AH == 1) {
+                       // get drive mode
+                       if(!(drv < MAX_DRIVE)) {
+                               AH = 2;
+                               *CarryFlag = 1;
+                               return true;
+                       }
+                       AH = 0;
+                       DL = drive_mode1[drv];
+                       BX = drive_mode2[drv];
+                       *CarryFlag = 0;
+                       return true;
+               } else if(AH == 2) {
                        // drive status
                        if((AL & 0xf0) == 0x20) {
                                // floppy
@@ -330,10 +361,25 @@ bool BIOS::bios_call_far_i86(uint32_t PC, uint16_t regs[], uint16_t sregs[], int
                                        return true;
                                }
                                AH = 0;
-                               DL = 4;
+                               if(disk[drv]->get_track(0, 0) && disk[drv]->get_sector(0, 0, 0)) {
+                                       switch(disk[drv]->sector_size.sd) {
+                                       case 128: AH = 0; break;
+                                       case 256: AH = 1; break;
+                                       case 512: AH = 2; break;
+                                       default : AH = 3; break; // 1024
+                                       }
+                               }
+                               DL = 0;
                                if(disk[drv]->write_protected) {
                                        DL |= 2;
                                }
+                               if(disk[drv]->two_side) {
+                                       DL |= 4;
+                               }
+//                             if(disk[drv]->drive_type == DRIVE_TYPE_2D || disk[drv]->drive_type == DRIVE_TYPE_2DD) {
+                               if(disk[drv]->media_type == MEDIA_TYPE_2D || disk[drv]->media_type == MEDIA_TYPE_2DD) {
+                                       DL |= 0x10;
+                               }
                                CX = 0;
                                *CarryFlag = 0;
                                return true;
@@ -405,7 +451,12 @@ bool BIOS::bios_call_far_i86(uint32_t PC, uint16_t regs[], uint16_t sregs[], int
                                int sct = DL;
                                while(BX > 0) {
                                        // search sector
-                                       disk[drv]->get_track(trk, hed);
+                                       if(!disk[drv]->get_track(trk, hed)) {
+                                               AH = 0x80;
+                                               CX = ERR_FDD_NOTFOUND;
+                                               *CarryFlag = 1;
+                                               return true;
+                                       }
                                        access_fdd[drv] = true;
                                        secnum = sct;
                                        if(!disk[drv]->get_sector(trk, hed, sct - 1)) {
@@ -525,7 +576,12 @@ bool BIOS::bios_call_far_i86(uint32_t PC, uint16_t regs[], uint16_t sregs[], int
                                int sct = DL;
                                while(BX > 0) {
                                        // search sector
-                                       disk[drv]->get_track(trk, hed);
+                                       if(!disk[drv]->get_track(trk, hed)) {
+                                               AH = 0x80;
+                                               CX = ERR_FDD_NOTFOUND;
+                                               *CarryFlag = 1;
+                                               return true;
+                                       }
                                        access_fdd[drv] = true;
                                        secnum = sct;
                                        if(!disk[drv]->get_sector(trk, hed, sct - 1)) {
@@ -627,7 +683,12 @@ bool BIOS::bios_call_far_i86(uint32_t PC, uint16_t regs[], uint16_t sregs[], int
                                int sct = DL;
                                while(BX > 0) {
                                        // search sector
-                                       disk[drv]->get_track(trk, hed);
+                                       if(!disk[drv]->get_track(trk, hed)) {
+                                               AH = 0x80;
+                                               CX = ERR_FDD_NOTFOUND;
+                                               *CarryFlag = 1;
+                                               return true;
+                                       }
                                        access_fdd[drv] = true;
                                        secnum = sct;
                                        if(!disk[drv]->get_sector(trk, hed, sct - 1)) {
@@ -716,7 +777,12 @@ bool BIOS::bios_call_far_i86(uint32_t PC, uint16_t regs[], uint16_t sregs[], int
                                int trk = CX;
                                int hed = DH & 1;
                                // search sector
-                               disk[drv]->get_track(trk, hed);
+                               if(!disk[drv]->get_track(trk, hed)) {
+                                       AH = 0x80;
+                                       CX = ERR_FDD_NOTFOUND;
+                                       *CarryFlag = 1;
+                                       return true;
+                               }
                                access_fdd[drv] = true;
                                if(++secnum > disk[drv]->sector_num.sd) {
                                        secnum = 1;
@@ -950,7 +1016,10 @@ write_id:
                                return true;
                        }
                        // load ipl
-                       disk[0]->get_track(0, 0);
+                       if(!disk[0]->get_track(0, 0)) {
+                               *CarryFlag = 1;
+                               return true;
+                       }
                        access_fdd[0] = true;
                        if(!disk[0]->get_sector(0, 0, 0)) {
                                *CarryFlag = 1;
@@ -1107,7 +1176,7 @@ uint32_t BIOS::read_signal(int ch)
        return stat;
 }
 
-#define STATE_VERSION  3
+#define STATE_VERSION  4
 
 void BIOS::save_state(FILEIO* state_fio)
 {
@@ -1119,6 +1188,9 @@ void BIOS::save_state(FILEIO* state_fio)
        }
        state_fio->FputInt32(secnum);
        state_fio->FputInt32(timeout);
+       state_fio->Fwrite(drive_mode1, sizeof(drive_mode1), 1);
+       state_fio->Fwrite(drive_mode2, sizeof(drive_mode2), 1);
+       state_fio->Fwrite(scsi_blocks, sizeof(scsi_blocks), 1);
 }
 
 bool BIOS::load_state(FILEIO* state_fio)
@@ -1136,6 +1208,9 @@ bool BIOS::load_state(FILEIO* state_fio)
        }
        secnum = state_fio->FgetInt32();
        timeout = state_fio->FgetInt32();
+       state_fio->Fread(drive_mode1, sizeof(drive_mode1), 1);
+       state_fio->Fread(drive_mode2, sizeof(drive_mode2), 1);
+       state_fio->Fread(scsi_blocks, sizeof(scsi_blocks), 1);
        return true;
 }
 
index e082f8e..b57394d 100644 (file)
@@ -35,6 +35,8 @@ private:
        
        // disk bios
        bool access_fdd[MAX_DRIVE], access_scsi[MAX_SCSI];
+       uint8_t  drive_mode1[MAX_DRIVE];
+       uint16_t drive_mode2[MAX_DRIVE];
        int scsi_blocks[MAX_SCSI];
        
 public:
index ed0c4e3..e3aca5c 100644 (file)
@@ -9,6 +9,7 @@
 */
 
 #include "floppy.h"
+#include "../disk.h"
 #include "../i8259.h"
 #include "../mb8877.h"
 
@@ -19,6 +20,13 @@ void FLOPPY::initialize()
        changed[0] = changed[1] = changed[2] = changed[3] = false;
 }
 
+void FLOPPY::reset()
+{
+       for(int i = 0; i < MAX_DRIVE; i++) {
+               d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
+       }
+}
+
 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
 {
        int nextdrv = drvsel;
@@ -28,22 +36,41 @@ void FLOPPY::write_io8(uint32_t addr, uint32_t data)
                // drive control register
                irqmsk = ((data & 1) != 0);
                update_intr();
+               // note: bit5 is CLKSEL, but 0 is set while seeking
+/*
+               for(int i = 0; i < MAX_DRIVE; i++) {
+                       if(data & 0x20) {
+                               d_fdc->set_drive_type(i, DRIVE_TYPE_2DD);
+                       } else {
+                               d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
+                       }
+               }
+*/
                d_fdc->write_signal(SIG_MB8877_MOTOR, data, 0x10);
                d_fdc->write_signal(SIG_MB8877_SIDEREG, data, 4);
                break;
        case 0x20c:
                // drive select register
-               if(data & 1) {
-                       nextdrv = 0;
-               } else if(data & 2) {
-                       nextdrv = 1;
-               } else if(data & 4) {
-                       nextdrv = 2;
-               } else if(data & 8) {
-                       nextdrv = 3;
-               }
-               if(drvsel != nextdrv) {
-                       d_fdc->write_signal(SIG_MB8877_DRIVEREG, drvsel = nextdrv, 3);
+               if(data & 0x0f) {
+                       if(data & 1) {
+                               nextdrv = 0;
+                       } else if(data & 2) {
+                               nextdrv = 1;
+                       } else if(data & 4) {
+                               nextdrv = 2;
+                       } else if(data & 8) {
+                               nextdrv = 3;
+                       }
+                       if(drvsel != nextdrv) {
+                               d_fdc->write_signal(SIG_MB8877_DRIVEREG, drvsel = nextdrv, 3);
+                       }
+                       for(int i = 0; i < MAX_DRIVE; i++) {
+                               if((data & 0xc0) == 0x00) {
+                                       d_fdc->set_drive_type(i, DRIVE_TYPE_2DD); // 300rpm
+                               } else if((data & 0xc0) == 0x40) {
+                                       d_fdc->set_drive_type(i, DRIVE_TYPE_2HD); // 360rpm
+                               }
+                       }
                }
                drvreg = data;
                break;
index d08bdc1..107d2e6 100644 (file)
@@ -38,6 +38,7 @@ public:
        
        // common functions
        void initialize();
+       void reset();
        void write_io8(uint32_t addr, uint32_t data);
        uint32_t read_io8(uint32_t addr);
        void write_signal(int id, uint32_t data, uint32_t mask);
index 410cc69..935c318 100644 (file)
@@ -13,6 +13,7 @@
 #include "../event.h"
 
 #include "../beep.h"
+#include "../disk.h"
 #include "../hd146818p.h"
 #include "../i8255.h"
 //#include "../mc6800.h"
@@ -146,6 +147,9 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
        for(DEVICE* device = first_device; device; device = device->next_device) {
                device->initialize();
        }
+       for(int i = 0; i < MAX_DRIVE; i++) {
+               fdc_tf20->set_drive_type(i, DRIVE_TYPE_2D);
+       }
 }
 
 VM::~VM()
index 11f9bcb..1eb956b 100644 (file)
@@ -1241,17 +1241,11 @@ void MB8877::cmd_seek()
        //seektrk = (uint8_t)(fdc[drvreg].track + datareg - trkreg); // Seek target is differ when drive's track != trkreg.Thanks to Haserin and Ryu Takegami.
        seektrk = (int)((int8_t)datareg);
 //#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77AV20) || defined(_FM77AV20EX)
-       if(type_fm77av_2dd) {
-               if(disk[drvreg]->drive_type != DRIVE_TYPE_2D) {
-                       seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
-               } else {
-                       seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
-               }
-       } else  if(disk[drvreg]->media_type != MEDIA_TYPE_2D){
-               seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
-       } else {
-               seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
-       }               
+       if(seektrk >= disk[drvreg]->get_max_tracks()) {
+               seektrk = disk[drvreg]->get_max_tracks() - 1;
+       } else if(seektrk < 0) {
+               seektrk = 0;
+       }
 
        seekvct = !(seektrk > fdc[drvreg].track);
        // Update track register by data register.Thanks to Ryu Takegami. 20180224 K.O
@@ -1295,17 +1289,11 @@ void MB8877::cmd_stepin()
        }
 
        seektrk = fdc[drvreg].track + 1;
-       if(type_fm77av_2dd) {
-               if(disk[drvreg]->drive_type != DRIVE_TYPE_2D) {
-                       seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
-               } else {
-                       seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
-               }
-       } else  if(disk[drvreg]->media_type != MEDIA_TYPE_2D){
-               seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
-       } else {
-               seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
-       }
+       if(seektrk >= disk[drvreg]->get_max_tracks()) {
+               seektrk = disk[drvreg]->get_max_tracks() - 1;
+       } else if(seektrk < 0) {
+               seektrk = 0;
+       }
        seekvct = false;
        set_irq(false);
        set_drq(false);
@@ -1336,17 +1324,11 @@ void MB8877::cmd_stepout()
        }
 
        seektrk = fdc[drvreg].track - 1;
-       if(type_fm77av_2dd) {
-               if(disk[drvreg]->drive_type != DRIVE_TYPE_2D) {
-                       seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
-               } else {
-                       seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
-               }
-       } else  if(disk[drvreg]->media_type != MEDIA_TYPE_2D){
-               seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
-       } else {
-               seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
-       }               
+       if(seektrk >= disk[drvreg]->get_max_tracks()) {
+               seektrk = disk[drvreg]->get_max_tracks() - 1;
+       } else if(seektrk < 0) {
+               seektrk = 0;
+       }
        seekvct = true;
        register_seek_event();
 }
@@ -1602,6 +1584,7 @@ uint8_t MB8877::search_track()
 {
        // get track
        int track = fdc[drvreg].track;
+#if 0  // ToDo: Test and REMOVE.
 //#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77AV20) || defined(_FM77AV20EX)
        if(type_fm77av_2dd) {
                if(disk[drvreg]->media_type == MEDIA_TYPE_2D) {
@@ -1620,6 +1603,8 @@ uint8_t MB8877::search_track()
                }
        }
 //#endif
+#endif
+
        if(!disk[drvreg]->get_track(track, sidereg)){
                return FDC_ST_SEEKERR;
        }
@@ -1664,6 +1649,7 @@ uint8_t MB8877::search_sector()
        
        // get track
        int track = fdc[drvreg].track;
+#if 0  // ToDo: Test and REMOVE.
 //#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77AV20) || defined(_FM77AV20EX)
        if(type_fm77av_2dd) {
                if(disk[drvreg]->media_type == MEDIA_TYPE_2D) {
@@ -1682,6 +1668,8 @@ uint8_t MB8877::search_sector()
                }
        }
 //#endif
+#endif
+       
        if(!disk[drvreg]->get_track(track, sidereg)) {
                return FDC_ST_RECNFND;
        }
@@ -1760,6 +1748,7 @@ uint8_t MB8877::search_addr()
 {
        // get track
        int track = fdc[drvreg].track;
+#if 0  // ToDo: Test and REMOVE.
 //#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77AV20) || defined(_FM77AV20EX)
        if(type_fm77av_2dd) {
                if(disk[drvreg]->media_type == MEDIA_TYPE_2D) {
@@ -1778,6 +1767,8 @@ uint8_t MB8877::search_addr()
                }
        }
 //#endif
+#endif
+       
        if(!disk[drvreg]->get_track(track, sidereg)) {
                return FDC_ST_RECNFND;
        }
@@ -1965,6 +1956,16 @@ bool MB8877::is_disk_protected(int drv)
        return false;
 }
 
+uint8_t MB8877::media_type(int drv)
+{
+       if(drv < MAX_DRIVE) {
+               if(disk[drv]->inserted) {
+                       return disk[drv]->media_type;
+               }
+       }
+       return MEDIA_TYPE_UNK;
+}
+
 void MB8877::set_drive_type(int drv, uint8_t type)
 {
        if(drv < _max_drive) {
index a81e647..62fb762 100644 (file)
@@ -231,6 +231,7 @@ public:
        bool is_disk_inserted(int drv);
        void is_disk_protected(int drv, bool value);
        bool is_disk_protected(int drv);
+       uint8_t media_type(int drv);
        void set_drive_type(int drv, uint8_t type);
        uint8_t get_drive_type(int drv);
        void set_drive_rpm(int drv, int rpm);
index e323c2e..d9f9292 100644 (file)
@@ -588,6 +588,7 @@ void MEMORY::initialize()
        for(int i = 0; i < MAX_DRIVE; i++) {
                disk[i] = new DISK(emu);
                disk[i]->set_device_name(_T("%s/Disk #%d"), this_device_name, i + 1);
+               disk[i]->drive_type = DRIVE_TYPE_2DD;
        }
 }
 
index 6311333..957dad6 100644 (file)
@@ -988,6 +988,7 @@ void MEMORY_EX::initialize()
        for(int i = 0; i < MAX_DRIVE; i++) {
                disk[i] = new DISK(emu);
                disk[i]->set_device_name(_T("%s/Disk #%d"), this_device_name, i + 1);
+               disk[i]->drive_type = DRIVE_TYPE_2DD;
        }
 }
 
index f6457bc..2d1af52 100644 (file)
@@ -105,7 +105,7 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
 #endif
        
        // set contexts
-       event->set_context_cpu(cpu);
+       event->set_context_cpu(cpu, config.cpu_type ? CPU_CLOCKS_HIGH : CPU_CLOCKS);
 #ifdef SUPPORT_16BIT_BOARD
        event->set_context_cpu(cpu_16, 5000000);
 #endif
@@ -255,10 +255,6 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
        for(DEVICE* device = first_device; device; device = device->next_device) {
                device->initialize();
        }
-       for(int i = 0; i < MAX_DRIVE; i++) {
-               fdc->set_drive_type(i, DRIVE_TYPE_2DD);
-//             fdc->set_drive_type(i, DRIVE_TYPE_2D);
-       }
 }
 
 VM::~VM()
@@ -292,6 +288,13 @@ void VM::reset()
        for(DEVICE* device = first_device; device; device = device->next_device) {
                device->reset();
        }
+       for(int i = 0; i < MAX_DRIVE; i++) {
+               if(config.drive_type) {
+                       fdc->set_drive_type(i, DRIVE_TYPE_2DD);
+               } else {
+                       fdc->set_drive_type(i, DRIVE_TYPE_2D);
+               }
+       }
 }
 
 void VM::special_reset()
index 37b09d6..ae1a2fd 100644 (file)
@@ -31,6 +31,7 @@
 #define FRAMES_PER_SEC         60
 #define LINES_PER_FRAME                262
 #define CPU_CLOCKS             4000000
+#define CPU_CLOCKS_HIGH                6000000
 #define SCREEN_WIDTH           640
 #define SCREEN_HEIGHT          400
 #define WINDOW_HEIGHT_ASPECT   480
@@ -50,6 +51,8 @@
 
 // device informations for win32
 #define USE_SPECIAL_RESET
+#define USE_CPU_TYPE           2
+#define USE_DRIVE_TYPE         2
 #define USE_FD1
 #define USE_FD2
 #define USE_FD3
index caf3251..a84bc79 100644 (file)
@@ -9,6 +9,14 @@
 
 #include "floppy.h"
 #include "../mb8877.h"
+#include "../disk.h"
+
+void FLOPPY::reset()
+{
+       for(int i = 0; i < 4; i++) {
+               d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
+       }
+}
 
 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
 {
@@ -22,6 +30,17 @@ void FLOPPY::write_io8(uint32_t addr, uint32_t data)
                // side reg
                d_fdc->write_signal(SIG_MB8877_SIDEREG, data, 1);
                break;
+       case 0xde:
+               break;
+       case 0xdf:
+               for(int i = 0; i < 4; i++) {
+                       if(data & 1) {
+                               d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
+                       } else {
+                               d_fdc->set_drive_type(i, DRIVE_TYPE_2DD);
+                       }
+               }
+               break;
        }
 }
 
index b3c4917..448220f 100644 (file)
 #include "../../emu.h"
 #include "../device.h"
 
+class MB8877;
+
 class FLOPPY : public DEVICE
 {
 private:
-       DEVICE* d_fdc;
+       MB8877* d_fdc;
        
 public:
        FLOPPY(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
@@ -26,11 +28,12 @@ public:
        }
        ~FLOPPY() {}
        
-       // common function
+       // common functions
+       void reset();
        void write_io8(uint32_t addr, uint32_t data);
        
        // unique function
-       void set_context_fdc(DEVICE* device)
+       void set_context_fdc(MB8877* device)
        {
                d_fdc = device;
        }
index a1c37fc..833ff63 100644 (file)
@@ -247,7 +247,7 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
                device->initialize();
        }
        for(int i = 0; i < 4; i++) {
-               fdc->set_drive_type(i, DRIVE_TYPE_2DD);
+               fdc->set_drive_type(i, DRIVE_TYPE_2D);
        }
        // GDC clock (mz3500sm p.33,34)
        if(config.monitor_type == 0 || config.monitor_type == 1) {
index 6738f43..96efbb4 100644 (file)
@@ -387,12 +387,6 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
        for(DEVICE* device = first_device; device; device = device->next_device) {
                device->initialize();
        }
-       //pcm->set_realtime_render(true);
-#if defined(_MZ800) || defined(_MZ1500)
-       for(int i = 0; i < MAX_DRIVE; i++) {
-               fdc->set_drive_type(i, DRIVE_TYPE_2DD);
-       }
-#endif
 }
 
 VM::~VM()
@@ -426,6 +420,15 @@ void VM::reset()
        for(DEVICE* device = first_device; device; device = device->next_device) {
                device->reset();
        }
+#if defined(_MZ800) || defined(_MZ1500)
+       for(int i = 0; i < MAX_DRIVE; i++) {
+               if(config.drive_type) {
+                       fdc->set_drive_type(i, DRIVE_TYPE_2DD);
+               } else {
+                       fdc->set_drive_type(i, DRIVE_TYPE_2D);
+               }
+       }
+#endif
        and_int->write_signal(SIG_AND_BIT_0, 0, 1);     // CLOCK = L
        and_int->write_signal(SIG_AND_BIT_1, 1, 1);     // INTMASK = H
 #if defined(_MZ800) || defined(_MZ1500)
index 338bc2c..18df4fb 100644 (file)
@@ -56,6 +56,7 @@
 #define USE_TAPE1
 #define USE_TAPE_BUTTON
 #if defined(_MZ800) || defined(_MZ1500)
+#define USE_DRIVE_TYPE         2
 #define USE_QD1
 #define USE_FD1
 #define USE_FD2
index ad91b4d..5f17a74 100644 (file)
@@ -182,17 +182,6 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
        for(DEVICE* device = first_device; device; device = device->next_device) {
                device->initialize();
        }
-#if defined(SUPPORT_MZ80AIF)
-       for(int i = 0; i < MAX_DRIVE; i++) {
-               fdc->set_drive_type(i, DRIVE_TYPE_2DD);
-       }
-#elif defined(SUPPORT_MZ80FIO)
-       for(int i = 0; i < MAX_DRIVE; i++) {
-               fdc->set_drive_type(i, DRIVE_TYPE_2D);
-//             fdc->set_drive_mfm(i, false);
-       }
-#endif
-
 }
 
 VM::~VM()
@@ -226,6 +215,20 @@ void VM::reset()
        for(DEVICE* device = first_device; device; device = device->next_device) {
                device->reset();
        }
+#if defined(SUPPORT_MZ80AIF)
+       for(int i = 0; i < MAX_DRIVE; i++) {
+               if(config.drive_type) {
+                       fdc->set_drive_type(i, DRIVE_TYPE_2DD);
+               } else {
+                       fdc->set_drive_type(i, DRIVE_TYPE_2D);
+               }
+       }
+#elif defined(SUPPORT_MZ80FIO)
+       for(int i = 0; i < MAX_DRIVE; i++) {
+               fdc->set_drive_type(i, DRIVE_TYPE_2D);
+//             fdc->set_drive_mfm(i, false);
+       }
+#endif
 #if defined(_MZ1200) || defined(_MZ80A)
        and_int->write_signal(SIG_AND_BIT_0, 0, 1);     // CLOCK = L
        and_int->write_signal(SIG_AND_BIT_1, 1, 1);     // INTMASK = H
index eca1374..e2a4c0f 100644 (file)
@@ -68,6 +68,9 @@
 #define USE_PRINTER_TYPE       4
 #define USE_DEBUGGER
 #define USE_STATE
+#if defined(SUPPORT_MZ80AIF)
+#define USE_DRIVE_TYPE         2
+#endif
 #if defined(SUPPORT_MZ80AIF) || defined(SUPPORT_MZ80FIO)
 #define USE_FD1
 #define USE_FD2
index 6f57a01..d2e9a60 100644 (file)
@@ -100,10 +100,20 @@ uint32_t IOCTRL::read_io8(uint32_t addr)
                update_key();
                return key_val;
        case 0x22:
-               if(config.monitor_type) {
-                       return key_mouse | 0x0d;        // virt monitor
-               } else {
-                       return key_mouse | 0x2d;        // horiz monitor
+               // bit1: 0 = Color Mode, 1 = Monochrome Mode
+               // bit2: 1 = Double FDD, 0 = Single FDD
+               // bit3: 1 = 2D, 0 = 2DD
+               // bit4: 1 = KD, 0 = MD
+               // bit5: 1 = Horizontal Monitor, 0 = Virtical Monitor
+               {
+                       uint32_t value = key_mouse | 0x05;
+                       if(!config.drive_type) {
+                               value |= 0x08; // 2D
+                       }
+                       if(!config.monitor_type) {
+                               value |= 0x20; // Horizontal Monitor
+                       }
+                       return value;
                }
        }
        return 0xff;
index 1636582..5e626c1 100644 (file)
@@ -154,9 +154,6 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
        for(DEVICE* device = first_device; device; device = device->next_device) {
                device->initialize();
        }
-       for(int i = 0; i < 4; i++) {
-               fdc->set_drive_type(i, DRIVE_TYPE_2D);
-       }
 }
 
 VM::~VM()
@@ -190,6 +187,13 @@ void VM::reset()
        for(DEVICE* device = first_device; device; device = device->next_device) {
                device->reset();
        }
+       for(int i = 0; i < 4; i++) {
+               if(config.drive_type) {
+                       fdc->set_drive_type(i, DRIVE_TYPE_2DD);
+               } else {
+                       fdc->set_drive_type(i, DRIVE_TYPE_2D);
+               }
+       }
 }
 
 void VM::run()
index 1fe3334..26b3093 100644 (file)
@@ -32,6 +32,7 @@
 #define IO_ADDR_MAX            0x10000
 
 // device informations for win32
+#define USE_DRIVE_TYPE         2
 #define USE_FD1
 #define USE_FD2
 #define NOTIFY_KEY_DOWN
index 5e0906a..6a1e8b8 100644 (file)
@@ -335,6 +335,7 @@ void FLOPPY::initialize()
        for(int i = 0; i < 2; i++) {
                disk[i] = new DISK(emu);
                disk[i]->set_device_name(_T("%s/Disk #%d"), this_device_name, i + 1);
+               disk[i]->drive_type = DRIVE_TYPE_2D;
        }
        if(d_noise_seek != NULL) {
                d_noise_seek->set_device_name(_T("Noise Player (FDD Seek)"));
index b0cea22..0d38baf 100644 (file)
@@ -276,6 +276,7 @@ void PC6031::initialize()
        for(int i = 0; i < 2; i++) {
                disk[i] = new DISK(emu);
                disk[i]->set_device_name(_T("%s/Disk #%d"), this_device_name, i + 1);
+               disk[i]->drive_type = DRIVE_TYPE_2D;
        }
        if(d_noise_seek != NULL) {
                d_noise_seek->set_device_name(_T("Noise Player (FDD Seek)"));
index 0fb41a3..abec137 100644 (file)
@@ -9,10 +9,16 @@
 */
 
 #include "floppy.h"
+#include "../disk.h"
 #include "../upd765a.h"
 
 void FLOPPY::reset()
 {
+/*
+       for(int i = 0; i < 4; i++) {
+               d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
+       }
+*/
        ctrlreg = 0x80;
        modereg = 0x03;
 }
@@ -32,6 +38,15 @@ void FLOPPY::write_io8(uint32_t addr, uint32_t data)
                ctrlreg = data;
                break;
        case 0xbe:
+/*
+               if(!(modereg & 2) && (data & 2)) {
+                       d_fdc->set_drive_type(0, DRIVE_TYPE_2HD);
+                       d_fdc->set_drive_type(1, DRIVE_TYPE_2HD);
+               } else if((modereg & 2) && !(data & 2)) {
+                       d_fdc->set_drive_type(0, DRIVE_TYPE_2DD);
+                       d_fdc->set_drive_type(1, DRIVE_TYPE_2DD);
+               }
+*/
                modereg = data;
                break;
        }
index 0329c4a..4294045 100644 (file)
@@ -65,6 +65,7 @@ void PTF20::initialize()
        for(int i = 0; i < __MAX_DRIVE; i++) {
                disk[i] = new DISK(emu);
                disk[i]->set_device_name(_T("%s/Disk #%d"), this_device_name, i + 1);
+               disk[i]->drive_type = DRIVE_TYPE_2D;
        }
 }
 
index 8774180..f8dee2b 100644 (file)
@@ -21,6 +21,9 @@
 void FLOPPY::reset()
 {
        register_id = -1;
+#ifdef _X1TURBO_FEATURE
+       select_2dd = false;
+#endif
 }
 
 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
@@ -60,16 +63,23 @@ uint32_t FLOPPY::read_io8(uint32_t addr)
        switch(addr) {
        case 0xffc:     // FM
 //             d_fdc->set_drive_mfm(prev & 3, false);
+               select_2dd = false;
                return 0xff;
        case 0xffd:     // MFM
 //             d_fdc->set_drive_mfm(prev & 3, true);
+               select_2dd = false;
                return 0xff;
        case 0xffe:     // 2HD
                d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2HD);
 //             d_fdc->set_drive_rpm(prev & 3, 360);
                return 0xff;
        case 0xfff:     // 2D/2DD
-               d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2DD);
+               if(!select_2dd) {
+                       d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2D);
+               } else {
+                       d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2DD);
+               }
+               select_2dd = !select_2dd;
 //             d_fdc->set_drive_rpm(prev & 3, 300);
                return 0xff;
        }
@@ -89,7 +99,7 @@ void FLOPPY::event_callback(int event_id, int err)
        register_id = -1;
 }
 
-#define STATE_VERSION  1
+#define STATE_VERSION  2
 
 void FLOPPY::save_state(FILEIO* state_fio)
 {
@@ -97,6 +107,9 @@ void FLOPPY::save_state(FILEIO* state_fio)
        state_fio->FputInt32(this_device_id);
        
        state_fio->FputInt32(prev);
+#ifdef _X1TURBO_FEATURE
+       state_fio->FputBool(select_2dd);
+#endif
        state_fio->FputBool(motor_on);
        state_fio->FputInt32(register_id);
 }
@@ -110,6 +123,9 @@ bool FLOPPY::load_state(FILEIO* state_fio)
                return false;
        }
        prev = state_fio->FgetInt32();
+#ifdef _X1TURBO_FEATURE
+       select_2dd = state_fio->FgetBool();
+#endif
        motor_on = state_fio->FgetBool();
        register_id = state_fio->FgetInt32();
        return true;
index a42e5a4..970c29d 100644 (file)
@@ -26,6 +26,9 @@ class FLOPPY : public DEVICE
 private:
        MB8877 *d_fdc;
        int prev;
+#ifdef _X1TURBO_FEATURE
+       bool select_2dd;
+#endif
        bool motor_on;
        int register_id;
        
index 98800db..29689b9 100644 (file)
@@ -429,11 +429,11 @@ VM::VM(EMU* parent_emu) : emu(parent_emu)
                }
        }
        for(int i = 0; i < MAX_DRIVE; i++) {
-#ifdef _X1TURBO_FEATURE
-               fdc->set_drive_type(i, DRIVE_TYPE_2DD);
-#else
+//#ifdef _X1TURBO_FEATURE
+//             fdc->set_drive_type(i, DRIVE_TYPE_2DD);
+//#else
                fdc->set_drive_type(i, DRIVE_TYPE_2D);
-#endif
+//#endif
 //             fdc->set_drive_rpm(i, 300);
 //             fdc->set_drive_mfm(i, true);
        }
@@ -863,8 +863,8 @@ void VM::update_config()
 void VM::update_dipswitch()
 {
        // bit0         0=High 1=Standard
-       // bit2         0=5"2D 1=5"2HD
-       io->set_iovalue_single_r(0x1ff0, (config.monitor_type & 1) | ((config.drive_type & 1) << 2));
+       // bit1-3       000=5"2D 001=5"2DD 010=5"2HD
+       io->set_iovalue_single_r(0x1ff0, (config.monitor_type & 1) | ((config.drive_type & 7) << 1));
 }
 #endif
 
index 97b87c5..1d8b3af 100644 (file)
@@ -88,7 +88,7 @@
 #define USE_KEYBOARD_TYPE      2
 // Keyboard mode B
 #define KEYBOARD_TYPE_DEFAULT  1
-#define USE_DRIVE_TYPE         2
+#define USE_DRIVE_TYPE         3
 #endif
 #define USE_FD1
 #define USE_FD2