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