--- bios.h.orig	Wed Jun 22 16:24:50 1994
+++ bios.h	Mon Feb 21 22:34:26 2000
@@ -22,6 +22,28 @@
 
 #define BOOT
 
+#if defined(BOOT720)
+#       define BOOTSECTORS 9
+#       define BOOTTRACKS 80
+#elif defined(BOOT1_44)
+#       define BOOTSECTORS 18
+#       define BOOTTRACKS 80
+#elif defined(BOOT1_2)
+#       define BOOTSECTORS 15
+#       define BOOTTRACKS 80
+#elif defined(BOOT360)
+#       define BOOTSECTORS 9
+#       define BOOTTRACKS 40
+#endif
+
+#ifndef BOOTFILE
+#define BOOTFILE "DriveA"
+#endif
+
+struct DiskTab;
+extern struct DiskTab *fdisk, *hdisk;
+extern int numfdisks, numhdisks;
+
 void init_bios(void);
 void init_timer(void);
 void bios_off(void);
@@ -38,5 +60,9 @@
 
 char *set_boot_file(char *);
 char *set_boot_type(int);
+char *set_floppydisk(char *buf);
+char *set_harddisk(char *buf);
+struct DiskTab *add_disk(struct DiskTab *dt, int *count, const char *fn,
+			 int s, int c, int h);
 
 #endif
--- bios.c.orig	Mon Feb 21 21:16:21 2000
+++ bios.c	Mon Feb 21 22:37:17 2000
@@ -17,6 +17,7 @@
 #include "global.h"
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <time.h>
@@ -70,50 +71,17 @@
 #define update_flag(flag, key, state) \
        if (state) flag &= ~(key); else flag |= key;
 
-#define MAXHDISKS 2
-#define MAXFDISKS 2
-
-#define NUMHDISKS 0
-#define NUMFDISKS 1
-
-typedef struct
+struct DiskTab
 {
     char *name;
     unsigned sectors;
     unsigned cylinders;
     unsigned heads;
     int fd;
-} DiskTab;
-
-#if defined(BOOT720)
-#       define BOOTSECTORS 9
-#       define BOOTTRACKS 80
-#elif defined(BOOT1_44)
-#       define BOOTSECTORS 18
-#       define BOOTTRACKS 80
-#elif defined(BOOT1_2)
-#       define BOOTSECTORS 15
-#       define BOOTTRACKS 80
-#elif defined(BOOT360)
-#       define BOOTSECTORS 9
-#       define BOOTTRACKS 40
-#endif
-
-#ifndef BOOTFILE
-#define BOOTFILE "DriveA"
-#endif
-
-DiskTab fdisk[MAXFDISKS] =
-{
-{ BOOTFILE, BOOTSECTORS, BOOTTRACKS, 2 },
-{ "/dev/fd0", 18, 80, 2 }
 };
 
-DiskTab hdisk[MAXHDISKS] =
-{
-{ "/dev/wd0", 63, 407, 64 },
-{ "/some/file", 32, 120, 64 },
-};
+struct DiskTab *fdisk, *hdisk;
+int numfdisks, numhdisks;
 
 int bootdisk = 0x0;
 static unsigned pos = INT_ROUTINE_START;
@@ -133,7 +101,7 @@
 static unsigned num = 0;
 
 struct vm86_struct vm86s;
-char tmpdir[] = "/usr/tmp";
+char tmpdir[] = "/var/tmp";
 
 #include "keytabs.h"
 
@@ -207,6 +175,54 @@
     PutMemW(memory,4*intno+2,seg);
 }
 
+struct DiskTab *add_disk(struct DiskTab *dt, int *count, const char *fn,
+			 int s, int c, int h)
+{
+	struct DiskTab *newdt;
+	int newcount;
+
+	newcount = ++(*count);
+	if ((newdt = realloc(dt, sizeof(struct DiskTab) * newcount)) == 0) {
+	  bailout:
+		fprintf(stderr,
+			"Warning: Insufficient memory to add %s to disktab\n",
+			fn);
+		(*count)--;
+		return dt;
+	}
+	newcount--;
+	if ((newdt[newcount].name = strdup(fn)) == 0)
+		goto bailout;
+	newdt[newcount].sectors = s;
+	newdt[newcount].cylinders = c;
+	newdt[newcount].heads = h;
+
+	return newdt;
+}
+
+char *set_floppydisk(char *buf)
+{
+	char fname[1024];	/* sufficient, read_pcemurc() only has 1024 */
+	int ncyl, nhead, nsec;
+	
+	if(sscanf(buf, " %*s %s %d %d %d", fname, &nsec, &ncyl, &nhead) != 4)
+		return "usage: floppydisk <filename> <nsec> <ncyl> <nhead>";
+	fdisk = add_disk(fdisk, &numfdisks, fname, nsec, ncyl, nhead);
+
+	return 0;
+}
+
+char *set_harddisk(char *buf)
+{
+	char fname[1024];	/* sufficient, read_pcemurc() only has 1024 */
+	int ncyl, nhead, nsec;
+	
+	if(sscanf(buf, " %*s %s %d %d %d", fname, &nsec, &ncyl, &nhead) != 4)
+		return "usage: harddisk <filename> <nsec> <ncyl> <nhead>";
+	hdisk = add_disk(hdisk, &numhdisks, fname, nsec, ncyl, nhead);
+
+	return 0;
+}
 
 static void int_serial(void)
 {
@@ -807,16 +823,16 @@
 }
 
 
