Commit in freeldr/freeldr/arch/i386 on MAIN
pcdisk.c+19-31.3 -> 1.4
Work around broken BIOSes which report random API subset support bitmaps
when checking for extended INT13 availability for CDROMs

freeldr/freeldr/arch/i386
pcdisk.c 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- pcdisk.c	12 Nov 2004 17:17:07 -0000	1.3
+++ pcdisk.c	21 Nov 2004 12:27:01 -0000	1.4
@@ -266,11 +266,21 @@
 
 static BOOL PcDiskInt13ExtensionsSupported(U32 DriveNumber)
 {
+	static U32	LastDriveNumber = 0xffffffff;
+	static BOOL	LastSupported;
 	REGS	RegsIn;
 	REGS	RegsOut;
 
 	DbgPrint((DPRINT_DISK, "PcDiskInt13ExtensionsSupported()\n"));
 
+	if (DriveNumber == LastDriveNumber)
+	{
+		DbgPrint((DPRINT_DISK, "Using cached value %s for drive 0x%x\n", LastSupported ? "TRUE" : "FALSE", DriveNumber));
+		return LastSupported;
+	}
+
+	LastDriveNumber = DriveNumber;
+
 	// IBM/MS INT 13 Extensions - INSTALLATION CHECK
 	// AH = 41h
 	// BX = 55AAh
@@ -305,12 +315,14 @@
 	if (!INT386_SUCCESS(RegsOut))
 	{
 		// CF set on error (extensions not supported)
+		LastSupported = FALSE;
 		return FALSE;
 	}
 
 	if (RegsOut.w.bx != 0xAA55)
 	{
 		// BX = AA55h if installed
+		LastSupported = FALSE;
 		return FALSE;
 	}
 
@@ -323,17 +335,21 @@
 	{
 		// CX = API subset support bitmap
 		// Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
+		LastSupported = FALSE;
 		return FALSE;
 	}
 #endif
 
-	// Use this relaxed check instead
-	if (RegsOut.w.cx == 0x0000)
+	// Use this relaxed check instead (most BIOSes seem to use 0x9f as CD-Rom)
+	if (RegsOut.w.cx == 0x0000 && DriveNumber != 0x9f)
 	{
 		// CX = API subset support bitmap
-		return FALSE;
+		printf("Suspicious API subset support bitmap 0x%x on device 0x%x\n", RegsOut.w.cx, DriveNumber);
+		LastSupported = FALSE;
+		return LastSupported;
 	}
 
+	LastSupported = TRUE;
 	return TRUE;
 }
 
CVSspam 0.2.8