ain@j.cc.purdue.edu (Patrick White) (11/30/87)
Program Name: AUX handler
Submitted By: Bill Koester CATS (cbmvax!bill@rutgers.edu)
written by Steve Drew
Summary: The AUX: handler off of fish dish 79
Poster Boy: Pat White (ain@j.cc.purdue.edu)
Untested.
NOTES:
Written by Steve Drew, but sent to us from Fish Disk #79 by Bill Koester.
Didn't bother testign it as it has probably been tested.
-- Pat White (co-moderator comp.sources/binaries.amiga)
UUCP: k.cc.purdue.edu!ain BITNET: PATWHITE@PURCCVM PHONE: (317) 743-8421
U.S. Mail: 320 Brown St. apt. 406, West Lafayette, IN 47906
----------------------------------------
This is the Aux-handler from fish disk #79
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# aux-handler.uue
# aux-handler.uue.orig
# aux.sh
# This archive created: Thu Mar 20 23:08:52 1980
echo shar: extracting aux-handler.uue
sed 's/^XX//' << \SHAR_EOF > aux-handler.uue
XXbegin 777 aux-handler
XXM```#\P`````````#``````````(```0I````&0````$```/I```$*4[Z#4).`
XXM50``(&T`""\H`!`B;0`(+RD`#"\M``PO+0`(80A/[P`03EU.=4Y5__@@;0`(L
XXM(6T`$``,(&T`""%M`!0`$"!M``@K:``$__@@;0`(*U#__"!M``@@+0`,T+P`9
XXM``!<(4``!"!M__PA;0`(``H@;?_\0I`@;?_\0J@`!"\M__PO+?_X3KH/OE!/7
XXM3EU.=4Y5__@@+0`(T+P```!<*T#__"\M__Q.N@_L6$\O+?_\3KH/7%A/*T#_'
XXM^"!M__@@*``*3EU.=4Y5_LA!^@3>*TC__"M\`````?_@0JW_T$*G3KH._%A/7
XXM*T#_^"\M__A.NO^@6$\K0/_T(&W_]"`H`!SE@"M`_^P@;?_L("W_^-"\````(
XXM7"%```@@+?_XT+P```!<*T#_Y"!M__0O*``02'C__R\M__@O+?_T3KK^[D_OX
XXM`!!"K(`H0JR`+$*L@#!"K(`@2JW_X&<`!$9*K?_09P``Z"!M_^1P`!`H``]RA
XXM`>&A(FR`$"QI``YT`!0N``]V`>6C@H,L;(`<=@`6+@`/=`'GHH*"+P%.N@[DV
XXM6$\K0/[,(&R`''``$"@`#W(!X:'"K?[,9R8O+(`83KH.SEA/"*P`!(`K(&W_C
XXM\$*H``PO+?_X+RW_\$ZZ_BY03R!L@!`B:``.<``0*0`/<@'AH<*M_LQG+"\L?
XXM@!!.N@P\6$]*@&<>2&W^T$ZZ!H!83R\M__@O+?_P2&W^T$ZZ!09/[P`,(&W_8
XXMY'``$"@`#W(!X:'"K?[,9Q`O+?_X3KK^6%A/*T#_]&`$8`#_#F`.+RW_^$ZZ0
XXM_D)83RM`__0@;?_T("@`"&```OY*K(`@9QI(>`#*0J<O+?_X+RW_]$ZZ_;)/G
XXM[P`08``#&DJM_]!F)DZZ"%HK0/_09AI(>`#*0J<O+?_X+RW_]$ZZ_8A/[P`0B
XXM8``"\&`$4JW_T"!M__0@*``<Y8`K0/_<2'@``2!M_]QP`!`04H`O`$ZZ#.105
XXM3RM`_]@@;?_<<``0$"\`+RW_V")M_]Q2B2\)3KH*S$_O``P@;?_<<``0$")M7
XXM_]A",0@`*VW_V/_48!P@;?_4$!!(@$C`+P!.N@GV6$\@;?_4$(!2K?_4(&W_+
XXMU$H09MQ(>@*0+RW_V$ZZ"JI03TJ`9CP(+``#@"MG-$AZ`H$@;?_P+R@`&$ZZS
XXM"KQ03R!M__`A?`````<`#"\M__@O+?_P3KK\CE!/"*P``X`K8`HO+?_83KH"I
XXM4EA/(&W_W'``$!!2@"\`+RW_V$ZZ#%!03R!M__0@*``4Y8`K0/_H(&W_Z"%\,
XXM_____P`D(&W_Z"%\_____P`$2JR`(&8P(&W_]`RH```#[0`(9B(@;?_T*V@`D
XXM!/[((&W^R"EH`!"`("!M_L@B;?_H(V@`$``D(&W_]"\H`!!(>/__+RW_^"\MZ
XXM__1.NOP63^\`$&```7XK;?_T__`([``#@"LO+?_X+RW_\$AM_M!.N@+F3^\`E
XXM#&```5H@;?_T+R@`'")M__0O*0`83KH&#%!/(&W_]")M__0C:``<``PO+?_XM
XXM+RW_]$ZZ^Y103V```20K;?_T__`([``$@"L@;(`80J@`("!M__`B;(`8(V@`"
XXM%``D+RR`&$ZZ"\!83R\M__@O+?_P2&W^T$ZZ`FQ/[P`,8```X"!M__1*J``4,
XXM9PX([``"@"L(K```@"M@#`BL``*`*PCL``"`*TZZ`CP@;?_T+R@`$$AX__\O[
XXM+?_X+RW_]$ZZ^S!/[P`08```F%.M_]!F#$*M_^!.N@?$3KH'6B!M__0@+(`@C
XXML*@`%&8$0JR`("!M__0O*``02'C__R\M__@O+?_T3KKZ[$_O`!!@5$AX`-%"N
XXMIR\M__@O+?_T3KKZU$_O`!!@/)"\````%&<`_Q*0O````#YG`/ZN6X!G`/[,*
XXMD+P```.+9P#_/)"\````"V<`_-A3@&<`_/)3@&<`_VY@K&``^[8@;?_L0J@`<
XXM"$Y=3G5697(@,2XP("AC*2!3=&5V92!$<F5W(#$Y.#<`0558.D5.1$-,20!%4
XXM3D1#3$D*``!.5?_P*WP````!__!(>``(2'H`]"\M``A.N@?Z3^\`#$J`9P1.5
XXM74YU("T`"%"`*T#__$JM__!G``#**VW__/_X8`12K?_\(&W__$H09PHB;?_\'
XXM#!$`+V;J(&W__$H09@1"K?_P(&W__$(0("W_^%2`*T``""!M__RQ[0`(8WP@8
XXM;?_X$!!(@$C`8"0K?`````'_]&`P*WP````"__1@)BM\````!/_T8!Q"K?_TA
XXM8!:0O````$-GWE6`9]"0O`````UGW&#D(&T`"`P0`$]F+"!M``@,*`!.``%F&
XXM"B`M__2!K(`H8!8@;0`(#"@`1@`!9@H@+?_T1H#!K(`H4JW__&``_S)@`/\@Z
XXM0558.E-%5"\``$Y5```@;(`0(7P````!`"0@;(`0,7P``@`<0>R`#B)L@!`CG
XXM2``H+RR`$$ZZ"4I83TY=3G5.5?_X0JW_^$JL@#!G"`@L``*`*V8(2JR`+&<`X
XXM`4@(+``$@"MG3@BL``2`*R!M``PA?/____\`#"\L@!A.N@;,6$\O+(`83KH)Z
XXM(EA/(&R`''``$"@`#W(!X:$O`4ZZ"0!83R\M`!`O+0`,3KKX>E!/8```\@@LX
XXM``.`*V<``.@(K``#@"L(+``"@"MG!D*L@"Q@!%.L@"Q*K(`P9W(K?`````'_\
XXM^"!M``PK:``8__Q@!%*M__@@;0`(T>W_^")M__S3[?_X$VC_____#"@`"O__/
XXM9@@(+``"@"MG&"QM``P@+?_XL*X`'&P*(BW_^+*L@#!MOB!M__S1[?_X#"@`7
XXM"O__9PP(+``"@"MF!%*L@"P@+?_XD:R`,"\L@#`O+0`((&T`"-'M__@O"$ZZ9
XXM!79/[P`,#*P```#]@#!L$@@L``6`*V<*"*P`!8`K3KK^@B!M``PA;?_X``PO"
XXM+0`0+RT`#$ZZ]X903TY=3G5.5?_^+RR`$$ZZ!_A83QML@`[__PPM``/__V8@#
XXM""P``H`K9@1"+?__2JR`(&<.2'@0`"\L@"!.N@>N4$\(+``"@"MF``#Z$"W_G
XXM_TB`2,!@``"Z0BW__TJL@"!G#DAX(``O+(`@3KH'@%!/8```TG``&T#__TB`M
XXM2,`I0(`P4JR`+&```+P(+``!@"MG!AM\``K__V```*H(+``!@"MG!$(M__]@U
XXM``":2JR`,&<B(&T`"-'L@#`,*``*__]G$E.L@#!(>``#2'H!#$ZZ`1!03T(MH
XXM__]@:DJL@#!G)"!M``C1[(`P#"@`"O__9Q13K(`P2'@``TAZ`.).N@#B4$]@Q
XXMUD(M__]@.D(M__]@-%F`9P#_1%F`9Y)5@&<`_WY7@&<`_V91@&>P5X!GK%>`X
XXM9]A3@&<`_SZ0O````&-G`/]L8,H(+```@"MG*@@L``&`*V<2#"T`"O__9@I(C
XXM>``-3KH`TEA/$"W__TB`2,`O`$ZZ`,)83PPM``K__V8$4JR`+`RL````_H`PL
XXM;2P([``%@"M*K(`L9AX(+``"@"MF%E*L@"P@+(`P4JR`,"!M``@1O``*"`!@H
XXM!$ZZ_+!*+?__9Q(@+(`P4JR`,"!M``@1K?__"`!.74YU""`(``@@"`!.5?_Z3
XXM0JW__$*M__Q@."`M__P@;0`(&W`(`/_[#"T`"O_[9A`(+``!@"MG"$AX``UA&
XXM(EA/$"W_^TB`2,`O`&$46$]2K?_\("W__+"M``QMODY=3G5.50``2BT`"V<B-
XXM(&R`%"%\`````0`D0>T`"R)L@!0C2``H+RR`%$ZZ!.Q83TY=3G5.5?_T*7P`'
XXM```#@"A(>0`!``%(>`!23KH$NE!/*4"`$&8&<`!.74YU2'D``0`!2'@`4DZZ%
XXM!)Y03RE`@!1F$DAX`%(O+(`03KH$PE!/<`!@U$*G0J=.N@,24$\@;(`0(4``/
XXM#D*G+RR`$$*G2'H!`DZZ!-Q/[P`02H!G,"!L@!`O*``.3KH#<%A/2'@`4B\LW
XXM@!1.N@1X4$](>`!2+RR`$$ZZ!&I03W``8`#_?"ML@!#_^"ML@!3__$*M__1@:
XXM%B!M__A2K?_X(FW__%*M__P2D%*M__0,K0```%+_]&7@0J="ITZZ`H903R!LX
XXM@!0A0``.(&R`%#%\``,`'$*G0J=.N@)J4$\I0(`<9U)(>``H+RR`'$ZZ`T!0,
XXM3RE`@!AG/D*G+RR`&$AX``%(>@!43KH$($_O`!!*@&8D(&R`&#%\``D`'"!LX
XXM@!A"*``>(&R`&$(H`!].NOJT<`%@`/[,(&R`&$*H`!1.N@",82)P`&``_KAS0
XXM97)I86PN9&5V:6-E`'1I;65R+F1E=FEC90``3E4```@L``6`*V84+RR`$$ZZ>
XXM`:A83R\L@!!.N@/^6$\@;(`4+R@`#DZZ`D!83TAX`%(O+(`43KH#2%!/+RR`O
XXM$$ZZ`9!83R!L@!`O*``.3KH"&EA/2'@`4B\L@!!.N@,B4$].74YU3E4``$JLL
XXM@!AG(B!L@!A*J``49PHO+(`83KH!4EA/2'@`*"\L@!A.N@)^4$]*K(`<9PHOE
XXM+(`<3KH!S%A/3EU.=7``$"\`![`\`&!C"K`\`'IB!)`\`"!.=7``$"\`![`\^
XXM`$!C"K`\`%IB!-`\`"!.=6%P0^R`!D7L@`:UR68.,CP`%VL(=``BPE')__PI%
XXM3X`&+'@`!"E.@"1(YX"`""X`!`$I9Q!+^@`(3J[_XF`&0J?S7TYS0_H`($ZN'
XXM_F@I0(`*9@PN/``#@`=.KO^48`1.NO,B4$].=61O<RYL:6)R87)Y`$GY``!_;
XXM_DYU3.\#```$<``@+P`,L\AF`DYU8Q#0P-+`8`(3(%'(__Q.=1+84<C__$YUV
XXM,#Q__V`$,"\`#E-`:Q0@;P`$(F\`"+$)9@Q32$H85\C_]G``3G5C!'`!3G5PT
XXM_TYU(&\`!"`((F\`"!#99OQ.=2)O``0L;(`D3N[^(")O``0L;(`D3N[^+")O7
XXM``0L;(`D3N[^/DY5``!(YP@@2'C__TZZ`-!83R@`L+S_____9@IP`$S?!!!.L
XXM74YU2'D``0`!2'@`(DZZ`3A03R1`2H!F#"\$3KH!=EA/<`!@UB5M``@`"A5MJ
XXM``\`"15\``0`"$(J``X51``/0J=.N@$L6$\E0``02JT`"&<*+PI.N@!:6$]@C
XXM"DAJ`!1.N@%.6$\@"F"23E4``"\*)&T`"$JJ``IG""\*3KH!:%A/%7P`_P`(U
XXM)7S_____`!1P`!`J``\O`$ZZ`/I83TAX`"(O"DZZ`-I03R1?3EU.=2)O``0L0
XXM;(`D3N[^GB`O``0L;(`D3N[^MDY5```O"DJM``AF"'``)%].74YU2'D``0`!4
XXM+RT`#$ZZ`&!03R1`2H!F!'``8.`5?``%``@U;0`.`!(E;0`(``X@"F#*3E4`V
XXM`"\*)&T`""`*9@8D7TY=3G45?`#_``@E?/____\`%"5\_____P`8<``P*@`2S
XXM+P`O"DZZ`#Y03V#23OH``DSO``,`!"QL@"1.[O\Z2.<#`")O``PL;(`D3J[^!
XXM.$S?`,!.=4[Z``(B;P`$+&R`)$[N_MI.^@`"(F\`!"`O``@L;(`D3N[_+B`O_
XXM``0L;(`D3N[^L$[Z``(@;P`$+&R`)$[N_HP@;P`$((A8D$*H``0A2``(3G4@N
XXM;P`$3.\"`0`((B\`$"QL@"1.[OY$3.\#```$+&R`)$[N_I(B;P`$+&R`)$[NK
XXM_I@B;P`$+&R`)$[N_C(B;P`$("\`""QL@"1.[OZ\("\`!"QL@"1.[O["(F\`-
XXM!"QL@"1.[OXF3OH``B!O``0L;(`D3N[^@````^P````!`````0``#;@`````I
XX@```#\@```^H````!`!0``````_(```/K`````0```_(!1
XX``
XXend
SHAR_EOF
if test 6124 -ne "`wc -c aux-handler.uue`"
then
echo shar: error transmitting aux-handler.uue '(should have been 6124 characters)'
fi
echo shar: extracting aux-handler.uue.orig
sed 's/^XX//' << \SHAR_EOF > aux-handler.uue.orig
XXbegin 777 aux-handler
XXM #\P # ( 2< 0 !@ /I $G$[Z#K!.
XXM50 (&T ""\H ! B;0 (+RD #"\M PO+0 (80A/[P 03EU.=4Y5__@@;0 (
XXM(6T $ ,(&T ""%M !0 $"!M @K: $__@@;0 (*U#__"!M @@+0 ,T+P
XXM !<(4 !"!M__PA;0 ( H@;?_\0I @;?_\0J@ !"\M__PO+?_X3KD !("
XXM4$].74YU3E7_^" M C0O %PK0/_\+RW__$ZY 27%A/+RW__$ZY 1
XXMQ%A/*T#_^"!M__@@* *3EU.=4Y5_LA!^@5$*TC__"M\ ?_@0JW_T$*G
XXM3KD !&*6$\K0/_X+RW_^$ZY DEA/*T#_]"!M__0@* <Y8 K0/_L(&W_
XXM[" M__C0O %PA0 (("W_^-"\ 7"M _^0@;?_T+R@ $$AX__\O+?_X
XXM+RW_]$ZY *D_O !!"N0 ")"N0 "9"N0 "I"N0 !I*K?_@9P $
XXMGDJM_]!G $ (&W_Y' $"@ #W(!X:$B>0 HL:0 .= 4+@ /=@'EHX*#
XXM+'D 6=@ 6+@ /= 'GHH*"+P%.N0 $D!83RM _LP@>0 !9P ! H ]R
XXM >&APJW^S&<N+SD 23KD !).6$\(N0 $ )2!M__!"J ,+RW_^"\M
XXM__!.N0 103R!Y "B)H YP ! I ]R >&APJW^S&<P+SD *3KD
XXM ^P6$]*@&<>2&W^T$ZZ!Q!83R\M__@O+?_P2&W^T$ZZ!5Q/[P ,(&W_Y'
XXM$"@ #W(!X:'"K?[,9Q(O+?_X3KD "26$\K0/_T8 1@ /[V8! O+?_X3KD
XXM "26$\K0/_T(&W_]" H A@ ,\2KD :9QQ(> #*0J<O+?_X+RW_]$ZY
XXM *D_O !!@ -42JW_T&8H3KH))"M _]!F'$AX ,I"IR\M__@O+?_T3KD
XXM J3^\ $& RA@!%*M_] @;?_T("@ '.6 *T#_W$AX $@;?_<< 0$%*
XXM+P!.N0 $5Q03RM _]@@;?_<< 0$"\ +RW_V")M_]Q2B2\)3KD \X3^\
XXM#"!M_]QP ! 0(FW_V$(Q" K;?_8_]1@'B!M_]00$$B 2, O $ZY .@EA/
XXM(&W_U!" 4JW_U"!M_]1*$&;:2'H"PB\M_]A.N0 #V)03TJ 9D0(.0 #
XXM)6<Z2'H"KR!M__ O* 83KD ^24$\@;?_P(7P ' PO+?_X+RW_\$ZY
XXM !%!/"+D P "5@"B\M_]A.N@)Z6$\@;?_<< 0$%* +P O+?_83KD
XXM !&>4$\@;?_T("@ %.6 *T#_Z"!M_^@A?/____\ )"!M_^@A?/____\ !$JY
XXM &F8R(&W_] RH #[0 (9B0@;?_T*V@ !/[((&W^R"/H ! :(&W^
XXMR")M_^@C: 0 "0@;?_T+R@ $$AX__\O+?_X+RW_]$ZY *D_O !!@ &>
XXM*VW_]/_P"/D P "4O+?_X+RW_\$AM_M!.N@,83^\ #& 7@@;?_T+R@
XXM'")M__0O*0 83KH&L%!/(&W_]")M__0C: < PO+?_X+RW_]$ZY !%!/
XXM8 !0"MM__3_\ CY 0 E('D 20J@ ("!M__ B>0 !(C: 4 "0O
XXM.0 !).N0 $B!83R\M__@O+?_P2&W^T$ZZ I)/[P ,8 \B!M__1*J 4
XXM9Q((^0 " )0BY E8! (N0 " )0CY E3KH"6B!M__0O
XXM* 02'C__R\M__@O+?_T3KD J3^\ $& *!3K?_09@Q"K?_@3KH(O$ZZ
XXM"#0@;?_T(#D :L*@ %&8&0KD :(&W_]"\H !!(>/__+RW_^"\M__1.
XXMN0 "I/[P 08%9(> #10J<O+?_X+RW_]$ZY *D_O !!@/)"\ %&<
XXM_O:0O #YG /Z.6X!G /ZND+P .+9P#_*I"\ "V< _)I3@&< _+A3
XXM@&< _V9@JF ^UX@;?_L0J@ "$Y=3G5697(@,2XP("AC*2!3=&5V92!$<F5W
XXM(#$Y.#< 0558.D5.1$-,20!%3D1#3$D* !.5?_P*WP !__!(> (2'H
XXM_"\M A.N0 #VA/[P ,2H!G!$Y=3G4@+0 (4( K0/_\2JW_\&< - K;?_\
XXM__A@!%*M__P@;?_\2A!G"B)M__P,$0 O9NH@;?_\2A!F!$*M__ @;?_\0A @
XXM+?_X5( K0 ((&W__+'M AC ""(&W_^! 02(!(P& D*WP !__1@,"M\
XXM O_T8"8K? 3_]& <0JW_]& 6D+P !#9]Y5@&?0D+P -9]Q@
XXMY"!M @,$ !/9C @;0 (#"@ 3@ !9@P@+?_T@;D B8!@@;0 (#"@ 1@ !
XXM9@P@+?_T1H#!N0 ")2K?_\8 #_+& _QI!55@Z4T54+P 3E4 "!Y
XXM"B%\ 0 D('D *,7P @ <0?D ((GD *(T@ *"\Y "DZY
XXM 2(%A/3EU.=4Y5__A"K?_X2KD J9PH(.0 " )68*2KD F9P !
XXM? @Y 0 E9UX(N0 $ )2!M PA?/____\ #"\Y $DZY /HEA/
XXM+SD 23KD !).6$\@>0 !9P ! H ]R >&A+P%.N0 $D!83R\M ! O
XXM+0 ,3KD $4$]@ $4"#D P "5G $("+D P "4(.0 " )6<(
XXM0KD F8 93N0 "9*N0 "IG>BM\ ?_X(&T #"MH !C__& $4JW_
XXM^"!M C1[?_X(FW__-/M__@3:/____\,* *__]F"@@Y ( E9QHL;0 ,
XXM("W_^+"N !QL#"(M__BRN0 "IMNB!M__S1[?_X#"@ "O__9Q (.0 "
XXM)68&4KD F("W_^)&Y *B\Y *B\M @@;0 (T>W_^"\(3KD \X
XXM3^\ # RY _0 "IL%@@Y 4 E9PP(N0 % )4ZZ_CX@;0 ,(6W_
XXM^ ,+RT $"\M Q.N0 103TY=3G5.5?_^+SD *3KD !).6$\;>0
XXM C__PPM /__V8>0BW__TJY &F<22'@0 "\Y &DZY 2+E!/"#D
XXM @ "5F $4$"W__TB 2,!@ #40BW__TJY &F<22'@@ "\Y &DZY
XXM 2+E!/8 YG &T#__TB 2, CP "I2N0 "9@ #,"#D 0 "5G
XXM!AM\ K__V +@(.0 ! )6<$0BW__V *9*N0 "IG)B!M C1^0
XXM "H,* *__]G%%.Y *DAX -(>@$J3KH!+E!/0BW__V!P2KD J9R@@
XXM;0 (T?D J#"@ "O__9Q93N0 "I(> #2'H ^DZZ /I03V#00BW__V Z
XXM0BW__V T68!G /\J68!GAE6 9P#_<%> 9P#_5E& 9ZI7@&>F5X!GV%. 9P#_
XXM*I"\ 8V< _V!@R@@Y E9RP(.0 ! )6<2#"T "O__9@I(> -
XXM3KH Z%A/$"W__TB 2, O $ZZ -A83PPM K__V8&4KD F#+D #^
XXM*FTX"/D !0 "5*N0 "9F)@@Y ( E9AQ2N0 "8@.0 "I2N0
XXM "H@;0 ($;P "@@ 8 1.NOPV2BW__V<6(#D J4KD J(&T "!&M__\(
XXM $Y=3G4(( @ "" ( $Y5__I"K?_\0JW__& Z("W__"!M @;< @ __L,+0 *
XXM__MF$@@Y $ E9PA(> -82)83Q M__M(@$C +P!A%%A/4JW__" M__RP
XXMK0 ,;;Q.74YU3E4 $HM MG*B!Y #B%\ 0 D0>T "R)Y #B-(
XXM "@O.0 Y.N0 $7)83TY=3G5.5?_T(_P # (DAY $ 4AX %).
XXMN0 $5Q03R/ "F8&< !.74YU2'D 0 !2'@ 4DZY 17%!/(\ .
XXM9A9(> !2+SD *3KD !&>4$]P &#,0J="ITZY /S%!/('D *(4
XXM#D*G+SD *0J=(>@$P3KD !'J3^\ $$J 9SP@>0 HO* .3KD !!D
XXM6$](> !2+SD .3KD !&>4$](> !2+SD *3KD !&>4$]P & _V K
XXM>0 K_^"MY #O_\0JW_]& 6(&W_^%*M__@B;?_\4JW__!*04JW_] RM
XXM 4O_T9>!"IT*G3KD _,4$\@>0 XA0 .('D .,7P P <0J="
XXMITZY /S%!/(\ 69V)(> H+SD 63KD !#04$\CP !)G2$*G
XXM+SD 22'@ 4AZ %Y.N0 $>I/[P 02H!F*B!Y $C%\ D '"!Y
XXM$D(H !X@>0 !)"* ?3KKY[' !8 #^DB!Y $D*H !1.N@"J82)P &
XXM_GQS97)I86PN9&5V:6-E '1I;65R+F1E=FEC90 3E4 @Y 4 E9APO
XXM.0 I.N0 #Z)83R\Y "DZY 23EA/('D .+R@ #DZY 09%A/
XXM2'@ 4B\Y #DZY 1GE!/+SD *3KD ^^6$\@>0 HO* .3KD
XXM !!D6$](> !2+SD *3KD !&>4$].74YU3E4 $JY $F<L('D 2
XXM2J@ %&<.+SD 23KD ^^6$](> H+SD 23KD !$:4$]*N0 !9G
XXM#B\Y %DZY 09%A/3EU.=7 $"\ ![ \ &!C"K \ 'IB!) \ "!.=7
XXM$"\ ![ \ $!C"K \ %IB!- \ "!.=6%\0_D $1?D M<EF#C(\ !=K
XXM"'0 (L)1R?_\(\\ +'@ !"/. 'DCG@( (+@ $ 2EG$$OZ A.KO_B
XXM8 9"I_-?3G-#^@ D3J[^:"/ !&8,+CP X '3J[_E& &3KD #,4$].
XXM=61O<RYL:6)R87)Y $GY !__DYU3.\# $< @+P ,L\AF DYU8Q#0P-+
XXM8 (3(%'(__Q.=1+84<C__$YU,#Q__V $,"\ #E- :Q0@;P $(F\ "+$)9@Q3
XXM2$H85\C_]G 3G5C!' !3G5P_TYU(&\ !" ((F\ "!#99OQ.=2)O 0L>0
XXM !Y.[OX@(F\ !"QY 'D[N_BPB;P $+'D >3N[^/DY5 !(YS@@2'C_
XXM_TZY 0PEA/* "PO/____]F"G 3-\$'$Y=3G5(>0 ! %(> B3KD !%<
XXM4$\D0$J 9@XO!$ZY 1MEA/< !@TB5M @ "A5M \ "15\ 0 "$(J X5
XXM1 /0J=.N0 $8I83R5 !!*K0 (9PPO"DZY 0M%A/8 Q(:@ 43KD !'8
XXM6$\@"F"(3E4 $CG," D;0 (2JH "F<*+PI.N0 $A)83Q5\ /\ ""5\____
XXM_P 4< 0*@ /+P!.N0 $;983TAX "(O"DZY 1GE!/3-\$#$Y=3G4B;P $
XXM+'D >3N[^GB O 0L>0 !Y.[OZV3E4 $CG,"!*K0 (9@IP $S?! Q.
XXM74YU2'D 0 !+RT #$ZY 17%!/)$!*@&8$< !@W!5\ 4 "#5M X $B5M
XXM @ #B *8,9.50 2.<P("1M @@"F8(3-\$#$Y=3G45? #_ @E?/____\
XXM%"5\_____P 8< P*@ 2+P O"DZY 1GE!/8,Y.^0 $6),[P # 0L>0
XXM !Y.[O\Z2.<# ")O PL>0 !Y.KOXX3-\ P$YU3OD !&0(F\ !"QY
XXM'D[N_MI.^0 $:0B;P $("\ ""QY 'D[N_RX@+P $+'D >3N[^L$[Y
XXM 1RB!O 0L>0 !Y.[OZ,(&\ !""(6)!"J $(4@ "$YU(&\ !$SO @$
XXM""(O ! L>0 !Y.[OY$3.\# $+'D >3N[^DB)O 0L>0 !Y.[OZ8
XXM(F\ !"QY 'D[N_C(B;P $("\ ""QY 'D[N_KP@+P $+'D >3N[^
XXMPB)O 0L>0 !Y.[OXF3OD !)B(&\ !"QY 'D[N_H /L @
XXM $ ZV /,@ $X B *H "V Z /@ %& !
XXML =@ 'X "( F( )Z "J M0 ,& #* U8 -X
XXM #F@ [8 /B $7@ !+X 3X %7 !:8 7 &8 !Y0
XXM ?H ']@ "! @@ (^ "38 E, )>@ "; O6 +^@
XXM#!H PT ,1 #&0 Q\ ,C@ #* SH -"@ #20 U$ -
XXMP@ #= WB -] #@( X4 .)@ #E YB .> #QP _:
XXM 0 $! ! X 03 $%H !!Z 0F $*8 !#T 15 $5X
XXM !&, 1H $<8 !)> E ( %0 !5@ 5P %B !A@
XXM 9P &\ !T@ >( ( "&@ I( .& #P !! 0V $
XXM= !-( 38 $Y@ !/( 4D %+ !38 4^ %@ !8P <J
XXM '1 !V0 =R '?@ !X0 >. 'J ![( >Z 'Q@ !]
XXM ?B '\ !_X @N (.@ "$( A* (4@ "%@ B8 (L@
XXM",P C4 (W@ ".0 D& )$ "1H E& )5 "6@ ET )
XXMA "9X FJ )Q@ "<P G8 )[ "?P H( *%@ "C H\
XXM *2@ "J( JL *W@ "N@ KR *^ "P( L* +$ "Q8
XXM LR +. "WH NT +Q@ "] OJ , @ #"( PN ,3
XXM#%@ QR ,B #)H RN ,M@ #/ SZ -$@ #1X TL -
XXM-@ #5( U> -: #7P VT -O #<H W8 -[@ #?P X*
XXM .( #C8 X^ .2@ #EP YJ .<@ #KP [4 .W@ #P@
XXM ^H /M@ #\0 !"Z 0R $6H !%\ 1E@ $:X !&\ 1T
XXM$?H !(* 2& $B8 !(X 21@ $E0 !)H _( /J
XX5 0 4 /R #ZP !@ /R
XX
XXend
SHAR_EOF
if test 7932 -ne "`wc -c aux-handler.uue.orig`"
then
echo shar: error transmitting aux-handler.uue.orig '(should have been 7932 characters)'
fi
echo shar: extracting aux.sh
sed 's/^XX//' << \SHAR_EOF > aux.sh
XX# This is a shell archive.
XX# Remove everything above and including the cut line.
XX# Then run the rest of the file through sh.
XX#----cut here-----cut here-----cut here-----cut here----#
XX#!/bin/sh
XX# shar: Shell Archiver
XX# Run the following text with /bin/sh to create:
XX# aux.doc
XX# makefile.orig
XX# mountlist
XX# myaux.c.orig
XX# NewChanges
XX# README.fnf
XX# POSTER
XX# myaux.c
XX# misc.c
XX# makefile
XX# This archive created: Thu Mar 20 23:04:04 1980
XXecho shar: extracting aux.doc
XXsed 's/^XX//' << \SHAR_EOF > aux.doc
XXXX
XXXX Aux-Handler V1.0 (c) Steve Drew 1987
XXXX ----------------
XXXX
XXXXI. Desciption:
XXXX
XXXX - Installs as a dos handler to control the serial port as a console.
XXXX - Support all relevent dos packets including WaitForChar and
XXXX ACTION_SCREEN_MODE.
XXXX - To your process it looks just like a CON: handler, screening
XXXX control chars doing CRLF translations and handling deletes ect...
XXXX - Can be made into a RAW console via ACTION_SCREEN_MODE, it then
XXXX acts like a RAW console which does not echo characters or handle
XXXX control chars, but just passes all keys entered back to the process.
XXXX This would allow you to implement a ANSI style screen editor like
XXXX maybe MicroEMACS 3.x to work through AUX:. Now thats a multiuser
XXXX system!
XXXX
XXXXII. Installation:
XXXX
XXXX 1. Insert the included MOUNTLIST file into you DEVS:MOUNTLST
XXXX
XXXX 2. Copy the Aux-Handler to the l: directory
XXXX
XXXX 3. Enter Mount AUX: to load the driver.
XXXX
XXXX
XXXXIII Using
XXXX
XXXX - 'NEWCLI AUX:' will start a cli on the Serial port.
XXXX
XXXX - <BS> <DEL> both delete last char typed.
XXXX
XXXX - ^X or ^U delete entire line.
XXXX
XXXX - ^S / ^Q stop/start screen display (if XON/XOFF selected under prefs.)
XXXX
XXXXIV Notes:
XXXX
XXXX - Setups':
XXXX The Aux-Handler opens the serial port with its current
XXXX settings (as set up in preferences).
XXXX However you may specify if you want ECHO, CRLF, or
XXXX RAW Mode on/off via specifiying keyword 'Set':
XXXX Newcli AUX:Set/E:[On/Off]/C:[On/Off]/R:[On/Off]
XXXX for example to set Raw off, Echo off and CRLF on.
XXXX Newcli AUX:Set/e:off/c:on/r:off
XXXX
XXXX Case is insensitive. The default if any parameters
XXXX not specified is:
XXXX Echo ON, Raw Off, CRLF ON.
XXXX
XXXX - Killing A CLI:
XXXX Normally you just do a ENDCLI. However if you had
XXXX some one in over a modem or fired it up by mistake
XXXX you can force an ENDCLI command to be sent to the
XXXX process by doing a 'ECHO >AUX:ENDCLI' from another
XXXX CLI.
XXXX
XXSHAR_EOF
XXif test 1913 -ne "`wc -c aux.doc`"
XXthen
XXecho shar: error transmitting aux.doc '(should have been 1913 characters)'
XXfi
XXecho shar: extracting makefile.orig
XXsed 's/^XX//' << \SHAR_EOF > makefile.orig
XXXX#########################################################################
XXXX#
XXXX# Aux-Handler Makefile
XXXX# V 1.0 (c) Steve Drew 1987
XXXX# For Manx 3.40a
XXXX#
XXXX#########################################################################
XXXX
XXXX
XXXXaux-handler : misc.o myaux.o
XXXX ln -o aux-handler misc.o myaux.o -lcl32
XXXX
XXXXmisc.o : misc.c
XXXX cc +C +D +L +Hmyaux.syms misc.c
XXXX
XXXXmyaux.o : myaux.c
XXXX cc +C +D +L +Imyaux.syms myaux.c
XXXX
XXSHAR_EOF
XXif test 401 -ne "`wc -c makefile.orig`"
XXthen
XXecho shar: error transmitting makefile.orig '(should have been 401 characters)'
XXfi
XXecho shar: extracting mountlist
XXsed 's/^XX//' << \SHAR_EOF > mountlist
XXXX
XXXX/*
XXXX Installs Aux-Handler V 1.0 (C) Steve Drew
XXXX*/
XXXX
XXXXAUX: Handler = L:Aux-Handler
XXXX Stacksize = 4000
XXXX Priority = 5
XXXX GlobVec = 1
XXXX#
XXSHAR_EOF
XXif test 162 -ne "`wc -c mountlist`"
XXthen
XXecho shar: error transmitting mountlist '(should have been 162 characters)'
XXfi
XXecho shar: extracting myaux.c.orig
XXsed 's/^XX//' << \SHAR_EOF > myaux.c.orig
XXXX/****************************************************************************
XXXX *
XXXX * Aux Driver V1.0 (c)CopyRight 1987, Steve Drew. All Rights Reserved.
XXXX *
XXXX * Aux-Handler Ver. 1.0 1-May-1987
XXXX *
XXXX * Steve Drew
XXXX * 52-Castledale Cres. N.E.
XXXX * Calgary, Ab. Canada.
XXXX *
XXXX * |You may freely distribute this source as long as |
XXXX * |the Copyright notice is left intact. |
XXXX ***************************************************************************/
XXXX
XXXX
XXXX#include <devices/serial.h>
XXXX#include <devices/timer.h>
XXXX
XXXX
XXXXtypedef unsigned char u_char;
XXXX
XXXX#undef BADDR
XXXX#define BADDR(x) ((APTR)((long)x << 2))
XXXX
XXXX#define ACTION_FINDINPUT 1005L
XXXX#define ACTION_FINDOUTPUT 1006L
XXXX#define ACTION_END 1007L
XXXX#define ACTION_SCREEN_MODE 994L
XXXX
XXXX#define DOS_FALSE 0L
XXXX#define DOS_TRUE -1L
XXXX
XXXX#define AUX_ECHO 1
XXXX#define AUX_CRLF 2
XXXX#define AUX_RAW 4
XXXX#define AUX_RPEND 8
XXXX#define AUX_WAIT_FOR 16
XXXX#define AUX_TYPEAHEAD_FULL 32
XXXX#define AUXBUFSIZE 256 /* Same as CON: handler */
XXXX#define MAXLINESIZE 254 /* save two for \n'\0' */
XXXX
XXXX
XXXX#define MYPORT_SIG (1L << myport->mp_SigBit)
XXXX#define READSER_SIG (1L << ReadSER->IOSer.io_Message.mn_ReplyPort->mp_SigBit)
XXXX#define TIMER_SIG (1L << Timer_Port->mp_SigBit)
XXXX
XXXX/* extern long AbsExecBase; */
XXXX
XXXX/* My Globals */
XXXX
XXXX
XXXXstruct IOExtSer *ReadSER;
XXXXstruct IOExtSer *WriteSER;
XXXXstruct timerequest *Timer;
XXXXstruct MsgPort *Timer_Port;
XXXXstruct Task *reader;
XXXXlong SysBase;
XXXXint aux_stat,
XXXX aux_avail,
XXXX in_len;
XXXXu_char in_c;
XXXX
XXXX_main()
XXXX{
XXXX
XXXX extern void returnpkt(); /* sends back the packet */
XXXX extern void returnpktplain(); /* use args in Res1 */
XXXX extern struct DosPacket *taskwait();
XXXX
XXXX char *version = "Ver 1.0 (c) Steve Drew 1987";
XXXX struct Process *myproc; /* my process */
XXXX struct DosPacket *mypkt; /* a pointer to the dos packet */
XXXX struct DosPacket *rdpkt;
XXXX struct DeviceNode *mynode; /* our device node (parmpkt Arg3) */
XXXX struct FileHandle *fh; /* a pointer to our file handle */
XXXX struct MsgPort *myport;
XXXX long run = TRUE; /* handler main loop flag */
XXXX u_char *ptr; /* ptr for name translation */
XXXX char *name,*s; /* ptr to name for open */
XXXX int aux_open = 0; /* aux open count */
XXXX char auxbuf[AUXBUFSIZE];/* Our type ahead buffer */
XXXX long signals; /* signals that occurred in Wait */
XXXX
XXXX
XXXX /* Initializing the handler */
XXXX
XXXX myproc = (struct Process *)FindTask(0L);
XXXX mypkt = taskwait(myproc); /* Wait for my startup message */
XXXX
XXXX /* I don't need the name or extra info passed in Arg1/2 */
XXXX
XXXX mynode = (struct DeviceNode *)BADDR(mypkt->dp_Arg3);
XXXX mynode->dn_Task = &myproc->pr_MsgPort;
XXXX myport = &myproc->pr_MsgPort;
XXXX returnpkt(mypkt, myproc, DOS_TRUE, mypkt->dp_Res2);
XXXX
XXXX in_len = aux_avail = aux_stat = 0;
XXXX reader = (struct Task *) 0;
XXXX
XXXX
XXXX /* done initial stuff, now for some work */
XXXX
XXXX while(run) {
XXXX
XXXX if (aux_open) { /* then wait for read char or new action */
XXXX
XXXX signals = Wait( MYPORT_SIG | READSER_SIG | TIMER_SIG );
XXXX
XXXX if (signals & TIMER_SIG) {
XXXX WaitIO(Timer);
XXXX aux_stat &= ~AUX_WAIT_FOR;
XXXX rdpkt->dp_Res1 = DOS_FALSE;
XXXX returnpktplain(rdpkt,myproc);
XXXX }
XXXX if ((signals & READSER_SIG) && CheckIO(ReadSER)) {
XXXX read_ser(auxbuf);
XXXX chk_pend(auxbuf,rdpkt,myproc);
XXXX }
XXXX if (signals & MYPORT_SIG) {
XXXX mypkt = taskwait(myproc);
XXXX }
XXXX else /* no new dospackets */
XXXX continue;
XXXX }
XXXX else /* only port at the moment is myport */
XXXX mypkt = taskwait(myproc);
XXXX
XXXX switch(mypkt->dp_Type) { /* find what action to perform */
XXXX
XXXX case ACTION_FINDINPUT:
XXXX
XXXX if (reader) { /* Have I already got a someone reading */
XXXX returnpkt(mypkt, myproc, DOS_FALSE, ERROR_OBJECT_IN_USE);
XXXX break;
XXXX }
XXXX
XXXX case ACTION_FINDOUTPUT:
XXXX
XXXX /*
XXXX I allow for multiple writers. But doesn't make sense
XXXX to allow for mutilple readers.
XXXX */
XXXX if (!aux_open) { /* first time here we open the devices */
XXXX if ((aux_open = open_stuff()) == 0) {
XXXX returnpkt(mypkt, myproc, DOS_FALSE, ERROR_OBJECT_IN_USE);
XXXX break;
XXXX }
XXXX }
XXXX else
XXXX aux_open++;
XXXX
XXXX /* get file name and Upper case it */
XXXX ptr = (u_char *)BADDR(mypkt->dp_Arg3);
XXXX name = AllocMem((long)*ptr + 1, MEMF_PUBLIC);
XXXX movmem(ptr+1, name, *ptr);
XXXX name[*ptr] = '\0';
XXXX for (s = name; *s; ++s) *s = toupper(*s);
XXXX
XXXX
XXXX /*
XXXX This is a Hack to allow a bail out of a NEWCLI
XXXX that is using the AUX. By doing say an echo >AUX:ENDCLI
XXXX from another process the reader (being the NEWCLI)
XXXX will be sent a ENDCLI command.
XXXX */
XXXX
XXXX if (!strcmp(name,"AUX:ENDCLI") && (aux_stat & AUX_RPEND)) {
XXXX strcpy(rdpkt->dp_Arg2,"ENDCLI\n");
XXXX rdpkt->dp_Res1 = 7L;
XXXX returnpktplain(rdpkt, myproc);
XXXX aux_stat &= ~AUX_RPEND;
XXXX }
XXXX else
XXXX chk_params(name);
XXXX
XXXX FreeMem(name, (long)*ptr +1);
XXXX fh = (struct FileHandle *)BADDR(mypkt->dp_Arg1);
XXXX fh->fh_Arg1 = DOS_TRUE;
XXXX fh->fh_Port = (struct MsgPort *)DOS_TRUE;
XXXX
XXXX if (!reader && (mypkt->dp_Type == ACTION_FINDINPUT)) {
XXXX struct MsgPort *port;
XXXX
XXXX port = mypkt->dp_Port;
XXXX reader = port->mp_SigTask;
XXXX fh->fh_Arg1 = (long)port->mp_SigTask;
XXXX }
XXXX
XXXX returnpkt(mypkt, myproc, DOS_TRUE, mypkt->dp_Res2);
XXXX break;
XXXX
XXXX case ACTION_READ:
XXXX
XXXX rdpkt = mypkt;
XXXX aux_stat |= AUX_RPEND;
XXXX chk_pend(auxbuf,rdpkt,myproc);
XXXX
XXXX break;
XXXX
XXXX case ACTION_WRITE:
XXXX
XXXX write_ser(mypkt->dp_Arg2,(int)mypkt->dp_Arg3);
XXXX mypkt->dp_Res1 = mypkt->dp_Arg3; /* tell em we wrote them all */
XXXX
XXXX returnpktplain(mypkt, myproc);
XXXX break;
XXXX
XXXX case ACTION_WAIT_CHAR:
XXXX
XXXX /* just queue up to wait for data */
XXXX
XXXX rdpkt = mypkt;
XXXX aux_stat |= AUX_WAIT_FOR;
XXXX Timer->tr_time.tv_secs = 0L;
XXXX Timer->tr_time.tv_micro = rdpkt->dp_Arg1;
XXXX SendIO(Timer);
XXXX chk_pend(auxbuf,rdpkt,myproc);
XXXX break;
XXXX
XXXX case ACTION_SCREEN_MODE:
XXXX
XXXX if (mypkt->dp_Arg1) {
XXXX aux_stat |= AUX_RAW;
XXXX aux_stat &= ~AUX_ECHO;
XXXX }
XXXX else {
XXXX aux_stat &= ~AUX_RAW;
XXXX aux_stat |= AUX_ECHO;
XXXX }
XXXX chk_pend();
XXXX returnpkt(mypkt, myproc, DOS_TRUE, mypkt->dp_Res2);
XXXX break;
XXXX
XXXX case ACTION_END:
XXXX
XXXX if (--aux_open == 0) {
XXXX run = 0;
XXXX close_timer();
XXXX close_ser();
XXXX }
XXXX if (mypkt->dp_Arg1 == (long)reader) reader = (struct Task *) 0;
XXXX returnpkt(mypkt, myproc, DOS_TRUE, mypkt->dp_Res2);
XXXX break;
XXXX
XXXX default:
XXXX
XXXX returnpkt(mypkt, myproc, DOS_FALSE, ERROR_ACTION_NOT_KNOWN);
XXXX break;
XXXX }
XXXX } /* end while */
XXXX mynode->dn_Task = FALSE;
XXXX}
XXXX
XXXX
XXXX/*
XXXX Allows some flexibilty to control the port.
XXXX Can dynamically change CRLF translation,
XXXX Echo or RAW mode on/off.
XXXX*/
XXXXchk_params(str)
XXXXchar *str;
XXXX{
XXXX char *ptr, *s;
XXXX int param, i=1;
XXXX
XXXX if (strncmp(str,"AUX:SET/",8)) return;
XXXX ptr = str + 8;
XXXX while(i) {
XXXX for (s = ptr; *ptr && *ptr != '/'; ++ptr);
XXXX if (*ptr == '\0') i = 0;
XXXX *ptr = '\0';
XXXX str = s+2;
XXXX if (ptr > str) {
XXXX switch (*s) {
XXXX case 'E':
XXXX param = AUX_ECHO;
XXXX break;
XXXX case 'C':
XXXX param = AUX_CRLF;
XXXX break;
XXXX case 'R':
XXXX param = AUX_RAW;
XXXX break;
XXXX default:
XXXX param = 0;
XXXX break;
XXXX }
XXXX if (*str == 'O') {
XXXX if (*(str+1) == 'N') aux_stat |= param;
XXXX else
XXXX if (*(str+1) == 'F') aux_stat &= ~param;
XXXX }
XXXX }
XXXX ++ptr;
XXXX }
XXXX}
XXXX
XXXX
XXXX/*
XXXX Start a asynchronous Read request
XXXX*/
XXXXset_read()
XXXX{
XXXX /* set up for a read */
XXXX ReadSER->IOSer.io_Length = 1L;
XXXX ReadSER->IOSer.io_Command = CMD_READ;
XXXX ReadSER->IOSer.io_Data = (APTR) &in_c;
XXXX SendIO(ReadSER);
XXXX}
XXXX
XXXX/*
XXXX Check our buf to see if we have a line to return yet. Or if raw mode
XXXX give 'em all we got.
XXXX*/
XXXXchk_pend(buf,pkt,proc)
XXXXchar *buf;
XXXXstruct DosPacket *pkt;
XXXXstruct Process *proc;
XXXX{
XXXX extern void returnpktplain();
XXXX char *p;
XXXX int i=0;
XXXX
XXXX if ((in_len && (aux_stat & AUX_RAW)) || aux_avail) {
XXXX if (aux_stat & AUX_WAIT_FOR) {
XXXX aux_stat &= ~AUX_WAIT_FOR; /* clear the wait_for */
XXXX pkt->dp_Res1 = DOS_TRUE;
XXXX AbortIO(Timer);
XXXX WaitIO(Timer);
XXXX Wait (1L << Timer_Port->mp_SigBit);
XXXX returnpktplain(pkt,proc);
XXXX }
XXXX else if (aux_stat & AUX_RPEND) {
XXXX aux_stat &= ~AUX_RPEND; /* clear the pending read */
XXXX if (aux_stat & AUX_RAW) {
XXXX aux_avail = 0; /* since we're sending all */
XXXX }
XXXX else
XXXX --aux_avail;
XXXX
XXXX /* if in_len is zero, then aux_avail must of been
XXXX set up to force us here to reply with Res1 = 0;
XXXX thus actually returning an EOF.
XXXX */
XXXX if (in_len) {
XXXX for (i = 1,p = (char *) pkt->dp_Arg2;
XXXX ((p[i-1] = buf[i-1]) != 10 || (aux_stat & AUX_RAW)) &&
XXXX i < pkt->dp_Arg3 && i < in_len; ++i) ;
XXXX
XXXX /* reader asked for less than 256 chars but no cr
XXXX was found. If not in raw mode then bump avail back
XXXX up since we still have the remaining CR terminated
XXXX line in buf[].
XXXX */
XXXX if (p[i-1] != 10 && !(aux_stat & AUX_RAW)) {
XXXX ++aux_avail;
XXXX }
XXXX }
XXXX in_len -= i;
XXXX movmem(buf+i,buf,in_len);
XXXX if (in_len < MAXLINESIZE - 1 && (aux_stat & AUX_TYPEAHEAD_FULL)) {
XXXX aux_stat &= ~AUX_TYPEAHEAD_FULL;
XXXX set_read(); /* start waiting for reads again */
XXXX }
XXXX pkt->dp_Res1 = (long)i;
XXXX returnpktplain(pkt,proc);
XXXX }
XXXX }
XXXX}
XXXX
XXXX/*
XXXX Only called here if there really is a character waiting to be read.
XXXX*/
XXXXread_ser(buf)
XXXXchar *buf;
XXXX{
XXXX char c;
XXXX
XXXX WaitIO(ReadSER);
XXXX c = in_c;
XXXX
XXXX if (c == 3) { /* ^C typed so immediately send the signal */
XXXX c = 0;
XXXX if (reader)
XXXX Signal(reader,SIGBREAKF_CTRL_C);
XXXX }
XXXX
XXXX if (!(aux_stat & AUX_RAW)) switch(c) {
XXXX case 4: /* ^D, send the signal if not in raw mode */
XXXX c = 0;
XXXX if (reader)
XXXX Signal(reader,SIGBREAKF_CTRL_D);
XXXX break;
XXXX case 28: /* ^\ so wipe out line and force EOF */
XXXX in_len = c = 0;
XXXX ++aux_avail;
XXXX break;
XXXX case 13: /* CR convert to LF if CRLF turned on */
XXXX if (aux_stat & AUX_CRLF) c = 10;
XXXX break;
XXXX case 10: /* ignore these */
XXXX if (aux_stat & AUX_CRLF) c = 0;
XXXX break;
XXXX case 8: /* BS */
XXXX case 127: /* DEL */
XXXX if (in_len && buf[in_len-1] != 10) {
XXXX --in_len;
XXXX write_ser("\010 \010",3);
XXXX }
XXXX c = 0;
XXXX break;
XXXX case 24: /* ^X */
XXXX case 21: /* ^U */
XXXX while(in_len && buf[in_len-1] != 10) {
XXXX --in_len;
XXXX write_ser("\010 \010",3);
XXXX }
XXXX c = 0;
XXXX break;
XXXX case 27: /* <ESC> */
XXXX c = 0;
XXXX default:
XXXX break;
XXXX }
XXXX if (aux_stat & AUX_ECHO) {
XXXX if ((aux_stat & AUX_CRLF) && c == 10) putc_ser(13);
XXXX putc_ser(c);
XXXX }
XXXX if (c == 10) ++aux_avail; /* always done when CR received */
XXXX
XXXX /* If our buffer is full then ignore any further input. (it
XXXX will stack up in the serial.device buffer) If our buffer
XXXX contains no CR's (unterminated) then add a newline. At
XXXX this point the CON: driver would wait for the user to type
XXXX a return while ignoring any other key strokes.
XXXX In raw mode the buffer CAN be full and unterminated. Since
XXXX when ever the reader asks for data we give him what ever
XXXX we have so far.
XXXX */
XXXX if (in_len >= MAXLINESIZE) {
XXXX aux_stat |= AUX_TYPEAHEAD_FULL;
XXXX if (!aux_avail && !(aux_stat & AUX_RAW)) {
XXXX ++aux_avail;
XXXX buf[in_len++] = 10;
XXXX }
XXXX }
XXXX else
XXXX set_read();
XXXX
XXXX if (c) buf[in_len++] = c;
XXXX}
XXXX
XXXX/*
XXXX Write 'em out one by one converting to CR LF if enabled.
XXXX*/
XXXXwrite_ser(buf,len)
XXXXchar *buf;
XXXXint len;
XXXX{
XXXX int i=0;
XXXX char c;
XXXX
XXXX for (i=0; i<len; i++) {
XXXX c = buf[i];
XXXX if (c == 10 && (aux_stat & AUX_CRLF)) putc_ser(13);
XXXX putc_ser(c);
XXXX }
XXXX}
XXXX
XXXX/*
XXXX Perform Synchronous write.
XXXX*/
XXXXputc_ser(c)
XXXXchar c;
XXXX{
XXXX if (c) {
XXXX WriteSER->IOSer.io_Length = 1L;
XXXX WriteSER->IOSer.io_Data = (APTR) &c;
XXXX DoIO(WriteSER);
XXXX }
XXXX}
XXXX
XXXXopen_stuff()
XXXX{
XXXXBYTE *c,*b;
XXXXint i;
XXXX
XXXX aux_stat = AUX_ECHO | AUX_CRLF; /* set the default */
XXXX if ((ReadSER = (struct IOExtSer *)
XXXX AllocMem((long)sizeof(*ReadSER),MEMF_PUBLIC|MEMF_CLEAR)) == NULL)
XXXX return(0);
XXXX if ((WriteSER = (struct IOExtSer *)
XXXX AllocMem((long)sizeof(*WriteSER),MEMF_PUBLIC|MEMF_CLEAR)) == NULL) {
XXXX FreeMem(ReadSER,(long)sizeof(*ReadSER));
XXXX return(0);
XXXX }
XXXX ReadSER->IOSer.io_Message.mn_ReplyPort = CreatePort(0,0);
XXXX if (OpenDevice(SERIALNAME,NULL,ReadSER,NULL)) {
XXXX DeletePort(ReadSER->IOSer.io_Message.mn_ReplyPort);
XXXX FreeMem(WriteSER,(long)sizeof(*WriteSER));
XXXX FreeMem(ReadSER,(long)sizeof(*ReadSER));
XXXX return(0);
XXXX }
XXXX
XXXX b = (BYTE *)ReadSER;
XXXX c = (BYTE *)WriteSER;
XXXX for (i=0;i<sizeof(struct IOExtSer);i++) *c++ = *b++;
XXXX
XXXX WriteSER->IOSer.io_Message.mn_ReplyPort = CreatePort(0,0);
XXXX WriteSER->IOSer.io_Command = CMD_WRITE;
XXXX
XXXX /* Open Timer.device */
XXXX if (Timer_Port = CreatePort (NULL, NULL)) {
XXXX if ((Timer = CreateExtIO (Timer_Port, (long) sizeof (*Timer)))) {
XXXX if (!(OpenDevice (TIMERNAME, UNIT_VBLANK, Timer, 0L))) {
XXXX Timer->tr_node.io_Command = TR_ADDREQUEST;
XXXX Timer->tr_node.io_Flags = 0;
XXXX Timer->tr_node.io_Error = 0;
XXXX set_read();
XXXX return(1);
XXXX }
XXXX }
XXXX }
XXXX Timer->tr_node.io_Device = 0;
XXXX close_timer();
XXXX close_ser();
XXXX return(0);
XXXX
XXXX}
XXXX
XXXXclose_ser()
XXXX{
XXXX if (!(aux_stat & AUX_TYPEAHEAD_FULL)) {
XXXX AbortIO(ReadSER);
XXXX WaitIO(ReadSER);
XXXX }
XXXX DeletePort(WriteSER->IOSer.io_Message.mn_ReplyPort);
XXXX FreeMem(WriteSER,(long)sizeof(*WriteSER));
XXXX CloseDevice(ReadSER);
XXXX DeletePort(ReadSER->IOSer.io_Message.mn_ReplyPort);
XXXX FreeMem(ReadSER,(long)sizeof(*ReadSER));
XXXX}
XXXX
XXXXclose_timer()
XXXX{
XXXX
XXXX if (Timer) {
XXXX if (Timer->tr_node.io_Device)
XXXX CloseDevice (Timer);
XXXX DeleteExtIO (Timer, (long) sizeof (*Timer));
XXXX }
XXXX if (Timer_Port) DeletePort(Timer_Port);
XXXX
XXXX}
XXXX
XXXX
XXSHAR_EOF
XXif test 13852 -ne "`wc -c myaux.c.orig`"
XXthen
XXecho shar: error transmitting myaux.c.orig '(should have been 13852 characters)'
XXfi
XXecho shar: extracting NewChanges
XXsed 's/^XX//' << \SHAR_EOF > NewChanges
XXXXArticle 4582 of comp.sys.amiga:
XXXXPath: mcdsun!noao!hao!gatech!rutgers!sri-spam!ames!ucbcad!ucbvax!decvax!decwrl!cgfsv1.dec.com!drew
XXXXFrom: drew@cgfsv1.dec.com (Steve Drew)
XXXXNewsgroups: comp.sys.amiga
XXXXSubject: Notes on AUX: handler, Emacs.
XXXXMessage-ID: <9846@decwrl.DEC.COM>
XXXXDate: 13 May 87 00:08:09 GMT
XXXXSender: daemon@decwrl.DEC.COM
XXXXOrganization: Digital Equipment Corporation
XXXXLines: 78
XXXX
XXXXHeres a couple of notes for those with manx 3.4a in regards to
XXXXmy aux-handler:
XXXX
XXXX
XXXXMaking AUX HANDLER shrink from 5736 bytes to approx 4450 bytes:
XXXX---------------------------------------------------------------
XXXX
XXXXOne thing I meant to do before posting my Aux-handler was to remove
XXXXthe Large Code/Date switches. I had compiled this way while debugging just
XXXXto play it safe. Anyway I tried it now with-out +C +D and the executable
XXXXshrinks from 5736 bytes to 4344 bytes. (Link with c32.lib instead of cl32.lib)
XXXX(This is all with manx 3.4a.)
XXXX
XXXXSmall (minor) Bug fix:
XXXX----------------------
XXXX
XXXXProblem: Handler eats up ^C in RAW mode when it should'nt.
XXXX
XXXXFix: add the line in read_ser() that's indicated below:
XXXX
XXXX if (c == 3) { /* ^C typed so immediately send the signal */
XXXX==> if (!(aux_stat & AUX_RAW))
XXXX c = 0;
XXXX if (reader)
XXXX Signal(reader,SIGBREAKF_CTRL_C);
XXXX }
XXXX
XXXX
XXXXPATCH TO MAKE MicroEmacs 3.x run through AUX:
XXXX---------------------------------------------
XXXX
XXXX(This was even easier than I thought it would be!)
XXXX
XXXXJust add the indicated lines below (=>) to the 'termio.c' module and
XXXXrecompile.
XXXXWhat it does: When invoked emacs will now only open a RAW window if 'Run',
XXXXif you just invoke emacs eg: '1> emacs file' from it will change the console
XXXXto RAW mode and use that. Since my aux-handler supports RAW mode it works
XXXXthe same way to a ansi (vt100) style terminal.
XXXX
XXXXttopen()
XXXX{
XXXX#if AMIGA
XXXX
XXXX=> extern int Enable_Abort;
XXXX=>
XXXX=> Enable_Abort = 0;
XXXX=> if (IsInteractive(Input()) && IsInteractive(Output())) {
XXXX=> terminal = (long)Output();
XXXX=> set_raw();
XXXX=> }
XXXX=> else
XXXX
XXXX terminal = Open("RAW:0/0/640/200/MicroEMACS 3.8b", NEW);
XXXX#endif
XXXX
XXXX
XXXXttclose()
XXXX{
XXXX#if AMIGA
XXXX amg_flush();
XXXX
XXXX=> if (Output() != terminal)
XXXX Close(terminal);
XXXX=> else
XXXX=> set_con();
XXXX
XXXX#endif
XXXX
XXXXOk, so now we can dail up, use shell, emacs a file, compile it, hummm...
XXXXall we need now it a mini kermit server. (And a hard drive, sniff)
XXXX
XXXX/Steve.
XXXX============================================================================
XXXX Steve Drew at ENET: CGFSV1::DREW
XXXX ARPA: drew%cfgsv1.dec.com@decwrl.dec.com
XXXX USENET: {decvax!decwrl}!cgfsv1.dec.com!drew
XXXX============================================================================
XXXX
XXXX
XXSHAR_EOF
XXif test 2665 -ne "`wc -c NewChanges`"
XXthen
XXecho shar: error transmitting NewChanges '(should have been 2665 characters)'
XXfi
XXecho shar: extracting README.fnf
XXsed 's/^XX//' << \SHAR_EOF > README.fnf
XXXXI've applied the changes given in the "NewChanges" file before compiling
XXXXwith Manx 3.40A (patch level 3). The original files have ".orig" appended
XXXXto their names. The new aux-handler, with the specified changes, has
XXXXnot been tested.
XXXX
XXXX-Fred
XXXX 30-May-87
XXSHAR_EOF
XXif test 253 -ne "`wc -c README.fnf`"
XXthen
XXecho shar: error transmitting README.fnf '(should have been 253 characters)'
XXfi
XXecho shar: extracting POSTER
XXsed 's/^XX//' << \SHAR_EOF > POSTER
XXXXArticle 4471 of comp.sys.amiga:
XXXXPath: mcdsun!noao!hao!ames!ucbcad!ucbvax!decvax!decwrl!cgou01.dec.com!drew
XXXXFrom: drew@cgou01.dec.com (Steve Drew)
XXXXNewsgroups: comp.sys.amiga
XXXXSubject: Aux: Handler (Part 1 of 2 doc/executable)
XXXXMessage-ID: <9775@decwrl.DEC.COM>
XXXXDate: 8 May 87 17:14:09 GMT
XXXXSender: daemon@decwrl.DEC.COM
XXXXOrganization: Digital Equipment Corporation
XXXXLines: 260
XXXX
XXXX
XXXX
XXXXHere's my first attempt at a dos handler. Please read the docs!!
XXXXI wrote in support for ACTION_SCREEN_MODE originally thinking that
XXXXmy commandline editing under shell would work ok through AUX: to
XXXXa vt100 style terminal. But alas some of the escape sequences I used
XXXXunder shell (for inserting / deleting char's) were Amiga specific
XXXXand not ansi sequences. So as a quick alternative I added a switch
XXXXto shell to turn of CLE for use over AUX:.
XXXX
XXXXBut with the capability of RAW mode you could write/modify a ansi
XXXXstyle screen editor that would also work through aux-handler to a
XXXXansi style terminal. Any volunteers?
XXXX
XXXXFollowing the dos's and executable are the sources.
XXXX
XXXX< I code because I enjoy getting frustrated!! >
XXXX
XXXXPlease email me any bugs found to:
XXXX
XXXX%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
XXXX Steve Drew at ENET: CGFSV1::DREW
XXXX ARPA: drew%cfgsv1.dec.com@decwrl.dec.com
XXXX USENET: {decvax!decwrl}!cgfsv1.dec.com!drew
XXXX%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
XXXX
XXSHAR_EOF
XXif test 1428 -ne "`wc -c POSTER`"
XXthen
XXecho shar: error transmitting POSTER '(should have been 1428 characters)'
XXfi
XXecho shar: extracting myaux.c
XXsed 's/^XX//' << \SHAR_EOF > myaux.c
XXXX/****************************************************************************
XXXX *
XXXX * Aux Driver V1.0 (c)CopyRight 1987, Steve Drew. All Rights Reserved.
XXXX *
XXXX * Aux-Handler Ver. 1.0 1-May-1987
XXXX *
XXXX * Steve Drew
XXXX * 52-Castledale Cres. N.E.
XXXX * Calgary, Ab. Canada.
XXXX *
XXXX * |You may freely distribute this source as long as |
XXXX * |the Copyright notice is left intact. |
XXXX ***************************************************************************/
XXXX
XXXX
XXXX#include <devices/serial.h>
XXXX#include <devices/timer.h>
XXXX
XXXX
XXXXtypedef unsigned char u_char;
XXXX
XXXX#undef BADDR
XXXX#define BADDR(x) ((APTR)((long)x << 2))
XXXX
XXXX#define ACTION_FINDINPUT 1005L
XXXX#define ACTION_FINDOUTPUT 1006L
XXXX#define ACTION_END 1007L
XXXX#define ACTION_SCREEN_MODE 994L
XXXX
XXXX#define DOS_FALSE 0L
XXXX#define DOS_TRUE -1L
XXXX
XXXX#define AUX_ECHO 1
XXXX#define AUX_CRLF 2
XXXX#define AUX_RAW 4
XXXX#define AUX_RPEND 8
XXXX#define AUX_WAIT_FOR 16
XXXX#define AUX_TYPEAHEAD_FULL 32
XXXX#define AUXBUFSIZE 256 /* Same as CON: handler */
XXXX#define MAXLINESIZE 254 /* save two for \n'\0' */
XXXX
XXXX
XXXX#define MYPORT_SIG (1L << myport->mp_SigBit)
XXXX#define READSER_SIG (1L << ReadSER->IOSer.io_Message.mn_ReplyPort->mp_SigBit)
XXXX#define TIMER_SIG (1L << Timer_Port->mp_SigBit)
XXXX
XXXX/* extern long AbsExecBase; */
XXXX
XXXX/* My Globals */
XXXX
XXXX
XXXXstruct IOExtSer *ReadSER;
XXXXstruct IOExtSer *WriteSER;
XXXXstruct timerequest *Timer;
XXXXstruct MsgPort *Timer_Port;
XXXXstruct Task *reader;
XXXXlong SysBase;
XXXXint aux_stat,
XXXX aux_avail,
XXXX in_len;
XXXXu_char in_c;
XXXX
XXXX_main()
XXXX{
XXXX
XXXX extern void returnpkt(); /* sends back the packet */
XXXX extern void returnpktplain(); /* use args in Res1 */
XXXX extern struct DosPacket *taskwait();
XXXX
XXXX char *version = "Ver 1.0 (c) Steve Drew 1987";
XXXX struct Process *myproc; /* my process */
XXXX struct DosPacket *mypkt; /* a pointer to the dos packet */
XXXX struct DosPacket *rdpkt;
XXXX struct DeviceNode *mynode; /* our device node (parmpkt Arg3) */
XXXX struct FileHandle *fh; /* a pointer to our file handle */
XXXX struct MsgPort *myport;
XXXX long run = TRUE; /* handler main loop flag */
XXXX u_char *ptr; /* ptr for name translation */
XXXX char *name,*s; /* ptr to name for open */
XXXX int aux_open = 0; /* aux open count */
XXXX char auxbuf[AUXBUFSIZE];/* Our type ahead buffer */
XXXX long signals; /* signals that occurred in Wait */
XXXX
XXXX
XXXX /* Initializing the handler */
XXXX
XXXX myproc = (struct Process *)FindTask(0L);
XXXX mypkt = taskwait(myproc); /* Wait for my startup message */
XXXX
XXXX /* I don't need the name or extra info passed in Arg1/2 */
XXXX
XXXX mynode = (struct DeviceNode *)BADDR(mypkt->dp_Arg3);
XXXX mynode->dn_Task = &myproc->pr_MsgPort;
XXXX myport = &myproc->pr_MsgPort;
XXXX returnpkt(mypkt, myproc, DOS_TRUE, mypkt->dp_Res2);
XXXX
XXXX in_len = aux_avail = aux_stat = 0;
XXXX reader = (struct Task *) 0;
XXXX
XXXX
XXXX /* done initial stuff, now for some work */
XXXX
XXXX while(run) {
XXXX
XXXX if (aux_open) { /* then wait for read char or new action */
XXXX
XXXX signals = Wait( MYPORT_SIG | READSER_SIG | TIMER_SIG );
XXXX
XXXX if (signals & TIMER_SIG) {
XXXX WaitIO(Timer);
XXXX aux_stat &= ~AUX_WAIT_FOR;
XXXX rdpkt->dp_Res1 = DOS_FALSE;
XXXX returnpktplain(rdpkt,myproc);
XXXX }
XXXX if ((signals & READSER_SIG) && CheckIO(ReadSER)) {
XXXX read_ser(auxbuf);
XXXX chk_pend(auxbuf,rdpkt,myproc);
XXXX }
XXXX if (signals & MYPORT_SIG) {
XXXX mypkt = taskwait(myproc);
XXXX }
XXXX else /* no new dospackets */
XXXX continue;
XXXX }
XXXX else /* only port at the moment is myport */
XXXX mypkt = taskwait(myproc);
XXXX
XXXX switch(mypkt->dp_Type) { /* find what action to perform */
XXXX
XXXX case ACTION_FINDINPUT:
XXXX
XXXX if (reader) { /* Have I already got a someone reading */
XXXX returnpkt(mypkt, myproc, DOS_FALSE, ERROR_OBJECT_IN_USE);
XXXX break;
XXXX }
XXXX
XXXX case ACTION_FINDOUTPUT:
XXXX
XXXX /*
XXXX I allow for multiple writers. But doesn't make sense
XXXX to allow for mutilple readers.
XXXX */
XXXX if (!aux_open) { /* first time here we open the devices */
XXXX if ((aux_open = open_stuff()) == 0) {
XXXX returnpkt(mypkt, myproc, DOS_FALSE, ERROR_OBJECT_IN_USE);
XXXX break;
XXXX }
XXXX }
XXXX else
XXXX aux_open++;
XXXX
XXXX /* get file name and Upper case it */
XXXX ptr = (u_char *)BADDR(mypkt->dp_Arg3);
XXXX name = AllocMem((long)*ptr + 1, MEMF_PUBLIC);
XXXX movmem(ptr+1, name, *ptr);
XXXX name[*ptr] = '\0';
XXXX for (s = name; *s; ++s) *s = toupper(*s);
XXXX
XXXX
XXXX /*
XXXX This is a Hack to allow a bail out of a NEWCLI
XXXX that is using the AUX. By doing say an echo >AUX:ENDCLI
XXXX from another process the reader (being the NEWCLI)
XXXX will be sent a ENDCLI command.
XXXX */
XXXX
XXXX if (!strcmp(name,"AUX:ENDCLI") && (aux_stat & AUX_RPEND)) {
XXXX strcpy(rdpkt->dp_Arg2,"ENDCLI\n");
XXXX rdpkt->dp_Res1 = 7L;
XXXX returnpktplain(rdpkt, myproc);
XXXX aux_stat &= ~AUX_RPEND;
XXXX }
XXXX else
XXXX chk_params(name);
XXXX
XXXX FreeMem(name, (long)*ptr +1);
XXXX fh = (struct FileHandle *)BADDR(mypkt->dp_Arg1);
XXXX fh->fh_Arg1 = DOS_TRUE;
XXXX fh->fh_Port = (struct MsgPort *)DOS_TRUE;
XXXX
XXXX if (!reader && (mypkt->dp_Type == ACTION_FINDINPUT)) {
XXXX struct MsgPort *port;
XXXX
XXXX port = mypkt->dp_Port;
XXXX reader = port->mp_SigTask;
XXXX fh->fh_Arg1 = (long)port->mp_SigTask;
XXXX }
XXXX
XXXX returnpkt(mypkt, myproc, DOS_TRUE, mypkt->dp_Res2);
XXXX break;
XXXX
XXXX case ACTION_READ:
XXXX
XXXX rdpkt = mypkt;
XXXX aux_stat |= AUX_RPEND;
XXXX chk_pend(auxbuf,rdpkt,myproc);
XXXX
XXXX break;
XXXX
XXXX case ACTION_WRITE:
XXXX
XXXX write_ser(mypkt->dp_Arg2,(int)mypkt->dp_Arg3);
XXXX mypkt->dp_Res1 = mypkt->dp_Arg3; /* tell em we wrote them all */
XXXX
XXXX returnpktplain(mypkt, myproc);
XXXX break;
XXXX
XXXX case ACTION_WAIT_CHAR:
XXXX
XXXX /* just queue up to wait for data */
XXXX
XXXX rdpkt = mypkt;
XXXX aux_stat |= AUX_WAIT_FOR;
XXXX Timer->tr_time.tv_secs = 0L;
XXXX Timer->tr_time.tv_micro = rdpkt->dp_Arg1;
XXXX SendIO(Timer);
XXXX chk_pend(auxbuf,rdpkt,myproc);
XXXX break;
XXXX
XXXX case ACTION_SCREEN_MODE:
XXXX
XXXX if (mypkt->dp_Arg1) {
XXXX aux_stat |= AUX_RAW;
XXXX aux_stat &= ~AUX_ECHO;
XXXX }
XXXX else {
XXXX aux_stat &= ~AUX_RAW;
XXXX aux_stat |= AUX_ECHO;
XXXX }
XXXX chk_pend();
XXXX returnpkt(mypkt, myproc, DOS_TRUE, mypkt->dp_Res2);
XXXX break;
XXXX
XXXX case ACTION_END:
XXXX
XXXX if (--aux_open == 0) {
XXXX run = 0;
XXXX close_timer();
XXXX close_ser();
XXXX }
XXXX if (mypkt->dp_Arg1 == (long)reader) reader = (struct Task *) 0;
XXXX returnpkt(mypkt, myproc, DOS_TRUE, mypkt->dp_Res2);
XXXX break;
XXXX
XXXX default:
XXXX
XXXX returnpkt(mypkt, myproc, DOS_FALSE, ERROR_ACTION_NOT_KNOWN);
XXXX break;
XXXX }
XXXX } /* end while */
XXXX mynode->dn_Task = FALSE;
XXXX}
XXXX
XXXX
XXXX/*
XXXX Allows some flexibilty to control the port.
XXXX Can dynamically change CRLF translation,
XXXX Echo or RAW mode on/off.
XXXX*/
XXXXchk_params(str)
XXXXchar *str;
XXXX{
XXXX char *ptr, *s;
XXXX int param, i=1;
XXXX
XXXX if (strncmp(str,"AUX:SET/",8)) return;
XXXX ptr = str + 8;
XXXX while(i) {
XXXX for (s = ptr; *ptr && *ptr != '/'; ++ptr);
XXXX if (*ptr == '\0') i = 0;
XXXX *ptr = '\0';
XXXX str = s+2;
XXXX if (ptr > str) {
XXXX switch (*s) {
XXXX case 'E':
XXXX param = AUX_ECHO;
XXXX break;
XXXX case 'C':
XXXX param = AUX_CRLF;
XXXX break;
XXXX case 'R':
XXXX param = AUX_RAW;
XXXX break;
XXXX default:
XXXX param = 0;
XXXX break;
XXXX }
XXXX if (*str == 'O') {
XXXX if (*(str+1) == 'N') aux_stat |= param;
XXXX else
XXXX if (*(str+1) == 'F') aux_stat &= ~param;
XXXX }
XXXX }
XXXX ++ptr;
XXXX }
XXXX}
XXXX
XXXX
XXXX/*
XXXX Start a asynchronous Read request
XXXX*/
XXXXset_read()
XXXX{
XXXX /* set up for a read */
XXXX ReadSER->IOSer.io_Length = 1L;
XXXX ReadSER->IOSer.io_Command = CMD_READ;
XXXX ReadSER->IOSer.io_Data = (APTR) &in_c;
XXXX SendIO(ReadSER);
XXXX}
XXXX
XXXX/*
XXXX Check our buf to see if we have a line to return yet. Or if raw mode
XXXX give 'em all we got.
XXXX*/
XXXXchk_pend(buf,pkt,proc)
XXXXchar *buf;
XXXXstruct DosPacket *pkt;
XXXXstruct Process *proc;
XXXX{
XXXX extern void returnpktplain();
XXXX char *p;
XXXX int i=0;
XXXX
XXXX if ((in_len && (aux_stat & AUX_RAW)) || aux_avail) {
XXXX if (aux_stat & AUX_WAIT_FOR) {
XXXX aux_stat &= ~AUX_WAIT_FOR; /* clear the wait_for */
XXXX pkt->dp_Res1 = DOS_TRUE;
XXXX AbortIO(Timer);
XXXX WaitIO(Timer);
XXXX Wait (1L << Timer_Port->mp_SigBit);
XXXX returnpktplain(pkt,proc);
XXXX }
XXXX else if (aux_stat & AUX_RPEND) {
XXXX aux_stat &= ~AUX_RPEND; /* clear the pending read */
XXXX if (aux_stat & AUX_RAW) {
XXXX aux_avail = 0; /* since we're sending all */
XXXX }
XXXX else
XXXX --aux_avail;
XXXX
XXXX /* if in_len is zero, then aux_avail must of been
XXXX set up to force us here to reply with Res1 = 0;
XXXX thus actually returning an EOF.
XXXX */
XXXX if (in_len) {
XXXX for (i = 1,p = (char *) pkt->dp_Arg2;
XXXX ((p[i-1] = buf[i-1]) != 10 || (aux_stat & AUX_RAW)) &&
XXXX i < pkt->dp_Arg3 && i < in_len; ++i) ;
XXXX
XXXX /* reader asked for less than 256 chars but no cr
XXXX was found. If not in raw mode then bump avail back
XXXX up since we still have the remaining CR terminated
XXXX line in buf[].
XXXX */
XXXX if (p[i-1] != 10 && !(aux_stat & AUX_RAW)) {
XXXX ++aux_avail;
XXXX }
XXXX }
XXXX in_len -= i;
XXXX movmem(buf+i,buf,in_len);
XXXX if (in_len < MAXLINESIZE - 1 && (aux_stat & AUX_TYPEAHEAD_FULL)) {
XXXX aux_stat &= ~AUX_TYPEAHEAD_FULL;
XXXX set_read(); /* start waiting for reads again */
XXXX }
XXXX pkt->dp_Res1 = (long)i;
XXXX returnpktplain(pkt,proc);
XXXX }
XXXX }
XXXX}
XXXX
XXXX/*
XXXX Only called here if there really is a character waiting to be read.
XXXX*/
XXXXread_ser(buf)
XXXXchar *buf;
XXXX{
XXXX char c;
XXXX
XXXX WaitIO(ReadSER);
XXXX c = in_c;
XXXX
XXXX if (c == 3) { /* ^C typed so immediately send the signal */
XXXX if (!(aux_stat & AUX_RAW))
XXXX c = 0;
XXXX if (reader)
XXXX Signal(reader,SIGBREAKF_CTRL_C);
XXXX }
XXXX
XXXX if (!(aux_stat & AUX_RAW)) switch(c) {
XXXX case 4: /* ^D, send the signal if not in raw mode */
XXXX c = 0;
XXXX if (reader)
XXXX Signal(reader,SIGBREAKF_CTRL_D);
XXXX break;
XXXX case 28: /* ^\ so wipe out line and force EOF */
XXXX in_len = c = 0;
XXXX ++aux_avail;
XXXX break;
XXXX case 13: /* CR convert to LF if CRLF turned on */
XXXX if (aux_stat & AUX_CRLF) c = 10;
XXXX break;
XXXX case 10: /* ignore these */
XXXX if (aux_stat & AUX_CRLF) c = 0;
XXXX break;
XXXX case 8: /* BS */
XXXX case 127: /* DEL */
XXXX if (in_len && buf[in_len-1] != 10) {
XXXX --in_len;
XXXX write_ser("\010 \010",3);
XXXX }
XXXX c = 0;
XXXX break;
XXXX case 24: /* ^X */
XXXX case 21: /* ^U */
XXXX while(in_len && buf[in_len-1] != 10) {
XXXX --in_len;
XXXX write_ser("\010 \010",3);
XXXX }
XXXX c = 0;
XXXX break;
XXXX case 27: /* <ESC> */
XXXX c = 0;
XXXX default:
XXXX break;
XXXX }
XXXX if (aux_stat & AUX_ECHO) {
XXXX if ((aux_stat & AUX_CRLF) && c == 10) putc_ser(13);
XXXX putc_ser(c);
XXXX }
XXXX if (c == 10) ++aux_avail; /* always done when CR received */
XXXX
XXXX /* If our buffer is full then ignore any further input. (it
XXXX will stack up in the serial.device buffer) If our buffer
XXXX contains no CR's (unterminated) then add a newline. At
XXXX this point the CON: driver would wait for the user to type
XXXX a return while ignoring any other key strokes.
XXXX In raw mode the buffer CAN be full and unterminated. Since
XXXX when ever the reader asks for data we give him what ever
XXXX we have so far.
XXXX */
XXXX if (in_len >= MAXLINESIZE) {
XXXX aux_stat |= AUX_TYPEAHEAD_FULL;
XXXX if (!aux_avail && !(aux_stat & AUX_RAW)) {
XXXX ++aux_avail;
XXXX buf[in_len++] = 10;
XXXX }
XXXX }
XXXX else
XXXX set_read();
XXXX
XXXX if (c) buf[in_len++] = c;
XXXX}
XXXX
XXXX/*
XXXX Write 'em out one by one converting to CR LF if enabled.
XXXX*/
XXXXwrite_ser(buf,len)
XXXXchar *buf;
XXXXint len;
XXXX{
XXXX int i=0;
XXXX char c;
XXXX
XXXX for (i=0; i<len; i++) {
XXXX c = buf[i];
XXXX if (c == 10 && (aux_stat & AUX_CRLF)) putc_ser(13);
XXXX putc_ser(c);
XXXX }
XXXX}
XXXX
XXXX/*
XXXX Perform Synchronous write.
XXXX*/
XXXXputc_ser(c)
XXXXchar c;
XXXX{
XXXX if (c) {
XXXX WriteSER->IOSer.io_Length = 1L;
XXXX WriteSER->IOSer.io_Data = (APTR) &c;
XXXX DoIO(WriteSER);
XXXX }
XXXX}
XXXX
XXXXopen_stuff()
XXXX{
XXXXBYTE *c,*b;
XXXXint i;
XXXX
XXXX aux_stat = AUX_ECHO | AUX_CRLF; /* set the default */
XXXX if ((ReadSER = (struct IOExtSer *)
XXXX AllocMem((long)sizeof(*ReadSER),MEMF_PUBLIC|MEMF_CLEAR)) == NULL)
XXXX return(0);
XXXX if ((WriteSER = (struct IOExtSer *)
XXXX AllocMem((long)sizeof(*WriteSER),MEMF_PUBLIC|MEMF_CLEAR)) == NULL) {
XXXX FreeMem(ReadSER,(long)sizeof(*ReadSER));
XXXX return(0);
XXXX }
XXXX ReadSER->IOSer.io_Message.mn_ReplyPort = CreatePort(0,0);
XXXX if (OpenDevice(SERIALNAME,NULL,ReadSER,NULL)) {
XXXX DeletePort(ReadSER->IOSer.io_Message.mn_ReplyPort);
XXXX FreeMem(WriteSER,(long)sizeof(*WriteSER));
XXXX FreeMem(ReadSER,(long)sizeof(*ReadSER));
XXXX return(0);
XXXX }
XXXX
XXXX b = (BYTE *)ReadSER;
XXXX c = (BYTE *)WriteSER;
XXXX for (i=0;i<sizeof(struct IOExtSer);i++) *c++ = *b++;
XXXX
XXXX WriteSER->IOSer.io_Message.mn_ReplyPort = CreatePort(0,0);
XXXX WriteSER->IOSer.io_Command = CMD_WRITE;
XXXX
XXXX /* Open Timer.device */
XXXX if (Timer_Port = CreatePort (NULL, NULL)) {
XXXX if ((Timer = CreateExtIO (Timer_Port, (long) sizeof (*Timer)))) {
XXXX if (!(OpenDevice (TIMERNAME, UNIT_VBLANK, Timer, 0L))) {
XXXX Timer->tr_node.io_Command = TR_ADDREQUEST;
XXXX Timer->tr_node.io_Flags = 0;
XXXX Timer->tr_node.io_Error = 0;
XXXX set_read();
XXXX return(1);
XXXX }
XXXX }
XXXX }
XXXX Timer->tr_node.io_Device = 0;
XXXX close_timer();
XXXX close_ser();
XXXX return(0);
XXXX
XXXX}
XXXX
XXXXclose_ser()
XXXX{
XXXX if (!(aux_stat & AUX_TYPEAHEAD_FULL)) {
XXXX AbortIO(ReadSER);
XXXX WaitIO(ReadSER);
XXXX }
XXXX DeletePort(WriteSER->IOSer.io_Message.mn_ReplyPort);
XXXX FreeMem(WriteSER,(long)sizeof(*WriteSER));
XXXX CloseDevice(ReadSER);
XXXX DeletePort(ReadSER->IOSer.io_Message.mn_ReplyPort);
XXXX FreeMem(ReadSER,(long)sizeof(*ReadSER));
XXXX}
XXXX
XXXXclose_timer()
XXXX{
XXXX
XXXX if (Timer) {
XXXX if (Timer->tr_node.io_Device)
XXXX CloseDevice (Timer);
XXXX DeleteExtIO (Timer, (long) sizeof (*Timer));
XXXX }
XXXX if (Timer_Port) DeletePort(Timer_Port);
XXXX
XXXX}
XXXX
XXXX
XXSHAR_EOF
XXif test 13887 -ne "`wc -c myaux.c`"
XXthen
XXecho shar: error transmitting myaux.c '(should have been 13887 characters)'
XXfi
XXecho shar: extracting misc.c
XXsed 's/^XX//' << \SHAR_EOF > misc.c
XXXX/*
XXXX * misc.c - support routines - Phillip Lindsay (C) Commodore 1986
XXXX * You may freely distribute this source and use it for Amiga Development -
XXXX * as long as the Copyright notice is left intact.
XXXX *
XXXX * 30-SEP-86
XXXX *
XXXX */
XXXX#include <functions.h>
XXXX#include <stdio.h>
XXXX#include <exec/types.h>
XXXX#include <exec/nodes.h>
XXXX#include <exec/lists.h>
XXXX#include <exec/ports.h>
XXXX#include <exec/libraries.h>
XXXX#include <exec/devices.h>
XXXX#include <exec/io.h>
XXXX#include <exec/memory.h>
XXXX#include <devices/console.h>
XXXX#include <libraries/dos.h>
XXXX#include <libraries/dosextens.h>
XXXX#include <libraries/filehandler.h>
XXXX
XXXXextern void returnpkt();
XXXX
XXXX/* returnpkt() - packet support routine
XXXX * here is the guy who sends the packet back to the sender...
XXXX *
XXXX * (I modeled this just like the BCPL routine [so its a little redundant] )
XXXX */
XXXX
XXXXvoid
XXXXreturnpktplain(packet, myproc)
XXXXstruct DosPacket *packet;
XXXXstruct Process *myproc;
XXXX{
XXXX returnpkt(packet, myproc, packet->dp_Res1, packet->dp_Res2);
XXXX}
XXXX
XXXXvoid
XXXXreturnpkt(packet, myproc, res1, res2)
XXXXstruct DosPacket *packet;
XXXXstruct Process *myproc;
XXXXULONG res1, res2;
XXXX{
XXXX struct Message *mess;
XXXX struct MsgPort *replyport;
XXXX
XXXX packet->dp_Res1 = res1;
XXXX packet->dp_Res2 = res2;
XXXX replyport = packet->dp_Port;
XXXX mess = packet->dp_Link;
XXXX packet->dp_Port = &myproc->pr_MsgPort;
XXXX mess->mn_Node.ln_Name = (char *) packet;
XXXX mess->mn_Node.ln_Succ = NULL;
XXXX mess->mn_Node.ln_Pred = NULL;
XXXX PutMsg(replyport, mess);
XXXX}
XXXX
XXXX
XXXX/*
XXXX * taskwait() ... Waits for a message to arrive at your port and
XXXX * extracts the packet address which is returned to you.
XXXX */
XXXX
XXXXstruct DosPacket *
XXXXtaskwait(myproc)
XXXXstruct Process *myproc;
XXXX{
XXXX struct MsgPort *myport;
XXXX struct Message *mymess;
XXXX
XXXX myport = &myproc->pr_MsgPort;
XXXX WaitPort(myport);
XXXX mymess = GetMsg(myport);
XXXX return((struct DosPacket *)mymess->mn_Node.ln_Name);
XXXX}
XXXX
XXXX/* end of misc.c */
XXXX
XXXX
XXSHAR_EOF
XXif test 1924 -ne "`wc -c misc.c`"
XXthen
XXecho shar: error transmitting misc.c '(should have been 1924 characters)'
XXfi
XXecho shar: extracting makefile
XXsed 's/^XX//' << \SHAR_EOF > makefile
XXXX#########################################################################
XXXX#
XXXX# Aux-Handler Makefile
XXXX# V 1.0 (c) Steve Drew 1987
XXXX# For Manx 3.40a
XXXX#
XXXX#########################################################################
XXXX
XXXX
XXXXaux-handler : misc.o myaux.o
XXXX ln -o aux-handler misc.o myaux.o -lc32
XXXX
XXXXmisc.o : misc.c
XXXX cc +L +Hmyaux.syms misc.c
XXXX
XXXXmyaux.o : myaux.c
XXXX cc +L +Imyaux.syms myaux.c
XXXX
XXSHAR_EOF
XXif test 388 -ne "`wc -c makefile`"
XXthen
XXecho shar: error transmitting makefile '(should have been 388 characters)'
XXfi
XX# End of shell archive
XXexit 0
SHAR_EOF
if test 42214 -ne "`wc -c aux.sh`"
then
echo shar: error transmitting aux.sh '(should have been 42214 characters)'
fi
# End of shell archive
exit 0
--
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Bill Koester -- CBM >>Amiga Technical Support<<
UUCP ...{allegra|burdvax|rutgers|ihnp4}!cbmvax!bill
PHONE (215) 431-9355
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Pleese desrigard eny spealing airors!!!!!!!!!!!
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=