.TITLE TRANINIT INITIALIZE TRANSLATION INFORMATION .IDENT /02-JUN-83 V01.1/ ; ; Subroutine which opens user translation file, reads translation ; table, sets up translation pointers, translates any pad characters ; to be used in copy. ; ; All information needed is passed through the FTCB, other global ; variables, and a few registers. ; Register usage is: ; R0 - Status from system I/O routines and MOVTUC instruction. ; R1-R4 - MOVTUC instruction. ; R5 - Length of expanded file name string and MOVTUC inst. ; R6-R7 - Temporary pointers to translation table. ; R8 - Pointer to NAM for file. ; R9 - Pointer to FAB for file. ; R10 - Pointer to FTCB. ; R11 - Pointer to FTIO block. ; Saved registers are R2-R7. ; FTCBDEF $FABDEF $NAMDEF $RABDEF ; .PAGE .SUBTITLE CODE TO CHECK USER TRANS AND GET INFO. ; .ENTRY TRAN_INIT,^M ; ; ; CHECK TO SEE IF THIS IS USER SPECIFIED TRANSLATION. ; 5$: CMPB #TRANS_V_USER,FTCB_B_TCODE(R10) ; BEQL 8$ ; IF = USER, BRANCH TO READ TABLE. BRW G_TRAN_1 ; NOT USER TRANSLATION. ; ; BUILD THE FILE NAME DESCRIPTOR. AND THEN OPEN THE FILE. ; 8$: MOVB USR_TRAN_NAME,FAB$B_FNS(R9) ; PUT IN STRING SIZE. MOVL USR_TRAN_NAME+4,FAB$L_FNA(R9) ; PUT IN STRING ADDR. ; $OPEN FAB=R9 ; OPEN THE FILE. MOVZBL NAM$B_ESL(R8),R5 ; GET THE EXPANDED FILE NAME LENGTH. BLBS R0,10$ ; IF OK, BRANCH ; CALL_MSG EXIT_SYS,#FTC_RMSERROR,#4,MSG_10,- ; EXIT - RMS. MSG_10+4,R5,NAM$L_ESA(R8),R0,FAB$L_STV(R9) ; 10$: $CONNECT RAB=R8 ; CONNECT TO THE FILE. BLBS R0,20$ ; IF OK, BRANCH. ; CALL_MSG EXIT_SYS,#FTC_RMSERROR,#4,MSG_9,- ; EXIT - RMS. MSG_9+4,R5,NAM$L_ESA(R8),R0,RAB$L_STV(R8) ; ; POINT TO THE RECORD TO GET AND DO THE GET. ; 20$: MOVW #^X0101,RAB$W_USZ(R8) ; PUT IN THE RECORD SIZE. MOVAL FT_TRANS_DATA,RAB$L_UBF(R8) ; PUT IN THE RECORD ADDRESS. ; $GET RAB=R8 ; GET THE RECORD. BLBS R0,25$ ; IF OK, BRANCH. ; CALL_MSG EXIT_SYS,#FTC_RMSERROR,#4,MSG_8,- ; EXIT - RMS. MSG_8+4,R5,NAM$L_ESA(R8),R0,RAB$L_STV(R8) ; ; GET THE ESCAPE CHARACTER INTO THE TABLE. ; 25$: MOVB FT_TRANS_DATA+^X100,TRAN_ESC_TAB+ ; ; ; CLOSE THE FILE. ; 30$: $CLOSE FAB=R9 BLBS R0,G_TRAN_1 ; BRANCH IF OK. ; CALL_MSG EXIT_SYS,#FTC_RMSERROR,#4,MSG_12,- ; EXIT - RMS. MSG_12+4,R5,NAM$L_ESA(R8),R0,FAB$L_STV(R9) ; .PAGE .SUBTITLE GET TABLE POINTERS AND TRANSLATE PAD CHARS. ; ; TRANSLATION SPECIFIED, NEED TO SET UP THE ADDRESS TO THE ; CORRECT TRANSLATION TABLE AND (MAYBE) TRANSLATE ANY ; PAD/TRAIL/EVEN CHARACTERS TO BE USED IN THE COPY. ; NOTE: ; THE ESCAPE BYTE TABLE AND THE TRANSLATION TABLE POINTERS ARE ; DEPENDENT ON THE OFFSETS DEFINED IN THE FTCB SECTION: ; "_VIELD TRANS". THE ADDRESSES IN THE POINTER TABLE AND THE ; ESCAPE BYTES ARE IN THE SAME ORDER AS THE TRANSLATION CODES ; DEFINED IN THE FTCB. IF ANY CHANGES ARE MADE TO THE FTDB, ; CORRESPONDING CHANGES MUST BE MADE TO THE FT_TRANS ROUTINE ; WHERE THE ADDRESS AND ESCAPE TABLES ARE DEFINED. ; G_TRAN_1: ; PUT ADDRESSES OF THE LIB$ TRANSLATION TABLES INTO ; THE TRANSLATION POINTER TABLE. SHIFT OFFSET FOR LONG DISPLACE. MOVAL G^LIB$AB_ASC_EBC,TRAN_TBL_PTR+ MOVAL G^LIB$AB_EBC_ASC,TRAN_TBL_PTR+ ; MOVZBL FTCB_B_TCODE(R10),R7 ; GET THE TRANSLATION NUMBER AND ASHL #2,R7,R7 ; MAKE IT INTO AN OFFSET INTO THE ; TRANSLATION POINTER TABLE. ADDL3 #TRAN_TBL_PTR,R7,R6 ; ADD THE TRANSLATION POINTER TABLE ; ADDRESS TO THE TRANSLATION OFFSET TO ; POINT TO THE ADDRESS OF THE CORRECT TRANSLATION TABLE. MOVL (R6),R6 ; GET THE ADDRESS OF THE TRANSLATION ; TABLE FOR THIS USE OF FTCOPY AND MOVL R6,FTCB_L_TRAPTR(R10) ; STORE IN FTCB. ; ; NOTE: ; THE ESCAPE BYTE TABLE AND THE TRANSLATION TABLE POINTERS ARE ; DEPENDENT ON THE OFFSETS DEFINED IN THE FTCB SECTION: ; "_VIELD TRANS". THE ADDRESSES IN THE POINTER TABLE AND THE ; ESCAPE BYTES ARE IN THE SAME ORDER AS THE TRANSLATION CODES ; DEFINED IN THE FTCB. IF ANY CHANGES ARE MADE TO THE FTDB, ; CORRESPONDING CHANGES MUST BE MADE TO THE FT_TRANS ROUTINE ; WHERE THE ADDRESS AND ESCAPE TABLES ARE DEFINED. ; G_TRAN_3: MOVZBL FTCB_B_TCODE(R10),R7 ; GET TRANSLATE NUMBER. ADDL2 #TRAN_ESC_TAB,R7 ; GET THE ADDRESS OF THE ESCAPE BYTE. MOVB (R7),FTCB_B_ESCAPE(R10) ; MOVE CORRECT ESCAPE CHARACTER. ; ; ; CHECK TO SEE IF WE SHOULD TRANSLATE "PAD" BYTES. BLBC FTCB_B_TCODE(R10),10$ ; IF CONVERSION IS TO ASCII, BRW RETURN ; DON'T TRANSLATE ANY PAD BYTES. ; ; CHECK FOR "USER" TRANSLATION AND DON'T TRANSLATE ; ANY PAD BYTES. 10$: CMPB #TRANS_V_USER,FTCB_B_TCODE(R10) ; SKIP "USER" BEQL RETURN ; ; TRANSLATE ANY CHARACTERS TO BE USED FOR PAD/EVEN/TRAIL. ; G_TRAN_2: BBC #FLAG_V_EVEN,FTCB_W_FLAG(R10),10$ ; EVEN? MOVAL FTCB+FTCB_B_EVEN,R5 ; GET ADDRESS OF BYTE TO TRANSLATE. MOVQ MSG_19,R8 ; SET UP ERROR MESSAGE. JSB TRAN_PADS ; GO TO SUBROUTINE TO TRANSLATE THE CHAR. ; 10$: BBC #FLAG_V_PREC,FTCB_W_FLAG(R10),20$ ; PAD RECORDS? MOVAL FTCB+FTCB_B_PREC,R5 ; GET ADDRESS OF BYTE TO TRANSLATE. MOVQ MSG_22,R8 ; SET UP ERROR MESSAGE. JSB TRAN_PADS ; GO TO SUBROUTINE TO TRANSLATE THE CHAR. ; 20$: BBC #FLAG_V_PBLK,FTCB_W_FLAG(R10),30$ ; PAD BLOCKS? MOVAL FTCB+FTCB_B_PBLK,R5 ; GET ADDRESS OF BYTE TO TRANSLATE. MOVQ MSG_23,R8 ; SET UP ERROR MESSAGE. JSB TRAN_PADS ; GO TO SUBROUTINE TO TRANSLATE THE CHAR. ; 30$: BBC #FLAG_V_TRAILR,FTCB_W_FLAG(R10),40$ ; KEEP TRAILING RECORD? MOVAL FTCB+FTCB_B_TRAILR,R5 ; GET ADDRESS OF BYTE TO TRANSLATE. MOVQ MSG_20,R8 ; SET UP ERROR MESSAGE. JSB TRAN_PADS ; GO TO SUBROUTINE TO TRANSLATE THE CHAR. ; 40$: BBC #FLAG_V_TRAILB,FTCB_W_FLAG(R10),RETURN ; KEEP TRAIL BLOCK? MOVAL FTCB+FTCB_B_TRAILB,R5 ; GET ADDRESS OF BYTE TO TRANSLATE. MOVQ MSG_21,R8 ; SET UP ERROR MESSAGE. JSB TRAN_PADS ; GO TO SUBROUTINE TO TRANSLATE THE CHAR. ; ; RETURN: RET ; RETURN TO CALLING PROGRAM. ; .PAGE .SUBTITLE SUBROUTINE FOR TRANSLATING PAD CHARACTERS. ; TRAN_PADS: MOVTUC #1,(R5),(R7),(R6),#1,(R5) ; MOVE THE TRANSLATED CHARACTER. ; BVS 10$ ; CHECK FOR ESCAPE AND BRANCH IF FOUND. RSB ; RETURN - TRANSLATION OK ; 10$: CALL_MSG EXIT_SYS,#FTC_UNTRACHAR,#3,(R5),R8,R9 ; EXIT MESSAGE. ; ; USR_TRAN_NAME: .LONG U_T_LEN ; USER TRANS. LOGICAL NAME .LONG USR_TRAN_NAME+8 .ASCII /FTC_TRAN/ U_T_LEN = .-USR_TRAN_NAME-8 ; .END