summaryrefslogtreecommitdiff
path: root/emulators/pcemu
diff options
context:
space:
mode:
authorJoerg Wunsch <joerg@FreeBSD.org>2000-02-21 22:40:56 +0000
committerJoerg Wunsch <joerg@FreeBSD.org>2000-02-21 22:40:56 +0000
commit6c96bb41e70fc0505bc16987453dda108fe88af6 (patch)
tree2d1db9feffef7200bedbabff14140ca17d8ba3a8 /emulators/pcemu
parentActivate trueprint (diff)
This is the last of the ports PRs assigned to me... and actually a
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
Notes
Notes: svn path=/head/; revision=26111
Diffstat (limited to 'emulators/pcemu')
-rw-r--r--emulators/pcemu/Makefile10
-rw-r--r--emulators/pcemu/files/README.FreeBSD34
-rw-r--r--emulators/pcemu/files/bootstrap.shar32
-rw-r--r--emulators/pcemu/files/bootstrapper.uu503
-rw-r--r--emulators/pcemu/files/patch-b1-cpule41
-rw-r--r--emulators/pcemu/files/patch-b2-panic71
-rw-r--r--emulators/pcemu/files/patch-c1-h262
-rw-r--r--emulators/pcemu/files/patch-c2-rom8x1619
-rw-r--r--emulators/pcemu/files/patch-c3-hdemul273
-rw-r--r--emulators/pcemu/files/patch-d1-dyndisks309
10 files changed, 1283 insertions, 271 deletions
diff --git a/emulators/pcemu/Makefile b/emulators/pcemu/Makefile
index 54ad6a43c02c..e868a1e40105 100644
--- a/emulators/pcemu/Makefile
+++ b/emulators/pcemu/Makefile
@@ -7,17 +7,9 @@
#
DISTNAME= pcemu1.01alpha
-PKGNAME= pcemu-1.01a
+PKGNAME= pcemu-1.01b
CATEGORIES= emulators
-# Warning notice: by now, you'll have to live with those warnings:
-#
-#In file included from /usr/include/sys/types.h:48,
-# from /usr/include/stdio.h:43,
-# from main.c:22:
-#/usr/include/machine/endian.h:50: warning: `LITTLE_ENDIAN' redefined
-#*Initialization*:1: warning: this is the location of the previous definition
-
#
# This could in theory become a chicken-and-egg problem. Anyway,
# wcarchive is well connected, and the distfile hasn't been changed
diff --git a/emulators/pcemu/files/README.FreeBSD b/emulators/pcemu/files/README.FreeBSD
index 06b3bb4dc657..0b3f5cb449d3 100644
--- a/emulators/pcemu/files/README.FreeBSD
+++ b/emulators/pcemu/files/README.FreeBSD
@@ -10,7 +10,7 @@ old PC/XT. Anyway, as with the XT too, the emulator requires something
like an operating system to run with. Since we cannot ship MS-DOS or
one of its variants along with this distribution (for legal reasons),
you're now actually looking at a (sort of) "standalone operating system",
-just to get pcemu booted and running. All this system does is showing
+just to get pcemu booted and running. All this system does is show
you this introduction.
You will have to replace this mini-system by a physical image of a
@@ -110,11 +110,15 @@ $HOME/.pcemurc file. Refer to sections 2. and 3. below.
2. Information about this FreeBSD port
-This `port' of pcemu to FreeBSD has been prepared by Jörg Wunsch.
-It is an only slightly modified version of David's code, a few
-problems have been fixed for the BSD compilation environment, and
-the location of the default boot file has been moved in order to
-get you started with just what you are reading now.
+This `port' of pcemu to FreeBSD has been prepared by Jörg Wunsch. It
+is a modified version of David's code, a few problems have been fixed
+for the BSD compilation environment, the location of the default boot
+file has been moved in order to get you started with just what you are
+reading now. Unfortunately David is no longer developing pcemu, so
+during the past years, a number of improvements have been added to the
+FreeBSD port. Thanks to Arne Henrik Juul <arnej@math.ntnu.no> who
+submitted a large patchset, among them fixes to make harddisk access
+work.
The PostScript document David is mentioning under 3. below has
been compressed and stored under
@@ -150,9 +154,23 @@ keymap 44=y
keymap 53=-
keymap 86=<
+Another recent addition to the .pcemurc file was the option to add
+floppy and hard disk defintions dynamically. (Previously, everything
+needed to be compiled into the emulator.) The syntax of those entries
+is:
-Once :-) i will have filed all my modifications back to David, and
-perhaps they will be included into the regular distribution as well.
+keyword filename sectors cylinders heads
+
+Examples:
+
+floppydisk /dev/rfd0 18 80 2
+harddisk /dev/rad0 255 400 63
+
+Drive letters are being assigned in ascending order, where drive A: is
+always reserved for the boot file. Write permission to the file in
+question is required by the time pcemu is being started (i. e. any
+floppy media need to be in the drive by that time). Be careful with
+letting DOS tools access your hard disks...
Should you wish to contact me regarding this FreeBSD port, you can
reach me as joerg_wunsch@uriah.heep.sax.de.
diff --git a/emulators/pcemu/files/bootstrap.shar b/emulators/pcemu/files/bootstrap.shar
index 4120c8d94b53..d1e9c95b1716 100644
--- a/emulators/pcemu/files/bootstrap.shar
+++ b/emulators/pcemu/files/bootstrap.shar
@@ -604,11 +604,15 @@ X
X2. Information about this FreeBSD port
X
X
-XThis `port' of pcemu to FreeBSD has been prepared by Jörg Wunsch.
-XIt is an only slightly modified version of David's code, a few
-Xproblems have been fixed for the BSD compilation environment, and
-Xthe location of the default boot file has been moved in order to
-Xget you started with just what you are reading now.
+XThis `port' of pcemu to FreeBSD has been prepared by Jörg Wunsch. It
+Xis a modified version of David's code, a few problems have been fixed
+Xfor the BSD compilation environment, the location of the default boot
+Xfile has been moved in order to get you started with just what you are
+Xreading now. Unfortunately David is no longer developing pcemu, so
+Xduring the past years, a number of improvements have been added to the
+XFreeBSD port. Thanks to Arne Henrik Juul <arnej@math.ntnu.no> who
+Xsubmitted a large patchset, among them fixes to make harddisk access
+Xwork.
X
XThe PostScript document David is mentioning under 3. below has
Xbeen compressed and stored under
@@ -644,9 +648,23 @@ Xkeymap 44=y
Xkeymap 53=-
Xkeymap 86=<
X
+XAnother recent addition to the .pcemurc file was the option to add
+Xfloppy and hard disk defintions dynamically. (Previously, everything
+Xneeded to be compiled into the emulator.) The syntax of those entries
+Xis:
X
-XOnce :-) i will have filed all my modifications back to David, and
-Xperhaps they will be included into the regular distribution as well.
+Xkeyword filename sectors cylinders heads
+X
+XExamples:
+X
+Xfloppydisk /dev/rfd0 18 80 2
+Xharddisk /dev/rad0 255 400 63
+X
+XDrive letters are being assigned in ascending order, where drive A: is
+Xalways reserved for the boot file. Write permission to the file in
+Xquestion is required by the time pcemu is being started (i. e. any
+Xfloppy media need to be in the drive by that time). Be careful with
+Xletting DOS tools access your hard disks...
X
XShould you wish to contact me regarding this FreeBSD port, you can
Xreach me as joerg_wunsch@uriah.heep.sax.de.
diff --git a/emulators/pcemu/files/bootstrapper.uu b/emulators/pcemu/files/bootstrapper.uu
index 6c2b4a8d2c9d..156590b57fce 100644
--- a/emulators/pcemu/files/bootstrapper.uu
+++ b/emulators/pcemu/files/bootstrapper.uu
@@ -1,250 +1,259 @@
begin 644 display.bin.gz
-M'XL("/^,D2\"`V1I<W!L87DN8FEN`.W<;VP<Z7W8\3U9NK.G29PJA9,@13UV
-M4I"LR14IZ63=V;)O22[%S?&?N>1)0I-3AKNSW+&6.YN=65(TKHX3)T'N+D#Z
-M(FV!O@J*]FV1`$:KQ"_J($[0XNHWS8L&11,TP065*Q3HBX/C7&RIO]_O>69V
-M5]+9#F`4*/#]P"?NGYEGGGG^_YGUO?RM+U<^/_<GYQX]\SL?^./[/_1#SWU8
-MWK_^1[][IO)[E<J]9\Y\[4=^\0\J9[;R#SW\_2_\=3#ZW[_SS,,_^L+#,Z.W
-M_UWEX1\^^+/[WWK?UWZ\@O]?[;_^EXN/?F_[1Y?^TQMK9]_XU&MO?>G97_[*
-MZ=F'7_W&GWSMAW_V#^3K-UXY^VL?RM]ZX_C97[MR]ZW%1U\Z4WPA)_R#U^23
-MWWVF\J4/R(?RV8U7?BM_ZY/;V8_\EASZ]HZ\67S[I9W[__[1%[]Z]M7;=MJ-
-M5Y:^LG/_5Q^MKNH'BV]_[4/NTXV--]?.7GOT:/0#O_7:6S_UP<6W7U][]T$@
-M%_&OWUQ[5K_]H'[[?Q;?_CMK[^H!?_>-M6?U@-\Y^\?_PWWTQMJ[_^JUMUSH
-M/N`'!V^L_<V#E^\]5]G1:_^&QN;!UKT?J.S<^V!EY_XOV/M/Z=?WGI'WJ;VO
-MRJ'W?DC>_IR]_;`$(7=T_YQ$_,'Y^3/Y5^2__S[_3/X?YW\P_S</_OS-5\^N
-MO/[JV3>N/_JUM;_YY:_DS\GQGPQ&O_J&OAL])U^_+%_++4[%[-Z/N2C]\X=R
-M#?GR5[Z2_T.-@UWX?^J'CX[/WO^X7+.(_'_1#Q^\H)&33^[_@;Y=^HHFQ0_?
-M"^6#^.'JZIMK[[YD*?;NM>W*:_>+4_^%'CMQ^3=??5;B].R#O^=?O/&<1/BY
-M-]?>O_[ZVOOECT3F_?+5)UX]>_*G;Y9?O_JLW.>SDAME.%_\ZC<U!N]\^3=_
-MZ?57WRVN-J=7N_^##Q\=OZ-OO_1MNYEW[W]6(JB1>_7=-YZ3E'G?UW_EF3?7
-MWI'XOB-_KOU8)7_?UP?/?/G-7VK>_V]RY/T__?;K:]_0`/ZSO'MC[1N2M.^7
-M/UHDOO'FVC>^_K\J=NW[__K;O_C52N7KSS^CV7I_YMN:"N^<>^>1?&=?_/UG
-M[BU6=B0"$LOF_8<2N6<E%N[<KCOWKRMRBMS[.U8*WO[6ZJI]_!>5>V?&9W[5
-MG?G->S^JGWW3/OMM'YJ\^<2K[XX"%^KY;S_X1_<>/=JY_R\E)+D#O8E_^RV?
-M"FV-X*O?E/3RU]1+/;C[Y6L2W%_(=_?_\EMZ_'^5EP]NVW>W']Q8""J27K<>
-M+;Q/_W[FT<*/Z-^'#Q<^7,G_<.$G]<V//UHXHW^_^7#A;"7_[84/5/+?7_B-
-MZ_+)"X\6*L_(W[]ZN%!Y3OZ>]^__P\.O_].'7[_Y\,NS<NE#O?1G[=(_\VV-
-M]1>_^G[-Y\IZDH=1_S2\$Y^&>1K^_"C)JY5L$+7B%\-^?#</!]%A/!^V7PR[
-M4:_CWQV\&!Y$K3O^W<KN?+AZ8TN.E\-[25\^VM]Y,1P,C^U=96%A,QW&"PN5
-M,SLK8?UHU(OR=!@>+U47EZ+>H!N%LRMSX=(++UP.]_O)<3S,DOPT3#OA\C#)
-M\K1W/CBSTXNC+`Z'\2`=YF$K/3J*^WDF\1@=9F&<MS3FW;C=BT]?:F75`SFO
-M&K6JHSOG@R#8ZR99*/];C8Z3=KAN1\UDX414JG+4F<5JN!<=]&*]<"OMYWH!
-M.3WTGO9U^>52-5Q/3S02A[$D6"L^&DE<HU[O-!R.^OVD?U@>>K$:-OJ=='@4
-MY4G:#Z.#=)2'N49Q;1C'R\W54&^Q//Q2U<5;(IP.D\.D'_7"W7IM=;->'G*Y
-M&JZD@U/YMIN'_31/6G&@-[14/1_:O??2]([\F]R)Y:8US?+PI!L/8TN4[>:G
-MPS/?)?*2##OVL9P0]<.XR,&\&^7^76S?7%V\>B5<V=D/HRP\B7L]_1O)!?NM
-MKJ1;($F^W-ANAED\/)982OYE:2C%[R#*DI9=<#!,Y68EL+P;AQTY3Q,IZFEY
-ML/A'_2#MM>4V+MS<JX9AK7]Z$IW.V^62O&MGW=R36TGG[749TV$LY7HHX6;I
-M42RI+1GBPPO303R4O.@?AMEIEL='FA!RWQ:@7**9]%NQW$S8BOJ2N&'630;A
-M9G-!$DYR)$C[5B*2/`N/HV$22:D(HUXJH?D(29*UI10/$TEVS?!9R?NP%Q]*
-M/DHB9VD_FYL/3M/1C.1'7[(A:N4C2PK--8V5)+%4D$S+?=J9"S^:Y5&_K9>(
-MGXCZ1^>#SXZR?#HK#](TC]MRI^TB.S7A)&\L;OZ>VVEL=23KIB>:.!(A]WW2
-MSX=I>V3Y(-7DEGQ^DLC)W>@XMI2*!SUI*MS!1TD_6?`A'IQ*M`?=4\O9,#F2
-MAD(3*@HTX31.8:>7#@:G$ID]R:F/^CL(6Z/A4.K6N/!IM/P]=(;ID>9KT$EZ
-M\;AJGKLPRH87>JE<Z$(O.;A@]WUA=2A-2>V\1+HA23&,I<:V,XWR06QE8QRE
-M\.,7%\.7ES6?[L1Y+JW723>1$MN58G40Q_V@U4VSN*^E3$]LQYUHU,LM4AJ1
-M,$L^%^MEI"P-V_%0KY$>Y%'2?_PZ>H:U(9H&[O:E84U=84][/4O[%\<WMB.I
-M&TFY*&/HSG%%*[)0?&I+U+0,M:V6E.?[DBPU3&OH4)*ZT6_U1FT)T?(_#@_3
-MM!UF^:C3T?,E+OT9:1RD%$^&<91D=N?#6$)8M4.D$&L)DR\'(RV?67(TD/O*
-MM;^(VXE4N7$`>J+5=+V"U*+P*&TGG5-].]2FM),<CH:N-=3DS'QD)Y+!+M&2
-M-DZ3T1)K*O^_<SE8N2#_=K*JI-1$<RXM>%K63I_K6D62(H&LYW+)^>2%VK&V
-M7^&U,'KQ9\K0PZ=??N*BB;MH')YSMVUQLIN1^$S'QJI%DEEE*\_WK:,EI"L#
-M?0TS'G:L"KJPM0MQQ=(5#:TT90AZEI1+2WHK/G&6:<T.PUFI)67;\UAUB<KS
-M^W%^D@[OA&VM7-4Y:4A:+2GT6DWET,D>=MYB::6WEZ5E`%'[.,FD*LO115)K
-MI#6QGY+.TM:UI.NZ%KXP'SZ_='$B*:U4:2C1<9IH$=;12"IC!ZDB)YI04LV.
-M)GJ%>-S5%T$T7)G7TNY:,JNRTP5MHK$M6R@Y:7P[$HEQBS5NLN>ED$L#J4,K
-MZ:!>?/+6?E+*0/NI)>83X=%QZ!JOL%E>OC9Q[UOIB80?:?=51M9R5`N/-KQQ
-MHLDS<=6%<-37EDG*QGPHG8:./R17GQJK07A!BO>%3GNQJJW.=VI;)P.8U>3J
-MCXX.Y#)1)]=F4`MZIWU>HGJJG>.IMAJNY,A@1F.H`XC^1!AZQF`H#:8<*_<\
-M-Z\][!,W(>5VWMWWW[XI:(^.!II*U?AN/!7]/)VH%+Y-E>9`#FN-<LW(R0H9
-M:C#6$8T#*+NZ(D=<)KC[#6MR)^%R446M>IZS;Z+S$V$4-=.7J'!68C,7:H73
-M4M66`4Q+BK!VF;=\4RJA]:VH3:6B1-,ND:??:\H\)4.+R&A[XE)$ZHX;#;F!
-M13^.70LA"2J#@-.)"C-LAZ]<KTE^]W/7#G1&0TL-/2?05-#!H05_TT:#6FC\
-M2%@:`XF<=0=%:R_!V`UI!Y9KMQQHMVQ=CQ6)[S84T``NR,U-#<RDM,8R!LVT
-ML"43(_).ZHIN$3$_6M*[*&(O779B=_Z>MS$N+YI+OBA(2RH=;!S8H-@?7@XF
-M3GU[:$VICC**W)[H-=;D/G:BO'L^R.)6D4)V^7,WUZY>6;%.Q7<HL[F?]NC]
-MW-2YQ=4K\]+(=6R`$M@ETM9(YU'NOA,+2H>AH\P:L;ZKH\6=S5E"2,7NR_''
-M<>_4AJUV?SK(T`!U7B;9/\Z.GPK/W<UDG-`9?"Q\SYR1C#G18GQS:4GC6PS[
-MK(>0@;.,/1]+8FWU!P/IGXHNTZ=44%0O+2^#R`W?N^E()@RNQ\RZQ9#(E>"H
-M-4S=T*;HV.:#87P46R-FDYLB.!G;ZL!:<K"HY]+<1\=1TK/QG#_2Q2_(I(_6
-MIJLL,S9.\GUWY&[4XNCO9_;<W4YV7M-W=S)[]+#I+)+_==U,31)U-+#;K]H,
-M-\IG=-[1F[<YA%XW<S>NO?=!+YZZ;\W(=KN8$[6#]QK.5*LR@]2>.2N;QZF!
-MBQMT!NX.N](^:/64>.@T21+;+FK=E-[-23?MN<%)-Y%9R[#5G4A`23)M5[3Q
-MM9F(AE`DF'3<>3*2I-)/\KB8B3PE8[7['^HI.LDK&H]R"NAKFIL(!SIFMQ;^
-M\<:F&-7/E\/5MA\H2A659,^3PU"2/@K._=3Z]F;]0M62=-@Z7[1011Z&OHYF
-MX9F+DHYZK3.7Y,5!+".4JLW0]?,SW\-J0+F*\7/Z;D:CZ@JP7*4XKIBLZ-A-
-M)PUMC>]/_^;P,+PQZF>M;E6G06[^GO:E\&8]72^0%S8:3^1X6WAQ"5$L.;12
-M+<E1V(E/@G),95,_NU0GN:NS,M]@:BRD!1A(EMK-Q/WC9)CVM?C:V#IX6ML^
-M.9ER#5=Y(]JMZ8"\G%4%.N6PLIU'0YT/6DMN,]X3K:S%@%/FU=:,]BV==7:Y
-MDV9YLS5,!GE9H_Q@56>M\DYBI&>X`<8XF\9]C=[84'H+/Y/.I$3)R^^I]Y$K
-M7G`+5]5!5CW\G)^2RI6[(YD92HV.)>G=6LCD-*RE]W(TDHFHIG#B[N_(5GFT
-MQ`<V9BV&F<6<R770R<R1%/-CFSWWP^NQE*]^.6UT;W6][R"5GGH^3.0"(VM-
-MXZ!<9-+6Y^7XM'EJ"R([*V$F=4'+0Y@/HW[F\WC4CUJM>&"S6FUM]4ZB7E`<
-M.UE81GW)EU;76B.]H2,]83VVZ$HQ:$G%M88R:K>+OJ?LYHH.<+JR:8-G4^:I
-MOL+5#"E>V4`"[22MH+A32:13K5]9+/>?)ZW,K3V<ZB0T2[*\*)-RO/0%[?"<
-MO#B*!N?G`S<Y=W7*E=I,6\[)9)FWE;&?E_F33(8/^VXV:9UB-QK*Q$KNQGH4
-MR?;#N*_K-F75D8]T\=45/DUWS2B-J&9:UDTZN7ZOL9W=DA;0A=.7!D87::U.
-M^]BEY5!#NZ"R!2PCI1,V-XB-3H-$!I9:S+12318*:;('@W%EL-&V+AG*-741
-M5@\^CGI2=8ID#7RRNC7%8F5!TR5T94!?E5-+Z9#&]Z]K6[V>KZ1RV6$JPW_Y
-M)IP8WQR=/I'OXP5-F>.X3`J7+E[[\_+UI6LSQ>N+2]<^5[Z^<NUGR]<?O_:Q
-MXO6E%Z[]3/'Z\N*U?UR^7KKV:OGZTK6?+%]?OG9:O'[^TK6%XO75*]<^*4WU
-MMI;I%Q?FI%R/U\HTXFU+G:.BS74M8>96THOILVLJ98[6C08V-#EU@4BZ^0ES
-M>SPB',:'TKL-IU<8_=KKT_M(7;J6O)#:IR='?NK^>(=3=GZ!U5D]6D(]^]DT
-M'A[>/K'^Y*61Y%2WVHWC036+[E;;\7GKU`)K/=>E*$C_<>8]UJY=/DKF/3$]
-M\<Y.;A1H+=GO)W>M2MT,;R3]=GJBBSDU-W;+DUR7.T:'AW&FFP+%R#>RLR[<
-ME)NW,W0`<3B,COSR7I(%6H\/^Z[=\>O8.C0OYC"VG'T095;3W0J?+O06TS.;
-M14O;*P,KZ45277C5]2]W@K^6U-H]F]6Z=V'#2D,@N>5[$M_TIC;-<^LEF5\,
-MS"2!-ILZ*'J^NAB^%W?$E>K%X(8T6CLRN9>Z(V<L/>78Y738TXNN?.QCX<7J
-M8K`W&AY(N8L/-.V&\M'SCY_ECJA)QW<D#;<[)%A>7EG6)?OP<O7*TG>(U&?L
-M*'\/UV\LUYJ-E:<>_DHR],V#5I`BFZR=:T52^*SG\DD1K"=YJ]N5RC^4@G5]
-MI"V=KP[7HUYT]S349GDS.HP^)T-7.:2VU6Q45[8W@V9\=".R<OF9>EOR[>(3
-M:;0E95]JT'Z>]#*YN><79:!\+.V[Y)6>(;4KF#KDRM/RY68N-2G<&:8=M[@F
-MI7ZINA3L2!,]W(QU9<2=_(3:2$I[JLL-LW+-1(N8'Y/-!9M)/Y%>-KSZGB5A
-M,]'93"J=Q6H2'?:E.$H/-][]*MKEB9+8LM9!9^[2)'4C7>^3.W.5X\26U\KB
-M'&BI<<?K-$);&;?;XYKN\3Z+5@5MU6T@>W5A:7%S_7-RX$6I2-(?NSXJ"IL2
-M1E-&J:VFF]D$2XL7+B^&LT7'IQ%=.#I.;-VCTXL.YZRNE`%?<:%>O3H1:'#I
-MDOOTLE;:]&XYD=Q(^J.[6GM=0URVHI$-"S,W+)0!F@SOQC,MZW<DK3ZKE<F/
-MWFQV$T3A@90=C84<U-86HZ_K<0<VZY]Q+5*KEV9Q9B-YB4!CYEA7VG65,9B:
-MT'U$)DPSNIR4NBF+W&Y;0]5VZ*X_N1A=ZU:LM,:V#RH3,]]G%E5%NE/M]KOI
-MH8_`8&0Q&O6+WMSF8-8.AK.)]`))YU0W>I)\SO4O`XN_S5MZVJ:[\*U5D^GU
-M1%ETPXIDHC75TZ.>C"DRUTN%G7Q0G=J&#<9KI'Y79+R\<4'G=MD%MWL;!&<;
-M6\V]VL9&8^MZN+=>#^N;^QNUO>U=:>ZMTNK)FS*I]`M<.KSJ'[HIYO;.7F-[
-M2X8K*VL;M>M-UUWL;F_ON67L8'*`T7'3\V&QV#?;""/=1LE&1YI:Q53"+85<
-MW]H/KZ^LS`=13\OG8==&9MJNA"M^RJ-C+M?;6CMNDQ+?$<O$OM[/1L.X"#5P
-MH=IL4TO)K!7BN3`=Y,E1DOE1P2"5UD,'R[-Q];`:+FQ?#!<ZZ5&2+W0DU>.%
-M02K-VW!N(EDL28Y.\]-!G%6[;OW27;A<R[#O[.8;6WM7Y\-]^Q/(OTM7W+NE
-M*[:?;@O;Z5`S2?>V!W%GI,VSCLMM:J6U[B#VJ:\CDJ!<=G1UP:U]Z/*&K5/J
-M@*1:]=V?2V=;-9!XS>@(69<OY))7`ZU<!Z>Y;@[/2(H.<_^-Q$N_TH%Y9K<V
-MHXMY_LM+%\=?RD4Z@=];\CDC#7*46\7(M.1U9(+N"J/O-Z11.8[=6NKIY`:G
-M3K%BE[HZ6Y-II01FTWRI'9*2X8PN;\Q8=`Y36^JWU^X>99PPL,H21Q\)5RPN
-MFG0S4C>KK9DPEU.U-9'VMF<M?MN>O=`3K8&1%DAF=\/3C\S)U:[;(-UO_]DR
-M?[%!H=VC+F9<T*SU2S+%U,=-GR=K3#";5&7>Y>>9MJ\9+JPN2QWY^,7%^3()
-MM%&R+(["2]7G/ZK;CW?LLG/Z](*,CWH]WZOKPF'N'D`HRV`F]U@N$\U(/I9K
-M2C,^YV3NE`QU#7[&;4_IF3-%SS0ST3B,M^DF[KVJJWINVELL4MOP4!I]ZZ<L
-M)2;V,8K=%.L*?2UM:9'P.ZMWPEFI$+J$H.5USFTIN&YP:@5)"[);IY`X5\L-
-M)&F]=;W*97I+EY1M&CN.DY]W3^6>)MLXO2WH4>::L6PT&/0T[V:*W8J9HJW5
-M`EG&W`*RW>7JU`JU]?83\9"A:]C4_=E3U\AK7UGN1+M<=$$5LPJW95&F9!&+
-ML&;I5+Y=UF(D%=\=OCPW-=)UE:C<I=$EEF'LKF.1LK9*EU%E;#'C=D)FJK:M
-M80NMEC"VT*"+::Y?FLIHZP%OV5,*<F2QR"K%3G+0-77'AY%;99V55]6#=F?.
-MW:'_U"VZ!=,KRY8-.NVU*8"TO&XVW=Q:T^7<G96U.=\CN"^"&0DV3[-^9T:_
-M=^\&K<Z,WTJVBN(G:IDN8UI_[C<SK,NW.7/@9LY/1J6CXP&M7GN6'*[%N:,A
-M2`V9<9N6!Z.DYY9N;)VZ*M_XQ1&W_E"<Y]?AY8QNE'5GGKY[$8PW8?KQB<6U
-M6A1S'TPOL^O,3"XR9S+>G9%4GM'V1W<X)C9N=)XN/6S;PI%ZX@M]^1R.K?<=
-MZ@;KR3#59U,:ME^8#@/]HQ5K8@F[&_<&X8*6AW8\B/V`U>[`%MW<LK@KAT6M
-M#:P@%@_T%'=GN2`7EI"DVF736U=7[TIG4R[2+XQ[?1L-E0-HUT(4M5:&9Q(A
-M*8;E>H_&QE4#7:\(=$\]E]J@:]2V6E8+3Z*AC5"+";[?2-,JW/$;*M8#EYMI
-M@7\(Z2!V\\8R<\9C%>FJ^WZ^.S_=FUF62R8&,[Z::(@SXW(R<]!K=Z*CI'<Z
-MXZJ6SUW=47#CND@')4FQ(E?L^I0I'2R?%NNY[_7XE1OZ%>V6;P#"&==`S_C'
-M#6PP4>ZK3_8&PS#N9=;P^^9%6K4HZ5?'3;&N:-F37=IIS`=3#>S$4-&-'B>C
-MJ"UBYIXPTD>7=*/+#P2'0;'\Y'?6M+C;\O"<QDB.MH#+C3N_HAWEQ0`DE&&=
-MG'9P&K@G7XHCBTYYSB\928(^EFY%9Z63`QE,E#N7HTR7]%S;?2!%0O<=^^U`
-MD]E-.R92SSH+S6.+A"NT/MRHITOENB87^)(V5RVWEC7;-8ME,ET4>7VJ821A
-M6B-<9$NBC_YE@=_7E[&C"\+/"MP%K/AI'7=]A77_?H5OP7^V\J(NR&C,+?2A
-M]K,3.]Y[J;]VL9,\?7G_6(&5^,!ZD*)>%OV1'W3,Z%BEKXWQN!P4XQ&-ZY$.
-M2:0L%\O).A2WON:]EE_.:F,S54!T8<J>.-/IY,1NO*W29FXWQ4WNBN=KBE%T
-ME+M*E>C:>,--L^Q9-[>/.YKHDORX[JEUI!@4=;78E-_,^=J0V!JTWJL5"YF%
-M%YL:UFM&O9$^GB'MP\DPR8NBJO57OHJU"9HLU#IET10*5\H)GAYN.TS^.QO/
-MI$._W%LDBS18+P;!N?(9.FT4?.*YWK#XP';:IUN-R:=VRO%8.-O7AY=3?1)5
-M\D\F:*Y[T991AP<3]ZC!]G7<;`5%VU-;%4UL[4,7GW5=/=-AM\7/.C[]IXR;
-M?2+Q\GEQZ8H,G6W\O'3YLF;`TL6J&VQJ#YM-5^EB%J9]I!L.3=^<W7.Y&I&%
-MLQ+Z'0M>_EVJ7KZ\N:Q_+VXN2W77<;[;C+?8C@9:V]V22+^,;=]O^^F38KK*
-M]ZEPL5P5LK&)M1!Y.![Q9C+&U`TXFW_H!D$F131NW?$[%JZX9C9G";JV@V.-
-MDEW=K\@\+3P+R!WE`NJG_05](#C0HJ8I[N)Z%$<Z:[7)BSW>IDMH]F(X&DBN
-M)_I,F"1?>0%=-)7_/O_QB]6KNG2NVP>I5I:)48(?A:6]T>3V8_'(KY3EH26A
-M5*@L'7Z7)'3)5TRR,MN4[T3CAC<;-]V=GHRVJN&:_BDJDS]"E]=S]Q17)Y)1
-M6^0:.(F9-.GMDZ2=NSE\EFK\,VD\+L@4]#BQ!\TB+=#^H04=QMAHZ<`O*-@B
-MCL1)!@']R2MV?"QD/J`;V3J/UV,70WLD.?-/&TIAM/'68R=)2ST15#%D&=B^
-MD:OYMB]?Z\M0*+*G0:>[39L]^7&+:[XFG]W0]3G7AUM?46XVM\IYLUM=[)<M
-MDJ]0?CPY<#\0\-L;@53N0[?_V=;'^GJ^O&BIU-;'AII2?L?/`Y4+!B-[=$TK
-MJ'1E6B1JPY:V"JU\9`.86`>STG2M%,=ZTA-/6?&_40@6OI_T$?K+5Z]<N'3)
-M7\86-\/%Z@LO5)<NGX3AKB[`NG4$VP224::N)NAB46Y9[(>R+\X%N@A[Z<*5
-M<CU9WLM-7*XN5>^ZI7]=H-!2K\V23:Y<PZ]E4AM-_QL!*8%Y]SV[Q\E'^^).
-M1Y=1I3>=7/L-EQ8G+NWNR^["Q=_%XE/AQ<7-Y7"WMCD9$W<OP?I.^/'GG[_P
-MP@O^6NL[^S<GKVVA;;\<SG[JXO-/!"+1<4EQ>>*,9MJ+AE(\+T[&9_OE8+=Y
-M97%Q8@'^TY_^]-1=KFNG:OU[68`/?4US<]CBHM\UO:[[TUSKIK79NE:]7TF^
-MZXVPT6\GAZE_DG6W<5-2[]-5'YO5-,[L06Y=BDPZQ57]`Q.3RXS?-1[CI<IR
-M>E0LJU7E=H]CO8[M9GW7H&RNI:$=MEKA:6P%0;?PBN&Y#JNM4=`)HS:XKAAG
-M1Y&5`UV-UCZZ)Y%W,^E(6XYQ+Z9C>^U5CR*IL/K04N.Q-1D;4\G`0`>B-H_0
-MJ^KVM]O#LZ9%NP:;VD?3U?[)-D:ZJ8\$P0TWA7O1]??%8#-QCS!)-R1G?T3R
-MP][:LU#:<8R2MC9GV6&B@Q(W4`E&?:N?TYNU1Q+B45(L#&EP_J=1$VO7$HNS
-MQ2IYN-'8;.S5;!U<Q^+2@S5U%"CU+<^*3D_:D,F[L[[3[W[JHFZ>^R=S74JX
-M'<S`?K@S?LA(PM/%?&WGM9F3$Q?"N&]-B__UB9N=%$,T&WNE@8V!'YM'NZED
-M57_,T[4GF_7;MMMS*`\Z.!U$[E$]%Q,=/OAAA<O?JOMIT:J.I'1:F8V?-I8V
-M</P8BH;>.PV*^YT/R]F]6Q&RHM6>J$!5GX0^\61VWS[1%"O38IQT(S>:U&=V
-M)-%T3#$>MF2!GC1^],$_25+\6L:M2[C?9.G,2Y>29\?CY3E-/!T5%CNC;OP]
-M=/5BQWU\9-UVHQPHR40G'Z8]70$O?\I21C9QF>@6D;)!ZC:A->"ZO-SN3(3C
-M'^MT/R&2>8/,273`K6_=P*TX\RB2Q!_&A[K@,[T?LOVR)..6_[&4'JHK&M\A
-M*2=F"K.1Q=/6B7V.VQA2\FENG'EY^6RVG^7["5(_CF0(,])R7@TWT[;,=/WH
-MM5AG',:2\7'Q<*Y\,O0!QE:B_$98^0S1Q.-I6I#**$^O?OH5EDR7D?3ID.S4
-M%_3HI'AHR#\<4RZ_%$6C'&BZQ']!9[<RR@ILSF]7<:4D<@5>-XSUERI^,&R]
-MI=OHF+Y(,`Y_<F7)PJ@U5QJ-"^7Q4C`27[**J(]TCJ@#UND1G&X0MD<]6U[4
-M'Q%56S.Z0>!_O9>[K2>-2Q&.'S8&-OW4G4(K2'Y^/#'[E29M;[VV]7+SO#W=
-MVK^C:X3EX_,3/Y6J]=NGNFVO#R])`.L[&]%!-E_\<E2G*(?Q2]U!K]J-3WK2
-MM"W(W.Z.Y&.UE59'=^;*[=7UG<#V>(/5Q+;HEW6Z,PQG#^SO2T=Q>R'I5T?Z
-M^[:#:CMV)]IR9+DH4PP:[/>;+_<BR;=ZEL4R>+TCTW;W:NFE.UDOJO9[3PO`
-MCR[L_&#Z%Z_Z.]<+Q<]>BQ^\ZGK.TW[TZC;+=6<Y:*>ZCUU."E*W-GYDV]<Z
-M83X<1=)QYG%<#`QE#E:S7V_\]$@*U<7G)6J-H!CL]W3Z(<WCQ*]TK1'0KQ];
-MJ;7YHE0.&7OKQO&I-!FZ.&7SA(6B)]7Y@U1DK>7)Q(]Q(M\BZ=Z4=.)N`3<>
-M:*LMXPWWH(B4D'5[K$IZ#AU'V(-&[OFCR]7STI>T=?5<CW1+:F<>_XGL>7WZ
-M2+=-;,=J_K$GK36%Q[\=NJN/./I9X\Q1)Y-B/A],[&J56UQ-?3FQNS5^UYK>
-M^O)+3=8GC&/VG7\&/2\M\V'/GJ_?D5E78@^7V/.$EH76?DL]=;^-F?>_LG//
-M(9;/A[D15J"/B5C+:_L44J*F[UZ+INYPZ_S<"MVPE43ZB,!PD,H%`O]H=GN\
-MK^QV4%N/I;$]IA_9@E3D=H.2LL6+\N`@M02VA=+'3RP>[A^,[_2),'4PX!>7
-M7*<]<0]2));K*[7]9MV>(MC9W;ZNX_Y&4T9(*_6M9GTU7-NMU\/MM7!EO;9[
-MO3ZOQ^W6]8BM[?!&;7>WMK5W*UB3,=5$`'+4MGLLX>9>?6LOW*GORGAK3T);
-MOA76=G8D\-KR1CW<J-VHAG+02GUG+[BQ7M\*MS7X&PV)3U/&9W)"8RN\L=O8
-M*YYS6-G>N;7;N+Z^%ZYO;ZS6=Z55WEJ](%>W$X.=VNY>H][4>+S26)V^J8_6
-MFA+MCX8W&GOKV_M[9>3UYFI;M\*7&UNK\T&]H0%)G'9VZTV]?PF[L2DQKJ_.
-M2V16-O97)2[2=$H(6]M[;B0IA^UM6]($_M@B=(V,A+]9WY7TV]JK+3<V&G))
-MB72XUMC;DDN$FG:UT&*^(L-3N8G]W9WM9ET?N]4DE$`DP7<;S9>E!RH2]C/[
-MM3(@25T)8[.VM6(9I;&8R$B]W?#6]KX^=RSWO;$ZE2B:4/5PM;Y67]EKO"+9
-M*T?*99K[F_7`I7=SSQ)H8R/<JJ](?&N[M\)F??>5QHJEPVY]I];8U51:V=[=
-MU5"VMW258DO+1_T5S?W]K0V]S]WZ9_;E3IY2!O3LVG4I9YJ,$SD>W&C(935O
-M'L_V>3M%OK!LM\2[%=Y8WPXW:[?"S>W5QMHM7S`"N6*CN;?;D`R;+@^2F.-R
-M65O>UKM?EO@T+%H2$4T*2=A@M;99NUYO3F2_7?IZ?:N^6]N8#YL[]96&OI#O
-MI=!)+F^X])#Z\YE]S;_:1A%(6).,U!"T!+K,"K7V:2G;*DJ'7/NQ&AG,CJ_]
-M9,D+-[:;5LQ6:WLU#<K^+M?UZ-WZEJ17?55RI+:RLK\KE4J/T#,D-LU]J6:-
-M+9<I>K]6CQN[JV%1DZQPKM4:&_N[6KJ"R124*V]+$FJ05LHF,L0=T9R;MS(0
-M-M;D4BOK/O>"HK[ZC%N7K%BNRV&UU5<:5N=<PD@M:#9\FFS[$'PZ2A'[_JP4
-M!45/]>3S%T5GY9_RD:YF/"$I!U>!:V_U5Z2;^@SP=OE_-M"T.4LPV7&UK..Z
-M-"__7-1_EO2?Q7!%9L<R'8C#S5A"[4_T:T\Y>REL+&_*Q]+)^)^#!_9<PZX>
-ME(6[L>U1MZN!?#[1`3ZMUWM:IQ<^WND%C_\`3A_Q&<:2#KY#G0^G.SK?7TWT
-M<\'?JK^:Z`/=+"@HXR3CCUBFJO;+NM"MZ>I/)![[:4[F>G/MFJW3DT\"-X5)
-M._-EO^KBZ:Z>35S^O;K*^6!\JILR'466%7Y(9V-_C7Y;IS1)YA=C!Z.#7M+2
-M(4J@=ZW[)_ZG&%-/HQ<+[47B%[OPQ:\SYFT.F<O45'_ZJ^&6*6@YO5+;W:I?
-M;]2EI]G8V-ZR?D$C)^WV]@W7AULSHQ5+.H7F]MJ>]%!U;6P;>\VB;PRTT5IM
-M6!L>OF>8TIZN;-0:FU;?M;DL:VC1C5JS:>^*9N_&>FVON2UMP:ZT2,W]#>O0
-MUW:W-\<MX&-1<[?U6,WP6[<VTQIFY3.69;*Y'ZB/AEK>]7R9;?AO5B=3>R6U
-M7^/;3I-F4GE8=?*PEU::U97-_6I]=5]#:G53F2K))<LU[:8^?=S2'Q5_IQH<
-M[DC&90>CH4R7=VKATO,7ERXM7+KZPJ)&4`MIHLM7Q[&;M.CFO3XC806Y+&VG
-M_H?L^@2=UKK'+QBXQ3W7!%@B3%5KG5OZ"?WWJ>&4=M/O%,MD)"L*I[:.>\E1
-MN)P,V^&LO+J]>UM?O[0E]]?KZ>/E<T%0.5NI5,[I__G:YRN5#Q:O7ZM4/N1?
-MI_+Y3_C7G_Y"I?(1__K#\OF<_/V`_)>_5:E4_>N[\OK21)B?\*__ZA<JE17_
-M^JI\ON%??T%>[\M?C<=/R.O;_O-?D=>?]:__3%Z/?/BO2?C_Q']^5\+\HOQ]
-M3O[[S5^J5'[=O];X_#/Y6[5?W>ELJ5(]D!SJ5VZW>EGEMB[*5FX?IGEZ]U0^
-M2GN5V\/TI'([:^G:DWZCOV^IW):2I8_&R`>Q?^&.J"[)JUB:(LU5.6RH.Q7Z
-M_QIUN_CH*!W*.WT877*^4HW[;8L%````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-G````````````````````````````````````_I_ZORB<'5@`0`L`
+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
+MK0K]5]/NE!\-TDS>Z=/H4O2U>CSL6BH`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+I`````````````````````````````````````/A_X/\"DM+@E0!`"P``
`
end
diff --git a/emulators/pcemu/files/patch-b1-cpule b/emulators/pcemu/files/patch-b1-cpule
new file mode 100644
index 000000000000..b3290977f553
--- /dev/null
+++ b/emulators/pcemu/files/patch-b1-cpule
@@ -0,0 +1,41 @@
+diff -ru Makefile.orig Makefile
+--- Makefile.orig Wed Feb 18 10:51:27 1998
++++ Makefile Wed Feb 18 10:50:46 1998
+@@ -18,7 +18,7 @@
+ # -DDEBUGGER compiles in the debugger
+ # -DKBUK if you have a UK style 102 key keyboard
+-# -DBIG_ENDIAN if your computer is big-endian (Sparc, 68000 etc)
+-# -DLITTLE_ENDIAN if your computer is little-endian (80x86 etc)
++# -DCPU_BIG_ENDIAN if your computer is big-endian (Sparc, 68000 etc)
++# -DCPU_LITTLE_ENDIAN if your computer is little-endian (80x86 etc)
+ # -DALIGNED_ACCESS if your computer requires words to be on even boundaries
+ # -DBIGCASE If your compiler/computer can handle 256 case switches
+ #
+@@ -53,7 +53,7 @@
+
+ CC = gcc
+ #OPTIONS = -DBOOT720 -DBIG_ENDIAN -DALIGNED_ACCESS -DBIGCASE -DINLINE_FUNCTIONS
+-OPTIONS = -DBOOT720 -DLITTLE_ENDIAN -DBIGCASE -DINLINE_FUNCTIONS \
++OPTIONS = -DBOOT720 -DCPU_LITTLE_ENDIAN -DBIGCASE -DINLINE_FUNCTIONS \
+ -DBOOTFILE=\"${LOCALPREFIX}/lib/pcemu/DriveA\"
+ #XROOT = /usr/local/X11R5
+ XROOT = /usr/X11R6
+diff -ru cpu.h.orig cpu.h
+--- cpu.h.orig Wed Jun 22 16:24:50 1994
++++ cpu.h Wed Feb 18 10:50:46 1998
+@@ -113,13 +113,13 @@
+ format and back again. Obviously there is nothing to do for little-endian
+ machines... */
+
+-#if defined(LITTLE_ENDIAN)
++#if defined(CPU_LITTLE_ENDIAN)
+ # define ChangeE(x) (WORD)(x)
+ #else
+ # define ChangeE(x) (WORD)(((x) << 8) | ((BYTE)((x) >> 8)))
+ #endif
+
+-#if defined(LITTLE_ENDIAN) && !defined(ALIGNED_ACCESS)
++#if defined(CPU_LITTLE_ENDIAN) && !defined(ALIGNED_ACCESS)
+ # define ReadWord(x) (*(x))
+ # define WriteWord(x,y) (*(x) = (y))
+ # define CopyWord(x,y) (*x = *y)
diff --git a/emulators/pcemu/files/patch-b2-panic b/emulators/pcemu/files/patch-b2-panic
new file mode 100644
index 000000000000..473f3af21513
--- /dev/null
+++ b/emulators/pcemu/files/patch-b2-panic
@@ -0,0 +1,71 @@
+diff -ru orig.Makefile ./Makefile
+--- orig.Makefile Wed Feb 18 10:50:46 1998
++++ ./Makefile Wed Feb 18 10:56:07 1998
+@@ -16,6 +16,7 @@
+ # -DINLINE_FUNCTIONS if your compiler support inline functions (most do)
+ # -DDEBUG prints lots of debugging messages.
+ # -DDEBUGGER compiles in the debugger
++# -DPANIC halt emulator when you hit an unimplemented interrupt
+ # -DKBUK if you have a UK style 102 key keyboard
+ # -DBIG_ENDIAN if your computer is big-endian (Sparc, 68000 etc)
+ # -DCPU_LITTLE_ENDIAN if your computer is little-endian (80x86 etc)
+diff -ru orig.bios.c ./bios.c
+--- orig.bios.c Fri Jun 24 13:39:47 1994
++++ ./bios.c Wed Feb 18 10:56:07 1998
+@@ -657,7 +657,7 @@
+ break;
+ default:
+ printf("unimplement INT 15h function %02X\n",*bregs[AH]);
+-#ifdef DEBUG
++#ifdef PANIC
+ loc();
+ exit_emu();
+ #else
+@@ -790,7 +790,7 @@
+ break;
+ default:
+ printf("unimplemented INT 1Ah function %02X\n", *bregs[AH]);
+-#ifdef DEBUG
++#ifdef PANIC
+ loc();
+ exit_emu();
+ #endif
+@@ -991,7 +991,7 @@
+ break;
+ default:
+ printf("Unimplemented INT 13h function %02X\n",*bregs[AH]);
+-#ifdef DEBUG
++#ifdef PANIC
+ loc();
+ exit_emu();
+ #endif
+diff -ru orig.vga.c ./vga.c
+--- orig.vga.c Wed Jun 22 16:24:51 1994
++++ ./vga.c Wed Feb 18 10:56:07 1998
+@@ -560,7 +560,7 @@
+ break;
+ default:
+ printf("Unimplemented int 0x10 function 0x11 sub-function %02X\n",*bregs[AL]);
+-#ifdef DEBUG
++#if PANIC
+ loc();
+ exit_emu();
+ #endif
+@@ -584,7 +584,7 @@
+ break;
+ default:
+ printf("Unimplemented int 10 function 0x12 sub-function 0x%02X\n",*bregs[BL]);
+-#ifdef DEBUG
++#ifdef PANIC
+ loc();
+ exit_emu();
+ #endif
+@@ -615,7 +615,7 @@
+ default:
+ printf("Unimplemented int 10 function: %02X. AL = %02X BL = %02X\n",
+ *bregs[AH], *bregs[AL], *bregs[BL]);
+-#ifdef DEBUG
++#ifdef PANIC
+ loc();
+ exit_emu();
+ #endif
diff --git a/emulators/pcemu/files/patch-c1-h b/emulators/pcemu/files/patch-c1-h
new file mode 100644
index 000000000000..0a28a6416d41
--- /dev/null
+++ b/emulators/pcemu/files/patch-c1-h
@@ -0,0 +1,262 @@
+diff -ru ../work/pcemu1.01alpha/bios.c ./bios.c
+--- ../work/pcemu1.01alpha/bios.c Wed Feb 18 11:09:11 1998
++++ ./bios.c Wed Feb 18 11:04:52 1998
+@@ -204,7 +204,7 @@
+
+ static void int_serial(void)
+ {
+- D(printf("In serial. Function = 0x%02X\n", *bregs[AH]););
++ D(printf("In serial. Function = %02Xh\n", *bregs[AH]););
+
+ CalcAll();
+ switch(*bregs[AH])
+@@ -219,7 +219,7 @@
+
+ static void int_printer(void)
+ {
+- D(printf("In printer. Function = 0x%02X\n", *bregs[AH]););
++ D(printf("In printer. Function = %02Xh\n", *bregs[AH]););
+
+ CalcAll();
+ switch(*bregs[AH])
+@@ -366,7 +366,7 @@
+ }
+ else
+ {
+- D(printf("Writing ascii %02X scan %02X\n",ascii,scan););
++ D(printf("Writing ascii %02Xh scan %02Xh\n",ascii,scan););
+ PutMemB(data_segment, tmp, ascii);
+ PutMemB(data_segment, tmp+1, scan);
+ SetCurKeyBufEnd(cend);
+@@ -385,7 +385,7 @@
+
+ *bregs[AH] = 0;
+
+- D(printf("Read: %02X\n", code););
++ D(printf("Read: %02Xh\n", code););
+ state = code & 0x80;
+
+ if ((code & 0xe0) == 0xe0)
+@@ -487,7 +487,7 @@
+
+ raw_to_BIOS(code, e0_code, &ascii, &scan);
+
+- D(printf("%02X/%02X\n", ascii, scan););
++ D(printf("%02Xh/%02Xh\n", ascii, scan););
+ if (ascii != 0 || scan != 0)
+ {
+ if (!(KB_1 & ALT) && ascii == 0 && e0_code)
+@@ -539,7 +539,7 @@
+
+ SetCurKeyBufStart(cstart);
+
+- D(printf("Cleared key %02X\n", *bregs[AL]););
++ D(printf("Cleared key %02Xh\n", *bregs[AL]););
+
+ *bregs[CL] = 1;
+ break;
+@@ -567,7 +567,7 @@
+ *bregs[AL] = 0x00;
+
+ ZF = 0;
+- D(printf("Returning key %02X from INT 16 1/11\n", *bregs[AL]););
++ D(printf("Returning key %02Xh from INT 16 1/11\n", *bregs[AL]););
+ }
+
+ break;
+@@ -615,7 +615,7 @@
+ (!(!(KB_2 & SYSREQ)) << 7));
+ break;
+ default:
+- D(printf("Warning: unimplemented INT 16 function %02X\n",func););
++ D(printf("Warning: unimplemented INT 16 function %02Xh\n",func););
+ CF = 1;
+ break;
+ }
+@@ -624,7 +624,7 @@
+
+ static void int_extended(void)
+ {
+- D(printf("In INT 0x15. Function = 0x%02X\n", *bregs[AH]););
++ D(printf("In INT 0x15. Function = %02Xh\n", *bregs[AH]););
+
+ CalcAll();
+ CF = 1;
+@@ -635,8 +635,10 @@
+ case 0x85:
+ CF = 0;
+ break;
+- case 0x10:
+ case 0x41:
++ *bregs[AH] = 0x86;
++ break;
++ case 0x10:
+ case 0x64:
+ case 0xc0:
+ case 0xc1:
+@@ -656,7 +658,7 @@
+ *bregs[AH] = 1;
+ break;
+ default:
+- printf("unimplement INT 15h function %02X\n",*bregs[AH]);
++ printf("unimplemented INT 15h function %02Xh\n",*bregs[AH]);
+ #ifdef PANIC
+ loc();
+ exit_emu();
+@@ -721,7 +723,7 @@
+ time_t curtime;
+ struct tm *local;
+
+- D(printf("In time. Function = 0x%02X\n", *bregs[AH]););
++ D(printf("In time. Function = %02Xh\n", *bregs[AH]););
+
+ CalcAll();
+ switch(*bregs[AH])
+@@ -737,7 +739,7 @@
+
+ CF = 0;
+
+-/* D(printf("Returning %02X%02X%02X%02X\n", *bregs[CL], *bregs[CH],
++/* D(printf("Returning %02X%02X%02X%02Xh\n", *bregs[CL], *bregs[CH],
+ *bregs[DH], *bregs[DL]);); */
+ break;
+ case 1: /* Set ticks */
+@@ -789,7 +791,7 @@
+ CF = 1;
+ break;
+ default:
+- printf("unimplemented INT 1Ah function %02X\n", *bregs[AH]);
++ printf("unimplemented INT 1Ah function %02Xh\n", *bregs[AH]);
+ #ifdef PANIC
+ loc();
+ exit_emu();
+@@ -843,7 +845,7 @@
+ switch(*bregs[AH])
+ {
+ case 0:
+- D(printf("Initialise disk 0x%02X\n",*bregs[DL]););
++ D(printf("Initialize disk %02Xh\n",*bregs[DL]););
+ CF = 0;
+ break;
+ case 1: /* Get last error */
+@@ -890,10 +892,10 @@
+ break;
+ }
+ head = *bregs[DH];
+- cylinder = *bregs[CH] + ((*bregs[CL] & 0xc0) << 8);
++ 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,t%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))
+@@ -912,7 +914,7 @@
+ CF = 0;
+ break;
+ case 4: /* Test disk */
+- D(printf("Testing disk 0x%02X\n",*bregs[DL]););
++ D(printf("Testing disk %02Xh\n",*bregs[DL]););
+ disk = get_disk_tab(*bregs[DL]);
+ if (!disk)
+ {
+@@ -932,7 +934,7 @@
+ CF = 0;
+ break;
+ case 8: /* Get disk params */
+- D(printf("Get disk params 0x%02X\n",*bregs[DL]););
++ D(printf("Get disk params %02Xh\n",*bregs[DL]););
+ disk = get_disk_tab(*bregs[DL]);
+ if (disk)
+ {
+@@ -966,7 +968,7 @@
+ }
+ break;
+ case 0x15: /* Get disk type */
+- D(printf("Get disk type 0x%02X\n",*bregs[DL]););
++ D(printf("Get disk type %02Xh\n",*bregs[DL]););
+ disk = get_disk_tab(*bregs[DL]);
+ if (disk)
+ {
+@@ -990,7 +992,7 @@
+ }
+ break;
+ default:
+- printf("Unimplemented INT 13h function %02X\n",*bregs[AH]);
++ printf("Unimplemented INT 13h function %02Xh\n",*bregs[AH]);
+ #ifdef PANIC
+ loc();
+ exit_emu();
+@@ -1070,7 +1072,7 @@
+ {
+ unsigned tmp,tmp2;
+
+- D(printf("In INT 0xe8 AH = 0x%02X AL = 0x%02X\n",*bregs[AH],*bregs[AL]););
++ D(printf("In INT 0xe8 AH = %02Xh AL = %02Xh\n",*bregs[AH],*bregs[AL]););
+
+ CalcAll();
+ switch(*bregs[AH])
+diff -ru ../work/pcemu1.01alpha/cpu.c ./cpu.c
+--- ../work/pcemu1.01alpha/cpu.c Wed Feb 18 11:09:10 1998
++++ ./cpu.c Wed Feb 18 11:04:52 1998
+@@ -537,7 +537,7 @@
+ #ifdef DEBUGGER
+ call_debugger(D_INT);
+ #endif
+- D2(printf("Interrupt 0x%02X\n", int_pending););
++ D2(printf("Interrupt %02Xh\n", int_pending););
+ interrupt(int_pending);
+ int_pending = 0;
+
+@@ -4163,7 +4163,7 @@
+
+ static INLINE2 void i_notdone(void)
+ {
+- fprintf(stderr,"Error: Unimplemented opcode %02X at cs:ip = %04X:%04X\n",
++ fprintf(stderr,"Error: Unimplemented opcode %02Xh at cs:ip = %04X:%04X\n",
+ c_cs[ip-1],sregs[CS],ip-1);
+ /* exit(1); */
+ }
+diff -ru ../work/pcemu1.01alpha/vga.c ./vga.c
+--- ../work/pcemu1.01alpha/vga.c Wed Feb 18 11:09:11 1998
++++ ./vga.c Wed Feb 18 11:04:52 1998
+@@ -559,7 +559,7 @@
+ }
+ break;
+ default:
+- printf("Unimplemented int 0x10 function 0x11 sub-function %02X\n",*bregs[AL]);
++ printf("Unimplemented int 0x10 function 0x11 sub-function %02Xh\n",*bregs[AL]);
+ #if PANIC
+ loc();
+ exit_emu();
+@@ -583,7 +583,7 @@
+ *bregs[AL] = 0x12;
+ break;
+ default:
+- printf("Unimplemented int 10 function 0x12 sub-function 0x%02X\n",*bregs[BL]);
++ printf("Unimplemented int 10 function 0x12 sub-function %02Xh\n",*bregs[BL]);
+ #ifdef PANIC
+ loc();
+ exit_emu();
+diff -ru ../work/pcemu1.01alpha/xstuff.c ./xstuff.c
+--- ../work/pcemu1.01alpha/xstuff.c Wed Feb 18 11:09:10 1998
++++ ./xstuff.c Wed Feb 18 11:04:52 1998
+@@ -523,7 +523,7 @@
+
+ if (key == XK_Pause)
+ {
+- D(printf("Pause pressed. State = %02X\n", event.xkey.state););
++ D(printf("Pause pressed. State = %02Xh\n", event.xkey.state););
+ if (event.xkey.state & ControlMask)
+ scan = 0xc6e046e0;
+ else
+@@ -531,7 +531,7 @@
+ } /* XK_F22 is sun type 4 PrtScr */
+ else if (key == XK_Print || key == XK_F22)
+ {
+- D(printf("Print pressed. State = %02X\n", event.xkey.state););
++ D(printf("Print pressed. State = %02Xh\n", event.xkey.state););
+ if (event.xkey.state & Mod1Mask)
+ scan = 0x54;
+ else
diff --git a/emulators/pcemu/files/patch-c2-rom8x16 b/emulators/pcemu/files/patch-c2-rom8x16
new file mode 100644
index 000000000000..6aa31c739de6
--- /dev/null
+++ b/emulators/pcemu/files/patch-c2-rom8x16
@@ -0,0 +1,19 @@
+diff -ru orig.vga.c vga.c
+--- orig.vga.c Wed Feb 18 11:11:30 1998
++++ vga.c Mon Feb 16 18:08:24 1998
+@@ -558,6 +558,15 @@
+ wregs[BP] = ChangeE(0);
+ }
+ break;
++ case 0x14: /* Load rom 8x16 font */
++ if (height != 25) {
++ height = 25;
++ SetHeight(height);
++ SetSize((width+1) * (height+1) * 2);
++ new_screen(width+1, height+1, screen_mem);
++ clearscr(0,0,width, height, 0x07);
++ }
++ break;
+ default:
+ printf("Unimplemented int 0x10 function 0x11 sub-function %02Xh\n",*bregs[AL]);
+ #if PANIC
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);
+ }
+-
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();