From b72fe24e5d7ea17680d743a46a7af263f44e63d5 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 22 Jul 2017 22:38:33 +0300 Subject: [PATCH] Add 525 80 track (which is same as 35 DD but can also accept 40 track images) --- disk.cpp | 103 +++++++++++++++++++++++++++++-------------------- include/disk.h | 2 +- 2 files changed, 63 insertions(+), 42 deletions(-) diff --git a/disk.cpp b/disk.cpp index f0f25ab3..f4886f19 100644 --- 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; diff --git a/include/disk.h b/include/disk.h index ab46ea1f..0020333b 100644 --- a/include/disk.h +++ b/include/disk.h @@ -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 -- 2.47.3