Google
 

Trailing-Edge - PDP-10 Archives - BB-H506D-SM_1983 - cobol/source/cleand.mac
There are 7 other files named cleand.mac in the archive. Click here to see a list.
; UPD ID= 3279 on 12/12/80 at 10:13 AM by NIXON                         
TITLE	CLEAND	FOR COBOL V12B
SUBTTL	CLEANUP AFTER PHASE D		W.NEELY/CAM



;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1974, 1981 BY DIGITAL EQUIPMENT CORPORATION

	SEARCH	P
	%%P==:%%P
	DBMS==:DBMS
	DEBUG==:DEBUG

;EDITS
;NAME	DATE		COMMENTS

;DAW	14-Nov-80	[1074] "?Catastrophe in PHASE D" if "DYNAMIC"
;				in ACCESS MODE clause is misspelled.
;JEH	27-JUN-80	[1032] STORE EBCDIC MODE IN KEY DESCRIPTOR
;JEH	03-APR-80	[1006] PULL OUT CODE TESTING ON USE PROCEDURE CONFLICTS
;DMN	24-OCT-79	[747] COBOL-74 BAD TABLE LINK IF MISSING ISAM RECORD KEY
;CLRH	14-SEP-79	[735] GIVE ERROR IF RECORD KEY NOT DEFINED IN RIGHT FD

;V12A SHIPPED
;DAW	23-APR-79	[677] FIX PROBLEM WITH TABLES EXPANDING THAT
;			CAN MESS UP DBMS USE PROCEDURES
;EHM	17-SEP-78	[552] GIVE ERROR IF DECLARITIVES AND NO END DECL.

;V10*****************
;	10-AUG-76	[435] FIX UP USE PROCEDURE TABLE FOR DBMS
;	18-FEB-76	[407] FIX WRITING BEFORE/AFTER FOR STD ASCII
;DPL	01/29/76	[401] SET DBONLY OFF(=0) IF ONLY USE PROC IS DBMS
;ACK	14-JAN-74	GENERATE POINTERS IN THE FILE TABLE FOR FILE
;			 STATUS STUFF AND SIMULTANEOUS ACCESS STUFF.
;DBT	1/22/74		CHANGE THE PERF. UUO GENERATION TO GENERATE
;			A PUSHJ 17,PERF.
;********************


;[236] /ACK	COBOLC.MAC, CLEAND.MAC
;		RESERVE SPACE FOR LABEL RECORD IF LARGER THAN FD
;		BUT DONT CHANGE FILE TABLE MAX-REC-SIZE
; EDIT 171 MAKES ENTER COBOL EQUIVELENT TO CALL.
; EDIT 137 GIVE ERROR MESSAGE IF SUBSCRIPT IS IN LINKAGE
;		SECTION OF IF SUBSCRIPTED IS SUBSCRIPTED.
; EDIT 165 FIXES COMPILER LOOP IF RIGHT PAREN
;		MISSING FOR SUBSCRIPTED DATA-NAME.
; EDIT 155 FIXES "ADDRESS CHECK" WHEN SORT FILE SHARES SAME BUFFER AREA.
; EDIT 151 FIXES UNBALL PAREN PROBLEM IN COMPUTE STATEMENT.
; EDIT 111 FIXES COMPILER LOOP FOR SEARCH ALL... AT END STOP RUN.
; EDIT 110 OPEN STATEMENT DOES NOT GIVE PERIOD ASSUMED MESSAGE
;		IF A PERIOD IS MISSING AND STATEMENT IS LAST ONE IN A PARA.

TWOSEG
RELOC	400000

	SALL

