home *** CD-ROM | disk | FTP | other *** search
/ kermit.columbia.edu / kermit.columbia.edu.tar / kermit.columbia.edu / trs80model1+3 / trssend.src < prev    next >
Text File  |  1984-05-27  |  16KB  |  481 lines

  1. ;    SEND COMMAND
  2. SEND:    PUSH    BC
  3.     PUSH    HL
  4.     LD    B,7AH
  5.     LD    HL,MFNBUF
  6. SEND0:    LD    (HL),20H
  7.     INC    HL
  8.     DJNZ    SEND0
  9.     POP    HL
  10.     POP    BC
  11.     LD     A,CMTXT    ; PARSE AN INPUT FILE SPEC.
  12.     LD     DE,MFNBUF    ; GIVE THE ADDRESS FOR THE FCB.
  13.     CALL   COMND
  14.     JP     KERMIT    ;  GIVE UP ON BAD PARSE.
  15. SEND1:    LD     A,CMCFM
  16.     CALL   COMND    ; GET A CONFIRM.
  17.     JP     KERMIT    ;  DIDN'T GET A CONFIRM.
  18. SEND11:    LD    HL,MFNBUF
  19.     LD    (MFNPTR),HL
  20.     CALL   MFNAME    ; HANDLE (MULTI) FILES
  21.     JR     NC,SEND14    ; GOT A VALID FILE-NAME
  22.     LD     DE,ERMS15
  23.     CALL   ERROR3    ; DISPLAY ERROR MSG.
  24.     JP     KERMIT
  25. SEND14:    CALL   INIT    ; CLEAR THE LINE AND INITIALIZE THE BUFFERS.
  26.     XOR    A
  27.     LD     (PKTNUM),A    ; SET THE PACKET NUMBER TO ZERO.
  28.     LD     (NUMTRY),A    ; SET THE NUMBER OF TRIES TO ZERO.
  29.     LD     HL,0
  30.     LD     (NUMPKT),HL    ; SET THE NUMBER OF PACKETS TO ZERO.
  31.     LD     (NUMRTR),HL    ; SET THE NUMBER OF RETRIES TO ZERO.
  32.     LD     DE,SCRNRT    ; POSITION CURSOR
  33.     CALL   PRTSTR
  34.     LD     HL,0
  35.     CALL   NOUT    ; WRITE THE NUMBER OF RETRIES.
  36.     LD     A,'1'    ; RESET TO USE SINGLE CHARACTER CHECKSUM
  37.     LD     (CURCHK),A    ; FOR STARTUP
  38.     LD     A,'S'
  39.     LD     (STATE),A    ; SET THE STATE TO RECEIVE INITIATE.
  40. ; SEND STATE TABLE SWITCHER
  41. SEND2:    LD     DE,SCRNP    ; POSITION CURSOR
  42.     CALL   PRTSTR
  43.     LD     HL,(NUMPKT)
  44.     CALL   NOUT    ; WRITE THE PACKET NUMBER.
  45.     LD     A,(STATE)    ; GET THE STATE.
  46.     CP     'D'        ; ARE WE IN THE DATA SEND STATE?
  47.     JR     NZ,SEND3
  48.     CALL   SDATA
  49.     JP     SEND2
  50. SEND3:    CP     'F'        ; ARE WE IN THE FILE SEND STATE?
  51.     JR     NZ,SEND4
  52.     CALL   SFILE    ; CALL SEND FILE.
  53.     JP     SEND2
  54. SEND4:    CP     'Z'        ; ARE WE IN THE EOF STATE?
  55.     JR     NZ,SEND5
  56.     CALL   SEOF
  57.     JP     SEND2
  58. SEND5:    CP     'S'        ; ARE WE IN THE SEND INITIATE STATE?
  59.     JR     NZ,SEND6
  60.     CALL   SINIT
  61.     JP     SEND2
  62. SEND6:    CP     'B'        ; ARE WE IN THE EOT STATE?
  63.     JR     NZ,SEND7
  64.     CALL   SEOT
  65.     JP     SEND2
  66. SEND7:    CP     'C'        ; ARE WE IN THE SEND COMPLETE STATE?
  67.     JR     NZ,SEND8    ; NO...
  68.     LD     DE,INFMS3    ; YES, WRITE "COMPLETE" MESSAGE.
  69.     LD    A,(CZSEEN)
  70.     OR     A        ;  .  .  .
  71.     JR     Z,SEND7A    ; NO.
  72.     LD     DE,INMS13    ; YES, THEN SAY "INTERRUPTED" INSTEAD.
  73. SEND7A:    CALL   FINMES
  74.     JP     KERMIT
  75. SEND8:    CP     'A'        ; ARE WE IN THE SEND "ABORT" STATE?
  76.     JR     NZ,SEND9
  77.     LD     DE,INFMS4    ; PRINT MESSAGE.
  78.     CALL   FINMES
  79.     JP     KERMIT
  80. SEND9:    LD     DE,INFMS4    ; ANYTHING ELSE IS EQUIVALENT TO "ABORT".
  81.     CALL   FINMES
  82.     JP     KERMIT
  83. ;    SEND ROUTINES
  84. ;    SEND INITIATE
  85. SINIT:    LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  86.     CP     IMXTRY    ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES?
  87.     JP     M,SINIT2
  88.     LD     DE,ERMS14
  89.     CALL   ERROR3    ; DISPLAY ERMSG
  90.     JP     ABORT    ; CHANGE THE STATE TO ABORT.
  91. SINIT2:    INC    A        ; INCREMENT IT.
  92.     LD     (NUMTRY),A    ; SAVE THE UPDATED NUMBER OF TRIES.
  93.     LD     A,'1'    ; RESET TO USE SINGLE CHARACTER CHECKSUM
  94.     LD     (CURCHK),A    ; FOR STARTUP
  95.     LD     A,(CHKTYP)    ; GET OUR DESIRED BLOCK CHECK TYPE
  96.     LD    (INICHK),A
  97.     LD     HL,DATA    ; GET A POINTER TO OUR DATA BLOCK.
  98.     CALL   RPAR    ; SET UP THE PARAMETER INFORMATION.
  99.     LD     (ARGBLK+1),A    ; SAVE THE NUMBER OF ARGUMENTS.
  100.     LD     A,(NUMPKT)    ; GET THE PACKET NUMBER.
  101.     LD     (ARGBLK),A
  102.     LD     A,'S'    ; SEND INITIATE PACKET.
  103.     CALL   SPACK    ; SEND THE PACKET.
  104.     JP     ABORT    ;  FAILED, ABORT.
  105.     CALL   RPACK    ; GET A PACKET.
  106.     JP     QUIT        ;  TRASHED PACKET DON'T CHANGE STATE, RETRY.
  107.     CP     'Y'        ; ACK?
  108.     JP     NZ,SINIT3    ; IF NOT TRY NEXT.
  109.     LD     A,(PKTNUM)    ; GET THE PACKET NUMBER.
  110.     LD     B,A
  111.     LD     A,(ARGBLK)
  112.     CP     B        ; IS IT THE RIGHT PACKET NUMBER?
  113.     RET   NZ             ; IF NOT TRY AGAIN.
  114.     INC    A        ; INCREMENT THE PACKET NUMBER.
  115.     AND    3FH        ; TURN OFF THE TWO HIGH ORDER BITS.
  116.     LD     (PKTNUM),A    ; SAVE MODULO 64 OF THE NUMBER.
  117.     LD     HL,(NUMPKT)
  118.     INC    HL        ; INCREMENT THE NUMBER OF PACKETS.
  119.     LD     (NUMPKT),HL
  120.     LD     A,(ARGBLK+1)    ; GET THE NUMBER OF PIECES OF DATA.
  121.     LD     HL,DATA    ; POINTER TO THE DATA.
  122.     CALL   SPAR    ; READ IN THE DATA.
  123.     LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  124.     LD     (OLDTRY),A    ; SAVE IT.
  125.     XOR    A
  126.     LD     (NUMTRY),A    ; RESET THE NUMBER OF TRIES.
  127.     LD    A,(INICHK)    ;GET THE AGREED UPON BLOCK-CHECK-TYPE
  128.     LD     (CURCHK),A    ; STORE AS TYPE TO USE FOR PACKETS NOW
  129.     LD     A,'F'    ; SET THE STATE TO FILE SEND.
  130.     LD     (STATE),A
  131.     CALL   GETFIL    ; OPEN THE FILE.
  132.     JP     ABORT    ;  SOMETHING IS WRONG, DIE.
  133.     RET
  134. SINIT3:    CP     'N'        ; NAK?
  135.     JP     NZ,SINIT4    ; IF NOT SEE IF ITS AN ERROR.
  136.     CALL   UPDRTR    ; UPDATE THE NUMBER OF RETRIES.
  137.     LD     A,(PKTNUM)    ; GET THE PRESENT PACKET NUMBER.
  138.     INC    A        ; INCREMENT.
  139.     LD     B,A
  140.     LD     A,(ARGBLK)    ; GET THE PACKET'S NUMBER.
  141.     CP     B        ; IS THE PACKET'S NUMBER ONE MORE THAN NOW?
  142.     RET   NZ             ; IF NOT ASSUME ITS FOR THIS PACKET, GO AGAIN.
  143.     XOR    A
  144.     LD     (NUMTRY),A    ; RESET NUMBER OF TRIES.
  145.     LD     A,'F'    ; SET THE STATE TO FILE SEND.
  146.     LD     (STATE),A
  147.     RET
  148. SINIT4:    CP     'E'        ; IS IT AN ERROR PACKET.
  149.     JP     NZ,ABORT
  150.     CALL   ERROR
  151.     JP     ABORT
  152. ;    SEND FILE HEADER
  153. SFILE:    LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  154.     CP     MAXTRY    ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES?
  155.     JP     M,SFILE1
  156.     LD     DE,ERMS14
  157.     CALL   ERROR3
  158.     JP     ABORT    ; CHANGE THE STATE TO ABORT.
  159. SFILE1:    INC    A        ; INCREMENT IT.
  160.     LD     (NUMTRY),A    ; SAVE THE UPDATED NUMBER OF TRIES.
  161.     XOR    A        ; CLEAR A
  162.     LD    (CZSEEN),A
  163.     LD     HL,DATA    ; GET A POINTER TO OUR DATA BLOCK.
  164.     LD     (DATPTR),HL    ; SAVE IT.
  165.     LD    HL,MFREQ    ;get filename
  166.     LD     (FCBPTR),HL    ; SAVE POSITION IN FCB.
  167.     LD     B,0        ; NO CHARS YET.
  168.     LD     C,0
  169. SFIL11:    LD     A,B
  170.     CP     8H        ; IS THIS THE NINTH CHAR?
  171.     JP     NZ,SFIL12    ; IF NOT PROCEED.
  172. SFL11A:    LD     A,'.'    ; GET A DOT.
  173.     LD     HL,(DATPTR)
  174.     LD     (HL),A        ; PUT THE CHAR IN THE DATA PACKET.
  175.     INC    HL
  176.     LD     (DATPTR),HL    ; SAVE POSITION IN DATA PACKET.
  177.     LD    B,8
  178.     INC    C
  179. SFIL12:    INC    B        ; INCREMENT THE COUNT.
  180.     LD     A,B
  181.     CP    0CH        ;TWELVE?
  182.     JP     P,SFIL13
  183.     LD     HL,(FCBPTR)
  184.     LD     A,(HL)
  185.     AND    7FH        ; TURN OFF CP/M 2 OR 3'S HIGH BITS.[UTK013]
  186.     INC    HL
  187.     LD     (FCBPTR),HL    ; SAVE POSITION IN FCB.
  188.     CP     '!'        ; IS IT A GOOD CHARACTER?
  189.     JP     M,SFIL13
  190.     LD     HL,(DATPTR)
  191.     CP    '/'
  192.     JP    Z,SFL11A
  193.     CP    ':'        ;drive spec?
  194.     JR    Z,SFIL13
  195. SFL12A    LD     (HL),A        ; PUT THE CHAR IN THE DATA PACKET.
  196.     INC    HL
  197.     LD     (DATPTR),HL    ; SAVE POSITION IN DATA PACKET.
  198.     INC    C
  199.     JP     SFIL11    ; GET ANOTHER.
  200. SFIL13:    LD     A,C        ; NUMBER OF CHAR IN FILE NAME.
  201.     LD     (ARGBLK+1),A
  202.     LD     HL,(DATPTR)
  203.     LD     A,'$'
  204.     LD     (HL),A        ; PUT IN A DOLLAR SIGN FOR PRINTING.
  205.     LD     DE,SCRFLN    ; POSITION CURSOR
  206.     CALL   PRTSTR
  207.     LD     DE,DATA    ; PRINT THE FILE NAME
  208.     CALL   PRTSTR
  209.     LD     A,(PKTNUM)    ; GET THE PACKET NUMBER.
  210.     LD     (ARGBLK),A
  211.     LD     A,'F'    ; FILE HEADER PACKET.
  212.     CALL   SPACK    ; SEND THE PACKET.
  213.     JP     ABORT    ;  FAILED, ABORT.
  214.     CALL   RPACK    ; GET A PACKET.
  215.     JP     QUIT        ;  TRASHED PACKET DON'T CHANGE STATE, RETRY.
  216.     CP     'Y'        ; ACK?
  217.     JP     NZ,SFILE2    ; IF NOT TRY NEXT.
  218.     LD     A,(PKTNUM)    ; GET THE PACKET NUMBER.
  219.     LD     B,A
  220.     LD     A,(ARGBLK)
  221.     CP     B        ; IS IT THE RIGHT PACKET NUMBER?
  222.     RET   NZ             ; IF NOT HOLD OUT FOR THE RIGHT ONE.
  223. SFIL14:    INC    A        ; INCREMENT THE PACKET NUMBER.
  224.     AND    3FH        ; TURN OFF THE TWO HIGH ORDER BITS.
  225.     LD     (PKTNUM),A    ; SAVE MODULO 64 OF THE NUMBER.
  226.     LD     HL,(NUMPKT)
  227.     INC    HL        ; INCREMENT THE NUMBER OF PACKETS.
  228.     LD     (NUMPKT),HL
  229.     LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  230.     LD     (OLDTRY),A    ; SAVE IT.
  231.     XOR    A
  232.     LD     (NUMTRY),A    ; RESET THE NUMBER OF TRIES.
  233. SFIL15:    XOR    A        ; GET A ZERO.
  234.     LD     (EOFLAG),A    ; INDICATE NOT EOF.
  235.     LD     A,0FFH
  236.     LD     (FILFLG),A    ; INDICATE FILE BUFFER EMPTY.
  237.     CALL   GTCHR
  238.     JP     SFIL16    ; ERROR GO SEE IF ITS EOF.
  239.     JP     SFIL17    ; GOT THE CHARS, PROCEED.
  240. SFIL16:    CP     0FFH    ; IS IT EOF?
  241.     JP     NZ,ABORT    ; IF NOT GIVE UP.
  242.     LD     A,'Z'    ; SET THE STATE TO EOF.
  243.     LD     (STATE),A
  244.     RET
  245. SFIL17:    LD     (SIZE),A    ; SAVE THE SIZE OF THE DATA GOTTEN.
  246.     LD     A,'D'    ; SET THE STATE TO DATA SEND.
  247.     LD     (STATE),A
  248.     RET
  249. SFILE2:    CP     'N'        ; NAK?
  250.     JP     NZ,SFILE3    ; TRY IF ERROR PACKET.
  251.     CALL   UPDRTR    ; UPDATE THE NUMBER OF RETRIES.
  252.     LD     A,(PKTNUM)    ; GET THE PRESENT PACKET NUMBER.
  253.     INC    A        ; INCREMENT.
  254.     LD     B,A
  255.     LD     A,(ARGBLK)    ; GET THE PACKET'S NUMBER.
  256.     CP     B        ; IS THE PACKET'S NUMBER ONE MORE THAN NOW?
  257.     RET   NZ             ; IF NOT GO TRY AGAIN.
  258.     JP     SFIL14    ; JUST AS GOOD AS A ACK; GO TO THE ACK CODE.
  259. SFILE3:    CP     'E'        ; IS IT AN ERROR PACKET.
  260.     JP     NZ,ABORT
  261.     CALL   ERROR
  262.     JP     ABORT
  263. ;    SEND DATA
  264. SDATA:    LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  265.     CP     MAXTRY    ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES?
  266.     JP     M,SDATA1
  267.     LD     DE,ERMS14
  268.     CALL   ERROR3
  269.     JP     ABORT    ; CHANGE THE STATE TO ABORT.
  270. SDATA1:    INC    A        ; INCREMENT IT.
  271.     LD     (NUMTRY),A    ; SAVE THE UPDATED NUMBER OF TRIES.
  272.     LD     HL,DATA    ; GET A POINTER TO OUR DATA BLOCK.
  273.     LD     (DATPTR),HL    ; SAVE IT.
  274.     LD     HL,FILBUF    ; POINTER TO CHARS TO BE SENT.
  275.     LD     (CBFPTR),HL    ; SAVE POSITION IN CHAR BUFFER.
  276.     LD     B,1        ; FIRST CHAR.
  277. SDAT11:    LD     HL,(CBFPTR)
  278.     LD     A,(HL)
  279.     INC    HL
  280.     LD     (CBFPTR),HL    ; SAVE POSITION IN CHAR BUFFER.
  281.     LD     HL,(DATPTR)
  282.     LD     (HL),A        ; PUT THE CHAR IN THE DATA PACKET.
  283.     INC    HL
  284.     LD     (DATPTR),HL    ; SAVE POSITION IN DATA PACKET.
  285.     INC    B        ; INCREMENT THE COUNT.
  286.     LD     A,(SIZE)    ; GET THE NUMBER OF CHARS IN CHAR BUFFER.
  287.     CP     B        ; HAVE WE TRANSFERED THAT MANY?
  288.     JP     P,SDAT11    ; IF NOT GET ANOTHER.
  289.     LD     A,(SIZE)    ; NUMBER OF CHAR IN CHAR BUFFER.
  290.     LD     (ARGBLK+1),A
  291.     LD     A,(PKTNUM)    ; GET THE PACKET NUMBER.
  292.     LD     (ARGBLK),A
  293.     LD     A,'D'    ; DATA PACKET.
  294.     CALL   SPACK    ; SEND THE PACKET.
  295.     JP     ABORT    ;  FAILED, ABORT.
  296.     CALL   RPACK    ; GET A PACKET.
  297.     JP     QUIT        ;  TRASHED PACKET DON'T CHANGE STATE, RETRY.
  298.     CP     'Y'        ; ACK?
  299.     JP     NZ,SDATA2    ; IF NOT TRY NEXT.
  300.     LD     A,(PKTNUM)    ; GET THE PACKET NUMBER.
  301.     LD     B,A
  302.     LD     A,(ARGBLK)
  303.     CP     B        ; IS IT THE RIGHT PACKET NUMBER?
  304.     RET   NZ             ; IF NOT HOLD OUT FOR THE RIGHT ONE.
  305.     LD     A,(ARGBLK)    ; GET THE PACKET NUMBER BACK
  306.     INC    A        ; INCREMENT THE PACKET NUMBER.
  307.     AND    3FH        ; TURN OFF THE TWO HIGH ORDER BITS.
  308.     LD     (PKTNUM),A    ; SAVE MODULO 64 OF THE NUMBER.
  309.     LD     HL,(NUMPKT)
  310.     INC    HL        ; INCREMENT THE NUMBER OF PACKETS.
  311.     LD     (NUMPKT),HL
  312.     LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  313.     LD     (OLDTRY),A    ; SAVE IT.
  314.     XOR    A
  315.     LD     (NUMTRY),A    ; RESET THE NUMBER OF TRIES.
  316.     LD     A,(ARGBLK+1)    ; GET THE DATA LENGTH
  317.     CP     1        ; CHECK IF ONLY 1 CHARACTER?
  318.     JP     NZ,SDAT15    ; IF NOT, JUST CONTINUE
  319.     LD     A,(DATA)    ; GOT ONE CHARACTER, GET IT FROM DATA
  320.     CP     'Z'        ; WANT TO ABORT ENTIRE STREAM?
  321.     JR     NZ,SDAT14    ; IF NOT, CHECK FOR JUST THIS FILE
  322.     LD    (CZSEEN),A
  323. SDAT14:    CP     'X'        ; DESIRE ABORT OF CURRENT FILE?
  324.     JR     NZ,SDAT15    ; IF NOT, JUST CONTINUE
  325.     LD    (CZSEEN),A
  326. SDAT15:    LD    A,(CZSEEN)
  327.     OR     A        ; CHECK IF EITHER GIVEN
  328.     JR     Z,SDAT12    ; IF NEITHER GIVEN, CONTINUE
  329.     LD     A,'Z'    ; CHANGE STATE TO EOF
  330.     LD     (STATE),A    ;  .  .  .
  331.     RET                ; AND RETURN
  332. SDAT12:    CALL   GTCHR
  333.     JP     SDAT13    ; ERROR GO SEE IF ITS EOF.
  334.     LD     (SIZE),A    ; SAVE THE SIZE OF THE DATA GOTTEN.
  335.     RET
  336. SDAT13:    CP     0FFH    ; IS IT EOF?
  337.     JP     NZ,ABORT    ; IF NOT GIVE UP.
  338.     LD     A,'Z'    ; SET THE STATE TO EOF.
  339.     LD     (STATE),A
  340.     RET
  341. SDATA2:    CP     'N'        ; NAK?
  342.     JP     NZ,SDATA3    ; SEE IF IS AN ERROR PACKET.
  343.     CALL   UPDRTR    ; UPDATE THE NUMBER OF RETRIES.
  344.     LD     A,(PKTNUM)    ; GET THE PRESENT PACKET NUMBER.
  345.     INC    A        ; INCREMENT.
  346.     LD     B,A
  347.     LD     A,(ARGBLK)    ; GET THE PACKET'S NUMBER.
  348.     CP     B        ; IS THE PACKET'S NUMBER ONE MORE THAN NOW?
  349.     RET   NZ             ; IF NOT GO TRY AGAIN.
  350.     JP     SDAT12    ; JUST AS GOOD AS A ACK; GO TO THE ACK CODE.
  351. SDATA3:    CP     'E'        ; IS IT AN ERROR PACKET.
  352.     JP     NZ,ABORT
  353.     CALL   ERROR
  354.     JP     ABORT
  355. ;    SEND EOF
  356. SEOF:    LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  357.     CP     MAXTRY    ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES?
  358.     JP     M,SEOF1
  359.     LD     DE,ERMS14
  360.     CALL   ERROR3
  361.     JP     ABORT    ; CHANGE THE STATE TO ABORT.
  362. SEOF1:    INC    A        ; INCREMENT IT.
  363.     LD     (NUMTRY),A    ; SAVE THE UPDATED NUMBER OF TRIES.
  364.     LD     A,(PKTNUM)    ; GET THE PACKET NUMBER.
  365.     LD     (ARGBLK),A
  366.     XOR    A
  367.     LD     (ARGBLK+1),A    ; NO DATA.
  368.     LD    A,(CZSEEN)
  369.     OR     A        ;  .  .  .
  370.     JR     Z,SEOF14    ; IF NOT ABORTED, JUST KEEP GOING
  371.     LD     A,'D'    ; TELL OTHER END TO DISCARD PACKET
  372.     LD     (DATA),A    ; STORE IN DATA PORTION
  373.     LD     A,1        ; ONE CHARACTER
  374.     LD     (ARGBLK+1),A    ; STORE THE LENGTH
  375. SEOF14:    LD     A,'Z'    ; EOF PACKET.
  376.     CALL   SPACK    ; SEND THE PACKET.
  377.     JP     ABORT    ;  FAILED, ABORT.
  378.     CALL   RPACK    ; GET A PACKET.
  379.     JP     QUIT        ;  TRASHED PACKET DON'T CHANGE STATE, RETRY.
  380.     CP     'Y'        ; ACK?
  381.     JR     NZ,SEOF2    ; IF NOT TRY NEXT.
  382.     LD     A,(PKTNUM)    ; GET THE PACKET NUMBER.
  383.     LD     B,A
  384.     LD     A,(ARGBLK)
  385.     CP     B        ; IS IT THE RIGHT PACKET NUMBER?
  386.     RET   NZ             ; IF NOT HOLD OUT FOR THE RIGHT ONE.
  387. SEOF12:    INC    A        ; INCREMENT THE PACKET NUMBER.
  388.     AND    3FH        ; TURN OFF THE TWO HIGH ORDER BITS.
  389.     LD     (PKTNUM),A    ; SAVE MODULO 64 OF THE NUMBER.
  390.     LD     HL,(NUMPKT)
  391.     INC    HL        ; INCREMENT THE NUMBER OF PACKETS.
  392.     LD     (NUMPKT),HL
  393.     LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  394.     LD     (OLDTRY),A    ; SAVE IT.
  395.     XOR    A
  396.     LD     (NUMTRY),A    ; RESET THE NUMBER OF TRIES.
  397.     LD     DE,FCB
  398.     CALL    @CLOSE
  399. ;* CHECK IF SUCCESSFUL
  400.     LD    A,(CZSEEN)
  401.     CP     'Z'        ; DESIRE ABORT OF ENTIRE STREAM?
  402.     JR     Z,SEOF13    ; IF SO, JUST GIVE UP NOW
  403.     CALL   MFNAME    ; GET THE NEXT FILE.
  404.     JR     C,SEOF13    ;  NO MORE.
  405.     CALL   GETFIL    ; AND OPEN IT
  406.     JP     ABORT    ;  SOMETHING IS WRONG, DIE.
  407.     XOR    A        ; CLEAR A
  408.     LD    (CZSEEN),A
  409.     LD     A,'F'    ; SET THE STATE TO FILE SEND.
  410.     LD     (STATE),A
  411.     RET
  412. SEOF13:    LD     A,'B'    ; SET THE STATE TO EOT.
  413.     LD     (STATE),A
  414.     RET
  415. SEOF2:    CP     'N'        ; NAK?
  416.     JR     NZ,SEOF3    ; TRY AND SEE IF ITS AN ERROR PACKET.
  417.     CALL   UPDRTR    ; UPDATE THE NUMBER OF RETRIES.
  418.     LD     A,(PKTNUM)    ; GET THE PRESENT PACKET NUMBER.
  419.     INC    A        ; INCREMENT.
  420.     LD     B,A
  421.     LD     A,(ARGBLK)    ; GET THE PACKET'S NUMBER.
  422.     CP     B        ; IS THE PACKET'S NUMBER ONE MORE THAN NOW?
  423.     RET   NZ             ; IF NOT GO TRY AGAIN.
  424.     JP     SEOF12    ; JUST AS GOOD AS A ACK; GO TO THE ACK CODE.
  425. SEOF3:    CP    'E'    ;ERROR PACKET?
  426.     JP    NZ,ABORT
  427.     CALL    ERROR
  428.     JP    ABORT
  429. ;    SEND EOT
  430. SEOT:    LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  431.     CP     MAXTRY    ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES?
  432.     JP     M,SEOT1
  433.     LD     DE,ERMS14
  434.     CALL   ERROR3
  435.     JP     ABORT    ; CHANGE THE STATE TO ABORT.
  436. SEOT1:    INC    A        ; INCREMENT IT.
  437.     LD     (NUMTRY),A    ; SAVE THE UPDATED NUMBER OF TRIES.
  438.     LD     A,(PKTNUM)    ; GET THE PACKET NUMBER.
  439.     LD     (ARGBLK),A
  440.     XOR    A
  441.     LD     (ARGBLK+1),A    ; NO DATA.
  442.     LD     A,'B'    ; EOF PACKET.
  443.     CALL   SPACK    ; SEND THE PACKET.
  444.     JP     ABORT    ;  FAILED, ABORT.
  445.     CALL   RPACK    ; GET A PACKET.
  446.     JP     QUIT        ;  TRASHED PACKET DON'T CHANGE STATE, RETRY.
  447.     CP     'Y'        ; ACK?
  448.     JR     NZ,SEOT2    ; IF NOT TRY NEXT.
  449.     LD     A,(PKTNUM)    ; GET THE PACKET NUMBER.
  450.     LD     B,A
  451.     LD     A,(ARGBLK)
  452.     CP     B        ; IS IT THE RIGHT PACKET NUMBER?
  453.     RET   NZ             ; IF NOT HOLD OUT FOR THE RIGHT ONE.
  454. SEOT12:    INC    A        ; INCREMENT THE PACKET NUMBER.
  455.     AND    3FH        ; TURN OFF THE TWO HIGH ORDER BITS.
  456.     LD     (PKTNUM),A    ; SAVE MODULO 64 OF THE NUMBER.
  457.     LD     HL,(NUMPKT)
  458.     INC    HL        ; INCREMENT THE NUMBER OF PACKETS.
  459.     LD     (NUMPKT),HL
  460.     LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  461.     LD     (OLDTRY),A    ; SAVE IT.
  462.     XOR    A
  463.     LD     (NUMTRY),A    ; RESET THE NUMBER OF TRIES.
  464.     LD     A,'C'    ; SET THE STATE TO FILE SEND.
  465.     LD     (STATE),A
  466.     RET
  467. SEOT2:    CP     'N'        ; NAK?
  468.     JR     NZ,SEOT3    ; IS IT ERROR.
  469.     CALL   UPDRTR    ; UPDATE THE NUMBER OF RETRIES.
  470.     LD     A,(PKTNUM)    ; GET THE PRESENT PACKET NUMBER.
  471.     INC    A        ; INCREMENT.
  472.     LD     B,A
  473.     LD     A,(ARGBLK)    ; GET THE PACKET'S NUMBER.
  474.     CP     B        ; IS THE PACKET'S NUMBER ONE MORE THAN NOW?
  475.     RET   NZ             ; IF NOT GO TRY AGAIN.
  476.     JP     SEOT12    ; JUST AS GOOD AS A ACK; GO TO THE ACK CODE.
  477. SEOT3:    CP     'E'        ; IS IT AN ERROR PACKET.
  478.     JP     NZ,ABORT
  479.     CALL   ERROR
  480.     JP     ABORT
  481.