SUBROUTINE RDLIN(CHAN,BUFFER,MAX,ERROR) INTEGER CHAN,BUFFER(1),MAX,ERROR INTEGER WORDS WORDS=(MAX+3)/4 READ(CHAN,1000,END=100)(BUFFER(I),I=1,WORDS) ERROR=1 RETURN 100 ERROR=9 RETURN 1000 FORMAT(20A4) END C C SUBROUTINE WRLIN(CHAN,BUFFER,CHARS) INTEGER CHAN,BUFFER(1),CHARS INTEGER WORDS WORDS=(CHARS+3)/4 WRITE(CHAN,1000)(BUFFER(I),I=1,WORDS) RETURN 1000 FORMAT(1X,33A4) END C C INTEGER FUNCTION GCHAR(BUF,INDEX) INTEGER BUF(1),INDEX INTEGER SHIFT(4),MASK(4),IPOS DATA MASK/ZFF000000,Z00FF0000,Z0000FF00,Z000000FF/ DATA SHIFT/ -24, -16, -8, 0/ I=ISHFT(INDEX+3,-2) IPOS=IAND(INDEX-1,3)+1 GCHAR=ISHFT(IAND(BUF(I),MASK(IPOS)),SHIFT(IPOS)) RETURN END C C C SUBROUTINE PCHAR(BUF,IDX,CHAR) INTEGER BUF(1),IDX,CHAR,SHIFT(4),MASK(4) INTEGER IPOS DATA MASK/Z00FFFFFF,ZFF00FFFF,ZFFFF00FF,ZFFFFFF00/ DATA SHIFT/ 24, 16, 8, 0/ I=ISHFT(IDX+3,-2) IPOS=IAND(IDX-1,3)+1 BUF(I)=IAND(BUF(I),MASK(IPOS))+ISHFT(IAND(CHAR,255),SHIFT(IPOS)) RETURN END C C SUBROUTINE OPENF(CHAN,FILE,ERROR) INTEGER CHAN,FILE(1),ERROR INTEGER STRING(10) INTEGER CHARF,CHART,COMMA,ZERO,BLANK INTEGER SUCESS,GCHAR INTEGER CHARC DATA CHARC/67/ DATA CHARF,CHART,COMMA,ZERO,BLANK/70,84,44,48,32/ DATA STRING/10*0/ ERROR=1 IF(CHAN.GT.99.OR.CHAN.LE.0)GOTO 30 CALL PCHAR(STRING,1,CHARF) CALL PCHAR(STRING,2,CHART) CALL PCHAR(STRING,3,CHAN/10+ZERO) CALL PCHAR(STRING,4,MOD(CHAN,10)+ZERO) CALL PCHAR(STRING,5,COMMA) DO 10 IK=1,32 I=GCHAR(FILE,IK) IF(I.EQ.0.OR.I.EQ.32)GOTO 20 CALL PCHAR(STRING,IK+5,I) 10 CONTINUE GOTO 30 20 CONTINUE IK=IK+5 CALL EST(',,C',STRING,IK,IK+2) IK=IK+2 CALL EMASFC('DEFINE',6,STRING,IK) IK=SUCESS(I) IF(IK.EQ.0)GOTO 40 WRITE(6,100)IK 100 FORMAT(' ',' RESULT CODE =',I6) 30 ERROR=-1 40 CONTINUE RETURN END C SUBROUTINE OPENN(CHAN,FILE,ERROR) INTEGER CHAN,FILE(1),ERROR CALL OPENF(CHAN,FILE,ERROR) RETURN END C C SUBROUTINE CLOSF(CHAN,FILE) INTEGER CHAN,FILE(1) INTEGER STRING,ZERO DATA STRING,ZERO/' ',48/ CALL CLOSEF(CHAN) CALL PCHAR(STRING,1,CHAN/10+ZERO) CALL PCHAR(STRING,2,MOD(CHAN,10)+ZERO) CALL EMASFC('CLEAR',5,STRING,2) RETURN END C C SUBROUTINE DELETE(CHAN,FILE) INTEGER CHAN,FILE(1) INTEGER GCHAR CALL CLOSF(CHAN,FILE) DO 10 IK=1,32 IF(GCHAR(FILE,IK).EQ.0.OR.GCHAR(FILE,IK).EQ.32)GOTO 20 10 CONTINUE 20 CONTINUE CALL EMASFC('DESTROY',7,FILE,IK-1) RETURN END C C SUBROUTINE SPOOL(CHAN,ERROR) INTEGER CHAN,ERROR RETURN END C C SUBROUTINE HDUMP(CHAN,BUF,CHARS) INTEGER CHAN,BUF(1),CHARS MAX=(CHARS+1)/2 WRITE(CHAN,1000)(BUF(IK),IK=1,MAX) 1000 FORMAT((/' ',10Z10)) RETURN END C C SUBROUTINE SET(VALUE,BUF,COUNT) INTEGER VALUE,COUNT,BUF(COUNT) INTEGER DVALUE,MASK DATA MASK/Z0000FFFF/ IDX=ISHFT(COUNT,-1) IF(IDX.LE.0)GOTO 20 DVALUE=ISHFT(VALUE,16)+VALUE DO 10 I=1,IDX BUF(I)=DVALUE 10 CONTINUE 20 CONTINUE IF(IAND(COUNT,1).EQ.0)GOTO 30 BUF(IDX+1)=IAND(BUF(IDX+1),MASK)+ISHFT(VALUE,-16) 30 CONTINUE RETURN END C C SUBROUTINE MOVE(FROMB,TOB,COUNT) INTEGER COUNT,FROMB(COUNT),TOB(COUNT) IDX=ISHFT(COUNT,-1) IF(IDX.LE.0)GOTO 20 DO 10 I=1,IDX TOB(I)=FROMB(I) 10 CONTINUE 20 CONTINUE IF(IAND(COUNT,1).EQ.0)GOTO 30 TOB(IDX+1)=IAND(TOB(IDX+1),NOT(MASK))+IAND(FROMB(IDX+1),MASK) 30 CONTINUE RETURN END