C PROGRAM SNDFIL.FT C ----------------- C C C C AN INTER-PDP8 BATCH FILE TRANSMISSION PROGRAM C ----------------------------------------------- C C C PETER LEMKIN C NATIONAL INSTITUTES OF HEALTH C BETHESDA, MD 20014 C C C C JULY 9, 1972 C REVISED NOVEMBER 29, 1972 C C C C ABSTRACT C ------- C "SNDFIL" STACKS A LIST OF UP TO 240 FILE NAMES OF FILES ON C DEVICE DSK: (WHICH IS ASSIGNABLE). THIS SET OF FILES RESIDING C ON PDP8#1 IS THEN TRANSFERED TO A SECOND COMPUTER, A C PDP8#2 VIA A PT08 OR DC02G LINK. THE PDP8#2 HAS A PROGRAM C CALLED "RECVER" RUNNING TO PUT THE FILES WHICH C IT RECEIVES FROM PDP8#1 ONTO ITS (ASSIGNABLE) DSK:. C CORE IMAGES FOR PDP8'S WITH PT08'S (SNDFL8.SV, RECVR8.SV) C AND WITH DC02G'S (SNDFLG.SV, RECVRG.SV) ARE ALSO GIVEN. C C C**PAGE C C INTRODUCTION C ------------- C PROGRAM "SNDFIL" IS USED ON PDP8#1 TO SEND THE SPECIFIED C FILE OF A OS/8 DEVICE DSK: FILE TO THE PDP8#2 DEVICE DSK:. C PDP8#2 WILL PUT THIS INFORMATION (RECEIVED VIA A DC02G OR C PT08 TYPE DATA LINK.) ON A DSK: FILE OPENED BY PDP8#2. C THIS IS ACCOMPLISHED ON PDP8#2 BY A PROGRAM CALLED C "RECVER.SV". "RECVER" IS USED TO SYNCHRONIZE AND BUFFER C THE TRANSMISSION. THE SERIAL "SEND" DATA TRANSMISSION DEVICE C MAY BE DEFINED AS A PT08 OR DC02G (GROUP 0 STATION 2) DEVICE. C (WHERE GROUP 0 STATION 1 IS THE CTY:). C THE TYPE OF DEVICE USED IS SPECIFIED BY REMOVING THE "/" C FROM THE FRONT OF ONE OF THE FOLLOWING SYMBOL DEFINITIONS. C /ABSYM PT08 1 /DEFINE AS A PT08 LINK: C /ABSYM DC02G 1 /DEFINE AS A DC02G LINK: C THE DEVICE DSK: MAY BE ASSIGNED AT SYSTEM LEVEL. C C THE FOLLOWING PROTOCOL IS USED BY SUBROUTINE SEND.FT C ----------------------------------------------------- C 1. LOADS DSK: HANDLER INTO PDP8#1 CORE. C 2. GETS THE FILENAME FROM THE ARGUMENTS. C 3. WAITS FOR "#" FROM PDP8#2 BEFORE SENDING FILE NAME AND C LENGTH OF THE FILE. C 4. LOOKS UP THE FILE ON THE DSK: C AND CODES 3 BYTES/2 WORDS TO SEND THEM TO THE LINK:. C 5. WAITS FOR "#" TO CONFIRM RECEIPT AND THEN SENDS THE FILE C DATA TO THE PDP8#2 IN THE FOLLOWING FORMAT: C SENDS ONE BLOCK AT A TIME, AND WAITS FOR A "#" BEFORE C PROCEEDING. C 6. THE TWO MACHINES TYPE "DONE" WHEN DONE. C 7. AFTER IT COMPLETES THE TRANSMISSION, IT RETURNS... C IT ALSO RETURNS IF THERE IS A LOOKUP ERROR. C C C C C OPERATION C --------- C ASSIGN THE DEVICES DSK: ON PDP8#1 AND PDP8#2 IF NON-STANDARD. C START UP "RECVER" ON PDP8#2 AND "SNDFIL" ON PDP8#1. C THEY WILL AUTOMATICALLY SYNCHRONIZE WHEN THEY ARE READY. C PDP8#1 WILL ASK FOR A LIST OF FILE NAMES. ENTERING A C NULL FILE NAME WILL TERMINATE THE LIST AND CAUSE THE C FILE TRANSMISSION TO BEGIN. ENTERING THE WORD "INDIRECT" C WILL CAUSE THE LIST OF FILE NAMES TO BE SPECIFIED INDIRETLY C FROM A FILE TO BE SPECIFIED WHICH CONTAINS THE NAMES C OF THE FILES IN COLUMNS 1 TO 12. NOTE BY EDITING OUT THE C BLANK LINES OF A PIP /F DIRECTORY FILE, THIS MAY BE USED C TO SPECIFY THE FILES TO BE TRANSMITTED. C C C C LOADING SEQUENCE C ---------------- C .R LOADER C *SNDFIL.RL/2/I - LOAD INTO FIELD 2 C *SEND.RL/0 - LOAD INTO FIELD 0 C *UTIL2.SB - (CONTAINS SUBROUTINE EOF, ALSO IN DECUS) C *LIB8/L C *$ C .SAVE DSK:SNDFIL.SV C C C CORE REQUIRED C ------------- C THE SNDFIL.SV PROGRAM REQUIRES 12K CORE WHILE RECVER.SV C USES 8K CORE. C C C C C C C C SUBROUTINES USED C -------------------- C 1. SEND.FT - SENDS THE FILE TO THE 8/E. C 2. UTIL2.SB - CONTAINS A SUBR. EOF WHICH DETECTS GEN I/O EOF'S. C (NOTE USES THE DCO2 OR PTO8 VERSION NECESSARY.) C C C ***************************************************** C**PAGE C C COMMON IBUF DIMENSION FFF(2),III(6),IBUF(256),STACK(240,2) EQUIVALENCE (FFF(1),III(1)) C C C C C C 0. TELL THEM WHAT TO DO... WRITE(1,1984) 1984 FORMAT(/////,'1. CONNECT PDP8#1 TO PDP8#2.',/,'2. NOW, RUN 1 "RECVER" ON THE PDP8#2',/,'3. "INDIRECT" FOR INDIRECT FILES') C C C C C 1. CLEAR THE EOF FLAG, AND SET FLAGS. 2000 CALL EOF(IEOF) S TAD (4040 /SPACE S DCA \ISPACE S TAD (5640 /PERIOD S DCA \IPER MAX=240 KDEV=1 ISTKPNT=1 ISW=0 HHH1='INDIRE' IDEV=1 C FETCH THE DEVICE DSK: INTO CORE. C B WILL CONTAIN THE FLOATING DEVICE #. CALL SEND(0.0,B) IDVNM=B C C C C C C C 2. LOOP TO GET THE FILENAME. C TEST IF IT IS FROM THE TTY: OR DSK: INDIRECT FILE. 111 IF(IDEV-1)160,150,160 C C C C C 3. THE NAME IS FROM THE TTY. 150 ISW=0 IDEV=1 READ(IDEV,211)(IBUF(I),I=1,12) 211 FORMAT('FILE?: ',12A1) C C C C C 4.1 PACK THE BUFFER INTO FFF(1), AND FFF(2) 40 FFF(1)=0 FFF(2)=0 LEFT=0 DO 100 I=1,6 LEFT=1-LEFT IF(IBUF(I)-ISPACE)103,110,103 103 IF(IBUF(I)-IPER)101,110,101 101 J=(I-1)/2 IF(LEFT)104,104,102 C C C C 4.1.1 PACK THE FILENAME LEFT BYTE 102 IT=IBUF(I) S TAD \IT S AND (7700 S DCA \IT /LEFT BYTE III(J+1)=IT GOTO 100 C C C C C 4.1.2 PACK THE FILENAME RIGHT BYTE 104 IT=IBUF(I) S TAD \IT S RTR;RTR;RTR /SHIFT TO RIGHT BYTE S AND (0077 S DCA \IT III(J+1)=III(J+1)+IT 100 CONTINUE C C C 4.2 LOOK FOR A "." OR END OF IBUF STRING. 110 DO 120 I=1,12 IF(IPER-IBUF(I))120,130,120 120 CONTINUE C C C C 4.2.1 NO EXTENSION GIVEN. GOTO 50 C C C C C 4.2.2 PICK UP THE EXTENSION C DROP SPACES. 130 I=I+1 IF(IBUF(I)-ISPACE)131,50,131 131 IT=IBUF(I) S TAD \IT S AND (7700 S DCA \IT III(4)=IT I=I+1 IF(IBUF(I)-ISPACE)132,50,132 132 IT=IBUF(I) S TAD \IT S RTR;RTR;RTR S AND (0077 S DCA \IT III(4)=III(4)+IT GOTO 50 C C C C C C C 5. TEST THE INPUT TO SEE IF THE REQUEST IS FOR INDIRECT C FILE SPECIFICATION. 50 IF(HHH1-FFF(1))170,151,170 C C C C 6. IT IS INDIRECT , ASK THE NAME OF THE DSK: .DA FILE. 151 READ(1,1151)(IBUF(ICOW),ICOW=1,12) 1151 FORMAT('INDIRECT DSK: ".DA" FILE?: ',12A1) ISW=1 C GO PACK IT THEN OPEN THE INDIRECT .DA FILE GOTO 40 C C C C C 7. OPEN THE INDIRECT NAME LIST DSK: ".DA" TYPE FILE. 152 FFF(2)='DA ' CALL IOPEN('DSK',FFF(1)) ISW=0 IDEV=4 C C C C C 8. GO GET THE NAME INDIRECTLY FROM THE DISK FILE. 160 READ(4,171)(IBUF(I),I=1,12) 171 FORMAT(12A1) C C C C C C 9. TEST THE DSK: EOF FLAG TO SEE IF DONE WITH INDIRECT LIST. CALL EOF(IEOF) IF(IEOF)150,161,150 C C C C 10. NO, PRINT THE FILE NAME ON THE TTY. 161 WRITE(1,211)(IBUF(KJK),KJK=1,12) GOTO 40 C C C C C 11. TEST IF NULL FILENAME IS END OF THE LIST TO SIGNIFY EOF. 170 IF(FFF(1))114,304,114 C C C C C 12. DO LOOKUP TO TEST IF THE FILENAME IS ON DEVICE DSK:. C TRY AGAIN IF FAIL. C IF IT IS INDIRECT, FILL IN THE .DA..... 114 IF(ISW-1)1114,2014,1114 2014 FFF(2)='DA ' S\1114, CLA S TAD PNTR S DCA LOOKUPNAME S TAD \IDVNM /GET THE DEVICE #. S CPAGE 11 S 6212 S JMS 7700 /USR S 2 /LOOKUP ON DEVICE DSK: SLOOKUPNAME, 0 S 0 S JMP \113 /NOT THERE... S JMP \1333 /OK C C C 12.1. FILE NOT FOUND TELL THEM AND TRY AGAIN 113 CONTINUE S JMS 45 /CDFSKP S NOP WRITE(1,213) FFF(1),FFF(2) 213 FORMAT('FILE: ',A6,'.',A2, ' NOT FOUND') ISW=0 GOTO 111 C C C C C C C C 13. OK, IT WAS THERE CONTINUE. C TEST IF INDIRECT THEN GO DO INDIRECT FILE LOOKUP. 1333 IF(ISW)301,301,152 C C C C C C C 14. TEST IF MORE THAN MAX FILES, IF SO RESTART THE PROGRAM. 301 IF(ISTKPNT-MAX-1)303,302,302 C C C C C C C 15. FAILED BECAUSE TOO MANY FILES, GO RESTART. 302 WRITE(1,322) 322 FORMAT('TOO MANY INPUT FILES, TRY AGAIN ...') GOTO 2000 C C C C C 16. THE FILE WAS VALID, GO PUSH "FILE NAME"==>STACK. 303 STACK(ISTKPNT,1)=FFF(1) STACK(ISTKPNT,2)=FFF(2) ISTKPNT=ISTKPNT+1 GOTO 111 C C **PAGE C C ..................PHASE II.......................... C 16. DONE WITH INPUT GO POP AND PRINT THE FILES IN THE STACK. 304 JCOUNT=1 C C C C 17. LOOP HERE TO POP AND TEST IF DONE. 305 IF(JCOUNT-ISTKPNT)306,350,350 306 A=STACK(JCOUNT,1) B=STACK(JCOUNT,2) JCOUNT=JCOUNT+1 C C C C C C C 18. GO SEND IT TO THE 8/E CALL SEND(A,B) GOTO 305 C C C C C C 19. ALL DONE, SEND A !!!!!!.DA FILE NAME TO PDP8#2 C AND EXIT TO OS/8. 350 ISTKPNT=ISTKPNT-1 WRITE(1,1350)ISTKPNT 1350 FORMAT('SENT ',I3,' FILES TO THE PDP8/E') C ***SEND A DUMMY FILE TO THE PDP8#2 CALL OOPEN('DSK','!!!!!!') WRITE(4,1350)ISTKPNT CALL OCLOSE CALL SEND('!!!!!!','DA') C ***************************** READ(1,1351)JUNK 1351 FORMAT('TYPE "RETURN" TO EXIT TO OS/8',A2) CALL EXIT C C C C C C C POINTER USED BY THE SYSTEM LOOKUP SPNTR,\FFF END