C C C D E C O D E C C DECODE PART OF SOURCE LINE C C THIS ROUTINE DECODES THE LABEL AND/OROPCODE FIELDS OF AN ASSEMBLY C LANGUAGE SOURCE STATEMENT.IF A SYMBOL IS FOUND IN EITHER FIELD IT C IS SEARCHED FOR IN THE APPROPRIATE SYMBOL TABLE.THE LABEL AND THE C OPCODE ARE PLACED IN THE INTEGER ARRAYS LABEL AND OPDATA RESPECTIVLY C (LABELED COMMON BLOCK /SRCLIN/ ).IF THE SYMBOLS WERE FOUND IN THE C SYMBOL TABLE THE TABLE INDEXES ARE PLACED IN THEINTEGER VARIABLES C LABIDX AND OPINDX RESPECTIVLEY ( LABELED COMMON BLOCK /OUTLIN/ ). IF C EITHER FIELD IS NOT PRESENT ITS ASSOCIATED SYMBOL ARRAY IS FILLED C WITH BLANKS AND THE ASSICIATED INDEX IS SET TO 0. C C DECODE ALSO CHECKS FOR THE SPECIAL SYMBOLS@ AND = .THE SYMBOL @ C IS LEGAL IN THE LABEL FIELD IF AND ONLY IF THE SYMBOL = OR THE .EQL C PSEUDO-OP IS PRESENT IN THE OPCODE FIELD. C SUBROUTINE DECODE ( IFLAG ) INCLUDE 'BSUCOM.CMN' INCLUDE 'OUTLIN.CMN' INCLUDE 'SRCLIN.CMN' INTEGER*4 ISYMVL INTEGER BLANKS , COLON , SYMBOL(6) , TABS , * EQUALS , HERE, SMICLN , APOSTR EQUIVALENCE ( KEYCHR(12) , BLANKS ) , ( KEYCHR(9) , COLON ) EQUIVALENCE ( KEYCHR(10) , SMICLN ) , ( KEYCHR(21) , EQUALS ) EQUIVALENCE ( KEYCHR(27) , HERE ) , ( KEYCHR(22) , APOSTR ) EQUIVALENCE ( KEYCHR(28) , TABS ) DO 10 I = 1 , 3 !ZERO OUT LABEL(I) = BLANKS !LABEL AND LABEL(I+3) = BLANKS OPDATA(I) = BLANKS !OPCODE 10 CONTINUE IFLAG= 0 !IFLAG IS FOR FUTURE USE LABIDX = 0 !INITIALIZE LABEL INDEX OPINDX = 0 !INITIALIZE OPCODE INDEX INDEX= 1 !INITIALIZE LINE CHARACTER POINTER D WRITE (4,1) LINBUF D 1 FORMAT (' DECODE START, LINBUF =',/,80A1) CALL FNDSYM ( LINBUF , INDEX , EOL , SYMBOL ) !GET NEXT SYMBOL IF ( SYMBOL(1) .EQ. BLANKS ) GO TO 70 !NO SYMBOL FOUND INDEX = INDEX + 1 !INCREMENT TO NEXT IF (LINBUF(1).NE.TABS.AND. $ LINBUF(1).NE.BLANKS) GO TO 12 !COL 1 LABEL IF (LINBUF(INDEX).EQ.EQUALS) GO TO 12 !? = ? CONSTRUCT IF ( LINBUF(INDEX) .NE. COLON ) GO TO 30 !?LABEL? 12 DO 15 I=1,6 LABEL(I) = SYMBOL(I) !YES 15 CONTINUE CALL GETSYM ( LABEL , LABIDX , ISYMVL , ISYMFL ) !CHECK SYMTAB IF (LINBUF(INDEX).EQ.EQUALS) GO TO 40 INDEX = INDEX + 1 C 20 CONTINUE CALL FNDSYM ( LINBUF , INDEX , EOL , SYMBOL ) !GET NEXT SYMBOL IF ( SYMBOL(1) .EQ. BLANKS ) GO TO 40 !NO SYMBOL FOUND 30 CONTINUE !YES SYMBOL FOUND OPDATA(1) = SYMBOL(1) !MUST BE OPCODE OPDATA(2) = SYMBOL(2) OPDATA(3) = SYMBOL(3) CALL GETOPC ( IOPCIX , IOPCFL ) !CHECK FOR LEGAL OPCODE INDEX = INDEX + 1 GO TO 45 40 CONTINUE IF ( LINBUF(INDEX) .NE. EQUALS ) GO TO 45 !?= CONSTRUCT? OPDATA(1) = EQUALS !YES INDEX = INDEX + 1 45 CONTINUE !NO J = 1 DO 50 I = INDEX , EOL !PUT OPERAND FIELD IN REMAIN IF ( LINBUF(I-1) .NE. APOSTR .AND. $ LINBUF(I) .EQ. SMICLN ) GO TO 55 REMAIN(J) = LINBUF(I) J = J + 1 50 CONTINUE 55 CONTINUE EOR = J-1 GO TO 80 70 CONTINUE IF ( LINBUF(INDEX) .NE. HERE ) GO TO 80 !?@? CONSTRUCT LABEL(1) = HERE !YES INDEX = INDEX + 1 GO TO 20 80 CONTINUE D WRITE (4,2) LABEL,LABIDX,OPDATA,OPINDX,(REMAIN(I),I=1,EOR) D 2 FORMAT (' DECODE END, LABEL, INDEX = ',6A2,I5, D $ ' OPDATA, INDEX = ',3A2,I5,'REMAIN =',/,80A1) RETURN END