Implemented int 0x21 long file name function 0x71a0: Get Volume Info.

diff --git a/msdos/int21.c b/msdos/int21.c
index 8f1a94f..cbb692f 100644
--- a/msdos/int21.c
+++ b/msdos/int21.c
@@ -1564,7 +1564,7 @@
         break;
 
     case 0x41: /* "UNLINK" - DELETE FILE */
-        TRACE("UNLINK%s\n",
+        TRACE("UNLINK %s\n",
 	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)));
         bSetDOSExtendedError = (!DeleteFileA( CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),
                                                              EDX_reg(context) )));
@@ -1610,7 +1610,7 @@
                                        			   CX_reg(context) ));
             break;
         case 0x02:
-            TRACE("GET COMPRESSED FILE SIZE for %s stub\n",
+            FIXME("GET COMPRESSED FILE SIZE for %s stub\n",
 		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)));
         }
         break;
@@ -2217,15 +2217,48 @@
                                                              EDI_reg(context))))
 		bSetDOSExtendedError = TRUE;
             break;
+	case 0xa0:
+	    {
+		LPCSTR driveroot = (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),EDX_reg(context));
+		LPSTR buffer = (LPSTR)CTX_SEG_OFF_TO_LIN(context,  ES_reg(context),EDI_reg(context));
+		int drive;
+		UINT flags;
+
+		TRACE("LONG FILENAME - GET VOLUME INFORMATION for drive having root dir '%s'.\n", driveroot);
+		AX_reg(context) = 0;
+		if (!driveroot)
+		{
+		    INT_BARF( context, 0x21 );
+		    SET_CFLAG(context);
+		    break;
+		}
+		drive = toupper(driveroot[0]) - 'A';
+		flags = DRIVE_GetFlags(toupper(driveroot[0]) - 'A');
+		BX_reg(context) = 0x4000; /* support for LFN functions */
+		if (flags & DRIVE_CASE_SENSITIVE)
+			BX_reg(context) |= 1;
+		if (flags & DRIVE_CASE_PRESERVING)
+			BX_reg(context) |= 2;
+		/***** FIXME: not supported yet (needed ?)
+		if (flags & DRIVE_UNICODE)
+			BX_reg(context) |= 4;
+		if (flags & DRIVE_COMPRESSED)
+			BX_reg(context) |= 0x8000;
+		*****/
+		CX_reg(context) = (flags & DRIVE_SHORT_NAMES) ? 11 : 255; /* FIXME: 12 ? */
+		DX_reg(context) = MAX_PATH; /* FIXME: which len if DRIVE_SHORT_NAMES ? */
+		if (DRIVE_GetType(drive) == TYPE_CDROM)
+			/* valid for data _and_ audio */
+			strcpy(buffer, "CDFS"); /* FIXME: fail if no CD in drive */
+		else
+			strcpy(buffer, "FAT");
+	    }
+	    break;
         case 0xa1:  /* Find close */
 	    TRACE("LONG FILENAME - FINDCLOSE for handle %d\n",
 		  BX_reg(context));
             bSetDOSExtendedError = (!FindClose16( BX_reg(context) ));
             break;
-	case 0xa0:
-	    TRACE("LONG FILENAME - GET VOLUME INFORMATION for drive %s stub\n",
-		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),EDX_reg(context)));
-	    break;
         case 0x60:  
 	  switch(CL_reg(context))
 	  {
@@ -2286,7 +2319,7 @@
 	    }
 	    break;
         case 0x56:  /* Move (rename) file */
-            TRACE("LONG FILENAME - RENAME FILE %s to %s stub\n",
+            FIXME("LONG FILENAME - RENAME FILE %s to %s stub\n",
 		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)),
 		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  ES_reg(context), EDI_reg(context))); 
         default: