diff options
author | Joerg Wunsch <joerg@FreeBSD.org> | 2000-02-21 22:40:56 +0000 |
---|---|---|
committer | Joerg Wunsch <joerg@FreeBSD.org> | 2000-02-21 22:40:56 +0000 |
commit | 6c96bb41e70fc0505bc16987453dda108fe88af6 (patch) | |
tree | 2d1db9feffef7200bedbabff14140ca17d8ba3a8 /emulators/pcemu | |
parent | c54a4961e1779ad719920d43e2a7cfd956c82918 (diff) | |
download | ports-6c96bb41e70fc0505bc16987453dda108fe88af6.tar.gz ports-6c96bb41e70fc0505bc16987453dda108fe88af6.zip |
Notes
Diffstat (limited to 'emulators/pcemu')
-rw-r--r-- | emulators/pcemu/Makefile | 10 | ||||
-rw-r--r-- | emulators/pcemu/files/README.FreeBSD | 34 | ||||
-rw-r--r-- | emulators/pcemu/files/bootstrap.shar | 32 | ||||
-rw-r--r-- | emulators/pcemu/files/bootstrapper.uu | 503 | ||||
-rw-r--r-- | emulators/pcemu/files/patch-b1-cpule | 41 | ||||
-rw-r--r-- | emulators/pcemu/files/patch-b2-panic | 71 | ||||
-rw-r--r-- | emulators/pcemu/files/patch-c1-h | 262 | ||||
-rw-r--r-- | emulators/pcemu/files/patch-c2-rom8x16 | 19 | ||||
-rw-r--r-- | emulators/pcemu/files/patch-c3-hdemul | 273 | ||||
-rw-r--r-- | emulators/pcemu/files/patch-d1-dyndisks | 309 |
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^<7'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` +M'XL(""2\L3@``V1I<W!L87DN8FEN`.W<6XP<V7G8\5Z*W)4JMN70@6S#0522 +M'0PGFFG.\";N2I2V9Z:';._<-#VS)!%[Z9KNZIE:=G>UJZIG.,+&EBW+\.X: +M<!Z<!,B3$22O@0T("6T]1(9E(P&B?8@?8@2Q$1MKA,HB0!X6LKR6R'S?=TY5 +M]Y!<R08,!`'^/T@[?:G+J7/]SJEJWB_>^DKMYV;_Z,RC9W[K0W_XX`=^X+F/ +MROO7_^"W3]5^IU:[_\RIK__0+_Q>[=1&\9&'O_N%OPS&__NWGGGX!U]X>&K\ +M]K^K/?S]=_[DP;<_\/4?K>'_5[NO__G"H]_9_.'%__3&ZNDW/O/:6U]^]I>^ +M>GSZX=>^^4=?_\&?_CWY^HV73__*1XJWWCA\]E>NW'MKX=&73Y5?R`[_X#7Y +MY+>?J7WY0_*A?';SY=\HWOKT9OY#OR&;OKTE;Q;>?G'KP;]_],6OG7[ECNUV +M\^7%KVX]^.5'*ROZP<+;7_^(^W1M[<W5T]<>/1I_WV^\]M9/?'CA[==7WWLG +MD)/XUV^N/JO??EB__3\+;_^=U?=T@[_[QNJSNL%OG?[#_^$^>F/UO7_UVEON +MZ/[`[^R]L?I7[[QT_[G:EI[[US0U[VS<_[[:UOT/U[8>_+R]_XQ^??\9>9_: +M^[IL>O\'Y.W/V-N/RB'DBAZ<D82_<W;N5/%5^?]_GWNF^(]SWU_\FW?^],U7 +M3B^__LKI-ZX_^I75O_JEKQ;/R?:?#L:__(:^&S\G7[\D7\LEGDC9_1]Q2?KG +M#^4<\N67OEK\0TV#G?A_ZH>/#D\_^*2<LTS\?]$/WWE>$R>?//@]?;OX5<V* +M'[P?R@?QPY65-U??>]%R[+UKF[77'I2[_@O==NKT;[[RK*3IV7?^GG_QQG.2 +MX.?>7/W@C==7/RA_)#$?E*\^]<KIHS]^L_KZE6?E.I^5TJB.\\6O?4M3\.Y7 +M?OT77W_EO?)LLWJV!]__\-'AN_KVR]^QBWGOP:N20$W<*^^]\9SDS`>^\:5G +MWEQ]5]+[KORY]B.UX@/?&#WSE3=_L?W@O\F6#_[X.Z^O?E,/\)_EW1NKWY2L +M_:#\T2KQS3=7O_F-_U6S<S_XU]_YA:_5:M^X_(P6ZX.9[V@NO'OFW4?RG7WQ +M]Y^YOU#;D@1(*ML/'DKBGI54N'T/W+Y_69-=Y-K?M5KP]K=75NSC/ZO=/S79 +M\VMNSV_=_V'][%OVV6_ZH\F;3[WRWCAP1SW[G7?^T?U'C[8>_$LYDER!7L2_ +M_;;/A:XF\)5O27[Y<^JIWKGWE6MRN#^3[Q[\^;=U^_\J+]^Y8]_=>>?F?%"3 +M_+K]:/X#^O=SC^9_2/\^?#C_T5KQ^_,_KF]^]-'\*?W[K8?SIVO%;\Y_J%;\ +M[ORO79=/GG\T7WM&_O[%P_G:<_+WK'__'QY^XY\^_,:MAU\Y)Z?>UU._:J?^ +MJ>]HJK_XM0]J.==N)$48#8_#N_%Q6*3ASXZ3HE[+1U$G?B$<QO>*<!3MQW-A +M]X7P(.KW_+N]%\*]J'/7OUO>G@M7;F[(]K)Y/QG*1[M;+X2C[-#>U>;GU],L +MGI^OG=I:#IN#<3\JTBP\7*PO+$;]T4$4GEN>#1>??_Y2N#M,#N,L3XKC,.V% +M2UF2%VG_;'!JJQ]'>1QF\2C-BK"3#@;QL,@E'>/]/(R+CJ;\(.[VX^,7.WE] +M3_:K1YWZ^.[9(`AV#I(\E/^M1(=)-[QA6\WDX512ZK+5J85ZN!/M]6,]<2<= +M%GH"V3WTGO9U]>5B/;R1'FDB]F/)L$X\&$M:HW[_.,S&PV$RW*\VO5`/6\-> +MF@VB(DF'8;27CHNPT"2N9G&\U%X)]1*KS2_67;HEP6F6["?#J!]N-QLKZ\UJ +MDTOU<#D='<NW!T4X3(ND$P=Z08OULZ%=>S]-[\I_D[NQ7+3F61$>'<19;)FR +MV?YL>.I[)%ZR8<L^EAVB81B7)5@<1(5_%]LW5Q>N7@F7MW;#*`^/XGY?_T9R +MPF'G0/(MD"Q?:FVVPSS.#B654GYY&DKUVXORI&,G'&6I7*P<K#B(PY[LIYD4 +M];4^6/JC89#VNW(9YV_MU,.P,3P^BH[G['1)<6![W=J12TGG['65TBR6>IW) +M<?-T$$MN2X'XXX7I*,ZD+(;[87Z<%_%`,T*NVPXHIV@GPTXL%Q-VHJ%D;I@? +M)*-PO3TO&2<E$J1#JQ%)D8>'499$4BO"J)_*T7R"),NZ4HNS1+)="_R<E'W8 +MC_>E'"63\W28S\X%Q^EX1LIC*,40=8JQ9866FJ9*LE@:2*[U/NW-AA_/BVC8 +MU5/$3R3]XW/!J^.\.%F4>VE:Q%VYTFY9G)IQ4C:6-G_-W32V-I(?I$>:&O=E +M,BRRM#NV0I`V<EL^/TIDSX/H,+9LBD=]Z2?<QH-DF,S[P^T=2YI'!\=6K&$R +MD%Y"<RD*--<T06&OGXY&QY*2'2FFC_ODAYUQEDG#FM0\39._@%Z6#K10@U[2 +MCR?M\LSY<9Z=[Z=RHO/]9.^\7?3YE4SZD<99271+\B&+I;EV<TWR7FP58Y*D +M\),7%L*7EK20[L9%(5W7T4$BU?5`ZM1>'`^#SD&:QT.M8KIC-^Y%XWYAB=*$ +MA'GR^5A/(Q4IZ\:9GB/=*Z)D^/AY=`_K0#0/W.5+KYJZFI[V^^F17.\+DPO; +MDMR-I%)4*73[N'H5V5%\;DO2M`)UK8E4^_MJ+,U+FV<F6=T:=OKCKAS1"C\. +M]].T&^;%N-?3_24MPQGI&:0*3Q]CD.1VY5DL1UBQ3:0&:_62+T=CK9QY,AC) +M=14Z6,3=1-K;Y`"ZHS5S/8,TH7"0=I/>L;[-M!_M)?OCS'6%FIVY3^Q4-M@I +M.M+!:39:9ITH_^]>#Y;/RW][>5UR:JHOE^X[K9JF+W5M'TF9039LN>Q\\D3= +M6#NO\%H8O?!3U='#IY]^ZJ2).VD<GG&7;6FRBY'TG$R--8LDM\96[>^[1LM( +M5P>&>LPXZUD3=,?6\<-52U<UM-%41]"]I%Y:UEOUB?-<6W88GI-64G4\CS67 +MJ-I_&!=':78W[&KCJL]*+]+I2*779BJ;3@^O<Y9*J[W]/*T.$'4/DUR:LFQ= +M9K4F6C/[*?DL'5U'QJUKX?-SX>7%"U-9:;5*CQ(=IHE680U%4@D<I(D<:49) +M,QM,#0GQ9)PO#]%R=5YKN^O)K,F>K&A3/6W50\E.D\N11$QZK$E_/2>57#I( +MC:MD='KAR4O[<:D#W:?6F$^%@\/0=5YANSI]8^K:-](C.7ZD8U>56"M1K3S: +M\<:)9L_46>?#\5![)JD;<Z&,&!I\2*D^-56C\+Q4[_.][D)=>YWOUK=.'^"< +M9M=P/-B3TT2]0KM!K>B][EE)ZK&.C,?::[B:(Y&,IE"CA^'4,72/428=IFPK +MUSP[I\/K$Q<A]7;.7???O"OHC@<CS:5Z?"\^D?PBG6H4OD^5[D`VZXP++<CI +M!AGJ86P@FAR@&NK*$G&%X*XW;,B5A$ME$[7F><:^B<Y.':-LF;Y&A><D-;.A +M-CBM55V)7CI2A77(O.V[4CG:T*K:B5R49-HIBO2OFS-/*=`R,=J?N!R1MN-" +M(1=5#./8]1"2H1($'$\UF*P;OGR](>4]+%P_T!MGEANZ3Z"YH)&A'?Z6A8): +M:7P8+)V!),Z&@[*WE\/8!>D`5NBP'.BP;$./58GO%0KH`<[+Q9V(RJ2VQA*` +MYEK9DJEPO)>ZJELFS(=*>A5EZF7(3NS*W_<R)O5%2\E7!>E)98"-`XN(_>95 +M,''L^T/K2C7**$M[:M18E>O8BHJ#LT$>=\H<LM.?N;5Z]<JR#2I^0#E7^#F/ +M7L\MG5A<O3(GG5S/`I3`3I%VQCJ)<M>=V*$T!AWGUHD-71LMKVS6,D(:]E"V +M/XS[QQ:SVO5ID*$'U$F9%/^D.'XB/',OESBA-_K$TSL2+1DIF".MQK<6%S6] +M9=AG(X1$S1)[/I;%VNN/1C(^E4.FSZF@;%Y:7T:1B]T/TK',%MR(F1^4(9&K +MP5$G2UUH4PYL<T$6#V+KQ&QF4QY.8EN-JJ4$RW8NW7UT&"5]B^?\EBY]02YC +MM'9=59VQ.,F/W9&[4$NCOYYS9^[U\K.:O]O3Q:.;G2PB^=^!FZ9)IHY'=OEU +MF]Y&Q8Q..OIS-H'0\^;NPG7TWNO')ZY;"[+;+2=$W>#]PIEZ7::/.C+G5?=X +M(G!Q06?@KO!`^@=MGI(.G2-)9MM);9C2JSDZ2/LN.#E(9,J2=0ZF,E"R3/L5 +M[7QM&J)'*#-,!NXB&4M6Z2=%7,Y$GE*P.OQGNHO.\,K.HYK_^9;F9L&!QNS6 +MPS_>V911_5P5KG9]H"A-5+*]2/9#R?HH./,3-S;7F^?KEJ59YVS90Y5E&/HV +MFH>G+D@^ZKE.7907>[%$*'6;GNOGI_X:2P'5$L;/Z+L93:JKP'*6<KMRLJ*Q +MFTX:NIK>G_SU;#^\.1[FG0,KG$!G[R[^3F0+6V=QEUZN,'12K;M1V(NGHBB; +M[-G!>\D]J3!E%ZGGE38_DD*TY,?#PR1+AUIAYY[:DT]/G6P2-TFV#F(:?D_F +M4#K!L)I<1)G._JS?MLGMD39-'UY*@XVLTY2*+]>XJ[E9C*6/DA[*!Z2)5JA0 +M^W[K<*7O2D>ZA^6ASDR"[C@K^]U1)"<XCJ,LUVSP`8U.[P=:(6-;=)K*D*C; +M=>U;HX'I,K/^/QK>M;;3R"2`O!$/L^1N^)/C<3_\="2?O/KB0#NI83$<UX?I +M9[2)!/EX;Y`4-EN7>9!,LK0CZQQ(Q9/D#%*7R(&50UZUKP,9<"WVBSHZH@7: +MD]6URL3A5IH7[4Z6C(JJ+YGDBKZ3TM%+=Z'5I().1EDMX$R.ZA<0<FE+\O*O +M->[*&<^[];KZ**_O?]Y/QN7,!V.Y,NG+I#`RMP0T/0'M:%@]&,L47&M:XLIZ +M8(M;VM8#B];+`+N<+;K0))D92`,_M'6#87@]EI8UK";,[JTN<^ZEDF5S82(G +M&-LX$@?5VIKVNR_%Q^UC6P?:6@YSZ06T781%%@US7]>EBDEFCVP^K^.,7DG4 +M#\IMI^O(>"AUM'-@_;!>T$!WD-J@R97ZV$E\%9*Z5(ZZU0!?#OTGNQGMZFVQ +MX,0HZ?H$J:OY2`[:2SI!>:622<?:L^2Q7'^1='*WZG*LT^\\R8NR?<KV4G>Z +MX1EY,8A&9^<"MRSA>A/7@G,=,Z:S9<X6!']69HYAGNP/W3S:P@&IES*EE*NQ +ML52*?3\>ZG*5+N58%R(?Z9JSJWR:[UI0FE`MM/P@Z17ZO:;VW(;T_>XXTI9M +M;=J6(GWJTBK(TL&WZONK1.E4U87OT7&02$BMU4P[F.E*(8UI-)HT!IMGZ$JI +MG%/7GG7CPZ@O3:?,UL!GJUM*+==4-%]"5P?T536IEJ%X<OVZI-?O^T8JI\U2 +MF?C(-^%49#<X?J+<)^NX,KMSA10N7KCVI]7KB]=FRM<7%J]]OGI]Y=I/5Z\_ +M>>T3Y>N+SU_[J?+UI85K_[AZO7CME>KUQ6L_7KV^=.VX?'WYXK7Y\O75*]<^ +M'00-'S)*/*;]C-3GY+M5XB._H):.RJUDC\"O<6DETG[-36IEX$B&;C3M'@^C +M@8O`M%YL91*\I.-<XM%0V^"Q6]K5H,2UJKW8CU$VO/BD5,L!LV[Y,3^6&.N> +MJS>I1"Z2_"R)<QDO)9_/^&9Q5J:S<A@Y?2PO<PLZ)0PZTSF6($EJC+X^D-%( +MUYF:]R)=$=/=W0799=C,.I.I=;AX-;RZ$%X(JJ[;?17)5Q<N7Y:R6`BO7`P" +MFY=)[9,1(<MMM6$OMN`\UUKM!LPHE]RV(="&SCE?'?W$\P5I)C+QD7HOH75L +M$6>WFN.X=5@7M]S,$JE^(VD-B:T)G9BL)L/@9\=Q[B8*>14ZEKU"D0S*6:$& +M2I;$<M@^E]1#.;ZTZ+)H!W$WB:K`>$^/[OH62[$=4@-J.:;&Q$NQC0<]&36U +M=P@T,_3X&BP6:=K/_:CG`M2JRN02O3XU2M0[-](F)15R&?N17[QZ/.2JPK_` +M^F[=6FKKZ5?3.-N_<V01U8L2-$0']8,X'M7SZ%Z]&Y^UL"ZP4?2&E('$4Z?> +MY]:-:P)2.YZ8H'NGI^^3:7GM#I-[UBINA3>ENJ5'6LT:N<__0A?\QOO[4D;Y +M7%C._2+;Z_PMN7C;0T.Z_2P:^`5NJ1G:GUM%DISQMW%T<EK.XNUNSEZ46X_O +MUKCU/D>Y0&'K2#(&R]1"HHE4[SOH"K#;P9]+>N\=6]=Q[\*6C8R!MB\74?@A +M.+6%#K=BF/OE<&T^ZVTMZ<OUA??)J#!T6URI7PAN2@O8BK.>-$W98_$IVRZE +M65]/NOR)3X07Z@O!SCC;2\.5>$_S+I./+C^^E]NB(0'00`9PMTFPM+2\I'>L +MPDOU*T\[39FHS]E6_AJNWUQJM%O+3]W\Y23SPX0.(V4Q64/H2'_C(AB?%<&- +M1$+"`QD$,JE8U\<ZXOG&>CWJ1_>.0QV>UZ/]Z/,R>9--&AOM5GUY<SUHQX.; +MD=7+SS6E;Y9K>3SQ&U+WI8WO%HDTK$OURPLR53R4<5[*JNEZ\^#$)E>>5BZW +M"FE)X5:6]MSRLM3ZQ?IBL"5#=;8>Z]J@V_D)C;'4]E07W,[).1.M8GZ.,ANL +M)\-$HJWPZOO6A/5$Y_.I!`TK2;0_E.HHD<[DYF\Y/D_5Q([U#KIV)6.M1.O= +M7",)USB.;(&YJLZ!UAJWO4ZD=;+F;G:Z(7QRFU&;@H[N-I6[.K^XL'[C\[+A +M!6E($I>Y6"4*VW*,MLS3.FTWMP\6%\Y?6@C/E0&0)G1^<)C8RE^O'^W/6ENI +M#GS%'?7JU:F#!A<OND\O::--[U5+*6O)<'Q/6Z\+2OW"NTXQ='J0N^F!!.HZ +M/E1K#19_2%Z]JHW)1_$VOP^B<$_JCJ9"-NIJCS'4%>D]6_>:<3U2IR_#:&YS +M64E`:^90[S7I.GMP8DGC8S(KG=$%U=1-VN5RNWI4[8?N^9W+P4J?1)#>V!X# +MJ%OO/M6OA!)6:>AQD.[[!(S&EJ+QL(SJ;!7"^D$9DV042'K'&BDDQ:Q;U!U9 +M^FWFWM<^W1W?>C4?T$S-EZV'K7I3W=V/L6XXZQ6C^HFG$(+)78)RM*L6^,[K +MZD9^WCV\$`2G6QOMG<;:6FOC>KASHQDVUW?7&CN;VQI5:*/5G==EVN>7>#7, +MEIFM?;RYM=/:W)"P=7EUK7&][8:+[<W-'3?0!M.!9L\M4&7E<O>YEDPP-;`8 +M#S2WRKLW;C'P^L9N>'UY>4XB":V?^P<6H6N_$BZ7X556KCE9/VX3=?\,@`SC +MS6$^SN)JTNZ.:B&(UI)S5HEG+1*4\"-RD=XHE=Y#)TWGXOI^/9S?O!#.]U*9 +M'L_W)-?C^5$JW5LV.Y4MEB6#X^)X%.?U`[>"[TY<K>;9=W;QK8V=JW/AKOT) +MY+^+5]R[Q2OV.(G=VDDS+21]M&.D$8B4GH:XMMR@K6XO]KFO@5A0+;R[MN!6 +M_W2!SU;J)1^DTOKAS^6SK9M)NF9TIC3CXKNK@3:NO>-"GXV8D1S-"O^-I$N_ +MTD@TMTN;T24-_^7%"Y,OY22]P-]=]24C'7)46,/(M>;U>K&OC'[<D$[E,'9W +M$XZG;_'K5#MVN:NS=@ENY6`6,$KKD)P,9W0!8L:2LY_:S2X?N1_:W:GQR!I+ +M''TL7+:T:-;-2-NL=V;"0G;5WD3ZV[[U^%U[]$AWM`Y&>B"9Y6?''YN5LUVW +MR9J/("UB+F_1Z?"HRWGGM6C]HF0Y!781\G2+"20>E7#4KS?8G?UP?F5)VL@G +M+RS,55F@G9(5<11>K%_^N-Z`OVNGG=6'=R0^ZO?]J*X1<>&>OZGJ8"[76"V4 +MSD@Y5JNJ,[[D)'A.,KT+->-NT.J>,^7(-#/5.4QN5$]=>UW7M=WR1WF;QL)# +MZ?1MG+*<F+J35]Y/M*'0M]*.5@G_;,'=\)PT"%U6T_HZZVZJN6'PQ!JJ5F0W +M9Y`TUZM;J-)[ZXJM*W07C.MD;I(FO_YRHO0TVR;Y;8<>YZX;R\>C45_+;J:\ +M7S=3]K5:(:N4VX'L^8KZB7LT-MI/I4-"U["M3R@<NTY>Q\KJ60Q7BNY0Y?30 +MS42JG"Q3$38LGZJW2UJ-I.&[S9=F3T2ZKA%5]REUJ4UG9;J?)<KZ*IW&2FPQ +MX^X%SM3MQI[=:K",L04G74YVX]*)@K81\+8]IR-;EK,IJ792@JZK.]R/W'V& +M<_*JOM?MS;HK])^Z9>?@Y+T5*P:;S.H40'I>MZK2WEC5&QI;RZNS?D1P7P0S +M<M@BS8>]&?W>O1MU>C/^80IK*)88B2UT(=_&<W\[SX9\FZP&;LKZ9%)Z&@]H +M\]JQ['`]SET]@K20&7?;?F^<]-T2GMVIJ<LW?I',K4.5^_D[4;+'090?S#S] +M_ETPN0TYC(\LK?6RFOO#]',[S\ST;99<XMT9R>49[7_T'M_4K4M=KY$1MFO' +MD7;B*WWU&)JM@>_K(P9'6:J/9K7LCGF:!?I'&];439R#N#\*Y[4^=.-1[`-6 +MNP);?'4WAEP]+%MM8!6Q?)ZMO#HK!3FQ'$F:77[RYNW5>S+85+>IYB>COD5# +M50#M>HBRU4IX)@F2:EBM^VEJ7#/0=:M`GRHII#7H71I;-6V$1U%F$:IMM!>7 +MMY*U"??\+44;@:O;R8%_!F\O=O/&JG`FL8H,U4,_WYT[.9I9D4LA!C.^F>@1 +M9R;U9&:OW^U%@Z1_/..:EB]=O:?FXKI(@Y)J4:N\[UGE=+!T7-[C>+^G#UWH +M5_9;O@,(9UP'/5,MB-B`4$ZSIT:#+(S[N77\OGN17BU*AO5)5ZPKF_9@HPX: +M<\&)#G8J5'31XW02M4?,W3-V^O">WNKU@6`6E"MW_MZR5G>[33"K*9*M[<#5 +MK6M_ER<JR@#$+1"=VSL.W+-?Y9;EH"PQW*8NATN&/I9OY6"EDP,))JI[]^-< +MEW9=W[TG54+OO`^[@6:SFW9,Y9X-%EK&E@A7:?UQH[[>/M*UV<#7M-EZ]7"% +M%KL6L4RFRRJOS_6,Y9C6"9?%DNB3KWG@GVR1V-$=PL\*W`FL^FD;=V.%#?]^ +MI7?>?[9L2W6:<CMZIN/LU#,?.ZD_=_DLQ<G3^P=KK,8'-H*4[;(<CWS0,:.Q +MRE`[XTD]*.,13>M`0Q*IR^5M!0W%;:QYGUEW>%H[FQ,51!>F[)E+G4Y./8]B +MJ_6YO[MH?5_YA%D914>%:U2)WB-IN6F6NU%H3S*,IX8D']<]M8V40=&!5IOJ +MFUG?&I+"K6%&;OU)9N'ES2T;-:/^6!]0DO[A*$N*LJIJ^Y6O8NV"IBNU6[R6 +MF'NYFN#9FO907OCO+)Y),[_L7V:+=%BZMEP]1:J=@L\\OX#K/[!G34[V&M// +MK57Q6'ANJ,_NI_H@MI2?3-#<\*(]HU\.+Z^Q7,9VH8;VI[8JFMC:A]Z$T/LK +MN8;=ECX;^/0_5=KL$TF7+XN+5R1TMOAY\=(E+8#%"W47;.H(FY]LTN4L3,=( +M%PZ=O#B[YFHU(@_/R='OVN'EOXOU2Y?6E_3OA?4E:>X:Y[O'42RUXY&V=K<D +M,JQ2._1/K>NSDKK*]YEPH5H5LMC$>H@BG$2\N<28>E/:YA]ZHRB7*AIW[OJU +M<U==<YNS!`=V)\\Z)3N[7Y%YVO'L0&XK=Z!A.IS7Y^$#K6J:XRZM@SC26:M- +M7NP!3UU"LQ?9>*1+X_I4I&1?=0)=-)7__]PG+]2O!B,;>:5$I;%,10D^"DO[ +MX^E;\N43[U*7,\M":5!YFGV/+'395TZR<GLLI1=-.MY\TG7W^A)MU<-5_5,V +M)K^%+J\7[CG&7B116^0Z.$F9=.G=HZ1;N#E\GFKZ<^D\SLL4]#"Q1RTCK=#^ +ML1T-8RQ:VO,+"K:((VF2(&`X?<:>3X7,!_QM!!O(%T)[(C_WS]M*9;1XZ[&= +MI*>>.E09LHSL_J%K^?9D2F,HH9#=_3G9*[K9DX];7/<U_?22KL^Y,=S&BNKA +MBTXU;W:KB\.J1_(-RL>3(_?[&'][(Y#&O>_N@W?UP=:^KR]:*[7WL5!3ZN_D +MB;AJP6!L#V]J`Y6A3*M$(^MHK]`IQA;`Q!K,2M>U7&[KR4A\PK+_B4XP_[=) +M?T%RZ>J5\Q<O^M/8XF:X4'_^^?KBI:,PW-8%6+>.H&M/&F7J:H(N%A56Q#Z4 +M?6$VT$78B^>O5.O)\EXNXE)]L7[/WN_H`H76>NV6;'+E.GZMD]II^I_(2`TL +M#MYW>"Q9D?7TZ10=3:?7?L/%A:E3N^NRJW#I=ZGX3'AA87TIW&ZL3Z?$74MP +M8RO\Y.7+YY]_WI_KQM;NK>ESV]$V7PK/?>;"Y2<.(LEQ67%I:H]VVH\RJ9X7 +MIM.S^5*PW;ZRL#"U`/_9SW[VQ%7>T$'UY--#^[ZEN3EL>=+OF5_7_6ZN=]/6 +M;$.K7J]DW_56V!IVD_W4;=S:;MV2W/MLW:=F)8US^RF#+D4FO<D=8*OJT\N, +MWS,=DZ7*:GI4+JO5Y7(/8SV/W<WZGH>RN98>;;_3"8]CJPAZ"Z\,SS6LMDY! +M)XS:X;IJG`\BJP>Z&JUC=%\2[V;2D?8<DU%,8WL=50>1-%A];*_UV)J,Q502 +M&&@@:O,(/:L^!N'NX5G7HD.#3>VCD\W^R3Y&AJF/!<%--X5[P8WW9;"9N(?X +M9!B2O3\FY6%O[6DE'3C&25>[LWP_T:#$W[,?#_O^/N[4S5I][&J0E`M#>CC_ +MR\"IM6M)Q>ERE3Q<:ZVW=AJV#JZQN(Q@;8T"I;T5>3GH21\R?74V=OJ[G[JH +M6Q3^V727$^X.9F"_6YL\9B?'T\5\[>>UFY,=Y\-X:%V+?WC-S4[*$,UBKS2P +M&/BQ>;2;2M;UMVP']FR_?MMU]QRJC?:.1Y%[6-6E1,,''U:X\JV[7]:M:"2E +MT\I\\KR]](&3QY'TZ/WCH+S>N;":W;L5(:M:W:D&5/=9Z#-/;[$?:8Y5>3') +MNK&+)O79+<DTC2DF84L>Z$Z31V#\LP/E[\7<NH3[2:+.O'0I^=PD7I[5S-.H +ML+PSZN+OS+6++??QP(;M5A4HR42GR-*^KH!7/^:J$INX0G2+2/DH'9;/\85- +M>;G9FSJ.?[#9_8).G_`(+.#6MRYP*_<<1)+Y6;RO"SXG[X=LOB39N.%_*ZB; +MZHK&=\G*J9G"N<C2:>O$OL0MAI1RFIT47E'].L'/\OT$:1A'$L*,M9[7P_6T +M*S-='[V6ZXQ9+`4?EX^GRR>9/V!L-<K?"*N>)9MZ9%,K4I7DDZN??H4EUV4D +M?4HH/_85/3HJ'Q[S#TE5RR]EU:@"39?YS^OL5J*LP.;\=A972R)7X?6&L?Y6 +MRP?#-EJZ&QTG3Q),CC^]LF3':+276ZWSU?92,1)?L\JDCW6.J`'KR0A.;Q!V +MQWU;7M2?T=4[,WJ#P,VR+--]6LKC^+#1'ENU.X56D?S\>&KV*UW:SHW&QDOM +ML_9\MSY(*H-=\>2/!1O#[K'>MM>'V.0`-[;6HKU\KOSAM$Y1]N,7#T;]^D%\ +MI,_.S,O<[JZ48[V3UL=W9ZO;JS>V`KO'&ZPD=HM^2:<[67ANS_Z^.(B[\\FP +M/M9?>.[5N[';T98CJT69,FBPGR^_U(^DW)IY'DOP>E>F[>[5XHMW\WY4'_:? +M=@`?7=C^P<D??.O/O,^7O_HN?^^MZSE/^\VWNUFN=Y:#;JKWL:M)0>K6Q@=V +M^UHGS/OC2`;.(H[+P%#F8`W[_=)/CJ527;@L26L%9;#?U^F'=(]3/U*W3D"_ +M?FREUN:+TC@D]M8;Q\?29>CBE,T3YLN1=,^>[[4''9*IGZ-%OD?2>U,RB+L% +MW'BDO;;$&^Y!$:DA&GWH3Z0MCK`'C=SS1Y?J9V4LZ>KJN6[IEM1./?X+\;/Z +M])'>-K$[5G./_=9`<WCRZ[E[^JBKGS7.#'JY5/.Y8.JN5G6+JZTOI^YN3=YU +M3M[Z\DM--B9,4O;=_Q6`.>F9]_OV"Y.MR7-J^ERI%:'UW]).W:_#YOSO3-WS +MJ-4/L%V$%>AC(M;SVGT*J5$GKUZKIM[AUOFY5;JLDT3ZB$`V2N4$@?]Q0G=R +M7]G=0>T\EL?V0Y7(%J0B=S<HJ7J\J`CV4LM@6RA]?,?RYRU33^0]<4P-!OSB +MDANTIZY!JL12<[FQVV[:4P1;VYO7->YOM25"6FYNM)LKX>IVLQENKH;+-QK; +MUYMSNMUV4[?8V`QO-K:W&QL[MX-5B:FF#B!;;;K'$F[M-#=VPJWFML1;.W*T +MI=MA8VM+#MY86FN&:XV;]5`V6FYN[00W;S0WPDT]_,V6I*<M\9GLT-H(;VZW +M=LKG')8WMVYOMZ[?V`EO;*ZM-+>E5]Y8.2]GMQV#K<;V3JO9UG2\W%HY>5$? +M;[0EV1\/;[9V;FSN[E2)UXMK;-P.7VIMK,P%S98>2-*TM=ULZ_7+L5OKDN+F +MRIPD9GEM=T72(EVG'&%C<\=%DK+9SJ9E3>"W+8^NB9'CKS>W)?\V=AI+K;66 +MG%(2':ZV=C;D%*'F72.TE"]+>"H7L;N]M=ENZN/7FH5R$,GP[5;[)1F!RHS] +MW&ZC.I#DKAQCO;&Q;`6EJ9@J2+W<\/;FKCY_+M>]MG(B4S2CFN%*<[6YO--Z +M68I7MI33M'?7FX'+[_:.9=#:6KC17);T-K9OA^WF]LNM9<N'[>96H[6MN;2\ +MN;VM1]G<T%6*#:T?S9>U]'<WUO0ZMYN?VY4K>4H=T+T;UZ6>:39.E7APLR6G +MU;)YO-CG;!?YPHK=,N]V>//&9KC>N!VN;ZZT5F_[BA'(&5OMG>V6%-C)^B"9 +M.:F7C:5-O?HE24_+DB4)T:R0C`U6&NN-Z\WV5/';J:\W-YK;C;6YL+W57&[I +M"_E>*IV4\IK+#VD_G]O5\FNLE0<)&U*0>@2M@:ZP0FU]6LLVRMHAYWZL10;G +M)N=^LN:%:YMMJV8KC9V&'LK^+C5UZ^WFAN17<T5*I+&\O+LMC4JWT#TD->U= +M:6:M#5<H>KW6CEO;*V'9DJQRKC9::[O;6KN"Z1R4,V]*%NHAK99-%8C;HCT[ +M9W4@;*W*J99O^-(+RO;J"^Z&%,524S9KK+S<LC;G,D9:0;OE\V33'\'GHU2Q +MOYV5HJ`<J9Y\_J(<K/Q3/C+43"8D57`5N/Y6?T>]KL\`;U;_UD;;YBS!],#5 +ML8'KXIS\YX+^9U'_LQ`NZP]]]I,X7(_EJ,.I<>TI>R^&K:5U^5@&&?\/(@3V +M7,.V;I2'V_[Q[7H@GV^=>%#[B5'O:8->^/B@%SS^$U!]Q">+)1_\@#H7GASH +M_'@U-<X%?Z/Q:FH,=+.@H$J3Q!^Q3%7MMZ6A6]/5G\H\]E.UW(WF.C3;H">? +M!&X*D_;FJG'5I=.=/9\Z_?L-E7/!9%<W91I$5A0^I+/87Y/?U2E-DOO%V-%X +MKY]T-$0)]*KU_HG_2<Z)?^ZE7&@O,[^\"U_^2F?.YI"%3$WUQ^]ZW"H'K:27 +M&]L;S>NMIHPT:VN;&S8N:.*DW]Z\Z<9PZV:T8<F@T-Y<W9$1JJF=;6NG78Z- +M@79:*RWKP\/W/:;TI\MKC=:ZM7?M+JL66@ZCUFW:N[+;NWFCL=/>E+Y@6WJD +M]NZ:#>BKVYOKDQ[PL:2YRWJL9?A;MS;3RO+J&<LJV]P_T3#.M+[K_C+;\-^L +M3.?V<FK_'H7=:=)"JC:K3V_VXG*[OKR^6V^N[.J1.@>I3)7DE-6:=EN?/N[H +MS^J_6PL.MZ3@\KUQ)M/EK4:X>/G"XL7YBU>?7]`$:B4]\:M!O7FOSTA81:YJ +MV['_IQST"3IM=8^?,'"+>ZX+L$PXT:QU;NDG]']+':?TF_Y.L?U"QU=.[1UW +MDD&XE&3=\)R\NK-]1U^_N"'7U^_KX^6S05"KG:[5:F?T'Q_\N5KMP^7KUVJU +MC_C7J7S^8_[U9[]0JWW,O_ZH?#XK?S\D_R_>JM7J_O4]>7UQZIB?\J__XN=K +MM67_^JI\ON9??T%>[]9<.GY,7M_QGW])7K_J7_^)O![[X[\FQ_\G_O-[<LPO +MRM_GY/^__HNUVJ_ZUYJ>?R9_Z_:;%ITNU>I[4D3#VIU./Z_=T579VIW]M$CO +M'<M':;]V)TN/:G?RCBX^Z3?Z+Z75[DC5TF=CY(/8OW!;U!?E52Q]D1:K;);I +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(); |