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 FOR THE MAX INSTRUCTION SIZE POSSIBLE. C 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 IS 1 SPECIAL SYMBOL WHICH MAY APPEAR IN THE LABEL FIELD AND C THE OPCODE FIELD. IT IS THE EQUAL SIGN =. THE $ SIGN C 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. $=0F3AH C THIS CONSTRUCTION WILL SET THE P-COUNTER TO THE EXPRESSION VALUE. C NORMALLY AN ORG DIR. 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 (5,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 (OPFLAG(OPINDX).EQ.-1) GO TO 75 ! ASM DIRECTIVE IF ( OPINDX.LE.SUDONM) GO TO 50 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 (IFLAG.NE.1) CALL FLGERR ( 15 ) GO TO 10 C C ASSEMBLER DIRECTIVES C 75 CONTINUE CALL P1DIR( IFLAG ) IF (IFLAG.EQ.-1) GO TO 80 GO TO 10 80 RETURN END