.MCALL .MODULE .MODULE TRANSL,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. .SBTTL TRANSL - FORTRAN CALLABLE SUBROUTINE ; ; CALL TRANSL(IN,OUT,R[,P]) ; ; THE STRING IN OUT IS REPLACED BY A COPY OF THE STRING IN IN, EXCEPT ; FOR THE FOLLOWING: IF ANY CHARACTER POSITION OF IN CONTAINS A ; CHARACTER WHICH APPEARS IN STRING P, IT IS REPLACED IN OUT BY THE ; CORRESPONDING CHARACTER FROM THE STRING R. IF THE STRING P IS ; OMITTED FROM THE CALL, IT IS ASSUMED TO BE THE 127 SEVEN-BIT ASCII ; CHARACTERS ARRANGED IN ASCENDING ORDER AND BEGINNING WITH 1. IN AND ; OUT MAY BE THE SAME ARRAY. THE OLD CONTENTS OF OUT ARE LOST WHEN ; THIS ROUTINE IS CALLED. ; FOR EXAMPLE: ; CALL TRANSL(A,B,'-!','.?') ; THIS EXAMPLE CAUSES THE STRING IN A TO BE COPIED TO B EXCEPT ; THAT ALL PERIODS ARE CHANGED TO HYPHENS, AND ALL QUESTION ; MARKS ARE CHANGED TO EXCLAMATION POINTS. (IE. IF ; A = 'MEAN.VALUE?' THEN B = 'MEAN-VALUE!') ; ; MAS .PSECT SYS$I .GLOBL $SYSLB TRANSL::MOV (R5)+,R3 ;# OF ARGS IN LOW BYTE MOV SP,R4 SUB #128.,SP ;ACQUIRE 128 BYTE TABLE ON STACK MOV SP,R1 ;GET TABLE ADDRESS CLR R0 10$: MOVB R0,(R1)+ ;SET UP TABLE IN NORMAL FORM INC R0 CMP R1,R4 ;DONE? BLO 10$ ;LOOP TILL TABLE FULL MOV R5,R4 ;SAVE ARG POINTER CMP (R5)+,(R5)+ ;SKIP TWO ARGS FOR NOW MOV (R5)+,R1 ;GET POINTER TO R STRING CMPB #4,R3 ;STRING P GIVEN? BHI 30$ ;NO, MAKE ASSUMPTIONS CMP #-1,@R5 ;IS ARG PRESENT? BEQ 30$ ;= -> NO MOV (R5)+,R2 ;GET POINTER TO P 20$: MOVB (R2)+,R3 ;GET A POSITION CHARACTER BLE 50$ ;BAD CHAR OR END OF POSITION LIST ADD SP,R3 ;USE CHAR TO ADDRESS TABLE MOVB (R1)+,@R3 ;REPLACE BYTE IN TABLE BNE 20$ ;LOOP MOVB -(R2),@R3 ;RESTORE TABLE IF NULL MOVED BR 50$ 30$: MOV SP,R2 ;POINT TO BEGINNING OF TABLE CLR R3 40$: MOVB R3,(R2)+ ;STORE CHARS FROM R STRING MOVB (R1)+,R3 ;GET CHAR FROM R STRING BNE 40$ 50$: MOV (R4)+,R1 ;GET PTR TO INPUT STRING MOV @R4,R2 ;AND PTR TO OUTPUT STRING 60$: MOVB (R1)+,R3 ;GET AN INPUT CHAR ADD SP,R3 ;USE CHAR TO INDEX TABLE MOVB @R3,(R2)+ ;OUTPUT TRANSLATED BYTE BNE 60$ ;LOOP THRU ENTIRE STRING ADD #128.,SP ;DELETE TABLE FROM STACK RETURN .END