	.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<R2,R3,R4,R5,R6,R7>
;
;
;		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+<TRANS_V_USER>
;
;
;		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+<TRANS_V_ASCTEBC@2>
	MOVAL	G^LIB$AB_EBC_ASC,TRAN_TBL_PTR+<TRANS_V_EBCTASC@2>
;
	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
