.TITLE GETFIL - GET A FILE FROM THE REMOTE .IDENT /1.8/ .ENABL LC ;+ ; ; Free software BY ; Project Software & Development, Inc. ; ; This software is furnished for free and may be used and copied as ; desired. This software or any other copies thereof may be provided ; or otherwise made available to any other person. No title to and ; ownership of the software is hereby transferred or allowed. ; ; The information in this software is subject to change without notice ; and should not be construed as a commitment by PROJECT SOFTWARE ; AND DEVELOPMENT, INC. ; ; PROJECT SOFTWARE assumes no responsibility for the use or reliability ; of this software on any equipment whatsoever. ; ; Project Software & Development, Inc. ; 14 Story St. ; Cambridge, Ma. 02138 ; 617-661-1444 ; ; ; Title: GETFIL ; Author: Robin Miller ; Date: April 19, 1982 ; ; Description: ; ; This module will transfer a file from the remote system to the local ; system. The SNDRCV program must previously have been started on the remote. ; ; Modification History: ; ;- .ENABL AMA .NLIST BEX .MCALL CLOSE$, DIR$, PUT$, QIOW$S, QIO$S, WTSE$S ; Local equates: BELL = 7 ; BELL LF = 12 ; LINE FEED CR = 15 ; CARRIAGE RETURN EOF = 32 ; CTRL/Z = END OF FILE SPACE = 40 ; SPACE (BLANK) ; Messages: GLFILH: .ASCIZ "GET RSX_FILE" GRFILH: .ASCIZ "GET REMOTE_FILE" .EVEN ;+ ; ; GETFIL - GET A FILE FROM THE REMOTE SYSTEM. ; ; Description: ; ; This module will transfer a file from the remote system to the local ; system. The SNDRCV program must previously have been started on the remote. ; ; ; All registers are preserved. ; ;- GETFIL:: CALL $SAVAL ; SAVE THE REGISTERS CALL INTALL ; INITIALIZE ALL COUNTERS MOV #GET,MODE ; SHOW IN GET MODE CALL INIT ; INITIALIZE THE REMOTE BCC 10$ ; IF CC, YES JMP 100$ ; ELSE EXIT ; Get the remote file name(s). 10$: CLR ABOFLG ; INITIALIZE THE ABORT FLAG MOV #REMFIL,R1 ; ADDRESS TO STORE INPUT MOV #RFILEQ,R2 ; ADDRESS OF THE PROMPT MOV #GRFILH,HLPADR ; ADDRESS OF HELP STRING CALL PROMPT ; GO ASK THE QUESTION TST BCKFLG ; USER WANT TO BACKUP ? BEQ 20$ ; IF EQ, NO (CONTINUE) JMP 100$ ; YES, JUST RETURN 20$: TSTB (R1) ; IS THERE A FILSPEC ? BEQ 10$ ; IF EQ, NO (TRY AGAIN) MOV LIOSB+2,REMLEN ; COPY THE FILE LENGTH ; Send the filename to the remote and wait for response. TST ABOFLG ; CTRL/C TYPED TO ABORT ? BEQ 25$ ; IF EQ, NO (CONTINUE) JMP 80$ ; YES, ABORT & EXIT 25$: MOV #REMFIL,R2 ; OUTPUT FILE NAME ADDRESS MOV REMLEN,R3 ; FILE NAME BYTE COUNT MOV #-1,NRETRY ; DISABLE RETRYS FOR NOW CALL GETRES ; SEND IT AND GET RESPONSE CMPB CODE,#NAK ; WAS IT A NAK ? BEQ 10$ ; IF EQ, YES (BAD FILE NAME) CLR NRETRY ; ALLOW RETRANSMISSIONS ; Get the local file name. 30$: CLR ABOFLG ; INITIATE THE ABORT FLAG MOV #FILNAM,R1 ; ADDRESS TO STORE INPUT MOV #LFILEQ,R2 ; ADDRESS OF THE PROMPT MOV #GLFILH,HLPADR ; ADDRESS OF HELP STRING CALL PROMPT ; GO ASK THE QUESTION ; TST BCKFLG ; USER WANT TO BACKUP ? ; BNE 10$ ; IF NE, YES (ASK FOR REMOTE FILE) TSTB (R1) ; USE SAME NAME AS THE REMOTE ? BNE 40$ ; IF NE, NO (SPECIFIED ONE) ; Use the remote file name for the local file name. MOV #FILNAM,R0 ; ADDRESS FOR LOCAL FILE NAME MOV #REMFIL,R1 ; ADDRESS OF REMOTE FILE NAME CALL MOVE ; MOVE REMOTE FILE TO LOCAL ; Open the output file. 40$: MOV #OUTFDB,R0 ; ADDRESS OF THE OUTPUT FDB MOV #OUTFDB+F.FNB,R1 ; ADDRESS OF THE OUTPUT FNB MOV #FILNAM,R2 ; ADDRESS OF LOCAL FILE NAME MOV #'W,R3 ; SPECIFY OPEN FOR WRITE CALL OPEN ; TRY TO OPEN THE FILE BCC 45$ ; IF CC, SUCCESS CALL FILERR ; ELSE REPORT THE ERROR BR 30$ ; AND TRY AGAIN 45$: CALL WRTCCM ; TELL USER HOW TO ABORT CALL MAKNAM ; MAKE EXPANED FILE NAME CALL INTFIL ; INIT THE FILE COUNTERS MOVB #SYN,CODE ; TELL REMOTE TO START SENDING ; Read a record, check for errors, and write it to the output file. 60$: TST ABOFLG ; CTRL/C TYPED TO ABORT ? BNE 80$ ; IF NE, YES (CLOSE FILE) CALL READIT ; ISSUE A READ TO THE REMOTE MOV #CODE,R2 ; BUFFER TO SEND THE REMOTE MOV #1,R3 ; SET UP THE BYTE COUNT CALL WRITIT ; WRITE THE CONTROL CODE WTSE$S #REMOTE ; WAIT FOR THE REMOTE READ MOV #RBUFF,R2 ; ADDRESS OF BUFFER RECEIVED MOV RIOSB+2,R3 ; COPY THE BYTE COUNT BEQ 70$ ; IF EQ, TRANSMISSION ERROR CMP R3,#6 ; IS IT DATA OR CONTROL ? BGT 65$ ; IF GT, CHECK FOR DATA CMPB (R2),#ACK ; DID WE RECEIVE AN ACK ? BEQ 60$ ; IF EQ, YES (FROM "SYN" ABOVE) CMPB (R2),#EOF ; DID WE GET END-OF-FILE ? BEQ 80$ ; IF EQ, YES (CLOSE THE FILE) BR 70$ ; NO, PRESUME TRANSMISSION ERROR ; ; Received possible data record, check the bytecount and checksum. ; ; Record format: ; ; bbbbcccrrr...rrr ; ; Where: ; bbbb = the byte count (blank filled on left). ; ccc = the checksum ( " " " " ). ; rrr = the record data. ; 65$: MOV #RBUFF,R0 ; ADDRESS OF RECEIVED BUFFER MOV #4,R5 ; NUMBER OF BYTES IN CONVERSION CALL CONVRT ; CONVERT THE BYTE COUNT BCS 70$ ; IF CS, ILLEGAL CHARACTER SUB #7,R3 ; ADJUST THE RECEIVED BYTE COUNT CMP R1,R3 ; DOES EXPECTED = RECEIEVED ? BNE 70$ ; IF NE, NO (SEND A "NAK") ; Don't destroy the byte count in R3. MOV #3,R5 ; # OF BYTES FOR THE CHECKSUM CALL CONVRT ; CONVERT IT TO BINARY BCS 70$ ; IF CS, ILLEGAL CHARACTER MOV R1,R2 ; COPY THE RECEIVED CHECKSUM MOV R0,R4 ; COPY THE DATA BUFFER ADDR MOV R3,R5 ; COPY THE BYTE COUNT CALL CHKSUM ; CALCULATE THE CHECKSUM CMP R1,R2 ; DOES EXPECTED = RECEIEVED ? BNE 70$ ; IF NE, NO (SEND A "NAK") ; Ready to output the record to the output file. MOV R0,R2 ; COPY THE OUTPUT BUFFER PUT$ #OUTFDB,R2,R3 ; WRITE RECORD RECEIVED BCS 80$ ; IF CS, ERROR CALL RSTAT ; UPDATE THE STATISTICS MOVB #ACK,CODE ; SEND AN ACKNOWLEGMENT BR 60$ ; AND GET THE NEXT RECORD ; Received a bad transmission. 70$: MOVB #NAK,CODE ; SEND A NEGATIVE ACKNOWLEGMENT INC NAKCNT ; COUNT THE NAK CALL REPERR ; REPORT THE ERROR BR 60$ ; AND TRY AGAIN... ; Error encountered or end of file from remote. 80$: MOV #OUTFDB,R0 ; ADDRESS OF OUTPUT FDB TSTB F.ERR(R0) ; DID WE GET AN FCS ERROR ? BPL 85$ ; IF PL, NO MOV #-1,ABOFLG ; SHOW WE ARE ABORTING CALL FILERR ; YES, REPORT THE ERROR 85$: CALL .TRNCL ; TRUNCATE AND CLOSE FILE CALL TBLANK ; WRITE BLANK LINE TO TTY TST ABOFLG ; WERE WE ABORTED ? BNE 90$ ; IF NE, YES CALL WRTSUC ; ELSE, TELL USER WE'RE DONE CALL SACK ; TELL REMOTE WE GOT EOF CALL READIT ; EXPECT "EOT" NEXT WTSE$S #REMOTE ; WAIT FOR IT (PRESUME SUCCESS) CALL SACK ; TELL REMOTE "EOT" RECEIVED BR 95$ ; AND CONTINUE ... ; We had an unexpected error reading from the file. 90$: CALL WRTABO ; AND WRITE ABORT MESSAGE CALL SCAN ; CANCEL THE TRANSMISSION ; Get the status report from the SNDRCV program. 95$: CALL GETSTA ; GET SNDRCV STATUS REPORT 100$: RETURN ;+ ; ; CONVRT - This routine converts a decimal ASCII number to a binary ; number stripping off leading spaces. ; ; Inputs: ; R0 = the input buffer address. ; R5 = the number of bytes to move. ; ; Outputs: ; R1 = the converted number in binary. ; ;- CONVRT: JSR R5,$SAVRG ; SAVE REGISTERS R3 - R5 MOV #INCMD,R4 ; USE AS CONVERSION BUFFER ; Skip past all spaces first. 10$: CMPB (R0),#SPACE ; IS THIS A SPACE ? BNE 20$ ; IF NE, NO INC R0 ; YES, POINT PAST IT SOB R5,10$ ; CHECK THE NEXT BYTE CLR R1 ; SET THE COUNT TO ZERO BR 90$ ; RETURN THE COUNT ; Move the remaining characters to conversion buffer. 20$: MOVB (R0)+,(R4)+ ; MOVE THE NEXT BYTE SOB R5,20$ ; BR TILL DONE CLRB (R4) ; SET IN THE TERMINATOR MOV R0,-(SP) ; SAVE R0 TO RETURN MOV #INCMD,R0 ; ADDRESS OF STRING TO CONVERT CALL $CDTB ; CONVERT DECIMAL TO BINARY MOV (SP)+,R0 ; RESTORE UPDATED R0 TST R2 ; GET EXPECTED TERMINATOR ? BNE 100$ ; IF NE, NO 90$: CLC ; SHOW SUCCESS RETURN 100$: SEC ; SHOW FAILURE RETURN .END