C GETSND.FOR C C THESE ROUTINES PERFORM THE GET AND SEND FUNCTIONS FROM AND TO THE C PDP-10, VAX, OR PDP11. C C ROGER LIPSETT INTERMETRICS APRIL 27, 1979 C C MODIFICATION HISTORY C C TECOINPUT COMMAND ADDED MAY 11, 1979 - J. THOMPSON (REV 1.1) C MINOR EDITING FOR VAXNET J. THOMPSON (REV 1.2) C SUBROUTINE GETSND C INCLUDE 'COM.INC' C LOGICAL I, INIT10 C A COMMAND IS IN PROGRESS INCMD = .TRUE. C REENABLE THE ^C TRAPS. C& CALL SETCTRLC C TEST FOR TECO INPUT. NO PROTOCOL FOR TECOINPUT. IF(MODE.EQ.TECO) GO TO 100 !TECO MUST BE RUNNING C WHEN USING THE SNDRCV PROGRAM, THIS DOES THE HANDSHAKING. IF (.NOT. INIT10()) GO TO 2000 100 WRITE (6,9904) 9904 FORMAT(' NAME OF THE LOCAL CPU''S FILE? '$) READ (5,9905) VSIZE,VAXFIL 9905 FORMAT(Q,80A1) VAXFIL(VSIZE+1) = 0 IF (FLOW .EQ. IN) I = GET() IF (FLOW .NE. IN) I = SEND() IF (I) GO TO 3000 TYPE *, 'FILE TRANSMISSION ABORTED.' GO TO 2100 2000 TYPE *, 'ERROR INITIATING SNDRCV FILE TRANSFER PROGRAM.' 2100 TYPE *, ' RETURNING TO VIRTUAL TERMINAL LEVEL.' TYPE *, ' PLEASE SEND TWO ^C''S TO THE REMOTE TO STOP SNDRCV.' GO TO 3100 3000 CALL PRTFIN TYPE 3001, BCOUNT 3001 FORMAT( ' FILE TRANSMISSION COMPLETE, ',I,' BYTES TRANSFERRED.') 3100 CLOSE (UNIT=1) ! SAVE WHATEVER WE TRANSMITTED. INCMD = .FALSE. ! NO LONGER IN A COMMAND. C& CALL REENABLE RETURN END LOGICAL FUNCTION GET C C ROUTINE TO TRANSFER A FILE FROM THE REMOTE. THE MODE OF THE TRANSFER C IS STORED IN MODE ( A COMMON VARIABLE ). THE POSSIBILITIES ARE: C 1. ASCII. A NORMAL ASCII FILE, NO FORTRAN CARRIAGE CONTROL. C IN THIS CASE, ASCII OUTPUT TO THE VAX IS DONE TO A FILE WITH C CARRIAGECONTROL='LIST'. MAXIMUM LINE LENGTH C IS 200 BYTES (CONTROLLED BY LINE BUFFER ON THE REMOTE SIDE). C 2. LISTNG. A LISTNG FILE, WITH THE FIRST CHARACTER OF EACH C RECORD BEING THE FORTRAN CARRIAGE CONTROL CHARACTER. THE C REMOTE WILL NOT KNOW WHAT IS GOING ON, THE ONLY DIFFERENCE C BETWEEN THIS AND MODE ASCII BEING THAT THE FILE IN THIS MODE C HAS CARRIAGECONTROL='FORTRAN'. C 3. SYSGEN. (-10 ONLY) A UYK-20 SYSGEN FORMAT BINARY FILE. C SUCH A FILE IS PACKED TWO 16-BIT WORDS TO A 36-BIT WORD, C LEFT JUSTIFIED, ON THE -10. EACH RECORD HAS A COUNT RECORD C PRECEDING IT, WHICH IS NOT TRANSMITTED BY THE -10. THE BYTE C ORDER OF EACH WORD IS REVERSED IN THE TRANSFER. BYTES ARE C SPLIT UP INTO NIBBLES AND ORED WITH "100 TO PREVENT CONTROL C CHARACTER PROBLEMS IN THE RDPBLK. C INCLUDE 'COM.INC/NOLIST' C BYTE ACK INTEGER GETCHK,WRTRD,SYSQIO IF (MODE .EQ. ASCII) 1 OPEN (UNIT=1, NAME=VAXFIL, 2 CARRIAGECONTROL='LIST') IF (MODE .EQ. LISTNG) 1 OPEN (UNIT=1, NAME=VAXFIL, 2 CARRIAGECONTROL='FORTRAN') IF (MODE .EQ. SYSGEN) BUFIDX = 0 ! INITIALIZE THE BUFFER POINTER. IF (MODE .EQ. SYSGEN) 1 OPEN (UNIT=1, NAME=VAXFIL, FORM='UNFORMATTED', 2 RECORDSIZE=UYKSIZ) C SYNCHRONIZE WITH REMOTE CPU XBUFFR(1)=1HZ !SYNCH CHARACTER 5 IRCODE=WRTRD(1) IF(IRCODE.NE.NORMAL) CALL QIOERR(11,IRCODE) NBYTES=RIOSB(2) CALL STRPLF(IDX,RBUFFR,NBYTES) IF(NBYTES.EQ.1.AND.RBUFFR(IDX).EQ.1HY) GO TO 6 GO TO 5 !TRY AGAIN C C LOOP READING FROM THE REMOTE CPU. C 6 LINNUM = 0 ! INITIALIZE LINE COUNTER. BCOUNT = 0 ! AND BYTE COUNT. GET = .FALSE. ! DEFAULT TO ABORT RETURN. 10 IF (.NOT. INCMD) RETURN IRCODE = SYSQIO(,RCHNIN,RDPBLK, 1 RIOSB,,,RBUFFR,BUFSIZE,,,,) IF (IRCODE .EQ. CANCEL) RETURN IF (IRCODE .NE. NORMAL) CALL QIOERR(9,IRCODE) NBYTES = RIOSB(2) ! GET NUMBER OF BYTES READ. CALL STRPLF(IDX, RBUFFR, NBYTES) ! STRIP A LEADING LF IF ANY. ACK = 1HN ! INITIALIZE ACK TO "N" (RESEND) IF (NBYTES .LT. 3) GO TO 10 ! SOME SYSTEMS MAY SEND CR FIRST IF (NBYTES .LT. 7) GO TO 30 ! IF < 7 BYTES, ERROR, RESEND. C GET THE SIZE OF THE DATA AND THE CHECKSUM (4 AND 3 BYTES RESPECTIVELY) DECODE (7,9901,RBUFFR(IDX),ERR=30) DSIZE, CHKSUM 9901 FORMAT (I4,I3) IF (DSIZE .LT. 0) GO TO 100 ! IF < 0, END OF FILE. C NOW CHECK THE FOLLOWING THINGS: MAKE SURE LENGTH OF RECORD IS RIGHT, C THAT THE LENGTH OF A BINARY TRANSFER IS A MULTIPLE OF 8, AND THAT C THE CHKSUM CHECKS. C C CHANGE TILDAS TO TAB CHARACTERS C DO 15 I=1,DSIZE IF (RBUFFR(I+IDX+6) .EQ. '~') RBUFFR(I+IDX+6) = "11 15 CONTINUE IF (NBYTES .NE. DSIZE+7 .OR. 1 (MODE .EQ. SYSGEN .AND. MOD(DSIZE,8) .NE. 0) .OR. 1 (GETCHK(DSIZE,RBUFFR(IDX+7)) .NE. CHKSUM)) 1 GO TO 30 C IF HERE, EVERYTHING IS OK. WRITE THE RECORD TO THE OUTPUT FILE IN C THE CASE OF ASCII TRANSFERS, OTHERWISE CALL THE DECODING ROUTINE. LINNUM = LINNUM+1 ! INCREMENT LINE NUMBER ACK = 1HY ! AND SET ACK TO "Y" (OK) IF (MODE .NE. ASCII .AND. MODE .NE. LISTNG) GO TO 20 IF (DSIZE .GT. 0) 1 WRITE (1,9903) (RBUFFR(I+IDX+6),I=1,DSIZE) 9903 FORMAT (A1) IF (DSIZE .LE. 0) 1 WRITE (1,9908) 9908 FORMAT () GO TO 30 20 CONTINUE CALL DECBIN( RBUFFR(IDX+7), DSIZE ) 30 IF (ACK .EQ. 1HY) CALL DOYES (DSIZE) IF (ACK .NE. 1HY) CALL DONO (DSIZE) CALL SNDACK(ACK) ! SEND EITHER ACK OR NAK TO REMOTE. GO TO 10 ! LOOP BACK FOR NEXT LINE IF ANY. 100 ACK = 1HY CALL SNDACK(ACK) ! SEND ACK. IF (MODE .NE. SYSGEN) GO TO 110 BCOUNT = BCOUNT / 2 ! BYTE COUNT IS HALF # OF NIBBLES. ! EMPTY THE BUFFER. IF (BUFIDX .NE. 0) WRITE (1) (VAXBUF(I),I=1,BUFIDX) 110 CONTINUE GET = .TRUE. RETURN END SUBROUTINE DECBIN( TENBUF, NBYTES ) C C DECODES AN ASCII RECORD REPRESENTING A BINARY RECORD FROM THE C PDP-10. C INCLUDE 'COM.INC/NOLIST' C BYTE TENBUF(1) INTEGER NBYTES C INTEGER*4 ITMP ! BECAUSE OF INT OVERFLOWS ON CVTLB BYTE ITMPBY ! AND ON MULB BECAUSE OF SIGN EQUIVALENCE (ITMP,ITMPBY) ! EXTENSION PROBLEMS. C C DO SOME LOOP UNROLLING HERE FOR PROCESSING SPEED. SINCE WE KNOW THAT C THE FILE WILL BE AN INTEGRAL NUMBER OF TOPS-10 WORDS LONG, WE AVOID C LOOP OVERHEAD; SINCE WE KNOW VAXBUF IS AN INTEGRAL NUMBER OF VAX-11 C WORDS LONG, WE AVOID EXCESSIVE BUFFER FULL CHECKING. C DO 10 I=0,NBYTES-8,8 ! INCR 8 BYTES (NIBBLES) AT A TIME. IF (BUFIDX .NE. 4*UYKSIZ) GO TO 5 ! WRITE OUT THE BUFFER IF FULL WRITE (1) VAXBUF BUFIDX = 0 5 CONTINUE C NOW DECODE THE NIBBLES INTO THE BUFFER DO 20 J=2,8,2 ITMP = TENBUF(I+J-1) .AND. "77 ! CAUSE OF INT OVERFLOW ON 16* IF BYTE ITMP = 16*ITMP + (TENBUF(I+J) .AND. "77) 20 VAXBUF(BUFIDX+J/2) = ITMPBY ! SEE NOTE IN DECLARATION ABOVE. C FINALLY UP BUFFER POINTER. 10 BUFIDX = BUFIDX+4 ! DO NEXT GROUP OF NIBBLES. RETURN ! AND RETURN WHEN DONE. END LOGICAL FUNCTION SEND C INCLUDE 'COM.INC/NOLIST' C INTEGER GETCHK, WRIT10 IF (MODE .EQ. ASCII .OR. MODE .EQ. TECO) 1 OPEN (UNIT=1,TYPE='OLD',NAME=VAXFIL,ERR=200) IF (MODE .EQ. SYSGEN) 1 OPEN (UNIT=1, TYPE='OLD', NAME=VAXFIL, 2 FORM='UNFORMATTED', 3 RECORDSIZE=UYKSIZ, ERR=200) C C LOOP WRITING TO THE REMOTE CPU. C LINNUM = 0 BCOUNT = 0 SEND = .FALSE. ! INIT RETURN VALUE TO ABORT. 10 IF (.NOT. INCMD) RETURN IF (MODE .EQ. ASCII) 1 READ (1,9901,END=100) NBYTES,(XBUFFR(I+7),I=1,NBYTES) IF (MODE .EQ. TECO) 1 READ (1,9901,END=400) NBYTES,(XBUFFR(I+1),I=1,NBYTES) 9901 FORMAT (Q,A1) C& IF ((MODE .EQ. SYSGEN) .AND. C& 1 (.NOT. ENCBIN (XBUFFR(8), NBYTES))) GO TO 100 C TECO INPUT USES NO PROTOCOL IF(MODE .EQ. TECO) GO TO 300 C PROTOCOL IS USED HERE C WRITE TO THE REMOTE AND GET ACK/NAK BACK. 20 IF (.NOT. INCMD) RETURN IRCODE = WRIT10(NBYTES,GETCHK(NBYTES,XBUFFR(8)),NBYTES+7) IF (IRCODE .EQ. CANCEL) RETURN I = RIOSB(2) CALL STRPLF (IDX, RBUFFR, I) IF (I .NE. 1) GO TO 40 IF (RBUFFR(IDX) .NE. 1HY) GO TO 25 LINNUM = LINNUM + 1 CALL DOYES(NBYTES) GO TO 10 ! GO DO NEXT RECORD. 25 CONTINUE IF (RBUFFR(IDX) .NE. 1HN) GO TO 40 CALL DONO GO TO 20 40 TYPE *,'REMOTE CPU RETURNED NEITHER Y NOR N FOR CONFIRMATION.' RETURN C HERE FOR EOF ON INPUT. 100 IRCODE = WRIT10( -1, -1, 7 ) IF (IRCODE .EQ. CANCEL) RETURN I = RIOSB(2) CALL STRPLF (IDX, RBUFFR, I) IF (I .NE. 1) GO TO 110 IF (RBUFFR(IDX) .NE. 1HN) GO TO 105 TYPE *,'TRANSMISSION ERROR ON EOF MARKER: RETRYING.' CALL WAITAB('1') GO TO 100 105 CONTINUE IF (RBUFFR(IDX) .NE. 1HY) GO TO 110 SEND = .TRUE. RETURN 110 TYPE *,'REMOTE CPU RETURNED NEITHER Y NOR N FOR EOF CONFIRMATION.' RETURN 200 TYPE *,'ERROR OPENING INPUT FILE.' RETURN C SEND TECO INPUT LINE AND WAIT FOR ANY REPLY 300 IF(.NOT. INCMD) RETURN C& CALL CLRTYPE XBUFFR(1)=1HI !TECO INSERT COMMAND XBUFFR(NBYTES+2)="15 !CARRIAGE RETURN XBUFFR(NBYTES+3)="33 !ESCAPE XBUFFR(NBYTES+4)="33 !ESCAPE IRCODE=SYSQIO(,RCHNOT,WRPBLK, 1 XIOSB,,,XBUFFR,NBYTES+4,,,,) !SEND LINE TO TECO IF(IRCODE .NE. NORMAL) RETURN IRCODE=SYSQIO(,RCHNIN,RDPBLK, 1 RIOSB,,,RBUFFR,1,,,,) !TECO MUST PROMPT IF(IRCODE .NE. NORMAL) RETURN CALL WAITAB('1') !WAIT LETS ALL ECHOING COME TO REST LINNUM = LINNUM + 1 CALL DOYES(NBYTES) GO TO 10 C END OF TECO INPUT - CLOSE FILE AND EXIT WITH EX$$ 400 IF(.NOT. INCMD) RETURN XBUFFR(1)=1HE XBUFFR(2)=1HX XBUFFR(3)="33 XBUFFR(4)="33 C& CALL CLRTYPE IRCODE=SYSQIO(,RCHNOT,WRPBLK, 1 XIOSB,,,XBUFFR,4,,,,) !SEND EX$$ IF(IRCODE .EQ. CANCEL) RETURN IRCODE=SYSQIO(,RCHNIN,RDPBLK, 1 RIOSB,,,RBUFFR,1,,,,) !TECO MUST PROMPT IF(IRCODE .EQ. CANCEL) RETURN CALL WAITAB('1') IF(IRCODE .EQ. NORMAL) GO TO 410 TYPE *, 'TRANSMISSION ERROR ON TECO EX$$: RETRYING' GO TO 400 410 CONTINUE TYPE *, 'TECO TRANSMISSION COMPLETED. FILE CLOSED.' C& CALL CLRTYPE SEND = .TRUE. RETURN END INTEGER FUNCTION WRIT10(NBYTES, CHKSUM, BUFLEN) C C PUTS THE LENGTH AND CHKSUM INFORMATION INTO XBUFFR AND CALLS C WRTRD TO WRITE THE BUFFER OUT. C RETURNS THE STATUS CODE OF THE LAST SYSTEM SERVICE EXECUTED. C INCLUDE 'COM.INC/NOLIST' C INTEGER NBYTES, CHKSUM, BUFLEN INTEGER WRTRD C ENCODE (7,1,XBUFFR(1)) NBYTES, CHKSUM 1 FORMAT (I4,I3) WRIT10 = WRTRD(BUFLEN) RETURN END LOGICAL FUNCTION INIT10 C C THIS FUNCTION PERFORMS THE INITIAL HANDSHAKE WITH THE RUNNING SNDRCV C PROGRAM, BY SENDING IT THE DIRECTION AND MODE OF THE FILE TRANSFER, C AND THE NAME OF THE REMOTE CPU'S FILE. C INCLUDE 'COM.INC/NOLIST' C INTEGER WRTRD, TSIZE LOGICAL TRY10 BYTE TOVAX(5), TO10(5), ASC(6), SYSGN(6) DATA TOVAX/1HT,1HO,1HV,1HA,1HX/, TO10/1HT,1HO,1H1,1H0,1H / DATA ASC/1HA,1HS,1HC,1HI,1HI,1H /, SYSGN/1HS,1HY,1HS,1HG,1HE,1HN/ C INIT10 = .FALSE. ! SET VALUE OF FUNCTION TO FALSE. C PREPARE TO SEND THE DIRECTION. IF (FLOW .NE. IN) GO TO 10 DO 1 I=1,5 1 XBUFFR(I) = TOVAX(I) GO TO 12 10 CONTINUE DO 2 I=1,5 2 XBUFFR(I) = TO10(I) 12 CONTINUE IF (.NOT. TRY10(5)) GO TO 100 C PREPARE TO SEND THE MODE NAME. IF (MODE .NE. ASCII .AND. MODE .NE. LISTNG) GO TO 20 DO 3 I=1,6 3 XBUFFR(I) = ASC(I) GO TO 25 20 CONTINUE DO 4 I=1,6 4 XBUFFR(I) = SYSGN(I) 25 CONTINUE IF (.NOT. TRY10(6)) GO TO 100 C WE ESTABLISHED COMMUNICATION CORRECTLY. NOW OPEN THE -10 FILE. WRITE (6,9905) 9905 FORMAT(' NAME OF THE REMOTE CPU''S FILE? '$) READ (5,9906) TSIZE,(XBUFFR(I),I=1,TSIZE) 9906 FORMAT (Q,A1) IRCODE = WRTRD(TSIZE) IF (IRCODE .NE. NORMAL) CALL QIOERR(11,IRCODE) NBYTES = RIOSB(2) CALL STRPLF(IDX, RBUFFR, NBYTES) IF (NBYTES .EQ. 1 .AND. RBUFFR(IDX) .EQ. 1HY) INIT10 = .TRUE. IF (NBYTES .EQ. 1 .AND. RBUFFR(IDX) .EQ. 1HY) RETURN ! ERROR 100 TYPE 101,(RBUFFR(I),I=IDX,NBYTES+IDX-1) 101 FORMAT(1X,A1) RETURN END LOGICAL FUNCTION TRY10(SIZE) C C TRIES 10 TIMES TO INITIATE COMMUNICATION WITH THE REMOTE CPU. C INCLUDE 'COM.INC/NOLIST' INTEGER SIZE, RETRYS, WRTRD C TRY10 = .TRUE. DO 1 RETRYS = 1,10 ! TRY 10 TIMES. IRCODE = WRTRD(SIZE) IF (IRCODE .NE. NORMAL) GO TO 1 ! CHECK FOR "Y" OR "N" NBYTES = RIOSB(2) C TYPE 500, NBYTES, (RBUFFR(I),I=1,NBYTES) C 500 FORMAT (' ',I3,80A1) CALL STRPLF(IDX, RBUFFR, NBYTES) ! STRIP LEADING LF IF ANY. IF (NBYTES .NE. 1) GO TO 4 IF (RBUFFR(IDX) .EQ. 1HY) RETURN IF (RBUFFR(IDX) .NE. 1HN) GO TO 4 1 CONTINUE TRY10 = .FALSE. RETURN ! RETURN IN DISGRACE. 4 TYPE *,'THE REMOTE CPU RETURNED NEITHER Y NOR N.' TRY10 = .FALSE. RETURN END SUBROUTINE CLRTYP C C CLEARS THE TYPEAHEAD BUFFER ON THE REMOTE CHANNEL. C INCLUDE 'COM.INC/NOLIST' C IRCODE = SYSQIO(,RCHNIN, 1 RDPBLK+PURGE, 2 RIOSB,,,RBUFFR,0,,,,) RETURN END SUBROUTINE DOYES(NBYTES) C C UPDATES BCOUNT BY THE NUMBER OF BYTES AND PRINTS A MESSAGE IF C NEEDED. C INCLUDE 'COM.INC/NOLIST' C INTEGER NBYTES C BCOUNT = BCOUNT + NBYTES IF (0 .EQ. MOD(LINNUM,10)) TYPE 1,LINNUM-9,LINNUM 1 FORMAT(' RECORDS ',I4,' THROUGH ',I4,' SUCCESSFULLY' 1 ' TRANSFERRED.') RETURN ENTRY DONO TYPE 2,LINNUM+1 2 FORMAT (' TRANSMISSION ERROR ON RECORD ',I4,': RETRYING.') CALL WAITAB('1') RETURN ENTRY PRTFIN ! WRITE OUT THE FINAL MESSAGE. IF (0 .NE. MOD(LINNUM,10)) GO TO 20 RETURN 20 CONTINUE IF (1 .NE. MOD(LINNUM,10)) GO TO 25 TYPE 3, LINNUM 3 FORMAT(' RECORD ',I4,' SUCCESSFULLY TRANSFERRED.') RETURN 25 CONTINUE TYPE 1, LINNUM+1-MOD(LINNUM,10), LINNUM RETURN END INTEGER FUNCTION GETCHK(LEN,BUFF) C C COMPUTES THE CHKSUM. C INTEGER LEN BYTE BUFF(1) GETCHK = 0 IF (LEN .LE. 0) RETURN DO 10 I=1,LEN 10 GETCHK = GETCHK + BUFF(I) GETCHK = GETCHK .AND. "777 RETURN END SUBROUTINE SNDACK(CODE) C C SENDS AN ACK/NAK CODE BACK TO THE REMOTE CPU. C INCLUDE 'COM.INC/NOLIST' C BYTE CODE C C& CALL CLRTYPE !CLEAR TYPE AHEAD BUFFER ON REMOTE CHANNEL RBUFFR(1) = CODE RBUFFR(2) = "15 I = SYSQIO(,RCHNOT,WRPBLK, 1 RIOSB,,,RBUFFR,2,,,,) RETURN END SUBROUTINE STRPLF(IDX, BUFF, NBYTES) C C DETERMINES IF THE FIRST CHARACTER IN THE BUFFER IS A LINE FEED. C IF NOT, SETS IDX TO 1 (BUFFER INDEX) AND RETURNS. C IF SO, DECREMENTS NBYTES (BYTE COUNT), SETS IDX TO 2, AND RETURNS. C BYTE BUFF(1) INTEGER IDX, NBYTES IDX = 0 1 IDX = IDX+1 IF (BUFF(IDX) .EQ. "12) GO TO 1 NBYTES = NBYTES-IDX+1 RETURN END INTEGER FUNCTION WRTRD(LEN) C C APPEND A TO XBUFFR AND WRITE IT OUT, WITH LENGTH LEN. C THEN READ THE REMOTE CPU'S RESPONSE INTO RBUFFR. C INCLUDE 'COM.INC/NOLIST' INTEGER LEN C XBUFFR(LEN+1) = "15 DO 20 I=1,LEN IF (XBUFFR(I) .EQ. "11) XBUFFR(I) = '~' ! SET TAB TO TILDA 20 CONTINUE C& CALL CLRTYPE WRTRD = SYSQIO(,RCHNOT,WRPBLK, 1 XIOSB,,,XBUFFR,LEN+1,,,,) IF (WRTRD .NE. NORMAL) RETURN C RECEIVE THE ACK/NAK BACK FROM THE REMOTE CPU. 100 IF(.NOT. INCMD) RETURN 110 WRTRD = SYSQIO(,RCHNIN,RDPBLK, 1 RIOSB,,,RBUFFR,1,,,,) IF (RIOSB(2) .EQ. 0) GO TO 110 IF(RBUFFR(1).LE."40) GO TO 100 IF(RBUFFR(1).EQ."177) GO TO 100 RETURN END SUBROUTINE WAITAB(SECOND) C THIS SUBROUTINE JUST WAITS A LITTLE THEN RETURNS DO 10 I=1,20000 10 CONTINUE RETURN END SUBROUTINE QIOERR (IN,ICODE) IMPLICIT INTEGER*4 (A-Z) WRITE (5, 10) IN,ICODE 10 FORMAT (' LOCATION = ',I2,2X,'STATUS (DEC) = ',I6) STOP '*** QIO ERROR ***' END