.MCALL .MODULE .MODULE IRAD50,VERSION=03,COMMENT=,IDENT=NO,LIB=YES ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only with the ; inclusion of the above copyright notice. This software, or ; any other copies thereof, may not be provided or otherwise ; made available to any other person except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. ;++ ; ; Edit Who Date Description of modification ; ---- --- ---- --------------------------- ; 001 WLD 15-OCT-90 Standardize PSECT names. ;-- .SBTTL IRAD50 - FORTRAN CALLABLE SUBROUTINE ; ; N = IRAD50( ICNT, INPUT, OUTPUT ) ; ; N= NUMBER OF CHARACTERS ACTUALLY CONVERTED ; ICNT= MAXIMUM NUMBER OF CHARACTERS TO BE CONVERTED ; INPUT= ENTITY FROM WHICH INPUT ASCII CHARACTERS ARE TAKEN ; OUTPUT= ENTITY INTO WHICH RAD50 WORDS ARE STORED ; ; NOTE: EXACTLY (ICNT + 2) / 3 WORDS ARE PRODUCED ; CONVERSION STOPS ON THE FIRST NON-RAD50 CHARACTER FOUND ; ; A = RAD50( INPUT ) ; ; A= REAL*4 ENTITY WHICH RECEIVES TWO-WORD RAD50 RESULT ; INPUT= ENTITY FORM WHICH ASCII CHARACTERS ARE TAKEN ; ; NOTE: RAD50 CONVERTS A MAXIMUM OF 6 INPUT CHARACTERS ; TWO WORDS OF RAD50 ARE ALWAYS PRODUCED ; A = RAD50(LINE) IS EXACTLY EQUIVALENT TO: CALL IRAD50(6,LINE,A) ; ; MAS .PSECT SYS$I,I .GLOBL $SYSLB IRAD50::TST (R5)+ ;DISCARD # OF ARGUMENTS MOV @(R5)+,R0 ;R0 = MAX # OF CHARACTERS TO CONVERT MOV (R5)+,R4 ;R4 -> INPUT MOV @R5,R2 ;R2 -> OUTPUT MOV R0,R5 ;R5 = MAX CHARACTERS CLR R3 ;R3 = # OF CHARS ACTUALLY CONVERTED 1$: MOV R2,-(SP) ;SAVE OUTPUT POINTER JSR PC,R50WRD ;GO CONVERT A WORD MOV (SP)+,R2 ;RETRIEVE OUTPUT POINTER MOV R1,(R2)+ ;STORE CONVERTED CHARS TST R5 ;DONE YET? BGT 1$ ;NOPE MOV R3,R0 ;RETURN # CHARS CONVERTED RTS PC RAD50:: TST (R5)+ ;DISCARD # OF ARGUMENTS MOV (R5)+,R4 ;R4 -> INPUT MOV #6,R5 ;R5 = MAX CHARS TO CONVERT JSR PC,R50WRD ;CONVERT FIRST WORD MOV R1,-(SP) ;SAVE IT JSR PC,R50WRD ;CONVERT SECOND WORD MOV (SP)+,R0 ;SET UP R0,R1 REAL*4 VALUE RETURN RTS PC ; R50WRD - COMMON RAD50 CONVERSION ROUTINE ; REGISTER USAGE NOTES: ; R0 & R2 WORK REGISTERS ; R1 RAD50 VALUE TO BE RETURNED ; R3 NUMBER OF CHARACTERS CONVERTED SO FAR ; R4 ADRS OF NEXT INPUT CHARACTER ; R5 MAXIMUM NUMBER OF INPUT CHARACTERS LEFT R50WRD: MOV #2,-(SP) ;SET LOOP COUNT (3 CHARS/WORD) CLR R1 ;ZERO ACCUMULATOR WORD 1$: CLR R0 ;ZERO CURRENT RAD50 CHAR DEC R5 ;ANY CHARS LEFT TO PROCESS BMI 5$ ;NO MORE CHARS TO PROCESS MOV #R50TAB,R2 ;GET CONVERSION TABLE POINTER BISB (R4)+,R0 ;GET NEXT INPUT CHAR 2$: CMPB (R2)+,R0 ;.LE. UPPER LIMIT? BLO 3$ ;NOPE - NOT IN THIS RANGE CMPB (R2)+,R0 ;.GT. LOWER LIMIT? BLO 4$ ;YES - FOUND CONVERSION (AND SET CARRY) DEC R2 ;ELSE BUMP OVER REMAINDER 3$: ADD #3,R2 ; OF TABLE ENTRY TST @R2 ;END OF TABLE REACHED? BNE 2$ ;NOPE - CONTINUE LOOKING NEG R5 ;ELSE INDICATE NON-RAD50 CHAR FOUND CLR R0 ;MAKE CURRENT = 0 (AND CLEAR C) 4$: ADC R3 ;UPDATE CHARACTER COUNT ADD @R2,R0 ;DO TRANSLATION 5$: ASL R1 ;MULTIPLY PREVIOUS BY 50(8) ASL R1 ASL R1 ADD R1,R0 ASL R1 ASL R1 ADD R0,R1 ;AND ADD IN CURRENT CHAR DEC @SP ;ANY CHARS LEFT IN THIS WORD? BPL 1$ ;YES TST (SP)+ ;ELSE DISCARD LOOP COUNT RTS PC .PSECT SYS$S,D R50TAB: .BYTE 132,100 ;A-Z .WORD -100 .BYTE 71,57 ;0-9 .WORD -22 .BYTE 40,37 ;SPACE .WORD -40 .BYTE 44,43 ;DOLLAR SIGN .WORD -11 .BYTE 56,55 ;PERIOD .WORD -22 .WORD 0 ;END OF TABLE FLAG (MUST BE ZERO) .END