C C C P A S S 1 C C PASS1 ASSEMBLY CONTROL C C THIS ROUTINE PERFORMS THE PASS ONE OPERATIONS.DURING PASS ONE THE C FOLLOWING FUNCTIONS ARE PERFORMED: C F1: EACH SOURCE LINE IS READ FROM THE SOURCE FILE.LINES WHICH C ARE 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 THE SYMBOL TABLEIS SEARCHED FOR THE C SYMBOL.IF THE SYMBOL IS FOUND IT IS FLAGGED AS MULTIPLY C DEFINED.IF THE SYMBOL IS NOT FOUND IT IS ENTERED INTO THE C SYMBOL TABLE AND ITS VALUE IS SET TO THE VALUEOF THE P- C COUNTER. ( THIS MAY CHANGE LATER ) C F4: IF AN OPCODE IS FOUND THE OPCODE TABLE IS SEARCHED FOR THIS C SYMBOL.IF THE OPCODE WAS NOT FOUND THEN THE P-COUNTER IS C INCREMENTED BY 3 AND THE NEXT LINE IS READ.THIS INCREMENT C IS TO ALLOW PASS 2 TO INSERT A LONG BRANCH TO THE UNDEFINED C INSTRUCTION. IF THE OPCODE WAS FOUND AND IS NOT A PSEUDO-OP C THE P-COUNTER IS INCREMENTED BY THE SIZE(NUMBER OF BYTES) C OF THE INSTRUCTION.IF THE OPCODE IS A PSEUDO-OP THEN THE C ROUTINE P1SUDO IS CALLED TO PERFORM THE REQUIRED FUNCTIONS. C THE PSEUDO OP .ORG WILL SET THE VALUE OF THE P-COUNTER TO A C NEW VALUE. OTHER PSEUDO-OPS WILL INCREMENT THE P-COUNTER BY C A VARIABLE NUMBER OF BYTES DEPENDING ON THE VALUE OF THE C EXPRESSION IN THE OPERAND FIELD. C C THERE ARE 2 SPECIAL SYMBOLS WHICH MAY APPEAR IN THE LABEL FIELD AND C THE OPCODE FIELD. THEY ARE THE @ SYMBOL AND THE EQUAL SIGN =. THE C @SIGN REPRESENTS THE P-COUNTER.IF FOUND IN THE LABEL FIELD THEN C AN EQUAL SIGN OR .EQL PSEUDO-OP MUST APPEAR IN THE OPCODE FIELD. C IE.@.EQL#F3A C @=#F3A C EITHER CONSTRUCTION WILL SET THE P-COUNTER TO THE EXPRESSION VALUE. C NORMALLY A .ORG PSEUDO-OP WOULD BE USED TO PERFORM THIS FUNCTION. C C SUBROUTINE PASS1 INCLUDE 'BSUCOM.CMN' INCLUDE 'OUTLIN.CMN' INCLUDE 'PRMSYM.CMN' INCLUDE 'SRCLIN.CMN' INCLUDE 'USRSYM.CMN' INTEGER BLANKS , EQUALS , HERE EQUIVALENCE ( KEYCHR(12) , BLANKS ) , ( KEYCHR(21) , EQUALS ) EQUIVALENCE ( KEYCHR(27) , HERE) INTEGER*4 IVAL C D WRITE (4,1) D 1 FORMAT (' PASS1 CALLED') 10 CONTINUE REMIDX = 0 CALL GETLIN ( IFLAG ) !READ A LINE IF ( IFLAG .LT. 0 ) GO TO 80 !? END OF FILE ? IF ( LABEL(1) .EQ. BLANKS ) GO TO 20 !? NO LABEL ? IF ( LABEL(1) .EQ. HERE) GO TO 60 !?LABEL FIELD = @ ? IF ( LABIDX.GT.0) SYMFLG(LABIDX) = 'M' !MULTIPLE DEFINITION IF ( LABIDX.LT.0) CALL PUTSYM (LABEL,LABIDX,PCNTR,'R') 20 CONTINUE IF ( OPDATA(1) .EQ. BLANKS ) GO TO 10 !? NO OPCODE FIELD ? IF ( OPDATA(1) .NE. EQUALS ) GO TO 30 !? OPCODE FIELD IS = ? OPINDX = EQLIDX !YES GO TO 50 30 CONTINUE !NO IF ( OPINDX .NE. -1 ) GO TO 40 !? LEGAL OPCODE ETC. ? PCNTR = PCNTR + 3 !NO GO TO 10 40 CONTINUE !YES IF ( OPINDX .GT. XTDIDX .AND. OPINDX .LE. SUDONM ) GO TO 50 IF (OPINDX.EQ.19.OR.OPINDX.EQ.20) GO TO 70 !+SHL OR +SHR PCNTR = PCNTR + OPCSIZ(OPINDX) GO TO 10 C C PSEUDO-OPCODES C 50 CONTINUE CALL P1SUDO ( IFLAG ) IF ( IFLAG .EQ. -1 ) GO TO 80 GO TO 10 C C OPCODE FIELD CONTAINS "=" C 60 CONTINUE IF ( OPDATA(1) .NE. EQUALS .AND. OPINDX .NE. EQLIDX ) GO TO 10 CALL XPRSIN ( IFLAG , IVAL ) IF ( IVAL .GE. 0 ) PCNTR = IVAL IF ( IVAL .LT. 0 ) CALL FLGERR ( 15 ) GO TO 10 C C EXTENDED INSTRUCTIONS WITH OPERAND = NBYTES OF CODE C 70 CONTINUE CALL XPRSIN(IFLAG,IVAL) IF (IVAL.LT.1.OR.IVAL.GT.4) CALL FLGERR(15) PCNTR = PCNTR+IVAL GO TO 10 80 RETURN END