Bochs/bochs/patches/patch.fdc-read-check-head

70 lines
2.9 KiB
Plaintext

----------------------------------------------------------------------
Patch name: patch.fdc-read-check-head
Author: Bryce Denney
Date: Fri Sep 28 23:20:49 EDT 2001
RCS Id: $Id: patch.fdc-read-check-head,v 1.2 2001-09-29 03:20:47 bdenney Exp $
Detailed description:
This is intended to fix source forge bug 4339945, floppy drive read
input error checking. The bug report was:
> When sending the read command to the floppy drive, in one parameter
> you send the drive number in bit 0, and the head number in bit 2.
> Later on in the command sequence, you send another byte with the
> head bit in bit 0. For error-free code, these two head values should
> be identical, and Bochs doesn't have problems. If they are not equal
> however, my real floppy drive will not read the disk. Status
> registers ST0, ST1, and ST2 equal 0x40, 0x04 and 0x00, respectively.
> The value of ST1 means the sector was not found. Bochs, however,
> will allow the read to go through and it returns the sector that is
> under the head given by the second time you submit the head number
> in the read sequence.
I don't have any test code, so I'm asking the user to try it out or
provide some test code.
Patch was created with:
cvs diff -u
Apply patch to what version:
current cvs (9/28/2001)
Instructions:
To patch, go to main bochs directory.
Type "patch -p0 < THIS_PATCH_FILE".
----------------------------------------------------------------------
===================================================================
RCS file: /cvsroot/bochs/bochs/iodev/floppy.cc,v
retrieving revision 1.20
diff -u -r1.20 floppy.cc
--- iodev/floppy.cc 2001/09/26 17:35:51 1.20
+++ iodev/floppy.cc 2001/09/29 03:19:31
@@ -735,6 +735,28 @@
if (head > 1)
BX_PANIC(("io: bad head #"));
+ // check that head number in command[1] bit two matches the head
+ // reported in the head number field. Real floppy drives are
+ // picky about this, as reported in SF bug #439945, (Floppy drive
+ // read input error checking).
+ if (head != (BX_FD_THIS s.command[1]>>2)&1) {
+ BX_ERROR(("head number in command[1] doesn't match head field"));
+ BX_FD_THIS s.result_size = 7;
+ BX_FD_THIS s.result_index = 0;
+ BX_FD_THIS s.result[0] = 0x40 | (BX_FD_THIS s.head[drive]<<2) | drive; // abnormal termination
+ BX_FD_THIS s.result[1] = 0x04; // 0000 0100
+ BX_FD_THIS s.result[2] = 0x00; // 0000 0000
+ BX_FD_THIS s.result[3] = BX_FD_THIS s.cylinder[drive];
+ BX_FD_THIS s.result[4] = BX_FD_THIS s.head[drive];
+ BX_FD_THIS s.result[5] = BX_FD_THIS s.sector[drive];
+ BX_FD_THIS s.result[6] = 2; // sector size = 512
+
+ BX_FD_THIS s.pending_command = 0;
+ BX_FD_THIS s.main_status_reg = FD_MS_MRQ | FD_MS_DIO | FD_MS_BUSY;
+ BX_FD_THIS devices->pic->trigger_irq(6);
+ return;
+ }
+
if ( BX_FD_THIS s.media_present[drive] == 0 ) {
// media not in drive, return error