delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1994/06/08/06:20:40

From: elio AT pvax DOT Ico DOT Olivetti DOT Com
>From: elio AT pvax (Elio Tondo)
Subject: Re: your mail about assembler syntax
To: sis2070 AT sisvax DOT sis DOT port DOT ac DOT uk (YA)
Date: Wed, 8 Jun 1994 11:11:52 +0200 (MET DST)
Cc: elio AT pvax DOT Ico DOT Olivetti DOT Com (Elio Tondo), djgpp AT sun DOT soe DOT clarkson DOT edu

> My desire to use familier i386 syntax to write assembler for my programs
> has pushed me into decideing to write a converter between intel 386 and 
> the form used by gas.  
> 
> Has anyone got any advice for me before I start on this, eg how do you think
> I should do it and can you forsee any pitfalls.
> 
> At the moment I am thinking about producing a hybrid assember format with
> standerd 386 instructions and gas style comments and structure (.data .text
> etc...) and write a source to source file converter that can be included in
> a make file as a pre-processor kind of stage.
> 
> any ideas anyone?

You may want to look at a different approach, included in the XFree86
sources; they use an assembly metasyntax and the standard C preprocessor
to generate different assembly sources. Here is a short example:

Source:

#include "assyntax.h"

	GLOBL	GLNAME(ET4000SetReadWrite)
GLNAME(ET4000SetReadWrite):
	MOV_B	(AL,AH)
	SHL_B	(CONST(4),AH)
	OR_B	(AH,AL)
	MOV_B	(AL,CONTENT(Segment))
	MOV_L	(CONST(0x3CD),EDX)
        OUT_B
        RET

Output for GAS:

	  .globl     _ET4000SetReadWrite    
_ET4000SetReadWrite:
	  movb  %al, %ah       
	  shlb  $4,  %ah       
	  orb   %ah, %al       
	  movb  %al, Segment   	       
	  movl  $0x3CD,  %edx       
       	  outb  %al, %dx      
          ret   

Output for the ACK assembler, with a more "traditional" syntax:

	  .extern    _ET4000SetReadWrite    
_ET4000SetReadWrite:
	  movb  ah,  al       
	  shlb  ah,  4          
	  orb   al,  ah       
	  movb  (Segment),  al       
	  mov   dx,  0x3CD          
          outb  dx    
          ret   

As you can see, quite different source formats can be generated.
By modifying the include file assyntax.h, other formats can be set up.

The file assyntax.h follows, gzipped & uuencoded.

Hope that helps...

   Elio


