; RECEIVE COMMAND READ: LD DE,DATA ; WHERE TO PUT THE TEXT (IF ANY.) LD A,CMTXT CALL COMND ; GET EITHER SOME TEXT OR A CONFIRM. JP KERMT3 ; DIDN'T GET ANYTHING. OR A ; GET ANY CHARS? JR Z,READ1 ; NOPE, JUST A REGULAR SEND. LD (ARGBLK+1),A ; STORE THE NUMBER OF CHARS. EX DE,HL ; GET POINTER INTO HL. LD (HL),'$' ; PUT IN A DOLLAR SIGN FOR PRINTING. CALL INIT ; CLEAR THE LINE AND INITIALIZE THE BUFFERS. LD DE,SCRFLN ; POSITION CURSOR CALL PRTSTR LD DE,DATA ; PRINT THE FILE NAME CALL PRTSTR LD A,'1' ; START WITH SINGLE CHARACTER CHECKSUM LD (CURCHK),A ; SAVE THE TYPE XOR A ; START A PACKET ZERO. LD (ARGBLK),A LD A,'R' ; RECEIVE INIT PACKET. CALL SPACK ; SEND THE PACKET. JP KERMT3 ; DIE! JP READ12 READ1: CALL INIT ; CLEAR THE LINE AND INITIALIZE THE BUFFERS. READ12: XOR A LD (CZSEEN),A LD HL,0 LD (NUMPKT),HL ; SET THE NUMBER OF PACKETS TO ZERO. LD (NUMRTR),HL ; SET THE NUMBER OF RETRIES TO ZERO. LD (PKTNUM),A ; SET THE PACKET NUMBER TO ZERO. LD (NUMTRY),A ; SET THE NUMBER OF TRIES TO ZERO. LD DE,SCRNRT ; POSITION CURSOR CALL PRTSTR LD HL,0 CALL NOUT ; WRITE THE NUMBER OF RETRIES. LD A,'R' LD (STATE),A ; SET THE STATE TO RECEIVE INITIATE. ; RECEIVE STATE TABLE SWITCHER. READ2: LD DE,SCRNP ; POSITION CURSOR CALL PRTSTR LD HL,(NUMPKT) CALL NOUT ; WRITE THE CURRENT PACKET NUMBER. LD A,(STATE) ; GET THE STATE. CP 'D' ; ARE WE IN THE DATA RECEIVE STATE? JP NZ,READ3 CALL RDATA JP READ2 READ3: CP 'F' ; ARE WE IN THE FILE RECEIVE STATE? JP NZ,READ4 CALL RFILE ; CALL RECEIVE FILE. JP READ2 READ4: CP 'R' ; ARE WE IN THE RECEIVE-INITIATE STATE? JP NZ,READ5 CALL RINIT JP READ2 READ5: CP 'C' ; ARE WE IN THE RECEIVE-COMPLETE STATE? JR NZ,READ6 LD DE,INFMS3 ; PUT IN "COMPLETE" MESSAGE. LD A,(CZSEEN) OR A ; . . . JR Z,READ5A ; NO. XOR A ; YES, CLEAR FLAG. LD (CZSEEN),A LD DE,INMS13 ; ISSUE "INTERRUPTED" MESSAGE. READ5A: CALL FINMES ; PRINT COMPLETION MESSAGE IN RIGHT PLACE. JP KERMIT READ6: CP 'A' ; ARE WE IN THE RECEIVE-"ABORT" STATE? JR NZ,READ7 LD DE,INFMS4 ; PRINT MESSAGE. CALL FINMES JP KERMIT READ7: LD DE,INFMS4 ; ANYTHING ELSE IS EQUIVALENT TO "ABORT". CALL FINMES JP KERMIT ; INITIALIZE BUFFERS AND CLEAR LINE. INIT: LD DE,OUTLIN ; PUT BANNER ON SCREEN CALL PRTSTR LD DE,OUTLN2 ; PUT STATISTICS HEADERS ON THE SCREEN CALL PRTSTR ; ONLY FOR SCREEN-FORMATTING VERSIONS. INIT1: LD A,BUFSIZ ; BUFFER SIZE. LD (CHRCNT),A ; NUMBER OF CHARS LEFT. LD HL,BUFF ; ADDR FOR BEGINNING. LD (BUFPNT),HL ; STORE ADDR FOR BEGINNING. RET ; RECEIVE ROUTINES ; RECEIVE INIT RINIT: LD A,(NUMTRY) ; GET THE NUMBER OF TRIES. CP IMXTRY ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES? JP M,RINIT2 LD DE,ERMES4 CALL ERROR3 ; MOVE CURSOR AND PRINT AN ERROR MESSAGE. JP ABORT ; CHANGE THE STATE TO ABORT. RINIT2: INC A ; INCREMENT IT. LD (NUMTRY),A ; SAVE THE UPDATED NUMBER OF TRIES. LD A,'1' ; RESET BLOCK CHECK TYPE TO SINGLE CHARACTER LD (CURCHK),A ; STORE AS CURRENT TYPE FOR INITIALIZATION CALL RPACK ; GET A PACKET. JP NAK ; TRASHED PACKET: NAK, RETRY. CP 'S' ; IS IT A SEND INITIATE PACKET? JR NZ,RINIT3 ; IF NOT SEE IF ITS AN ERROR. LD A,(NUMTRY) ; GET THE NUMBER OF TRIES. LD (OLDTRY),A ; SAVE IT. XOR A LD (NUMTRY),A ; RESET THE NUMBER OF TRIES. LD A,(ARGBLK) ; RETURNED PACKET NUMBER. (SYNCHRONIZE THEM.) INC A ; INCREMENT IT. AND 3FH ; TURN OFF THE TWO HIGH ORDER BITS. LD (PKTNUM),A ; SAVE MODULO 64 OF THE NUMBER. LD HL,(NUMPKT) INC HL ; INCREMENT THE NUMBER OF PACKETS. LD (NUMPKT),HL LD A,(ARGBLK+1) ; GET THE NUMBER OF ARGUMENTS RECEIVED. LD HL,DATA ; GET A POINTER TO THE DATA. CALL SPAR ; GET THE DATA INTO THE PROPER VARIABLES. LD HL,DATA ; GET A POINTER TO OUR DATA BLOCK. CALL RPAR ; SET UP THE RECEIVE PARAMETERS. LD (ARGBLK+1),A ; STORE THE RETURNED NUMBER OF ARGUMENTS. LD A,'Y' ; ACKNOWLEDGE PACKET. CALL SPACK ; SEND THE PACKET. JP ABORT ; FAILED, ABORT. LD A,(INICHK) LD (CURCHK),A ; FOR ALL FUTURE PACKETS LD A,'F' ; SET THE STATE TO FILE SEND. LD (STATE),A RET RINIT3: CP 'E' ; IS IT AN ERROR PACKET. JR NZ,NAK0 ; IF NOT NAK WHATEVER IT IS. CALL ERROR JR ABORT ; THESE ARE SOME UTILITY ROUTINES. ; ABORT ABORT: LD A,'A' ; OTHERWISE ABORT. LD (STATE),A RET ; NAK NAK0: CALL UPDRTR ; UPDATE NUMBER OF RETRIES. NAK: LD A,(PKTNUM) ; GET THE PACKET NUMBER WE'RE WAITING FOR. LD (ARGBLK),A XOR A ; NO DATA. LD (ARGBLK+1),A LD A,'N' ; NAK THAT PACKET. CALL SPACK JP ABORT ; GIVE UP. RET ; GO AROUND AGAIN. UPDRTR: LD DE,SCRNRT ; POSITION CURSOR CALL PRTSTR LD HL,(NUMRTR) INC HL ; INCREMENT THE NUMBER OF RETRIES LD (NUMRTR),HL CALL NOUT ; WRITE THE NUMBER OF RETRIES. RET ; THIS ROUTINE SETS UP THE DATA FOR INIT PACKET (EITHER THE ; SEND_INIT OR ACK PACKET). RPAR: LD A,(RPSIZ) ; GET THE RECEIVE PACKET SIZE. ADD A,' ' ; ADD A SPACE TO MAKE IT PRINTABLE. LD (HL),A ; PUT IT IN THE PACKET. INC HL ; POINT TO THE NEXT CHAR. LD A,(RTIME) ; GET THE RECEIVE PACKET TIME OUT. ADD A,' ' ; ADD A SPACE. LD (HL),A ; PUT IT IN THE PACKET. INC HL LD A,(RPAD) ; GET THE NUMBER OF PADDING CHARS. ADD A,' ' LD (HL),A INC HL LD A,(RPADCH) ; GET THE PADDING CHAR. ADD A,100O ; UNCONTROL IT. AND 7FH LD (HL),A INC HL LD A,(REOL) ; GET THE EOL CHAR. ADD A,' ' LD (HL),A INC HL LD A,(RQUOTE) ; GET THE QUOTE CHAR. LD (HL),A INC HL LD (HL),'N' ; WE DO NOT DO 8-BIT QUOTING YET INC HL ; ADVANCE TO NEXT LD A,(INICHK) LD (HL),A ; STORE IT INC HL ; ADVANCE POINTER LD A,08H ; SIX PIECES OF DATA. RET ; THIS ROUTINE READS IN ALL THE SEND_INIT PACKET INFORMATION. SPAR: LD (TEMP4),A ; SAVE THE NUMBER OF ARGUMENTS. LD A,(HL) ; GET THE MAX PACKET SIZE. SUB 20H ; SUBTRACT A SPACE. LD (SPSIZ),A ; SAVE IT. LD A,(TEMP4) CP 3 ; FEWER THAN THREE PIECES? RET M ; IF SO WE ARE DONE. INC HL INC HL ; INCREMENT PAST THE TIME OUT INFO. LD A,(HL) ; GET THE NUMBER OF PADDING CHARS. SUB 20H LD (SPAD),A LD A,(TEMP4) CP 4 ; FEWER THAN FOUR PIECES? RET M ; IF SO WE ARE DONE. INC HL LD A,(HL) ; GET THE PADDING CHAR. ADD A,100O ; RE-CONTROLIFY IT. AND 7FH LD (SPADCH),A LD A,(TEMP4) CP 5 ; FEWER THAN FIVE PIECES? RET M ; IF SO WE ARE DONE. INC HL LD A,(HL) ; GET THE EOL CHAR. SUB 20H LD (SEOL),A LD A,(TEMP4) CP 6 ; FEWER THAN SIX PIECES? RET M ; IF SO WE ARE DONE. INC HL LD A,(HL) ; GET THE QUOTE CHAR. LD (SQUOTE),A LD A,(TEMP4) ; GET THE AMOUNT OF DATA SUPPLIED CP 7 ; HAVE AN 8-BIT QUOTE? RET M ; IF NOT THERE, ALL DONE INC HL ; YES, GET THE CHARACTER LD A,(HL) ; GET THE SUPPLIED CHARACTER ; PERHAPS WE SHOULD VALIDATE THAT THE 8-BIT QUOTE CHARACTER IS ONLY ; 'Y' OR 'N', HOWEVER, IF THE OTHER END REALLY DESIRES 8-BIT QUOTING, ; IT SHOULD GIVE AN ERROR DUE TO OUR STATING THAT WE DO NOT DO 8-BIT ; QUOTING AT ALL. LD A,(TEMP4) ; DETERMINE IF BLOCK CHECK TYPE GIVEN CP 8 ; IS THE FIELD THERE? RET M ; IF NOT, ALL DONE INC HL ; POINT TO THE CHARACTER LD A,(HL) ; GET THE VALUE LD B,A ; COPY VALUE LD A,(CHKTYP) ; GET OUR TYPE CP B ; IS IT OUR DESIRED TYPE? JR Z,SPAR01 ; IF SO, USE IT LD A,'1' ; NO, USE SINGLE CHARACTER SPAR01: LD (INICHK),A RET ; AND RETURN ; RECEIVE FILE RFILE: LD A,(NUMTRY) ; GET THE NUMBER OF TRIES. CP MAXTRY ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES? JP M,RFILE1 LD DE,ERMES5 CALL ERROR3 ; MOVE CURSOR AND PRINT AN ERROR MESSAGE. JP ABORT ; CHANGE THE STATE TO ABORT. RFILE1: INC A ; INCREMENT IT. LD (NUMTRY),A ; SAVE THE UPDATED NUMBER OF TRIES. CALL RPACK ; GET A PACKET. JP NAK ; TRASHED PACKET: NAK, RETRY. CP 'S' ; IS IT A SEND INITIATE PACKET? JP NZ,RFILE2 ; NO, TRY NEXT TYPE. LD A,(OLDTRY) ; GET THE NUMBER OF TRIES. CP IMXTRY ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES? JP M,RFIL12 ; IF NOT PROCEED. LD DE,ERMES4 CALL ERROR3 ; MOVE CURSOR AND PRINT AN ERROR MESSAGE. JP ABORT ; CHANGE THE STATE TO ABORT. RFIL12: INC A ; INCREMENT IT. LD (OLDTRY),A ; SAVE THE UPDATED NUMBER OF TRIES. LD A,(PKTNUM) ; GET THE PRESENT PACKET NUMBER. DEC A ; DECREMENT. LD B,A LD A,(ARGBLK) ; GET THE PACKET'S NUMBER CP B ; IS THE PACKET'S NUMBER ONE LESS THAN NOW? JP NZ,NAK0 ; NO, NAK AND TRY AGAIN. CALL UPDRTR ; UPDATE THE RETRY COUNT. XOR A LD (NUMTRY),A ; RESET THE NUMBER OF TRIES. LD HL,DATA ; GET A POINTER TO OUR DATA BLOCK. CALL RPAR ; SET UP THE PARAMETER INFORMATION. LD (ARGBLK+1),A ; SAVE THE NUMBER OF ARGUMENTS. LD A,'Y' ; ACKNOWLEDGE PACKET. CALL SPACK ; SEND THE PACKET. JP ABORT ; FAILED, ABORT. RET RFILE2: CP 'Z' ; IS IT AN EOF PACKET? JP NZ,RFILE3 ; NO, TRY NEXT TYPE. LD A,(OLDTRY) ; GET THE NUMBER OF TRIES. CP MAXTRY ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES? JP M,RFIL21 ; IF NOT PROCEED. LD DE,ERMES6 CALL ERROR3 ; MOVE CURSOR AND PRINT AN ERROR MESSAGE. JP ABORT ; CHANGE THE STATE TO ABORT. RFIL21: INC A ; INCREMENT IT. LD (OLDTRY),A ; SAVE THE UPDATED NUMBER OF TRIES. LD A,(PKTNUM) ; GET THE PRESENT PACKET NUMBER. DEC A ; DECREMENT. LD B,A LD A,(ARGBLK) ; GET THE PACKET'S NUMBER CP B ; IS THE PACKET'S NUMBER ONE LESS THAN NOW? JP NZ,NAK0 ; NO, NAK IT AND TRY AGAIN. CALL UPDRTR ; UPDATE THE NUMBER OF RETRIES. XOR A LD (NUMTRY),A ; RESET NUMBER OF TRIES. LD (ARGBLK+1),A ; NO DATA. (THE PACKET NUMBER IS IN ARGBLK.) LD A,'Y' ; ACKNOWLEDGE PACKET. CALL SPACK ; SEND THE PACKET. JP ABORT ; FAILED, ABORT. RET RFILE3: CP 'F' ; START OF FILE? JP NZ,RFILE4 LD A,(PKTNUM) ; GET THE PACKET NUMBER. LD B,A LD A,(ARGBLK) CP B ; IS IT THE RIGHT PACKET NUMBER? JP NZ,NAK0 ; NO, NAK IT AND TRY AGAIN. INC A ; INCREMENT THE PACKET NUMBER. AND 3FH ; TURN OFF THE TWO HIGH ORDER BITS. LD (PKTNUM),A ; SAVE MODULO 64 OF THE NUMBER. LD HL,(NUMPKT) INC HL ; INCREMENT THE NUMBER OF PACKETS. LD (NUMPKT),HL CALL GOFIL ; GET A FILE TO WRITE TO. JP ABORT CALL INIT1 ; INITIALIZE ALL THE BUFFERS. LD A,(NUMTRY) ; GET THE NUMBER OF TRIES. LD (OLDTRY),A ; SAVE IT. XOR A LD (NUMTRY),A ; RESET THE NUMBER OF TRIES. LD (ARGBLK+1),A ; NO DATA. (THE PACKET NUMBER IS IN ARGBLK.) LD A,'Y' ; ACKNOWLEDGE PACKET. CALL SPACK ; SEND THE PACKET. JP ABORT LD A,'D' ; SET THE STATE TO DATA RECEIVE. LD (STATE),A LD (CZSEEN),A CP 'Z' ; AND DIDN'T WANT ANY MORE RET Z ; IF THAT WAS THE REQUEST, KEEP TELLING OTHER END XOR A ; OTHERWISE, CLEAR FLAG (CONTROL-X IS ONLY FOR ONE FILE) LD (CZSEEN),A RET RFILE4: CP 'B' ; END OF TRANSMISSION. JP NZ,RFILE5 LD A,(PKTNUM) ; GET THE PACKET NUMBER. LD B,A LD A,(ARGBLK) CP B ; IS IT THE RIGHT PACKET NUMBER? JP NZ,NAK0 ; NO, NAK IT AND TRY AGAIN. XOR A ; NO DATA. (PACKET NUMBER ALREADY IN ARGBLK). LD (ARGBLK+1),A LD A,'Y' ; ACKNOWLEDGE PACKET. CALL SPACK ; SEND THE PACKET. JP ABORT LD A,'C' ; SET THE STATE TO COMPLETE. LD (STATE),A RET RFILE5: CP 'E' ; IS IT AN ERROR PACKET. JP NZ,ABORT CALL ERROR JP ABORT ; RECEIVE DATA RDATA: LD A,(NUMTRY) ; GET THE NUMBER OF TRIES. CP MAXTRY ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES? JP M,RDATA1 LD DE,ERMS10 CALL ERROR3 ; DISPLAY ERROR MESSAGE. JP ABORT ; CHANGE THE STATE TO ABORT. RDATA1: INC A ; INCREMENT IT. LD (NUMTRY),A ; SAVE THE UPDATED NUMBER OF TRIES. CALL RPACK ; GET A PACKET. JP NAK ; TRASHED PACKET: NAK, RETRY. CP 'D' ; IS IT A DATA PACKET? JP NZ,RDATA2 ; NO, TRY NEXT TYPE. RDAT11: LD A,(PKTNUM) ; GET THE PRESENT PACKET NUMBER. LD B,A LD A,(ARGBLK) ; GET THE PACKET'S NUMBER. CP B ; IS THE PACKET'S NUMBER CORRECT? JP Z,RDAT14 LD A,(OLDTRY) ; GET THE NUMBER OF TRIES. CP MAXTRY ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES? JP M,RDAT12 ; IF NOT PROCEED. LD DE,ERMS10 CALL ERROR3 ; DISPLAY ERR MSG. JP ABORT ; CHANGE THE STATE TO ABORT. RDAT12: INC A ; INCREMENT IT. LD (OLDTRY),A ; SAVE THE UPDATED NUMBER OF TRIES. LD A,(PKTNUM) ; GET THE PRESENT PACKET NUMBER. DEC A ; DECREMENT. LD B,A LD A,(ARGBLK) ; GET THE PACKET'S NUMBER CP B ; IS THE PACKET'S NUMBER ONE LESS THAN NOW? JP NZ,NAK0 ; NO, NAK IT AND TRY AGAIN. CALL UPDRTR ; UPDATE THE NUMBER OF RETRIES. XOR A LD (NUMTRY),A ; RESET NUMBER OF TRIES. LD (ARGBLK+1),A ; NO DATA. (THE PACKET NUMBER IS IN ARGBLK.) LD A,'Y' ; ACKNOWLEDGE PACKET. CALL SPACK ; SEND THE PACKET. JP ABORT ; FAILED, ABORT. RET RDAT14: INC A ; INCREMENT THE PACKET NUMBER. AND 3FH ; TURN OFF THE TWO HIGH ORDER BITS. LD (PKTNUM),A ; SAVE MODULO 64 OF THE NUMBER. LD HL,(NUMPKT) INC HL ; INCREMENT THE NUMBER OF PACKETS. LD (NUMPKT),HL LD A,(NUMTRY) ; GET THE NUMBER OF TRIES. LD (OLDTRY),A ; SAVE IT. LD A,(ARGBLK+1) ; GET THE LENGTH OF THE DATA. CALL PTCHR JP ABORT ; UNABLE TO WRITE OUT CHARS; ABORT. XOR A LD (NUMTRY),A ; RESET THE NUMBER OF TRIES. LD (ARGBLK+1),A ; NO DATA. (PACKET NUMBER STILL IN ARGBLK.) LD C,A ; ASSUME NO DATA LD (CZSEEN),A OR A ; . . . JP Z,RDAT15 ; ZERO IF NOT TYPED LD C,A ; GET THE TYPE OF CHARACTER TYPED LD A,1 ; ONE DATA CHARACTER LD (ARGBLK+1),A ; SAVE THE COUNT LD A,C ; GET THE POSSIBLE DATA CHARACTER LD (DATA),A ; STORE IN DATA AREA RDAT15: LD A,'Y' ; ACKNOWLEDGE PACKET. CALL SPACK ; SEND THE PACKET. JP ABORT RET RDATA2: CP 'F' ; START OF FILE? JP NZ,RDATA3 ; NO, TRY NEXT TYPE. LD A,(OLDTRY) ; GET THE NUMBER OF TRIES. CP MAXTRY ; HAVE WE REACHED THE MAXIMUM NUMBER OF TRIES? JP M,RDAT21 ; IF NOT PROCEED. LD DE,ERMES5 CALL ERROR3 ; DISPLAY ERR MSG. JP ABORT ; CHANGE THE STATE TO ABORT. RDAT21: INC A ; INCREMENT IT. LD (OLDTRY),A ; SAVE THE UPDATED NUMBER OF TRIES. LD A,(PKTNUM) ; GET THE PRESENT PACKET NUMBER. DEC A ; DECREMENT. LD B,A LD A,(ARGBLK) ; GET THE PACKET'S NUMBER CP B ; IS THE PACKET'S NUMBER ONE LESS THAN NOW? JP NZ,NAK0 ; NO, NAK IT AND TRY AGAIN. CALL UPDRTR ; UPDATE THE NUMBER OF RETRIES. XOR A LD (NUMTRY),A ; RESET NUMBER OF TRIES. LD (ARGBLK+1),A ; NO DATA. (THE PACKET NUMBER IS IN ARGBLK.) LD A,'Y' ; ACKNOWLEDGE PACKET. CALL SPACK ; SEND THE PACKET. JP ABORT ; FAILED, ABORT. RET RDATA3: CP 'Z' ; IS IT A EOF PACKET? JP NZ,RDATA4 ; TRY AND SEE IF ITS AN ERROR. LD A,(PKTNUM) ; GET THE PRESENT PACKET NUMBER. LD B,A LD A,(ARGBLK) ; GET THE PACKET'S NUMBER CP B ; IS THE PACKET'S NUMBER CORRECT? JP NZ,NAK0 ; NO, NAK IT AND TRY AGAIN. INC A ; INCREMENT THE PACKET NUMBER. AND 3FH ; TURN OFF THE TWO HIGH ORDER BITS. LD (PKTNUM),A ; SAVE MODULO 64 OF THE NUMBER. LD HL,(NUMPKT) INC HL ; INCREMENT THE NUMBER OF PACKETS. LD (NUMPKT),HL LD A,(ARGBLK+1) ; GET THE DATA LENGTH CP 1 ; HAVE ONE ITEM? JP NZ,RDAT33 ; IF NOT, IGNORE DATA LD A,(DATA) ; YES, GET THE CHARACTER CP 'D' ; IS IT A 'D' FOR DISCARD? JP Z,RDAT36 ; IF SO, PUNT FILE RDAT33: LD HL,(BUFPNT) ; GET THE DMA POINTER. LD A,(CHRCNT) ; GET THE NUMBER OF CHARS LEFT IN THE DMA. RDAT34: DEC A ; LOWER THE COUNT. OR A JP M,RDAT35 ; IF FULL THEN STOP. LD (HL),'Z'-100O ; PUT IN A ^Z FOR EOF. INC HL ; POINT TO THE NEXT SPACE. JP RDAT34 RDAT35: LD DE,FCB CALL @CLOSE ;CLOSE THE FILE XOR A ; SINCE WE KEPT THE FILE, LD (CZSEEN),A RDAT36: LD A,(NUMTRY) ; GET THE NUMBER OF TRIES. LD (OLDTRY),A ; SAVE IT. XOR A LD (NUMTRY),A ; RESET THE NUMBER OF TRIES. LD (ARGBLK+1),A ; NO DATA. (THE PACKET NUMBER IS IN ARGBLK.) LD A,'Y' ; ACKNOWLEDGE PACKET. CALL SPACK ; SEND THE PACKET. JP ABORT LD A,'F' LD (STATE),A RET RDATA4: CP 'E' ; IS IT AN ERROR PACKET. JP NZ,ABORT CALL ERROR JP ABORT