C C CADNET V.20 C XMT -- SUBROUTINE TRANS C C THIS SUBROUTINE TRANSMITS A LINE OF THE FILE TO THE REMOTE C PDP-11. THE LINE IS CONTAINED IN THE PARAMETER LINE, ITS C LENGTH SPECIFIED BY LINLEN, AND A STATUS CODE RETURNED BY IDS. C SUBROUTINE TRANS(LINE,LINLEN,IDS) LOGICAL*1 LINE(512),SNDLIN(1024),ENQ,SP,RESPON(4),SOH,ESC,BEL,BS LOGICAL*1 TMPCHR,NULL LOGICAL ENDLIN PARAMETER EFN=1, REM=3, ERR=4, LINSIZ=40 COMMON /BUFFER/ ICNT,RESPON DATA ENQ, SP, ESC, SOH, BEL, BS /"5, "40, "33, "1, "7, "10/ DATA NULL /0/ C C MOVE LINE TO SNDLIN, ENCODING ALL TRANSMITION SEQUENCES. SNDLIN C WILL BE IN A FORM THAT CAN BE DIRECTLY TRANSMITTED TO THE REMOTE. C IF(LINLEN.GT.0) GOTO 1 C C CASE OF ZERO LENGTH LINES WRITE(REM,100)NULL CALL TIME ICOUNT = ICNT ICNT = 0 GOTO 25 C 1 J=1 !J NEXT POSITION IN SNDLIN (TRANSMIT LINE) DO 10 I=1,LINLEN !EXECUTE ONCE FOR EACH CHAR TO BE SENT. IF (LINE(I).GE.SP) GOTO 5 !CHECK FOR PRINTING CHARACTER IF (LINE(I).GE.0) GOTO 4 !CONTROL CHARACTER C C NEGITIVE CHAR SECTION C SEQUENCE IS EITHER BEL C OR BS C DEPENDING ON WHETHER THE FIRST YIELDS A PRINTING CHAR SNDLIN(J) = BEL TMPCHR = LINE(I).AND."177 IF(TMPCHR.GE.SP) GOTO 3 TMPCHR= TMPCHR.OR."100 SNDLIN(J)=BS 3 CONTINUE SNDLIN(J+1) =TMPCHR J=J+2 GOTO 10 C C C NON PRINTING CHARACTER SECTION. SEND "ENQ " 4 CONTINUE SNDLINE(J)= ENQ SNDLINE(J+1)= LINE(I) + "100 J=J+2 GOTO 10 C C PRINTING CHARACTER SECTION 5 CONTINUE SNDLIN(J)=LINE(I) J=J+1 10 CONTINUE C C WRITE LINE IN LINSIZ BYTE BLOCKS. IF A BLOCK IN NOT THE LAST C IT ENDS WITH AN ESC CHAR. ENDLIN= .FALSE. DO 20 I=1,J-1,LINSIZ IERR=1 !DELETE IF(ENDLIN) GOTO 3000 C SEND SECTION OF THE LINE IF ((J-I).LE.LINSIZ) WRITE(REM,100) (SNDLIN(II),II=I,J-1) IF ((J-I).GT.LINSIZ) WRITE(REM,100) (SNDLIN(II),II=I,I+LINSIZ-1), ESC C WAIT FOR RESPONSE CALL TIME C CHECK FOR ERRORS IN REMOTE RESPONSE IF(ICNT.GT.2)ENDLIN=.TRUE. IF(RESPON(2).NE.(LINSIZ+"101)) ENDLIN=.TRUE. ICOUNT=ICNT ICNT=0 20 CONTINUE C 25 IF (ICOUNT.LT.4) GOTO 3000 !RESPONSE SHOULD BE 3 OR MORE C DECODE LENGTH OF TRANSMITTED LINE. IHIGH=RESPON(3) LOW=RESPON(4) LNSIZE= (IHIGH-"100) * "100 + (LOW-"100) D WRITE(ERR,1000) LINLEN,LNSIZE,IHIGH,LOW D1000 FORMAT('LINLEN = ',I5/' LNSIZE = ',I5/' IHIGH = ',O5/' LOW = ',O5) IF (LINLEN.NE.LNSIZE) GOTO 3000 !COMPARE TRANSMIT TO RECEIVE LINESIZE. RETURN C ERROR SECTION. BAD RESPONSE FROM REMOTE. C 3000 CONTINUE IDS=-1 WRITE (ERR,101)IERR RETURN C 100 FORMAT (X,251A1) 101 FORMAT (' REMOTE COMPUTER NOT RECEIVING PROPERLY,'/ & ' ABORTING COMMUNICTION',I5) END