]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Add 525 80 track (which is same as 35 DD but can also accept 40 track images)
authorToni Wilen <twilen@winuae.net>
Sat, 22 Jul 2017 19:38:33 +0000 (22:38 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 22 Jul 2017 19:38:33 +0000 (22:38 +0300)
disk.cpp
include/disk.h

index f0f25ab3885ffb2663ea2d8da20398b327a0b12b..f4886f19205099f2aa64fb1109391d967aadf21d 100644 (file)
--- a/disk.cpp
+++ b/disk.cpp
@@ -604,6 +604,7 @@ static void drive_settype_id (drive *drv)
                break;
        case DRV_35_DD_ESCOM:
        case DRV_35_DD:
+       case DRV_525_DD:
        default:
                drv->drive_id = DRIVE_ID_35DD;
                break;
@@ -684,6 +685,11 @@ static void setamax (void)
 #endif
 }
 
+static bool ispcbridgedrive(int num)
+{
+       return currprefs.floppyslots[num].dfxtype == DRV_PC_ONLY_40  || currprefs.floppyslots[num].dfxtype == DRV_PC_ONLY_80;
+}
+
 static void reset_drive (int num)
 {
        drive *drv = &floppy[num];
@@ -697,9 +703,9 @@ static void reset_drive (int num)
        drv->lastdataacesstrack = -1;
        disabled &= ~(1 << num);
        reserved &= ~(1 << num);
-       if (currprefs.floppyslots[num].dfxtype < 0 || currprefs.floppyslots[num].dfxtype >= DRV_PC_ONLY_40)
+       if (currprefs.floppyslots[num].dfxtype < 0 || ispcbridgedrive(num))
                disabled |= 1 << num;
-       if (currprefs.floppyslots[num].dfxtype >= DRV_PC_ONLY_40)
+       if (ispcbridgedrive(num))
                reserved |= 1 << num;
        reset_drive_gui (num);
        /* most internal Amiga floppy drives won't enable
@@ -1148,7 +1154,7 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR
        if (!canauto && drv->diskfile && isrecognizedext (zfile_getname (drv->diskfile)))
                canauto = 1;
        // if PC-only drive, make sure PC-like floppies are alwayss detected
-       if (!canauto && currprefs.floppyslots[dnum].dfxtype >= DRV_PC_ONLY_40)
+       if (!canauto && ispcbridgedrive(dnum))
                canauto = 1;
 
        if (drv->catweasel) {
@@ -1267,56 +1273,71 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR
                size == 9 * 81 * 1 * 512 || size == 18 * 81 * 1 * 512 || size == 10 * 81 * 1 * 512 || size == 20 * 81 * 1 * 512 ||
                size == 9 * 82 * 1 * 512 || size == 18 * 82 * 1 * 512 || size == 10 * 82 * 1 * 512 || size == 20 * 82 * 1 * 512)) {
                        /* PC formatted image */
-                       int i, side;
+                       int side, sd;
 
                        drv->num_secs = 9;
                        drv->ddhd = 1;
+                       sd = 0;
 
                        for (side = 2; side > 0; side--) {
-                               if (       size ==  9 * 80 * side * 512 || size ==  9 * 81 * side * 512 || size ==  9 * 82 * side * 512) {
-                                       drv->num_secs = 9;
-                                       drv->ddhd = 1;
-                                       break;
-                               } else if (size == 18 * 80 * side * 512 || size == 18 * 81 * side * 512 || size == 18 * 82 * side * 512) {
-                                       drv->num_secs = 18;
-                                       drv->ddhd = 2;
-                                       break;
-                               } else if (size == 10 * 80 * side * 512 || size == 10 * 81 * side * 512 || size == 10 * 82 * side * 512) {
-                                       drv->num_secs = 10;
-                                       drv->ddhd = 1;
-                                       break;
-                               } else if (size == 20 * 80 * side * 512 || size == 20 * 81 * side * 512 || size == 20 * 82 * side * 512) {
-                                       drv->num_secs = 20;
-                                       drv->ddhd = 2;
-                                       break;
-                               } else if (size == 21 * 80 * side * 512 || size == 21 * 81 * side * 512 || size == 21 * 82 * side * 512) {
-                                       drv->num_secs = 21;
-                                       drv->ddhd = 2;
-                                       break;
-                               } else if (size == 9 * 40 * side * 512) {
-                                       drv->num_secs = 9;
-                                       drv->ddhd = 1;
-                                       break;
-                               } else if (size == 8 * 40 * side * 512) {
-                                       drv->num_secs = 8;
-                                       drv->ddhd = 1;
-                                       break;
-                               } else if (size == 15 * 80 * side * 512) {
-                                       drv->num_secs = 15;
-                                       drv->ddhd = 1;
-                                       break;
+                               if (drv->hard_num_cyls >= 80 && p->floppyslots[dnum].dfxtype != DRV_525_DD) {
+                                       if (       size ==  9 * 80 * side * 512 || size ==  9 * 81 * side * 512 || size ==  9 * 82 * side * 512) {
+                                               drv->num_secs = 9;
+                                               drv->ddhd = 1;
+                                               break;
+                                       } else if (size == 18 * 80 * side * 512 || size == 18 * 81 * side * 512 || size == 18 * 82 * side * 512) {
+                                               drv->num_secs = 18;
+                                               drv->ddhd = 2;
+                                               break;
+                                       } else if (size == 10 * 80 * side * 512 || size == 10 * 81 * side * 512 || size == 10 * 82 * side * 512) {
+                                               drv->num_secs = 10;
+                                               drv->ddhd = 1;
+                                               break;
+                                       } else if (size == 20 * 80 * side * 512 || size == 20 * 81 * side * 512 || size == 20 * 82 * side * 512) {
+                                               drv->num_secs = 20;
+                                               drv->ddhd = 2;
+                                               break;
+                                       } else if (size == 21 * 80 * side * 512 || size == 21 * 81 * side * 512 || size == 21 * 82 * side * 512) {
+                                               drv->num_secs = 21;
+                                               drv->ddhd = 2;
+                                               break;
+                                       } else if (size == 15 * 80 * side * 512) {
+                                               drv->num_secs = 15;
+                                               drv->ddhd = 1;
+                                               break;
+                                       }
+                               }
+                               if (drv->hard_num_cyls == 40 || p->floppyslots[dnum].dfxtype == DRV_525_DD) {
+                                       if (size == 9 * 40 * side * 512) {
+                                               drv->num_secs = 9;
+                                               drv->ddhd = 1;
+                                               sd = 1;
+                                               break;
+                                       } else if (size == 8 * 40 * side * 512) {
+                                               drv->num_secs = 8;
+                                               drv->ddhd = 1;
+                                               sd = 1;
+                                               break;
+                                       }
                                }
                        }
 
                        drv->num_tracks = size / (drv->num_secs * 512);
 
+                       // SD disk in 5.25 drive = duplicate each track
+                       if (sd && p->floppyslots[dnum].dfxtype == DRV_525_DD) {
+                               drv->num_tracks *= 2;
+                       } else {
+                               sd = 0;
+                       }
+
                        drv->filetype = ADF_PCDOS;
                        tid = &drv->trackdata[0];
-                       for (i = 0; i < drv->num_tracks; i++) {
+                       for (int i = 0; i < drv->num_tracks; i++) {
                                tid->type = TRACK_PCDOS;
                                tid->len = 512 * drv->num_secs;
                                tid->bitlen = 0;
-                               tid->offs = i * 512 * drv->num_secs;
+                               tid->offs = (sd ? i / 2 : i) * 512 * drv->num_secs;
                                if (side == 1) {
                                        tid++;
                                        tid->type = TRACK_NONE;
@@ -1347,7 +1368,7 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR
 
        } else {
 
-               int i, ds;
+               int ds;
 
                ds = 0;
                drv->filetype = ADF_NORMAL;
@@ -1355,7 +1376,7 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR
                /* High-density or diskspare disk? */
                drv->num_tracks = 0;
                if (size > 160 * 11 * 512 + 511) { // larger than standard adf?
-                       for (i = 80; i <= 83; i++) {
+                       for (int i = 80; i <= 83; i++) {
                                if (size == i * 22 * 512 * 2) { // HD
                                        drv->ddhd = 2;
                                        drv->num_tracks = size / (512 * (drv->num_secs = 22));
@@ -1387,7 +1408,7 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR
 
                if (!ds && drv->num_tracks > MAX_TRACKS)
                        write_log (_T("Your diskfile is too big, %d bytes!\n"), size);
-               for (i = 0; i < drv->num_tracks; i++) {
+               for (int i = 0; i < drv->num_tracks; i++) {
                        tid = &drv->trackdata[i];
                        tid->type = ds ? TRACK_DISKSPARE : TRACK_AMIGADOS;
                        tid->len = 512 * drv->num_secs;
index ab46ea1ffa2a996d4beb2a5f8ec32831fdfc434e..0020333b16db22bf0f51894f0ac71f18f97a005a 100644 (file)
@@ -11,7 +11,7 @@
 
 #include "uae/types.h"
 
-typedef enum { DRV_NONE = -1, DRV_35_DD = 0, DRV_35_HD, DRV_525_SD, DRV_35_DD_ESCOM, DRV_PC_ONLY_40, DRV_PC_ONLY_80 } drive_type;
+typedef enum { DRV_NONE = -1, DRV_35_DD = 0, DRV_35_HD, DRV_525_SD, DRV_35_DD_ESCOM, DRV_PC_ONLY_40, DRV_PC_ONLY_80, DRV_525_DD } drive_type;
 
 #define HISTORY_FLOPPY 0
 #define HISTORY_CD 1