break;
case DRV_35_DD_ESCOM:
case DRV_35_DD:
+ case DRV_525_DD:
default:
drv->drive_id = DRIVE_ID_35DD;
break;
#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];
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
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) {
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;
} else {
- int i, ds;
+ int ds;
ds = 0;
drv->filetype = ADF_NORMAL;
/* 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));
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;