ENTRY	CLEAND,CLENTA,PRFSUB
SUBTTL	CLEAND:; GENERATE OBJECT FILE TABLES
CLEAND:	TSWTZ	INDECL		;[552] STILL IN DECLARITIVES?
	JRST	CLND0		;[552] NO, OK
	LDB	LN,[POINT 13,DECLR.##,28]	;[552] GET LINE NUMBER
	LDB	CP,[POINT 7,DECLR.,35]		;[552] AND CHAR. POS.
	MOVEI	DW,E.608	;[552] GET ERROR MESSAGE CODE
	PUSHJ	PP,FATAL	;[552] WARN USER
CLND0:	MOVE	TA,EAS1PC##
	MOVEM	TA,FILTBL##
	SETZM	EAS1PC
	MOVE	TA,FILLOC##
	CAMN	TA,FILNXT##
	JRST	ECLND		;NO FILTAB ENTRIES
	HRRZI	TA,SZ.DEV
	ADDM	TA,FILTBL
	HRRZI	TA,CD.FIL*1B20+1
CLND:	HRLZM	TA,CURFIL##
	PUSHJ	PP,LNKSET##
	HRRM	TA,CURFIL
	SETZM	TBLOCK+20
	LDB	TB,FI.FDD##
	JUMPN	TB,CC0.
	SETOM	TBLOCK+20
	PUSHJ	PP,CLE12.	;NO FD
	HRRZ	TA,CURFIL
CC0.:	LDB	TB,FI.NDV##	;NUMBER OF DEVICES
	JUMPG	TB,CC0.1
	PUSHJ	PP,CLE1.	;SHOULD BE AT LEAST ONE
CC0.1:	HRRZ	TA,CURFIL
	LDB	TB,FI.IRM##	;INTERNAL RECORDING MODE
	CAIE	TB,%%RM
	JRST	CC1.		;SPECIFIED
	HRRZI	TB,%RM.6B
	DPB	TB,FI.IRM	;ASSUME SIXBIT
CC1.:	LDB	TC,	FI.PSN##	;GET POSITIONING
	LDB	TD,	FI.ADV##	; AND ADVANCING FLAGS.
	JUMPE	TD,	CC1.D		;IF THEY ARE BOTH ON,
	JUMPE	TC,	CC1.H		; COMPLAIN.
	PUSHJ	PP,	CLE18.		;IF EITHER IS ON, TURN
CC1.D:	DPB	TC,	FI.ADV##	; ON ADVANCING.
CC1.H:	IORI	TC,	(TD)		;GET ADV FLAG FOR LATER.
	LDB	TD,	FI.ERM##	;GET EXTERNAL RECORDING MODE.
	CAIE	TD,%RM.7B		; [407] IF IT IS ASCII
	CAIN	TD,%RM.SA		; [407] STANDARD ASCII
	JRST	CC2.			; [407] GO ON
	TRNN	TC,	1		;IS ADVANCING ON?
	JRST	CC2.			;NO, USE WHAT'S SPECIFIED OR DEFAULT TO SIXBIT
	MOVEI	TD,%RM.7B		;YES, MAKE IT ASCII.
	DPB	TD,FI.ERM##		;SET THE EXTERNAL RECORDING MODE.
	LDB	TB,FI.RM2##		;WAS IT SPECIFIED?
	JUMPE	TB,CC2.			;NO, OK
	PUSHJ	PP,CLE13.		;YES, GIVE ERROR
;IF LABELS ARE NON STANDARD ON EBCDIC TAPES GIVE AN ERROR.

CC2.:	LDB	TB,	FI.ERM##	;GET THE EXTERNAL RECORDING MODE.
	CAIE	TB,	%RM.EB		;IF IT'S NOT EBCDIC
	JRST		CC3.		; ALL IS WELL.
	LDB	TB,	FI.LBL##	;GET THE FILE'S LABEL TYPE.
	CAIE	TB,	%LBL.N		;IF IT'S NOT NON-STANDARD
	JRST		CC3.		; ALL IS WELL.
	PUSHJ	PP,	CLE28.		;OTHERWISE COMPLAIN.
	HRRZ	TA,	CURFIL		;RESTORE THE FILE TABLE'S ADDRESS.

CC3.:	LDB	TB,FI.DRL##	;DATA RECORD LINK
	JUMPN	TB,.+3
	PUSHJ	PP,CLE2.	;NO DATA RECORDS
	HRRZ	TA,CURFIL
	LDB	TB,FI.DSD##
	JUMPN	TB,CFGEN	;SORT-FILE
	LDB	TB,FI.LBL##	;TYPE OF LABELS
	LDB	TC,FI.VID##	;VALUE-OF-ID
	LDB	TD,FI.VDW##	;VALUE-OF-DATE-WRITTEN
	JRST	.+1(TB)
	JRST	CC5.		;[157] OMITTED
	JRST	CC4.		;STANDARD
	JRST	CC5.		;[157] NON-STANDARD
	HRRZI	TB,%LBL.S	;NOT SPECIFIED

	DPB	TB,FI.LBL	;ASSUME STANDARD
	JRST	CC4.

CC4.:	JUMPN	TC,CC5.		;VALUE-OF-ID REQUIRED
	PUSHJ	PP,CLE4.
	HRRZ	TA,CURFIL
CC5.:	LDB	TB,FI.POS	;MULTIPLE FILE TAPE FLAG
	JUMPE	TB,CC6.
	LDB	TB,FI.NDV
	CAIG	TB,1		;ONLY ONE DEVICE ALLOWED
	JRST	CC5.2
	PUSHJ	PP,CLE6.
	HRRZ	TA,CURFIL
	HRRZI	TB,1
	DPB	TB,FI.NDV
CC5.2:
IFN ANS68,<
	LDB	TB,FI.MLT##	;MULTIPLE REEL/UNIT
	JUMPE	TB,CC6.		;NOT ALLOWED
	PUSHJ	PP,CLE7.
	HRRZ	TA,CURFIL
>
;CHECK BLOCKING FACTOR

CC6.:
IFN ANS74,<
	LDB	TB,FI.RMS	;IS THIS AN RMS FILE?
	JUMPN	TB,CC7.		;YES, IGNORE BLOCKING FACTOR
>
	LDB	TB,FI.BLF##	;BLOCKING FACTOR
	JUMPN	TB,CC7.
	LDB	TC,FI.FBS##	;GIVEN BUFFER SIZE INSTEAD?
	JUMPE	TC,CC6B.	;NO
	LDB	TB,FI.MRS##	;YES, GET RECORD SIZE
	IDIVI	TC,(TB)		;SEE HOW MANY FIT
	DPB	TC,FI.BLF	;THIS IS BLOCKING FACTOR
	JUMPN	TC,CC7.		;BETTER NOT BE ZERO
	PUSHJ	PP,CLE30.	;TOO BAD
	JRST	CC7.

CC6B.:	LDB	TC,FI.ACC
IFN ANS68,<
	CAIN	TC,%ACC.R
	PUSHJ	PP,CLE11.	;MUST NOT BE RANDOM ACCESS
>
IFN ANS74,<
	CAIE	TC,%ACC.R
	JRST	CC6A.		;NOT RELATIVE
	LDB	TB,FI.ERM##	;EXTERNAL RECORDING MODE
	MOVE	TB,[EXP 6,1,5,4,4](TB)	;BYTES PER WORD
	LSH	TB,7		;ASSUME 200 WORD BUFFER
	MOVE	TC,[200000,,1]	;SEED EXCESS,,BLOCKING FACTOR
	MOVSI	CH,-4		;NO. OF PHYSICAL BUFFERS IN LOGICAL BUFFER
CC6L.:	MOVE	TE,TB		;CHARS. IN 1 BUFFERS
	IMULI	TE,1(CH)	;NO. IN LOGICAL BUFFER
	LDB	TD,FI.MRS##	;RECORD SIZE
	CAIN	TB,5*200	;ASCII?
	ADDI	TD,2		;ALLOW FOR CR-LF
	CAIN	TB,4*200	;EBCDIC?
	JRST	[PUSH	PP,TD+1		;YES, GET FEE AC
		LDB	TD+1,FI.VLR##	;IS IT VARIABLE LENGTH?
		JUMPE	TD+1,CC6M.	;NO
		ADDI	TD,4		;YES, ACCOUNT FOR 4 BYTE HEADER
		JRST	CC6M.]
	CAIE	TB,6*200	;SIXBIT?
	JRST	CC6N.		;NO
	PUSH	PP,TD+1		;SAVE TD+1
	ADDI	TD,6+5		;ROUNDING + CONTROL WORD
	IDIVI	TD,6		;NO. WHOLE WORDS
	IMULI	TD,6		;NO. OF CHARACTERS OCCUPIED BY RECORD
CC6M.:	POP	PP,TD+1
CC6N.:	IDIVI	TE,(TD)		;TE=NUMBER OF RECORDS, TD=REMAINDER
	HRL	TE,TD		;EXCESS,,BLOCKING FACTOR
	IMULI	TD,5		;TRY TO GET 80% FULL
	CAIG	TD,(TB)		;
	JRST	CC6K.		;WASTAGE LESS THAN 20% OF 1 BUFFER
	CAMGE	TE,TC		;BETTER THAN PREVIOUS?
	MOVE	TC,TE		;YES, SAVE IT
	AOBJN	CH,CC6L.	;TRY AGAIN
	MOVE	TE,TC		;GET BLOCKING FACTOR
CC6K.:	DPB	TE,FI.BLF	;STORE BLOCKING FACTOR
	JRST	CC7.

CC6A.:	CAIN	TC,%ACC.I	;IS IT INDEX?
	JRST	CC6I.		;YES, SET DEFAULT
>
	HRRZ	TA,CURFIL
	LDB	TB,FI.IOO##
	JUMPE	TB,CC7.
IFN ANS68,<
	PUSHJ	PP,CLE15.
	HRRZ	TA,CURFIL
>
IFN ANS74,<
CC6I.:	MOVEI	TB,1		;USE DEFAULT OF 1
	DPB	TB,FI.BLF
	MOVEI	DW,E.733	;"BLOCK CONTAINS 1 RECORD assumed."
	LDB	LN,FI.FLN	;POINT TO THE FD
	LDB	CP,FI.FCP
	PUSHJ	PP,WARN##
	HRRZ	TA,CURFIL	;POINT TO FILE AGAIN
>
CC7.:	LDB	TB,FI.ACC	;ACCESS MODE
	CAIE	TB,%%ACC
	JRST	CC8.		;SPECIFIED
	HRRZI	TB,%ACC.S	;ASSUME SEQUENTIAL
	DPB	TB,FI.ACC
CC8.:	JRST	.+1(TB)
	JRST	CFGEN		;SEQUENTIAL
	JRST	CC12.		;RANDOM
	JRST	CFGEN		;INDEXED

CC12.:
IFN ANS68,<
	LDB	TB,FI.NFL##	;NUMBER OF FILE-LIMITS
	JUMPG	TB,CC14.	;MUST BE SOME
	PUSHJ	PP,CLE10.
	HRRZ	TA,CURFIL
CC14.:>
	LDB	TB,FI.LBL	;LABELS MUST BE
	CAIN	TB,%LBL.S	;STANDARD
	JRST	CFGEN
	PUSHJ	PP,CLE5.
	HRRZ	TA,CURFIL
;	JRST	CFGEN		;FALL THRU
CFGEN:	HRRZI	TC,SZ.DEV
BAK.0:	MOVEI	CH,1
	HRLI	CH,AS.OCT##	;PUT
	PUSHJ	PP,PUTAS1##	;  OUT
	SETZ	CH,		;  'OCT 0'
	PUSHJ	PP,PUTAS1
	SOJG	TC,BAK.0
	MOVE	TC,EAS1PC
	HRRZ	TA,CURFIL
	DPB	TC,FI.OFT##
	ADDI	TC,SZ.DEV
	MOVEM	TC,EAS1PC
IFN ANS74,<
	LDB	TA,FI.LCP##	;SEE IF LINAGE-COUNTER
	JUMPE	TA,B0.1		;NO
	PUSHJ	PP,LNKSET
	HRRZ	TC,FI.LCP	;GET COMPILE TIME OFFSET
	ADD	TC,FILTBL	;PLUS BASE OF FILE TABLE
	SUBI	TC,SZ.DEV-4	;RUN TIME OFFSET, DON'T COUNT SZ.DEV TWICE
	ADD	TC,EAS1PC	;DEPTH IN FILTBL
	DPB	TC,DA.LOC	;STORE INCORE LOCATION
	HRRZ	TA,CURFIL
	LDB	TC,FI.LPP##
	TRNE	TC,700000
	JRST	B0.0
	LDB	TC,FI.WFA##
	TRNE	TC,700000
	JRST	B0.0
	LDB	TC,FI.LAT##
	TRNE	TC,700000
	JRST	B0.0
	LDB	TC,FI.LAB##
	TRNN	TC,700000
	JRST	B0.1

B0.0:	PUSHJ	PP,GETTAG	;GET NEXT TAG
	HRRZ	TA,CURFIL
	DPB	CH,FI.LCI##	;STORE IT
B0.1:	HRRZ	TA,CURFIL
>
	MOVE	TC,[TBLOCK,,TBLOCK+1]
	SETZM	TBLOCK##
	BLT	TC,TBLOCK+4
	LDB	TB,FI.NAM##	;NAMTAB LINK
	ADD	TB,NAMLOC##
	MOVNI	TC,5
	MOVEM	TC,CTR##
B1:	ADDI	TB,1
	MOVE	TD,(TB)		;SIX CHARACTERS OF NAME
	TLNN	TD,600000
	JRST	B2		;NEXT ENTRY
	MOVEM	TD,TBLOCK+5(TC)
	AOJL	TC,B1

B2:	HRLZI	CH,AS.SIX##
	HRRI	CH,5		;5-WORD SIXBIT LITERAL
	PUSHJ	PP,PUTAS1
	MOVE	TA,[POINT 6,TBLOCK]
	HRRZI	TD,5
B3:	HRRZI	TC,6
	MOVE	TB,[POINT 6,CH]
	SETZ	CH,
B3.1:	ILDB	TE,TA
	JUMPE	TE,B3.2
	CAIN	TE,":"-40
	HRRZI	TE,"-"-40
	CAIN	TE,";"-40
	HRRZI	TE,"."-40
B3.2:	IDPB	TE,TB
	SOJG	TC,B3.1
	PUSHJ	PP,PUTAS1
	SOJG	TD,B3

	HRLZI	CH,AS.XWD##	;XWD
	HRRI	CH,5		;WORDS 6-10
	PUSHJ	PP,PUTAS1
	HRRZ	TA,CURFIL
	LDB	CH,FI.NDV
	LDB	TB,FI.DSD
	SKIPE	TB
	TRO	CH,(1B7)	;THIS IS A SORT FILE
	LDB	TB,FI.RM2
	SKIPN	TB		;IF RECORDING MODE WAS NOT SET
	TRO	CH,(1B8)	;SET FLAG FOR LIBOL
	MOVSS	CH		;NUMBER OF DEVICES IN LEFT HALF
	MOVSI	TB,(POINT 6,0,11)	;GET COBOL VERSION #
	HRRI	TB,.JBVER##
	LDB	TC,TB
	DPB	TC,[POINT 6,CH,5]
	HRRI	CH,AS.CNB##
	PUSHJ	PP,PUTAS1	;LEFT HALF OF WORD 6
	HRRZ	TA,CURFIL
	LDB	CH,FI.VAL##
	JUMPE	CH,B4.1		;NULL LINK
	HRRZ	TA,CH
	PUSHJ	PP,REFTAG##	;REFERENCE IF TAG
	PUSHJ	PP,PUTAS1
	JRST	B4.2

B4.1:	HRRZI	CH,AS.CNB
	PUSHJ	PP,PUTAS1
B4.2:	HRRZI	CH,AS.CNB
	HRRZ	TA,CURFIL
	LDB	TB,FI.POS##
	DPB	TB,[POINT 6,CH,17]	;POSITION
IFN ANS68,<
	LDB	TB,FI.NFL
	DPB	TB,[POINT 5,CH,4]	;NUMBER OF FILE-LIMITS
>
IFN ANS74,<
	LDB	TB,FI.FAM
	SKIPE	TB		;LEAVE DEFAULT AS SEQENTIAL
	SUBI	TB,1		;LIBOL USES 0,1,2 FOR MODES
	DPB	TB,[POINT 2,CH,4]	;FILE ACCESS MODE
>
	PUSHJ	PP,PUTAS1
	LDB	CH,FI.NXT##	;POINTER TO NEXT
	JUMPE	CH,B4.3		;FILE TABLE ENTRY
	IFN	CD.FIL-4,<
	ANDI	CH,077777
	IORI	CH,AS.FIL
>
	PUSHJ	PP,PUTAS1
	JRST	B4.4
B4.3:	HRRZI	CH,AS.CNB
	PUSHJ	PP,PUTAS1
B4.4:	MOVE	TA,CURFIL
	SETZ	CH,		;WORD 8
	LDB	TB,FI.NBF##	;NUMBER OF BUFFERS
	DPB	TB,[POINT 6,CH,5]
	LDB	TB,FI.MRS##	;MAXIMUM RECORD SIZE
	DPB	TB,[POINT 12,CH,17]
	HRRI	CH,AS.CNB
	PUSHJ	PP,PUTAS1
	HRRZ	TA,CURFIL
	LDB	CH,FI.RCT##	;RE-RUN COUNT
	MOVSS	CH
	HRRI	CH,AS.CNB
	PUSHJ	PP,PUTAS1
	HRRZ	TA,CURFIL	;WORD 9
	SETZ	CH,
	LDB	TB,FI.ERM	;RECORDING MODE
	CAIE	TB,	%RM.SA		;STANDARD ASCII?
	JRST		B4.4D		;NO, GO ON.
	LDB	TC,	FI.RD##		;GET DENSITY.
	CAIE	TC,	%RD.2		;ONLY 800, 1600 AND DEFAULT
	CAIN	TC,	%RD.5		; DENSITY ARE ALLOWED.
	PUSHJ	PP,	CLE19.		;COMPLAIN.
B4.4D:	LDB	TC,FI.ACC	;ACCESS MODE
	CAIN	TC,%%ACC	;DO WE HAVE AN ACCESS MODE?
	MOVEI	TC,%ACC.S	;NO, MAKE IT SEQUENTIAL.
	DPB	TC,FI.ACC##
	CAIE	TC,%ACC.I	;INDEXED?
	JRST	.+3		;NO
	CAIN	TB,%RM.BN	;YES, MAY NOT BE BINARY.
	PUSHJ	PP,CLE24	;BAD NEWS
	DPB	TB,[POINT 3,CH,9]
	DPB	TC,[POINT 2,CH,17]
	LDB	TB,FI.VLR##	;VARIABLE LENGTH.
	DPB	TB,[POINT 1,CH,0]
	LDB	TB,FI.LBL	;LABELS
	CAIN	TB,%%LBL	;WERE THEY OMITTED (ON A SORT FILE)?
	MOVEI	TB,%LBL.S	;YES, MAKE THEM STANDARD.
	DPB	TB,FI.LBL
	DPB	TB,[POINT 2,CH,3]
	LDB	TB,FI.RER##	;RE-RUN END OF REEL
	DPB	TB,[POINT 1,CH,10]
	LDB	TB,FI.RRC##	;RE-RUN ON COUNT
	DPB	TB,[POINT 1,CH,11]
	LDB	TB,FI.OPT##
	DPB	TB,[POINT 1,CH,13]
	LDB	TB,FI.IRM	;INTERNAL MODE
	DPB	TB,[POINT 2,CH,15]
	HRRI	CH,AS.CNB
	LDB	TB,FI.IOO
	JUMPE	TB,.+2
	TLO	CH,4000
	PUSHJ	PP,PUTAS1
	SETZ	CH,		;WORD 9, RIGHT HALF
	HRRZ	TA,CURFIL
	LDB	CH,FI.DRL	;DATA RECORD LINK
	JUMPN	CH,B4.6
B4.5:	HRRZI	CH,AS.CNB	;NULL
	PUSHJ	PP,PUTAS1
	JRST	B4.7
B4.6:	LDB	TB,[POINT 3,CH,20]	;TYPE CODE
	CAIE	TB,CD.DAT
	JRST	B4.5
	IFN	CD.DAT-1,<
	ANDI	CH,LMASKB
	IORI	CH,AS.DAT
>
	PUSHJ	PP,PUTAS1
B4.7:	SETZ	CH,		;WORD 10
	HRRZ	TA,CURFIL
	LDB	CH,FI.LRS##	;MAXIMUM LABEL RECORD SIZE
	MOVSS	CH
	HRRI	CH,AS.CNB
	PUSHJ	PP,PUTAS1
	HRRZ	TA,CURFIL
	LDB	CH,FI.SDL##
	JUMPE	CH,B4.8		;NULL
	LDB	TB,[POINT 3,CH,20]
	CAIE	TB,CD.FIL
	JRST	B4.8		;NOT A FILE
	IFN	CD.FIL-4,<
	IFN	CD.FIL,<
	ANDI	CH,LMASKS
>
	IORI	CH,AS.FIL##
>
	PUSHJ	PP,PUTAS1
	JRST	B4.13
B4.8:	HRRZI	CH,AS.CNB
	PUSHJ	PP,PUTAS1
B4.13:	MOVE	CH,[XWD	AS.XWD,1]
	PUSHJ	PP,PUTAS1		;WORD 11
	HRRZI	CH,AS.CNB		;LEFT HALF
	LDB	TB,FI.BLF
	DPB	TB,[POINT 12,CH,17]	;BLOCKING FACTOR
	PUSHJ	PP,PUTAS1
	HRRZ	TA,CURFIL
	LDB	CH,FI.ACK##	;ACTUAL KEY
IFN ANS68,<
	JUMPN	CH,B4.13B
>
IFN ANS74,<
	JUMPE	CH,B4.13Z
	LDB	TB,[POINT 3,CH,20]	;GET CODE
	CAIE	TB,AC.MSC##	;SPECIAL?
	JRST	B4.13B		;NO, OUTPUT KEY
	HRLZ	CH,CH		;PUT INCREMENT IN LHS
	TLZ	CH,AS.MSC##
	TLO	CH,AS.PAR##	;RELATIVE TO %PARAM
	HRRI	CH,AS.MSC##	;SIGNAL MISC.
	JRST	B4.13B		;OUTPUT IT
B4.13Z:>
	LDB	TB,FI.ACC##
	CAIE	TB,%ACC.R	;RANDOM FILE?
	JRST	B4.13A		;NO, PUT OUT A ZERO
IFN ANS74,<
	LDB	TB,FI.FAM##	;GET ACCESS MODE
	CAIG	TB,%FAM.S	;SEQUENTIAL DOESN'T NEED KEY
	JRST	B4.13A		;SO PUT OUT A ZERO
	HRRZI	DW,E.727	;?RELATIVE KEY MUST BE SUPPLIED
>
IFN ANS68,<
	HRRZI	DW,E.240 >	;?NO ACTUAL KEY
	HRRZ	TA,CURFIL
	LDB	LN,FI.LN##	;POINT TO THE "SELECT"
	LDB	CP,FI.CP##
	PUSHJ	PP,FATAL
B4.13A:	HRRZI	CH,AS.CNB
B4.13B:	PUSHJ	PP,PUTAS1
	LDB	CH,FI.VID	;VALUE OF ID
	HRRZ	TA,CH
	SKIPE	TA
	PUSHJ	PP,REFTAG##	;REFERENCE IF A TAG
	HRRZ	TA,CURFIL
	PUSHJ	PP,PUTBYT	;WORD 12
	HRRZ	TA,CURFIL
	LDB	CH,FI.VDW
	PUSHJ	PP,PUTBYT	;WORD 13
	HRLZI	CH,AS.XWD
	HRRI	CH,5
	PUSHJ	PP,PUTAS1
	MOVE	TA,FI.SBA##
	MOVEM	TA,PNTR##
	HRRZ	TA,CURFIL
	LDB	CH,PNTR		;SAME BUFFER AREA LINK
	JUMPE	CH,B4.14Z	;NULL
	LDB	TB,[POINT 3,CH,20]
	CAIE	TB,CD.FIL
	JRST	B4.14Z
	IFN	CD.FIL-4,<
	IFN	CD.FIL,<
	ANDI	CH,077777>
	IORI	CH,AS.FIL
>
	PUSHJ	PP,PUTAS1
	JRST	B4.15
B4.14Z:	HRRZI	CH,AS.CNB
	PUSHJ	PP,PUTAS1

B4.15:	SETZB	TD,CTR
B4.15L:	HRRZ	TA,CURFIL
	ILDB	CH,PNTR		;'USE' POINTER
	JUMPE	CH,B4.15Z	;NULL
	LDB	TB,[POINT 3,CH,20]
	CAIE	TB,CD.PRO
	JRST	B4.15Z		;NOT PROTAB
REPEAT 0,<			;[1006] CODE TESTED ON CONFLICTING USE
	HRRZ	TD,CTR		;[1006] PROCEDURES, NO LONGER NECESSARY
	IMULI	TD,3
	SETZ	TE,
	SKIPE	TC,USES##(TD)
	PUSHJ	PP,CLE14.
	SKIPE	TC,USES+1(TD)
	PUSHJ	PP,CLE14.
	SKIPE	TC,USES+2(TD)
	PUSHJ	PP,CLE14.
	JUMPN	TE,B4.15Z
>
	MOVE	TA,CH
	PUSHJ	PP,PUTPRF
	HRRZ	TA,CH
	PUSHJ	PP,REFTAG##	;GETS THE FILE USE-PROCEDURE TAGS
	JRST	B4.15A
B4.15Z:	HRRZI	CH,AS.CNB
B4.15A:	PUSHJ	PP,PUTAS1
	AOS	TC,CTR
IFN ANS68,<
	CAIGE	TC,11
	JRST	B4.15L
>
IFN ANS74,<
B4.16:	HRRZ	TA,CURFIL
	ILDB	CH,PNTR	
	TRNN	CH,(1B2)
	TRZN	CH,(1B0)	;IS IT USER NAME
	JRST	B4.16A		;NO
	ADD	CH,NAMLOC	;GET POINTER TO NAME
	HRRZ	CH,(CH)		;GET DATAB PTR.
	DPB	CH,PNTR		;STORE BACK
	SETOM	RELKEY##	;SIGNAL PHASE E TO JUMP ROUND DECLARATIVES
B4.16A:	TRNE	CH,700000	;TYPE SET?
	JRST	B4.16B		;YES
	MOVS	CH,CH		;PUT VALUE IN LHS AND
	HRRI	CH,AS.CNB	;OUTPUT AS CONST.
B4.16B:	PUSHJ	PP,PUTAS1
	AOS	TC,CTR
	CAIGE	TC,11
	JRST	B4.16		;LOOP FOR ALL LINAGE STUFF
>
	MOVE	CH,[AS.XWD,,1]	;WORD 19
	PUSHJ	PP,PUTAS1
	HRRZ	TA,CURFIL	;LEFT HALF
	HRRZI	CH,AS.CNB
	LDB	TB,FI.RD##	;RECORD DENSITY
	DPB	TB,[POINT 3,CH,2]
	LDB	TB,FI.RP##	;RECORD PARITY
	LSH	TB,-1		;CONVERT 1 TO 0, 2 TO 1 FOR REAL FILE TABLE
	DPB	TB,[POINT 1,CH,3]
	LDB	TB,FI.DFR##	;GET DEFERRED OUTPUT ISAM BIT
	DPB	TB,[POINT 1,CH,5]	;SET ACCORDINGLY
	LDB	TB,FI.ENT##	;GET ERROR-PROC-ON-OPEN BIT
	DPB	TB,[POINT 1,CH,6]	;SET RUN-TIME ACCORDINGLY
	LDB	TB,FI.RMS##	;GET RMS BIT
	DPB	TB,[POINT 1,CH,7]
	LDB	TB,FI.BM##	;GET BYTE MODE BIT
	LDB	TC,FI.ERM	;GET RECORDING MODE
	CAIN	TC,%RM.BN	;CANNOT BE BINARY
	JUMPN	TB,CLE29.	;AND BYTE MODE
	DPB	TB,[POINT 1,CH,8]
B4.16D:	LDB	TB,FI.CKP##	;GET CHECKPOINT BIT
	DPB	TB,[POINT 1,CH,9]
	LDB	TB,FI.CRC##	;GET CHECKPOINT RECORD COUNT
	DPB	TB,[POINT 8,CH,17]
	PUSHJ	PP,PUTAS1
	HRRZ	TA,CURFIL	;RIGHT HALF
	LDB	CH,FI.VPP##	;PPN LINK
	PUSHJ	PP,PUTAS1
	HRRZ	TA,CURFIL	;WORDS 20-21
	LDB	TC,FI.ACC	;ISAM FILE?
	CAIE	TC,%ACC.I
	JRST	B4.P		;NO, OUTPUT OCTAL 0'S IN WORDS 20-22
IFN ANS74,<
	LDB	TB,FI.RKY	;MAKE SYMBOLIC KEY = RECORD KEY
	DPB	TB,FI.SKY##	;AS EASIEST WAY TO FAKE OUT ISAM
>
IFN ANS68,<
	LDB	TB,FI.SKY##	;SYMBOLIC KEY
	JUMPE	TB,CLE26.	;NO SYMBOLIC KEY
B4.IX1:
>
	LDB	TC,FI.RKY##	;RECORD KEY
	JUMPE	TC,CLE27.	;NO RECORD KEY
B4.IX2:	MOVE	TD,[TBLOCK+1,,TBLOCK+2]	;CLR STORAGE
	MOVEM	TB,TBLOCK	;SAVE KEYS
	SETZM	TBLOCK+1
	BLT	TD,TBLOCK+4
	MOVEM	TC,TBLOCK+5
	CAIN	TC,100001	;[1074] IF DUMMY ENTRY (ERRORS EARLIER ON),
	 JRST	B4.SK5		;[1074] SKIP THIS
	HRRZI	TA,(TB)		;MAKE PTR TO SYMBOLIC KEY
	PUSHJ	PP,LNKSET
	LDB	TB,DA.CLA##	;CLASS
	MOVEM	TB,TBLOCK+1
	LDB	TB,DA.USG##	;USAGE
	MOVEM	TB,TBLOCK+2
	LDB	TB,DA.INS##	;SIZE
	MOVEM	TB,TBLOCK+3
	LDB	TB,DA.NDP##	;# OF DECIMAL PLACES
	MOVEM	TB,TBLOCK+4
IFN ANS68,<			;IF -74 WE KNOW THEY ARE THE SAME
	HRRZ	TA,TBLOCK+5	;COMPARE RECORD KEY INFO
	PUSHJ	PP,LNKSET
	LDB	TB,DA.INS	;GET SIZE OF RECORD KEY
	JUMPE	TB,B4.SK5	;WE HAVE AN ERROR, BYPASS REST OF TESTS
	SKIPN	TBLOCK+3	;IF NO SIZE TO SYMBOLIC KEY
	JRST	B4.SK5		;THEN WE HAVE AN ERROR SO BYPASS REST OF TESTS
	LDB	TB,DA.CLA
	CAME	TB,TBLOCK+1
	JRST	CLE20		;CLASS NOT SAME AS SYMBOLIC KEY
B4.SK1:	LDB	TB,DA.USG
	CAME	TB,TBLOCK+2
	JRST	CLE21		;USAGE NOT SAME
B4.SK2:	LDB	TB,DA.INS
	CAME	TB,TBLOCK+3
	JRST	CLE22		;SIZE NOT SAME
B4.SK3:	LDB	TB,DA.NDP
	CAME	TB,TBLOCK+4
	JRST	CLE23		;# DEC. PLACES NOT SAME
B4.SK4:
>;END IFN ANS68
	LDB	TB,DA.DFS##	;RECORD KEY IN RECORD?
	JUMPE	TB,CLE25	;NO
B4.SK6: LDB	TB,DA.POP##	;[735] FIND FILENAME
	LDB	TE,[POINT 3,TB,20]	;[735] GET TYPE
	CAIN	TE,CD.FIL	;[735] FILENAME?
	JRST	B4.SK7		;[735] YES - SEE IF ITS THE ONE
	MOVE	TA,TB		;[735] NOT AT TOP YET
	PUSHJ	PP,LNKSET	;[735] UP TO NEXT LEVEL...
	  JRST	B4.SK6		;[735] LOOP UNTIL WE GET TO FILE
B4.SK7: HLRZ	TA,CURFIL	;[735] GET CURRENT FILE
	CAMN	TA,TB		;[735] SAME FILE?
	JRST	B4.SK5		;[735] YES -- GO ON
	JRST	CLE25		;[735] NO - RECORD KEY IN WRONG FILE
	
B4.SK5:	MOVE	CH,TBLOCK	;OUTPUT SYMBOLIC KEY BYTE PTR (WD 20)
	PUSHJ	PP,PUTBYT
	HRLZI	CH,AS.BYT##	;OUTPUT RECORD KEY BYTE PTR (WD 21)
	HRRI	CH,AS.CNB
	PUSHJ	PP,PUTAS1
	HRRZ	TA,TBLOCK+5
	PUSHJ	PP,LNKSET
	LDB	CH,DA.LOC##	;REL. LOC OF KEY IN RECORD
	PUSHJ	PP,PUTBX
	HRLZI	CH,AS.XWD	;WORD 22
	HRRI	CH,1
	PUSHJ	PP,PUTAS1
	MOVE	TA,TBLOCK+1	;GET CLASS OF KEY
	CAIE	TA,%CL.NU	;NUMERIC
	SETZM	TBLOCK+1	;NON-NUMERIC -- SET TYPE = 0
	HRRZ	TA,TBLOCK+5	;GET PTR TO RECORD KEY
	PUSHJ	PP,LNKSET
	HRRZM	TA,TBLOCK+5
	LDB	TB,DA.EDT##	;EDITING BIT ON?
	SKIPE	TB
	SETZM	TBLOCK+1	;IF NUMERIC EDITED SET TYPE = 0
	SKIPN	TBLOCK+1	;IF TYPE = 0, SKIP NUMERIC STUFF
	JRST	B4.C2
	MOVE	TA,TBLOCK+2	;USAGE
	CAIE	TA,%US.C1	;FLOATING?
	CAIN	TA,%US.C2
	TRNA
	JRST	.+3		;NO
	HRRZI	TA,5		;YES, SET TYPE = 5
	JRST	B4.C1
	CAIE	TA,%US.C3	;COMP-3?
	JRST	.+3		;NO
	HRRZI	TA,7		;YES, SET TYPE = 7
	JRST	B4.C1		;NOTE: IF SIZE IF >10, TYPE IS SET TO 10
	CAIGE	TA,%US.1C	;FIXED PT?
	JRST	.+3		;NO
	HRRZI	TA,3		;YES, SET TYPE = 3
	JRST	B4.C1
	HRRZI	TA,1		;MUST BE DISPLY
B4.C1:	MOVEM	TA,TBLOCK+1	;STORE TYPE
	MOVE	TA,TBLOCK+3	;GET SIZE
	CAILE	TA,^D10		;MORE THAN 10 DIGITS?
	AOS	TBLOCK+1	;YES, ADD 1 TO TYPE
	HRRZ	TA,TBLOCK+5	;PTR TO REC. KEY
	LDB	TB,DA.SGN##	;GET SIGN FLAG
	SETCA	TB,		;COMPLEMENT IT
	DPB	TB,[POINT 1,TBLOCK+3,20]
B4.C2:	HRRZ	TA,CURFIL	;GET MODE
	LDB	TB,FI.ERM
	SETZ	TC,		;ASSUME SIXBIT
	CAIN	TB,%RM.7B
	MOVEI	TC,2		;[1032] ASCII
	CAIN	TB,%RM.EB	;[1032] TEST FOR EBCDIC
	MOVEI	TC,1		;[1032]
	DPB	TC,[POINT 2,TBLOCK+3,19]	;[1032] 
	HRRZI	CH,AS.CNB	;OUTPUT LEFT HALF OF WD 22
	HRL	CH,TBLOCK+1	;TYPE CODE
	PUSHJ	PP,PUTAS1
	HRRZI	CH,AS.CNB	;RT. HALF
	HRL	CH,TBLOCK+3	;OTHER CODES
	PUSHJ	PP,PUTAS1
	JRST	B4.Q
B4.P:	MOVEI	TA,3		;OCTAL 0'S TO WDS 20-22
	MOVEM	TA,CTR
B4.S:	MOVE	CH,[AS.OCT,,1]
	PUSHJ	PP,PUTAS1
	SETZ	CH,
	PUSHJ	PP,PUTAS1
	SOSLE	CTR
	JRST	B4.S

B4.Q:

;WORD 23 LOOKS LIKE:
;	BITS	0-8	OWNER ACCESS.
;	BITS	9-17	OTHER ACCESS.
;	BITS	18-35	COUNT OF RECORDS RETAINED.

	HRRZ	TA,	CURFIL		;POINT AT THE CURRENT FILE TABLE.
	MOVE	CH,	[AS.XWD,,1]	;A SINGLE XWD SHOULD SUFFICE.
	PUSHJ	PP,	PUTAS1
	LDB	TB,	FI.OWA##	;OWNER ACCESS.
	DPB	TB,	[POINT 9,CH,8]
	LDB	TB,	FI.OTA##	;OTHER ACCESS.
	DPB	TB,	[POINT 9,CH,17]
	HRRI	CH,	AS.CNB
	PUSHJ	PP,	PUTAS1
	LDB	CH,	FI.RTC##	;COUNT OF RECORDS RETAINED.
	MOVSS	CH,	CH
	HRRI	CH,	AS.CNB
	PUSHJ	PP,	PUTAS1
;WORDS 24 THROUGH 31 ARE THE FILE STATUS WORDS.

	MOVE	TD,	FI.SPT##	;POINTER TO THEM IN THE FILE TABLE.

;WORD 24 - FILE STATUS.
;	BITS	0-5	BYTE RESIDUE.
;	BITS	6-11	BYTE SIZE.
;	BITS	12-17	FIELD SIZE.
;	BITS	18-35	ADDRESS.

	HRREI	TE,	-10
	PUSHJ	PP,	PPTR

;WORD 25 - ERROR NUMBER.
;	BITS	0-5	BYTE RESIDUE.
;	BITS	6-11	BYTE SIZE.
;	BITS	12-17	FIELD SIZE.
;	BITS	18-35	ADDRESS.

	AOJGE	TE,	FSDN
	PUSHJ	PP,	PPTR

;WORD 26 - ACTION CODE.
;	BITS	0-17	0
;	BITS	18-35	ADDRESS.

	AOJGE	TE,	FSDN
	PUSHJ	PP,	PIDX

;WORD 27 - VALUE OF ID.
;	BITS	0-5	BYTE RESIDUE.
;	BITS	6-11	BYTE SIZE.
;	BITS	12-17	FIELD SIZE.
;	BITS	18-35	ADDRESS.

	AOJGE	TE,	FSDN
	PUSHJ	PP,	PPTR
;WORD 28 - BLOCK NUMBER.
;	BITS	0-17	0
;	BITS	18-35	ADDRESS.

	AOJGE	TE,	FSDN
	PUSHJ	PP,	PIDX

;WORD 29 - RECORD NUMBER.
;	BITS	0-17	0
;	BITS	18-35	ADDRESS.

	AOJGE	TE,	FSDN
	PUSHJ	PP,	PIDX

;WORD 30 - FILE NAME.
;	BITS	0-5	BYTE RESIDUE.
;	BITS	6-11	BYTE SIZE.
;	BITS	12-17	FIELD SIZE.
;	BITS	18-35	ADDRESS.

	AOJGE	TE,	FSDN
	PUSHJ	PP,	PPTR

;WORD 31 - FILE TABLE ADDRESS.
;	BITS	0-17	0
;	BITS	18-35	ADDRESS.

	AOJGE	TE,	FSDN
	PUSHJ	PP,	PIDX
	JRST		FSDN
;ROUTINE TO PUT OUT A FILE STATUS POINTER FOR DISPLAY ITEMS.

PPTR:	JSP	TB,	PINT		;SET UP.
	LDB	TB,	DA.RES##	;RESIDUE.
	DPB	TB,	[POINT 6,CH,5]
	LDB	TB,	DA.USG##	;USAGE.
	CAIN	TB,	%US.D6		;SIXBIT.
	MOVEI	TC,	6
	CAIN	TB,	%US.D7		;ASCII.
	MOVEI	TC,	7
	CAIN	TB,	%US.EB		;EBCDIC.
	MOVEI	TC,	11
	DPB	TC,	[POINT 6,CH,11]
	LDB	TB,	DA.EXS##	;SIZE.
	DPB	TB,	[POINT 6,CH,17]
	HRRI	CH,	AS.CNB
PPTR1:	PUSHJ	PP,	PUTAS1
	HRRZ	TA,	CURFIL		;POINT AT THE CURRENT FILE TABLE AGAIN.
	LDB	CH,	TD		;LOCATION.
	JRST		PUTAS1		;WRITE IT AND RETURN.

;ROUTINE TO PUT OUT A FILE STATUS POINTER FOR INDEX ITEMS.

PIDX:	JSP	TB,	PINT		;SET UP.
	HRRZI	CH,	AS.CNB		;NOTHING IN THE LEFT HALF.
	JRST		PPTR1


;INITIALIZATION ROUTINE.

PINT:	HRRZ	TA,	CURFIL
	ILDB	TA,	TD		;NEXT LINK.
	JUMPN	TA,	PINT2		;JUMP IF THER IS ONE.
PINT1:	MOVE	CH,	[AS.OCT,,1]	;NONE, WRITE OUT ZEROES.
	PUSHJ	PP,	PUTAS1
	SETZ	CH,
	PUSHJ	PP,	PUTAS1
	AOJL	TE,	PINT1
	POPJ	PP,

PINT2:	LDB	TC,	LNKCOD##	;GET ITS CODE.
	CAIE	TC,	CD.DAT		;DATAB?
	JRST		PINT1		;NO, MUST HAVE BEEN AN ERROR IN
					; CLEANC.
	ANDI	TA,	077777		;GET THE OFFSET.
	ADD	TA,	DATLOC##		;MAKE IT ABSOLUTE.
	MOVE	CH,	[AS.XWD,,1]	;ONE XWD.
	PUSHJ	PP,	PUTAS1
	JRST		(TB)		;RETURN.
FSDN:	MOVEI	TB,SZ.OFT
	ADDM	TB,EAS1PC	;ADD IN THE FIXED PART OF THE FILE TABLE
IFN ANS68,<
	HRRZ	TA,CURFIL
	LDB	TB,FI.NFL	;NUMBER OF FILE-LIMITS
	JUMPE	TB,B5
	ADDI	TA,SZ.FIL
	HRLI	TA,442200
	MOVEM	TA,PNTR		;BYTE POINTER
	HRLZI	CH,AS.XWD
	HRRZI	TE,(TB)		;NO. FILE LIMIT CLAUSES
	IMULI	TE,3		;NO. WORDS NEEDED
	HRRI	CH,(TE)
	ASH	TB,1		;NO. HALFWORDS FOR LIMITS
	MOVEM	TB,CFLM##
	ADDM	TE,EAS1PC
	PUSHJ	PP,PUTAS1
B4.16:	ILDB	CH,PNTR		;NEXT FILE-LIMIT
	JUMPE	CH,B4.18
	LDB	TB,[POINT 3,CH,20]	;TYPE CODE
	CAIE	TB,CD.DAT
	JRST	B4.17
	IFN	CD.DAT-1,<
	ANDI	CH,077777
	IORI	CH,AS.DAT
	>
	PUSHJ	PP,PUTAS1
	JRST	B4.19
B4.17:	CAIE	TB,CD.TAG
	JRST	B4.18
	PUSHJ	PP,PUTAS1
	JRST	B4.19
B4.18:	HRRZI	CH,AS.CNB
	PUSHJ	PP,PUTAS1
B4.19:	MOVE	TB,PNTR
	TLNE	TB,770000
	JRST	B4.20		;NEED ANOTHER LIMIT
	HRRZI	TB,4
	HRRZI	CH,AS.CNB
	PUSHJ	PP,PUTAS1
	SOJG	TB,.-2		;4 HALFWORDS
B4.20:	SOSLE	CFLM
	JRST	B4.16
>
B5:	HRRZ	TA,CURFIL
	LDB	TD,FI.LRS	;[236] GET LABEL RECORD SIZE
	SKIPN	TD		;[236]
	MOVEI	TD,^D80		;[236] 80. CHARS IF STANDARD LABELS
	LDB	TE,FI.MRS
	CAMGE	TE,TD		;[236]
	MOVE	TE,TD		;[236] USE THE LARGER
	LDB	TD,FI.IRM
	CAIN	TD,%RM.6B
	JRST	B5.1
	CAIE	TD,%RM.7B
	SKIPA	TD,[EXP 4]
	MOVEI	TD,5
	TRNA
B5.1:	MOVEI	TD,6
	IDIVI	TE,(TD)
	CAIE	TD,0
	HRRZI	TE,1(TE)
	HRRZM	TE,TBLOCK	;RECORD AREA IN WORDS
B5.2:	LDB	TB,FI.SRA##
	JUMPE	TB,B5.3		;NO SAME RECORD AREA
	HLRZ	TC,CURFIL
	CAIN	TC,(TB)
	JRST	B5.3
	HRRZI	TA,(TB)
	PUSHJ	PP,LNKSET
	LDB	TB,FI.ADR##
	JUMPN	TB,B5.5		;RECORD AREA DEFINED
	LDB	TE,FI.MRS
	LDB	TD,FI.LRS
	CAIGE	TE,(TD)
	HRRZI	TE,(TD)
	LDB	TD,FI.IRM
	CAIN	TD,%RM.6B
	JRST	.+5
	CAIE	TD,%RM.7B
	SKIPA	TD,[EXP 4]
	MOVEI	TD,5
	TRNA
	MOVEI	TD,6
	IDIVI	TE,(TD)
	CAIE	TD,0
	HRRZI	TE,1(TE)
	CAMLE	TE,TBLOCK
	HRRZM	TE,TBLOCK
	JRST	B5.2
B5.3:	MOVE	TA,CURFIL
B5.4:	LDB	TB,FI.SAL##
	JUMPE	TB,B5.6		;NO SAME AREA LINK
	HLRZ	TC,CURFIL
	CAIN	TB,(TC)
	JRST	B5.6		;NO MORE
	HRRZI	TA,(TB)
	PUSHJ	PP,LNKSET
	LDB	TB,FI.ADR
	JUMPN	TB,B5.5		;RECORD AREA DEFINED
	LDB	TE,FI.MRS
	LDB	TD,FI.LRS
	CAIGE	TE,(TD)
	HRRZI	TE,(TD)
	LDB	TD,FI.IRM
	CAIN	TD,%RM.6B
	JRST	.+5
	CAIE	TD,%RM.7B
	SKIPA	TD,[EXP 4]
	MOVEI	TD,5
	TRNA
	MOVEI	TD,6
	IDIVI	TE,(TD)
	CAIE	TD,0
	HRRZI	TE,1(TE)
	CAMLE	TE,TBLOCK
	HRRZM	TE,TBLOCK
	JRST	B5.4
B5.5:	LDB	TB,FI.LOC##	;LOCATION OF RECORD AREA
B5.51:	HRRZ	TA,CURFIL
	DPB	TB,FI.LOC
	SETO	TC,
	DPB	TC,FI.ADR
	JRST	B6
;PUT OUT 'RELOC .+<SIZE OF RECORD>

B5.6:	MOVEI	CH,AS.MSC##
	HRLI	CH,1+AS.REL##
	PUSHJ	PP,PUTAS1
	HRRZ	CH,TBLOCK
	ANDI	CH,077777
	HRRZ	TA,CURFIL
	LDB	TB,FI.LBL
	CAIE	TB,%LBL.S
	JRST	B5.61
	CAIGE	CH,^D21
	HRRZI	CH,^D21
	HRRZM	CH,TBLOCK
B5.61:	IORI	CH,AS.DOT##
	PUSHJ	PP,PUTAS1
	HRRZ	TB,EAS1PC
	HRRZ	TC,TBLOCK
	ADDM	TC,EAS1PC
	ADD	TB,FILTBL
	HRRZI	TB,-SZ.DEV(TB)
	JRST	B5.51


B6:	HRRZ	TA,CURFIL
	LDB	TA,FI.NXT	;NEXT FILTAB ENTRY
	JUMPN	TA,CLND

;ALL DONE WITH FILE TABLES - FALL THROUGH
;SEE IF WE HAVE TO ADJUST THE SIZE OF DEBUG-CONTENTS

IFN ANS74,<
	MOVE	TA,MAXDBC##	;GET MAX. RECORD SIZE
	SUBI	TA,^D30/6	;MINUS WHAT WE HAVE
	JUMPLE	TA,ECLND	;NOTHING TO DO
	MOVEM	TA,MAXDBC	;SAVE DIFFERENCE
	PUSH	PP,FLGSW##	;SAVE CURRENT SETTING
	SETZM	FLGSW		;TURN IT OFF TO AVOID SPURIOUS DEBUG-ITEM ERRORS
	MOVE	TB,[SIXBIT /DEBUG:/]
	MOVEM	TB,NAMWRD##
	MOVE	TB,[SIXBIT /ITEM/]
	MOVEM	TB,NAMWRD+1
	SETZM	NAMWRD+2
	MOVE	TB,[NAMWRD+2,,NAMWRD+3]
	BLT	TB,NAMWRD+5
	PUSHJ	PP,TRYNAM##	;NAME BETTER EXIST
	  JRST	ECLND1		;NO, GIVE UP
	HRRZ	TA,0(TA)	;GET DATAB LINK
	PUSHJ	PP,LNKSET
	MOVE	TB,MAXDBC	;GET SIZE IN WORDS
	IMULI	TB,6
	HRL	TB,TB
	ADDM	TB,5(TA)	;MAKE IT BIGGER

	MOVE	TB,[SIXBIT /CONTEN/]
	MOVEM	TB,NAMWRD+1
	MOVSI	TB,'TS '
	MOVEM	TB,NAMWRD+2
	PUSHJ	PP,TRYNAM	;NAME BETTER EXIST
	  JRST	ECLND1		;NO, GIVE UP
	HRRZ	TA,0(TA)	;GET DATAB LINK
	PUSHJ	PP,LNKSET
	MOVE	TB,MAXDBC	;GET SIZE IN WORDS
	IMULI	TB,6
	HRL	TB,TB
	ADDM	TB,5(TA)	;MAKE IT BIGGER

	MOVE	TB,[SIXBIT /TS:DIS/]
	MOVEM	TB,NAMWRD+2
	MOVE	TB,[SIXBIT /PLAY:6/]
	MOVEM	TB,NAMWRD+3
	PUSHJ	PP,TRYNAM	;NAME BETTER EXIST
	  JRST	ECLND1		;NO, GIVE UP
	HRRZ	TA,0(TA)	;GET DATAB LINK
	PUSHJ	PP,LNKSET
	MOVE	TB,MAXDBC	;GET SIZE IN WORDS
	IMULI	TB,6
	HRL	TB,TB
	ADDM	TB,5(TA)	;MAKE IT BIGGER

	AOS	NAMWRD+3	;DEBUG-CONTENTS-DISPLAY-7
	PUSHJ	PP,TRYNAM	;NAME BETTER EXIST
	  JRST	ECLND1		;NO, GIVE UP
	HRRZ	TA,0(TA)	;GET DATAB LINK
	PUSHJ	PP,LNKSET
	MOVE	TB,MAXDBC	;GET SIZE IN WORDS
	IMULI	TB,5
	HRL	TB,TB
	ADDM	TB,5(TA)	;MAKE IT BIGGER

	MOVEI	TB,2
	ADDM	TB,NAMWRD+3
	PUSHJ	PP,TRYNAM	;NAME BETTER EXIST
	  JRST	ECLND1		;NO, GIVE UP
	HRRZ	TA,0(TA)	;GET DATAB LINK
	PUSHJ	PP,LNKSET
	MOVE	TB,MAXDBC	;GET SIZE IN WORDS
	IMULI	TB,4
	HRL	TB,TB
	ADDM	TB,5(TA)	;MAKE IT BIGGER
ECLND1:	POP	PP,FLGSW	;RESTORE FIPS FLAGGER
>
;SET 'USEBAS' AND PREPARE TO PUT OUT 'USE' TABLE

ECLND:	SKIPE	TA,EAS1PC
	SUBI	TA,SZ.DEV	;FILTBL POINTS AROUND
				;  FIRST DEVICE TABLE
	MOVEM	TA,USEBAS##
	SETZM	EAS1PC
IFN ANS74,<
	SKIPE	RELKEY##	;NEED %PARAM+0 FOR CONVERSION?
	AOS	IMPPAR		;YES, RESERVE IT
>
IFN DBMS,<
	SETZM	DBONLY##	;[401] START IN OFF POSITION
	SETZM	TBLOCK+7	;CLR CTR OF ERROR-STATUS DECL. PROCS.
>
IFN ANS74!DBMS,<
	PUSHJ	PP,CUSETB	;SET UP PERFORMS FOR EACH E-S PROCEDURE
>
	MOVEI	TC,0		;TC IS # OF WORDS PUT OUT
	MOVE	TA,[XWD -USES.L##,USES##]	;IF NO
	SKIPN	(TA)			;ENTRIES
	AOBJN	TA,.-1			;IN USE TABLE,
	JUMPGE	TA,EC1.B		;DON'T PUT OUT ANYTHING

IFN DBMS,<SETOM DBONLY##>  ;[401] TURN ON SINCE AT LEAST ONE USE IS NON-DBMS
	MOVE	CH,[XWD AS.XWD,SZ.OUS]	;PREPARE TO WRITE THE USES TABLE
	PUSHJ	PP,PUTAS1	;WRITE HEADER WORD

;EACH HALFWORD WILL BE WRITTEN OUT IN THE SAME ORDER THAT IT APPEARS
; IN USES, FOR EACH OF THE 20 WORDS.
	SETZB	TA,CTR
EC1:	HLRZ	TA,USES(TA)	;GET LH
	PUSHJ	PP,CHKUSE	;DO IT
	MOVE	TA,CTR
	HRRZ	TA,USES(TA)	;GET RH
	PUSHJ	PP,CHKUSE	;WRITE IT
	AOS	TA,CTR		;COUNT WORDS WRITTEN
	CAIGE	TA,SZ.OUS	;EXIT WHEN WROTE THEM ALL
	 JRST	EC1		;ELSE LOOP
IFN ANS74,<			;COPY USE PROCEDURE ADDRESSES FOR PHASE E
	MOVEI	TC,0		;PTR TO USP.XXXX
	MOVE	TA,USES		;INPUT
	PUSHJ	PP,PUTPTE	;PUT TAG FOR PHASE E
	MOVE	TA,USES+5	;OUTPUT
	PUSHJ	PP,PUTPTE
	MOVE	TA,USES+^D10	;I-O
	PUSHJ	PP,PUTPTE
	MOVE	TA,USES+^D15	;EXTEND
	PUSHJ	PP,PUTPTE
>
	HRRZI	TC,SZ.OUS	;# WORDS WRITTEN
EC1.B:
IFN DBMS,<ADD	TC,TBLOCK+7>	;ADD IN COUNT OF ERROR-STATUS PROCEDURES
	EXCH	TC,IMPPAR##
	MOVEM	TC,EAS1PC
	MOVE	CH,[AS.REL+1,,AS.MSC]
	PUSHJ	PP,PUTAS1
	HRRZI	CH,AS.DAT##
	PUSHJ	PP,PUTAS1
	JUMPLE	TC,CPOPJ##
	HRRZ	CH,TC		;NUMBER OF EXIT WORDS USED
	HRLI	CH,AS.XWD
	PUSHJ	PP,PUTAS1
	HRRZI	CH,AS.CNB
EC1.L:	PUSHJ	PP,PUTAS1
	PUSHJ	PP,PUTAS1
	SOJG	TC,EC1.L
	POPJ	PP,

;CHECK TO SEE IF USE PROCEDURE IN TA HAS A TAG, IF NOT,
; CREATE A PERFORM AND OUTPUT A TAG REFERENCE.
CHKUSE:	HRRZI	CH,AS.CNB
	JUMPE	TA,PUTAS1	;NO USE PROCEDURE, OUTPUT 0
	LDB	TC,LNKCOD##
	CAIN	TC,CD.PRO
	PUSHJ	PP,PUTPRF
	PUSH	PP,TA		;NEED TO SAVE TA
	HRRZ	TA,CH
	PUSHJ	PP,REFTAG##	;REFERENCE IF IT'S A TAG
	POP	PP,TA
	JRST	PUTAS1
IFN ANS74!DBMS,<

;SCAN USETAB FOR DEBUG AND ERROR-STATUS ENTRIES --
;  FOR EACH ONE SET UP A PERFORM OF THAT PROCEDURE, AND
;  REMEMBER TAG OF THE PERFORM

CUSETB:	SETZM	TBLOCK+5	;[677] INIT DYNAMIC USETAB PTR AT TOP
	HRRZ	TB,USELOC##	;[677] GET PTR TO START OF TABLE
	HRRZ	TA,USENXT##	;GET PTR TO END OF USETAB
	SUB	TA,TB		;[677] GET RELATIVE ADDRESS
	MOVEM	TA,TBLOCK+6	;[677] SAVE PTR TO END OF TABLE

CUSET1:	AOS	TA,TBLOCK+5	;BUMP USETAB PTR TO NEXT ENTRY
	CAMLE	TA,TBLOCK+6	;PAST END?
	POPJ	PP,		;YES, RETURN

	ADD	TA,USELOC##	;[677] MAKE ABSOLUTE ADDR.
	LDB	TB,US.TYP##	;GET TYPE CODE
IFN ANS74,<
	CAIN	TB,%UT.DB	;DEBUGGING?
	JRST	CUSET6		;YES
>
IFN DBMS,<
	CAIE	TB,%UT.ES	;THIS AN ERROR-STATUS ENTRY?
>
	JRST	CUSET4		;NO
IFN DBMS,<
	LDB	TB,US.XTR##	;ANY EXTRA WORDS ALLOCATED?
	JUMPE	TB,CUSET1	;NO, MUST HAVE BEEN A BAD ENTRY
	AOS	TBLOCK+7	;BUMP ERROR-STATUS PROC COUNTER
>
IFN ANS74,<CUSET6:>
	HRRZ	TB,USELOC##	;[677] GET ABS. START OF TABLE
	HRRZ	TC,TA		;[677] TC:= ABS. PLACE IN TABLE
	SUB	TC,TB		;[677] GET RELATIVE PLACE
	PUSH	PP,TC		;[677] AND SAVE IT
	LDB	TA,US.PRO##	;GET PROTAB LINK OF E-S SECTION
	PUSHJ	PP,PUTPR2	;ENTER PUTPRF ROUTINE
	POP	PP,TA		;RESTORE USETAB PTR
	ADD	TA,USELOC	;[677] MAKE ABS. POINTER
	DPB	CH,US.PRO	;SAVE TAG ADDR OF PERFORM OF THAT SECTION
IFN ANS68,<
	JRST	CUSET3
>
IFN ANS74,<
	LDB	TB,US.TYP
	CAIE	TB,%UT.DB	;IF DEBUG WE MAY NOT BE FINISHED
	JRST	CUSET3
	SKIPN	TB,DBPARM##	;HAVE WE ALLOCATED %PARAM+N YET?
	JRST	[AOS	TB,IMPPAR	;NO, ALLOCATE IT
		SOJA	TB,.+1]		;BUT USE PREVIOUS
	MOVEM	TB,DBPARM
	LDB	TB,US.XTR##	;ANY EXTRA WORDS?
	JUMPE	TB,CUSET1	;NO, WE ARE DONE
	LDB	TC,US.CNT##	;YES, GET THE COUNT
	MOVNI	TC,-1(TC)	;BUT NOT THE FIRST EXTRA WORD
	HRLZ	TC,TC
	HRRI	TC,2(TA)	;AOBJN POINTER TO USETAB
CUSET5:	HLRZ	TA,(TC)		;GET FLOTAB POINTER
	ADD	TA,FLOLOC##
	LDB	TA,FL.PRO##	;GET PROTAB LINK
	ANDI	TA,077777
	ADD	TA,PROLOC##
	MOVE	TB,TBLOCK+5	;GET USETAB LINK
	DPB	TB,PR.DEB##	;SAVE IT IN PROTAB
	HRRZ	TA,(TC)		;GET FLOTAB POINTER
	JUMPE	TA,CUSET7	;ALL DONE
	ADD	TA,FLOLOC##
	LDB	TA,FL.PRO##	;GET PROTAB LINK
	ANDI	TA,077777
	ADD	TA,PROLOC##
	MOVE	TB,TBLOCK+5	;GET USETAB LINK
	DPB	TB,PR.DEB##	;SAVE IT IN PROTAB
CUSET7:	AOBJN	TC,CUSET5	;LOOP
	MOVE	TA,TBLOCK+5
	ADD	TA,USELOC
	LDB	TC,US.CNT	;GET EXTRA WORDS
	ADDM	TC,TBLOCK+5
	JRST	CUSET1
>

CUSET4:	LDB	TC,US.XTR##	;ANY EXTRA WORDS?
	JUMPE	TC,CUSET1	;NO
CUSET3:	LDB	TC,US.CNT##	;GET COUNT OF EXTRA WORDS IN USETAB ENTRY
				;[435] THE USE TABLE LOOKS LIKE
				;[435] CNT OF ERROR-STATUS,,ERROR-STATUS-1
				;[435] ERROR-STATUS-2,,ERROR-STATUS-3  ETC
	LSH	TC,-1		;[435] DIVIDE # OF ERROR-STATUS VALUES BY 2
	AOS	TC		;[435] ROUND UP TO GET NUMBER OF WORDS NEEDED
	ADDM	TC,TBLOCK+5	;[435] ADD TO DYNAMIC USETAB PTR
	JRST	CUSET1		;TRY NEXT ENTRY

>

CLE1.:	HRRZI	DW,E.202		;NO DEVICES
	JRST	CLER2.
CLE2.:	HRRZI	DW,E.201		;NO DATA RECORDS
	JRST	CLER.
CLE4.:	HRRZI	DW,E.199		;VAL-ID AND VAL-DW REQUIRED
	JRST	CLER.
CLE5.:	HRRZI	DW,E.198		;LABELS MUST BE STANDARD
	JRST	CLER.
CLE6.:	HRRZI	DW,E.197		;ONLY ONE DEVICE ALLOWED
	JRST	CLER2.
IFN ANS68,<
CLE7.:	HRRZI	DW,E.196		;MULTIPLE REEL/UNIT NOT ALLOWED
	JRST	CLER.
CLE10.:	HRRZI	DW,E.193		;FILE-LIMITS REQUIRED
	JRST	CLER2.
CLE11.:	HRRZI	DW,E.192		;'BLOCK CONTAINS N RECORDS' MUST BE SPECIFIED
	JRST	CLER.
>
CLE12.:	HRRZI	DW,E.97			;NO FD
	HRRZ	TA,CURFIL
	LDB	LN,FI.LN##		;POINT TO THE "SELECT"
	LDB	CP,FI.CP##
	JRST	FATAL##

CLE13.:	HRRZI	DW,E.365		;FILE MUST BE ASCII IF WRITE ADV BIT ON
	JRST	CLER2.

IFN ANS68,<
CLE14.:	LDB	TB,[POINT 3,TC,20]
	CAIE	TB,CD.PRO
	JRST	CLE14A
	MOVEM	CH,TBLOCK+11
	MOVEM	TC,TBLOCK+12
	MOVEM	TD,TBLOCK+13
	MOVEM	TE,TBLOCK+14
	HRRZ	TA,CH
	PUSHJ	PP,LNKSET
	LDB	TA,PR.FLO##
	ADD	TA,FLOLOC##
	LDB	LN,FL.LN##
	LDB	CP,FL.CP##
	HRRZI	DW,E.505	;CONFLICTING USES
	PUSHJ	PP,FATAL##
	MOVE	DW,TBLOCK+12
	PUSHJ	PP,PUTERA##
	MOVE	CH,TBLOCK+11
	MOVE	TC,TBLOCK+12
	MOVE	TD,TBLOCK+13
	SKIPA	TE,TBLOCK+14
CLE14A:	SETZM	USES(TD)
	POPJ	PP,

CLE15.:	HRRZI	DW,E.301
	JRST	CLER2.		;BLOCKING FACTOR MUST BE GT. 0 FOR I-O USE
>
CLE18.:	HRRZI	DW,E.579	;ADVANCING AND POSITIONING FOR THE SAME FILE.
	PJRST	CLER2.
CLE19.:	HRRZI	DW,E.585	;ONLY DENSITIES OF 800 AND 1600 BPI
	PJRST	CLER2.		; ARE ALLOWED ON STANDARD ASCII FILES.
IFN ANS68,<
CLE20:	HRRZI	DW,E.374	;SYMBOLIC KEY & REC KEY NOT SAME CLASS
	PUSHJ	PP,CLER2.
	JRST	B4.SK1
CLE21:	HRRZI	DW,E.375	;SYMBOLIC KEY & REC KEY NOT SAME USAGE
	PUSHJ	PP,CLER2.
	JRST	B4.SK2
CLE22:	HRRZI	DW,E.376	;SYMBOLIC KEY & REC KEY NOT SAME SIZE
	PUSHJ	PP,CLER2.
	JRST	B4.SK3
CLE23:	HRRZI	DW,E.377	;SYMBOLIC KEY & REC KEY NOT SAME # DEC PLACES
	PUSHJ	PP,CLER2.
	JRST	B4.SK4
>
CLE24:	HRRZI	DW,E.378	;INDEXED FILE MUST BE 6BIT OR ASCII
	JRST	CLER2.
CLE25:	HRRZI	DW,E.379	;RECORD KEY NOT IN RECORD
	HRRZ	TA,CURFIL
	LDB	LN,FI.LN##	;POINT TO THE "SELECT"
	LDB	CP,FI.CP##
	PUSHJ	PP,FATAL##
	JRST	B4.SK5
IFN ANS68,<
CLE26.:	HRRZI	DW,E.393	;SYMBOLIC KEY REQUIRED
	PUSHJ	PP,CLER2.
	MOVEI	TB,100001	;DUMMY DATAB ENTRY
	JRST	B4.IX1
>
CLE27.:	HRRZI	DW,E.394	;RECORD KEY REQUIRED
	PUSHJ	PP,CLER2.
	MOVEI	TC,100001	;DUMMY DATAB ENTRY
IFN ANS74,<
	MOVEI	TB,100001	;[747] DUMMY DATAB ENTRY
>
	JRST	B4.IX2

CLE28.:	HRRZI	DW,E.566	;EBCDIC FILES MAY NOT
	PJRST	CLER2.		;HAVE NON-STANDARD LABELS.
CLE29.:	HRRZI	DW,E.596	;CAN NOT BE BYTE MODE AND BINARY
	PUSHJ	PP,CLER2.
	JRST	B4.16D		;SO IGNORE BYTE MODE
CLE30.:	HRRZI	DW,E.623	;BLOCKING FACTOR TOO SMALL
	PJRST	CLER2.

CLER.:	SKIPE	TBLOCK+20
	POPJ	PP,
CLER2.:	HRRZ	TA,CURFIL
	LDB	LN,FI.FLN##	;POINT TO THE FD
	LDB	CP,FI.FCP##
	JRST	FATAL##
PUTBYT:	JUMPE	CH,PBYT0
	LDB	TB,[POINT 3,CH,20]
	CAIE	TB,CD.DAT
	JRST	VALBYT
	HRRZM	CH,CURDAT##
	ANDI	CH,077777
	IORI	CH,AS.DAT
	HRLI	CH,AS.BYT
	PUSHJ	PP,PUTAS1
	SETZ	CH,
	HRRZ	TA,CURDAT
	PUSHJ	PP,LNKSET
PUTBX:	LDB	TB,DA.RES##
	DPB	TB,[POINT 6,CH,5]

;** Note: 3-APR-80 /DAW:
; Keys that are not DISPLAY get a 9-bit byte pointer
; by the nature of the code below. Code in CBLIO will not check
; the left half of the byte pointer when the compare against
; the file parameter is done for COMP keys.
	HRRZI	TC,6
	LDB	TB,DA.USG
	CAIN	TB,%US.D6	;IS IT DISPLAY-6?
	 JRST	.+4		;YES, GO ON.
	CAIN	TB,%US.D7	;HOW ABOUT DISPLAY-7?
	AOJA	TC,.+2		;YES, MAKE IT SEVEN BITS.
	HRRZI	TC,^D9		;MUST BE EBCDIC THEN.
	DPB	TC,[POINT 6,CH,11]
	JRST	PUTAS1

VALBYT:	CAIE	TB,CD.TAG
	JRST	PBYT0
	HRLI	CH,AS.BYT	;BYTE POINTER
	PUSHJ	PP,PUTAS1
	HRLZI	CH,440600
	JRST	PUTAS1
PBYT0:	MOVE	CH,[XWD	AS.OCT,1]
	PUSHJ	PP,PUTAS1
	SETZ	CH,
	JRST	PUTAS1
IFN ANS74,<
; FOR EACH DECLARATIVE PROCEDURE, STORE THE TAG FOR PHASE E
;CALLED WITH TC= INDEX INTO USP.I BLOCK
;	TA= PARAGRAPH
;EXIT WITH TAG STORED IN USP.I BLOCK, TC INCREMENTED

PUTPTE:	JUMPE	TA,PUTPT2	;JUMP IF NONE THERE
	PUSHJ	PP,PUTPRF	;GET THE TAG
	HRRZM	CH,USP.I##(TC)	;STORE THE INFO
	AOJA	TC,CPOPJ	;INCREMENT TC AND RETURN
PUTPT2:	SETZM	USP.I(TC)	;CLEAR LOCATION
	AOJA	TC,CPOPJ	;INCREMENT TC AND RETURN
>;END IFN ANS74
;FOR EACH DECLARATIVE PROCEDURE, GENERATE THE FOLLOWING CODE:
;	%TAG:	PERF.	%PARAM-LOC
;		JRST	DECL-PROC
;		POPJ	PP,

PUTPRF:	MOVEM	TC,TBLOCK+10
	JUMPE	TA,PFZOUT
	LDB	TB,LNKCOD
	CAIE	TB,CD.PRO
	JRST	PFZOUT

IFN ANS74!DBMS,<
PUTPR2:			;ENTER HERE FOR DEBUGGING AND ERROR-STATUS PROCEDURES>
	HRLZM	TA,CURPRO##
	PUSHJ	PP,LNKSET
	HRRM	TA,CURPRO
	LDB	CH,PR.PRF##
	JUMPN	CH,PRFOUT
IFN ANS74,<
	LDB	CH,PR.SFI	;DID WE PREVIOUSLY ALLOCATE A TAG#?
	SKIPN	CH		;YES, JUST USE IT
>
	PUSHJ	PP,GETTAG##
	HRRZ	TA,CURPRO
	DPB	CH,PR.PRF
IFN ANS74,<
	DPB	CH,PR.SFI##	;SO ERROR USE CAN FIND LABEL
>
	PUSHJ	PP,PRFSUB
PRFOUT:	HRRZ	TA,CURPRO
	LDB	CH,PR.PRF
	MOVE	TC,TBLOCK+10
	POPJ	PP,

PFZOUT:	HRRZI	CH,AS.CNB
	MOVE	TC,TBLOCK+10
	POPJ	PP,
PRFSUB:	HRRZ	TA,CURPRO
	LDB	TB,PR.XTW##
	JUMPN	TB,PRFXTW
	HRRZ	TB,IMPPAR
	ANDI	TB,077777
	IORI	TB,AS.PAR##
	DPB	TB,PR.XTW
	AOS	IMPPAR
PRFXTW:	SETO	TB,
	DPB	TB,PR.EXR##	;TURN ON EXIT REQUIRED FLAG
	HRLI	CH,AS.%X##
	PUSHJ	PP,PUTAS2##
	HRRZ	TB,EAS2PC##
	ANDI	CH,077777
	HRRZ	TD,CH
	ADD	TD,TAGLOC##
	HRRM	TB,(TD)
	MOVE	CH,[XWD	201700,AS.MSC]	;MOVEI 16,%PARAM-LOC
	PUSHJ	PP,PUTAS2
	LDB	CH,PR.XTW
	PUSHJ	PP,PUTAS2
	MOVE	CH,[XWD 113740,PERF%##]	;PUSHJ 17,PERF.
	PUSHJ	PP,PUTAS2
	HLRZ	CH,CURPRO
	ANDI	CH,077777
	IORI	CH,AS.PRO##
	HRLI	CH,076000	;JRST
	PUSHJ	PP,PUTAS2
	HRLZI	CH,137740	;POPJ 17,
	PUSHJ	PP,PUTAS2
	MOVEI	TB,4
	ADDM	TB,EAS2PC
	POPJ	PP,
SUBTTL	CLEAN UP TABLES AND WRITE NAMTAB

CLENTA:	PUSHJ	PP,CLEANT##	;CLEAN UP TABLES
IFN DEBUG,<
	MOVE	TA,CORESW##	;CK SWITCHES
	TLNE	TA,%KILL##
	POPJ	PP,		;DON'T DUMP NAMTAB IF /K ON
	>
	MOVE	TE,NAMNXT##	;COMPUTE SIZE OF NAMTAB
	SUB	TE,NAMLOC
	MOVEI	TE,1(TE)
	ADD	TE,NM12SZ##	;ADD SIZE OF NAMTAB
	MOVNS	TE
	HRL	TE,NM2LOC##	;FORM THE NAMTAB I/O LIST
	MOVSM	TE,NAMIOL##
	SOS	NAMIOL
	SETZM	NAMIOL+1

	OUT	NAM,NAMIOL
	  JRST	CLENTB		;NO ERRORS

	OUTSTR	[ASCIZ "%Couldn't write NAMTAB, compilation continuing without maps or object listing
"]
	SWOFF	FMAP!FOBJEC

CLENTB:	CLOSE	NAM,
	HRRZ	TE,FREESP##	;REDUCE SIZE OF IMPURE AREA
	IORI	TE,1777
	CORE	TE,
	  JRST	CLENTE		;IGNORE ERRORS

IFN DEBUG,<EXTERN LSTMES,PUTLST,LCRLF

	MOVE	TE,[POINT 7,[ASCIZ "Reduced memory to "]]
	PUSHJ	PP,LSTMES
	HRRZ	TE,.JBREL
	ADDI	TE,1
	LSH	TE,-^D9
	PUSHJ	PP,CLENTD
	MOVEI	CH,"P"
	PUSHJ	PP,PUTLST
	PUSHJ	PP,LCRLF
>
CLENTE:	MOVE	TE,.JBREL##
	ADDI	TE,1
	HRRZM	TE,TOPLOC##
	SUB	TE,FREESP
	HRLM	TE,FREESP
	POPJ	PP,

IFN DEBUG,<

CLENTD:	IDIVI	TE,^D10
	HRLM	TD,(PP)
	SKIPE	TE
	PUSHJ	PP,CLENTD
	HLRZ	CH,(PP)
	ADDI	CH,"0"
	JRST	PUTLST
>

	END