home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / archives / trs80model1and3.tar.gz / trs80model1and3.tar / trsget.src < prev    next >
Text File  |  1984-05-28  |  17KB  |  489 lines

  1. ;    RECEIVE COMMAND
  2. READ:    LD     DE,DATA    ; WHERE TO PUT THE TEXT (IF ANY.)
  3.     LD     A,CMTXT
  4.     CALL   COMND    ; GET EITHER SOME TEXT OR A CONFIRM.
  5.     JP     KERMT3    ;  DIDN'T GET ANYTHING.
  6.     OR     A        ; GET ANY CHARS?
  7.     JR     Z,READ1    ; NOPE, JUST A REGULAR SEND.
  8.     LD     (ARGBLK+1),A    ; STORE THE NUMBER OF CHARS.
  9.     EX   DE,HL               ; GET POINTER INTO HL.
  10.     LD     (HL),'$'    ; PUT IN A DOLLAR SIGN FOR PRINTING.
  11.     CALL   INIT    ; CLEAR THE LINE AND INITIALIZE THE BUFFERS.
  12.     LD     DE,SCRFLN    ; POSITION CURSOR
  13.     CALL   PRTSTR
  14.     LD     DE,DATA    ; PRINT THE FILE NAME
  15.     CALL   PRTSTR
  16.     LD     A,'1'    ; START WITH SINGLE CHARACTER CHECKSUM
  17.     LD     (CURCHK),A    ; SAVE THE TYPE
  18.     XOR    A        ; START A PACKET ZERO.
  19.     LD     (ARGBLK),A
  20.     LD     A,'R'    ; RECEIVE INIT PACKET.
  21.     CALL   SPACK    ; SEND THE PACKET.
  22.     JP     KERMT3    ;  DIE!
  23.     JP     READ12
  24. READ1:    CALL   INIT    ; CLEAR THE LINE AND INITIALIZE THE BUFFERS.
  25. READ12:    XOR    A
  26.     LD    (CZSEEN),A
  27.     LD     HL,0
  28.     LD     (NUMPKT),HL    ; SET THE NUMBER OF PACKETS TO ZERO.
  29.     LD     (NUMRTR),HL    ; SET THE NUMBER OF RETRIES TO ZERO.
  30.     LD     (PKTNUM),A    ; SET THE PACKET NUMBER TO ZERO.
  31.     LD     (NUMTRY),A    ; SET THE NUMBER OF TRIES 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,'R'
  37.     LD     (STATE),A    ; SET THE STATE TO RECEIVE INITIATE.
  38. ; RECEIVE STATE TABLE SWITCHER.
  39. READ2:    LD     DE,SCRNP    ; POSITION CURSOR
  40.     CALL   PRTSTR
  41.     LD     HL,(NUMPKT)
  42.     CALL   NOUT    ; WRITE THE CURRENT PACKET NUMBER.
  43.     LD     A,(STATE)    ; GET THE STATE.
  44.     CP     'D'        ; ARE WE IN THE DATA RECEIVE STATE?
  45.     JP     NZ,READ3
  46.     CALL   RDATA
  47.     JP     READ2
  48. READ3:    CP     'F'        ; ARE WE IN THE FILE RECEIVE STATE?
  49.     JP     NZ,READ4
  50.     CALL   RFILE    ; CALL RECEIVE FILE.
  51.     JP     READ2
  52. READ4:    CP     'R'        ; ARE WE IN THE RECEIVE-INITIATE STATE?
  53.     JP     NZ,READ5
  54.     CALL   RINIT
  55.     JP     READ2
  56. READ5:    CP     'C'        ; ARE WE IN THE RECEIVE-COMPLETE STATE?
  57.     JR     NZ,READ6
  58.     LD     DE,INFMS3    ; PUT IN "COMPLETE" MESSAGE.
  59.     LD    A,(CZSEEN)
  60.     OR     A        ;  .  .  .
  61.     JR     Z,READ5A    ; NO.
  62.     XOR    A        ; YES, CLEAR FLAG.
  63.     LD    (CZSEEN),A
  64.     LD     DE,INMS13    ; ISSUE "INTERRUPTED" MESSAGE.
  65. READ5A:    CALL   FINMES    ; PRINT COMPLETION MESSAGE IN RIGHT PLACE.
  66.     JP     KERMIT
  67. READ6:    CP     'A'        ; ARE WE IN THE RECEIVE-"ABORT" STATE?
  68.     JR     NZ,READ7
  69.     LD     DE,INFMS4    ; PRINT MESSAGE.
  70.     CALL   FINMES
  71.     JP     KERMIT
  72. READ7:    LD     DE,INFMS4    ; ANYTHING ELSE IS EQUIVALENT TO "ABORT".
  73.     CALL   FINMES
  74.     JP     KERMIT
  75. ;    INITIALIZE BUFFERS AND CLEAR LINE.
  76. INIT:    LD     DE,OUTLIN    ; PUT BANNER ON SCREEN
  77.     CALL   PRTSTR
  78.     LD     DE,OUTLN2    ; PUT STATISTICS HEADERS ON THE SCREEN
  79.     CALL   PRTSTR    ;  ONLY FOR SCREEN-FORMATTING VERSIONS.
  80. INIT1:    LD     A,BUFSIZ    ; BUFFER SIZE.
  81.     LD     (CHRCNT),A    ; NUMBER OF CHARS LEFT.
  82.     LD     HL,BUFF    ; ADDR FOR BEGINNING.
  83.     LD     (BUFPNT),HL    ; STORE ADDR FOR BEGINNING.
  84.     RET
  85. ;    RECEIVE ROUTINES
  86. ;    RECEIVE INIT
  87. RINIT:    LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  88.     CP     IMXTRY    ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES?
  89.     JP     M,RINIT2
  90.     LD     DE,ERMES4
  91.     CALL   ERROR3    ; MOVE CURSOR AND PRINT AN ERROR MESSAGE.
  92.     JP     ABORT    ; CHANGE THE STATE TO ABORT.
  93. RINIT2:    INC    A        ; INCREMENT IT.
  94.     LD     (NUMTRY),A    ; SAVE THE UPDATED NUMBER OF TRIES.
  95.     LD     A,'1'    ; RESET BLOCK CHECK TYPE TO SINGLE CHARACTER
  96.     LD     (CURCHK),A    ; STORE AS CURRENT TYPE FOR INITIALIZATION
  97.     CALL   RPACK    ; GET A PACKET.
  98.     JP     NAK    ;  TRASHED PACKET: NAK, RETRY.
  99.     CP     'S'        ; IS IT A SEND INITIATE PACKET?
  100.     JR     NZ,RINIT3    ; IF NOT SEE IF ITS AN ERROR.
  101.     LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  102.     LD     (OLDTRY),A    ; SAVE IT.
  103.     XOR    A
  104.     LD     (NUMTRY),A    ; RESET THE NUMBER OF TRIES.
  105.     LD     A,(ARGBLK)    ; RETURNED PACKET NUMBER.  (SYNCHRONIZE THEM.)
  106.     INC    A        ; INCREMENT IT.
  107.     AND    3FH        ; TURN OFF THE TWO HIGH ORDER BITS.
  108.     LD     (PKTNUM),A    ; SAVE MODULO 64 OF THE NUMBER.
  109.     LD     HL,(NUMPKT)
  110.     INC    HL        ; INCREMENT THE NUMBER OF PACKETS.
  111.     LD     (NUMPKT),HL
  112.     LD     A,(ARGBLK+1)    ; GET THE NUMBER OF ARGUMENTS RECEIVED.
  113.     LD     HL,DATA    ; GET A POINTER TO THE DATA.
  114.     CALL   SPAR    ; GET THE DATA INTO THE PROPER VARIABLES.
  115.     LD     HL,DATA    ; GET A POINTER TO OUR DATA BLOCK.
  116.     CALL   RPAR    ; SET UP THE RECEIVE PARAMETERS.
  117.     LD     (ARGBLK+1),A    ; STORE THE RETURNED NUMBER OF ARGUMENTS.
  118.     LD     A,'Y'    ; ACKNOWLEDGE PACKET.
  119.     CALL   SPACK    ; SEND THE PACKET.
  120.     JP     ABORT    ;  FAILED, ABORT.
  121.     LD    A,(INICHK)
  122.     LD     (CURCHK),A    ; FOR ALL FUTURE PACKETS
  123.     LD     A,'F'    ; SET THE STATE TO FILE SEND.
  124.     LD     (STATE),A
  125.     RET
  126. RINIT3:    CP     'E'        ; IS IT AN ERROR PACKET.
  127.     JR     NZ,NAK0    ; IF NOT NAK WHATEVER IT IS.
  128.     CALL   ERROR
  129.     JR     ABORT
  130. ; THESE ARE SOME UTILITY ROUTINES.
  131. ;    ABORT
  132. ABORT:    LD     A,'A'    ; OTHERWISE ABORT.
  133.     LD     (STATE),A
  134.     RET
  135. ;    NAK
  136. NAK0:    CALL   UPDRTR    ; UPDATE NUMBER OF RETRIES.
  137. NAK:    LD     A,(PKTNUM)    ; GET THE PACKET NUMBER WE'RE WAITING FOR.
  138.     LD     (ARGBLK),A
  139.     XOR    A        ; NO DATA.
  140.     LD     (ARGBLK+1),A
  141.     LD     A,'N'    ; NAK THAT PACKET.
  142.     CALL   SPACK
  143.     JP     ABORT    ;  GIVE UP.
  144.     RET                ; GO AROUND AGAIN.
  145. UPDRTR:    LD     DE,SCRNRT    ; POSITION CURSOR
  146.     CALL   PRTSTR
  147.     LD     HL,(NUMRTR)
  148.     INC    HL        ; INCREMENT THE NUMBER OF RETRIES
  149.     LD     (NUMRTR),HL
  150.     CALL   NOUT    ; WRITE THE NUMBER OF RETRIES.
  151.     RET
  152. ;    THIS ROUTINE SETS UP THE DATA FOR INIT PACKET (EITHER THE
  153. ;    SEND_INIT OR ACK PACKET).
  154. RPAR:    LD     A,(RPSIZ)    ; GET THE RECEIVE PACKET SIZE.
  155.     ADD    A,' '            ; ADD A SPACE TO MAKE IT PRINTABLE.
  156.     LD     (HL),A        ; PUT IT IN THE PACKET.
  157.     INC    HL        ; POINT TO THE NEXT CHAR.
  158.     LD     A,(RTIME)    ; GET THE RECEIVE PACKET TIME OUT.
  159.     ADD    A,' '            ; ADD A SPACE.
  160.     LD     (HL),A        ; PUT IT IN THE PACKET.
  161.     INC    HL
  162.     LD     A,(RPAD)    ; GET THE NUMBER OF PADDING CHARS.
  163.     ADD    A,' '
  164.     LD     (HL),A
  165.     INC    HL
  166.     LD     A,(RPADCH)    ; GET THE PADDING CHAR.
  167.     ADD    A,100O    ; UNCONTROL IT.
  168.     AND    7FH
  169.     LD     (HL),A
  170.     INC    HL
  171.     LD     A,(REOL)    ; GET THE EOL CHAR.
  172.     ADD    A,' '
  173.     LD     (HL),A
  174.     INC    HL
  175.     LD     A,(RQUOTE)    ; GET THE QUOTE CHAR.
  176.     LD     (HL),A
  177.     INC    HL
  178.     LD     (HL),'N'    ; WE DO NOT DO 8-BIT QUOTING YET
  179.     INC    HL        ; ADVANCE TO NEXT
  180.     LD    A,(INICHK)
  181.     LD     (HL),A        ; STORE IT
  182.     INC    HL        ; ADVANCE POINTER
  183.     LD     A,08H    ; SIX PIECES OF DATA.
  184.     RET
  185. ;    THIS ROUTINE READS IN ALL THE SEND_INIT PACKET INFORMATION.
  186. SPAR:    LD     (TEMP4),A    ; SAVE THE NUMBER OF ARGUMENTS.
  187.     LD     A,(HL)        ; GET THE MAX PACKET SIZE.
  188.     SUB    20H            ; SUBTRACT A SPACE.
  189.     LD     (SPSIZ),A    ; SAVE IT.
  190.     LD     A,(TEMP4)
  191.     CP     3        ; FEWER THAN THREE PIECES?
  192.     RET   M            ; IF SO WE ARE DONE.
  193.     INC    HL
  194.     INC    HL        ; INCREMENT PAST THE TIME OUT INFO.
  195.     LD     A,(HL)        ; GET THE NUMBER OF PADDING CHARS.
  196.     SUB    20H
  197.     LD     (SPAD),A
  198.     LD     A,(TEMP4)
  199.     CP     4        ; FEWER THAN FOUR PIECES?
  200.     RET   M            ; IF SO WE ARE DONE.
  201.     INC    HL
  202.     LD     A,(HL)        ; GET THE PADDING CHAR.
  203.     ADD    A,100O    ; RE-CONTROLIFY IT.
  204.     AND    7FH
  205.     LD     (SPADCH),A
  206.     LD     A,(TEMP4)
  207.     CP     5        ; FEWER THAN FIVE PIECES?
  208.     RET   M            ; IF SO WE ARE DONE.
  209.     INC    HL
  210.     LD     A,(HL)        ; GET THE EOL CHAR.
  211.     SUB    20H
  212.     LD     (SEOL),A
  213.     LD     A,(TEMP4)
  214.     CP     6        ; FEWER THAN SIX PIECES?
  215.     RET   M            ; IF SO WE ARE DONE.
  216.     INC    HL
  217.     LD     A,(HL)        ; GET THE QUOTE CHAR.
  218.     LD     (SQUOTE),A
  219.     LD     A,(TEMP4)    ; GET THE AMOUNT OF DATA SUPPLIED
  220.     CP     7        ; HAVE AN 8-BIT QUOTE?
  221.     RET   M            ; IF NOT THERE, ALL DONE
  222.     INC    HL        ; YES, GET THE CHARACTER
  223.     LD     A,(HL)        ; GET THE SUPPLIED CHARACTER
  224. ; PERHAPS WE SHOULD VALIDATE THAT THE 8-BIT QUOTE CHARACTER IS ONLY
  225. ; 'Y' OR 'N', HOWEVER, IF THE OTHER END REALLY DESIRES 8-BIT QUOTING,
  226. ; IT SHOULD GIVE AN ERROR DUE TO OUR STATING THAT WE DO NOT DO 8-BIT
  227. ; QUOTING AT ALL.
  228.     LD     A,(TEMP4)    ; DETERMINE IF BLOCK CHECK TYPE GIVEN
  229.     CP     8        ; IS THE FIELD THERE?
  230.     RET   M            ; IF NOT, ALL DONE
  231.     INC    HL        ; POINT TO THE CHARACTER
  232.     LD     A,(HL)        ; GET THE VALUE
  233.     LD     B,A        ; COPY VALUE
  234.     LD     A,(CHKTYP)    ; GET OUR TYPE
  235.     CP     B        ; IS IT OUR DESIRED TYPE?
  236.     JR     Z,SPAR01    ; IF SO, USE IT
  237.     LD     A,'1'    ; NO, USE SINGLE CHARACTER
  238. SPAR01:    LD    (INICHK),A
  239.     RET                ; AND RETURN
  240. ;    RECEIVE FILE
  241. RFILE:    LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  242.     CP     MAXTRY    ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES?
  243.     JP     M,RFILE1
  244.     LD     DE,ERMES5
  245.     CALL   ERROR3    ; MOVE CURSOR AND PRINT AN ERROR MESSAGE.
  246.     JP     ABORT    ; CHANGE THE STATE TO ABORT.
  247. RFILE1:    INC    A        ; INCREMENT IT.
  248.     LD     (NUMTRY),A    ; SAVE THE UPDATED NUMBER OF TRIES.
  249.     CALL   RPACK    ; GET A PACKET.
  250.     JP     NAK    ;  TRASHED PACKET: NAK, RETRY.
  251.     CP     'S'        ; IS IT A SEND INITIATE PACKET?
  252.     JP     NZ,RFILE2    ;  NO, TRY NEXT TYPE.
  253.     LD     A,(OLDTRY)    ; GET THE NUMBER OF TRIES.
  254.     CP     IMXTRY    ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES?
  255.     JP     M,RFIL12    ; IF NOT PROCEED.
  256.     LD     DE,ERMES4
  257.     CALL   ERROR3    ; MOVE CURSOR AND PRINT AN ERROR MESSAGE.
  258.     JP     ABORT    ; CHANGE THE STATE TO ABORT.
  259. RFIL12:    INC    A        ; INCREMENT IT.
  260.     LD     (OLDTRY),A    ; SAVE THE UPDATED NUMBER OF TRIES.
  261.     LD     A,(PKTNUM)    ; GET THE PRESENT PACKET NUMBER.
  262.     DEC    A        ; DECREMENT.
  263.     LD     B,A
  264.     LD     A,(ARGBLK)    ; GET THE PACKET'S NUMBER
  265.     CP     B        ; IS THE PACKET'S NUMBER ONE LESS THAN NOW?
  266.     JP     NZ,NAK0    ; NO, NAK AND TRY AGAIN.
  267.     CALL   UPDRTR    ; UPDATE THE RETRY COUNT.
  268.     XOR    A
  269.     LD     (NUMTRY),A    ; RESET THE NUMBER OF TRIES.
  270.     LD     HL,DATA    ; GET A POINTER TO OUR DATA BLOCK.
  271.     CALL   RPAR    ; SET UP THE PARAMETER INFORMATION.
  272.     LD     (ARGBLK+1),A    ; SAVE THE NUMBER OF ARGUMENTS.
  273.     LD     A,'Y'    ; ACKNOWLEDGE PACKET.
  274.     CALL   SPACK    ; SEND THE PACKET.
  275.     JP     ABORT    ;  FAILED, ABORT.
  276.     RET
  277. RFILE2:    CP     'Z'        ; IS IT AN EOF PACKET?
  278.     JP     NZ,RFILE3    ;  NO, TRY NEXT TYPE.
  279.     LD     A,(OLDTRY)    ; GET THE NUMBER OF TRIES.
  280.     CP     MAXTRY    ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES?
  281.     JP     M,RFIL21    ; IF NOT PROCEED.
  282.     LD     DE,ERMES6
  283.     CALL   ERROR3    ; MOVE CURSOR AND PRINT AN ERROR MESSAGE.
  284.     JP     ABORT    ; CHANGE THE STATE TO ABORT.
  285. RFIL21:    INC    A        ; INCREMENT IT.
  286.     LD     (OLDTRY),A    ; SAVE THE UPDATED NUMBER OF TRIES.
  287.     LD     A,(PKTNUM)    ; GET THE PRESENT PACKET NUMBER.
  288.     DEC    A        ; DECREMENT.
  289.     LD     B,A
  290.     LD     A,(ARGBLK)    ; GET THE PACKET'S NUMBER
  291.     CP     B        ; IS THE PACKET'S NUMBER ONE LESS THAN NOW?
  292.     JP     NZ,NAK0    ; NO, NAK IT AND TRY AGAIN.
  293.     CALL   UPDRTR    ; UPDATE THE NUMBER OF RETRIES.
  294.     XOR    A
  295.     LD     (NUMTRY),A    ; RESET NUMBER OF TRIES.
  296.     LD     (ARGBLK+1),A    ; NO DATA.  (THE PACKET NUMBER IS IN ARGBLK.)
  297.     LD     A,'Y'    ; ACKNOWLEDGE PACKET.
  298.     CALL   SPACK    ; SEND THE PACKET.
  299.     JP     ABORT    ;  FAILED, ABORT.
  300.     RET
  301. RFILE3:    CP     'F'        ; START OF FILE?
  302.     JP     NZ,RFILE4
  303.     LD     A,(PKTNUM)    ; GET THE PACKET NUMBER.
  304.     LD     B,A
  305.     LD     A,(ARGBLK)
  306.     CP     B        ; IS IT THE RIGHT PACKET NUMBER?
  307.     JP     NZ,NAK0    ; NO, NAK IT AND TRY AGAIN.
  308.     INC    A        ; INCREMENT THE PACKET NUMBER.
  309.     AND    3FH        ; TURN OFF THE TWO HIGH ORDER BITS.
  310.     LD     (PKTNUM),A    ; SAVE MODULO 64 OF THE NUMBER.
  311.     LD     HL,(NUMPKT)
  312.     INC    HL        ; INCREMENT THE NUMBER OF PACKETS.
  313.     LD     (NUMPKT),HL
  314.     CALL   GOFIL    ; GET A FILE TO WRITE TO.
  315.     JP     ABORT
  316.     CALL   INIT1    ; INITIALIZE ALL THE BUFFERS.
  317.     LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  318.     LD     (OLDTRY),A    ; SAVE IT.
  319.     XOR    A
  320.     LD     (NUMTRY),A    ; RESET THE NUMBER OF TRIES.
  321.     LD     (ARGBLK+1),A    ; NO DATA.  (THE PACKET NUMBER IS IN ARGBLK.)
  322.     LD     A,'Y'    ; ACKNOWLEDGE PACKET.
  323.     CALL   SPACK    ; SEND THE PACKET.
  324.     JP     ABORT
  325.     LD     A,'D'    ; SET THE STATE TO DATA RECEIVE.
  326.     LD     (STATE),A
  327.     LD    (CZSEEN),A
  328.     CP     'Z'        ; AND DIDN'T WANT ANY MORE
  329.     RET   Z            ; IF THAT WAS THE REQUEST, KEEP TELLING OTHER END
  330.     XOR    A        ; OTHERWISE, CLEAR FLAG (CONTROL-X IS ONLY FOR ONE FILE)
  331.     LD    (CZSEEN),A
  332.     RET
  333. RFILE4:    CP     'B'        ; END OF TRANSMISSION.
  334.     JP     NZ,RFILE5
  335.     LD     A,(PKTNUM)    ; GET THE PACKET NUMBER.
  336.     LD     B,A
  337.     LD     A,(ARGBLK)
  338.     CP     B        ; IS IT THE RIGHT PACKET NUMBER?
  339.     JP     NZ,NAK0    ; NO, NAK IT AND TRY AGAIN.
  340.     XOR    A        ; NO DATA.  (PACKET NUMBER ALREADY IN ARGBLK).
  341.     LD     (ARGBLK+1),A
  342.     LD     A,'Y'    ; ACKNOWLEDGE PACKET.
  343.     CALL   SPACK    ; SEND THE PACKET.
  344.     JP     ABORT
  345.     LD     A,'C'    ; SET THE STATE TO COMPLETE.
  346.     LD     (STATE),A
  347.     RET
  348. RFILE5:    CP     'E'        ; IS IT AN ERROR PACKET.
  349.     JP     NZ,ABORT
  350.     CALL   ERROR
  351.     JP     ABORT
  352. ;    RECEIVE DATA
  353. RDATA:    LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  354.     CP     MAXTRY    ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES?
  355.     JP     M,RDATA1
  356.     LD     DE,ERMS10
  357.     CALL   ERROR3    ; DISPLAY ERROR MESSAGE.
  358.     JP     ABORT    ; CHANGE THE STATE TO ABORT.
  359. RDATA1:    INC    A        ; INCREMENT IT.
  360.     LD     (NUMTRY),A    ; SAVE THE UPDATED NUMBER OF TRIES.
  361.     CALL   RPACK    ; GET A PACKET.
  362.     JP     NAK    ;  TRASHED PACKET: NAK, RETRY.
  363.     CP     'D'        ; IS IT A DATA PACKET?
  364.     JP     NZ,RDATA2    ;  NO, TRY NEXT TYPE.
  365. RDAT11:    LD     A,(PKTNUM)    ; GET THE PRESENT PACKET NUMBER.
  366.     LD     B,A
  367.     LD     A,(ARGBLK)    ; GET THE PACKET'S NUMBER.
  368.     CP     B        ; IS THE PACKET'S NUMBER CORRECT?
  369.     JP     Z,RDAT14
  370.     LD     A,(OLDTRY)    ; GET THE NUMBER OF TRIES.
  371.     CP     MAXTRY    ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES?
  372.     JP     M,RDAT12    ; IF NOT PROCEED.
  373.     LD     DE,ERMS10
  374.     CALL   ERROR3    ; DISPLAY ERR MSG.
  375.     JP     ABORT    ; CHANGE THE STATE TO ABORT.
  376. RDAT12:    INC    A        ; INCREMENT IT.
  377.     LD     (OLDTRY),A    ; SAVE THE UPDATED NUMBER OF TRIES.
  378.     LD     A,(PKTNUM)    ; GET THE PRESENT PACKET NUMBER.
  379.     DEC    A        ; DECREMENT.
  380.     LD     B,A
  381.     LD     A,(ARGBLK)    ; GET THE PACKET'S NUMBER
  382.     CP     B        ; IS THE PACKET'S NUMBER ONE LESS THAN NOW?
  383.     JP     NZ,NAK0    ; NO, NAK IT AND TRY AGAIN.
  384.     CALL   UPDRTR    ; UPDATE THE NUMBER OF RETRIES.
  385.     XOR    A
  386.     LD     (NUMTRY),A    ; RESET NUMBER OF TRIES.
  387.     LD     (ARGBLK+1),A    ; NO DATA.  (THE PACKET NUMBER IS IN ARGBLK.)
  388.     LD     A,'Y'    ; ACKNOWLEDGE PACKET.
  389.     CALL   SPACK    ; SEND THE PACKET.
  390.     JP     ABORT    ;  FAILED, ABORT.
  391.     RET
  392. RDAT14:    INC    A        ; INCREMENT THE PACKET NUMBER.
  393.     AND    3FH        ; TURN OFF THE TWO HIGH ORDER BITS.
  394.     LD     (PKTNUM),A    ; SAVE MODULO 64 OF THE NUMBER.
  395.     LD     HL,(NUMPKT)
  396.     INC    HL        ; INCREMENT THE NUMBER OF PACKETS.
  397.     LD     (NUMPKT),HL
  398.     LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  399.     LD     (OLDTRY),A    ; SAVE IT.
  400.     LD     A,(ARGBLK+1)    ; GET THE LENGTH OF THE DATA.
  401.     CALL   PTCHR
  402.     JP     ABORT    ;  UNABLE TO WRITE OUT CHARS; ABORT.
  403.     XOR    A
  404.     LD     (NUMTRY),A    ; RESET THE NUMBER OF TRIES.
  405.     LD     (ARGBLK+1),A    ; NO DATA.  (PACKET NUMBER STILL IN ARGBLK.)
  406.     LD     C,A        ; ASSUME NO DATA
  407.     LD    (CZSEEN),A
  408.     OR     A        ;  .  .  .
  409.     JP     Z,RDAT15    ; ZERO IF NOT TYPED
  410.     LD     C,A        ; GET THE TYPE OF CHARACTER TYPED
  411.     LD     A,1        ; ONE DATA CHARACTER
  412.     LD     (ARGBLK+1),A    ; SAVE THE COUNT
  413.     LD     A,C        ; GET THE POSSIBLE DATA CHARACTER
  414.     LD     (DATA),A    ; STORE IN DATA AREA
  415. RDAT15:    LD     A,'Y'    ; ACKNOWLEDGE PACKET.
  416.     CALL   SPACK    ; SEND THE PACKET.
  417.     JP     ABORT
  418.     RET
  419. RDATA2:    CP     'F'        ; START OF FILE?
  420.     JP     NZ,RDATA3    ;  NO, TRY NEXT TYPE.
  421.     LD     A,(OLDTRY)    ; GET THE NUMBER OF TRIES.
  422.     CP     MAXTRY    ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES?
  423.     JP     M,RDAT21    ; IF NOT PROCEED.
  424.     LD     DE,ERMES5
  425.     CALL   ERROR3    ; DISPLAY ERR MSG.
  426.     JP     ABORT    ; CHANGE THE STATE TO ABORT.
  427. RDAT21:    INC    A        ; INCREMENT IT.
  428.     LD     (OLDTRY),A    ; SAVE THE UPDATED NUMBER OF TRIES.
  429.     LD     A,(PKTNUM)    ; GET THE PRESENT PACKET NUMBER.
  430.     DEC    A        ; DECREMENT.
  431.     LD     B,A
  432.     LD     A,(ARGBLK)    ; GET THE PACKET'S NUMBER
  433.     CP     B        ; IS THE PACKET'S NUMBER ONE LESS THAN NOW?
  434.     JP     NZ,NAK0    ; NO, NAK IT AND TRY AGAIN.
  435.     CALL   UPDRTR    ; UPDATE THE NUMBER OF RETRIES.
  436.     XOR    A
  437.     LD     (NUMTRY),A    ; RESET NUMBER OF TRIES.
  438.     LD     (ARGBLK+1),A    ; NO DATA.  (THE PACKET NUMBER IS IN ARGBLK.)
  439.     LD     A,'Y'    ; ACKNOWLEDGE PACKET.
  440.     CALL   SPACK    ; SEND THE PACKET.
  441.     JP     ABORT    ;  FAILED, ABORT.
  442.     RET
  443. RDATA3:    CP     'Z'        ; IS IT A EOF PACKET?
  444.     JP     NZ,RDATA4    ; TRY AND SEE IF ITS AN ERROR.
  445.     LD     A,(PKTNUM)    ; GET THE PRESENT PACKET NUMBER.
  446.     LD     B,A
  447.     LD     A,(ARGBLK)    ; GET THE PACKET'S NUMBER
  448.     CP     B        ; IS THE PACKET'S NUMBER CORRECT?
  449.     JP     NZ,NAK0    ; NO, NAK IT AND TRY AGAIN.
  450.     INC    A        ; INCREMENT THE PACKET NUMBER.
  451.     AND    3FH        ; TURN OFF THE TWO HIGH ORDER BITS.
  452.     LD     (PKTNUM),A    ; SAVE MODULO 64 OF THE NUMBER.
  453.     LD     HL,(NUMPKT)
  454.     INC    HL        ; INCREMENT THE NUMBER OF PACKETS.
  455.     LD     (NUMPKT),HL
  456.     LD     A,(ARGBLK+1)    ; GET THE DATA LENGTH
  457.     CP     1        ; HAVE ONE ITEM?
  458.     JP     NZ,RDAT33    ; IF NOT, IGNORE DATA
  459.     LD     A,(DATA)    ; YES, GET THE CHARACTER
  460.     CP     'D'        ; IS IT A 'D' FOR DISCARD?
  461.     JP     Z,RDAT36    ; IF SO, PUNT FILE
  462. RDAT33:    LD     HL,(BUFPNT)    ; GET THE DMA POINTER.
  463.     LD     A,(CHRCNT)    ; GET THE NUMBER OF CHARS LEFT IN THE DMA.
  464. RDAT34:    DEC    A        ; LOWER THE COUNT.
  465.     OR     A
  466.     JP     M,RDAT35    ; IF FULL THEN STOP.
  467.     LD     (HL),'Z'-100O    ; PUT IN A ^Z FOR EOF.
  468.     INC    HL        ; POINT TO THE NEXT SPACE.
  469.     JP     RDAT34
  470. RDAT35:    LD     DE,FCB
  471.     CALL    @CLOSE    ;CLOSE THE FILE
  472.     XOR    A        ; SINCE WE KEPT THE FILE,
  473.     LD    (CZSEEN),A
  474. RDAT36:    LD     A,(NUMTRY)    ; GET THE NUMBER OF TRIES.
  475.     LD     (OLDTRY),A    ; SAVE IT.
  476.     XOR    A
  477.     LD     (NUMTRY),A    ; RESET THE NUMBER OF TRIES.
  478.     LD     (ARGBLK+1),A    ; NO DATA.  (THE PACKET NUMBER IS IN ARGBLK.)
  479.     LD     A,'Y'    ; ACKNOWLEDGE PACKET.
  480.     CALL   SPACK    ; SEND THE PACKET.
  481.     JP     ABORT
  482.     LD     A,'F'
  483.     LD     (STATE),A
  484.     RET
  485. RDATA4:    CP     'E'        ; IS IT AN ERROR PACKET.
  486.     JP     NZ,ABORT
  487.     CALL   ERROR
  488.     JP     ABORT
  489.