C C P A S S 2 C C PASS2 ASSEMBLY CONTROL C C THIS ROUTINE PERFORMS THE PASS TWO OPERATIONS. DURING PASS TWO THE C FOLLOWING FUNCTIONS ARE PERFORMED. C C F1: EACH SOURCE LINE IS READ FROM THE SOURCE FILE. LINES WHICH ARE C BLANK OR CONTAIN ONLY A COMMENT FIELD ARE IGNORED. C F2: EACH LINE IS CHECKED FOR A LABEL AND AN OPCODE FIELD. C F3: IF A LABEL IS FOUND IT IS SEARCHED FOR IN THE SYMBOL TABLE. IF C IT WAS MULTIPLY DEFINED (AS FLAGGED DURING PASS 1) AN 'M' ERROR C FLAG IS OUTPUT TO THE LISTING FILE AND THE ERROR COUNT IS IN- C CREMENTED. IF THE LABEL WAS NOT FOUND IT IS FLAGGED WITH AN 'L' C ERROR FLAG. C F4: THE OPCODE IS SEARCHED FOR IN THE OPCODE TABLE AND IF IT IS NOT C FOUND A 'U' ERROR FLAG IS OUTPUT TO THE LISTING FILE. THE CODE C FOR AN LBR @ INSTRUCTION (A LONG BRANCH TO THE LOCATION OF THE C BAD INSTRUCTION) IS INSERTED INTO THE BINARY OUTPUT.THIS ALLOWS C 3 BYTES FOR A PATCH IF ANOTHER ASSEMBLY IS NOT DESIRED. THIS C ALSO HAS THE ADVANTAGE THAT IF THE CODE IS INADVERTEDLY EXECUT- C ED THE PROGRAM WILL "HANG" AT THE LOCATION OF THE BAD INSTRUC- C TION (THIS IS USUALLY RATHER OBVIOUS WHEN IT HAPPENS). C F5: IF THE STATEMENT IS NOT A DIRECT ASSIGNMENT STATEMENT (IE.USING C THE EQUAL SIGN CONSTRUCTION) AND THERE IS A LABEL PRESENT, THE C PRESENT VALUE OF THE P-COUNTER IS COMPARED TO LABELS VALUE AND C IF IT HAS CHANGED A 'P' ERROR FLAG IS OUTPUT TO THE LISTING C FILE. C F6: IF THE OPCODE FIELD CONTAINS AN INSTRUCTION MNEMONIC AN IN- C STRUCTION IS BUILT. IF THE OPCODE FIELD CONTAINED A PSEUDO-OP C THEN THE PSEUDO-OP IS ACTED UPON. C SUBROUTINE PASS2 INCLUDE 'BSUCOM.CMN' INCLUDE 'OUTLIN.CMN' INCLUDE 'PRMSYM.CMN' INCLUDE 'SRCLIN.CMN' INCLUDE 'LSTHDG.CMN' INCLUDE 'USRSYM.CMN' INTEGER*4 IVAL INTEGER LBRERR , BLANKS , EQUALS , $ HERE EQUIVALENCE (KEYCHR(12) , BLANKS) EQUIVALENCE (KEYCHR(21) , EQUALS) EQUIVALENCE (KEYCHR(27) , HERE ) DATA LBRERR /2HC0/ C D WRITE (4,1) D 1 FORMAT (' PASS2 CALLED') 10 CONTINUE REMIDX = 0 CALL TRIVIA (5,IFLAG) !BLANK OUT ABSCOD CALL GETLIN(IFLAG) !READ A LINE IF (IFLAG.LT.0) GO TO 140 !? END OF FILE ? IF (LABEL(1).EQ.BLANKS) GO TO 40 !? NO LABEL FIELD ? IF (LABEL(1).EQ.HERE) GO TO 110 !? LABEL FIELD = @? IF (LABIDX.GT.0) GO TO 30 !? LABEL DEFINED ? IF (SYMNUM.GE.SYMMAX) CALL FLGERR(6) !F-ERR, TABLE FULL IF (SYMNUM.LT.SYMMAX) CALL FLGERR(12) !L-ERR, LABEL ERROR GO TO 40 30 CONTINUE CALL XREF(LABIDX,LINCNT+1,-1) !A SYMBOL DEFINITION IF (SYMFLG(LABIDX).EQ.'M') CALL FLGERR(13) !M-ERR 40 CONTINUE IF (OPDATA(1).EQ.BLANKS) GO TO 70 !NO OPCODE FIELD? IF (OPDATA(1).EQ.EQUALS) GO TO 80 !OPCODE IS =? IF (OPINDX.NE.-1) GO TO 50 !LEGAL OPCODE? ABSCOD(1) = LBRERR !ILLEGAL, SO INSERT CALL BINHEX(PCNTR,ABSCOD,4) !"LBR @" CALL FLGERR(21) !U-ERROR CALL PRTLIN(0) PCNTR = PCNTR+3 GO TO 10 50 CONTINUE IF (OPINDX.EQ.EQLIDX) GO TO 90 IF (LABEL(1).NE.BLANKS.AND.SYMVAL(LABIDX).NE.PCNTR) $ CALL FLGERR(16) !P-ERROR IF (OPINDX.LE.XTDIDX) GO TO 100 !EXTENDED INST.? IF (OPINDX.LE.SUDONM) GO TO 90 !PSEUDO-OP? D WRITE (4,2) OPINDX,SUDONM,EQLIDX,XTDIDX D 2 FORMAT (' PASS 2 , OPINDX, SUDONM, EQLIDX, XTDIDX = ',4I5) C C MACHINE INSTRUCTION C CALL BLDINS(IFLAG) CALL PRTLIN(0) PCNTR = PCNTR+OPCSIZ(OPINDX) GO TO 10 C C IF LABEL AND OPCODE FILED ABSENT BUT THERE APPEARS TO BE AN C OPERAND FIELD, THEN SOMETHING IS WRONG C 70 CONTINUE IF (LABEL(1).EQ.BLANKS.AND.OPDATA(1).EQ.BLANKS) $ CALL FLGERR(17) !Q-ERROR CALL PRTLIN(0) GO TO 10 C C