home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-386-Vol-2of3.iso / b / baswiz19.zip / BW$BAS.ZIP / TCSEND.BAS < prev    next >
BASIC Source File  |  1993-01-29  |  6KB  |  192 lines

  1. '   +----------------------------------------------------------------------+
  2. '   |                                                                      |
  3. '   |        BASWIZ  Copyright (c) 1990-1993  Thomas G. Hanlin III         |
  4. '   |                                                                      |
  5. '   |                      The BASIC Wizard's Library                      |
  6. '   |                                                                      |
  7. '   +----------------------------------------------------------------------+
  8.  
  9.    DECLARE FUNCTION FGetError% (BYVAL Handle%)
  10.    DECLARE FUNCTION FGetLocate& (BYVAL Handle%)
  11.    DECLARE FUNCTION FGetSize& (BYVAL Handle%)
  12.    DECLARE FUNCTION FRead$ (BYVAL Handle%, BYVAL Bytes%)
  13.    DECLARE FUNCTION TCInkey$ ()
  14.    DECLARE FUNCTION TCInStat% ()
  15.    DECLARE SUB FLocate (BYVAL Handle%, Posn&)
  16.    DECLARE SUB TCFlushIn ()
  17.    DECLARE SUB TCWrite (St$)
  18.  
  19.    DECLARE FUNCTION CheckSum0$ (St$)
  20.    DECLARE FUNCTION CRC0$ (St$)
  21.    DECLARE FUNCTION TimeTick% (BYVAL Count%)
  22.  
  23.    DEFINT A-Z
  24.  
  25. SUB StartXmodemSend (Handle, Protocol$, Baud$, MaxRec, Record, EstTime$, ErrCode)
  26.    SOH$ = CHR$(1)     ' start of 128b record
  27.    STX$ = CHR$(2)     ' start of 1K record
  28.    ACK$ = CHR$(6)     ' acknowledge block
  29.    NAK$ = CHR$(21)    ' request retransmission
  30.    CNK$ = "C"         ' request CRC transmission
  31.    CAN$ = CHR$(24)    ' cancel transfer
  32.    EOT$ = CHR$(4)     ' end of transfer
  33.    ESC$ = CHR$(27)    ' keyboard cancel transfer
  34.  
  35.    Record = 1
  36.    ErrCode = 0
  37.  
  38.    IF LEN(Protocol$) = 6 THEN
  39.       BlockLen = 128
  40.    ELSE
  41.       BlockLen = 1024
  42.    END IF
  43.  
  44.    MaxRec = CINT(FGetSize&(Handle) / BlockLen + .499)
  45.  
  46.    Tim& = CSNG(VAL(LEFT$(Baud$, LEN(Baud$) - 1))) * .8
  47.    IF Tim& > 0& THEN
  48.       Tim& = CLNG(MaxRec * BlockLen) \ Tim&
  49.    ELSE
  50.       Tim& = 0&
  51.    END IF
  52.    Tim1& = Tim& \ 60&
  53.    EstTime1$ = RIGHT$("0" + MID$(STR$(Tim& - Tim1& * 60&), 2), 2)
  54.    EstTime$ = ":" + EstTime1$
  55.    Tim& = Tim1&
  56.    Tim1& = Tim& \ 60&
  57.    IF Tim1& > 0& THEN
  58.       EstTime1$ = RIGHT$("0" + MID$(STR$(Tim& - Tim1& * 60&), 2), 2)
  59.       EstTime$ = ":" + EstTime1$ + EstTime$
  60.       Tim& = Tim1&
  61.    END IF
  62.    EstTime$ = MID$(STR$(Tim&), 2) + EstTime$
  63.  
  64.    IF MaxRec = 0 THEN
  65.       Protocol$ = Protocol$ + " CHK"
  66.    ELSE
  67.       Retries = 10
  68.       DO
  69.          WaitTime = TimeTick(109)
  70.          DO
  71.             Ch$ = INKEY$
  72.          LOOP UNTIL TCInStat OR (WaitTime = TimeTick(0)) OR (Ch$ = ESC$)
  73.          RxCh$ = TCInkey$
  74.          TCFlushIn
  75.          Retries = Retries - 1
  76.       LOOP UNTIL RxCh$ = CNK$ OR RxCh$ = NAK$ OR Retries = 0 OR Ch$ = ESC$
  77.       IF Ch$ = ESC$ THEN
  78.          ErrCode = -11
  79.          TCWrite CAN$ + CAN$
  80.       ELSEIF RxCh$ = NAK$ THEN
  81.          Protocol$ = Protocol$ + " CHK"
  82.       ELSEIF RxCh$ = CNK$ THEN
  83.          Protocol$ = Protocol$ + " CRC"
  84.       ELSE
  85.          ErrCode = -1
  86.       END IF
  87.    END IF
  88. END SUB
  89.  
  90.  
  91.  
  92. SUB XmodemSend (Handle, Protocol$, MaxRec, Record, ErrCount, ErrCode)
  93.    SOH$ = CHR$(1)     ' start of 128b record
  94.    STX$ = CHR$(2)     ' start of 1K record
  95.    ACK$ = CHR$(6)     ' acknowledge block
  96.    NAK$ = CHR$(21)    ' request retransmission
  97.    CNK$ = "C"         ' request CRC transmission
  98.    CAN$ = CHR$(24)    ' cancel transfer
  99.    EOT$ = CHR$(4)     ' end of transfer
  100.    ESC$ = CHR$(27)    ' keyboard cancel transfer
  101.  
  102.    ErrCode = 0
  103.  
  104.    IF Record > MaxRec THEN
  105.       TCWrite EOT$
  106.       Tim = TimeTick(18)
  107.       DO
  108.          RxCh$ = TCInkey$
  109.       LOOP UNTIL RxCh$ = ACK$ OR Tim = TimeTick(0)
  110.       IF RxCh$ <> ACK$ THEN TCWrite EOT$
  111.       ErrCode = -10
  112.       EXIT SUB
  113.    END IF
  114.  
  115.    IF ErrCode = 0 THEN
  116.       IF MID$(Protocol$, 7, 1) = " " THEN
  117.          BlockLen = 128
  118.       ELSE
  119.          BlockLen = 1024
  120.       END IF
  121.       CRC = (RIGHT$(Protocol$, 3) = "CRC")
  122.       IF BlockLen = 128 THEN
  123.          SendRec$ = FRead$(Handle, 128)
  124.       ELSE
  125.          SendRec$ = ""
  126.          FOR tmp = 1 TO 8
  127.             IF FGetError(Handle) = 0 THEN
  128.               SendRec$ = SendRec$ + FRead$(Handle, 128)
  129.             END IF
  130.          NEXT
  131.       END IF
  132.       ErrCode = FGetError(Handle)
  133.    END IF
  134.  
  135.    IF ErrCode = 0 THEN
  136.       IF LEN(SendRec$) < BlockLen THEN
  137.          SendRec$ = SendRec$ + STRING$(BlockLen - LEN(SendRec$), 26)
  138.       END IF
  139.       IF CRC THEN
  140.          SendRec$ = SendRec$ + CRC0$(SendRec$ + STRING$(2, 0))
  141.       ELSE
  142.          SendRec$ = SendRec$ + CheckSum0$(SendRec$)
  143.       END IF
  144.       tmp = (Record AND 255)
  145.       SendRec$ = CHR$(tmp) + CHR$(tmp XOR 255) + SendRec$
  146.       IF BlockLen = 1024 THEN
  147.          SendRec$ = STX$ + SendRec$
  148.       ELSE
  149.          SendRec$ = SOH$ + SendRec$
  150.       END IF
  151.    END IF
  152.  
  153.    TCFlushIn
  154.    TCWrite SendRec$
  155.    Count = 10
  156.    DO
  157.       Tim = TimeTick(109)
  158.       DO
  159.          IF INKEY$ = ESC$ THEN
  160.             RxCh$ = CAN$
  161.          ELSE
  162.             RxCh$ = TCInkey$
  163.          END IF
  164.       LOOP UNTIL LEN(RxCh$) OR (Tim = TimeTick(0))
  165.       IF RxCh$ <> ACK$ AND RxCh$ <> NAK$ AND RxCh$ <> CAN$ THEN RxCh$ = ""
  166.       Count = Count - 1
  167.    LOOP UNTIL LEN(RxCh$) OR (Count = 0)
  168.    IF RxCh$ = CAN$ THEN
  169.       ErrCode = -11
  170.    ELSEIF RxCh$ = NAK$ THEN
  171.       ErrCode = -5
  172.    ELSEIF RxCh$ <> ACK$ THEN
  173.       ErrCode = -1
  174.    END IF
  175.  
  176.    IF ErrCode = -1 OR ErrCode = -5 THEN
  177.       ErrCount = ErrCount + 1
  178.       IF ErrCount <= 10 THEN
  179.          FLocate Handle, FGetLocate&(Handle) - CLNG(BlockLen)
  180.       ELSE
  181.          ErrCode = -12
  182.       END IF
  183.    END IF
  184.    IF ErrCode < -10 OR ErrCode > 0 THEN
  185.       TCFlushIn
  186.       TCWrite CAN$ + CAN$
  187.    ELSEIF ErrCode = 0 THEN
  188.       Record = Record + 1
  189.       ErrCount = 0
  190.    END IF
  191. END SUB
  192.