C LOCATE -- SEARCHES .PRG FILE AND .CDE FILE FOR C THE PURPOSE OF INFORMING US AS TO WHERE C IN THE OBJECT TASK WE ARE, USING THE PROGRAM C COUNTER AND SEGMENT TABLE AS OUR ONLY KEY C (I CALL THIS THE PLEDGE OF LOCATE). C C INPUTS: IPC PROGRAM COUNTER C IOVLAY OVERLAY FLAG C C OUTPUTS: OSEG CURRENT SEGMENT C OMOD CURRENT MODULE C OCODE CURRENT LINE OF CODE C OLINE CURRENT LINE NO. C OCNT CONTENTS AT IPC C IERR ERROR FLAG C SUBROUTINE LOCATE(IPC,IOVLAY,OSEG,OMOD,OCODE,OLINE,OCNT,IERR) INTEGER IPC,IOVLAY,OSEG(3),OMOD(3),OCODE(40),OLINE INTEGER OCNT,OADD,ILIST,IERR,SEGTAB(5,200),WKBUF(3) BYTE MESAGE(216) INTEGER SGTLNT,TSEG(3),TMOD(3),TRAPTB(2,100) INTEGER*4 IREC1,IREC2,IREC3,CODREC COMMON/RECS/IREC1,IREC2,IREC3 COMMON/MESBUF/MESAGE COMMON/SEGS/SEGTAB,SGTLNT COMMON/TRAPS/TRAPTB IFLAG=.FALSE. IZERO=0 ILLFLG=.FALSE. I2=.FALSE. IF(IOVLAY.EQ..FALSE.)CALL STRMOV('NONOVL',1,6,SEGTAB(1,1),1) C C SEARCH +-100 REC'S IN .PRG FILE C 5 IF(IREC1.LT.100)GOTO20 DO 10 I=1,100 READ(1'IREC1,ERR=15)TSEG,TMOD,IBEG,IEND,ILST,ICNT1,CODREC IF(IPC.GE.IBEG.AND.IPC.LE.IEND)GOTO100 10 CONTINUE 15 IF(IFLAG.EQ..TRUE.)GOTO20 IF(IREC1.LT.200)GOTO20 IREC1=IREC1-200 IFLAG=.TRUE. GOTO5 C C TOP DOWN SEARCH IN .PRG FILE C C 20 IREC1=1 I2=.TRUE. 25 READ(1'IREC1,ERR=130)TSEG,TMOD,IBEG,IEND,ILST,ICNT1,CODREC IF(IPC.GE.IBEG.AND.IPC.LE.IEND)GOTO100 GOTO25 C C VERIFY HIT SEGMENT IS THE SEGMENT IN MEMORY(RE: POSS. MULTI-SEGMENTS) C C 100 DO 120 II=1,SGTLNT IF(LTEQGT(TSEG,SEGTAB(1,II),IZERO).EQ.0.AND.SEGTAB(4,II).EQ.1 + .AND.SEGTAB(5,II).EQ.1)GOTO110 120 CONTINUE IF(I2.EQ..TRUE.)GOTO25 GOTO10 C C C HIT A SEGMENT AND MODULE C 110 CALL STRMOV(TSEG,1,6,OSEG,1) CALL STRMOV(TMOD,1,6,OMOD,1) ILIST=.TRUE. IF(ILST.LE.0)ILIST=.FALSE. IF(ILST.LT.0)ENCODE(62,140,MESAGE)TSEG,TMOD 140 FORMAT(' SEGMENT: ',3A2,' MODULE: ',3A2,' HAS VARIABLES BUT', + ' NO CODE FILE') IF(ILIST.EQ..TRUE.)GOTO200 OCNT=ICNT1 OADD=IBEG IF(ILST.LT.0)RETURN ENCODE(80,125,MESAGE)TSEG,TMOD 125 FORMAT(' SEGMENT: ',3A2,' MODULE: ',3A2,' IS WITHOUT SYMBOLS', + ' ') RETURN C C LOST -- NOT FOUND IN TABLES C 130 CALL STRMOV('ILLSEG',1,6,OSEG,1) CALL STRMOV('ILLMOD',1,6,OMOD,1) CALL PUTBLK(OCODE,80,1,80) ENCODE(48,135,MESAGE)IPC 135 FORMAT(' TRAPED AT: ',O6,' PC POINTS TO UNKNOWN ROUTINES') ILLFLG=.TRUE. GOTO230 C C C C LOCATE CODE C 200 IF(CODREC.GE.IREC3)GOTO220 IFLAG=.FALSE. I2=.FALSE. C C SEARCH +-100 REC'S IN .CDE FILE C 205 IREC3=IREC3-1 IF(IREC3.LE.0)GOTO220 DO 210 I=1,100 READ(3'IREC3,ERR=215)TSEG,TMOD,OLINE,OADD,OCODE,OCNT IF((LTEQGT(TSEG,OSEG,IZERO).EQ.0.AND. + LTEQGT(TMOD,OMOD,IZERO).EQ.0).AND. + (IPC.EQ.OADD))RETURN 210 CONTINUE 215 IF(IFLAG.EQ..TRUE.)GOTO220 IF(IREC3.LT.200)GOTO220 IREC3=IREC3-200 IFLAG=.TRUE. GOTO205 C C TOP DOWN SEARCH FROM REC 1 OR LAST LOCATION FIRST C 220 IREC3=CODREC 225 READ(3'IREC3,ERR=230)TSEG,TMOD,OLINE,OADD,OCODE,OCNT IF((LTEQGT(TSEG,OSEG,IZERO).EQ.0.AND. + LTEQGT(TMOD,OMOD,IZERO).EQ.0).AND. + (IPC.EQ.OADD.OR.IBEG.EQ.IPC))RETURN GOTO225 C C C C 230 IF(I2.EQ..TRUE.)GOTO300 IREC3=1 I2=.TRUE. GOTO225 300 CALL PUTBLK(OCODE,80,1,80) DO 231,I=1,100 IF(IPC.EQ.TRAPTB(1,I))GOTO232 231 CONTINUE IF(ILLFLG.EQ..TRUE.)GOTO255 GOTO233 232 OCNT=TRAPTB(2,I) ENCODE(34,234,MESAGE)I,IPC 234 FORMAT(' TRAP NO.',I3,' ENCOUNTERED AT:',O6) RETURN 233 ENCODE(50,235,MESAGE)OSEG,OMOD,IPC 235 FORMAT(' NO EXCUTABLE CODE FOUND AT: ',3A2,1X,3A2,1X,O6) 240 ENCODE(40,245,MESAGE(74))OSEG,OMOD,IPC 245 FORMAT(' *WE ARE STUCK IN: ',3A2,1X,3A2,1X,O6) ENCODE(44,250,OCODE)IPC 250 FORMAT(' *BPT AT PC=',O6,' MUST BE MANUALY RESTORED*') 255 IERR=.TRUE. RETURN END