* ------------------------------------------------------------------ PROGRAM BINARY * ------------------------------------------------------------------ * * Name: BINARY - convert input number to binary * * Computer: LSI-11/23 & LSI-11/73 * Operating System: RSX-11M V4.2 BL38C * Language: FORTRAN-77 * Original Programmer: R. E. K. Neitzel * Process Control Applications * 312 Laveta Pass * Golden, CO 80401 * * Date Written: 4/1/87 * * * Revisions: Programmer Date Description * ---------- -------- --------------------- * * * Description: * This program converts an input number from bases 8, 10 or 16 to * base 2 or from base 2 to the others. To indicate the input base type, * terminate the number with '.','O','H' or 'B'. Base 2 numbers can be 8 * or 16 digits in length. * * ---Constants--- * type name usage * ---- ---- ----- BYTE NUL ! ASCII null CHARACTER*1 NULL ! " " DATA NUL /0/ EQUIVALENCE (NUL, NULL) * * ---Local variables--- * type name usage * ---- ---- ----- INTEGER*2 ASCII ! Marks input as character INTEGER*2 BINBCK ! CHARACTER*16 BINNUM ! Binary number input INTEGER*2 BLANK ! CHARACTER*80 BUFFER ! Command buffer INTEGER*2 COUNT ! Number of characters in command buffer INTEGER*2 DEC ! Base 10 flag INTEGER*2 DSW ! Directive status word INTEGER*2 HELP ! Help flag INTEGER*2 HEX ! Hex flag INTEGER*2 LENGTH ! Length of number string INTEGER*2 LOOP ! INTEGER*2 OCT ! Base 8 flag CHARACTER*6 NUM ! Input number * * * ---Executable statements begin here--- * CALL GETMCR (BUFFER, DSW) IF (DSW .LT. 1) THEN WRITE(5,5)DSW 5 FORMAT(' Error in GETMCR, DSW = ',I4,' exiting.') CALL EXIT ENDIF BUFFER(1:76) = BUFFER(5:80) ! Strip off command name BUFFER(77:80) = ' ' COUNT = DSW - 4 DEC = INDEX(BUFFER(1:COUNT),'.') ! Is this a base 10 #? ASCII = INDEX(BUFFER(1:COUNT),'"') ! A character? HEX = INDEX(BUFFER(1:COUNT),'H') ! Hex? OCT = INDEX(BUFFER(1:COUNT),'O') ! Octal? HELP = INDEX(BUFFER(1:COUNT),'HELP') ! A help request? BINBCK = INDEX(BUFFER(1:COUNT),'B') ! Binary? IF (ASCII .NE. 0) THEN ! If character get next character as input NUM(1:1) = BUFFER(ASCII+1:ASCII+1) CALL ASC (NUM(1:1)) ELSEIF (HELP .NE. 0) THEN TYPE *,' This command displays the binary representation ' TYPE *,' for base 8, 10 & 16 values as well as single ' TYPE *,' ASCII characters. Terminate base 8 numbers with O,' TYPE *,' base 10 ., base 16 H. ASCII characters are entered' TYPE *,' preceeded by a quote mark. Binary patterns may also' TYPE *,' be converted into the equivalent decimal, octal,' TYPE *,' hex and ASCII forms. Nonprinting ASCII characters' TYPE *,' are not displayed. Only 8 or 16 bit patterns ended' TYPE *,' by B are legal. Observe the limits on 16 bit' TYPE *,' numbers.' ELSEIF (DEC .NE. 0) THEN ! If base 10 LENGTH = DEC - 1 ! Then we know length IF ((LENGTH .GT. 5).AND.(BUFFER(1:1) .NE. '-')) THEN GOTO 1000 ELSEIF (LENGTH .GT. 6) THEN GOTO 1000 ENDIF NUM(1:LENGTH) = BUFFER(1:LENGTH) CALL BIN (NUM, LENGTH, 'D') ELSEIF (OCT .NE. 0) THEN LENGTH = OCT - 1 IF (LENGTH .GT. 6) GOTO 1000 NUM(1:LENGTH) = BUFFER(1:LENGTH) CALL BIN (NUM, LENGTH, 'O') ELSEIF (HEX .NE. 0) THEN LENGTH = HEX - 1 IF (LENGTH .GT. 4) GOTO 1000 NUM(1:LENGTH) = BUFFER(1:LENGTH) CALL BIN (NUM, LENGTH, 'H') ELSEIF (BINBCK .NE. 0) THEN LENGTH = BINBCK - 1 IF ((LENGTH .EQ. 16).OR.(LENGTH .EQ. 8)) THEN BINNUM(1:LENGTH) = BUFFER(1:LENGTH) CALL RESTOR (BINNUM, LENGTH) ELSE GOTO 1000 ENDIF ELSE GOTO 1000 ENDIF CALL EXIT 1000 TYPE *,' Sorry, I do not understand that entry.' END * ------------------------------------------------------------------ SUBROUTINE BIN (NUM, LENGTH, TYPE) * ------------------------------------------------------------------ * * Name: BIN - convert to binary ascii * * Computer: LSI-11/23 & LSI-11/73 * Operating System: RSX-11M V4.2 BL38C * Language: FORTRAN-77 * Original Programmer: R. E. K. Neitzel * Process Control Applications * 312 Laveta Pass * Golden, CO 80401 * * Date Written: 4/1/87 * * * Revisions: Programmer Date Description * ---------- -------- --------------------- * * * Description: * This routine converts an ascii string representing a number * from octal, decimal and hex forms into binary. * * Passed variables * type name usage * ---- ---- ----- INTEGER*2 LENGTH ! Length of the number string CHARACTER*6 NUM ! The number as ascii CHARACTER*1 TYPE ! Base type * * ---Local variables--- * type name usage * ---- ---- ----- BYTE BINARY(0:15) ! The ouput string INTEGER*2 BIT ! Return type of bit INTEGER*2 LOOP ! Loop counter CHARACTER*16 OUTPUT ! Output INTEGER*2 VALUE ! The number as number * EQUIVALENCE (BINARY(0),OUTPUT(1:1)) * * ---Executable statements begin here--- * * ---Convert ascii to binary using format for base type--- * IF (TYPE .EQ. 'D') THEN DECODE(LENGTH,10,NUM) VALUE 10 FORMAT(I) ELSEIF (TYPE .EQ. 'O') THEN DECODE(LENGTH,20,NUM) VALUE 20 FORMAT(O) ELSE DECODE(LENGTH,30,NUM) VALUE 30 FORMAT(Z) ENDIF * * ---Test the bits to see if they are set or clear--- * DO 40 LOOP = 15, 0, -1 CALL WRDTST (VALUE, LOOP, BIT) IF (BIT .EQ. 1) THEN BINARY(15-LOOP) = '1' ! If set put 1 in output location ELSE BINARY(15-LOOP) = '0' ! Else put in 0 ENDIF 40 CONTINUE WRITE(5,50)OUTPUT 50 FORMAT(' ',A16) RETURN END * ------------------------------------------------------------------ SUBROUTINE ASC (CHAR) * ------------------------------------------------------------------ * * Name: ASC - convert ascii character to binary * * Computer: LSI-11/23 & LSI-11/73 * Operating System: RSX-11M V4.2 BL38C * Language: FORTRAN-77 * Original Programmer: R. E. K. Neitzel * Process Control Applications * 312 Laveta Pass * Golden, CO 80401 * * Date Written: 4/1/87 * * * Revisions: Programmer Date Description * ---------- -------- --------------------- * * * Description: * This routine converts a single ascii character into binary. * * Passed variables * type name usage * ---- ---- ----- BYTE CHAR ! The character * * ---Local variables--- * type name usage * ---- ---- ----- BYTE BINARY(0:7) ! The output string INTEGER*2 BIT ! Bit status INTEGER*2 LOOP ! Loop counter CHARACTER*8 OUTPUT ! Output * EQUIVALENCE (BINARY(0),OUTPUT(1:1)) * * ---Executable statements begin here--- * DO 10 LOOP = 7, 0, -1 CALL BYTTST (CHAR, LOOP, BIT) ! Is this bit 1 or 0? IF (BIT .EQ. 1) THEN BINARY(7-LOOP) = '1' ELSE BINARY(7-LOOP) = '0' ENDIF 10 CONTINUE WRITE(5,20)OUTPUT 20 FORMAT(' ',A8) RETURN END * ------------------------------------------------------------------ SUBROUTINE RESTOR (BINARY, LENGTH) * ------------------------------------------------------------------ * * Name: RESTOR - RESTORe no binary number * * Computer: LSI-11/23 & LSI-11/73 * Operating System: RSX-11M V4.2 BL38C * Language: FORTRAN-77 * Original Programmer: R. E. K. Neitzel * Process Control Applications * 312 Laveta Pass * Golden, CO 80401 * * Date Written: 4/1/87 * * * Revisions: Programmer Date Description * ---------- -------- --------------------- * * * Description: * This routine restores a binary input to bases 8, 10 & 16 and ascii * forms. Nonprinting ascii codes are not displayed. Horner's method is * used. * * Passed variables * type name usage * ---- ---- ----- BYTE BINARY(16) ! The input number INTEGER*2 LENGTH ! Its length * * ---Local variables--- * type name usage * ---- ---- ----- INTEGER*2 DIGIT ! Value of indivdual digit INTEGER*2 LOOP ! Loop counter INTEGER*2 VALUE ! The output number DATA VALUE /0/ * * * ---Executable statements begin here--- * DO 10 LOOP = 1, LENGTH IF (BINARY(LOOP) .EQ. '1') THEN DIGIT = 1 ELSE DIGIT = 0 ENDIF VALUE = (VALUE * 2) + DIGIT ! Horner's Method 10 CONTINUE WRITE(5,20)VALUE,VALUE,VALUE,VALUE 20 FORMAT(' ',I6,'. ',O7,' hx',Z4,' ',A2) RETURN END