summaryrefslogtreecommitdiff
path: root/emulators/pcemu
diff options
context:
space:
mode:
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();