diff -ru orig.bios.c bios.c
--- orig.bios.c	Wed Feb 18 11:11:30 1998
+++ bios.c	Wed Feb 18 11:14:45 1998
@@ -109,6 +109,12 @@
 { "/dev/fd0", 18, 80, 2 }
 };
 
+DiskTab hdisk[MAXHDISKS] =
+{
+{ "/dev/wd0", 63, 407, 64 },
+{ "/some/file", 32, 120, 64 },
+};
+
 int bootdisk = 0x0;
 static unsigned pos = INT_ROUTINE_START;
 
@@ -803,13 +809,13 @@
 
 static DiskTab *get_disk_tab(int num)
 {
-    if (num < NUMFDISKS)
+    if (num >= 0    && num < NUMFDISKS)
         return &fdisk[num];
-    
+    if (num >= 0x80 && num < 0x80 + NUMHDISKS)
+	return &hdisk[num&0x7f];
     return NULL;
 }
 
-
 static int disk_seek(DiskTab *disk, int cylinder, int head, int sector)
 {
     unsigned pos;
@@ -817,6 +823,9 @@
     if (head > disk->heads || cylinder > disk->cylinders ||
         sector > disk->sectors)
     {
+        D(printf("error h%d>%d or c%d>%d or s%d>%d\n",*bregs[DL],
+		head, disk->heads, cylinder, disk->cylinders,
+		sector, disk->sectors););
         CF = 1;
         *bregs[AH] = diskerror = 0x4;  /* Sector not found */
         return -1;
@@ -853,7 +862,8 @@
         *bregs[AH] = 0;
         *bregs[AL] = diskerror;
         break;
-    case 2:  /* Write sector */
+    case 2:  /* Read sector */
+        D(printf("Read sector drive %02Xh\n", *bregs[DL]););
         disk = get_disk_tab(*bregs[DL]);
         if (!disk)
         {
@@ -865,7 +875,7 @@
         cylinder = *bregs[CH] + ((*bregs[CL] & 0xc0) << 2);
         sector = (*bregs[CL] & 0x3f) -1;
         buffer = &c_es[ChangeE(wregs[BX])];
-        D(printf("DISK 0x%02X (%s) read [h%d,s%d,t%d](%d)->%04X:%04X\n",
+        D(printf("DISK %02Xh (%s) read [h%d,s%d,c%d](%d)->%04X:%04X\n",
                  *bregs[DL], disk->name, head, sector, cylinder, *bregs[AL],
                  sregs[ES], ChangeE(wregs[BX])););
         if (disk_seek(disk, cylinder, head, sector))
@@ -884,6 +894,7 @@
         CF = 0;
         break;
     case 3:  /* Write sector */
+        D(printf("write sector drive %02Xh\n", *bregs[DL]););
         disk = get_disk_tab(*bregs[DL]);
         if (!disk)
         {
@@ -895,7 +906,7 @@
         cylinder = *bregs[CH] + ((*bregs[CL] & 0xc0) << 2);
         sector = (*bregs[CL] & 0x3f) -1;
         buffer = &c_es[ChangeE(wregs[BX])];
-        D(printf("DISK %02Xh (%s) read [h%d,s%d,t%d](%d)->%04X:%04X\n",
+        D(printf("DISK %02Xh (%s) read [h%d,s%d,c%d](%d)->%04X:%04X\n",
                  *bregs[DL], disk->name, head, sector, cylinder, *bregs[AL],
                  sregs[ES], ChangeE(wregs[BX])););
         if (disk_seek(disk, cylinder, head, sector))
@@ -923,8 +934,9 @@
             break;
         }
         head = *bregs[DH];
-        cylinder = *bregs[CH] + ((*bregs[CL] & 0xc0) << 8);
+        cylinder = *bregs[CH] + ((*bregs[CL] & 0xc0) << 2);
         sector = (*bregs[CL] & 0x3f) -1;
+        D(printf("h%d c%d s%d\n",head, cylinder, sector););
         buffer = &c_es[ChangeE(wregs[BX])];
         if (disk_seek(disk, cylinder, head, sector))
             break;
@@ -949,12 +961,15 @@
             case 18:
                 *bregs[BL] = 4;
                 break;
+	    default:
+                *bregs[BL] = 0;
             }
 
             *bregs[CH] = (disk->cylinders - 1) & 0xff;
-            *bregs[CL] = (disk->sectors - 1) | (((disk->cylinders - 1)
+            *bregs[CL] = disk->sectors | (((disk->cylinders - 1)
                                                  & 0x300) >> 2);
-            *bregs[DH] = disk->heads -1;
+            *bregs[DH] = (disk->heads -1) | (((disk->cylinders - 1)
+					     & 0xc00)>> 4);
             *bregs[DL] = *bregs[DL]  < 0x80 ? NUMFDISKS : NUMHDISKS;
             *bregs[AL] = 0;
             CF = 0;
@@ -966,6 +981,19 @@
             wregs[DX] = 0;
             wregs[CX] = 0;
         }
+        D(printf("Ret CH=%02Xh, CL=%02Xh, DH=%02Xh, DL=%02Xh\n",
+		*bregs[CH], *bregs[CL], *bregs[DH], *bregs[DL]););
+        break;
+    case 0x12:
+        D(printf("Disk controller ram diag\n"););
+        disk = get_disk_tab(*bregs[DL]);
+	if (disk) {
+            CF = 0;
+            *bregs[AH] = diskerror = 0;
+        } else {
+            CF = 1;
+            *bregs[AH] = diskerror = 0x20;
+	}
         break;
     case 0x15:  /* Get disk type */
         D(printf("Get disk type %02Xh\n",*bregs[DL]););
@@ -991,6 +1019,38 @@
             *bregs[AH] = 0;
         }
         break;
+    case 0x18:
+	D(printf("Set media type for format drive %02Xh\n", *bregs[DL]););
+	D(printf("sectors %d\n", (*bregs[CL] & 0x3f)));
+	D(printf("cylinders %d+%d\n",*bregs[CH], ((*bregs[CL] & 0xc0) << 2)));
+
+        disk = get_disk_tab(*bregs[DL]);
+	if (disk) {
+	    if (disk->sectors - 1 != (*bregs[CL] & 0x3f)) {
+        	printf("INT 13h/18h: sectors %d != %d\n",
+			disk->sectors, (*bregs[CL] & 0x3f));
+		CF = 1;
+		*bregs[AH] = diskerror = 0x0c;
+	    }
+	    if (disk->cylinders - 1
+			!= (*bregs[CH] | ((*bregs[CL] & 0xc0) << 2))) {
+        	printf("INT 13h/18h: cylinders %d != %d\n",
+			disk->cylinders,
+			(*bregs[CH] | ((*bregs[CL] & 0xc0) << 2)));
+		CF = 1;
+		*bregs[AH] = diskerror = 0x0c;
+	    }
+	    /* make 11-byte param table at F000h:E401h ? point ES:DI at it? */
+            *bregs[AH] = diskerror = 0;
+            CF = 0;
+        } else {
+            CF = 1;
+            *bregs[AH] = diskerror = 0x80;
+	}
+        CF = 1;
+        *bregs[AH] = diskerror = 0x01;
+        break;
+
     default:
         printf("Unimplemented INT 13h function %02Xh\n",*bregs[AH]);
 #ifdef PANIC
@@ -998,9 +1058,9 @@
         exit_emu();
 #endif
         break;
-        }
+    }
 
-    D(if (CF) printf("Operation failed\n"););
+    D(if (CF) printf("Operation failed\n"); else printf("OK\n"););
 }
 
 
@@ -1186,24 +1246,25 @@
     memcpy(BIOS_base+0xe000,BIOSCOPYRIGHT, sizeof BIOSCOPYRIGHT);
 }
 
+static unsigned char diskparamhd[16];
 
 void init_bios(void)
 {
     int i;
+    DiskTab *hd;
 #ifdef BOOT
     DiskTab *boot;
 #endif
-/*
-*   for (i = 0; i < NUMHDISKS; i++)
-*   {
-*       if ((hdisk[i].fd = open(hdisk[i].name,O_RDWR)) < 0)
-*       {
-*           fprintf(stderr, "Cannot open hard disk %s :",hdisk[i].name);
-*           perror(NULL);
-*           exit(1);
-*       }
-*   }
-*/
+
+    for (i = 0; i < NUMHDISKS; i++)
+    {
+        if ((hdisk[i].fd = open(hdisk[i].name,O_RDWR)) < 0)
+        {
+            fprintf(stderr, "Cannot open hard disk %s :",hdisk[i].name);
+            perror(NULL);
+            exit(1);
+        }
+    }
     for (i = 0; i < NUMFDISKS; i++)
     {
         if ((fdisk[i].fd = open(fdisk[i].name,O_RDWR)) < 0)
@@ -1236,6 +1297,29 @@
     IF = 1;
 #endif
 
+#ifdef MK_HD_PARAMS
+    hd = get_disk_tab(0x80);
+    if (hd) {
+	diskparamhd[0] = (hd->cylinders) & 0xff;
+	diskparamhd[1] = (hd->cylinders) >> 8;
+	diskparamhd[2] = (hd->heads);
+	diskparamhd[3] = 0;
+	diskparamhd[4] = 0;
+	diskparamhd[5] = 0xff;
+	diskparamhd[6] = 0xff;
+	diskparamhd[7] = 0;
+	diskparamhd[8] = 8;
+	diskparamhd[9] = 0;
+	diskparamhd[10] = 0;
+	diskparamhd[11] = 0;
+	diskparamhd[12] = (hd->cylinders) & 0xff;
+	diskparamhd[13] = (hd->cylinders) >> 8;
+	diskparamhd[14] = (hd->sectors);
+	diskparamhd[15] = 0;
+	set_int(0x41, diskparamhd, sizeof(diskparamhd), 0, 0, 0);
+    }
+#endif
+
 #ifdef DEBUGGER
     signal(SIGINT, (void *)debug_breakin);
 #else
@@ -1257,6 +1341,11 @@
 }
 
 
+char *set_hd(char *file, int hd)
+{
+}
+
+
 char *set_boot_type(int type)
 {
     fdisk[0].heads = 2;
@@ -1289,10 +1378,8 @@
 
 void bios_off(void)
 {
-/*  int i;
-*    
-*   for (i = 0; i < NUMHDISKS; i++)
-*       close(hdisk[i].fd);
-*/
+  int i;
+    
+   for (i = 0; i < NUMHDISKS; i++)
+       close(hdisk[i].fd);
 }
-
