www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1996/02/29/17:48:47

Date: Thu, 29 Feb 1996 22:33:48 +0000 (GMT)
From: alberto DOT vignani AT torino DOT alpcom DOT it (Alberto Vignani)
Subject: Serial code for v2.0 (real-world app)
Apparently-to: djgpp AT delorie DOT com
To: djgpp AT delorie DOT com
Reply-to: a DOT vignani AT crf DOT it
Message-id: <199602292233.WAA09413@monviso.alpcom.it>

Hello.

To all the people looking for hardware interrupt management under v2.0:

Here is the code I actually used in a commercial application I wrote.
It is a reworking of materials taken from various freeware sources, so
I have no problems publishing here at least the most relevant parts.
While this code has never crashed, there are nevertheless some points I
would like to clarify (see remarks in the code).

Since I have cut a lot of things, don't expect to use this code without
some reworking ... and please don't complain about undefined stuff, just
cut/add it and retry :-)

--------------------------------------------------------------------
begin 644 serial.c.gz
M'XL("/\G-C$``W-E<FEA;"YC`-0\:7/;.+*?I5^!\>PDDJ/8HJXXUC AT IQ[%G
M5>LCSU8JJ<JD5!0)2AQ+)(>'+>TD^]M?=P,D`9*RG7WV;CU]T`&@&XU&7^@&
MM;O-MA_EQ;9WZ_7=;?8E"JVOC/']W9F7[,[\;F?7B78C'KKF8L>JX:B?7<]:
M)#9GOT:Q[?H[\S=JTSK:C=<!C_1FVR\T!);^&V<J@`1+MXR;KRP>Q!YVY#U;
MDK[YEM(6^&&,U&W58%GQW(V8Y2]YQ)S07[)3UTM6[)J''E_0TG]./)L[C'V\
M.CXZ'=5_AA^NQ]G9X></EZ,:DZ^:@<AN^6+18K?S-?/\^"V"I\./SP_?G1Y/
M3D?GQY.K\>&X9M1S5.;J`Y#$>LCG.MMFXSF/.#-##M1Q%B4!4LQM)A;#!!?K
M*OH/%Y?CR<?S?YQ??#JOM?7FO4Z_#=-I;<:@!XV=8F,?&KL5C8>UGMYZ-+J\
M_'A%*^\7QP\`R4!O!&9!4SV*S=BUF.O%[*,9QN_,B'^1B__*#MA?[57W9*_%
MVJN.^.@>BU_'>]^'*O#(B\^39:3"(G#["$>WW]&[_%X`!%Z\/N4W?*$!_]5K
ML6Z+X;L^_LA?CCSXO5@`]P]8N]AY%?M!D':E?8D7N3,/6JVY&;*+A3WB80L_
MSZQP6!J$F'`,4G9F1M>$)TRLN`YKJB.#M:'(M_=F;`Y!W/"3A7SF1C$/01 AT J
M!\/D.!98QL,P"6+&/7.ZX/?#N04XU^9>[#JN!?3[WKWPIQ;!GZ(,6+X7A_[B
M7I AT S`7/FVWSY8*#3*)\(F9M$]\\3*?,\$.8J()@K*S1C:\X"T\Y`6!7,Y6KD
MM>#](HE;;$P_QOA#,-7F*^8[S..KF,3$M/*I;_P%L!BVJ(#O",9%B(6^(!Y0
M AT BE,#X AT 01P3CV)\)3S@@`F-T>G59KTW=F!D AT GQ?'-=C'+\97T=2!I@^BJ2.;
MNM!T(IIZLJD'3>]&U+3WM2[)DZ(_7@?'8>@#RL'7H=I!K1$V?:]_/LK58H*&
M?(*V>Q(!XSS'9\%RXB_LB1O^.;Q[5.0J>$3O#0\CD,-)R&,VN<&/"@W,=/Z=
M&U>KGC`E`*IK[>7J?Y"17^3GE?M/#JO4QXSEF+$VIHY83US'OP"=(;N`#6!L
M+E?O$D>T$#@:G[%G+CER$-JW/IZ_/S[9&FIFTDK"<(+67S<QV(6M$W0%+>;`
M=,"C?W+-/D4!Y_;27`'HZT$;H4$H7C[*BPD)NSP^,^JU3^3TR(\&/DX,7\#]
M,=BA-;,6'-8:^VS)=]@(B.)\&<%@,P8WR3TV8DG$ZS5KX>Y&L0L_%SZX/ALM
MVZT;SYE_@^;'8UQ(E8!T00U,!S4/_:/1B^<@K^N8HP)@R\GHY`)017,_6=AL
M!A)B>L AT 28<E:;)H`(>#R8Q?=?CP/.9"P],'?"CTRP]"]X6S*'5_Z8#<W AT P!@
M7@/E#2#$,/K71-+SJ%XS0Q]"!=9MMY.H"8MU@(0E6/3=Q,./`A[4+U^0BP):
MKQ$#;9]'WO.8S4WP*QZ0O4:R=NJU$;LU(X:AB%BTNPQ"'J$&2&8BL]Y_.!M1
M;Q#Z,;<P9%B"C:O7-/)/#J_&@-FFD2$W%R]Q$!##L??J].*3X!!MW6*-E.$"
M:4\1Q`*WS79V=I@?BL6*2,4'?J'1CL!1A#"SR1PSBNLU(#.`5A@!W,8EFZRW
M-]@=#-[6:X>"O?".VT'+BUP$1B2,.PXL AT LQ:Q!?P%39EL2:>NMX,Z>)%-KYE
MR`#7NT9J=^I"3!]+XG]V'8P$"X'@!'XP9D;+QA9(\5:S_C-$%[S0[2?QE#5<
M;SH)&A#0&$WV+3-,%.(838P?C0/;C<@]XW3<LUVGOFG:JW$Z+2A.>5KJ5J9E
M<MYG[%\5$[</9%B AT 3IS;DOK"MZXG2P["N&8-W&10;]^UV7800VR3V<6%[\T8
M:F+4K&/P4N@`P9%6R#@`>83Y#_QKX3U=AS6`T+@IS3LH+3J`)<0<$X2;F+:-
M`L\:D^5Z8L-GL\6>84^3O0';V"07)`(FEOH(()@\"'P.90]\W9F#\,-2R:+F
MK6 AT _H8VH5]O3B0]80UM.$P AT F0[[=9,`%]H+6UTQ!BPLB#BY@:\QP AT H$#"&WC
M&>"7Y(,BQDGH(4DUW,CT=T?@^P[OLL48UK\_FBFG$P[M9+"D8%?:B?=H`$-@
M=NZ DOT TV AT G@@-*",O,1.UD='H*9XZ"=[P%Z;&NO_3:KS$^*':&:-_"+^#W2$Y0
M`MM`"PBDP5LUE$A\!4DT9[#7VJM&\H(0AH!H#PH0/*K5\E$=.<I!<3?;A;'.
M1NP]#6ZO`#?;"#<0<(/"3"9CFR!>28@!SC159EKZ-\Q<M=35O,:QR/&6>,_&
MDMC[23 AT 1IM(/<YAW`O\>1_QV`;^-OG152==[`><0!]K]'`Y/TBI1)P6B-`)W
MM^F0/+'@%#6QP$7&.:31E:1UZ;AGYU-8RT"=PNC?/47.`M>;H">=""7/N6"\
MEOO9UGGVM[8ZS:$8]$I9[!\>5T=(9G9.=#33=6!&D3+N2(RS!D7F`=.G*L+C
M?W-E^49U4A$W"DLSE'DZ754*K+8N!7RC%'3Z*APOP#F;X5YI<`6IFVV&D_LT
MG18HG&J*T#E\*-O`\)J+"5DC!?Q8RK:EB!S$BJ57#G$BU_.:UF,4J+-6+6!B
M4(;K2BNU9Y'V=0K:!V!15#5?5]LON\#W:"/_NGV53MLJ[G/00E96P,G]ZG>*
MUM16YU$A]B2$482P-D'(O56E`<V"LJ_=!^]KN'3G"IS<T+YJJ/V`<5.G1:='
M[FE_6@":W@'4:VL;TRUO3`DZ`^VH>V/UJO:F0&\&VGN@/>D-_J^6LG?X`$O9
MDW9P(#=?V+]]XI^I#)-F\+6"R_,#%=%[S<^^UG>BZ&9UGIQHH(8.6O3L&F AT _
MC1U>%7;^3B"Y?8:C`Q4C%!U(ZK&E`+F8M*AZ`=!W");2T*J&FS89G8\GGRX/
M/WPXOFPT:_3Z'7!O-^!\&\80?C9D./4"UO.Z"8$JA)Q_S((`PN2)N7#-:)C#
M4"!>@#E!F(:(:<E.0BR[=S>,T:^`Z=T#<_SC,)W#"ACZG"RX-XOGPSN`NP2,
M)X"7;S#5Y#@1\/TEQ.6$3PX$A)AI;@XW(^H-JBA_U"!<9%,Z%.PKARVP\A&>
M]1<<3T+<;F&Z)&+B#-1HXJD;TQMT$L9CN3RL[!">,24&_/`Z8HXOT@;IFM/C
M/R5:W)@O,Q#*R2`%:3(E,N%D?FNNZ8<\`@(1-J@\-1TI20TG\2S,#A.N1FSB
M.1W.^[,$#U!`#*8X\)S5'*;)F1&S?<I AT O&6'0!-F5T1!!L[_H3N;QRW"!>1G
M^1R8G!A@(0-P84 AT M3N3&;^'$C\,?]7BDI-3JH$\83\1\@CH\2=G9J$A;;I/D
M%<[!XL`H1.A`GI&&I8.R*N`P#,]0.`@IP`,TDQ*,)T\:VOS2Q AT RB,:SJ,KZF
M)]U25T=V05_1TL#YFMKY AT 7;TEPMNT2[Z3M;0A!W%$R_/#K)\6(:F:5O:\AX$
M)[.P+::D8Q\$.$X!QS\(^.SS4;[&ST</6UY#I$2:E6?I%OB<3A4:VEC=1!TP
MRARDVCI4AZ3'.S3SI`2T4TS)'SQN=@!046XNBA/'07MC6A9JL]2*&S-T,7$4
MD:J0CH!!DL4*1AP1*B#I^WRT(SN)T!1@?!?`N`*`$NH5P]-$NS8X*U<07YE;
MG$`M9[A?GX"#HG:^N\#:\JY-\A#MHBW(ZN>5X4`I.$C+PV`A0S^)79&RM41]
M$NQQ&$%4Y\;",>`WP(UI+1.+`186[V0-&=%@`6&'85+>YB"J2\`6L5OT&5A5
MP*K2Q\/+,9 AT L-Q!&69:?J1SA1H AT BB<#N[F/FM=UB5%/&CW[V<;A#+@4]&`"9
MP/L_P150_5`@N)USS/^B?1?I99B&9H5/4^*0G:B/GL7%F%MW06O(*"]BNL4\
MM4>^PHTC41%PN`D[#HL48T0%74ERFDGL6[[GN#-5L'3;+:J%1DM^Z<`741',
MOG1(I;/J#!;:E.(\JFI6KDD-<ZE2(_;YO8\;1]Z?\14FWVC]P$!`$48Q&1-8
MJ&.Z"V)+2R33GQ-K/5^68^)P36[86V-F?,8PO8AKQT%P%FDCK\FAF\AS#W/U
MF*ZG;08Q"D)^`[$',V>FBWE?Q\0\,\E/Y&)*/F)V0OG_T=4AFR80;"Q\,Y8[
M#X>"9!G('2='KTY+T[V4:Q,EK2'LI&O-4V<_Q0#$X6+OZ^14Z1;'KADM=_$2
M!P-R?+8TK[D,'?(9Q0:S=&,H%J1,.*B\+(V3Z<0L.27(6TSKP6@]RYWOM<%X
MJ^@Z]^++)*.(E0SJAZ.(S<T;X!RH,EE0*H2\%#46C'^PXK/T;5!;V!Q4Z)DG
MZU$8$\TA.D)1Z&$-),JSZ!EYSQA$Z10]_863?A*"PNUA*B6H!"01-+$L[^:>
M9&6TOV78WKSI-=-4M!3/HSF'*`;HBCC'F<U,<[&HM%B+:4`.CCCH/D23T]"_
MYI[81%!;#VP)5IZ6$<6N=EK'N02?BA=IR/*@.\SD&T%1_.&(S2T3=1O&KQDX
M23,$^8$I;1^K9UG`3/@6OA],(>)(H6E2(.O*%P)#;6C>KEVZS"').+HX8P86
M!_UD-J?U0D./9#0BX0:0;2&EVZF8IC8*=&_JFZ&-8$O32QS30LL30C2>"G6<
M!!`L<`^Q(Q.Q\C7#XE@&2'4]M$<+%ZM AT 5.$CHE[VT#>AYL_]@/]TCY2?604I
MAWUEWUA1.--A&Z7[+*K$`^?'PS(2824K<8!<ME<G[;L4I4AR2E,^0-)"\B[G
M^NF`\@QZ(2B3Y4X[D]X[UGBZ86):YUYN'XKC%,OA0@\=](]/+H7)DT<H4.:3
MHTO\&(TNQ99M7%\1OZ'CO\NF03][\X8-BHZ&#@<1"!$`I1.JO**J;GM?\JWD
MOLBYI[6M*2CX]3`',S:"*5ZO"K!SQWS]S?-U4["'[A,E79RL$JKRZH"*A[6_
MZK5**@9]>7'B\2Y3[FYCRN/3X>7YZ/PW2N?(V.Y1YT`+<B$L&:VBA?8BK2ZG
MER3`6RYB?T:1$P*D9M5':RXMTC2982I@[M^F%P^$;14F"MP'6L-/Z++0M,G+
MBA!T83QJ^3 AT ZQJH]1$_>#,OV`(:XT'J).JQ^+\*6IR6\@4`AH6^;ZQUXR8CE
M?.<=S/<NM__2DXD4!3HC"%5$O!>'[FPF%H9W-2B`0S8\M_&"Q!0XL<XX8LK[
M,L""A7^+()U>NPV.*;$Q<KHE&NJ/OD\U74F[$#S6ODN!I7K^1L'$R'A8A#<&
M"OR]UJ6 AT 6M^E054F4Y5?-ZR;[,]5D././879SR97!VQR$]5(^N8=2,JVO`I)
MT=&(,8J!T+V)V6^R;]]2%],1C7VS"?:BM"-X!LKYB/H'6LTN>233<Q@;48Y-
ML_SMC3ZO@<:LURP9?GV1>`54K"`U[1EA)>.>"\Y^5>-AN770SQR"<D1IB.MV
M.U:0L%\A(GK+NGNH*_NL_PI.+U6BI2+MY4A!E=+[0!3>P-J%YAJO.VTZ((B@
M2N"G^V51Y,KK,0^@"P]30!9AJR++YHZ9+.**-8IC6*6*/$6B120*TI1*>O^3
M[B>Z^9UAK>.ZW*R?5*WY\"DN_'7KM;$TNA&$M&!"Z28=G2/`_#KNBHFP?^0Q
M",N!P&2!9A=U@"[QU6L0$9LS\B%T0XONG]1_\/X)'<V!.4+M-9=.Z@"'2.!(
MHX%#X""4^GG-A$F-H3$0,M'EJ%<B%I#1"05REY\5]X0VFSH'^W4W7$''/AKA
M=+H\O04BJ&8KV;-G%'[DH:8(A0TT)H(J^2Q!>O644(V\KX452HV7@^4 AT E/[T
MZPNQ$(E&7"E71Q-U+U[(QN_X(26\)H,Y6O6XN&IA(/-T'/M51$ZI?=67AV==
MO&O6*9Q^:\*OI=>C"OR`70"3^POK%)DB)ACGK*&[U%\SY"6N4+]DB_ AT N^3*N
MYHM<U,N7&_G2%GP1E\:+K$D]8>&T5,31%3C4N^H-4HKF)CRG*1Z1IA27J^7N
M-0JI2Y$TQEMIF3@;_>;7IAR.+(<NE#FQQIF/20428HW4-(#8I%ZI)32C)6ML
M8>F:_0U/6*U?X$1/K]^]WR4.W#G&H*-%0XK=6\W'-Z-J2@\"T(DKGN"8A$N\
M:2Y2P#?<BB=>LM0RP4]@TG,;#28.B0DY\(MOI.4_Q8M@(R^HR'0 AT BD)I<"PJ
M#(HMQMN9V1WC">93)IE&3&Y$?:*1XFVQ9_E%?\)$-_IWRO6.*A^@C5>+'T1-
M7@&A<LRF\MPSPI!77TCR_TSPH0!]8=&/+PSQUA$7AA'R%JU6DN'_.;':O*T;
MM_+?6+&ZE<J"'WV1*+2IP&Z25K1I%3J>C5(OUI:'!W</SV[<ULALB[O*3[J7
M<A\WK+;"@&0#AGI_:65/L#]$L1W>3)Q%$LTGH5:/HT(;J1>6Z!LNU3J8"V$1
M'%*9^^*%",9*U;>T)J+ZN[1-%V(EULIA9#24_Q1A`/T^3Y;O\';WY:K8,E9;
M_OX)I#_#J3^Y\[0"7V!HK#&TM/AQ:?%C??%C=?%/K:@H>Q8^.(/VME26U1ZD
MQ%`8I!M/JK=Z:AC"EE<B_GM"*N,5*(EIKRO(U,);_=+`D]+#ET%\'SUT@'E"
M,L*[R;A\8C(R5[;P;WDXL6--C-!PJS*DG^1TU:@^D&!^!0\D1BGC AT B_-;V-T
M^W3K"TTWXD^TOF_LO[2\W>UZ[1WF2D,(OM AT RB6(L<IGP;1&[6+_V'69TVNT=
M=KB(_):LTV&T=DL AT 4;TV`Z44C_29F+;V17:7?3BB0GZ:5VY AT L3$OU#?@^(S<
M59_IK%OSZXE(YC:T9SVI31=L,>Q-GOIYFW_=QW0@]=/1<9<6``<U\4DJD.\J
MAE'WS"FN:[YW;]S(#X?W;KH<B%E=HP\SG@(%A&WX`U)Q*J1B8U$$(,`$RZF*
MI^D[D8(J;<3Z']0FY/O>N5&,//#I<XP]X!,=X*K=+<</8F%5*VNO>FUD&_PL
MK4_WHZGQ1#*H#$]1F]<2*;C`#-UXW1*"$/M!F3Y*@WC@:V2FV0-9W&L*0<B?
M]TK7T?A78X^]9%X3B>RJ!3TQ4RGE^_SB>9K<1`S?D!5[F_*SSX_+@XW-HZ_*
MHSN%T2)L!H_Q]NW;-&6;5AF0'PRS%'4%1>\)=NDIC_=H]DX^GIZ*K'7([<3B
M4:&@1181JUESNE]#[HWRVO$:4Z'AS/5VV$?@Z-\/3T\$(N#/VD_`YCD DOT WF AT 2
MCT!GUVS>7US1_9!ZK<%W9CMX,59(`?3-S84C<-#3U;<@%3(Q:S+'7?`6^P-M
MLX-I6$$#V4]-G;"@M/D"U%3F!DXO?ON--;9H+JH^_6+_[FTISZ)G!?J?RC9.
M[$AYLW%X7L_*I",UB85NL(R])A#4D(_;OT7I-O;;*\O(3%&>;=0`]XIP/83;
M4^`V`)8F;"-@SRB8RVFI;H.2+Y_D%7\=D\DV/HT%8MQHB/\BH"0T:+G1I.=S
MT=/(!W*+QD?;-=SY_]];5]J"!VY=<0<>OG7M?83^KVX=[%"%ROT@[R4Q!<(W
MDOSJ/NJ>Z(0ALR["1^+?7YQK2<<PE/)9'1=)*]Y-A:TA,6!&03C/M.%-^H]*
M)4<JSL5IB`,>-?L;HA06-N_K,!\VXNAW59 AT 7PB'GG"[U=Y1^X;?U_J[2?U;1
MWU/AHW)_7X6OZ!\H_5=!N?\5]DN!/<C^2ZG(@/1/`C#^9+_^JOUUDC:6_CX`
M[X+A5C/<1@!1K])FYJ%\L4!>#]*V"0LB32VVN;NBC87WK((;AU:P%I)`_ZW2
M8EO8O_4#1>DJ'#3 AT 7B3]^Y#T'X;D\%XLA_>@$7_/=1<:,>)>:@;W+6FP84D8
MYHF_OOKA:[>55[6PG/A35L)-145<RRV7*M0_U,KGIW^[4&?6AI7^D(,D6_D_
M#LU*XI1:HHX0Z\G09F;-?M+2V$+E=.-$2E_XNS%AL%)BNX4 AT MVK1PIS<=_^S
M;:+/DL.?D;?:-+;D"_^WEFO9:1T&HNOR%6$#I5$$+.X*E6]`_``*):!(-%1N
M*F4!_X[/S-@>/T"1N,FF53Q.)IZ'[9GQT4,@$TP*;>>GFG^Q8./4IW5$CUW[
MPG AT C5%$NO6X+O0(E(Y.4)\!(G#G."<E3^"^(4T,MB8/321QC%HR]X:@&3XOD
M["C3DD0/0CQ=(:0("%:UON#:%]$X^P71?.L>&HPKTKW>W4ZC(4S%=[?^KLLT
MJ)`'\ZD;:$]^55;J11.N?F7U`D"CV2&V'.E/KPG95HJAM:!ZG<D<62#(+0F7
MUN)TN:;Z%I=L\<N=WCM=%X(D$H.1#PDF\4-QD(8`N;"%/3H`K&N&VNJF;G?)
MYSFQ`SV8CS?3[N,Q'_>')]K8_S+NUC+/`W3BE4C AT 1[X*7K;@9T6$`8^1U.PK
MCM$Q=RVBB+^REW,WGXF2HR^P=Q/8^_]Q6(8M0XX#XO+P@@)PRM&)PVFLGCF^
MT`/<Z[D;+<G9:OR AT XV1\,L(=YT7\0(#<I'`XU&T]G,Q;9[\M/HT'U"M\XI_J
MHK1]SJN*8MJ915&*V-=$N:4+X+.6V AT I!;R`<B17N&-:13P9;D;#GWV`5+*%J
M09DD:NMCS$1>?L,K;9_7/N<G19Z=&K6$>((P$V\*_$E,>8*9\MYHL/3W/A'*
M)"HM:OFA21IY7LIE'\=^IPXD,5]6[C=Y2$#:Z AT JO7NGWXI+6;=7P/R<?^S/X
M;Q<58XJF28#`1`]Q87#KVG:+=`EE9)$NA+JQ1UTW5E"=P3B5<0H3/FS=-&&`
M_2F#9($L(M2I;C2&''2=-Y;RXBJQ;7L,'%J6P1R66+>0Y4_[?H2?>\("))C^
M]6;5`JH/8<_1M,-QWS-.H0^)KKQJY//Q#Y6$GU5:2`C;=-8$IYP6OQ:,9YSN
M]"TB?#V]O^N"495PO=\F&6#EUZ)*1'9'J+?56?BU^ULJ/*PL,Z"IZ_!"KLPA
M/3K3I0E0,GL#G**+[9AQ5IK&+JA';`ZS1]=IJ-MH<7T6/7`!M_ AT -F3QG(*Q<
"````
`
end
--------------------------------------------------------------------

--------------------------------------------------------------------
begin 644 serial.h.gz
M'XL("+HH-C$``W-E<FEA;"YH`*V23T_"0!#%S_`IEG AT I#0:+'C!R,82#B2!J
M$R7&;`J=T AT WM;IW=A>*G=[>%RE]/]K;[?OMFYG7J;9>X__(1MUVO,Z[(3*24
M<:F")"&.O1@+5".=-N]V9*9*+3,:Y3IM$7N2&4!HN*5 AT 80&&@@-Q[-'<:B[9
MG$-8H+-X00N<.'OW1Q82U)_ AT MB?+39F295^\92H$2+(`F5IONE,B.W2.6"2J
M!O>4.$BB,[+IX^33$)<T2K2,*>;G%'5"X:5V7$BE&;5=GU,"5)54:F.-<^B+
M].6WC!W=5D$(PDTX-AJY2<B=ZJC,QP7$RBA/F:(,OZC AT 1TYVANI?%":SV#XT
MNZ AT ED*?1X\0LQ AT I0$A&1#FDTBN6Z""%B9A]>\F<-&E[9M]D-K]?SKINUMMOU
M;CN&VD+^(>19J'-UT]V!-D[#0"Z(LV-[Z34/C4K&WV<JZ.W^P:?^.QT,Q_ZD
IMHI9`LX<E)_W;5).TTX'N0+D15(F8'^=#1`%?GP:J?X#8K[W](<#````
`
end
--------------------------------------------------------------------

Alberto

- Raw text -


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