10 REM > BLib.Net 1.03 15Mar1992
   20 :
   30 REM Network Communication Routines
   40 REM ==============================
   50 :
   60 REM Net_TxCount - Transmit with specified count and delay
   70 REM Net_Tx      - Transmit with default count and delay
   80 REM If a broadcast, fetches data from memory at Addr%
   90 REM Returns Net_Tx success value - 0=Ok
  100 REM ----------------------------------------------------
  110 DEFFNNet_TxCount(Stn%,Ctrl%,Port%,Addr%,Len%,RAddr%,Try%,Delay%):LOCAL TxErr%
  120 DEFFNNet_Tx(Stn%,Ctrl%,Port%,Addr%,Len%,RAddr%):LOCAL TxErr%,Try%,Delay%:Try%=10:Delay%=50
  130 X%?1=Port%:X%!2=Stn%:X%!4=Addr%:X%!8=Addr%+Len%:X%!12=RAddr%
  140 IFStn%=&FFFF:X%!4=Addr%!0:X%!8=Addr%!4               :REM Set broadcast data
  150 REPEAT:REPEAT:X%?0=Ctrl%:A%=&10:CALL &FFF1:UNTILX%?0 :REM Loop until Tx starts
  160   REPEAT:TxErr%=FNbyte(&32,0,0):UNTILTxErr%<&80        :REM Loop until complete
  170   IFTxErr%=&41 OR TxErr%=&42:IFTry%:A%=TIME+Delay%:REPEATUNTILTIME>A%:Try%=Try%-1
  180 UNTILNOT(TxErr%=&41 OR TxErr%=&42) OR Try%<1:=TxErr%
  190 :
  200 :
  210 REM Net_RxOpen - Open a receive block
  220 REM Returns Rx block number
  230 REM ---------------------------------
  240 DEFFNNet_RxOpen(Stn%,Port%,Addr%,Len%)
  250 X%?0=0:X%?1=&7F:X%?2=Port%:X%!3=Stn%:X%!5=Addr%:X%!9=Addr%+Len%
  260 A%=&11:CALL &FFF1:=X%?0
  270 :
  280 :
  290 REM Net_Rx - Poll receive block
  300 REM Returns TRUE if reception occured
  310 REM ---------------------------------
  320 DEFFNNet_Rx(RxNum%):=(FNbyte(&33,RxNum%,0)AND&80)<>0
  330 :
  340 :
  350 REM Net_RxRead - Read and delete Rx block
  360 REM Returns the number of bytes received
  370 REM -------------------------------------
  380 DEFFNNet_RxRead(RxNum%)
  390 X%?0=RxNum%:A%=&11:CALL &FFF1:A%=X%!9-X%!5:X%!5=0:=A%
  400 :
  410 :
  420 REM Net_RxKill - Kill an Rx block
  430 REM -----------------------------
  440 DEFPROCNet_RxKill(RxNum%):A%=FNbyte(&34,RxNum%,0):ENDPROC
  450 :
  460 :
  470 REM Net_Err - Return error string for network status code
  480 REM -----------------------------------------------------
  490 DEFFNNet_Err(A%):IFA%=0:=""
  500 =MID$("Line jammedNet errorNot listeningNo clockBad Tx blockNo reply",VALMID$("011221344254",(A%-&40)*2+1,2),VALMID$("110913081208",(A%-&40)*2+1,2))
  510 :
  520 :
  530 REM Net_Send - Send a notify string (A%=1) or remote error (A%=2)
  540 REM -------------------------------------------------------------
  550 DEFPROCNet_Send(A%,D%,A$):?X%=A%:X%!1=D%:$(X%+3)=A$:A%=&14:CALL&FFF1:ENDPRO
  560 :
  570 :
  580 REM Net_StnFixed - Returns fixed-length dotted net&station number
  590 REM Net_Stn      - If net=0, returns string stn else returns net.stn
  600 REM ----------------------------------------------------------------
  610 DEFFNNet_Stn(A%):=LEFT$(FNd0(A%DIV256,3)+".",(A%DIV256)<>0)+FNd0(A%AND255,3)
  620 DEFFNNet_StnFixed(A%):=FNd0(A%DIV256,3)+"."+FNd0(A%AND255,3)
  630 :
  640 :
  650 REM Net_StnNum - Convert dotted station string into station number
  660 REM --------------------------------------------------------------
  670 DEFFNNet_StnNum(A$)
  680 A%=INSTR(A$,"."):IFA%:=256*VALLEFT$(A$,A%-1)+VALMID$(A$,A%+1) ELSE =VALA$
  690 :
  700 :
  710 REM Net_Info - Read/Set Network information
  720 REM ---------------------------------------
  730 DEFFNNet_Info(A%,D%):?X%=A%:X%!1=D%:A%=&13:CALL&FFF1:=X%!1
  740 :
  750 :
  760 DEFFNbyte(A%,X%,Y%)=((USR&FFF4)AND&FF00)DIV256
  770 DEFFNd0(A%,N%)=RIGHT$("00000000"+STR$A%,N%)
  780 :
  790 :