amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (04/05/91)
Submitted-by: DrBob@cup.portal.com Posting-number: Volume 91, Issue 080 Archive-name: devices/btntape-2.0/part01 [ includes uuencoded executables ...tad ] BTNTape is a "Better Than Nothing" device handler for SCSI tape drives. It allows DOS application programs to access the tape medium as a sequential AmigaDOS file using simple calls to Read() and Write(). The handler can also be used with the Amiga TAR program for backing up and restoring hard drives. This is an update to version 1.0. It now works with most standard SCSI tape drives, and includes new features and bug fixes. #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 2)." # Contents: MakeFile changes.doc lmkfile mountlist pktstuff.c # tape-handle.uu tape.h tapeio.c tapemon.c tapemon.doc tapemon.lmk # tapemon.uu tplink.h # Wrapped by tadguy@ab20 on Fri Apr 5 10:06:39 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'MakeFile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'MakeFile'\" else echo shar: Extracting \"'MakeFile'\" \(212 characters\) sed "s/^X//" >'MakeFile' <<'END_OF_FILE' X# Manx/Aztec C makefile BTN-TAPE v2.0 XOBJECT = tape.o tapeio.o pktstuff.o X Xtape-handler: $(OBJECT) X ln +Q -o tape-handler -w +a -g +s $(OBJECT) -lc X X$(OBJECT): tape.h X cc -m0b -so -sb -we -bs $*.c X X X X END_OF_FILE if test 212 -ne `wc -c <'MakeFile'`; then echo shar: \"'MakeFile'\" unpacked with wrong size! fi # end of 'MakeFile' fi if test -f 'changes.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'changes.doc'\" else echo shar: Extracting \"'changes.doc'\" \(1194 characters\) sed "s/^X//" >'changes.doc' <<'END_OF_FILE' XA brief history of BTNtape: X Xv2.0 Mar. 29, 1991 X Added support for sequential tape drives (the most common type). X Revised/improved the format of the mountlist Startup string. X Added Startup parameter FM (number of filemarks). X Added Startup parameter DF (device flags). X Added Startup parameter OV (overlapped I/O control). X Added Startup parameter VB (variable block mode). X No longer works with ARP version of MOUNT (this is ARP's fault). X Removed dollar signs from RAWCMD reference (because shells hate them). X Removed requirement for upper case letters in RAWCMD reference. X Added user-specified mode select feature using TAPE:MODESEL. X Fixed brain-damaged asynchronous I/O code. X Fixed wrong command length for READ_CAPACITY, caused HardFrame guru. X Tapemon prints sense keys and SCSI errors in english. X Tapemon arg1 now tolerates upper or lower case and ending colon. X When Tapemon arg2 != blank, complete sense data is printed. X Code cleaned up a little (but probably not enough). X Xv1.0 Sept. 10, 1990 Initial release. X Unfortunately, this version worked only with the 3M drive. X END_OF_FILE if test 1194 -ne `wc -c <'changes.doc'`; then echo shar: \"'changes.doc'\" unpacked with wrong size! fi # end of 'changes.doc' fi if test -f 'lmkfile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'lmkfile'\" else echo shar: Extracting \"'lmkfile'\" \(447 characters\) sed "s/^X//" >'lmkfile' <<'END_OF_FILE' X# SAS/LATTICE MAKEFILE FOR BTN-TAPE v2.0 X X# (-j132i is necessary with 5.10 and 1.3 includes. Why?) XCFLAGS= -v -y -b1 -mat -cakfsu -j132i X XLIBS=LIB:lc.lib+LIB:amiga.lib X Xtape-handler: tape.o tapeio.o pktstuff.o X blink FROM tape.o+tapeio.o+pktstuff.o TO $@ SC SD LIB $(LIBS) X Xtape.o : tape.c tape.h tplink.h X LC $(CFLAGS) tape.c X Xtapeio.o : tapeio.c tape.h X LC $(CFLAGS) tapeio.c X Xpktstuff.o : pktstuff.c tape.h X LC $(CFLAGS) pktstuff.c X END_OF_FILE if test 447 -ne `wc -c <'lmkfile'`; then echo shar: \"'lmkfile'\" unpacked with wrong size! fi # end of 'lmkfile' fi if test -f 'mountlist' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'mountlist'\" else echo shar: Extracting \"'mountlist'\" \(290 characters\) sed "s/^X//" >'mountlist' <<'END_OF_FILE' X/* Example mountlist. Modify it for your specific system setup. */ XTAPE: Handler = L:tape-handler X Startup = "yourscsi.device/UN-0/BS-512/NB-64/BT-4" X Stacksize = 4000 X Priority = 5 /* use 11 for Supra 4x4 */ X GlobVec = -1 X Mount = 1 X# END_OF_FILE if test 290 -ne `wc -c <'mountlist'`; then echo shar: \"'mountlist'\" unpacked with wrong size! fi # end of 'mountlist' fi if test -f 'pktstuff.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'pktstuff.c'\" else echo shar: Extracting \"'pktstuff.c'\" \(1768 characters\) sed "s/^X//" >'pktstuff.c' <<'END_OF_FILE' X/* misc.c - support routines - Phillip Lindsay (C) Commodore 1986 X * You may freely distribute this source and use it for Amiga Development - X * as long as the Copyright notice is left intact. X * X * 30-SEP-86 X */ X X#include <exec/types.h> X#include <exec/nodes.h> X#include <exec/lists.h> X#include <exec/ports.h> X#include <libraries/dos.h> X#include <libraries/dosextens.h> X#include "tape.h" X X#if defined AZTEC_C X #include <functions.h> X#elif defined LATTICE X #include <proto/exec.h> X#endif X X X/* returnpkt() - packet support routine X * here is the guy who sends the packet back to the sender... X * (I modeled this just like the BCPL routine [so its a little redundant] ) X */ X Xvoid returnpkt( X struct DosPacket *packet, X ULONG res1, X ULONG res2) X{ X struct Message *mess; X struct MsgPort *replyport; X struct Process *myproc; X X packet->dp_Res1 = res1; X packet->dp_Res2 = res2; X replyport = packet->dp_Port; X mess = packet->dp_Link; X myproc = (struct Process *) FindTask(0L); X packet->dp_Port = &myproc->pr_MsgPort; X mess->mn_Node.ln_Name = (char *) packet; X mess->mn_Node.ln_Succ = NULL; X mess->mn_Node.ln_Pred = NULL; X X PutMsg(replyport,mess); X} X X X/* X * taskwait() ... Waits for a message to arrive at your port and X * extracts the packet address which is returned to you. X */ X Xstruct DosPacket *taskwait(void) X{ X struct Process *myproc; X struct MsgPort *myport; X struct Message *mymess; X X myproc = (struct Process *) FindTask(0L); X myport = &myproc->pr_MsgPort; X X WaitPort(myport); /* wait for packet */ X mymess = (struct Message *) GetMsg(myport); X X/* give them the pointer to the packet */ Xreturn((struct DosPacket *) mymess->mn_Node.ln_Name); X} X X/* end of misc.c */ END_OF_FILE if test 1768 -ne `wc -c <'pktstuff.c'`; then echo shar: \"'pktstuff.c'\" unpacked with wrong size! fi # end of 'pktstuff.c' fi if test -f 'tape-handle.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'tape-handle.uu'\" else echo shar: Extracting \"'tape-handle.uu'\" \(14542 characters\) sed "s/^X//" >'tape-handle.uu' <<'END_OF_FILE' Xbegin 666 tape-handler XM```#\P`````````"``````````$```D>````M0```^D```D>3E7_9$CG)SI)' XM^0`````K?``!AI__L'P`>@!P`'(!*T'_:$(M_V8K0/]L*T#_="M`_W@K0/^$Y XM*T#_G$/Z#,8L>``$3J[]V"E``AR3R4ZN_MHF0$ZZ&R@D0"`J`!PB`.6!+@!!W XM^@RP*TC_R$'Z#+0K2/_,*T'_U$'L`G@K2/_D0>W_L"M(_]Q![``@*TC_X$'M= XM_\@I2`(T)T@`6"`J`!CE@"!`0^@``2E)`E`0$2M!_[QR(K`!9B!2K`)0(&P"] XM4$H89OQ3B)'L`E`@"")L`E`L2=W`0B[__R!L`E`K2/_0*TC_I"!L`E`0$'(O; XML`%G!E*L`E!@[B!L`E!"&"E(`E`O"&$`$<I83W!DL*W_>&<``/9(;?]\80`0W XMLEA/*T#_>$J`9SY3@&="4X!G4E.`9U93@&=<4X!G8E.`9V93@&=R4X!G``"`Z XM4X!G``"*4X!G``".4X!G``"2<EB0@6<``)Y@IBMM_WS_L&">("W_?'(`$@!PZ XM!\*`ZX$900`@8(HI;?]\``A@@BEM_WP`#&``_WHI;?]\`!A@`/]P+"W_?&``V XM_VAP`$8`P*W_?"E``!1@`/]82JW_?&<`_U`;?``!_V9@`/]&2JW_?&8`_SY": XMK?]H8`#_-BMM_WS_G&``_RPK;?]\_X1@`/\B2JW_?&<`_QHI?`$`````$&``! XM_PX;?``!__Y@`/\$("P`#"(L``A.NB"N*4`"/"E``D!*K?^$9P1"K`)`(`8`6 XM@``!```B`'!/T(`L>``$3J[_.BM`_[A*@&8<2'@`9T*G+PI.NAC2(FP"'"QX( XM``1.KOYB8``*GB!M_[@I2`(@0^@`$"E)`B1#Z`!0*TG_]"E)`BA#Z`!X*4D"G XM+$*G0J=.NB$:2'@`,"\`3KHAH$_O`!`I0`(P(D`@;?^D("W_L"(M_YPL>``$R XM3J[^1$J`9RA(>`#20J<O"DZZ&%XB;`(<+'@`!$ZN_F(B;?^X<$_0@$ZN_RY@7 XM``H>0>L`7")M_[PC2``(+RH`$$AX__\O"DZZ&"A/[P`,</\L>``$3J[^MAM`! XM_V<,``#_9PQR`!(`<`'CH"M`_^AP`"\`+P!(>``'3KH0@D_O``Q*@&<0<``O' XM`"\`+P!.NA!N3^\`#"!L`BA"*``D(&P"*!`04P!F(D*L`!@0+?]F"@```1E`O XM`"%G!B`L``Q@!"`L`CPI0`)$8`8I;``,`D1.NA@`)$`@*@`(7X!G``CT4X!GB XM``D`7X!G``D0<@R0@6<`"1YR-Y"!9P`%]%N`9P`':@2````#EF<.4X!G"E.`[ XM9P`$#&``"1!*K?]T9Q)(>`#*0J<O"DZZ%TI/[P`,8*`@!@"```$``"(`("P") XM/"QX``1.KO\Z*4```"`&`(```0``(@`@+`(\3J[_.BE```1*K```9P1*@&8HP XM80`-;$AX`&="IR\*3KH6^DAZ"1A(;`)X3KH>+&$`#D9/[P`48`#_0"`J`!SE/ XM@"E``E!R`"!`$A`K0?]\0^@``4'L`EA@`A#94X%D^D'L`E@I2`)4(&P"5")(@ XMT^W_?$(1+RP"5&$`#E)83REL`E0"4"!L`E`0&"E(`E!R.K`!9O`@;`)00_H(# XMR!`8L!EF#DH`9O9F"'`#*T#_=&!T(&P"4$/Z"+00&+`99@Y*`&;V9@AP!"M`5 XM_W1@6`RJ```#[0`(9@1P`6`"<`(@;`)00_H(D"M`_W02&+(99@Q*`6;V9@8J] XM+`(X8"H@;`)0$!!R,+`!91AR.;`!8A)"IT*G+PA.NAJP3^\`#"H`8`9*`&86) XM>@`,K0````/_=&TH#*H```/M``AF'F$`#$AP`$AX`-$O`"\**T#_=$ZZ%=!/H XM[P`,8`#^)G``+P`O`$AX``%.N@Y&3^\`#"M`_WQG/"\`80`*;%A/*T#_>'(&$ XML(%F""EL`!@".&`B2H!G'F$`"_1P`$AX`-HO`"\**T#_=$ZZ%7Q/[P`,8`#]' XMT@RM`````O]T;@`!CG``+P`O`$AX``E.N@WF3^\`#$J`9Q)P`"\`+P`O`$ZZA XM#=)/[P`,8'IP`K"M_W1F+"!L`B00*``""```!V<>80`+C'``2'@`UB\`+PHKH XM0/]T3KH5%$_O``Q@`/UJ(&P")!`H``-R"+`!93A#Z``((#P`____P)$K0/]\M XML*P`"&<B<``0+?]F0J<O`$AX``A.N@UB<``N@"\`+P!.N@U63^\`%$J%9AQP0 XM`"\`+P!(>``$3KH-0$_O``P@+``8*4`".&!>("P".+"%9T8@;`(H$!!R$+`!W XM9@8I10(X8$1P`"\`+P!(>``$3KH-"D*7+P5(>``&3KH,_D_O`!0K0/]\9P@OD XM`&$`"2183W``*4`".&`0(&P"*!`04P!F!G``*4`"."!L`B@0$'(0L`%F8"E\4 XM?____P)(<``O`"\`2'@`"TZZ#+)/[P`,2H!G$G``+P`O`"\`3KH,GD_O``Q@+ XM,'``(&P")!`H``+A@'(`$B@``X"!4H`I0`)(+P!(>@9$2&P">$ZZ&R)A``L\X XM3^\`#'``*4``''(!*4$"3"\L`C@O+`)42'H&,DAL`G@K0/^`*T#_C"M`_VQ.< XMNAKN80`+"$_O`!!P`;"M_W1F)'``+P`O`$AX``).N@P>3^\`#'(`=`$K0O]P> XM*T#_F"M!_XA@$"ML`CS_B'``*T#_F"M`_W`O*@`02'C__R\*3KH37D_O``Q@0 XM`/NT("W_=`R`````!60``9+00#`[``9.^P`$``@`:`"8`!P`0DAX`-%"IR\*> XM3KH3*$_O``Q@``%J0J<O+?]P2'@`#$ZZ"YY/[P`,*T#_?&<``5`O`&$`!\)8B XM3V```41"IR\M_W!(>``*3KH+>$_O``PK0/]\9P`!*B\`80`'G%A/8``!'DJL. XM`!QG%G``+P`O`$AX``U.N@M,3^\`#"M`_Y@@+?^89P``^B\`80`';%A/8```N XM[DJL`!QG%G``+P`O`$AX``U.N@L<3^\`#"M`_Y@@+?^89QPB+?]P"D$``2\`S XM2'@``2\!80`(2D_O``PK0/^82H!F5$JM_VQG-B`M_W#E@$'L```@<`@`T>W_6 XMC"`M_XAR`&`"$,%3@&3Z+P$O+?]P2'@``TZZ"KI/[P`,*T#_F$J`9Q0O`$*GI XM+RW_<&$`!_)/[P`,*T#_F$J`9Q1(>@2,2&P">$ZZ&3QA``E64$]@/DJM_X!GM XM."`L``S1K`(X<``K0/]\(&P"*!(04P%F%"\`+P!(>``%3KH*6$_O``PK0/]\` XM2H!G""\`80`&?%A/+RH`$$AX__\O"DZZ$:I"K?]T80`(""ZL`CA(>@0\2&P"T XM>$ZZ&-!A``CJ3^\`%&``^>1P`;"M_W1G'$AZ!#!(;`)X3KH8L&$`",I03W#_# XM)4``'&```40K:@`8_Z`K:@`<_Y1*K?^49P`!,$JM_XAF``#@2JP`'&<6<``O* XM`"\`2'@`#4ZZ";Y/[P`,*T#_F"`M_YAG``"(+P!A``7>6$]"K?^8*T#_>%.`_ XM9Q!R#)"!9Q97@&<,4X!G#F!$0JW_>&!60JH`'&!080`(Q$J`9S!P`"(M_W`*3 XM00`!+P`O`4AX``(K0/]X3KH)7$_O``PK0/^89R0O`&$`!8)83RM`_WA(>@."P XM2&P">$ZZ%^QA``@&4$]P_R5``!Q*K?]X9GP@+``,T:P"."\M_V@O+?]P2'@`D XM`DZZ"1!/[P`,"&T``/]S(BP"/'0`*T#_F"M!_X@K0O^,("W_B"(M_Y2R@&X"9 XM(`$B+?]PY8%![```('`8`-'M_XPK0/^0(FW_H&`"$MA3@&3Z("W_D)&M_Y31& XMK?^,T:W_H)&M_XA@`/[,+RH`&"\J`!PO"DZZ$!)/[P`,8`#X:`RM`````O]T% XM;!Q(>@*R2&P">$ZZ%S)A``=,4$]P_R5``!Q@``$N4JW_@"MJ`!C_H"MJ`!S_) XME"`M_Y1G``$6(BW_B+"!;0``T"`M_W#E@$'L```@<`@`T>W_C")M_Z!@`A#9> XM4X%D^DJL`!QG%G``+P`O`$AX``U.N@@<3^\`#"M`_Y@@+?^89T@B+?]P"D$`P XM`2\`2'@``2\!80`%2D_O``PK0/^89RIP_R5``!Q(>@(Z2&P">$ZZ%I!A``:J) XM4$]P`"M`_X`K0/]L*T#_F&```(0O+?]H+RW_<$AX``-.N@>V3^\`#"(L``S3" XMK`(X(BW_B).M_Y33K?^@<@`K;`(\_X@(;0``_W,K0/^8*T'_;"M!_XQ@`/\BT XM("W_<.6`0>P``"!P"`#1[?^,("W_E")M_Z!@`A#94X!D^B`M_Y21K?^(T:W_; XMC$*M_Y1P`2M`_VQ@`/[F+RH`$"\J`!PO"DZZ#JI/[P`,8`#W`$*G+P<O"DZZQ XM#IA/[P`,8`#V[B\J`!`O*@`4+PI.N@Z"3^\`#&``]M@O*@`02'C__R\*3KH.) XM;$_O``Q@`/;"+RH`$$AX__\O"DZZ#E9/[P`,8`#VK$AX`-%"IR\*3KH.0BZJ) XM``A(>@$N2&P">$ZZ%7!A``6*3^\`%&``]H1,[5SD_T1.74YU:6YT=6ET:6]N= XM+FQI8G)A<GD`5&%P94AA;F1L97(`+4)43E1!4$4@5C(N,"!205(M36%R(#(Y) XM(#$Y.3$`0V%N)W0@9V5T(&UE;6]R>2!F;W(@=&%P92!B=69F97)S"@``4D%7L XM0TU$``!-3T1%4T5,`"H`0V%P86-I='DZ("5U(&)L;V-K<PH``"5S($]P96YE` XM9"!A="!B;&]C:R`E=0H``$5R<F]R('=R:71I;F<@9FEN86P@8FQO8VL*``!#8 XM;&]S960@870@8FQO8VL@)74*`$9U;F-T:6]N+VUO9&4@97)R;W(*``!%<G)O! XM<B!D=7)I;F<@<F5A9`H``$5R<F]R(&1U<FEN9R!W<FET90H`56YS=7!P;W)T) XM961?4&MT/25D"@!.3TY%``!214-/5D52140@15)23U(`3D]4(%)%0419`$U%X XM1$E532!%4E)/4@``2$%21%=!4D4@15)23U(``$E,3$5'04P@4D5154535`!5I XM3DE4($%45$5.5$E/3@``1$%402!04D]414-4``!"3$%.2R!#2$5#2P!+15D]H XM.0!#3U!9($%"3U)4140``$%"3U)4140@0T]-34%.1`!+15D]0P!63TQ5344@6 XM3U9%4D9,3U<`2T59/44`2T59/48`1DE,14U!4DL``$5.1"U/1BU-141)54T`= XM24Y#3U)214-4($),3T-+($Q%3D=42```4T5,1BU53DE4`$1-00!02$%310!0` XM05))5%D``%-%3$5#5"U424U%3U54``!396YS93H@)7,L(&]T:&5R/2`E,#)8W XM+"4P,E@*``!30U-)("5S($524D]2"@``54X``$Q5``!"4P``3D(``%)"``!"R XM5```1DT``%9"``!/5@``1$8``%-5``!#.0``0V]N=&EN=64``$%B;W)T`%1I, XM;64@=&\@:6YS97)T('1A<&4C("5D"@``($EN<V5R="!T87!E("5D(&9O<B`E> XM<P``2.<C*$GY`````"XO`!C@AV<(<"V^@&8``-IP`"\`+P`O`$ZZ`Z9/[P`,- XM(&P")!`0(@`"`0!P='"R`F8J$B@``@@!``=G!'P08"((`0`&9P1\$6`8"`$`< XM!6<$?!)@#BP!`@8`#V`&+``"!@`/<``0!B(`2,'E@4/L`"(D;`(T)7$8```PE XM(&P")!`H``P@;`(T$4``-"!L`B00*``-(&P"-!%``#4A;`(D`!!P`!`&(@!(O XMP>6!<``@;`(D$"@`#'0`%"@`#2\"+P!![``B+S`8`$AZ_HY(;`)X3KH1HF$`( XM`;Q/[P`4(&P"-$*H`!!P`!`&8"(@!^6`0>S_SB\P"`!(>OY^2&P">$ZZ$71A: XM``&.3^\`#'`33-\4Q$YU3E7_^$CG#PA)^0`````N+0`(+"T`#"HM`!`H!2\$3 XM80#^QEA/*T#_^'(1L(%G!G(-L(%F0F$``<1*@&<Z2H9G""`L``R1K`(X0J<O> XM!TAX``-.N@)>3^\`#"@`2H1G#"\$80#^A%A/*T#_^$J&9P@@+``,T:P".'`!# XML*W_^&8">``@!$S?$/!.74YU2.<`"DGY`````$JL``!G$")L```@+`(\+'@`5 XM!$ZN_RY*K``$9Q`B;``$("P"/"QX``1.KO\ND<@I2``$*4@``$S?4`!.=4Y5K XM__1(YP$X2?D`````)FT`""!L`E`0$$H`9@9P9&```(@D2'`ML!)G!%**8/8K[ XM;`)0__@@;?_X$!!R+[`!9PI*`&<&4JW_^&#J<``4P"!M__@0P$*G0J<O"BM(I XM__A.N@V<3^\`#":`)&P"4"EM__@"4'X`<`R^@&XL(`?E@$'L`((@<`@`$A*R4 XM$&860>P`@B!P"`!2B!`J``&P$&8$(`=@!E*'8,YP8TS?'(!.74YU2.<`"DGYI XM`````"!L`C0@*``H9SHB0"`H`"0L>``$3J[^O"!L`C0@*``@3J[^PB)L`C0B+ XM:0`H(&P"-"`H`"1.KOZ\(&P"-"`H`"!.KO["3-]0`$YU2.<`&$GY`````"9OW XM``P0$V<.<F&P`64$<B"3$U*+8.Y,WQ@`3G5(YS$Z2?D`````4JP"3"\L`DQ(3 XM>ORF2&P">$ZZ#TQA`/]F+JP"5"\L`DQ(>ORH2&P!]$ZZ#S1/[P`8D<A#[`"RV XM1>P`QD?L`-IP`"(`='W4@G8R+&P"'$ZN_J0N`$J'9TQP`"\`+P!(>``!3KH`B XM2BZ`80#\>G``+H`O`$AX``1.N@`V3^\`%$J`9Q!P`"\`+P`O`$ZZ`")/[P`,B XM(&P"*!`0<A"P`68&*6P`&`(X(`=,WUR,3G4``$Y5__1(YR<J2?D`````+BT`, XM""PM``PJ+0`02JP`'&<T(FP","QX``1.KOXF<``I0``<(&P",!(H`!]G&'0`( XM%`'A@G(`(FP"+!(I`!74@2`"8``&>G`-OH!F!G``8``&;B!L`BPA;`(@``P@- XM;`(L,7P`!@`0<``@;`(L$4``%2)L`C`S?``<`!P@;`(P(6P"+``H<A8@;`(P[ XM(4$`)"!L`C`10``?0JW_^"`M__AR"K"!;`X@;`(@T<!"$%*M__A@Z"`'#(``' XM```-9``%Q-!`,#L`!D[[``0!C`)8`-(`&`'D`M(#%@(<!&@">@4``X8#PB!L0 XM`B@0$'(0L`%F$B`L`CC0K``,L*P"2&4$3KK^/B!L`B`0O``*$"P`(!(L`"&`5 XM`2!L`B`10``!0^@``B1L`B@0$E,`9@X@+`)$(@#@B70`-`%@"B`L`CAR`#(`K XM)`$R@B`L`D1R`!(`=`!&`L*"(&P"(!%!``0@!N6`0>P``"(P"`""K``0(&P"1 XM+""!(6P"0``$(&P"+$(H`!0O+`)$+RP".$AZ!4!(;`)X3KH-%DZZ_3!/[P`0Q XM8``$YB!L`B@0$'(0L`%F$B`L`CC0K``,L*P"2&4$3KK]A"!L`B`0O``($"P`O XM(!(L`"&``2!L`B`10``!0^@``B1L`B@0$E,`9@X@+`)$(@#@B70`-`%@"B`L, XM`CAR`#(`)`$R@B`L`D1R`!(`=`!&`L*"(&P"(!%!``0@!N6`0>P``")L`BPBG XML`@`(&P"+"%L`D``!"!L`BP1?``!`!0O+`)$+RP".$AZ!)Y(;`)X3KH,7$ZZA XM_'9/[P`08``$+$*M__@@+?_X<B"P@6P.(&P")-'`0A!2K?_X8.@@;`(@$+P`$ XM`R!L`B`1;``@``$@;`(@$7P`(``$<"`@;`(L(4``!"!L`BP@K`(D(&P"+!%\0 XM``$`%&```]0@;`(@$+P``2!L`B`1;``@``$@;`(L0J@`!"!L`BQ"*``42'H$Y XM)$AL`GA.N@O*3KK[Y%!/8``#G"!L`B`0O``2(&P"(!%L`"```2!L`B`1?``DK XM``1P)"!L`BPA0``$(&P"+""L`B@@;`(L$7P``0`48``#8'``(&P"(!"`$6P`Q XM(``!(&P"+$*H``0@;`(L$4``%&```SY"K?_X("W_^'(,L(%L#B!L`B31P$(0Q XM4JW_^&#H(&P"(!"\`!H@;`(@$6P`(``!(&P"(!%\``P`!'`,(&P"+"%```0@D XM;`(L(*P")"!L`BP1?``!`!1@``+F(&P"(!"\`!`@;`(@$6P`(``!("P`%"!LR XM`B`10``$(&P"+$*H``0@;`(L0B@`%$AZ`S9(;`)X3KH*T$ZZ^NI03V```J(@1 XM;`(@$+P`$1`L`"`````!(&P"(!%```$@+``4(@9.N@L&<@`2`."!(&P"(!%!. XM``-R`!(`=`!&`L*"(&P"(!%!``0@;`(L0J@`!"!L`BQ"*``4+P9(>@+>2&P"X XM>"M`__A.N@IB3KKZ?$_O``Q@``(R(&P"(!"\`"4@;`(@$6P`(``!(&P"+#%\\ XM``H`$'`((&P"+"%```0@;`(L(*P")"!L`BP1?``!`!1@``'V0JW_^"`&Y8!!" XM[```*W`(`/_\(&W__!`0<@JP`6<X("W_^'(*L(%L+B)L`B#3P%*M__A(>``02 XM2&W__"\(+TD`*$ZZ!T!/[P`,<@!&`<"!(&\`'!"`8+P@;`(@$"@``1(L`""`V XM`2!L`B`10``!$!!3`&8&*6P`&`(X(&P"+""L`B0@;`(L0J@`!"!L`BQ"*``43 XM2'H"#$AL`GA.N@E^3KKYF%!/8``!4"!L`B`0O``5(&P"(!%L`"```2!L`B`10 XM?``,``1"K?_X("W_^'(,L(%L#B!L`B31P$(04JW_^&#H(&P")!%\`!```B!L/ XM`B01?``(``-*AF82(&P")%"((#P`____P*P`"""`<`P@;`(L(4``!"!L`BP@R XMK`(D(&P"+$(H`!0O+``(2'H!A$AL`GA.N@CH3KKY`D_O``Q@``"X0JW_^"`MR XM__AR0+"!;`X@;`(DT<!"$%*M__A@Z$*M__@@!N6`0>P``"MP"`#__"!M__P0[ XM$'(*L`%G."`M__AR0+"!;"XB;`(DT\!2K?_X2'@`$$AM__PO""])`"A.N@7FD XM3^\`#'(`1@'`@2!O`!P0@&"\(&P"(!"\`!4@;`(@$6P`(``!("W_^"!L`B`1Y XM0``$(&P"+"%```0@K`(D(&P"+$(H`!1(>@#D2&P">$ZZ""Q.NOA&4$]*A68F= XM(FP","QX``1.KOXX<``@;`(P$"@`'^&`<@`@;`(L$B@`%="!8!0B;`(P+'@`D XM!$ZN_C)P`2E``!QP`$S?5.1.74YU5W)I=&EN9R!B;&]C:R`E=2`J("5D"@``M XM4F5A9&EN9R!B;&]C:R`E=2`J("5D"@``4F5W:6YD:6YG"@``5W)I=&EN9R!FW XM:6QE;6%R:PH`4VMI<'!I;F<@)60@9FEL92AS*0H``%)A=R!C;VUM86YD"@``> XM36]D92!396QE8W0@8FQO8VL@<VEZ92`E9`H``%5S97(@36]D92U396QE8W0*9 XM`$Y5__1(YP,Z2?D`````)FT`""XM``PL+0`0)T<`#"=&`!`K:P`$__@D4Y/)* XM+'@`!$ZN_MH@0$/H`%PG20`$)4L`"I/))(DE20`$*T#_]"!M__@B2DZN_I),R XMWUS`3EU.=4Y5__1(YP`Z2?D`````D\DL>``$3J[^VB9`1>L`7"!*3J[^@"!*" XM3J[^C"!`("@`"DS?7`!.74YU3E7_Q$CG)S`F;0`()&T`#'X`?`!Z`'``&WP`, XM(/_[<@`K0?_V=/\K0O_R0>W_T!M`__$;0/_\*T'_Y"M!_^@K2/_,$!-G+'(`D XM$@`$00`@9Q1706<444%G"%5!9A9^`6`.?`%@"GH!8`8;?``!__Q2BV#0$!-R" XM,+`!9@92BQM!__MP*K`39@P@4EB2*U#_]E*+8`Y(;?_V+PM.N@6F4$_7P!`36 XM<BZP`68B4HMP*K`39@P@4EB2*U#_\E*+8`Y(;?_R+PM.N@5\4$_7P!`3<FRPH XM`68*&WP``?_Q4HM@"')HL`%F`E*+$!MR`!(`&T#_\`1!`%!G``%L44%G``%ZD XM!$$`"V<``@9306<D!$$`"V<``0Y306<``4Q706<``;9506<``.!706<``4Y@M XM``'T2BW_\6<((%)8DB`08`8@4EB2(!`K0/_L;`IR`42M_^PK0?_H("W_Z&<$6 XM<BU@"DH&9P1R*V`"<B`;0?_0<@`2!H"!<@`2!8"!9PA2K?_,4JW_Y"\M_^POF XM+?_,3KH$'%!/*T#_R"`M__)*@&H&<@$K0?_R("W_R"(M__*2@$CM``+_Q&\T\ XM(&W_S-'!+P`O""\M_\Q.N@4@3^\`#'``$"W_^R(M_\0@;?_,8`(0P%.!9/H@# XM+?_R*T#_R-&M_^1![?_0*TC_S$H'9P`!,!M\`"#_^V```29*+?_Q9P@@4EB2_ XM(!!@!B!26)(@$"M`_^Q@`/]D2BW_\6<((%)8DB`08`8@4EB2(!`K0/_L2BW_; XM_&<2(&W_S!#\`#!R`2M!_^0K2/_,+P`O+?_,3KH#@%!/*T#_R&``_S(@+?_R* XM2H!J!G`(*T#_\AM\``'_\4HM__%G""!26)(@$&`&(%)8DB`0*T#_[$HM__QG9 XM%B!M_\P0_``P$/P`>'("*T'_Y"M(_\PO`"\M_\Q.N@-D4$\K0/_(""T`!?_PN XM9@#^T$AM_]!.N@*86$]@`/["(%)8DB)0*TG_S&8(0?H`V"M(_\P@;?_,2AAF- XM_%.(D>W_S"M(_^0@+?_R2H!K)K'`;R(K0/_D8!QP`2M`_^0@4EB2(!`;0/_00 XM0BW_T6`&<`!@``",("W_Y"(M__:R@&P(=``K0O_V8`21K?_V2@=G-E.M_^1M& XM&'``(&W_S!`8+P`K2/_,(&T`$$Z06$]@XE.M__9M2'``$"W_^R\`(&T`$$Z04 XM6$]@Z%.M__9M$G``$"W_^R\`(&T`$$Z06$]@Z%.M_^1M&'``(&W_S!`8+P`K5 XM2/_,(&T`$$Z06$]@XB`+3-\,Y$Y=3G4``$Y5__1(YP$P)FT`""1M``PK;0`0! XM__8>&DH'9S1P);X`9B*P$F8$4HI@&B\+2&W_]B\*80#\%$_O``PK0/_Z9P0D! XM0<``0!R\`3I-83V#&3-\,@$Y=3G4O/`````!(YW@P(&\`(")O`"0@+P`H8 XM*7P``````M`D2`P0`"!F!%)(8/8F2`P```!M#`P``"1N!@P```%F!G``8```9 XMY@P0`"UF#%(O`!A2+P`94DA@"`P0`"MF`E)(#````&8><`H,$``P9CAP"%)(E XM#!``6&<&#!``>&8H<!!22&`B#```$&8<#!``,&86#"@`>``!9@142&`*#"@`6 XM6``!9@)42$*!0H(,$```9P``6A00#`(`,&U0#`(`.6X&!`(`,&`."((`!0P"< XM`$%M.@0"`#>T`&XR*`%G'B8!QL!(1,C`2$0,1```9@C6A&4$(@-@!A]\``$`< XM&=*"9```"!]\``$`&5)(8*`(+P```!AG`D2!""\````99P``#B/\````(@``K XM`M!R_[/\`````&<,M\AF```&(HI@`B*((`%,WPP>6(].=0``````````<&%(! XMYR`P)F\`$"1+$!)G)'(`$@!![`#Q"#```1@`9PIR`!(`=""2@F`$<@`2`!2!% XM4HI@V"`+3-\,!$YU``````````!P82`O``@@;P`$3E7_]")/<@I.N@&D!D$`O XM,!+!2H!F\"`)$.&_R6;Z0A"0CTY=3G4``"`O``@@;P`$3E7_]")/(@`"00`'A XM!D$`,!+!YHAF\"`)$.&_R6;Z0A"0CTY=3G4``#`Q,C,T-38W.#EA8F-D968@Q XM+P`((&\`!$/O``0R``)!``\2^Q#<Z(AF\B`)(@]8@1#ALHEF^D(0D(%.=2!OY XM``0B2'(`<``O`@P0`"MG!@P0`"UF`E)($!@$```P;1(,```);@PD`>6!TH+2; XM@=*`8.8,$0`M9@)$@20?(`A3@"!O``@@@9")3G4O!RXO``A2K`+,(`<@;`+(& XM$,`I2`+(+A].=4Y5``!(YP`P)FT`""1M``Q"K`+,*4L"R$AM`!`O"DAZ_\9.B XMNOSN(&P"R$(0("P"S$SM#`#_^$Y=3G4@;P`$(F\`""`O``QO%K/(90S1P-/`L XM$R!3@&;Z3G42V%.`9OI.=0``2.<P`"0`)@%(0DA#Q,'&P,#!U$-(0D)"T(),7 XMWP`,3G5*@&H``!Y$@$J!:@``#$2!80``($2!3G5A```81(!$@4YU2H%J```,9 XM1(%A```&1(!.=2\"2$$T`68``")(0$A!2$(T`&<```:$P3`"2$`T`(3!,`)(8 XM0C(")!].=2\#=A`,00"`9```!N&944,,00@`9```!NF964,,02``9```!N69K XM54-*06L```;CF5-#-`#FJ$A"0D+FJDA#@,$V`#`"-`-(0<3!D()D```(4T/0C XM@63^<@`R`TA#Y[A(0,%!)A\D'TYU2.<#,B9O`!@N+P`<</\L>``$3J[^MGP`6 XM'`!P_[R`9@1P`&!F<"(B/``!``%.KO\Z)$`@"F8((`9.KOZP8$HE2P`*(`<5Z XM0``)%7P`!``(0BH`#B`&%4``#Y/)3J[^VB5``!`@"V<((DI.KOZ>8!I!Z@`8J XM)4@`%$'J`!0E2``<0JH`&!5\``(`("`*3-],P$YU2.<!,B9O`!0N+P`8(`MFU XM!'``8"P@!R(\``$``2QX``1.KO\Z)$`@"F<4%7P`!0`(0BH`"25+``X@!S5`: XM`!(@"DS?3(!.=0`````#[`````P````!```@Y@``&X8``!LF```3L@``$O@`I XM`!+2```2?@``$=(``!&(```1`@``#^0````*`````````_(```/J````M0``7 XM```````````"``````$``````````0````````````````XD```.*@``#CH`V XM``Y$```.4@``#F(```YR```.@@``#I````Z<```.H@``#K````[````.Q@``* XM#M8```[<```.X@``#NP```[Z```/$@``#QP```\@```/)@``#RX```]L```/W XM<```#W0```]X```/?```#X````^$```/B```#XP```^0```/E```#Y@``0$`$ XM``8``P````````'T```````!`0``!@`#````````#YP```````$!```&``,`_ XM```````/I@`````````@("`@("`@("`H*"@H*"`@("`@("`@("`@("`@("`@] XM($@0$!`0$!`0$!`0$!`0$!"$A(2$A(2$A(2$$!`0$!`0$(&!@8&!@0$!`0$![ XM`0$!`0$!`0$!`0$!`0$!$!`0$!`0@H*"@H*"`@("`@("`@("`@("`@("`@("? XM`@(0$!`0("`@("`@("`@("@H*"@H("`@("`@("`@("`@("`@("`@2!`0$!`0D XM$!`0$!`0$!`0$(2$A(2$A(2$A(00$!`0$!`0@8&!@8&!`0$!`0$!`0$!`0$!* XM`0$!`0$!`0$0$!`0$!""@H*"@H("`@("`@("`@("`@("`@("`@("`A`0$!`@\ XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM``````/L````)@````````#F````T@```*X```"J````I@```*(```">````+ XMF@```)8```"2````C@```(H```"&````@@```'X```!Z````=@```'(```!NP XM````:@```&8```!B````7@```%H```!6````4@```$X```!*````1@```$(`R XM```^````.@```#8````R````+@```"H````F````(@````$````!````O@``` X&``````/RU X`` Xend Xsize 10356 END_OF_FILE if test 14542 -ne `wc -c <'tape-handle.uu'`; then echo shar: \"'tape-handle.uu'\" unpacked with wrong size! fi # end of 'tape-handle.uu' fi if test -f 'tape.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'tape.h'\" else echo shar: Extracting \"'tape.h'\" \(1664 characters\) sed "s/^X//" >'tape.h' <<'END_OF_FILE' X/* BTNtape include file, version 2.0 */ X X/* Operations supported by TapeIO */ X#define TSENSE 0 /* request sense */ X#define TREADY 1 /* test unit ready */ X#define TREAD 2 /* read blocks */ X#define TWRITE 3 /* write blocks */ X#define TREWIND 4 /* rewind tape */ X#define WFMARK 5 /* write file mark */ X#define TSKIP 6 /* skip over files */ X#define INQUIRY 7 /* read device info */ X#define MDSET 8 /* mode-set */ X#define MDSNS 9 /* mode-sense */ X#define USRMODE 10 /* user mode-set */ X#define RDCAP 11 /* read capacity */ X#define RAWCMD 12 /* send user scsi command to tape */ X#define TFINISH 13 /* wait for last operation to finish */ X X/* these control how fast TapeIO returns to the caller */ X#define CTLWAIT 0 /* return when operation is done */ X#define CTLIMM 1 /* return immediately */ X X/* Supported device types (from INQUIRY) */ X#define SEQ (inq[0]==0x01) /* sequential */ X#define DAC (inq[0]==0x10) /* direct-access */ X#define BADLUN (inq[0]==0x7f) /* oops */ X X/* inline message print functions */ X#define MPR0(XYZ) sprintf(dbb,XYZ); MonPrint() X#define MPR1(XYZ,V1) sprintf(dbb,XYZ,V1); MonPrint() X#define MPR2(XYZ,V1,V2) sprintf(dbb,XYZ,V1,V2); MonPrint() X#define MPR3(XYZ,V1,V2,V3) sprintf(dbb,XYZ,V1,V2,V3); MonPrint() X X/* function prototypes */ Xvoid _main(void); Xlong TapeIO(int,int,int); Xint DoSense(long); Xlong wrteot(int,int,long); Xvoid freestuff(void); Xint getstart(long *); Xvoid MonPrint(void); Xvoid toUPPER(char *); Xlong NewTape(void); Xvoid returnpkt(struct DosPacket *, ULONG, ULONG); Xstruct DosPacket *taskwait(void); END_OF_FILE if test 1664 -ne `wc -c <'tape.h'`; then echo shar: \"'tape.h'\" unpacked with wrong size! fi # end of 'tape.h' fi if test -f 'tapeio.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'tapeio.c'\" else echo shar: Extracting \"'tapeio.c'\" \(6548 characters\) sed "s/^X//" >'tapeio.c' <<'END_OF_FILE' X/* X** TapeIO: performs operations to the tape unit via SCSI-direct for BTNtape X** Version 2.0 03/29/91 X** X** (c) Copyright 1990, 1991 Robert Rethemeyer. X** This code is freely distributable and redistributable, X** for non-commercial purposes, provided this notice is included. X** X** This code was derived from programs written by Robert Mitchell. X*/ X X#include <exec/types.h> X#include <exec/io.h> X#include <libraries/dos.h> X#include <libraries/dosextens.h> X#include <devices/scsidisk.h> X#include <stdio.h> X#include <string.h> X X#define DBUG 0 X X#if defined AZTEC_C X #include <functions.h> X/*#define strtoul strtol */ X#elif defined LATTICE X #include <proto/exec.h> X#endif X X#include "tape.h" X#include "tplink.h" X X/* SCSI commands used by handler */ X#define CMD_TEST_UNIT_READY 0x00 X#define CMD_REWIND 0x01 X#define CMD_REQUEST_SENSE 0x03 X#define CMD_SCSI_READ 0x08 X#define CMD_SCSI_WRITE 0x0a X#define CMD_FILEMARK 0x10 X#define CMD_SPACE 0x11 X#define CMD_INQUIRY 0x12 X#define CMD_MODE_SELECT 0x15 X#define CMD_MODE_SENSE 0x1a X#define CMD_READ_CAPACITY 0x25 X Xextern UBYTE *cdb; Xextern UBYTE *sns; Xextern UBYTE *inq; Xextern struct SCSICmd *cmd; Xextern UBYTE *TapeBuff[2]; Xextern struct IOStdReq *ior; Xextern ULONG blknum; Xextern ULONG blksize; Xextern ULONG numblks; Xextern ULONG TBSize; Xextern ULONG rwlen; Xextern ULONG tranlen; Xextern ULONG bugmask; Xextern ULONG fmarks; Xextern long reserved; Xextern long tpsize; Xextern struct tplink *linktp; Xextern int inprog; Xextern char dbb[80]; Xextern UBYTE Lun; Xextern UBYTE fixedbit; Xextern long NewTape(); X Xlong TapeIO(int toper, int bn, int ctl) X{ X char *z; int i; X X if(inprog) { X WaitIO((struct IORequest *)ior); X inprog = FALSE; X if(ior->io_Error) X return((long)((ior->io_Error << 8) + cmd->scsi_Status)); X } X if(toper == TFINISH) return(0L); X cmd->scsi_Command = cdb; X cmd->scsi_CmdLength = 6; X cmd->scsi_Status = 0; X ior->io_Command = HD_SCSICMD; X ior->io_Data = (APTR) cmd; X ior->io_Length = sizeof(struct SCSICmd); X ior->io_Error = 0; X for (i=0 ; i<10; i++) cdb[i] = 0x00; X X switch(toper) { X X case TWRITE: X if(DAC && ((blknum+numblks)>=tpsize)) NewTape(); X cdb[0] = CMD_SCSI_WRITE; X cdb[1] = Lun | fixedbit; X *((UWORD *)&cdb[2]) = (SEQ) ? (UWORD)(tranlen>>8) : (UWORD) blknum; X cdb[4] = (UBYTE) tranlen & 0xff; X /* cmd->scsi_Data = (UWORD *) TapeBuff[bn]; */ /* 2090A bug fix */ X cmd->scsi_Data = (UWORD *) ((ULONG) TapeBuff[bn] | bugmask); X cmd->scsi_Length = rwlen; X cmd->scsi_Flags = SCSIF_WRITE; X MPR2("Writing block %u * %d\n",blknum,tranlen); X break; X X case TREAD: X if(DAC && ((blknum+numblks)>=tpsize)) NewTape(); X cdb[0] = CMD_SCSI_READ; X cdb[1] = Lun | fixedbit; X *((UWORD *)&cdb[2]) = (SEQ) ? (UWORD)(tranlen>>8) : (UWORD) blknum; X cdb[4] = (UBYTE) tranlen & 0xff; X cmd->scsi_Data = (UWORD *) TapeBuff[bn]; X cmd->scsi_Length = rwlen; X cmd->scsi_Flags = SCSIF_READ; X MPR2("Reading block %u * %d\n",blknum,tranlen); X break; X X case TSENSE: X for (i=0 ; i<32; i++) sns[i] = 0; X cdb[0] = CMD_REQUEST_SENSE; X cdb[1] = Lun; X cdb[4] = 32; /* extended sense */ X cmd->scsi_Length = 32; X cmd->scsi_Data = (UWORD *) sns; X cmd->scsi_Flags = SCSIF_READ; X break; X X case TREWIND: X cdb[0] = CMD_REWIND; X cdb[1] = Lun; X cmd->scsi_Length = 0; X cmd->scsi_Flags = 0; X MPR0("Rewinding\n"); X break; X X case INQUIRY: /* read drive information */ X cdb[0] = CMD_INQUIRY; X cdb[1] = Lun; X cdb[4] = 36; X cmd->scsi_Length = 36; X cmd->scsi_Data = (UWORD *) inq; X cmd->scsi_Flags = SCSIF_READ; X break; X X case TREADY: /* test unit ready */ X cdb[0] = CMD_TEST_UNIT_READY; X cdb[1] = Lun; X cmd->scsi_Length = 0; X cmd->scsi_Flags = 0; X break; X X case MDSNS: X for (i=0 ; i<12; i++) sns[i] = 0; X cdb[0] = CMD_MODE_SENSE; X cdb[1] = Lun; X cdb[4] = 12; X cmd->scsi_Length = 12; X cmd->scsi_Data = (UWORD *) sns; X cmd->scsi_Flags = SCSIF_READ; X break; X X case WFMARK: /* write file mark */ X cdb[0] = CMD_FILEMARK; X cdb[1] = Lun; X cdb[4] = (UBYTE) fmarks; X cmd->scsi_Length = 0; X cmd->scsi_Flags = 0; X MPR0("Writing filemark\n"); X break; X X case TSKIP: /* skip over files */ X cdb[0] = CMD_SPACE; X cdb[1] = Lun | 0x01; /* space file marks */ X i = fmarks * bn; X cdb[3] = (UBYTE) i >> 8; X cdb[4] = (UBYTE) i & 0xff; X cmd->scsi_Length = 0; X cmd->scsi_Flags = 0; X MPR1("Skipping %d file(s)\n",bn); X break; X X case RDCAP: /* read tape capacity. 3M drive only */ X cdb[0] = CMD_READ_CAPACITY; X cdb[1] = Lun; X cmd->scsi_CmdLength = 10; X cmd->scsi_Length = 8; X cmd->scsi_Data = (UWORD *) sns; X cmd->scsi_Flags = SCSIF_READ; X break; X X case RAWCMD: /* write user-provided control command */ X i = 0; X z = (char *)TapeBuff[bn]; X while(*z!='\n' && i<10) cdb[i++] = (UBYTE) 0xff & strtoul (z,&z,16); X cdb[1] |= Lun; X if(cdb[0]==CMD_REWIND) blknum = reserved; X cmd->scsi_Data = (UWORD *) sns; X cmd->scsi_Length = 0; X cmd->scsi_Flags = 0; X MPR0("Raw command\n"); X break; X X case MDSET: /* set fixed-mode block length */ X cdb[0] = CMD_MODE_SELECT; X cdb[1] = Lun; X cdb[4] = 12; X for (i=0 ; i<12; i++) sns[i] = 0x00; X sns[2] = 0x10; /* buffered mode */ X sns[3] = 8; X if(!bn) *((ULONG *)&sns[8]) = blksize & 0x00ffffff; /* block length */ X cmd->scsi_Length = 12; X cmd->scsi_Data = (UWORD *) sns; X cmd->scsi_Flags = SCSIF_WRITE; X MPR1("Mode Select block size %d\n",blksize); X break; X X case USRMODE: /* write user-provided mode-select data */ X for (i=0 ; i<64; i++) sns[i] = 0x00; X i = 0; X z = (char *)TapeBuff[bn]; X while(*z!='\n' && i<64) sns[i++] = (UBYTE) 0xff & strtoul (z,&z,16); X cdb[0] = CMD_MODE_SELECT; X cdb[1] = Lun; X cdb[4] = i; X cmd->scsi_Length = i; X cmd->scsi_Data = (UWORD *) sns; X cmd->scsi_Flags = SCSIF_WRITE; X MPR0("User Mode-Select\n"); X break; X X } X X#if DBUG X MPR3("CDB = %02x %02x %02x",cdb[0],cdb[1],cdb[2]); X MPR3("%02x %02x %02x\n",cdb[3],cdb[4],cdb[5]); X MPR1("ADDR = %X\n", cmd->scsi_Data ); X MPR1("LENG = %X\n\n", cmd->scsi_Length ); X return(0L); X#endif X X if(ctl == CTLWAIT) { X DoIO ((struct IORequest *)ior); /* start sync io */ X return((long)((ior->io_Error << 8) + cmd->scsi_Status)); X } X else { X SendIO((struct IORequest *)ior); /* start async io */ X inprog = TRUE; X return(0L); X } X} X END_OF_FILE if test 6548 -ne `wc -c <'tapeio.c'`; then echo shar: \"'tapeio.c'\" unpacked with wrong size! fi # end of 'tapeio.c' fi if test -f 'tapemon.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'tapemon.c'\" else echo shar: Extracting \"'tapemon.c'\" \(5030 characters\) sed "s/^X//" >'tapemon.c' <<'END_OF_FILE' X/** X * TapeMon: a monitor program for the BTNtape handler. X */ X#define MVERSION "TapeMon V2.0" X/* X * (c) Copyright 1990, 1991 Robert Rethemeyer X * This software may be freely distributed and redistributed, X * for non-commercial purposes, provided this notice is included. X *------------------------------------------------------------ X * Run TapeMon from a CLI to receive informational messages X * from the BTN-Tape handler process. To terminate the X * monitor program, break the CLI using control-C or BREAK. X */ X#include <exec/types.h> X#include <exec/nodes.h> X#include <exec/lists.h> X#include <exec/ports.h> X#include <exec/tasks.h> X#include <exec/execbase.h> X#include <libraries/dos.h> X#include <stdlib.h> X#include <stdio.h> X#include <string.h> X#include "/tplink.h" X X#if defined AZTEC_C X #include <functions.h> X#elif defined LATTICE X #include <proto/exec.h> X #include <proto/dos.h> X#endif X Xextern struct DosLibrary *DOSBase; X Xvoid main(int,char *[]); Xvoid toUPPER(char *); X Xvoid main(int argc, char *argv[]) X{ X struct Task *tapeproc; X struct tplink *linktp; X char *tapename; X char *xx; X ULONG x; X int run = 1; X int fullsense = 0; X int ii; X BYTE signum; X BYTE oldpri; X X printf("*** BTN-Tape Handler & Monitor ***\n(c) Copyright 1990,1991 Robert Rethemeyer\n"); X X if(argc > 1) { X tapename = argv[1]; X toUPPER(tapename); X xx = &tapename[strlen(tapename)-1]; X if(*xx == ':') *xx = '\0'; X } X else tapename = "TAPE"; X X if(argc > 2) fullsense = 1; X X if (!(tapeproc = FindTask(tapename))) { X printf("Process %s not found.\n",tapename); X exit(30); X } X if (!(linktp = (struct tplink *) tapeproc->tc_UserData)) { X printf("No linkage structure...\n wrong process, or\n handler not active yet?\n"); X exit(31); X } X printf("%s: Proc %X DevNode %X\n",tapename,tapeproc,linktp->devnode); X X if (strcmp(linktp->keyword,"TapeHandler")) { X printf("Process %s doesn't look like BTN-Tape\n",tapename); X exit(32); X } X X if (linktp->montask) { X printf("There is already a TapeMon running\n"); X exit(33); X } X X if (!linktp->handsig) { X printf("Handler has no signal\n"); X exit(34); X } X X signum = AllocSignal(-1); X if (signum == -1) { X printf("Unable to allocate signal for TapeMon\n"); X exit(35); X } X linktp->monsig = 1UL << signum; /* give mask to tape handler */ X linktp->montask = FindTask(0); /* tell it where I am also */ X X printf("%s Unit-%X LU-%X\n",linktp->driver,*(linktp->unit), X *(linktp->Lun)>>5); X X if(linktp->inquiry[8] != '\0') printf("Drive: %s\n",linktp->inquiry+8); X if(linktp->inquiry[0] == 0x01) X printf("Sequential Access\n"); X else if (linktp->inquiry[0] == 0x10) X printf("Direct Access\n"); X else if (linktp->inquiry[0] == 0x7f) X printf("BAD LOGICAL UNIT NUMBER\n"); X else printf("Device type = %X\n",linktp->inquiry[0]); X X if(linktp->badparm) printf("ERROR(S) IN STARTUP\n"); X X if(linktp->sense) X printf("Last sense= %s, other=%02X,%02X\n",linktp->sense,linktp->xsns1, X linktp->xsns2); X printf("Use ^C to terminate TapeMon\n%s\n",linktp->version); X X /* Set the monitor priority to the same as that of the handler */ X oldpri = SetTaskPri (linktp->montask, (long)tapeproc->tc_Node.ln_Pri); X X /* The main loop. Wait for a signal from the handler, then print the X contents of dbb. Some extra handshaking must then be done to sync X the two processes and prevent races. If a control-C occurs during X a Wait, then finish whatever was in progress before ending the loop. X */ X X while(run) { X x=Wait(linktp->monsig | SIGBREAKF_CTRL_C); /* Wait for req from hndlr */ X if (x & SIGBREAKF_CTRL_C) run = 0; X if(!(x & linktp->monsig) ) continue; X X printf(" %s",linktp->dbb); /* print handler's message */ X if(fullsense && linktp->sns) { /* If sense info */ X for(ii=0; ii<32; ii++) /* print all sense info */ X printf(" %02X",linktp->sns[ii]); X printf("\n"); X } X X Signal(tapeproc, linktp->handsig); /* tell it we are 'done' */ X X x=Wait(linktp->monsig | SIGBREAKF_CTRL_C); /* Wait for ack of 'done' */ X if (x & SIGBREAKF_CTRL_C) run = 0; X if(!(x & linktp->monsig) ) Wait(linktp->monsig); X X Signal(tapeproc, linktp->handsig); /* Ack his ack */ X } X X /* Clean up and exit */ X X SetTaskPri(linktp->montask, (long) oldpri); /* restore priority */ X linktp->montask = NULL; /* break link with handler */ X linktp->monsig = 0; X FreeSignal((ULONG)signum); X printf("TapeMon terminated\n"); X exit(0); X} X X/**************************************************************************/ X/* toUPPER: convert string to upper case */ X Xvoid toUPPER(char *zz) X{ X for(; *zz != '\0'; zz++) if(*zz >= 'a') *zz -= 0x20; X return; X} END_OF_FILE if test 5030 -ne `wc -c <'tapemon.c'`; then echo shar: \"'tapemon.c'\" unpacked with wrong size! fi # end of 'tapemon.c' fi if test -f 'tapemon.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'tapemon.doc'\" else echo shar: Extracting \"'tapemon.doc'\" \(6589 characters\) sed "s/^X//" >'tapemon.doc' <<'END_OF_FILE' X**** TapeMon: a monitor program for BTNtape handler **** X**** Version 2.0 03/29/91 **** X**** Freeware by Bob Rethemeyer (DrBob@cup.portal.com) **** X**** (c) Copyright 1990,1991 Robert Rethemeyer **** X XTapeMon is an optional companion program to the BTNtape SCSIdirect Xtape handler. Since the handler cannot directly inform you of what Xit is doing, TapeMon, running in a separate CLI, communicates with Xthe handler and prints information for you. Think of it as a window Xinto the handler. X XTo run TapeMon, bring up a separate CLI window. Enter "TapeMon" or X"TapeMon [name]", where [name] is the name of the handler device process. XIf you do not enter the name, the monitor will default to using "TAPE:". X XThe handler must be loaded and running for TapeMon to work, otherwise Xit prints a message and immediately quits. If you have mounted the Xtape handler but not accessed the tape yet, the handler is not yet loaded, Xand TapeMon will give up. To avoid this, invoke TapeMon after starting Xtape access, or use "Mount = 1" in your mountlist entry. X XOnce the handler is loaded and running, you may invoke or terminate Xthe monitor at any time (but only one TapeMon may run at a time). XTo terminate the monitor, enter control-C from the TapeMon CLI window, Xor send a BREAK command from another CLI. X XIf the handler encounters a tape error, it remembers the data returned Xby SENSE. When TapeMon is started, it prints the retained sense data. XSo if you weren't running TapeMon at the time an error occurs, you can Xstill see the sense data by starting TapeMon after the fact. X XTapeMon accepts a second command line argument as a flag to print all Xthe sense information when a sense occurs. The value of the second Xargument is ignored, but if it is present, complete sense is printed. XExample: TAPEMON TAPE: XYZ XThe presense of the XYZ will cause the sense message to also print X32 bytes of hex sense information as it is returned from the drive. X XTapeMon output is to stdout, so you may redirect it if you like. XExample: TAPEMON >filename X X XMESSAGES X XThe following summarizes the messages from the handler/monitor: X X Drive: ............ shows the manufacturer, model, and ROM version X of the drive. This is the data returned by the X drive with the SCSI INQUIRY command. X X Sequential Access One of the first two messages is printed to show X Direct Access which type of drive you have. The third message X BAD LOGICAL UNIT NUMBER is printed if you use the wrong LU number. X X TAPE: Opened at block x printed when the TAPE: file is opened by DOS. X x is the first block number of the file. X For sequential tapes, block numbers are relative X to the beginning of the file (not necessarily X the beginning of the tape). X X Closed at block x printed when the TAPE: file is closed by DOS. X x is the next available block. X X Writing block x * n printed when a tape write is started by the X handler. x = block number. n = number of blocks X (fixed block mode, VB-0), or number of bytes X (variable block mode, VB-1). X X Reading block x * n printed when a tape read is started by the handler. X X Writing filemark printed when TAPE: is closed in write mode, X sequential drives only. X X Unsupported_pkt= x printed when DOS sends a packet which the handler X rejects. Example: 25 for the INFO command. X X Function/mode error the application attempted a Read() while opened X in write mode, or a Write() while in read mode. X X Rewinding printed when handler starts a tape rewind X X Skipping n file(s) printed when TAPE:num form is used to skip over X filemarks (sequential drives only). X X Raw command printed when handler receives a raw command request X X Mode Select block size x printed when handler detects that drive block size X is not equal to BS, and a Mode Select is issued X to correct it. X X User Mode-Select printed when handler passes the user mode-select X request on to the drive. X X Sense: ????? other=yy,zz printed when the handler issues SENSE to the tape X drive due to a "check condition" (error). X ????? is the sense key meaning. Filemark and X end-of-tape are identified separately. yy,zz is the X additional sense code from bytes 12 and 13 of the X sense data (some drives provide this). If complete X sense was selected by TapeMon arg2, 32 additional X bytes will be printed representing the exact data X returned by the drive for the sense. X X Last sense= ?????, yy,zz retained sense data printed at TapeMon startup X X ERROR(S) IN STARTUP printed when the handler detects an unrecognized X parameter in the mountlist Startup statement. X X SCSI ????? ERROR printed when the scsidirect driver detects an X error (io_Error != 0). ????? is the error meaning. X X Capacity: xxxx blocks (for the 3M drive only) printed at Open() time X to show the number of blocks available on the X tape volume. If this number is huge, your X 3M drive may not support the READ_CAPACITY X command- don't worry about it. X X Time to insert tape# x printed when EOT requester is displayed X X Can't get memory for tape buffers printed for Open() attempts when not X enough memory is available for buffers. X Try a smaller number for NB. X X XHOW IT WORKS X XTapeMon finds the tape handler process and locates a common Xdata structure attached to it. The monitor waits for signals from the Xhandler. The handler detects the presence of the monitor and signals Xit when a message needs to be printed. A break signal causes the monitor Xto disconnect itself from the handler and terminate. X END_OF_FILE if test 6589 -ne `wc -c <'tapemon.doc'`; then echo shar: \"'tapemon.doc'\" unpacked with wrong size! fi # end of 'tapemon.doc' fi if test -f 'tapemon.lmk' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'tapemon.lmk'\" else echo shar: Extracting \"'tapemon.lmk'\" \(247 characters\) sed "s/^X//" >'tapemon.lmk' <<'END_OF_FILE' X# SAS/LATTICE MAKEFILE FOR TAPE MONITOR v2.0 X XCFLAGS= -b1 -mat -cakfsu -j132i X XLIBS=LIB:lc.lib+LIB:amiga.lib X Xtapemon : tapemon.o X blink FROM LIB:c.o+tapemon.o TO $@ SC SD LIB $(LIBS) X Xtapemon.o : tapemon.c /tplink.h X LC $(CFLAGS) tapemon.c X END_OF_FILE if test 247 -ne `wc -c <'tapemon.lmk'`; then echo shar: \"'tapemon.lmk'\" unpacked with wrong size! fi # end of 'tapemon.lmk' fi if test -f 'tapemon.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'tapemon.uu'\" else echo shar: Extracting \"'tapemon.uu'\" \(11690 characters\) sed "s/^X//" >'tapemon.uu' <<'END_OF_FILE' Xbegin 666 tapemon XM```#\P`````````"``````````$```=X```!(P```^D```=X2.=^_B1()`!)+ XM^0`````L>``$1_D```(<<@`@/````)Q@`B;!4<C__"E/`EPI3@)40JP"6'``A XM(CP``#``3J[^SD/Z`:AP`$ZN_=@I0`2(9@9P9&```2PF;@$4*6L`F`)02JL`; XMK&<``)(@#Y"O`#@&@````(`I0`(@(&L`K-'(T<@B:``0T\G3R2`"<@`2&2E)( XM`F30@5Z``D#__"E``FQ(YT!`(CP``0`!3J[_.DS?`@)*@&8,(#P```/H+P!GU XM``$<($`I0`)H(`)3@-2!$;(``"`"4X)1R/_V$;P`("`"4X(1O``B(`(1L2``Y XM(`%1RO_X$+P`(B\(8'@I:P`Z`B!P?U*`T:P"($'K`%Q.KOZ`0>L`7$ZN_HPIY XM0`)8+P`D0"`J`"1G&"QL!(@@0"(H``!.KO^@*4`"4"(`3J[_@B(J`"!G&B0\J XM```#[4ZN_^(I0`)@9PKEB"!`)V@`"`"D(&P"6"\(2&P"'"!H`"0I:``$`F1.U XMN@9B3KH,>G``8`0@+P`$+FP"7"\`("P"2&<$($!.D$ZZ%<I.N@9`2JP"6&<J3 XM+&P$B"(L`F!G!$ZN_]PB+`)09P1.KO^F+'@`!$ZN_WPB;`)83J[^AF`2("P") XM;&<,(FP":"QX``1.KO\N(FP$B$ZN_F(@'TS??WY.=61O<RYL:6)R87)Y````Q XM3E7_W+_L`B!E`!&J2.<G,BXM``AZ`4*M_^1(>@,@3KH&*%A/<`&^@&\Z(FT`, XM#"!I``0O""M(__1A``5*6$\@;?_T2AAF_%.(D>W_]"`((FW_]-/`4XDK2?_P9 XM<#JP$68,0A%@"$'Z`R(K2/_T<`*^@&\&<`$K0/_D(FW_]"QX``1.KO[:)D`@& XM"V88+RW_]$AZ`OY.N@8<2'@`'DZZ%GA/[P`,)&L`6"`*9A)(>@+Z3KH%F$AXN XM`!].NA9<4$\O*@`,+PLO+?_T2'H#)$ZZ%#I/[P`0(%)#^@,N$!BP&68&2@!F@ XM]F<8+RW_]$AZ`R9.N@7"2'@`($ZZ%AY/[P`,2JH`*&<22'H#-$ZZ!4!(>``A@ XM3KH6!%!/2JH`(&822'H#0$ZZ!2A(>``B3KH5[%!/</\L>``$3J[^MAM`_]\,= XM``#_9A)(>@,R3KH%`DAX`"-.NA7&4$]P`!`M_]]R`>&A)4$`))/)+'@`!$ZNL XM_MHE0``H(&H`%")J`!AP`!`1ZH`O`"\0+RH`"$AZ`Q9.NA-\3^\`$"!J`"Q0W XMB$H09PPO"$AZ`Q).N@4.4$\@:@`L<`&P$&8,2'H#"DZZ!))83V`T<!"P$&8,0 XM2'H##$ZZ!(!83V`B<'^P$&8,2'H#"DZZ!&Y83V`0<``0$"\`2'H#$DZZ$QI0B XM3THJ`#9G"DAZ`Q1.N@1,6$\@*@`P9QYR`!(J`#1T`!0J`#4O`B\!+P!(>@,(G XM3KH2Z$_O`!`O*@`$2'H#&DZZ!()03W``$"L`"2)J`"@L>``$3J[^U!M`_]Y*9 XMA6<``+0@*@`D`$`0`"QX``1.KO["+``(!@`,9P)Z`"`&P*H`)&?8+RH`'$AZ5 XM`NY.N@0V4$]*K?_D9SI*J@`09S1"K?_@("W_X'(@L(%L'"!J`!#1P'``$!`O: XM`$AZ`L).NA)<4$]2K?_@8-I(>@*X3KH#CEA/(DL@*@`@+'@`!$ZN_KP@*@`D2 XM`$`0`$ZN_L(L``@&``QG`GH`(`8B*@`DP(%F!B`!3J[^PB)+("H`($ZN_KQ@" XM`/]*<``0+?_>(FH`*"QX``1.KO[40JH`*$*J`"1P`!`M_]].KOZP2'H"2DZZL XM`QY"ETZZ$^1,[4SD_\!.74YU*BHJ($)43BU487!E($AA;F1L97(@)B!-;VYI? XM=&]R("HJ*@JI($-O<'ER:6=H="`Q.3DP+#$Y.3$@4F]B97)T(%)E=&AE;65YC XM97(*`%1!4$4``%!R;V-E<W,@)7,@;F]T(&9O=6YD+@H``$YO(&QI;FMA9V4@? XM<W1R=6-T=7)E+BXN"B!W<F]N9R!P<F]C97-S+"!O<@H@:&%N9&QE<B!N;W0@W XM86-T:79E('EE=#\*```E<SH@4')O8R`E6"!$979.;V1E("58"@!487!E2&%NG XM9&QE<@!0<F]C97-S("5S(&1O97-N)W0@;&]O:R!L:6ME($)43BU487!E"@``Q XM5&AE<F4@:7,@86QR96%D>2!A(%1A<&5-;VX@<G5N;FEN9PH`2&%N9&QE<B!H\ XM87,@;F\@<VEG;F%L"@``56YA8FQE('1O(&%L;&]C871E('-I9VYA;"!F;W(@= XM5&%P94UO;@H``"5S("!5;FET+258("!,52TE6`H`1')I=F4Z("5S"@``4V5Q4 XM=65N=&EA;"!!8V-E<W,*``!$:7)E8W0@06-C97-S"@``0D%$($Q/1TE#04P@' XM54Y)5"!.54U"15(*``!$979I8V4@='EP92`]("58"@!%4E)/4BA3*2!)3B!3! XM5$%25%50"@``3&%S="!S96YS93T@)7,L(&]T:&5R/24P,E@L)3`R6`H``%5S8 XM92!>0R!T;R!T97)M:6YA=&4@5&%P94UO;@HE<PH`("5S`"`E,#)8``H`5&%PX XM94UO;B!T97)M:6YA=&5D"@"_[`(@90`,*B\+)F\`"!`39PYR8;`!901R(),3B XM4HM@[B9?3G5(YS`R+&\`."!O`!@B;P`<)&\`("9O`"0@+P`H(B\`+"0O`#`FT XM+P`T3J[^I$S?3`Q.=0``3G5.=4CG!S`N+P`8)F\`'"PO`"`O!TZZ%6A83R1`: XM(`IF!'#_8#8(*@`#``-G$$AX``)"IR\'3KH/@$_O``PO!B\++RH`!$ZZ$41/" XM[P`,*@!*K`(T9P1P_V`"(`5,WPS@3G4``````````'!A2.<#$"9O`!`@2TH81 XM9OQ3B)'++`A^`!X;2H=G+E.L`$9M$B!L`#Y2K``^(`<0@'(`$@!@X"`'<@`2: XM`$AL`#HO`4ZZ"#Y03R(`8,I(;``Z2'C__TZZ""Q03R`&3-\(P$YU````````Z XM<&%.5?_<2.</,"9M``A\`$'M``PK2/_R'AM*!V<``/)P);X`9@``N!X;<``0_ XM!P1``&1G4`1```QG%E=`9P9;0&<.8&@@;?_R)%@K2/_R8$X@;?_R*!@K2/_R] XM1>W_['H'2H5K%B`$<@_`@4'Z`+S1P!204XKHA%.%8.9"+?_M1>W_Y6`:(&W_> XM\B@8*TC_\B\$2&W_Y4ZZ"\103T7M_^4O"DZZ_OA83]R`8`#_;E*&4ZP`1FT43 XM(&P`/E*L`#X@!Q"`<@`2`&``_U)P`!`'2&P`.B\`3KH'1E!/(@!@`/\\4H93R XMK`!&;10@;``^4JP`/B`'$(!R`!(`8`#_('``$`=(;``Z+P!.N@<44$\B`&``; XM_PI(;``Z2'C__TZZ!P`@!DSM#/#_Q$Y=3G4P,3(S-#4V-S@Y04)#1$5&``!.` XM5?_$2.<G,"9M``@D;0`,?@!\`'H`<``;?``@__MR`"M!__9T_RM"__)![?_0, XM&T#_\1M`__PK0?_D*T'_Z"M(_\P0$V<L<@`2``1!`"!G%%=!9Q1106<(54%FK XM%GX!8`Y\`6`*>@%@!AM\``'__%*+8-`0$W(PL`%F!E*+&T'_^W`JL!-F#"!2! XM6)(K4/_V4HM@#DAM__8O"TZZ"KY03]?`$!-R+K`!9B)2BW`JL!-F#"!26)(K^ XM4/_R4HM@#DAM__(O"TZZ"I103]?`$!-R;+`!9@H;?``!__%2BV`(<FBP`68"J XM4HL0&W(`$@`;0/_P!$$`4&<``6Q106<``7H$00`+9P`"!E-!9R0$00`+9P`!) XM#E-!9P`!3%=!9P`!ME5!9P``X%=!9P`!3F```?1*+?_Q9P@@4EB2(!!@!B!2& XM6)(@$"M`_^QL"G(!1*W_["M!_^@@+?_H9P1R+6`*2@9G!'(K8`)R(!M!_]!R9 XM`!(&@(%R`!(%@(%G"%*M_\Q2K?_D+RW_["\M_\Q.N@C\4$\K0/_(("W_\DJ`1 XM:@9R`2M!__(@+?_((BW_\I*`2.T``O_$;S0@;?_,T<$O`"\(+RW_S$ZZ"Y1/P XM[P`,<``0+?_[(BW_Q"!M_\Q@`A#`4X%D^B`M__(K0/_(T:W_Y$'M_]`K2/_,\ XM2@=G``$P&WP`(/_[8``!)DHM__%G""!26)(@$&`&(%)8DB`0*T#_[&``_V1*8 XM+?_Q9P@@4EB2(!!@!B!26)(@$"M`_^Q*+?_\9Q(@;?_,$/P`,'(!*T'_Y"M(4 XM_\PO`"\M_\Q.N@A@4$\K0/_(8`#_,B`M__)*@&H&<`@K0/_R&WP``?_Q2BW_] XM\6<((%)8DB`08`8@4EB2(!`K0/_L2BW__&<6(&W_S!#\`#`0_`!X<@(K0?_D^ XM*TC_S"\`+RW_S$ZZ"$103RM`_\@(+0`%__!F`/[02&W_T$ZZ!R!83V``_L(@P XM4EB2(E`K2?_,9@A!^@#8*TC_S"!M_\Q*&&;\4XB1[?_,*TC_Y"`M__)*@&LF; XML<!O(BM`_^1@''`!*T#_Y"!26)(@$!M`_]!"+?_18`9P`&```(P@+?_D(BW_` XM]K*`;`AT`"M"__9@!)&M__9*!V<V4ZW_Y&T8<``@;?_,$!@O`"M(_\P@;0`09 XM3I!83V#B4ZW_]FU(<``0+?_[+P`@;0`03I!83V#H4ZW_]FT2<``0+?_[+P`@; XM;0`03I!83V#H4ZW_Y&T8<``@;?_,$!@O`"M(_\P@;0`03I!83V#B(`M,WPSDY XM3EU.=0``3E7_]$CG`3`F;0`()&T`#"MM`!#_]AX:2@=G-'`EO@!F(K`29@12V XMBF`:+PM(;?_V+PIA`/P43^\`#"M`__IG!"1`8-)P`!`'+P!.DUA/8,9,WPR`< XM3EU.=4Y5_^Q(YR$R)FT`"`RL````(`/J;```TA`3<B"P`6<,<@FP`6<&<@JPZ XM`68$4HM@Z!`39P``M"(L`^KE@5*L`^I![`/RT<$D2'(BL`%F<E*+($LDB"M(^ XM_^P0$W(BL`%G4'(JL`%F/E*+<``0$P1``$5G"`1```EG$&`<(&W_[!#\`!<KI XM2/_L8!@@;?_L$/P`"BM(_^Q@"B!M_^P0TRM(_^Q2BV"T(&W_[!#;*TC_[&"HT XM4HL@;?_L0A@K2/_L8`#_3B2+$!-G%G(@L`%G$'()L`%G"G(*L`%G!%*+8.9*E XM$V8"8`9"&V``_R8@+`/J9@8@;`)88`1![`/R*4@#[DJ`9GQ#^@$V3>P#L"S9' XM+-DLV2S9/)$B;`)8(&D`)$AX`"@O*``$2&P#L$ZZ!/1/[P`,0>P#L"(()#P`/ XM``/N+&P$B$ZN_^(I0`)T*4`"?'(0*4$">"E``H0I00*`Y8`K0/_PD\DL>``$\ XM3J[^VB!M__`B0"-H``@`I'X`*T#_]&`\+&P$B$ZN_\HI0`)T3J[_Q"E``GQ!0 XM^@"X(@@D/````^U.KO_B*4`"A$J`9@Y!^@"B(@A.KO_B*4`"A'X0(`<`0(`!_ XM@:P"<"`'`$"``H&L`G@`K```@`,"@$JL`(!G!'``8`8@/```@``N`$*L`#0@C XM!P!```$I0``P<`$I0`!6(`<`0``"*4``4G`"*4``>"`'`$``@"E``'1!^@PBU XM*4@"3"\L`^XO+`/J3KKQXD*73KH(\$SM3(3_V$Y=3G5C;VXZ,3`O,3`O,S(P$ XM+S@P+P`J`$Y)3#H`````````````````````````````````````````````- XM<&$O"R9O``A*JP`49PP(*P`#`!MF!'``8#0O+`(83KH'QEA/)T``!"=``!!F< XM"G`,*4`$A'#_8!8G;`(8`!1P\\&K`!AP`"=```PG0``()E].=0``````````> XM`````$Y5_^Q(YR\0+BT`""9M``PH!W`QP*L`&&<&</]@``)D""L`!P`:5L!$A XM`$B`2,`L`$JK`!1F``"`""L``@`;9G9P`"=```QR_[Z!9P`"-B\+3KK_4EA/# XM2H!G#`CK``4`&W#_8``"'@CK``$`&TH&9PX@*P`4(@!$@2=!``Q@""`K`!0G[ XM0``,4ZL`#&T2(&L`!%*K``0@!Q"`<@`2`&`2(`=R`!(`+PLO`6$`_U903R(`> XM(`%@``'.""L``@`;9UAP_[Z`9@9P`&```;H@!QM`__]*!F<B<`J^@&8<<`(OW XM`$AZ`:HO*P`<*T#_\$ZZ]BQ/[P`,*@!@&G`!+P!(;?__+RL`'"M`__!.NO80& XM3^\`#"H`?O]@``#<".L``0`;2@9G3G#_OH!G2%2K``QR"KZ!9B(@:P`$4JL`W XM!!"\``TB*P`,2H%K"B\++P!A`/ZV4$]2JP`,(&L`!%*K``0@!Q"`("L`#$J`$ XM:@8@!V```1A^_R`K``20JP`0*T#_\&=R""L`!@`:9U)(>``"0J<O*P`<3KH%4 XM/$_O``PK0/_L2@9G.%.M_^QM,D*G+RW_["\K`!Q.N@4<2'@``4AM__TO*P`<, XM3KH#_$_O`!A*K`(T9@H0+?_]<AJP`6?(+RW_\"\K`!`O*P`<3KKU-$_O``PJN XM`&`">@!P_[J`9@@(ZP`%`!M@#+JM__!G!@CK``0`&TH&9PXB*P`4)`%$@B="! XM``Q@&`@K``(`&V<(<@`G00`,8`@B*P`4)T$`#"!K`!`G2``$OH!G*E.K``QMZ XM$B!K``12JP`$(`<0@'(`$@!@$B`'<@`2`"\++P%A`/V<4$\B`'`PP*L`&&<$M XM</]@#'#_N(!F!'``8`(@!$S?"/1.74YU#0H`````2.<'`"XO`!`@+```4X`L\ XM`$I&:S`@!DC`YX!![`)P*C`(`$H%9QH(!0`$9A0@!DC`YX!![`)P+S`(!$ZZ# XM!N!83U-&8,PO!TZZ[>183TS?`.!.=0``````````<&$N;`)<3KH&WDAY````, XM%$ZZ!5```````````'!A2.<@,"9O`!`D2Q`29R1R`!(`0>P!%0@P``$8`&<*+ XM<@`2`'0@DH)@!'(`$@`4@5**8-@@"TS?#`1.=0``````````<&%.5?_X2.<## XM,"9M``@D;0`,+BT`$"!*2AAF_%.(D<HL""!+2AAF_%.(D<L@"")+T\`K2?_XD XMO(=C`BP'(`8@2F`"$MA3@&3Z(&W_^$(P:``@"TS?#,!.74YU("\`""!O``1.. XM5?_T(D]R"DZZ!R`&00`P$L%*@&;P(`D0X;_)9OI"$)"/3EU.=0``("\`""!O5 XM``1.5?_T(D\B``)!``<&00`P$L'FB&;P(`D0X;_)9OI"$)"/3EU.=0``,#$RY XM,S0U-C<X.6%B8V1E9B`O``@@;P`$0^\`!#(``D$`#Q+[$-SHB&;R(`DB#UB!G XM$.&RB6;Z0A"0@4YU("\`""!O``1.5?_T(D]L!A#\`"U$@'(*3KH&?`9!`#`2A XMP4J`9O`0X;_)9OI"$"`(3EV0KP`$3G4@;P`$(DAR`'``+P(,$``K9P8,$``MR XM9@)22!`8!```,&T2#```"6X,)`'E@=*"TH'2@&#F#!$`+68"1($D'R`(4X`@+ XM;P`(((&0B4YU3E7_Z$CG`3(N+0`,2H=N!G#_8```TG`(OH!D`BX`(`=6@"X`B XM`D?__"1M``@@+0`(T(??K``40>P`$"90*T#_\"M(__0@"V<``)`@2R`K``31( XMP$CM`0#_[")M__"WR6,0)(LE1P`$+&W_]"R*<`!@=K?)9AHL4R2.("L`!"(`; XMTH<E00`$+&W_]"R*<`!@6+7(9`B?K``4</]@3+7(9BH@$V<,L\!C")^L`!1PP XM_V`XWZL`!"`39PZSP&8*("D`!-&K``0FD7``8!XK2__T*VW_[/_H)E-@`/]N[ XM(&W_]""*0I(E1P`$<`!,WTR`3EU.=0``````````<&%(YP<P+B\`&"9O`!PL, XM+P`@+P=.N@;$6$\D0"`*9@1P_V`>+P8O"R\J``1.N@-X3^\`#"H`2JP"-&<$] XM</]@`B`%3-\,X$YU```O!RXO``A2K`1T4ZP`1FT2(&P`/E*L`#X@!Q"`<@`2F XM`&`4(`=R`!(`2&P`.B\!3KKYS%!/(@`N'TYU3E4``"\+)FT`"$*L!'1(;0`,Z XM+PM(>O^P3KKV@$AL`#I(>/__3KKYG"`L!'0F;?_\3EU.=0``(&\`!")O``@@^ XM+P`,;Q:SR&4,T<#3P!,@4X!F^DYU$MA3@&;Z3G4``$CG`#(F;`1X(`MG%"13E XM(DL@*0`(+'@`!$ZN_RXF2F#HD<@I2`1\*4@$>$S?3`!.=4CG#Q`N+P`8+"\`6 XM'"HO`"`O!TZZ!;183R9`(`MF!'#_8!XO!2\&+RL`!$ZZ`?1/[P`,*`!*K`(T] XM9P1P_V`"(`1,WPCP3G4``````````'!A2.<!,BXO`!1P#-Z`(`=R`"QX``1.3 XMKO\Z)D`@"V8$<`!@."='``A%[`1X(&H`!"=(``21R":(2I)F`B2+("H`!&<$! XM(D`BBR5+``1*K``$9@0I2P`$0>L`#"`(3-],@$YU````````````````2.<#K XM,"XO`!1*AVX&<`!@``"D<`B^@&0"+@`@!U:`+@`"1__\1>P`$"92(`MG0"`KI XM``2PAVTRL(=F#"!3)(B?K``4(`M@;B`K``20AW((L(%E%B!+T<<DB"1()),E] XM0``$GZP`%"`+8$PD2R938+P@!R(L`(30@5.`3KH"HB(L`(1.N@)Z+`!0AB`&% XM5H`L``)&__PO!DZZ_OY83R9`(`MG$B\&+PM.NOR6+H=A`/]44$]@`G``3-\,) XMP$YU``````````!P84CG`Q`N+P`01^P`&"`+9S0(*P`"`!MF*`@K``$`&V<@( XM("L`!)"K`!`L`$J&9Q(O!B\K`!`O*P`<3KKNDD_O``PF4V#(+P=.NOG\6$],] XMWPC`3G4``$CG-Q(N+P`@)F\`)"PO`"A*K`),9P1.N@0<0JP"-"(')`LF!BQLR XM!(A.KO_0*@!P_[J`9@Y.KO]\*4`"-'`%*4`$A"`%3-]([$YU``!(YS\"+B\`N XM("PO`"0J+P`H2JP"3&<$3KH#T$*L`C0@!5.`(@<D!B8`+&P$B$ZN_[XH`'#_S XMN(!F#DZN_WPI0`(T<!8I0`2$(`5*@&<*4X!G"E.`9PQ@&"`&8!0@!-"&8`XB_ XM!W0`)@(L;`2(3J[_ODS?0/Q.=4CG-Q(N+P`@)F\`)"PO`"A*K`),9P1.N@-<Q XM0JP"-"(')`LF!BQL!(A.KO_6*@!P_[J`9@Y.KO]\*4`"-'`%*4`$A"`%3-](X XM[$YU``!(YP$"+B\`#$JL`DQG!$ZZ`Q@B!RQL!(A.KO_<<`!,WT"`3G5.5?^HH XM2.<!$D/Z`)!P`"QX``1.KOW8)D`@"V8*2'@`%$ZZ^)Y83WX`(&P"9!XH__\@F XM!T/M_[!@`A+84X!D^D(U>+!![?^P*4@`E"\+2'@`*$AX`/IP`"\`+P!(;`"PR XM<@`O`4AL`)PO`4ZZ[*9(>``43KKX3DSM2(#_G$Y=3G4J*B!3=&%C:R!/=F5R. XM9FQO=R`J*@``15A)5```:6YT=6ET:6]N+FQI8G)A<GD`````````<&%(YS``< XM)``F`4A"2$/$P<;`P,'40TA"0D+0@DS?``Q.=4J`:@``'D2`2H%J```,1(%A: XM```@1(%.=6$``!A$@$2!3G5*@6H```Q$@6$```9$@$YU+P)(030!9@``(DA`@ XM2$%(0C0`9P``!H3!,`)(0#0`A,$P`DA",@(D'TYU+P-V$`Q!`(!D```&X9E1< XM0PQ!"`!D```&Z9E90PQ!(`!D```&Y9E50TI!:P``!N.94T,T`.:H2$)"0N:J[ XM2$.`P38`,`(T`TA!Q,&0@F0```A30]"!9/YR`#(#2$/GN$A`P4$F'R0?3G5.T XM5?^82.<S,GX`(&P"9!XH__]P3[Z`;P(N`"`'0^W_KV`"$MA3@&3Z0C5XKY/), XM+'@`!$ZN_MHF0"`K`*QG2.6`)$`L*@`X2H9F!"PK`*!*AF<T(@9!^@"V)`AVV XM"RQL!(A.KO_0($=2AR`(&[P`"@BO(@9![?^O)`@F!RQL!(A.KO_0</]@4D/ZD XM`)!P`"QX``1.KOW8*T#_FF8$</]@.D'M_Z\I2`#D+RW_FDAX`#Q(>`#Z<``OK XM`"\`2&P!`$AL`.Q(;`#80J=.NNJP3^\`)%.`9P1P_V`"<`!,WTS,3EU.=2HJ! XM(%5S97(@06)O<G0@4F5Q=65S=&5D("HJ``!#3TY424Y510``04)/4E0`*BHJX XM($)R96%K.B``:6YT=6ET:6]N+FQI8G)A<GD````O!RXO``AP`"E``C1*AVLBM XMOJP``&P<(`?G@$'L`G!*L`@`9PX@!^>`0>P"<-'`(`A@"'`)*4`$A'``+A].9 XM=0``2.<!`G``(CP``#``+'@`!$ZN_LXN``*'```P`$J'9R!*K`),9QH@;`),S XM3I!*@&8"8`Y"K`),2'@`%$ZZ]8!83TS?0(!.=6&X3G4``````^P````"````M XM`0```!0````*`````````_(```/J````AP```"@`````````````````````P XM`````````#H```````````````````````````````````````````!<````6 XM````````````````````````````````````````````````````````````` XM``````````````````````````"`````!`#__P````X`#@``````````````> XM`/__````!``$````````&PX```"(__\````$``0````````;)`````#__P``Z XM``X`#@```````!T(`````/__````!``$``````````````#$__\````$``0`1 XM```````=)`````#__P````0`!````````!TN```````@("`@("`@("`H*"@H2 XM*"`@("`@("`@("`@("`@("`@($@0$!`0$!`0$!`0$!`0$!"$A(2$A(2$A(2$( XM$!`0$!`0$(&!@8&!@0$!`0$!`0$!`0$!`0$!`0$!`0$!$!`0$!`0@H*"@H*"V XM`@("`@("`@("`@("`@("`@("`@(0$!`0("`@("`@("`@("@H*"@H("`@("`@P XM("`@("`@("`@("`@2!`0$!`0$!`0$!`0$!`0$(2$A(2$A(2$A(00$!`0$!`00 XM@8&!@8&!`0$!`0$!`0$!`0$!`0$!`0$!`0$0$!`0$!""@H*"@H("`@("`@("4 XM`@("`@("`@("`@("`A`0$!`@```````"`````^P````%`````````0P```#XU XL````T````+P```"H````!`````$```#H````K````#H````8`````````_+X, X`` Xend Xsize 8324 END_OF_FILE if test 11690 -ne `wc -c <'tapemon.uu'`; then echo shar: \"'tapemon.uu'\" unpacked with wrong size! fi # end of 'tapemon.uu' fi if test -f 'tplink.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'tplink.h'\" else echo shar: Extracting \"'tplink.h'\" \(870 characters\) sed "s/^X//" >'tplink.h' <<'END_OF_FILE' X/* Structure shared by BTNtape and TapeMon. Version 2.0 */ X Xstruct tplink { X char *keyword; /* name "TapeHandler" */ X char *version; /* version string */ X char *driver; /* scsi driver name */ X void *devnode; /* device node address*/ X UBYTE *sns; /* sense data address */ X ULONG *unit; /* scsi unit number */ X UBYTE *Lun; /* logical unit << 5 */ X char *dbb; /* message from handler */ X ULONG handsig; /* handler sig mask */ X ULONG monsig; /* monitor sig mask */ X struct Task *montask; /* monitor task ptr */ X UBYTE *inquiry; /* inquiry data */ X char *sense; /* last sense text */ X UBYTE xsns1; /* additional byte1 */ X UBYTE xsns2; /* additional byte2 */ X UBYTE badparm; /* flag for bad startup */ X}; END_OF_FILE if test 870 -ne `wc -c <'tplink.h'`; then echo shar: \"'tplink.h'\" unpacked with wrong size! fi # end of 'tplink.h' fi echo shar: End of archive 1 \(of 2\). cp /dev/null ark1isdone MISSING="" for I in 1 2 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked both archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@uunet.uu.net>. Mail comments to the moderator at <amiga-request@uunet.uu.net>. Post requests for sources, and general discussion to comp.sys.amiga.misc.