C C B L D I N S C C BUILD MACHINE INSTRUCTION C C THIS ROUTINE BUILDS THE HEX REPRESENTATION FOR AN INSTRUCTION. FROM C 1 TO 6 DATA BYTES WILL BE GENERATED AND PLACED IN ABSCOD WHEN THE C ROUTINE IS CALLED.THE CALLING SEQUENCE IS: C C CALL BLDINS ( IFLAG ) C C WHERE C IFLAG- AN INTEGER VARIABLE WHICH RETURNS A FLAG FLAG AS FOLLOWS C 0 NO ERRORS DETECTED C -1 AN ERROR WAS DETECTED C SUBROUTINE BLDINS ( IFLAG ) INCLUDE 'BSUCOM.CMN' INCLUDE 'PRMSYM.CMN' INCLUDE 'OUTLIN.CMN' INTEGER BASE,FLAG,SWTCH(2) INTEGER*4 IVAL,JVAL D WRITE (5,1) OPVALU(OPINDX),OPFLAG(OPINDX),OPCSIZ(OPINDX) D 1 FORMAT (' BLDINS START, OPVALU, FLAG, SIZE = ',3I6) C C BLANK FILL ABSCOD C CALL TRIVIA ( 5 , IFLAG ) C C GET BASE VALUE OF INSTR. C FLAG = OPFLAG(OPINDX) BASE = OPVALU(OPINDX) IF (FLAG.EQ.0) GO TO 100 ! NO OPERANDS IF (FLAG.GE.103.AND.FLAG.LE.116) GO TO 200 ! 1 DATA OPERAND IF (FLAG.GE.201.AND.FLAG.LE.216) GO TO 300 ! 1 REGISTER OPERAND IF (FLAG.GE.221.AND.FLAG.LE.223) GO TO 400 ! MISC. OPERANDS IF (FLAG.GE.308.AND.FLAG.LE.316) GO TO 500 ! 1 REG., 1 DATA IF (FLAG.EQ.400) GO TO 600 ! 2 REGISTERS CALL FLGERR(22) IFLAG = -1 RETURN C C INSTRUCTIONS WITH NO OPERANDS C 100 CONTINUE GO TO 700 C C INSTRUCTIONS WITH 1 DATA OPERAND C 200 CONTINUE CALL XPRSIN(IFLAG,IVAL) IF (IFLAG.NE.1) GO TO 900 IF (FLAG-108) 210,220,230 ! 3-BIT, 8-BIT, 16-BIT OPERANDS 210 CONTINUE IVAL = MOD(IVAL,8) ! 3-BIT OPERAND, MAKE IT ONE BASE = BASE+IVAL*8 GO TO 700 220 CONTINUE IVAL = MOD(IVAL,256) ! 8-BIT OPERAND, MAKE IT ONE CALL BINHEX(IVAL,ABSCOD(2),2) GO TO 700 230 CONTINUE CALL BINHEX(IVAL,SWTCH,4) ABSCOD(2) = SWTCH(2) ! INTEL USES THE LOW BYTE FIRST ABSCOD(3) = SWTCH(1) GO TO 700 C C INSTRUCTIONS WITH A 1 REGISTER OPERAND C 300 CONTINUE CALL XPRSIN(IFLAG,IVAL) ! GET THE REGISTER VALUE IF (IVAL.LT.0.OR.IVAL.GT.7.OR.IFLAG.NE.1) GO TO 800 BASE = BASE+IVAL*(FLAG-200) GO TO 700 C C SOME INSTRUCTIONS WITH 1 REGISTER OPERAND C 400 CONTINUE CALL XPRSIN(IFLAG,IVAL) IF (IFLAG.NE.1) GO TO 800 IF (FLAG.EQ.223) GO TO 430 C C DAD, DCX, OR INX C IF (IVAL.NE.0.AND.IVAL.NE.2.AND.IVAL.NE.4.AND.IVAL.NE.6) $ GO TO 800 GO TO 440 430 CONTINUE IF (IVAL.NE.0.AND.IVAL.NE.2) GO TO 800 440 CONTINUE BASE = BASE+IVAL*8 GO TO 700 C C 1 REGISTER, 1 DATA C 500 CONTINUE CALL XPRSIN(IFLAG,IVAL) IF (IVAL.LT.0.OR.IVAL.GT.7.OR.IFLAG.NE.1) GO TO 800 CALL XPRSIN(IFLAG,JVAL) IF (IFLAG.NE.1) GO TO 900 IF (FLAG.EQ.316) GO TO 510 JVAL = MOD(JVAL,256) CALL BINHEX(JVAL,ABSCOD(2),2) GO TO 440 510 CONTINUE CALL BINHEX(JVAL,SWTCH,4) ABSCOD(2) = SWTCH(2) ! INTEL USES THE LOW BYTE FIRST ABSCOD(3) = SWTCH(1) GO TO 440 C C OPERANDS OF 2 REGISTERS C 600 CONTINUE CALL XPRSIN(IFLAG,IVAL) IF (IVAL.LT.0.OR.IVAL.GT.7.OR.IFLAG.NE.1) GO TO 800 CALL XPRSIN(IFLAG,JVAL) IF (JVAL.LT.0.OR.JVAL.GT.7.OR.IFLAG.NE.1) GO TO 800 BASE = BASE+IVAL*8+JVAL C C EXIT ALL OK C 700 CONTINUE CALL BINHEX(BASE,ABSCOD,2) IFLAG = 0 RETURN C C EXIT WITH A REGISTER ERROR (R) C 800 CONTINUE CALL FLGERR(18) IFLAG = -1 RETURN C C EXIT WITH AN OPERAND ERROR (O) C 900 CONTINUE CALL FLGERR(15) IFLAG = -1 RETURN END