mirror of
https://git.FreeBSD.org/ports.git
synced 2024-10-30 21:49:25 +00:00
6c96bb41e7
rather large patchset improving pcemu. I therefore also decided to bump the version number from 1.01a to 1.01b, David Hedley apparently abandoned all work on pcemu anyway. The exact details of Arne's patches can be studied in the PR, it's something like 50 lines of explanation i don't want to quote in full here. In short, he submitted a number of improvements and a fix for the hard disk emulation in pcemu's BIOS. After a review, i decided to leave the patches verbatim. In addition and while i was at it, i added something i always ment to do: the option to dynamically add floppy disks (and now also hard disks) from within the .pcemurc file, so there's no need to recompile if you just wanna get access to your floppy from within pcemu. Comment it out again once you're done. PR: ports/5788 Submitted by: <arnej@math.ntnu.no> Arne Henrik Juul
310 lines
7.1 KiB
Plaintext
310 lines
7.1 KiB
Plaintext
--- 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();
|