C PROGRAM RECVER.FT C ----------------- C C C C C C C PETER LEMKIN C NATIONAL INSTITUTES OF HEALTH C BETHESDA, MD 20014 C C C C JULY 9, 1972 C REVISED NOV 29, 1972 C C C INTRODUCTION C ------------ C "RECVER" IS USED ON PDP8#2 TO RECEIVE AN OS/8 FILE C FROM PDP8#1. THE FILE IS MOVED TO PDP8#2'S DSK: DEVICE. C THE FILE NAMES ARE THE SAME. THE DATE SHOULD BE ENTERED C ON PDP8#2 AND THE DSK: ASSIGNED TO THE APPROPRIATE C DEVICE BEFORE "RECVER" IS RUN. C THE USER IS REQUESTED TO START "RECVER" BY PDP8#1 WHEN C "SNDFIL" IS RUNNING ON PDP8#1. C C C C PROGRAM TERMINATION C -------------------- C "RECVER" WILL SIT IN A WAIT LOOP FOLLOWING THE COMPLETION C OF A FILE TRANSMISSION SO THAT ADDITIONAL FILES MAY BE C SENT. IF THE FILE SENT HAS THE NAME !!!!!!.DA, THEN AFTER C THE TRANSMISSION IS COMPLETED, CONTROL IS RETURNED TO OS/8. C C C C C C DATA FORMAT C ----------- C PROGRAMS "RECVER" AND "SNDFIL" USE ECHO CHECKING TO SEND C INDIVIDUAL CHARACTERS IN A BLOCK OF DATA WHICH IS 256 PDP8 C WORDS LONG. TWO PDP8 12BITT WORDS ARE BROKEN UP INTO THREE C 8BIT BYTES WHICH IS WHAT IS ACTUALLY SENT ON THE LINK. C THE "RECVER" PROGRAM REASSEMBLES THESE BYTES INTO PARIS OF 12 C BIT WORDS. AFTER EACH BLOCK IS RECEIVED, A "#" IS SENT TO C PDP8#1 WHEN PDP8#2 HAS PROCESSED THE BLOCK AND IS READY C FOR THE NEXT BLOCK OR FILE. C C C C C C THE FOLLOWING PROTOCOL IS USED: C ------------------------------- C 1. INITIAL CONSTANTS. C 2. SEND "#"'S TO PDP8#1 TO TELL IT TO SEND THE BLOCK C WITH THE FILENAME AND # OF BLOCKS. C 3. ENTER THE FILENAME ON DSK: ON PDP8#2. NOTE DSK: MAY BE C ASSIGNED. C 4. SEND A "#" TO THE PDP8#1 TO SIGNAL THAT IT CAN START C SENDING DATA IN GROUPS OF 1 BLOCK. C 5. IF THE ENTIRE FILE AREA HAS BEEN SENT AND RECEIVED, WE C ARE DONE. ELSE WRITE OUT THE BLOCK ONTO DSK: AND SEND A # C TO TELL PDP8#1 TO SEND SOME MORE DATA. C C C C C RECVER CONFIGUAION C ------------------- C THE SERIAL I/O DEVICE (CALLED THE LINK:) OF THE "RECVER" C MAY BE DETERMINED CONDITIONALLY BY SETTING THE FOLLOWING C SWITCHES BEFORE THE COMPILATION. REMOVE THE "/" OF THE C SWITCH DESIRED BEFORE COMPILATION. S /ABSYM DC02G 1 S ABSYM PT08 1 C C ***ADDITION OPCODES*** S OPDEF MQL 7421 C C C ***DCO2 OPCODES*** S IF DC02G, 5 S OPDEF MTLS 6126 S OPDEF MKRB 6116 S OPDEF MTON 6117 S SKPDF MTSF 6121 S SKPDF MKSF 6111 C C C C C ***PT08 OPCODES*** S IF PT08, 5 S OPDEF MTLS 6416 S OPDEF MKRB 6406 S SKPDF MTSF 6411 S SKPDF MKSF 6401 S OPDEF MTON 7200 /FAKE IT WITH A CLA C C C C **PAGE C COMMON IBUF DIMENSION IDEV(128),IBUF(256),FFF(2),III(6) EQUIVALENCE (FFF(1),III(1)) C C 1. INITIAL CONSTANTS 1 IW3=0 S TAD (1010 S MTON /SET DCO2G TO LINK: DEVICE. S CLA CLL DONE='!!!!!!' GOTO 10 SPFFF, \FFF /FILENAME POINTER. SPIBUF, \IBUF /DATA BUFFER POINTER. SPIDEV, \IDEV /DEVICE HANDLER BUFFER POINTER SDSKK, 0423 /DS S 1300 /K@ C C C C C 1.1 LOAD THE DSK: INTO CORE. S\10, CLA CLL S TAD DSKK /"DS" S DCA FT1 S TAD DSKK# /"K@" S DCA DEVNM S TAD PIDEV /HANDLER BUFFER S DCA DEVENTRY S CPAGE 13 S 6212 /CIF 10 S JMS 7700 /THE USR ROUTINE S 1 /FETCH SFT1, 0 SDEVNM, 0 SDEVENTRY, 0 S JMP \1010 /FETCH ERROR S JMP \20 /CONTINUE C C C 1.2 FETCH ERROR 1010 WRITE(1,1011)FFF(1),FFF(2) 1011 FORMAT('FETCH ERROR ON FILE: ',A6,'.',A2) GOTO 2000 C C C C C C C C C C C 2.0 PRINT MESSAGE AND SYNCHRONIZE PDP8#1 WITH A # C TO START IT SENDING THE DIRECTORY. 20 WRITE(1,21) 21 FORMAT(/,'RECVER') C WAIT BEFORE EACH # TO GIVE THE PDP8#1 TIME TO PROCESS IT. 122 DO 22 I=1,2047 22 CONTINUE SSENDIT, TAD ("# S MTLS SREADY, MTSF S JMP READY /NOT YET S MKSF /DID THEY ECHO IT YET? S JMP \122 /NOT YET. S MKRB /READ IT S TAD (-"# S SZA CLA S JMP \122 /NOT YET C C C C C 2.2 RECEIVE THE FILE NAME AND # OF BLOCKS IN THE FILE. S JMS RECEIVE DO 221 JJJ=1,6 221 III(JJJ)=IBUF(JJJ) C JJJ NOW CONTAINS THE FILE SIZE. JJJ=IBUF(7) C C C C 2.3 PRINT THE FILENAME AND FILE SIZE. WRITE(1,23) (IBUF(JJK),JJK=1,7) 23 FORMAT('FILE:=',6A2,', # BLOCKS=',I5) C C C C C C C 3.0 GO ENTER THE FILE NAME ON DSK: S TAD PFFF /SET UP FILE NAME POINTER S DCA BARG2 /IN ENTER CALL S TAD DEVNM /DEVICE NUMBER FROM THE LOOKUP S CPAGE 13 S 6212 /CIF 10 S JMS 7700 /USR S 3 /ENTER SBARG2, PFFF /POINTER TO FILE NAME SBARG3, 0 /MAX SIZE OF FILE ALLOWED. GOTO 131 GOTO 40 C C 3.1.1 DATA ERROR 131 WRITE(1,132)FFF(1),FFF(2) 132 FORMAT(/,'ENTER ERROR FILE: ',A6,'.',A2) GOTO 2000 C C C C C 4. SYNCHRONIZE THE PDP8#1 AFTER THE ENTER C TRANSMISSION SO IT CAN START SENDING THE FILE. 40 DO 499 II=1,JJJ S TAD BARG2 /GET THE STARTING BLOCK # S DCA \KKK IBLOCK=KKK+II-1 S TAD \II /# OF CURRENT LOGICAL BLOCK. S MQL S CLA S JMS SYNCH /SEND A #. C C C 4.1 RECEIVE A BLOCK INTO IBUF. S\41, JMS RECEIVE C C C C 4.2 WRITE THE BLOCK ONTO DSK: S\42, TAD PIBUF /SET UP THE BUFFER POINTER. S DCA CARG2 S TAD \IBLOCK /START BLOCK #. S DCA CARG3 S TAD DEVENTRY /SET UP ENTRY POINT. S DCA FENTRY S CPAGE 14 S 6202 /CIF 00 - ALL DEV HANDLERS IN FIELD 0. S JMS I FENTRY S 4210 /WRITE THE BLOCK FROM FIELD 1. SCARG2, 0 /BUFFER AREA IN COMMON SCARG3, 0 /BLOCK # GOTO 421 GOTO 499 SFENTRY, \IDEV /POINTER TO DEV HANDLER. C C C C 4.2.1 WRITE ERROR. 421 WRITE(1,422)FFF(1),FFF(2),IBLOCK 422 FORMAT(/,'WRITE DSK: ERROR FILE: ',A6,'.',A2,', BLOCK #=',I5) GOTO 2000 C C 4.99 DONE YET? IF SO RESYNC THE PDP8#1 TO TERMINATE IT. C AND CLOSE THE FILE ON DSK: 499 CONTINUE S TAD PFFF /POINTER TO FILENAME S DCA DARG2 S TAD \JJJ /# OF BLOCKS IN FILE. S DCA DARG3 S TAD DEVNM /DEVICE NUMBER FROM THE FETCH. S CPAGE 12 S 6212 /CIF 10 S JMS 7700 /USR S 4 /CLOSE FUNCTIONS SDARG2, 0 /NAME OF FILE SDARG3, 0 /# OF BLOCKS/FILE. S JMP \496 /CLOSE ERROR. S JMS SYNCH GOTO 555 C C C C 4.99.1 CLOSE ERROR 496 WRITE(1,497)FFF(1),FFF(2) 497 FORMAT(/,'CLOSE ERROR FILE: ',A6,'.',A2) GOTO 2000 C C C 5. DONE 555 WRITE(1,51)FFF(1),FFF(2) 51 FORMAT(/,'DONE FILE:',A6,'.',A2) IF(DONE-FFF(1))1,2000,1 C C C C C 6. CRASH EXIT. S\2000, CLA S TAD (2010 /RESET DCO2G TO CTY: S MTON S CLA CALL EXIT C C C **PAGE C C SUBROUTINE RECEIVE C ------------------ C RECEIVE THE DCO2G INTO THE COMMON BUFFER. C UNPACKING 3 BYTES / 2 WORDS. ECHO EACH CHARACTER C RECEIVED. C C SRECEIVE, 0 DO 88 J=1,256,2 S JMS IN /GET 1ST CHARACTER OF TRIPLE S DCA \IW1 S JMS IN /2ND CHARACTER OF TRIPLE S DCA \IW2 S JMS IN /THIRD CHARACTER OF TRIPLE. S DCA \IW3 S TAD \IW3 S RTL;RTL S AND (7400 S TAD \IW1 /FORM THE 1ST 12 BIT WORD... S DCA \IW1 S TAD \IW3 S RTL;RTL;RTL;RTL S AND (7400 S TAD \IW2 /FORM THE 2ND 12 BIT WORD. S DCA \IW2 IBUF(J)=IW1 IBUF(J+1)=IW2 88 CONTINUE C C SET UP RETURN. C S TAD RECEIVE S DCA REC2 S CPAGE 3 S JMP I REC2 /RETURN SREC2, 0 C C C C SUBROUTINE IN C ------------- C ACCEPT A DCO2 BYTE, ECHO IT AND RETURN WITH BYTE C IN ACC. C S CPAGE 23 SIN, 0 S CLA CLL S TAD (1010 /LINK: S MTON /SELECT LINK: S CLA CLL S MKSF S JMP IN# S MKRB /GET BYTE SIN2, MTLS /ECHO IT S MTSF S JMP IN2# /WAIT FOR ECHO DONE. S DCA ABC S TAD (2010 /CTY: S MTON /SELECT CTY: S CLA CLL S TAD ABC S JMP I IN SABC, 0 C C C SUBROUTINE SYNCH C ---------------- C SEND A # AND DO NOT WAIT FOR ECHO. C S CPAGE 23 SSYNCH, 0 S CLA S TAD (1010 /LINK: S MTON S CLA CLL S TAD ("# SSYN1, MTLS S MTSF S JMP SYN1# S CLA S TAD (2010 /CTY: SELECT S MTON S CLA CLL S JMP I SYNCH END