-static DiskTab *get_disk_tab(int num)
+static struct DiskTab *get_disk_tab(int num)
 {
-    if (num >= 0    && num < NUMFDISKS)
+    if (num >= 0    && num < numfdisks)
         return &fdisk[num];
-    if (num >= 0x80 && num < 0x80 + NUMHDISKS)
+    if (num >= 0x80 && num < 0x80 + numhdisks)
 	return &hdisk[num&0x7f];
     return NULL;
 }
 
-static int disk_seek(DiskTab *disk, int cylinder, int head, int sector)
+static int disk_seek(struct DiskTab *disk, int cylinder, int head, int sector)
 {
     unsigned pos;
 
@@ -845,7 +861,7 @@
 {
     int head, sector, cylinder, res, num;
     BYTE *buffer;
-    DiskTab *disk;
+    struct DiskTab *disk;
 
     res = 0;
 
@@ -970,7 +986,7 @@
                                                  & 0x300) >> 2);
             *bregs[DH] = (disk->heads -1) | (((disk->cylinders - 1)
 					     & 0xc00)>> 4);
-            *bregs[DL] = *bregs[DL]  < 0x80 ? NUMFDISKS : NUMHDISKS;
+            *bregs[DL] = *bregs[DL]  < 0x80 ? numfdisks : numhdisks;
             *bregs[AL] = 0;
             CF = 0;
         }
@@ -1182,8 +1198,8 @@
 
     memory[0xf0000+0xfffe] = SYSTEMID;
 
-    if (NUMFDISKS > 0)
-        equip |= (1 | ((NUMFDISKS-1) << 6));
+    if (numfdisks > 0)
+        equip |= (1 | ((numfdisks-1) << 6));
     equip |= mono ? 0x30 : 0x20;
 
 
@@ -1199,7 +1215,7 @@
     PutMemB(data_segment, 0x40, 0);
     PutMemB(data_segment, 0x41, 0);
     PutMemW(data_segment, 0x72, 0x1234);
-    PutMemW(data_segment, 0x75, NUMHDISKS);
+    PutMemW(data_segment, 0x75, numhdisks);
     PutMemW(data_segment, 0x96, 16);            /* 101/102 keyboard */
     PutMemB(data_segment, 0x17, NUMLOCK);
 
@@ -1251,12 +1267,12 @@
 void init_bios(void)
 {
     int i;
-    DiskTab *hd;
+    struct DiskTab *hd;
 #ifdef BOOT
-    DiskTab *boot;
+    struct DiskTab *boot;
 #endif
 
-    for (i = 0; i < NUMHDISKS; i++)
+    for (i = 0; i < numhdisks; i++)
     {
         if ((hdisk[i].fd = open(hdisk[i].name,O_RDWR)) < 0)
         {
@@ -1265,7 +1281,7 @@
             exit(1);
         }
     }
-    for (i = 0; i < NUMFDISKS; i++)
+    for (i = 0; i < numfdisks; i++)
     {
         if ((fdisk[i].fd = open(fdisk[i].name,O_RDWR)) < 0)
         {
@@ -1341,11 +1357,6 @@
 }
 
 
-char *set_hd(char *file, int hd)
-{
-}
-
-
 char *set_boot_type(int type)
 {
     fdisk[0].heads = 2;
@@ -1379,7 +1390,9 @@
 void bios_off(void)
 {
   int i;
-    
-   for (i = 0; i < NUMHDISKS; i++)
+
+  for (i = 0; i < numhdisks; i++)
        close(hdisk[i].fd);
+  for (i = 0; i < numfdisks; i++)
+       close(fdisk[i].fd);
 }
--- main.c.orig	Mon Feb 21 21:04:45 2000
+++ main.c	Mon Feb 21 22:28:47 2000
@@ -103,6 +103,10 @@
             check_error(set_cursor_rate(strtol(value, NULL,10)), line);
 	else if (strcasecmp(keyword,"keymap") == 0)
 		check_error(set_keymap(buffer), line);
+	else if (strcasecmp(keyword,"floppydisk") == 0)
+		check_error(set_floppydisk(buffer), line);
+	else if (strcasecmp(keyword,"harddisk") == 0)
+		check_error(set_harddisk(buffer), line);
         else
             check_error("Syntax error in .pcemu file", line);
     }
@@ -110,7 +114,7 @@
 }           
 
 
-void main(int argc, char **argv)
+int main(int argc, char **argv)
 {
     progname = (progname = strrchr(argv[0],'/')) ? progname : argv[0];
 
@@ -140,6 +144,9 @@
     fread(memory+0x800,1,MEMORY_SIZE-0x800,f1);
     fclose(f1);
 #endif
+
+    /* this needs to be done before parsing .pcemurc */
+    fdisk = add_disk(fdisk, &numfdisks, BOOTFILE, BOOTSECTORS, BOOTTRACKS, 2);
 
     read_pcemurc();
     disable();
