diff options
Diffstat (limited to 'emulators/pcemu/files/patch-d1-dyndisks')
-rw-r--r-- | emulators/pcemu/files/patch-d1-dyndisks | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/emulators/pcemu/files/patch-d1-dyndisks b/emulators/pcemu/files/patch-d1-dyndisks new file mode 100644 index 000000000000..04f63d94a81f --- /dev/null +++ b/emulators/pcemu/files/patch-d1-dyndisks @@ -0,0 +1,309 @@ +--- 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(); |