C PROGRAM TO CONVERT PROLOG ASCII HEX TO TEKTRONIX FORMAT. C ASSUMES THAT THE PROLOG INPUT FILE HAS EXACTLY 16 BYTES/LINE, SEPARATED C BY A SPACE. C FILED--15-JAN-80, G. BEVER. C MODIFIED TO TAKE CARE OF 'TEKLD' XFER PROBLEM (DUMMY BYTE ON END OF C RECORD). TO PREVENT PROBLEMS, SPECIFY EXACT BYTE COUNT. C CHECKS FOR '*' & '/' AS 1ST CHARS ON LINE ADDED--16-JAN-80, G. BEVER. C C COMPILE AS FOLLOWS: C C .COMPILE PROTEK/NOSWAP C C LINK AS FOLLOWS: C C .R LINK C *PROTEK=PROTEK,HEX,IHEXBN/F C DIMENSION ISTRT(2),NUMB(2),ICHKSM(2) INTEGER*2 ISPEC(39),JSWI(4,1) REAL*4 EXT(2) LOGICAL*1 IBUF(50),JBUF(150) DATA EXT/6RPROTEK,6RDATDAT/ DATA JSWI/'M',3*0/ DATA JBUF/150*"60/ C C GET INPUT & OUTPUT FILE NAMES. 5 IF(ICSI(ISPEC,EXT,,JSWI,1).NE.0) GO TO 5 C ASSIGN INPUT LOGICAL UNIT. CALL IASIGN(10,ISPEC(16),ISPEC(17),0,0) C ASSIGN OUTPUT LOGICAL UNIT. CALL IASIGN(11,ISPEC(1),ISPEC(2),0,0) C TYPE 101 101 FORMAT(' ENTER # OF BYTES (4 DIGITS IN HEX) '$) ACCEPT 102,(NUMB(I),I=1,2) 102 FORMAT(2A2) TYPE 103 103 FORMAT(' ENTER START ADDRESS (4 DIGITS IN HEX) '$) ACCEPT 102,(ISTRT(I),I=1,2) C CONVERT ASCII HEX #S INTO BINARY. JSTRT=IHEXB2(ISTRT) JNUMB=IHEXB2(NUMB) C CALCULATE END ADDRESS. JEND=JSTRT+JNUMB-1 C C READ PROLOG FORMAT LINE 10 READ(10,105)(IBUF(I),I=1,47) 105 FORMAT(100A1) C C IF NOTHING ON LINE, SKIP IT & READ ANOTHER. IF(IBUF(1).EQ."40) GO TO 10 C IF 1ST CHARACTER IS '*', SKIP IT & READ ANOTHER LINE. IF(IBUF(1).EQ."52) GO TO 10 C IF 1ST CHARACTER IS '/', XFER TERMINATOR BLOCK & END. IF(IBUF(1).EQ."57) GO TO 35 C C CALCULATE CHECKSUM. JCHKSM=0 DO 20 I=1,2 20 JCHKSM=JCHKSM+ICKSM(ISTRT(I)) JCHKSM=JCHKSM+2 C CONVERT CHECKSUM TO ASCII HEX. CALL HEX(JCHKSM,ICHKSM) C FILL IN TEKTRONIX FORMAT LINE HEADER. K=1 JBUF(K)="57 JBUF(K+1)=ISTRT(1) JBUF(K+2)=IRAM(ISTRT,8,"377) JBUF(K+3)=ISTRT(2) JBUF(K+4)=IRAM(ISTRT(2),8,"377) JBUF(K+5)="61 JBUF(K+6)="61 JBUF(K+7)=ICHKSM(2) JBUF(K+8)=IRAM(ICHKSM(2),8,"377) C SET UP START ADDRESS FOR NEXT LINE. JSTRT=JSTRT+16 C CONVERT IT TO ASCII HEX. CALL HEX(JSTRT,ISTRT) JCHKSM=0 L=1 C XFER DATA. K=K+9 DO 30 I=1,16 JBUF(K)=IBUF(L) JBUF(K+1)=IBUF(L+1) C FORM INTEGER FROM SINGLE BYTE VARIABLES. IN=JBUF(K) IN1=JBUF(K+1) IN=IOR(IAND(IN,"377),IRAM(IN1,8,"177400)) JCHKSM=JCHKSM+ICKSM(IN) K=K+2 30 L=L+3 C CONVERT CHECKSUM TO ASCII HEX. CALL HEX(JCHKSM,ICHKSM) C XFER CHECKSUM. JBUF(K)="60 JBUF(K+1)="60 K=K+2 JBUF(K)=ICHKSM(2) JBUF(K+1)=IRAM(ICHKSM(2),8,"377) K=K+1 L=L+2 C OUTPUT TEKTRONIX FORMAT LINE. WRITE(11,105)(JBUF(I),I=1,K) C IF MORE DATA, GO TO 10. IF(JSTRT.LE.JEND) GO TO 10 C ALL DONE, XFER TERMINATOR BLOCK. 35 K=1 JBUF(K)="57 K=K+1 DO 40 I=1,8 JBUF(K)="60 40 K=K+1 JBUF(K)="15 JBUF(K+1)="12 K=K+1 C OUTPUT TERMINATOR BLOCK. WRITE(11,105)(JBUF(I),I=1,K) C STOP END C FUNCTION ICKSM(IN) C FUNCTION TO CALCULATE TEKTRONIX CHECKSUM OF 2 ASCII HEX DIGITS. LSB=IOR(IAND(IN,"177400),"60) MSB=IOR(IRAM(IN,8,"177400),"60) ILSB=IHEXBN(LSB) IMSB=IHEXBN(MSB) ICKSM=ILSB+IMSB RETURN END C FUNCTION IHEXB2(IN) C FUNCTION TO CONVERT A 2 WORD ARRAY (4 ASCII HEX DIGITS) TO BINARY. DIMENSION IN(2) MSB=IHEXBN(IN(1)) LSB=IHEXBN(IN(2)) IHEXB2=IOR(IRAM(MSB,8,"177400),IAND(LSB,"377)) RETURN END