C ***** This is the routine in the COMINT Address Program ***** C ***** that processes the Repeat Block Statements in the ***** C ***** Data Section of a COMINT Address Specification file. ***** C ***** ***** C ***** COMINT Address Program Rev. 6-NOV-1991 ***** SUBROUTINE Process_Repeat_Block C ***************************************** C Define all Variables and Arrays C ***************************************** IMPLICIT NONE INCLUDE 'ComAdrs_Common.INC' INTEGER*2 CurrentChr INTEGER*2 Source_Start_Adrs,Source_End_Adrs INTEGER*2 Target_Start_Adrs,Target_End_Adrs INTEGER*2 Func_Adrs_Offset INTEGER*4 Adrs_Digit(4),Address,Got_It,Pointer,Spread LOGICAL Sign_FA_Offset C *********************************************************************** C Advertize that processing of a Repeat Block Statement will start. C *********************************************************************** IF ( Full_Display .EQ. 0 ) GOTO 35 WRITE ( 6, 25 ) 25 FORMAT ( /, & ' Processing a Repeat Block Statement will now start. ' ) 35 CONTINUE C *********************************************************************** C First verify that this is a Repeat Block Statement and then C get the beginning PROM Address for the source of the copy. C *********************************************************************** C Test the first characters to see if they are: C "Repeat Block Beginning with PROM_Adrs" 50 IF ( ThisLine(1) .EQ. 'R' .AND. & ThisLine(2) .EQ. 'E' .AND. & ThisLine(3) .EQ. 'P' .AND. & ThisLine(4) .EQ. 'E' .AND. & ThisLine(5) .EQ. 'A' .AND. & ThisLine(6) .EQ. 'T' .AND. & ThisLine(7) .EQ. 'B' .AND. & ThisLine(8) .EQ. 'L' .AND. & ThisLine(9) .EQ. 'O' .AND. & ThisLine(10) .EQ. 'C' .AND. & ThisLine(11) .EQ. 'K' .AND. & ThisLine(12) .EQ. 'B' .AND. & ThisLine(13) .EQ. 'E' .AND. & ThisLine(14) .EQ. 'G' .AND. & ThisLine(15) .EQ. 'I' .AND. & ThisLine(16) .EQ. 'N' .AND. & ThisLine(17) .EQ. 'N' .AND. & ThisLine(18) .EQ. 'I' .AND. & ThisLine(19) .EQ. 'N' .AND. & ThisLine(20) .EQ. 'G' .AND. & ThisLine(21) .EQ. 'W' .AND. & ThisLine(22) .EQ. 'I' .AND. & ThisLine(23) .EQ. 'T' .AND. & ThisLine(24) .EQ. 'H' .AND. & ThisLine(25) .EQ. 'P' .AND. & ThisLine(26) .EQ. 'R' .AND. & ThisLine(27) .EQ. 'O' .AND. & ThisLine(28) .EQ. 'M' .AND. & ThisLine(29) .EQ. '_' .AND. & ThisLine(30) .EQ. 'A' .AND. & ThisLine(31) .EQ. 'D' .AND. & ThisLine(32) .EQ. 'R' .AND. & ThisLine(33) .EQ. 'S' ) GOTO 55 C This does NOT look like the beginning of a Repeat Block Statement. WRITE (6,53) 53 FORMAT ( /, ' Error finding the Repeat Block string. ', / ) GOTO 900 C This DOES look like the beginning of a Repeat Block Statement. C So setup CurrentChr and setup to call the routine to read the C starting source PROM_Adrs for the repeat copy. 55 CurrentChr = 33 ASSIGN 60 TO Got_It GOTO 700 60 CONTINUE Source_Start_Adrs = Address IF ( Source_Start_Adrs .LT. 0 ) GOTO 70 IF ( Source_Start_Adrs .GT. 8191 ) GOTO 70 GOTO 80 70 WRITE ( 6, 75 ) 75 FORMAT (/, ' Source Start PROM Adrs out of range error. ', /) GOTO 900 80 CONTINUE C ***** Now check and then get the Ending Source PROM Address ***** C Test the next 16 characters to see if they are: "through PROM_Adrs" 150 IF ( ThisLine(CurrentChr+1) .EQ. 'T' .AND. & ThisLine(CurrentChr+2) .EQ. 'H' .AND. & ThisLine(CurrentChr+3) .EQ. 'R' .AND. & ThisLine(CurrentChr+4) .EQ. 'O' .AND. & ThisLine(CurrentChr+5) .EQ. 'U' .AND. & ThisLine(CurrentChr+6) .EQ. 'G' .AND. & ThisLine(CurrentChr+7) .EQ. 'H' .AND. & ThisLine(CurrentChr+8) .EQ. 'P' .AND. & ThisLine(CurrentChr+9) .EQ. 'R' .AND. & ThisLine(CurrentChr+10) .EQ. 'O' .AND. & ThisLine(CurrentChr+11) .EQ. 'M' .AND. & ThisLine(CurrentChr+12) .EQ. '_' .AND. & ThisLine(CurrentChr+13) .EQ. 'A' .AND. & ThisLine(CurrentChr+14) .EQ. 'D' .AND. & ThisLine(CurrentChr+15) .EQ. 'R' .AND. & ThisLine(CurrentChr+16) .EQ. 'S' ) GOTO 155 C This does NOT look like the Ending Source PROM Address. WRITE (6,153) 153 FORMAT (/, ' Error finding the Through PROM_Adrs string. ', /) GOTO 900 C This DOES look like the Ending Source PROM Address. C So setup CurrentChr and setup to call the routine to read the address. 155 CurrentChr = CurrentChr + 16 ASSIGN 160 TO Got_It GOTO 700 160 CONTINUE Source_End_Adrs = Address IF ( Source_End_Adrs .LT. 0 ) GOTO 170 IF ( Source_End_Adrs .GT. 8191 ) GOTO 170 GOTO 180 170 WRITE ( 6, 175 ) 175 FORMAT (/, ' Source End PROM Address out of range error. ', /) GOTO 900 180 CONTINUE C ***** This is the end of the first record in the Repeat Block ***** C ***** Statement (except that there may be a comment at the end ***** C ***** of this record). If there are no more characters in this ***** C ***** record then proceed to get the second record in the Repeat ***** C ***** Block Statement. If there are more characters in this ***** C ***** record then verify that they begin with a comment indicator. ***** C ***** If there is not a comment indicator then this record has an ***** C ***** illegal format. ***** C Are there more characters in the record? If not then get the second C record in the Repeat Block Statement. IF ( CurrentChr .GE. NumChr ) GOTO 195 C OK, there are more characters. Is this just a comment? IF ( ThisLine(CurrentChr + 1) .EQ. ';' ) GOTO 185 IF ( ThisLine(CurrentChr + 1) .EQ. '!' ) GOTO 185 IF ( ThisLine(CurrentChr + 1) .EQ. '*' ) GOTO 185 C This does NOT look like a comment. Thus it is an illegal format WRITE (6,183) 183 FORMAT ( /, ' Error, extra characters in ', /, & ' the 1st Repeat Block record. ', / ) GOTO 900 C This DOES look like a comment so let's get the 2nd record. 185 IF ( Full_Display .EQ. 0 ) GOTO 195 WRITE ( 6, 187 ) 187 FORMAT ( /, ' A comment was found at the end of the ', /, & ' first record in a Repeat Block Statement. ' ) 195 CONTINUE C ***** Now get the second record of the Repeat Block Statement ***** CALL Get_Record_and_Capitalize IF ( IOSTATUS .EQ. -1 ) GOTO 940 IF ( IOSTATUS .NE. 0 ) GOTO 970 C ***** Now check that this is the second record of a Repeat Block ***** C ***** Statement and then get the Starting Target PROM Address. ***** C Test the next 17 characters to see if they are: "Copied to PROM_Adrs" CurrentChr = 0 IF ( ThisLine(CurrentChr+1) .EQ. 'C' .AND. & ThisLine(CurrentChr+2) .EQ. 'O' .AND. & ThisLine(CurrentChr+3) .EQ. 'P' .AND. & ThisLine(CurrentChr+4) .EQ. 'I' .AND. & ThisLine(CurrentChr+5) .EQ. 'E' .AND. & ThisLine(CurrentChr+6) .EQ. 'D' .AND. & ThisLine(CurrentChr+7) .EQ. 'T' .AND. & ThisLine(CurrentChr+8) .EQ. 'O' .AND. & ThisLine(CurrentChr+9) .EQ. 'P' .AND. & ThisLine(CurrentChr+10) .EQ. 'R' .AND. & ThisLine(CurrentChr+11) .EQ. 'O' .AND. & ThisLine(CurrentChr+12) .EQ. 'M' .AND. & ThisLine(CurrentChr+13) .EQ. '_' .AND. & ThisLine(CurrentChr+14) .EQ. 'A' .AND. & ThisLine(CurrentChr+15) .EQ. 'D' .AND. & ThisLine(CurrentChr+16) .EQ. 'R' .AND. & ThisLine(CurrentChr+17) .EQ. 'S' ) GOTO 255 C This does NOT look like the beginning of the Start Target PROM Address WRITE (6,253) 253 FORMAT ( /, ' Error finding the Copied to string. ', / ) GOTO 900 C This DOES look like the beginning of the Start Target PROM Address. C So setup CurrentChr and setup to call the routine to read the address. 255 CurrentChr = CurrentChr + 17 ASSIGN 260 TO Got_It GOTO 700 260 CONTINUE Target_Start_Adrs = Address IF ( Target_Start_Adrs .LT. 0 ) GOTO 270 IF ( Target_Start_Adrs .GT. 8191 ) GOTO 270 GOTO 290 270 WRITE ( 6, 275 ) 275 FORMAT (/, ' Start Target PROM Adrs out of range error. ', /) GOTO 900 290 CONTINUE C ***** Now check and then get the Target End PROM Address ***** C Test the next 16 characters to see if they are: "through PROM_Adrs" 350 IF ( ThisLine(CurrentChr+1) .EQ. 'T' .AND. & ThisLine(CurrentChr+2) .EQ. 'H' .AND. & ThisLine(CurrentChr+3) .EQ. 'R' .AND. & ThisLine(CurrentChr+4) .EQ. 'O' .AND. & ThisLine(CurrentChr+5) .EQ. 'U' .AND. & ThisLine(CurrentChr+6) .EQ. 'G' .AND. & ThisLine(CurrentChr+7) .EQ. 'H' .AND. & ThisLine(CurrentChr+8) .EQ. 'P' .AND. & ThisLine(CurrentChr+9) .EQ. 'R' .AND. & ThisLine(CurrentChr+10) .EQ. 'O' .AND. & ThisLine(CurrentChr+11) .EQ. 'M' .AND. & ThisLine(CurrentChr+12) .EQ. '_' .AND. & ThisLine(CurrentChr+13) .EQ. 'A' .AND. & ThisLine(CurrentChr+14) .EQ. 'D' .AND. & ThisLine(CurrentChr+15) .EQ. 'R' .AND. & ThisLine(CurrentChr+16) .EQ. 'S' ) GOTO 355 C This does NOT look like the beginning of the Target Ending PROM Address. WRITE (6,353) 353 FORMAT (/, ' Error finding the through PROM_Adrs string. ', /) GOTO 900 C This DOES look like the beginning of the Target Ending PROM Address. C So setup CurrentChr and setup to call the routine to read the address. 355 CurrentChr = CurrentChr + 16 ASSIGN 360 TO Got_It GOTO 700 360 CONTINUE Target_End_Adrs = Address IF ( Target_End_Adrs .LT. 0 ) GOTO 370 IF ( Target_End_Adrs .GT. 8191 ) GOTO 370 GOTO 380 370 WRITE ( 6, 375 ) 375 FORMAT ( /, ' Target End PROM Adrs out of range error. ', / ) GOTO 900 380 CONTINUE C ***** Now check and then get the Function Address Offset ***** C Test the next 14 characters to see if they are: "with FA Offset of" 381 IF ( ThisLine(CurrentChr+1) .EQ. 'W' .AND. & ThisLine(CurrentChr+2) .EQ. 'I' .AND. & ThisLine(CurrentChr+3) .EQ. 'T' .AND. & ThisLine(CurrentChr+4) .EQ. 'H' .AND. & ThisLine(CurrentChr+5) .EQ. 'F' .AND. & ThisLine(CurrentChr+6) .EQ. 'A' .AND. & ThisLine(CurrentChr+7) .EQ. 'O' .AND. & ThisLine(CurrentChr+8) .EQ. 'F' .AND. & ThisLine(CurrentChr+9) .EQ. 'F' .AND. & ThisLine(CurrentChr+10) .EQ. 'S' .AND. & ThisLine(CurrentChr+11) .EQ. 'E' .AND. & ThisLine(CurrentChr+12) .EQ. 'T' .AND. & ThisLine(CurrentChr+13) .EQ. 'O' .AND. & ThisLine(CurrentChr+14) .EQ. 'F' ) GOTO 385 C This does NOT look like the Function Address Offset parameter. WRITE (6,383) 383 FORMAT (/, ' Error finding the with FA offset of string. ', /) GOTO 900 C This DOES look like the beginning of the Function Address Offset parameter. C Get the sign of the Function Address Offset. 385 IF ( ThisLine(CurrentChr+15) .EQ. '-' ) Then Sign_FA_Offset = .FALSE. GOTO 387 ENDIF IF ( ThisLine(CurrentChr+15) .EQ. '+' ) Then Sign_FA_Offset = .TRUE. GOTO 387 ENDIF WRITE (6,388) 388 FORMAT (/, ' Error finding the sign of FA offset string. ', /) GOTO 900 C Now setup CurrentChr and setup to call the routine to read the FA Offset. 387 CurrentChr = CurrentChr + 15 ASSIGN 389 TO Got_It GOTO 700 389 CONTINUE Func_Adrs_Offset = Address IF ( Func_Adrs_Offset .LT. 0 ) GOTO 390 IF ( Func_Adrs_Offset .GT. 255 ) GOTO 390 GOTO 397 390 WRITE ( 6, 395 ) 395 FORMAT (/, ' Function Address Offset out of range error. ', /) GOTO 900 397 CONTINUE C ***** Now use the sign of the Function Address Offset ***** C ***** to make the offset correct. ***** IF ( Sign_FA_Offset .EQ. .FALSE. ) THEN Func_Adrs_Offset = 0 - Func_Adrs_Offset ENDIF C ***** This is the end of the second record in the Repeat Block ***** C ***** Statement (except that there may be a comment at the end ***** C ***** of this record). If there are no more characters in this ***** C ***** record then proceed to process this Repeat Block Statement. ***** C ***** If there are more characters in this record then verify ***** C ***** that they begin with a comment indicator. If there is not ***** C ***** a comment indicator then this record has an illegal format. ***** C Are there more characters in the record? If not then start C processing this Repeat Block Statement. IF ( CurrentChr .GE. NumChr ) GOTO 415 C OK, there are more characters. Is this just a comment? IF ( ThisLine(CurrentChr + 1) .EQ. ';' ) GOTO 405 IF ( ThisLine(CurrentChr + 1) .EQ. '!' ) GOTO 405 IF ( ThisLine(CurrentChr + 1) .EQ. '*' ) GOTO 405 C This does NOT look like a comment. Thus it is an illegal format WRITE (6,403) 403 FORMAT ( /, ' Error, extra characters in ', /, & ' the 2nd Repeat Block record. ', / ) GOTO 900 C This DOES look like a comment so let's process the Repeat Block. 405 IF ( Full_Display .EQ. 0 ) GOTO 415 WRITE ( 6, 407 ) 407 FORMAT ( /, ' A comment was found at the end of the ', /, & ' second record in a Repeat Block Statement.' ) 415 CONTINUE C ***** Now if in full display format send to the terminal the ***** C ***** parameters that were read in the Address Spec record. ***** IF ( Full_Display .EQ. 0 ) GOTO 435 WRITE (6, 425) Source_Start_Adrs,Source_End_Adrs, & Target_Start_Adrs,Target_End_Adrs, & Func_Adrs_Offset 425 FORMAT (/, ' The Beginning Source PROM_Adrs is = ', I5, /, & ' The Ending Source PROM_Adrs is = ', I5, /, & ' The Beginning Target PROM_Adrs is = ', I5, /, & ' The Ending Target PROM_Adrs is = ', I5, /, & ' The Function_Adrs Offset is = ', I4, / ) 435 CONTINUE C Now that we have all of the parameters necessary to make the Repeat C Block Copy. Before starting the copy we need to check that: C C All of the PROM_Adrs's in the Source range of the Repeat Block C copy have already been defined by Address Specification phrase. C C And that None of the PROM_Adrs's in the Target range of the Repeat C Block copy have already been defined by by Address Specification phrases. DO Pointer=Source_Start_Adrs,Source_End_Adrs,1 IF ( Only_Once(Pointer) .EQ. .FALSE. ) GOTO 505 WRITE ( 6, 510 ) Pointer 510 FORMAT ( /, ' A PROM Address in Source Range of Repeat ', /, & ' Block has not yet been defined. ', /, & ' PROM_Adrs is = ', I4, ' Fatal Error. ', / ) GOTO 900 505 CONTINUE ENDDO DO Pointer=Target_Start_Adrs,Target_End_Adrs,1 IF ( Only_Once(Pointer) .EQ. .TRUE. ) GOTO 515 WRITE ( 6, 520 ) Pointer 520 FORMAT ( /, ' A PROM Address in Target Range of Repeat ', /, & ' Block has already been defined. ', /, & ' PROM_Adrs is = ', I4, ' Fatal Error. ', / ) GOTO 900 515 CONTINUE ENDDO C Now verify that the number of PROM Addresses in the Source range of C the Repeat Block copy equals the number of PROM Addresses in the C Target range of the copy. If these are not equal then this is not legal. IF ( ( Source_Start_Adrs - Source_End_Adrs ) .EQ. & ( Target_Start_Adrs - Target_End_Adrs ) ) GOTO 530 WRITE ( 6,525 ) 525 FORMAT ( /, & ' The number of PROM Addresses in the Source range ', /, & ' of this Repeat Block copy is not equal to the ', /, & ' number of PROM Addresses in the Target range of ', /, & ' this Repeat Block copy. ', / ) GOTO 900 530 CONTINUE C OK, All of the Repeat Block parameters look good so let's start the copy. C Do the Mother Board Address, Card Address, and Function Address C copies and mark the Target Range PROM Adresses as specified C all in one DO Loop for this Repeat Block. Spread = Target_Start_Adrs - Source_Start_Adrs DO Pointer=Source_Start_Adrs,Source_End_Adrs,1 Mother_Brd_Adrs_Array(Pointer+Spread) = & Mother_Brd_Adrs_Array(Pointer) Card_Adrs_Array(Pointer+Spread) = & Card_Adrs_Array(Pointer) Function_Adrs_Array(Pointer+Spread) = & Function_Adrs_Array(Pointer) + Func_Adrs_Offset Only_Once(Pointer+Spread) = .FALSE. ENDDO C Advertize that this is a normal exit from the Repeat Block C processing routine. Then return to the calling routine. 850 IF ( Full_Display .EQ. 0 ) GOTO 860 WRITE ( 6, 855 ) 855 FORMAT ( /, & ' Normal exit from Repeat Block routine. ', / ) 860 CONTINUE RETURN C *********************************************************************** C Error exit because of trouble processing an Address Specification C *********************************************************************** 940 WRITE ( 6, 941 ) 941 FORMAT ( /, & ' The end of the COMMINT Address Specification ', /, & ' file was reached while trying to read the ', /, & ' second record of a Repeat Block Statement. ', / ) CLOSE ( UNIT=10 ) GOTO 998 970 WRITE ( 6, 971 ) IOSTATUS 971 FORMAT ( /, & ' There has been an IO System Error trying ', /, & ' to Read from the COMINT Address Specification ', /, & ' file. Is this file of the correct format? ', //, & ' Did you type the filename correctly? ', //, & ' Fortran Read IOSTAT = ', I3, //, & ' You will need to restart the program. ' , // ) CLOSE ( UNIT=10 ) GOTO 998 900 WRITE ( 6, 905 ) 905 FORMAT ( /, & ' Illegal syntax was found in this Repeat ', /, & ' Blcok Statement. This is a fatal error. ', /, & ' No output files will be produced. ', / ) CLOSE ( UNIT=10 ) 998 WRITE ( 6, 999 ) 999 FORMAT ( / ' COMINT Address Program will now exit. ', // ) STOP ' ' C ***** This is the routine that can read the address specified ***** C ***** in the COMINT Address Specification File. This may be ***** C ***** either the PROM, Mother Board, Card, or Function address. ***** C ***** This address number may be 1, 2, 3, or 4 digits long. ***** C ***** The CurrentChr pointer must be pointing at the character ***** C ***** that is just in front (to the left) of the first digit ***** C ***** (most significant) of the number to be read. This routine ***** C ***** exits with the CurrentChr pointing to the last digit of ***** C ***** the number that was read. The symbol Got_It must be ***** C ***** Assigned to the retun label before this routine is called. ***** C ***** The limits on the address number that is returned to the ***** C ***** calling routine are not checked in this routine. ***** 700 IF ( ICHAR( ThisLine(CurrentChr + 1) ) .GE. '30'X .AND. & ICHAR( ThisLine(CurrentChr + 1) ) .LE. '39'X .AND. & ICHAR( ThisLine(CurrentChr + 2) ) .GE. '30'X .AND. & ICHAR( ThisLine(CurrentChr + 2) ) .LE. '39'X .AND. & ICHAR( ThisLine(CurrentChr + 3) ) .GE. '30'X .AND. & ICHAR( ThisLine(CurrentChr + 3) ) .LE. '39'X .AND. & ICHAR( ThisLine(CurrentChr + 4) ) .GE. '30'X .AND. & ICHAR( ThisLine(CurrentChr + 4) ) .LE. '39'X ) GOTO 754 IF ( ICHAR( ThisLine(CurrentChr + 1) ) .GE. '30'X .AND. & ICHAR( ThisLine(CurrentChr + 1) ) .LE. '39'X .AND. & ICHAR( ThisLine(CurrentChr + 2) ) .GE. '30'X .AND. & ICHAR( ThisLine(CurrentChr + 2) ) .LE. '39'X .AND. & ICHAR( ThisLine(CurrentChr + 3) ) .GE. '30'X .AND. & ICHAR( ThisLine(CurrentChr + 3) ) .LE. '39'X ) GOTO 753 IF ( ICHAR( ThisLine(CurrentChr + 1) ) .GE. '30'X .AND. & ICHAR( ThisLine(CurrentChr + 1) ) .LE. '39'X .AND. & ICHAR( ThisLine(CurrentChr + 2) ) .GE. '30'X .AND. & ICHAR( ThisLine(CurrentChr + 2) ) .LE. '39'X ) GOTO 752 IF ( ICHAR( ThisLine(CurrentChr + 1) ) .GE. '30'X .AND. & ICHAR( ThisLine(CurrentChr + 1) ) .LE. '39'X ) GOTO 751 WRITE (6,725) 725 FORMAT ( /, ' Error in numeric string. ', / ) GOTO 900 C There is ONE digit of Address Number 751 Adrs_Digit(1) = 0 Adrs_Digit(2) = 0 Adrs_Digit(3) = 0 Adrs_Digit(4) = ( ICHAR( ThisLine(CurrentChr + 1) ) ) - '30'X CurrentChr = CurrentChr + 1 GOTO 760 C There are TWO digits of Address Number 752 Adrs_Digit(1) = 0 Adrs_Digit(2) = 0 Adrs_Digit(3) = ( ICHAR( ThisLine(CurrentChr + 1) ) ) - '30'X Adrs_Digit(4) = ( ICHAR( ThisLine(CurrentChr + 2) ) ) - '30'X CurrentChr = CurrentChr + 2 GOTO 760 C There are THREE digits of Address Number 753 Adrs_Digit(1) = 0 Adrs_Digit(2) = ( ICHAR( ThisLine(CurrentChr + 1) ) ) - '30'X Adrs_Digit(3) = ( ICHAR( ThisLine(CurrentChr + 2) ) ) - '30'X Adrs_Digit(4) = ( ICHAR( ThisLine(CurrentChr + 3) ) ) - '30'X CurrentChr = CurrentChr + 3 GOTO 760 C There are FOUR digits of Address Number 754 Adrs_Digit(1) = ( ICHAR( ThisLine(CurrentChr + 1) ) ) - '30'X Adrs_Digit(2) = ( ICHAR( ThisLine(CurrentChr + 2) ) ) - '30'X Adrs_Digit(3) = ( ICHAR( ThisLine(CurrentChr + 3) ) ) - '30'X Adrs_Digit(4) = ( ICHAR( ThisLine(CurrentChr + 4) ) ) - '30'X CurrentChr = CurrentChr + 4 GOTO 760 C Now put together the 4 Address Digits to make the Address number 760 Address = ( Adrs_Digit(1) * 1000 ) + $ ( Adrs_Digit(2) * 100 ) + $ ( Adrs_Digit(3) * 10 ) + $ ( Adrs_Digit(4) * 1 ) GOTO Got_It C ***** This is the end of the routine that reads a 1, 2, 3, or 4 ***** C ***** digit Address number. ***** END