begin 644 assyntax.h.gz
M'XL(".\DJ2T``V%S<WEN=&%X+F@`K%QK<^,VEOVL_A7H292U/(K=?L33Z:GY
MH`=M:T:6'%&VG.QNJ?B2S#1%*@35LKM2^]OW7H"/>T'*TU6[71E``,\]N!>/
M`Q!TS7?A*O:#E5 AT N>[;]ZV3>>UK>+I?OOH.Z,`Y:1O6[T^-WXE@,DNUK&JZ?
M,W'V\\_GXC$-?P_$0QQ^"5(99D&8=<7\.1"3('L.TLB)?0E6:'@?I)M0RC")
M19:(G0RZP AT  DOT NKM@D?KB"'+#"#V66ANXN"T3V'$HADU6V=])`/0PSY!)^XNTV
M09PY&7*MDA0>OHKM+MTF4@/W8?:<[#*Q"@(!).!(X+Z*=>K$6>!WQ39-OH1^
MX"-9]NQDD("=FWP)E$<ZNCC)0@^JM]O`2448"R>*\'$82-6&,G23[%G]0JJZ
MK8*!`]LJ]!JMW&VW29J%\;H66[=J"#V,G4T AT DI7Z7>]V9!9N@!T+/14CF>/#
MTRR4P"V AT E[8[-PJ],'M%?S(GC+$>AJ+L<_0OYR_[/>]*I)/;P`M7H=<5^S3,
MLB"&C AT R1MXSN1*BQ;W!NXWR&?HL3Y$F#;1K((DB)/;_3$<I=F#EN&*&/RA$Z
M`XR!/D&J48;C6XRG^(LCH?R7<OR#%VQ)8O#A9AN%``$JG`:O)_FL/.#O<&0/
MQKW1G2UZX[%8]&:SWF0^LFRQ&,UOQ<RZZ<V&8CX5\]N1+>SI]1P AT 5E>Y-!F,
M'X:CR8VR'-W=CT?6D#),K\6=-1O<0K'7'XU'\U]%;S(4UZ/YQ++M+A"(R129
MK$=K,A?V+?(<<+-OB?&HUQ];XGHZ`YI?A7UO#4:],=(,1S-K,!?3F5JVTXEM
M_?(`C/!4#'MWO1OT11L5Q<5M;VY/H=T9A&@_C.<8QO5L>B?&4UMY_F#K*(>]
M>0^M[V=3<!R\7MQ:\UNP`^][\-]@/II.T`#:G<^@V!43ZV8\NK$F`PL-IXA6
M`S"=`?;!SFVZHC<;V=CN]&&.!%/%"3032Y.J$0!K]"4/[MZ:0?QW/<5]S0<%
M!_H4Q4M\_W2=!L''JT]B$V:G,DBA'T]]_^7TY>+CU6DB?\R7XJDCY2O,SI>3
MY^X7<7YR AT 4IW>?KAXO3#E?AP]>GRIT]G%\)W]C"CK9>M^#YO0"VYTC2?7W80
M!5X^N]437/II`BO'08U+U!-H'RV#C1L%*2QB7)BXCE7_)+"._4(FU"K8)"B(
M!5ZJYZK.2Z+=!E943CNXG8X&%I)L'"]-8'5.$B6L("AIL(9E#ZVAJDBQV<D,
M%$XFXMD!&83&@M1SI!8=I;K`Z7Q)0E]S@;VW2_6:#T[6)UV1[QK">19M^)]^
M'LCW>3],^N(,'+"32L,4D501>5J0:%"X8%\K\?,27VEYAA+2$B+=Q:B>T)49
M]&^`'>`'[]\+,0#_P2;8;+,D/:E:/X?6+Z&?"Q4#:Y"]G9=K$/0>"F AT 8>]$.
MI$0I62AUBZB07K)+G76@&P>'0A`CSP/5 AT 3&-<+#0&^6D<AE-8;.)496``+T%
M<57C#)(.?F AT B^0ICL)&%F[8>9+"I.N)3_NS(Z8C>_`<0A%?YF%X"XNBL\ZD%
MO>[L(J7/1VY'W$P>1*^<26M'*@2."ZR6Y4W/1BT$$&[MUAT(AUH_1QYP;W`Z
M^,X&=OC--D3SSV%6FO<&_V(VA7:NDBA*]CAA8:9 AT YB7Q%^@4U:MJ+KD![!1J
M5X*.4!T&N[T:TR\.[!\[O:<[F2 DOT RUVV AT XFVUEO9,_$/(8(V;8359E?(EN+FU
M1M"]ZR#-X;\`^H^=X^^3U&_]0UQ="E>?%N#9&)Y%2;R&^HMS4K_`%IZAO^'!
MV15YT(<'[FL60+WX6-9?1XF#V_2/VP2&-F_W":";CQ_2P(D`_?$#81G"(S^!
M/3<P';*Q86!23RJ7L!]Z.]BYTD_B!D).TE?QSQ-A/SOIM AT M"LM5'+H05_YI.
M7^5`-AW$0*B^"U="#ZI_E$^*COCA!_&^J&33HU,<!XU9\QW,[7"EV8X*R^72
MG@\'RR7G>YB,G@;W]YV.^///$BN.[.GXZ>.5 AT I9UC018#8UC=4>4IU/8$0:]
M^=%+5[QV6B_BN^_$*S AT 5R>``XO3X^/25NHTG7SZK<9.`Q0,',+$/U"$GUQV4
MJ(OS'V&<3,$I]I99D/>2H:MHB:ON![UVB;Z!8>%H;]QRHJITVW*>J])3RWDI
M2Q8O]L<MMS+LW[;<RK#_U'*)(2\.QBVO,AS<MKS*</#4\H AT A+P['+;\R'-ZV
M_,IP^-3RB2$O]N];[I:XPXKVJ"7#ZB$O#D<MGSSD1?N^)0DM+P[LEB<KJ-V2
M56EHMWQ)#%M!5;JV6ZNJ=&.WUA+'>)#$69I$,-9ZB-D8#F8?6E[Z AT 93/H'Q&
MRN=0/B?E"RA?(.\P<'?K9M8AL/J$=0BL/F$=`JM/6(?`Z AT -K5;Z$\B4I_P3E
MGTCY"LI7I/PW*/\-O>)R)^S,\3Y3U^QY2V;OJGEJ+_O6S6C2.I%XWCG)@I?L
M[R(OI,FF_(U*7Q9<*<O?:/&N(EPNYM.;5BLYNVJ!-ZCKL'^L03/5F@+Q9OLW
M<6PY5H9HA:K/K,8'K7K#X6P)AC=CJ^6<53TRO;=_*^H34 AT _*"9ZU3F!CX[47
MY[KVXKR*11_$CIRNV_4Z+>^=%BJ!<H.JD&O$_Y.4M+F6M+F8M`TU:0=<3]I<
M4-I<4=J&I+0#+BIMKBIM+BMM0U?:`5>6-I>6-M>6MB$N[8#+2]O0%_"-*4S;
MD)AVP$6F;:@,\#.=:1M"`_9,:MI<:]I<;-I<;=I<;MI<;]K?*#AM4W':IN2T
M3<UI?YOHM'V7JPY4<-F!"JX[4,&%!RJX\D`%EQZHX-H#%=\J/NTF]>'+DR_+
M<M/G!YEF!4"]:=0`]>#`PG;SA9V_"ZIE6C8D]%4:/CAN^O>.#2[C=0XXZ<-6
MT*Q4*++P*#_NH-"PH%53Y2-V"%(JQ$]U]J_VHSJ[E16/L\L./^,Q#G)F'$]Z
M=Q:^NNA_#C^BU9[G1[9EU^F41[5WH.3?^.\4L2W\E_\D;]_YRX;PGI/0"V2K
M!O[F-KA*5^_M?@@OO1D<Q=5J^O>$IZ0;IB"]Q:B?K*/$C;JBS&%C#-*X4TV"
M\>AF,K>>YI>EB1.%ZUA<`EC_ZLUNSH_.NQ]>?O[0*2LO&RC.#8IS3G%F4)QW
MU"&Y="!<3:;WZBT9+SCP AT M*1Y'%7N+L,WGSA33[,+Q:WCH<O\K AT  DOT UCM'7<GJ
M5T,7]N AT PB@)]?2N`5\);^!3?7O8AOE]G\#JE+A&S9Y"&DW=\WV,>?6._G!Y[
M3OP?R`OLQZ=&]^`=US?T\!L=C`S?T,&\?\MM832VCF2GFA;0.]!_`#5^=(@L
MSD:3&S0J;/!F%\Y`"':D%WZEORJ[X7(\G=Q4+>&Y"7!YAF)R2<&+Z6Q8@;\X
MT2X`F'J5SN'G%-[_=6Y5<'RQ!E2>*:$B`=SW!@3K)9L-,N.<*?(*/)C>W=6P
M)".TULT2QZ($8[-YZUUZ,.4F.)]*$SR>=D6154=6;M*'G;\*56)OZ[0\[W8.
M[$-5?ZE..(H[K1/Q#W$B_BIBX\660O1ZBDNUQ-4)^T(@U:W_';RCYFHD1IL-
MG&CPUA%KS;,O:'#I>*["WX,*=P4K.+3W)_8<K;[%2+4?:X&L-8]7Q-:$<L&@
MP']0T6GA!I4YG_%%'._3,HFWAZCE#F AT N99GA_C\D)$?8=I%HHN*X(QQX#\B]
MT9U3/G&K)]L(M AT L_E-L(NEC=0SE&@]/K:_35K1P_<C'@,NWDW!5I'R]5_XJ=
M$;Q`/J3TXD?]R0/^VS AT ABB:>^<^NU,4#7C>@:.Z?0^]9/#LHA$)Z(!OJRQ'S
MJS\:'KG=L.N7COE8!J=(WCD*#_MWI!T\%C:T$'1,3\WF;-V>A!8%;;$KBS:+
M7]#JL=3M%HR^;L37G?*)D..'EN'(/O*5?15+25?^"/'[E*95+,"&D9AD_9&*
MOYPBNC/*K.R2RK4FEF$?/')IW^:QZ50Q/!93M.A91O+8FQ7?9XY@,I>==@R%
MKM"I>J"X'B1Y&2S7`<R`WW>;[:F''R8S)UT'O(W!=&C=SV='8%FZ>@P%X%<I
MUJN%>0V3+/]2IMZ*T^"/7:BV#3>%<W=0?)L,UB?B:#";?UC>WXD_!?Q:6G>=
M_%*Q>+5YNF=2\I_.?^>+$'Y5XF%-IG,*^_`>EM'_J/\1T-W#&(_`U>KZKV,7
MUE6>$.!P]&@`3Q&3)YWBX\PBT#?2ZK"1?U?8IG#&"C:H*KAG0*?BZ0,_1:1K
M]256?0#0A\:3HA=T$>+R?8%G=/4%Q AT 6Q`V,8#!B)TEQL0KEQ,N\9SC+CG?<Y
MA%7=F]@C];$H]D6"YQOQ.4[VL?"V6WW&#O7U1(!;*PIVY8L;K/!#C]RY,@LS
M]<E6?9K5'WRJRWAX3?DLC2,2'C>T6H'/M/JB?-'`[-#Q5G5/[//KAEZO'$/'
M0=G.$W(0Z AT T)Q,>G.J&0.P+9X%.=4(A-(!*?ZH1`AH/EV)!CWXM$'K>29*.L
MKHJP5E?B"'*^18UO;_"QLKJS>HNO7^-S#;X#99-J6`_5-T+U&T/U#_'50O6-
M4/W&4`_RU4+UC=`.E0VJ23W4V`@U;@PU;G9M4@\U-D*-&T,]S&>&&ANA'2P;
M5+-[0^_2+0_T8)D3]:</]5YSDYW13[3&52<UW7.J_C#OHH%W7^/=,][%V[SV
M=<U;N>*^&N7<4[DZQ&=Z*5=[@Z]AC`_RS>K^I89_::-_Z2&^FG^IX5_:Z%\S
MW[SF7L:]RYJ<RPYPF:YEW+.LR;$#7#5%=C//\*Q)D:'V$%_-.<_PKDF1#_+5
MQS4SQC5K'-?LP#C4QS4SQC5K'-=#?';=/VGX)QO]DX?X:OY)PS_9Z%\CWZ`W
M'M-3G#J)`CW/.?[Z2':K=[1(012U5$I1J\#R2LA/E*:_J)J$Z0@@5R<$LQA6
M]PC>/H,CA[?W`YT2V'A0H2(/'N<)A0P)!'GRA$)&!!+B4YU0R-PFF$SB\R(E
ML#OBSP9=R1,*N3<GA;?A^X)9UI,":AL'$?@6-;Z]P=<P*=[@Z]?X7(/O0+E&
M!0N`=,A61 AT J-61F4-`P6S&"O#?;$:].@SPQ<;5!D;$K1&16IN:02 AT AG^0D<9
M'_M_J(1<B)$SLX_'Y2*A$)M`)#[5"8%82ENKE]#`4VNNR'7W0(DN0#1:<*-]
M;J1RW44-1GUNY.9&)"?XT2/W+/RB/:MR$[[@\'T.VQ^`]SG<S6$DIV^:<VO&
M3E7P'A6D=/J]5<$GY.UX7H[+<Y1U19%4D)$9?EC$7?[00Q,:@8W,C AT B+'BA_
MZ.%I-.P;AFYA2'^HRX2[1/\M[0;O[)U8WSBMU%_([J+W[^G;W0A>P$VM0103
MEUI%'AY4-W6AXES4.?<F9X/BO,G)>@"`.G#C![&9$&4)XT@<#9^PY3AO8?C4
MM7I/53BQ@.?4>D&L]Z7UOK36QHMFXSXQ=DMCMS(>YQ7*KOJ#K?*OILI;GM'D
M3$TW]?6,1./08!PS%H<3+$R"?4%0C@(/Q[#OF_9N85_J?!F1^K)';[.+".A@
M.-_F?*MPG AT Z%\TU^MPJ_Z4`X;[BLKM<KXX'ALY<[3=472KS%@>&LEWM+U;?!
MB+OIY7[2G.)M-K%QJ]1IX9/D8#J/<9O4:>&+`:;S%K?(*J4X=K6'W^^5GU7&
ML!<,J;\J7*B DOT SRXTOJAC9E-JEBA AT GA+8S*KT.DP#T.HJY;#A01S9W?_9HX']
M[F!`54IQ%@<&&E-E!-MG4#6F54IQG-/59"0CV`&#>@I2I AT 3'*355F1+<#<.M
M%:),*8X3KC47R0B6O3G\KE9-E5(<YXPT&<D(=L('*-9C0S*&M0QPD,-(3O%\
MH+1:T(QA#>Y\F%A.\7S`8CU6)*-8 AT SIGK#**Y0,7ZS$C&<,:Q/FPL9SB^0!J
MT:89PQK<^?"QG.*G')YH5)51[#W';C6HRBC6YEBI055&L;]Q[%<-JC*"Y>YJ
M-\N4X+BKVL4RI3C>75O=2R2C6-[X5K=+,H+EX>NPRY3@>.@ZY#(EN#L>T$;'
M0C*&-5[]?R_>'_,W?Z,,1>.]?]R[O2X;BYSG%1B5J3XFE7^/M)Q9O?'R;CJT
M^-\I+1\_7NEJ0COCQ]'(*=\&!!X^#Y;QPT^G=C886SWST!P%#CLBFV6]-4-M
MT^D6^18UOKW!UW!</LSW6-V-`.A+H!C*C$!OAFPOC]:^VL5Y3O`C`Q_F.)83
M_-`V`O/Y=1:4&XMF1"9-8-`$LK%HT%R;-"N#9B4;BP;-C4FS-FC6LK%HT- AT F
MC31HI&PL&C1C8TBB?"A83O!W]H+A-U(=3GE>'?_'T\&_*G#B?09(F1+:Z9">
M2Z/$QR-IGN73'PJ&P8(9[+5!>3IM,.@S`U<;%!G%3IER14FB-(OG'&^10S@^
M#PH AT _<%-?C-,OA9(^H.;3,QFXI*>_S+,S*;BL AT G^Z_\@D[8I:N9T;"[FT]'0
MR#G[*X$H2Y63)*L:OIL^+FU#HC?)%R9X4&XL\K6`3.,:4618-BCS&WR+?^M8
M AT S*_P=>O\;D&WX%RC8JN-X#A0LNS,BAI&"R8P5X;[(G7ID&?&;C:H,@X]FG9
MK_>]=,W>;ZAY DOT 10 AT 4-:[7[KF`#34O$&Y:/!R7_.I7G.(\K?&P+_6PFRH>8NR
M'OC76I AT --6]0- AT 3^M19F0TTSI;XYK,AV^I-0D>=3<,?>$_*K06JTSXW(!4F#
M49\;N;D1R2O\Q+IAGL7!6GE4Y-HS*)E&"VZTSXV(9PU&?6[DYD8D)_CI?;F<
MXF0+@#RAD#EW/LFT\WF>.Y]DG'?.G4^R?6Y$G:\;];F1FQN1O,)/]:?4:OHD
M_,-ITO0=-6F\99_JKZB4:L^I&B3U(%7?H'(Y57/18'F8$RU-=EEQ6ZQ^*@.K
M]]0=5K>4^'\^0:]\D6%!&?850QY,2;`X1-"G!&Y%D/O<&W>K&L.6W[#J")Q:
M``[SWS$8%IQA7S)4`3C,?Y DOT  AT SPG<DJ`*H*S AT MC;O?MS#\JQT5QH&K+=Q#\NS
MTCW3@/4N[F$TJ[#WTWMU&BDCV>HC(\TX>LS!40XCZ[7!:,&-]KD16:]UHQ[I
M)7CJ1,K$B4 AT SIL&"&>RUP9XTP0VN>0LKW<**MK`R#%@+*]W"BK9`#1[L6Z-S
M=_)9A<YRPV)L&$0%DG9QD^'",-P7AK2;FPS[!UQT#_G(A@:>J[')\\K!FM&"
M&^USHSUUSC"Z-EI:Y2VM6$LKTXBWM,I;6K&6B-%L4/LPF'K\,Z!9UHU#;9/"
M(M^BQK<W^!ID_PV^?HW/-?@.E$VJVA\)I5YJA-JTN4'M(;Y:J*D1:M,.]P9?
M+=34".U0V:":UD<U,48U:1S5I'D4IO5138Q131I']3"?&6IBC.+!LDE5'U7C
MB&*6BU";1V%:'U7CG&*6BU`/\M5"-4;Q8-F AT LJIC91ILQ=_Q3_^++&`XBP*_
M%I!&Z(1AXP(<!^4/#O^MI:UHI:ZC57-"FB&/3BJJ_VWL6I;;QH'@?;\BUZWR
MQ;KN22_'JE)L151,;RXI40_+5;3-$%*DW:]?@L1CNH=0]L)IT-T#8`"!`/AP
M)O>`3;O[&X^2IGJR66//Y737O&;=V_.LOUSY.Y._GN:]XF^D_!7D+Y%F5ZHG
MFW5-5>WKR6;=V_.L/U75FJK:UY.O^%-5K:EJJ32Y&HU450M<-G/:5;5(^N.J
M%KAFYK2K:MH?5[4H"O*72).K\5!.>LUF;6>[SKA*;>3S8*T@!\&Y$X1K>(]@
M!(*B$W AT CN-,5W%DUNV-[3Q4M\N5&IOW[SA,E`,F(LB@<45CD4Q:%]PP`)&/*
M8O.;+*;$]XZ%!?YGXK\XGK#(IRJ\>,<`0#*G+$I'%!;YE$7I/0,`27<;/4K>
M?2,#(,F4-;O`!82R$:E\0P`@"><4FIL0RL:DVOP^)\XH>)<`)9])XAL>`$DX
MF]#VA%`V)Y5O?P`DX9Q"%R"$LD=2?7BJ!"A9D*3R3`E0DI'$>*9)]KGO)/G7
M,R4`R2/]>'P-A`7^@OB^^,(BGR)<^;`"0`F%M_)E`0"2C$KE(^0M!^H[\7UX
MA!5\NN=KW+U>M()/]WR-N]>+5O#O]=3L0%.S0^_4[-`_E;K74[,#3<T.O5.S
MM#^^B!]H*I9,*U?=:UCMRY716??2E7_KLM7SJ5#E;7=^<Z-=#VC'-;@1Y?)^
MQ_,;BJ5SW+B]&<^YT'E/H<^ZT'0JQ/5JH7-5:&XL[S<6.O]MH?4D^$"3X$/O
M)/C0/VF]UY/@`TV"#[V3X+0_U:EHTIM,*U=]G:K6G4J="E5.ML^RIU/5W*GJ
M9*>JK[1/7Z>J=:=2IT)<KQ::.U7-G:I.=JITH>G1">,>F4`K^/3HA'&/3*`5
M_%5\V<<<-PW!'21E(BA;^]?N("DS07FU?^T.DO((BXGC1[N8Z(QKNR9!@AP$
MYTX0%Q-:,`)!T0F\D5RX]V^ZF_[2".XWO>([T8KOU+OB._7_>+[I%=^)5GRG
MWA5?VA__KD^TPDNFT=5JFJG7.(\[@V]NJA-=;>WII,]<^SRSSYX:7_4YTCX+
M]IDZ@>Z>IDOH#K]V==L1T`(_)_[9\82-_'PXBYM*Y[7]0&X\1MKS^/XS1_^R
M.;Q`L-6)+OKV=%_56I^Y]GEFGSW1O^ISI'T6[#-U AT MS-AS$ZEW+=Q"4>!4WO
MEEYH=Y33+C3]NYO/>K?T0KNCG'9A2?OCH-#N:#K=N?I#?G;PTZ+][.`L\:W0
MN\'SE]L0MOW@\G9[\TF:6+*[X2B^RK=?%Z9AA*.D328_Y,>+]NWW&]:6)\!6
M]NQ6DY'&>*H$J!E AT H/;A&PY=8-)IC+EUM="N*M:F3I"WF?NF173V&FJN$.MR
MU AT 6RD4C(1O.)'$7V1=EIP$I^MI)KVGUANC4@`R$9WXN6WQQLFX>CI,VGSX)7
M[B[=V/37I_T[I&Q"Z!Y0Z+C!$GO\^`7JN_EX:TL-%OG8'QM"Z9D!;)4F(XWQ
M5`E0LR!)Y9D2D$25K0IE$D AT 5;Z'*5X5R(2+=`B)758X8+-!ELW^T#>Z/@C:9
MCILN%9G;W:;I0`V-@)3,GK#>_H52`%AIJ\E(8SQ5`M3P&&%?.94_XV2:?M6-
M*QXC&FK%VM0)'B/XW=I]>*=6(];EK`MD(Q$6?JD"7H=`"Z1BOE1!KT.P$9&N
M)_`U!R=U0L=^V1/\6 AT 4[?:8G_DO=`'6,.T&E58U01[X!**1WRZG<5MOOZUV[
MF\9`YF;'(BQH&+<48EW.ND`V$I%LH?.K8C8$E5;E646^`2BE\\F/KR`LMZ7+
MJ-S^%(!$<Q9YJ AT 2DR4GCF48`*7G`\>WUW0UK!$`BINK-*3]+MU="2-F$O!*B
MT'&#)?8L6U']S=%5&P%I<M)XIA$`)0MJG*:V9<B@^BD1"[F`5=0!8AT7L AT ID
M(Y&0-2W[+$5N;T/82\.W'\_L_KE)_$\M\*D`ZV>"?DJG]W;+^6;(-XXG+/#%
MC+O<WK84=P3:?+"2Q')P[$H1+=&G2-\Y6K!`7\PDNWIM2<&@Y\\#\/PRZ#Q&
MB_0'I+\[6K1`_R[)_[84=P3:.,<@=V^:,P#)].$)-;OW7XY+2,CL4]C0GF^G
MLFM(`J29D*;TU`"VK.%+9/@HA+M^)=-T-6M<\>6QH5:L39W@:R,_\;Y_#;50
MB'4YZP+92"3'//&L^+Y]3CP>!6TQ7`T?(K%J?KOO#0FLI"^G7P2[WKU94C1$
MO47NK6,%*^E8#I=]-(*Z?)C,'L1ON'[?-HOQAD=`2K+5HWQL=%^;XT<WM5!(
MR++A$TPLC/TXZ#I>="C=)64CL(.@$$BILO%P+L8<^PE?.]:`E?29")QYM0$+
M1Z3!RJ/Y:[?L("`E7Y<BS.:G_7JW-)*ZPE^JOU)&BS_3AI\AWSB>L,!?X&6H
MN4X='3."B])0H2I?F AT BX7`LN6.5+!``T.(B:8S=VAEZ"Z2X)O80<!(5`2I6M
M:!PV1S?ZQGS]<.P0YDER0;^JS%89U=90;0W6UJC:9EQ;$VIK?&U)9??1L5U.
MA6L.!*29D*;TU`"VK.'+1]C9=R-\,DT#?N.*+Q\-M6)MZ AT 1?/MR=#CE[\[50
MB'4YZP+92(2%7ZJ`UR'0B%C'0:]#L`52<5=+6\OBX*1.Z-BKI:TEJV"GS_3$
MGY>VL4(]4&E5(]21;P`*Z2H3(_#1V)$W'`7MF]N^\\R37Y02(,F"-57@`F*9
MF%J<_#87`2'YGW=8[I[%5Y[W%_N%YWB4M/$][%1>-NWK%6 AT EO_WWLH)_K-<;
M&T("0O+W?"!V3O\I!W;#5!BB+FZ17-TZG@!_RO^U AT _\XVRZ3_ AT  DOT M*HDT:GL`
!`$("
`
end


- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019