Google
 

Trailing-Edge - PDP-10 Archives - BB-H506D-SM_1983 - cobol/source/rpwgen.mac
There are 21 other files named rpwgen.mac in the archive. Click here to see a list.
; UPD ID= 3532 on 5/7/81 at 2:54 PM by NIXON                            
TITLE	RPWGEN FOR COBOL V12B
SUBTTL	GENERATE CODE FOR REPORT-WRITER		AL BLACKINGTON/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

;EDITS
;NAME	DATE		COMMENTS

;V12A
;JEH	30-DEC-80	[1105] Set LINKAGE SECTION bit for CONTRL, SUM operands.
;CLRH	 4-APR-80	[1007] GENERATE 'AOS PAGE-COUNTER' FOR 'LINE NEXT PAGE'.

;V12*****************
;EHM	23-JUN-78	[540] FIX CONTROL HEADING PRINTED PAST LINE
;				SPECIFIED AS LAST DETAIL LINE.

;V10*****************
;NAME	DATE		COMMENTS
;	 5-APR-76	[415] FIX COUNT OF CID OF NO FINAL
;ACK	28-MAY-75	      COMP-3/EBCDIC CODE.
;********************

;**; EDIT 342 MAKE USER HAVE LINE CLAUSE IN A REPORT GROUP- MAKE LINE NEXT PAGE GO TO RIGHT LINE
;**; EDIT 335 NO CODE GENERATION IF A FATAL ERROR OCCURS.
;**; EDIT 326 MAKE WARNING MESSAGE FOR SUM LINES REFER TO CORRECT SOURCE LINE
;**; EDIT 315 FIX SO THAT CONTROL FOOTING PUTS OUT PREVIOUS VALUE AT BREAK TIME
;	ALSO FIX SO THAT SUM ERROR IS IGNORED HERE
;**; EDIT 305 FIX TO HANDLE HEADING IN A PH
;**; EDIT 247 BYPASS MOVE CODE FOR SUBSCRIPTED ITEMS
;**; EDIT 245 FIXES READ INTO AT END GENERATE SO THAT INTO WORKS
;**; EDIT 241 FIXES GROUP INDICATE TO BLANK ALL OF THE ITEM
;**; EDIT 202 FIXES CODE FOR CALL TO CH ROUTINE.
;**; EDIT 200 FIXES PAGE-COUNTING AT RIGHT TIME


TWOSEG
SALL
RELOC	400000

ENTRY INITRW	;INITIATE
ENTRY TERMRW	;TERMINATE
ENTRY GENRW	;GENERATE
ENTRY SETRPW	;SET UP CONTROL BREAK TESTS, ETC.
ENTRY RIFTAG	;"REFERENCE IF TAG" ROUTINE
ENTRY SUPPRS	;SUPPRESS PRINTING OF A REPORT GROUP

RPWGEN:	INTERNAL RPWGEN

	EXTERNAL MOVGEN,RESGEN,ADDTGN
	EXTERNAL FATAL,MSX.,MZC1.,MZC2.,MXX.
	EXTERNAL SETOPN,SETOPA,GETTAG,PUTTAG,LNKSET
	EXTERNAL PUTASY,PUTASN,PUTAS1,STASHP,STASHQ,POOL,PLITPC
	EXTERNAL M.IB,IFGNZC


;DEFINE A MACRO TO PICK UP 'RD' ADDRESS

	DEFINE GETRD,<
	HLRZ	TA,CURRPW
	ADD	TA,RPWLOC
	>
SUBTTL GENERATE 'INITIATE'

INITRW:	SKIPGE	RPWERR		; [335] FATAL ERROR IN REPORT WRITER?
	POPJ	PP,		; [335] YES- CANNOT DO CODE GENERATION.
	MOVEI	EACB,INITT##	;PICK UP 'INIT.' OP-CODE
	MOVEM	W1,OPLINE	;SAVE OPERATOR
	MOVE	EACA,EOPLOC	;START AT TOP OF EOPTAB

INIT1:	CAMN	EACA,EOPNXT	;ARE WE DONE?
	POPJ	PP,		;YES

	PUSHJ	PP,INIT2	;NO--GENERATE <INIT. RPWTAB>
	MOVE	CH,[MOVEI.,,1]
	PUSHJ	PP,PUTASY	;GENERATE <MOVEI 0,1>
	LDB	CH,RW.PC	;GENERATE
	ANDI	CH,LMASKB	;  <MOVEM 0,PAGE-COUNTER>
	IORI	CH,AS.DAT
	HRLI	CH,MOVEM.
	PUSHJ	PP,PUTASY
	JRST	INIT1

INIT2:	ADD	EACA,[XWD 2,2]	;GET TO 2ND WORD OF NEXT OPERAND
	MOVE	TA,(EACA)	;GET RPWTAB LINK
	ANDI	TA,LMASKB	;CONVERT TO
	ADD	TA,RPWLOC	;  ADDRESS

	LDB	CH,RW.RWT	;GET TAG OF RUN-TIME RPWTAB
	JUMPE	CH,CPOPJ	;IF ZERO,  FORGET IT

	PUSHJ	PP,RIFTAG	;REFERENCE TAG
	HRLI	CH,(EACB)	;GET OP-CODE
	JRST	PUTASY		;WRITE IT OUT
SUBTTL GENERATE 'TERMINATE'

TERMRW:	SKIPGE	RPWERR		; [335] FATAL ERROR IN REPORT WRITER?
	POPJ	PP,		; [EET] YES- CANNOT DO CODE GENERATION
	MOVEI	EACB,TERM##	;GET 'TERM.' OP-CODE
	MOVEM	W1,OPLINE	;SAVE OPERATOR
	MOVE	EACA,EOPLOC	;START AT TOP OF TABLE

TERM1:	CAMN	EACA,EOPNXT	;ARE WE DONE?
	POPJ	PP,		;YES

	PUSHJ	PP,INIT2	;NO--GENERATE <TERM. RPWTAB>

	LDB	CH,RW.FBT	;GENERATE
	PUSHJ	PP,RIFTAG	;REFERENCE IF TAG BITS ON
	HRLI	CH,EPJPP	;  PUSHJ TO
	TRNE	CH,-1		;  FINAL BREAK ROUTINE UNLESS
	PUSHJ	PP,PUTASY	;  THERE IS NONE

	LDB	CH,RW.PFR	;GENERATE CALL TO
	PUSHJ	PP,RIFTAG
	HRLI	CH,EPJPP	;  PAGE-FOOTING ROUTINE
	TRNE	CH,-1		;  IF THERE IS ONE
	PUSHJ	PP,PUTASY

	LDB	CH,RW.RFR	;GENERATE CALL TO
	PUSHJ	PP,RIFTAG
	HRLI	CH,EPJPP	;  REPORT-FOOTING ROUTINE
	TRNE	CH,-1		;  IF THERE IS ONE
	PUSHJ	PP,PUTASY

	LDB	CH,RW.LC	;GENERATE
	ANDI	CH,LMASKB	;  <SETOM LINE-COUNTER>
	JUMPE	CH,TERM1	;*
	IORI	CH,AS.DAT	;*
	HRLI	CH,SETOM.	;*
	PUSHJ	PP,PUTASY	;*

	JRST	TERM1
SUBTTL	GENERATE 'SUPPRESS'

SUPPRS:	SKIPGE	RPWERR##	;FATAL ERROR IN REPORT WRITER?
	 POPJ	PP,		;YES, CANNOT DO CODE GENERATION

	MOVE	CH,[SETOM.+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASY	;SETOM THE PARAM
	HRRZ	TA,EOPLOC	;GET ARGUMENT: %PARAM OFFSET
	MOVE	CH,2(TA)
	SUBI	CH,1		;GET OFFSET
	ADD	CH,RPWPRS
	PUSHJ	PP,PUTASN	;%PARAM+N
	POPJ	PP,		;RETURN
SUBTTL GENERATE 'GENERATE'

GENRW:	SKIPGE	RPWERR##	; [335] FATAL ERROR IN REPORT WRITER?
	POPJ	PP,		; [EET] YES- CANNOT DO CODE GENERATION
	MOVEM	W1,OPLINE	;SAVE OPERATOR
	MOVE	EACA,EOPLOC	;IF THERE
	CAMN	EACA,EOPNXT	;  IS NOTHING IN EOPTAB,
	POPJ	PP,		;  FORGET THE WHOLE THING

	MOVE	TA,2(EACA)	;GET OPERAND LINK
	ANDI	TA,LMASKB
	MOVSM	TA,CURRPW	;SAVE IT
	ADD	TA,RPWLOC	;CONVERT TO ADDRESS
	HRRM	TA,CURRPW	;  AND SAVE THAT

	SKIPL	0(TA)		;IS OPERAND AN 'RD'?
	JRST	GENRW2		;YES
	LDB	TA,RW.RDL	;NO--GET LINK TO 'RD'
	ANDI	TA,LMASKB
	JUMPE	TA,CPOPJ	; [335] NO CODE GENERATION IF NO RD LINK
	HRLM	TA,CURRPW
	ADD	TA,RPWLOC

GENRW2:	LDB	TA,RW.COD	;GET LINK TO 'CODE'
	SKIPE	TA		;IF NON-ZERO,
	PUSHJ	PP,LNKSET	;  CONVERT IT TO ADDRESS
	HRRZM	TA,CURMNE	;SAVE ZERO OR MNETAB ADDRESS
	GETRD
	LDB	CH,RW.BKT	;GENERATE
	PUSHJ	PP,RIFTAG
	HRLI	CH,EPJPP	;  PUSHJ TO
	PUSHJ	PP,PUTASY	;  'BREAK-TEST' ROUTINE

	MOVE	TA,CURRPW	;GET BACK TO ITEM
	SKIPL	0(TA)		;IS IT 'RD'?
	JRST	GENRW3		;YES

;GENERATE CODE FOR DETAIL LINE

	MOVEI	TE,LINE.D
	MOVEM	TE,RWSAV7
	JRST	WRIGRP		;GENERATE CODE FOR LINE AND RETURN
;GENERATE LINES FOR 'RD'

GENRW3:	MOVE	TE,[XWD 1B18,LINE.D]; SET 'I AM RD'
	MOVEM	TE,RWSAV7

	LDB	TA,RW.FGP	;GET LINK TO FIRST GROUP ITEM
	JUMPE	TA,CPOPJ	;IF ZERO LINK (ERROR IN RD), FORGET IT
GENRW4:	PUSH	PP,TA		;SAVE LINK TO 01-ITEM
	PUSHJ	PP,LNKSET	;CONVERT TO ADDRESS
	LDB	TA,DA.RPW	;GET ASSOCIATED RPWTAB LINK
	ANDI	TA,LMASKB
	ADD	TA,RPWLOC
	HRRM	TA,CURRPW	;SAVE RPWTAB ADDRESS

	LDB	TE,RW.TYP	;IF IT IS
	CAIN	TE,%RG.DE	;  A 'TYPE DETAIL' ITEM,
	PUSHJ	PP,WRIGRP	;  GENERATE SET-UP

	POP	PP,TA		;GET LINK TO 01-ITEM AGAIN
	PUSHJ	PP,LNKSET	;RE-COMPUTE ADDRESS
	LDB	TE,DA.FAL	;IF IT DOESN'T HAVE A BROTHER,
	JUMPN	TE,CPOPJ	;  WE ARE DONE
	LDB	TA,DA.BRO	;GET BROTHER LINK
	JRST	GENRW4		;LOOP TO PROCESS THAT ONE
	SUBTTL GENERATE RPWTAB

SETRPW:	SKIPGE	RPWERR		; [335] FATAL ERROR IN REPORT WRITER?
	POPJ	PP,		; [335] YES- CANNOT DO CODE GENERATION.

;ALLOCATE %PARAM LOCATIONS NEEDED FOR SUPPRESS.
	SKIPN	TB,RPWPRS##	;NEED ANY %PARAM LOCS?
	 JRST	SETRP1		;NO
	HRRZ	TD,EAS1PC##	;HERE IS STARTING ADDRESS
	IORI	TD,AS.PAR	;%PARAM LOCATION TYPE
	MOVEM	TD,RPWPRS##	;SAVE %PARAM OFFSET HERE.
	ADDM	TB,EAS1PC##	;ALLOCATE THE SPACE.
	PUSHJ	PP,PUTOC0##	;WRITE ZEROES THERE.
	SOJG	TB,.-1

SETRP1:	MOVE	TA,RPWLOC	;IF
	CAMN	TA,RPWNXT	;  NO RPWTAB ENTRIES,
	POPJ	PP,		;  QUIT

	MOVEI	TA,1(TA)	;SET TA TO FIRST ENTRY
	SKIPG	(TA)		; [335] IS THIS AN RD TABLE?
	JRST	[SETOM RPWERR	; [335] NOT AN RD TABLE SET FATAL ERROR
		POPJ	PP,]	; [335] AND RETURN
	SUB	TA,RPWLOC

SETR00:	HRLM	TA,CURRPW	;SAVE ADDRESS OF 'RD'
	ADD	TA,RPWLOC

	PUSHJ	PP,GETTAG	;GET TAG FOR
	DPB	CH,RW.RWT	;  RUN-TIME RPWTAB

	PUSHJ	PP,SETCOD	;SET UP 'CODE'
	PUSHJ	PP,ROUTS	;GENERATE CODE FOR RH,RF,PH,PF

	GETRD
	LDB	CH,RW.RWT	;DEFINE TAG FOR RPWTAB
	PUSHJ	PP,PUTTAG

	MOVE	CH,[XWD AS.XWD,6]
	PUSHJ	PP,PUTASN

	LDB	CH,RW.PAG	;PAGE-LIMIT
	PUSHJ	PP,PUTASN
	LDB	CH,RW.LC	;ADDRESS OF LINE-COUNTER
	ANDI	CH,LMASKB
	IORI	CH,AS.DAT
	PUSHJ	PP,PUTASY

	LDB	CH,RW.FDE	;FIRST DETAIL LINE
	PUSHJ	PP,PUTASN
	LDB	CH,RW.LDE	;LAST DETAIL LINE
	PUSHJ	PP,PUTASY

	LDB	CH,RW.CFL	;LAST CONTROL FOOTING LINE
	PUSHJ	PP,PUTASN
	LDB	CH,RW.RHR	;ADDRESS OF RH ROUTINE
	PUSHJ	PP,PUTASY

	LDB	CH,RW.PHR	;ADDRESS OF PH ROUTINE
	PUSHJ	PP,PUTASN
	LDB	CH,RW.PFR	;ADDRESS OF PF ROUTINE
	PUSHJ	PP,PUTASY
	LDB	CH,RW.FIL	;FILE-TABLE ADDRESS
	ANDI	CH,LMASKS
	IORI	CH,AS.FIL
	PUSHJ	PP,PUTASN
	LDB	CH,RW.PHL	; [305] GET PAGE HEADING
	PUSHJ	PP,PUTASY

;STOP FOR A SECOND TO CALL "REFTAG" FOR TAGS WE HAVE REFERENCED

	LDB	CH,RW.RHR	;RH ROUTINE
	PUSHJ	PP,RIFTAG	;REFERENCE IF A TAG
	LDB	CH,RW.PFR	;PF ROUTINE
	PUSHJ	PP,RIFTAG
	LDB	CH,RW.PHR	;PH ROUTINE
	PUSHJ	PP,RIFTAG

	HRRZ	TA,CURMNE	;GET ADDRESS OF 'CODE' MNETAB ENTRY
	JUMPN	TA,SETR0B	;IF NON-ZERO, THERE IS A CODE

	MOVEI	CH,0		;THERE IS NO CODE
	PUSHJ	PP,PUTASN	;PUT OUT
	PUSHJ	PP,PUTASY	;  <XWD 0,0>
	JRST	SETR01		;WE ARE DONE WITH OBJECT RPWTAB

;ROUTINE TO CALL "REFTAG" IF RH(CH) IS A TAG
;PRESERVES TA, USES TE

RIFTAG:	TRC	CH,AS.TAG##	;SEE IF ADDRESS IS A TAG
	TRCE	CH,AS.TAG	;SKIP IF TRUE
	POPJ	PP,		;NOT, RETURN
	PUSH	PP,TA		;SAVE TA
	HRRZ	TA,CH		;GET TAG NUMBER
	PUSHJ	PP,REFTAG##	;AND REFERENCE IT
	POP	PP,TA
	POPJ	PP,


SETR0B:	HRRZ	CH,1(TA)	;GET CODE SIZE
	PUSHJ	PP,PUTASN	;LH OF WORD 6 = CODE SIZE
	MOVS	CH,2(TA)	;RH OF WORD 6 = LITERAL ADDRESS
	HRRI	CH,AS.MSC	;*
	PUSHJ	PP,PUTASY	;*
;	JRST	SETR01		;GO GENERATE BREAK COMPARISONS
SUBTTL GENERATE BREAK COMPARISONS

SETR01:	PUSHJ	PP,GETTAG	;GET TAG FOR BREAK-TEST START
	GETRD
	DPB	CH,RW.BKT	;SAVE IT
	PUSHJ	PP,PUTTAG	;GIVE IT TO ASSEMBLER

	GETRD
	LDB	CH,RW.RWT	;GENERATE <MOVEI 16,RPWTAB>
	PUSHJ	PP,RIFTAG
	HRLI	CH,MOVEI.+AC16
	PUSHJ	PP,PUTASY

	MOVE	CH,[XWD EPJPP,LIN.RH]	;GENERATE <PUSHJ 17,LIN.RH>
	PUSHJ	PP,PUTASY

	LDB	TE,RW.NCI	;SAVE
	MOVEM	TE,RWSAV1	;  NUMBER OF CONTROL IDENTIFIERS
	JUMPE	TE,SETR09	;IF NONE, NOT MUCH CODE NEEDED

	LDB	TB,RW.CID	;GET RELATIVE ADDRESS OF
	ANDI	TB,LMASKB	;  CONTROL IDENTIFIER PARAMETERS
	HRRZM	TB,RWSAV2	;SAVE
	ADD	TB,RPWLOC	;GET ABS. ADDRESS

	PUSHJ	PP,GETTAG	;GET TAG FOR FIRST RESET
	HRLM	CH,2(TB)
	HRLI	CH,JRST.	;GENERATE
	HRRZ	TA,CH
	PUSHJ	PP,REFTAG	;REFERENCE TAG
	PUSHJ	PP,PUTASY	;  <JRST %TAG>

	PUSHJ	PP,GETTAG	;GET TAG FOR
	MOVEM	CH,RWMBRK	;  BREAK PRINTING ROUTINE
	SETZM	RWBRKC		;CLEAR 'PARAM' ADDRESS
	MOVE	CH,RWSAV1	;GET CONTROL COUNT

	MOVE	TE,RWSAV2	; IS THERE A FINAL?
	ADD	TE,RPWLOC
	SKIPN	(TE)		; . .
	SOS	CH		; [415]  YES BREAK EVEN IF NO FINAL & ONLY 1 CONTROL
	SOSGE	CH		; [415] DEDUCT ONE FROM COUNTER
	SETZ	CH,
	HRLI	CH,MOVEI.	;GENERATE
	PUSHJ	PP,PUTASY	;  <MOVEI 0,CID-COUNT>
	MOVE	CH,[XWD MOVEM.,AS.MSC]; GENERATE <MOVEM 0,%PARAM>
	PUSHJ	PP,PUTASN
	MOVE	CH,EAS1PC
	IORI	CH,AS.PAR
	MOVEM	CH,RWBRKC	;SAVE BREAK COUNT ADDRESS
	PUSHJ	PP,PUTASY

	MOVE	CH,[XWD AS.OCT,1]
	PUSHJ	PP,PUTAS1
	MOVEI	CH,0
	PUSHJ	PP,PUTAS1
	AOS	EAS1PC
	JRST	SETR03
;PUT OUT BREAK TESTS

SETR03:	PUSHJ	PP,BLDPAR	;BUILD 'A' AND 'B' FOR CONDITIONAL TEST
	JRST	SETR07		;TROUBLE--FORGET THIS ONE
SETR04:	HRLZ	W2,RWMBRK
	MOVE	W1,OPLINE
	TLZ	W1,777770
	TLO	W1,EQTEST
	PUSHJ	PP,IFGNZC

;THAT BREAK IS SET -- TRY NEXT

SETR07:	SOSG	RWSAV1		;ANY MORE?
	JRST	SETR08		;NO

	MOVEI	TB,EXTRAS	;INCREMENT ADDRESS TO CONTROL DATA
	ADDB	TB,RWSAV2
	ADD	TB,RPWLOC
	SKIPE	-EXTRAS(TB)	;IF THAT PREVIOUS ONE WAS 'FINAL',
	SKIPN	RWBRKC		;  OR THERE IS NO BREAK COUNT,
	JRST	SETR03		;  THEN NO 'SOS' NEEDED

	MOVE	CH,[XWD SOS.,AS.MSC]; GENERATE <SOS %PARAM>
	PUSHJ	PP,PUTASN
	HRRZ	CH,RWBRKC
	PUSHJ	PP,PUTASY
	JRST	SETR03		;GO BACK FOR MORE

;ALL BREAK TESTED -- PUT OUT 'POPJ'

SETR08:	PUSHJ	PP,GENPPJ	;GENERATE <POPJ 17,>
	JRST	SETR10
;THERE ARE NO CONTROL FIELDS

SETR09:	GETRD
	LDB	CH,RW.GIR	;GET TAG
	SKIPN	CH		;  FOR
	PUSHJ	PP,GETTAG	;  'GROUP INDICATE'
	DPB	CH,RW.GIR	;  ROUTINE
	PUSHJ	PP,RIFTAG	;REFERENCE TAG

	HRLI	CH,JRST.	;GENERATE <JRST GI-CODE>
	PUSHJ	PP,PUTASY

	PUSHJ	PP,GENPPJ	;GENERATE <POPJ 17,>
	JRST	SETR70

GENPPJ:	MOVSI	CH,POPJ.+AC17	;GENERATE <POPJ 17,>
	JRST	PUTASY
SUBTTL GENERATE BREAK PRINTING ROUTINES

SETR10:	GETRD
	SKIPN	RWBRKC		;ANY BREAK COUNT?
	JRST	SETR15		;NO
	PUSHJ	PP,GETTAG	;YES--GET 'FINAL BREAK' TAG
	DPB	CH,RW.FBT	;SAVE FOR 'TERMINATE'
	PUSHJ	PP,PUTTAG	;DEFINE IT HERE

	MOVE	CH,[XWD HRLOI.,AS.CNB]; GENERATE
	PUSHJ	PP,PUTASN	;  <HRLOI 0,377777>
	MOVEI	CH,377777	;*
	PUSHJ	PP,PUTASY	;*

	MOVE	CH,[XWD MOVEM.,AS.MSC]; GENERATE
	PUSHJ	PP,PUTASN	;  <MOVEM 0,%PARAM>
	MOVE	CH,RWBRKC	;*
	PUSHJ	PP,PUTASY	;*

	MOVE	CH,RWMBRK	;GET TAG OF FIRST BREAK PRINTER
	JRST	SETR16

SETR15:	MOVE	CH,RWMBRK	;TAG OF FIRST BREAK PRINTER IS
	DPB	CH,RW.FBT	;  TAG OF FINAL BREAK
SETR16:	PUSHJ	PP,PUTTAG

	LDB	TE,RW.NCI	;GET NUMBER OF CONTROL IDENTIFIERS
	MOVEM	TE,RWSAV1	;SAVE IT
	IMULI	TE,EXTRAS

	LDB	TD,RW.CID	;GET ADDRESS OF FIRST CONTROL IDENTIFIER
	ANDI	TD,LMASKB
	ADDI	TD,-EXTRAS(TE)	;GET ADDRESS OF LAST CONTROL IDENTIFIER
	HRRZM	TD,RWSAV2	;SAVE IT

;TD IS REL ADDRESS OF CONTROL IDENTIFIER IN RPWTAB
SETR20:	GETRD
	ADD	TD,RPWLOC
	HRRZ	TC,1(TD)	;GET ADDRESS OF CF GROUP
	ANDI	TC,LMASKB
	JUMPE	TC,SETR22
	MOVEM	TC,RWSV12##	;SAVE REL LOCATION OF THIS CF GROUP
	ADD	TC,RPWLOC
	HRRM	TC,CURRPW
	MOVEI	TE,LINE.C
	MOVEM	TE,RWSAV7

	PUSHJ	PP,WRIGRP	;GENERATE CODE TO WRITE GROUP
	PUSHJ	PP,SUPPTG	;GEN %TAG: IF NEEDED FOR SUPPRESS
;ALL LINES HAVE BEEN GENERATED FOR CURRENT CF GROUP

SETR22:	MOVE	TE,RWSAV2
	ADD	TE,RPWLOC
	SKIPE	(TE)		;WAS THAT 'FINAL'?
	SKIPN	RWBRKC		;NO--ANY CONTROL COUNT?
	JRST	SETR23		;NO

	MOVE	CH,[XWD SOSGE.,AS.MSC]; YES--
	PUSHJ	PP,PUTASN	;  GENERATE <SOSGE %PARAM.>
	HRRZ	CH,RWBRKC
	PUSHJ	PP,PUTASY

	MOVE	TD,RWSAV2	;ANY TAG THERE ALREADY?
	ADD	TD,RPWLOC
	HLRZ	CH,2(TD)
	JUMPN	CH,SETR26	;IF SO, USE IT
	PUSHJ	PP,GETTAG	;GENERATE <JRST %RESET>
	MOVE	TD,RWSAV2
	ADD	TD,RPWLOC
	HRLM	CH,2(TD)
SETR26:	PUSHJ	PP,RIFTAG
	HRLI	CH,JRST.
	PUSHJ	PP,PUTASY

SETR23:	SOSG	RWSAV1		;ANY LEFT?
	JRST	SETR25		;NO
	MOVNI	TD,EXTRAS	;YES--DECREMENT
	ADDB	TD,RWSAV2	;  ADDRESS
	JRST	SETR20		;  AND LOOP


;ALL GROUPS HAVE BEEN PUT OUT

SETR25:	PUSHJ	PP,GENPPJ	;GENERATE  <POPJ 17,>
SUBTTL GENERATE 'RESET' CODE

SETR50:	GETRD
	LDB	TD,RW.CID	;GET ADDRESS OF
	ANDI	TD,LMASKB	;CONTROL IDENTIFIER PARAMETERS
	HRRZM	TD,RWSAV2	;SAVE IT
	LDB	TE,RW.NCI	;GET NUMBER OF CONTROL IDENTIFIERS
	MOVEM	TE,RWSAV1	;SAVE THAT

;TD IS REL ADDR OF NEXT CONTROL IDENTIFIER ENTRY IN RPWTAB
SETR51:	ADD	TD,RPWLOC	;MAKE ABS ADDRESS
	HLRZ	CH,2(TD)	;PUT OUT
	SKIPE	CH		;  ANY %TAG FOR
	PUSHJ	PP,PUTTAG	;  ROUTINE

	PUSHJ	PP,BLDPAR	;SET UP 'A' AND 'B' FOR SAVING CONTROL
	JRST	SETR52		;TROUBLE--FORGET IT
	PUSHJ	PP,MXX.		;  SAVE THE VALUE OF THE CONTROL

SETR52:	MOVE	TE,RWSAV2	;PICK UP
	ADD	TE,RPWLOC
	HLRZ	TA,1(TE)	;  'CH' GROUP LINK
	ANDI	TA,LMASKB
	JUMPE	TA,SETR53
	ADD	TA,RPWLOC
	HRRM	TA,CURRPW	;GENERATE
	MOVEI	TE,LINE.D	;[540] [202] GET CH ADR
	MOVEM	TE,RWSAV7	;[202] SAVE FOR PUSHJ
	PUSHJ	PP,WRIGRP	;  'CH' LINE
	PUSHJ	PP,SUPPTG	;GEN %TAG: IF NEEDED FOR SUPPRESS
;CLEAR ALL SUMMATION COUNTERS

SETR53:	MOVE	TE,RWSAV2
	ADD	TE,RPWLOC
	HRRZ	TA,1(TE)	;GET 'CF' LINK

SETR54:	ANDI	TA,LMASKB
	JUMPE	TA,SETR60
	ADD	TA,RPWLOC
	HRRM	TA,CURRPW

	LDB	TE,RW.SCD	;PICK UP 'SOURCE-SUM' CODE
	CAIE	TE,%RG.SM	;IS IT A 'SUM'?
	JRST	SETR56		;NO

	LDB	TE,RW.RSF	;IS THE ITEM
	JUMPN	TE,SETR56	;  RESET ON 'FINAL'?
	LDB	TE,RW.RES	;NO--IS THERE A 'RESET ON' CLAUSE?
	SKIPN	TE		;IF NOT,
	PUSHJ	PP,SETZER	;  GENERATE CODE TO ZERO THE FIELD

SETR56:	PUSHJ	PP,NXTDAT	;GET NEXT DATA ITEM
	  JRST	SETR60		;NO MORE--QUIT
	LDB	TE,DA.LVL	;IF THIS IS
	CAIN	TE,LVL.01	;  01-LEVEL,
	JRST	SETR60		;  QUIT,
	LDB	TA,DA.RPW	;  ELSE GET RPWTAB LINK AND
	JRST	SETR54		;  LOOP
;ALL SUMMATION COUNTERS ARE CLEARED FOR THIS GROUP.
;FIND ALL 'RESET ON' CLAUSES WHICH REFERENCE THIS CONTROL.

SETR60:	MOVE	TE,RWSAV2
	ADD	TE,RPWLOC
	HLRZ	TE,(TE)		;SAVE
	MOVEM	TE,RWSAV3	;  LINK TO CONTROL IDENTIFIER
	PUSH	PP,RWSAV1	;SAVE COUNT
	PUSH	PP,RWSAV2	;SAVE POINTER

SETR61:	SOSG	RWSAV1		;ANY MORE CONTROLS?
	JRST	SETR66		;NO--DONE WITH THIS CONTROL GROUP

	MOVEI	TD,EXTRAS	;YES--STEP DOWN TO
	ADDB	TD,RWSAV2	;  NEXT CONTROL

	ADD	TD,RPWLOC
	HRRZ	TA,1(TD)	;IF NO CONTROL-FOOTING GROUP,
	JUMPE	TA,SETR61	;  TRY NEXT ONE

SETR62:	ANDI	TA,LMASKB	;GET ADDRESS OF
	ADD	TA,RPWLOC	;  RPWTAB ENTRY
	HRRM	TA,CURRPW	;SAVE IT

	LDB	TE,RW.SCD	;IF THIS ITEM
	CAIE	TE,%RG.SM	;  IS NOT SUM,
	JRST	SETR65		;  GO TO NEXT

	SKIPE	RWSAV3		;IF WE ARE NOT RESETTING FINAL,
	JRST	SETR63		;  SEE IF THERE IS 'RESET ON ID'
	LDB	TE,RW.RSF	;IS ITEM TO BE RESET ON FINAL?
	JUMPE	TE,SETR65
	JRST	SETR64		;YES

SETR63:	LDB	TE,RW.RES	;GET RESET CONTROL IDENTIFIER
	CAMN	TE,RWSAV3	;IF IT IS THIS GROUP
SETR64:	PUSHJ	PP,SETZER	;  GENERATE 'MOVE ZERO'

SETR65:	PUSHJ	PP,NXTDAT	;GO TO NEXT DATA ITEM
	JRST	SETR61		;NO MORE--GO TO NEXT CONTROL
	LDB	TE,DA.LVL	;IF THIS IS
	CAIN	TE,LVL.01	;  01-LEVEL
	JRST	SETR61		;  GO TO NEXT CONTROL
	LDB	TA,DA.RPW	;GET ASSOCIATED RPWTAB LINK
	JRST	SETR62		;LOOP

SETR66:	POP	PP,RWSAV2	;RESTORE TO
	POP	PP,RWSAV1	;  WHERE WE WERE

SETR67:	SOSG	RWSAV1		;ANY MORE CONTROLS?
	JRST	SETR70		;NO
	MOVEI	TD,EXTRAS	;YES--INCREMENT TO NEXT CONTROL
	ADDB	TD,RWSAV2
	JRST	SETR51
SUBTTL PUT OUT 'GROUP INDICATE' CODE

SETR70:	GETRD
	LDB	CH,RW.GIR	;IS THERE A TAG FOR
	SKIPN	CH		;  'GROUP INDICATE' ROUTINE?
	PUSHJ	PP,GETTAG	;NO--GET ONE
	DPB	CH,RW.GIR	;SAVE IT
	PUSHJ	PP,PUTTAG	;DEFINE IT

	LDB	TA,RW.FGP	;GET LINK TO FIRST GROUP
	JUMPE	TA,SETR80	;IF NULL--FORGET IT

SETR71:	PUSHJ	PP,LNKSET	;GET DATAB ADDRESS
SETR72:	LDB	TA,DA.RPW	;GET RPWTAB LINK
	ANDI	TA,LMASKB
	JUMPE	TA,SETR80
	ADD	TA,RPWLOC
	HRRM	TA,CURRPW	;SAVE LINK TO GROUP
	LDB	TE,RW.TYP	;IS THE GROUP
	CAIN	TE,%RG.DE	;  TYPE DETAIL?
	JRST	SETR73		;YES

	LDB	TA,RW.DAT	;DOES THIS
	PUSHJ	PP,LNKSET	;  01 DATA-NAME
	LDB	TE,DA.FAL	;  HAVE
	JUMPN	TE,SETR80	;  A BROTHER?

	LDB	TA,DA.BRO	;YES--GET LINK
	JUMPN	TA,SETR71	;IF NON-ZERO--LOOP
	JRST	SETR80		;IF ZERO--QUIT
;GROUP IS TYPE DETAIL

SETR73:	LDB	TA,RW.DAT	;GET DATAB LINK
SETR74:	PUSHJ	PP,LNKSET	;CONVERT TO ADDRESS
SETR75:	HRRZM	TA,CURDAT	;SAVE IT

	LDB	TA,DA.RPW	;GET ASSOCIATED
	ANDI	TA,LMASKB
	ADD	TA,RPWLOC	;  RPWTAB ENTRY
	HRRM	TA,CURRPW

	LDB	TE,RW.GPI	;IF NOT 'GROUP INDICATE',
	JUMPE	TE,SETR76	;  NO CODE
	LDB	TE,RW.SLK	;IF NO SOURCE LINK,
	JUMPE	TE,SETR76	;  NO CODE

;See code at WRG32B
	MOVE	EACA,EOPLOC	;SET UP AND CALL 'MOVE'
	SKIPE	.RWSRC(TA)	; DID WE STORE A SOURCE ITEM FOR EOPTAB?
	 JRST	STR75A		;YES, COPY IT
	MOVEI	EACC,2		;NO--NEED 2 WORDS FOR THE ITEM THEN
	SETZM	1(EACA)
	SETZM	3(EACA)
	MOVEM	TE,2(EACA)	;*
	LDB	TE,RW.DAT	;*
	MOVEM	TE,4(EACA)	;*
	ADD	EACA,[XWD 4,4]	;*
	MOVEM	EACA,EOPNXT
	PUSHJ	PP,MOVGEN	;*
	JRST	SETR76

;WE HAVE STORED THE SOURCE ITEM AS AN EOPTAB-TYPE THING.
; COPY IT TO EOPTAB, ACCOUNT FOR 2 OR MORE WORDS (IT COULD BE SUBSCRIPTED!)
STR75A:	MOVE	TE,.RWSRC+1(TA)	;GET 2ND WORD
	LDB	TE,[POINT 6,TE,17] ;SUBSCRIPT COUNT IN OPERAND
	LSH	TE,1		;= # WORDS FOR SUBSCRIPTS AND ADDITIVES
	MOVEI	EACC,2(TE)	;EACC:= TOTAL # WORDS IN THE OPERAND
	HRLI	TD,.RWSRC(TA)	;COPY FROM HERE
	HRRI	TD,1(EACA)	; TO HERE
	MOVEI	TC,(EACA)	;START
	ADD	TC,EACC		; + # WORDS
	BLT	TD,(TC)		;COPY THE OPERAND.

;SETUP THE "TO" ITEM:
	MOVEI	TD,(EACA)	;SETUP TD= START OF 2ND OPERAND
	ADD	TD,EACC
	LDB	TA,RW.DAT	;GET DATAB LINK OF WHERE TO MOVE ITEM
	MOVEM	TA,2(TD)
	PUSHJ	PP,LNKSET
	LDB	TE,DA.LNC	;GET LN&CP OF DATAB ITEM
	MOVEM	TE,1(TD)	;STORE IN EOPTAB

;CALL MOVGEN
	MOVEI	TD,2(EACC)	;TOTAL # WORDS USED UP IN EOPTAB
	HRL	TD,TD		;MAKE N,,N
	ADD	EACA,TD
	MOVEM	EACA,EOPNXT
	PUSHJ	PP,MOVGEN	;GENERATE THE MOVE
;	JRST	SETR76

SETR76:	PUSHJ	PP,NXTDAT	;GET NEXT DATA ITEM
	JRST	SETR80		;NO MORE--QUIT

	LDB	TE,DA.LVL	;IF NOT
	CAIE	TE,LVL.01	;  01-LEVEL,
	JRST	SETR75		;  LOOP
	JRST	SETR72		;START AGAIN WITH NEW GROUP

;DONE WITH 'GROUP INDICATE' CODE

SETR80:	PUSHJ	PP,GENPPJ	;GENERATE <POPJ 17,>

	GETRD
	LDB	TA,RW.BRO	;DOES IT HAVE A BROTHER?
	ANDI	TA,LMASKB
	JUMPN	TA,SETR00	;IF TRUE, LOOP BACK FOR IT
	POPJ	PP,		;NOT TRUE--QUIT
SUBTTL SET A SUM-COUNTER TO ZERO

SETZER:	LDB	TA,RW.SLK	;GET LINK TO ITEM
	JUMPE	TA,CPOPJ	;IGNORE ZEROES
	MOVE	TC,EOPLOC	;SET UP
	MOVEI	TC,1(TC)	;  EOPTAB TO
	MOVEM	TC,CUREOP	;  LOOK AS IF
	MOVEM	TC,OPERND	;  ITEM CAME FROM GENFIL
	SETZM	0(TC)
	HRRZM	TA,1(TC)
	MOVEI	LN,EBASEB	;NOW SET UP 'B' PARAMETERS
	PUSHJ	PP,SETOPN
	TSWF	FERROR		;IF TROUBLE,
	POPJ	PP,		;  QUIT
	MOVEI	TD,MZC1.	;PRETEND IT IS 1-WORD ACCUMULATOR
	HRRZ	TE,EMODEB	;IF IT IS ACTUALLY
	CAIN	TE,D2MODE	;  2-WORDS,
	MOVEI	TD,MZC2.	;  USE THAT ROUTINE
	JRST	(TD)		;CALL ONE OF THE ZERO ROUTINES & RETURN
SUBTTL PUT OUT RH, RF, PH & PF ROUTINES

ROUTS:	GETRD
	PUSHJ	PP,GETTAG	;GET TAG FOR
	DPB	CH,RW.GIR	;  'GROUP INDICATE' ROUTINE
	LDB	TA,RW.FGP	;GET LINK TO FIRST GROUP
	JUMPE	TA,ROUT2A	;IF NONE--FORGET THE WHOLE THING

ROUTS1:	PUSHJ	PP,LNKSET	;CONVERT DATAB LINK TO ADDRESS
	LDB	TA,DA.RPW	;GET LINK TO ASSOCIATED RPWTAB ENTRY
	ANDI	TA,LMASKB	;CLEAR CODE BITS
	JUMPE	TA,ROUT2A
	PUSH	PP,TA		;SAVE IT
	ADD	TA,RPWLOC
	HRRM	TA,CURRPW	;SAVE IT

	LDB	TB,RW.TYP	;GET TYPE
	CAIN	TB,%RG.RH	;IS IT AN 'RH'?
	JRST	ROUTRH
	CAIN	TB,%RG.RF	;NO--'RF'?
	JRST	ROUTRF
	CAIN	TB,%RG.PH	;NO--'PH'?
	JRST	ROUTPH
	CAIN	TB,%RG.PF	;NO--'PF'?
	JRST	ROUTPF

ROUTS2:	POP	PP,TA		;GET ADDRESS OF 01-ITEM AGAIN
	ADD	TA,RPWLOC	;GET ABS. ADDR
	LDB	TA,RW.DAT	;GET DATAB LINK
	PUSHJ	PP,LNKSET
	LDB	TC,DA.FAL	;DOES THIS
	JUMPN	TC,ROUT2A	;  ITEM
	LDB	TA,DA.POP	;  HAVE A
	JUMPN	TA,ROUTS1	;  BROTHER?
ROUT2A:	GETRD
	LDB	TE,RW.PHR	;IF THERE IS ALREADY A PH ROUTINE,
	JUMPN	TE,CPOPJ	;  WE ARE DONE
	PUSHJ	PP,GETTAG	;THERE ISN'T--GET TAG FOR DUMMY ROUTINE
	DPB	CH,RW.PHR
	PUSHJ	PP,PUTTAG	;PASS IT TO ASSEMBLER
	PUSHJ	PP,ROUT2B	;[200] AOS PAGE-COUNT

ROUT21:	LDB	CH,RW.GIR	;[200] GENERATE
	HRLI	CH,JRST.	;[200]  <JRST GI-ROUTINE>
	PUSHJ	PP,RIFTAG	;REFERENCE TAG
	JRST	PUTASY		;[200]

ROUT2B:	LDB	CH,RW.PC	;[200] GENERATE
	ANDI	CH,LMASKB	;[200]  <AOS PAGE-COUNTER>
	IORI	CH,AS.DAT	;[200]
	HRLI	CH,AOS.		;[200]
	JRST	PUTASY		;[200] ASSEMBLE AND RETURN
ROUTRH:	SKIPA	TB,RW.RHR
ROUTRF:	MOVE	TB,RW.RFR
	JRST	ROUTS3

ROUTPF:	MOVE	TB,RW.PFR

ROUTS3:	PUSHJ	PP,ROUTSX
	PUSHJ	PP,GENPPJ	;GENERATE  <POPJ 17,>
	JRST	ROUTS2

ROUTPH:	PUSHJ	PP,ROUTAG	;[200] TAG ROUTINE FOR HEADER
	GETRD			;[200] GET RD LOCATION
	PUSHJ	PP,ROUT2B	;[200] AOS PAGE-COUNT
	MOVE	TB,RW.PHR	;[200] PAGE HEADER POINTER 
	GETRD			;[200] GET RD LOCATION
	PUSHJ	PP,ROUTSY	;[200] FINISH HEADER CODE FOR PAGE
	GETRD			;[200] GET RD LOCATION
	PUSHJ	PP,ROUT21	;[200] GENERATE JRST GI-ROUTINE
	JRST	ROUTS2

ROUTSX:	GETRD
	LDB	TC,TB		;IF THERE IS A ROUTINE OF THIS TYPE,
	JUMPN	TC,ROUTSE	;  IT IS AN ERROR
	PUSHJ	PP,GETTAG	;THERE ISN'T--GET A TAG FOR THIS ONE
	DPB	CH,TB		;SAVE IT
	PUSHJ	PP,PUTTAG
ROUTSY:	MOVEI	TE,LINE.H	;[200] SET UP
	MOVEM	TE,RWSAV7	;  FOR 'LINE.X' CALL
	JRST	WRIGRP

ROUTSE:	MOVEI	DW,E.354
	JRST	RWERA

ROUTAG:	GETRD			;[200] GET RD LOCATION
	MOVE 	TB,RW.PHR	;[200] PAGE HEADER
	LDB	TC,TB		;[200] IF THERE IS A ROUTINE OF THIS TYPE,
	JUMPN	TC,ROUTSE	;[200]  IT IS AN ERROR
	PUSHJ	PP,GETTAG	;[200] THERE ISN'T--GET A TAG FOR THIS ONE
	DPB	CH,TB		;[200] SAVE IT
	JRST	PUTTAG		;[200] ASSEMBLE TAG AND RETURN 
SUBTTL BUILD 'A' AND 'B' PARAMETERS FOR A CONTROL IDENTIFIER

;'A' IS CONTROL ID ITSELF, 'B' IS THAT %PARAM INTO WHICH
;CONTROL ID IS SAVED AT RUN-TIME.

BLDPAR:	SWOFF	FEOFF1		;TURN OFF MOST FLAGS
	MOVE	TE,RWSAV2
	ADD	TE,RPWLOC
	HLRZ	TA,(TE)		;GET LINK TO DATAB
	JUMPE	TA,CPOPJ	;IF ZERO--FORGET IT

	MOVE	TB,EOPLOC	;CREATE OPERAND
	MOVEM	TA,2(TB)
	PUSHJ	PP,LNKSET	;GET DATAB ADDRESS
	MOVEM	TA,CURDAT	;SAVE
	LDB	TE,DA.LNC	;GET LN&CP
	MOVEM	TE,1(TB)	
	MOVSI 	TD,(LKSFLG)	; [1105] SET LINK SECTION BIT
	LDB	TC,DA.LKS	; [1105] FIND DATAB ENTRY BIT SETTING
	SKIPE	TC		; [1105] SKIP IF NOT LINKAGE ITEM
	IORM	TD,1(TB)	; [1105] SET L.S. IN OPERAND

	MOVEI	TC,1(TB)
	MOVEM	TC,CUREOP
	MOVSM	TC,OPERND
	MOVEI	TD,3(TB)	; [315] GET LOCATION OF 'B' PARAMETER IN EOPTAB
	HRRM	TD,OPERND	; [315] PUT IN RIGHT  HALF OF OPERND
	PUSHJ	PP,SETOPA	; [315]  SET UP 'A' OPERND
	MOVE	TE,RWSAV2	; GET PREVIOUS DATA VALUE ADR
	ADD	TE,RPWLOC
	HRRZ	TA,(TE)		; . .
	JUMPE	TA,CPOPJ	; [315]  NO PREVIOUS VALUE NO GO
	MOVE	TB,EOPLOC	; [315] GET BACK EOPLOC
	MOVEM	TA,4(TB)	; [315] STORE OPERAND
	PUSHJ	PP,LNKSET	; [315] GET CORE ADR OF OPERAND
	LDB	TE,DA.LNC	; [315]  GET SOURCE LINE AND CHAR
	MOVEM	TE,3(TB)	; [315]  STORE
	MOVEI	TC,3(TB)	; [315]  SET UP FOR B PARM
	PUSHJ	PP,SETOPB##	; [315] SET UP SECOND OPERAND
	JRST	CPOPJ1
SUBTTL GENERATE CODE TO WRITE OUT ALL LINES FOR A GROUP

WRIGRP:	PUSHJ	PP,FINDLG	;FIND LARGEST PRINT RECORD
	  POPJ	PP,		;TROUBLE--QUIT

	SETZM	RWSV10##	; [342] RESET LINE CLAUSE INDICATOR
	SETOM	RPWLIN		;NO 'LINE INTEGER' YET

	SETOM	RWSAV9		; [305] RESET INTRA-GROUP CNT
	SETZM	RWSAV4		;CLEAR COLUMN NUMBER
	MOVE	TA,CURRPW	;GET ADDRESS OF THIS ITEM
	LDB	CH,RW.SUP##	;COULD PRESENTATION OF THIS GROUP
				; BE SUPPRESSED?
	JUMPE	CH,WRG00C	;NO
	SUBI	CH,1		;YES, MAKE A %PARAM OFFSET
	ADD	CH,RPWPRS##
	PUSH	PP,CH		;SAVE IT
	MOVE	CH,[SETZM.+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASY	;GEN CODE TO CLEAR THE %PARAM
	POP	PP,CH
	PUSHJ	PP,PUTASN
WRG00C:	LDB	CH,RW.USE	;IS THERE A 'USE' PROCEDURE?
	JUMPE	CH,WRG00B	;NO
	ANDI	CH,LMASKB
	HRRZ	TA,CH		;GET TAG NUMBER
	PUSHJ	PP,REFTAG##	;REFERENCE IT
	IORI	CH,AS.TAG
	HRLI	CH,EPJPP
	PUSHJ	PP,PUTASY	;  GENERATE <PUSHJ PP,%TAG-FOR-USE>
	MOVE	TA,CURRPW	;REGET ADDRESS OF THE ITEM
	LDB	TB,RW.SUP	;COULD PRESENTATION OF THIS GROUP BE SUPPRESSED?
	JUMPE	TB,WRG00D	;JUMP IF NO
	LDB	TC,RW.TYP	;DIFFERENT CODE FOR DIFFERENT GROUP TYPES
	CAIN	TC,%RG.PH	;PAGE HEADER?
	 JRST	WRG00E		;YES
	CAIE	TC,%RG.RH	;REPORT HEADER?
	CAIN	TC,%RG.RF	; OR REPORT FOOTING?
	 JRST	WRG00F		;YES
	CAIN	TC,%RG.PF	;OR PAGE FOOTING?
	 JRST	WRG00F		;YES
	CAIE	TC,%RG.CF
	CAIN	TC,%RG.CH	;CONTROL?
	 JRST	WRG00G		;YES
	JRST	WRG00D		;* ELSE NO SUPPRESS CODE NOW*

;GEN SUPPRESS CODE FOR PAGE HEADER
WRG00E:	PUSHJ	PP,SUPSKE	;GEN "SKIPE SUPPRESS-FLAG"
	GETRD			;SETUP TA AGAIN
	PUSHJ	PP,ROUT21	;GEN "JRST GI"
	JRST	WRG00D		;GO ON

;GEN SUPPRESS CODE FOR RH, RF, OR PF
WRG00F:	PUSHJ	PP,SUPSKE	;GEN "SKIPE SUPPRESS-FLAG"
	PUSHJ	PP,GENPPJ	;GEN "POPJ PP,"
	JRST	WRG00D

;GEN SUPPRESS CODE FOR CF, CH
WRG00G:	PUSHJ	PP,SUPSKE	;GEN "SKIPE SUPPRESS-FLAG"
	PUSHJ	PP,SUPJTG	;GEN "JRST %TAG", SAVE AWAY %TAG.
;	JRST	WRG00D

WRG00D:	MOVE	TA,CURRPW	;REGET ADDRESS OF THE ITEM
WRG00B:	LDB	TE,RW.DAT	;SAVE DATAB LINK TO
	HRLZM	TE,RWSAV8	;  01-LEVEL ITEM

	LDB	TE,RW.NLC	;GET 'NEXT GROUP' CODE
	MOVSM	TE,RWSAV3
	LDB	TE,RW.NXT	;AND 'NEXT GROUP' INTEGER
	HRRM	TE,RWSAV3

	LDB	TE,RW.LCD	;IF THERE IS
	MOVEM	TE,RWSV10	; [342] STORE LINE CODE
	JUMPN	TE,WRG00A	;  NO LINE CODE,
	SKIPL	RWSAV7		;  AND THIS IS NOT REPORT-NAME GENERATION,
	PUSHJ	PP,WRIG47	; [305] IF PH GEN LIN.H AND FOR ALL GROUP BLANK PRINT LINE
	MOVE	TA,CURRPW

WRG00A:	LDB	TA,RW.DAT	;GET DATAB LINK FOR THIS ITEM
WRIG00:	PUSHJ	PP,LNKSET	;CONVERT TO ABSOLUTE

WRIG01:	MOVEM	TA,CURDAT	;SAVE ADDRESS OF DATAB ENTRY
	LDB	TA,DA.RPW
	ANDI	TA,LMASKB
	ADD	TA,RPWLOC
	HRRM	TA,CURRPW

	LDB	TB,RW.LCD	;GET LINE CODE
	SKIPG	RWSV10		; [342] DO WE HAVE A LINE CODE FOR THIS GROUP?
	MOVEM	TB,RWSV10	; [342] NO-STORE CURRENT ONE
	JUMPE	TB,WRIG06	;IF NONE--NO WRITING NOW
	CAIE	TB,%RG.LN	;IS IT 'LINE IS INTEGER'?
	JRST	WRIG1B		;NO
	LDB	TE,RW.LIN	;YES--IS THAT
	CAMN	TE,RPWLIN	;  INTEGER SAME AS LAST ONE?
	JRST	WRIG06		;YES--PRETEND THERE IS NO 'LINE' CLAUSE
	MOVEM	TE,RPWLIN	;SAVE THIS INTEGER

WRIG1B:	SKIPL	RWSAV7		;IF GENERATING 'RD'
	SKIPN	RWSAV4		;  OR LINE IS EMPTY
	JRST	WRIG02		;  DON'T WRITE LINE

	PUSHJ	PP,WRIG40	;YES--WRITE OUT CURRENT LINE
	MOVEI	CH,0		;WRITE OUT 'LINES TO SKIP'
	PUSHJ	PP,PUTASY
WRIG02:	SETZM	RWSAV4		;RESET COLUMN NUMBER
	MOVE	TA,CURRPW	;*
	LDB	CH,RW.LIN	;*
	LDB	TB,RW.LCD	;*
	PUSHJ	PP,WRIG50	;PUT OUT 'LINE.X' CODE

	PUSHJ	PP,WRIG45	;SET PRINT LINE TO SPACES

;NEW LINE IS NOW SET UP

WRIG06:	MOVE	TA,CURDAT	;IF THIS
	LDB	TB,DA.SON	;  ITEM IS ELEMENTARY,
	JUMPE	TB,WRIG07	;  PROCESS IT
	MOVE	TA,TB		;IT ISN'T, GO TO SON
	JRST	WRIG00

;WE HAVE AN ELEMENTARY ITEM

WRIG07:	PUSHJ	PP,WRIG20	;GENERATE MOVE TO THIS ITEM
	SKIPGE	RWSAV7		;IF WE ARE GENERATING 'RD'
	JRST	WRIG09		;  DON'T WRITE

	MOVE	TA,CURRPW	;GET BACK TO ITEM
	MOVE	TE,[XWD ESAVRW,EBASEB] ;GET PRINTER PARAMETERS
	BLT	TE,EBASBX
	LDB	TB,RW.COL	;ANY COLUMN NUMBER?
	SOJL	TB,WRIG09
;MOVE ITEM TO PRINT LINE

	HRRZ	TE,CURMNE	;GET ADDRESS OF 'CODE' ENTRY
	JUMPE	TE,WRIG08	;IF ZERO, NO CODE
	HRRZ	TE,1(TE)	;ADD SIZE OF CODE TO
	ADD	TB,TE		;  'B' INCREMENT
WRIG08:	MOVEM	TB,EINCRB

	MOVE	TA,CURDAT
	LDB	TE,DA.SGN	;IF
	SKIPE	TE		;  ITEM IS SIGNED,
	SWONS	FASIGN		;  SET FLAG,
	SWOFF	FASIGN		;  ELSE CLEAR FLAG

	LDB	TE,DA.EXS
	MOVEM	TE,ESIZEA
	ADD	TE,EINCRB	;WILL ITEM FIT IN
	CAMLE	TE,ESIZEB	;  PRINT-LINE?
	JRST	WRIG10		;NO--ERROR
	MOVEM	TE,RWSAV4	;YES--THAT IS LAST COLUMN SO FAR

	MOVE	TE,ESIZEA	;SIZE OF 'B' IS
	MOVEM	TE,ESIZEB	;  SIZE OF 'A'
	SETZM	EDPLA		;NO
	SETZM	EDPLB		;  DECIMAL PLACES
	LDB	TE,DA.RES	;SET RESIDUE
	HRLM	TE,ERESA
	LDB	TE,DA.USG	;SET
	SUBI	TE,1		;  MODE
	MOVEM	TE,EMODEA
	SETZM	EINCRA

	SUB	TA,DATLOC
	ANDI	TA,LMASKB
	IORI	TA,AS.DAT
	HRRM	TA,EBASEA

	MOVE	TD,EINCRB
	MOVE	TE,EMODEB	;GET CORRECT OUTPUT MODE
	IDIV	TD,BYTE.W(TE)
	MOVEM	TD,EINCRB
	IMUL	TC,BYTE.S(TE)
	MOVNS	TC
	ADDI	TC,^D36
	HRLM	TC,ERESB

	MOVE	TE,[XWD EBASEA,ESAVEB]; SAVE 'A' PARAMETERS
	BLT	TE,ESAVBX
	SWOFF	FANUM!FBNUM!FASUB!FBSUB; TURN OFF A FEW FLAGS
	PUSHJ	PP,MXX.		;GENERATE MOVE

	MOVE	TA,CURRPW	;IF THIS IS
	LDB	TE,RW.GPI	;  NOT GROUP-INDICATE
	JUMPE	TE,WRIG09	;  WE ARE DONE

	MOVE	TE,[XWD ESAVEB,EBASEB]; RESTORE 'A' TO BE 'B'
	BLT	TE,EBASBX
	MOVE	TE,EMODEB	;CALL APPROPRIATE
	MOVE	TB,ESIZEB	;[241] GET SIZE OF GI ITEM
	MOVEM	TB,ESIZEZ	;[241] STORE FOR BLANKING ROUTINE
	PUSHJ	PP,@MSX.(TE)	;  SPACE-FILL ROUTINE
;ITEM HAS BEEN MOVED--GO TO NEXT ITEM

WRIG09:	PUSHJ	PP,NXTDAT	;GET NEXT DATA ITEM
	JRST	WRIG9A		;NO MORE--DONE

	LDB	TE,DA.LVL	;IS IT
	CAIE	TE,LVL.01	;  01-LEVEL?
	JRST	WRIG01		;NO--LOOP

WRIG9A:	SKIPGE	RWSAV7		;IF WE ARE GENERATING 'RD'
	POPJ	PP,		;  NO WRITING
	SKIPN	RWSAV4		;ANYTHING IN LINE?
	JRST	WRIG9B		;NO--JUST ADVANCE

	PUSHJ	PP,WRIG40	;YES--WRITE THAT FINAL LINE
	HLRZ	TB,RWSAV3	;GET 'NEXT GROUP' CODE
	CAIN	TB,%RG.PI	;IS IT 'PLUS INTEGER'?
	JRST	WRIG9C		;YES
	MOVEI	CH,0		;NO--SET 'ADVANCE 0 LINES'
	PUSHJ	PP,PUTASY

WRIG9B:	SKIPN	CH,RWSAV3
	POPJ	PP,
	HLRZ	TB,CH
	CAIE	TB,%RG.NP
	JRST	WRIG50
	JRST	WRIG9E

WRIG9C:	HRRZ	CH,RWSAV3	;SET 'ADVANCE N LINES'
	PUSHJ	PP,PUTASY
	HRLI	CH,MOVEI.	;GENERATE
	PUSHJ	PP,PUTASY	;  <MOVEI. 0,<LINES TO ADVANCE>>

	GETRD
	LDB	CH,RW.LC	;GENERATE
	ANDI	CH,TM.DAT	;  <ADDM 0,LINE-COUNTER>
	IORI	CH,AS.DAT	;*
	HRLI	CH,ADDM.	;*
	JRST	PUTASY
;'NEXT GROUP IS NEXT PAGE'

;IF PH,PF,RH OR RF SIMPLY SKIP TO TOP-OF-FORM

WRIG9E:	MOVE	TA,CURRPW
	LDB	TE,RW.TYP
	CAIE	TE,%RG.PH
	CAIN	TE,%RG.PF
	JRST	WRIG9G
	CAIE	TE,%RG.RH
	CAIN	TE,%RG.RF
	JRST	WRIG9G

;CALL PAGE-FOOTING ROUTINE

	GETRD
	LDB	CH,RW.PFR
	JUMPE	CH,WRIG9F
	HRLI	CH,EPJPP
	PUSHJ	PP,RIFTAG	;REFERENCE TAG
	PUSHJ	PP,PUTASY

;CALL PAGE-HEADING ROUTINE

WRIG9F:	LDB	CH,RW.PHR
	JUMPE	CH,WRIG9G
	HRLI	CH,EPJPP
	PUSHJ	PP,RIFTAG	;REFERENCE TAG
	JRST	PUTASY

WRIG9G:	GETRD
	LDB	CH,RW.LC	;GENERATE
	ANDI	CH,TM.DAT	;  <AOS LINE-COUNTER>
	IORI	CH,AS.DAT	;  TO INSURE THAT
	HRLI	CH,AOS.		;  LINE-COUNTER IS
	PUSHJ	PP,PUTASY	;  ALREADY '1'

	MOVE	CH,[XWD MOVEI.+AC15,1]
	PUSHJ	PP,PUTASY

	LDB	CH,RW.RWT
	HRLI	CH,MOVEI.+AC16
	PUSHJ	PP,RIFTAG	;REFERENCE TAG
	PUSHJ	PP,PUTASY
	MOVEI	CH,LINE.H
	JRST	WRIG56

;ERROR--ITEM WILL NOT FIT IN PRINT-LINE

WRIG10:	MOVE	TA,CURDAT
	MOVEI	DW,E.360
	PUSHJ	PP,RWERA1
	JRST	WRIG09
;GENERATE CODE TO MOVE SOMETHING INTO AN ITEM

WRIG20:	MOVE	TA,CURRPW
	LDB	TB,RW.SCD	;IS IT
	CAIN	TB,%RG.SM	;  SUM?
	JRST	WRIG37		;YES
	CAIE	TB,%RG.SR	;NO--IS IT SOURCE?
	POPJ	PP,		;NO

;GENERATE CODE FOR 'SOURCE'

WRIG30:	LDB	TE,RW.GPI	;IS IT 'GROUP INDICATE'?

	JUMPN	TE,CPOPJ	;YES--FORGET IT

;IT IS EITHER A 'SOURCE' OR A 'SUM' IN A CONTROL-FOOTING GROUP
WRIG31:	MOVE	EACA,EOPLOC	;PTR TO EOPTAB
	SKIPE	.RWSRC(TA)	; DID WE STORE A SOURCE ITEM FOR EOPTAB?
	 JRST	WRG31A		;YES, COPY IT
	MOVEI	EACC,2		;NO--NEED 2 WORDS FOR THE ITEM THEN
	LDB	TE,RW.SLK	;GET LINK
	MOVEM	TE,2(EACA)
	MOVE	TA,CURRPW
	LDB	TE,RW.DAT
	MOVEM	TE,4(EACA)

	LDB	TA,RW.DAT	;GET DATAB LINK
	PUSHJ	PP,LNKSET
	LDB	TE,DA.LNC	;GET LN&CP OF DATAB ITEM
	MOVEM	TE,1(EACA)
	MOVEM	TE,3(EACA)

	HRRZ	TA,2(EACA)	;GET PTR TO SOURCE
	PUSHJ	PP,LNKSET
	LDB	TB,DA.LKS##	;IN LINKAGE SECT?
	JUMPE	TB,WRIG32	;NO
	MOVSI	TB,400		;SET GENFIL-TYPE LKS FLAG
	IORM	TB,1(EACA)
	JRST	WRIG32

;WE HAVE STORED THE SOURCE ITEM AS AN EOPTAB-TYPE THING.
; COPY IT TO EOPTAB, ACCOUNT FOR 2 OR MORE WORDS (IT COULD BE SUBSCRIPTED!)
WRG31A:	MOVE	TE,.RWSRC+1(TA)	;GET 2ND WORD
	LDB	TE,[POINT 6,TE,17] ;SUBSCRIPT COUNT IN OPERAND
	LSH	TE,1		;= # WORDS FOR SUBSCRIPTS AND ADDITIVES
	MOVEI	EACC,2(TE)	;EACC:= TOTAL # WORDS IN THE OPERAND
	HRLI	TD,.RWSRC(TA)	;COPY FROM HERE
	HRRI	TD,1(EACA)	; TO HERE
	MOVEI	TC,(EACA)	;START
	ADD	TC,EACC		; + # WORDS
	BLT	TD,(TC)		;COPY THE OPERAND.

;SETUP THE "TO" ITEM:
	MOVEI	TD,(EACA)	;SETUP TD= START OF 2ND OPERAND
	ADD	TD,EACC
	LDB	TA,RW.DAT	;GET DATAB LINK OF WHERE TO MOVE ITEM
	MOVEM	TA,2(TD)
	PUSHJ	PP,LNKSET
	LDB	TE,DA.LNC	;GET LN&CP OF DATAB ITEM
	MOVEM	TE,1(TD)	;STORE IN EOPTAB

;	JRST	WRIG32

WRIG32:			;6-MAY-80: DELETE TWO INSTRUCTIONS THAT WOULD DEFEAT US;
			; DON'T KNOW WHY THEY WERE HERE ANYWAY!
;	LDB	TB,DA.SUB##	; [247] SEE IF SUBSCRIPTED
;	JUMPN	TB,CPOPJ	; [247] IT IS SKIP IT

WRG32A:	MOVE	TA,CURRPW	; [315]  GET RPWTAB FOR SOURCE ITEM
	LDB	TC,RW.TYP	; [315] GET TYPE OF GROUP
	LDB	TD,RW.FNC##	; [315]  SEE IF FINAL 
	SKIPN	TD		; [315]  IF FINAL USE NORMAL SOURCE
	CAIE	TC,%RG.CF	; [315]  CONTROL FOOTING ?
	JRST	WRG32B		; [315]  NO USE NORMAL SOURCE ITEM
	LDB	TE,RW.SLK	; [315]  GET DATAB ADR OF SOURCE
	HRRZ	TD,RWSAV2	; [315] GET CONTROL ID
	ADD	TD,RPWLOC
	ADDI	TD,3		; [315] SET 3 HIGH
	MOVE	TC,RWSAV1	; [315] GET NO. OF CID
WRG32L:	SOJL	TC,WRG32B	; [315]  LOOP THRU CID - NO MORE- SOURCE IS NOT CID
	SUBI	TD,3		; [315] GET NXT CID
	HLRZ	TB,(TD)		; [315]  GET CONTROL ID DATAB ADR
	CAME	TE,TB		; [315]  IF SOURCE IS CONTROL ID USE PREVIOUS
	JRST	WRG32L		; [315]  NOT THIS CID-- LOOK FOR MORE CIDS
	HRRZ	TE,(TD)		; [315] GET DATAB ADR FOR PREVIOUS VALUE
	MOVEM	TE,2(EACA)	; [315]  USE IT AS OPERAND
	MOVSI	TD,400		; [315] GET LINKAGE SECTION BIT
	ANDCAM	TD,1(EACA)	; [315]  SHUT IT OFF- PREVIOUS VALUE ALWAYS IN W-S
	CAIN	EACC,2		;PREVIOUS SENDING ITEM ONLY TAKE UP 2 WORDS?
	 JRST	WRG32B		;YES, NOTHING ELSE TO DO.

; WE ARE REPLACING A SENDING ITEM THAT TOOK MORE THAN 2 WORDS IN EOPTAB.
; (IT MUST HAVE BEEN A SUBSCRIPTED 'SOURCE' ITEM)
	MOVEI	TD,1(EACA)	;GET START OF "TO" ITEM
	ADD	TD,EACC
	MOVE	TC,(TD)		;MOVE THEM UP IN EOPTAB
	MOVEM	TC,3(EACA)
	MOVE	TC,1(TD)
	MOVEM	TC,4(EACA)
	MOVEI	EACC,2		;SET WORD COUNT OF SENDING ITEM TO 2

WRG32B:				 ;[315]
	MOVEI	TD,2(EACC)	;TOTAL # WORDS USED UP IN EOPTAB
	HRL	TD,TD		;MAKE N,,N
	ADD	EACA,TD
	MOVEM	EACA,EOPNXT

;SAVE CURDAT OVER CALL TO MOVGEN
	HRRZ	TD,CURDAT	;ABS ADDRESS
	HRRZ	TE,DATLOC	;ABS START
	SUB	TD,TE
	PUSH	PP,TD		;SAVE THIS VALUE
	PUSHJ	PP,MOVGEN	;GENERATE A MOVE
	POP	PP,TD		;RESTORE RELATIVE CURDAT ITEM
	ADD	TD,DATLOC	; MAKE ABS PTR
	MOVEM	TD,CURDAT	;RESTORE OLD CURDAT

	MOVE	TA,CURRPW	;IS THIS ITEM
	LDB	TE,RW.TYP	;  IN A
	CAIE	TE,%RG.CF	;  CONTROL-FOOTING GROUP?
	CAIN	TE,%RG.DE	;NO--DETAIL?
	JRST	WRIG34		;YES--MAYBE SUMMING NEEDED
	POPJ	PP,		;NO

WRIG34:	LDB	TA,RW.SLK	;GET SOURCE OR SUM LINK
	HRRM	TA,RWSAV8	;SAVE IT
	PUSHJ	PP,LNKSET	;CONVERT TO ADDRESS

	LDB	TE,DA.RBS	;IS IT REFERENCED BY SUM?
	JUMPE	TE,CPOPJ	;NO, JUST RETURN
	SKIPN	RWSV11		;SUPPRESSING IN EFFECT?
	 PJRST	SUMIT		;NO, JUST DO SUMMING AND RETURN
	PUSHJ	PP,SUPPTG	;PUT OUT %TAG: SUPPRESSION JUMPS TO HERE.
	PUSHJ	PP,SUMIT	;GO DO SUMMING
	MOVE	TA,RWSV12	;REGET ADDRESS OF THE ITEM
	ADD	TA,RPWLOC	; . .
	LDB	TB,RW.SUP	;GET SUPPRESS OFFSET
	PUSHJ	PP,SUPSKE	;GEN "SKIPE SUPPRESS-FLAG"
	PUSHJ	PP,SUPJTG	;JUMP TO YET ANOTHER TAG.
	POPJ	PP,		;RETURN


;ITEM TO BE PRESENTED IS A 'SUM'

WRIG37:	LDB	TE,RW.TYP	;IS IT IN
	CAIN	TE,%RG.CF	;  A CONTROL-FOOTING GROUP?
	JRST	WRIG30		;YES--OK
	POPJ	PP,		; [315] ERROR- IGNORE- COBOLC ALREADY FLAGGED IT
;WRITE OUT THE CURRENT LINE

WRIG40:	HLRZ	CH,CURFIL	;GENERATE <WADV. FILTAB>
	ANDI	CH,LMASKS
	IORI	CH,AS.FIL
	HRLI	CH,WADV.
	PUSHJ	PP,PUTASY

	MOVE	CH,[XWD AS.XWD,1];PUT OUT FIRST HALF OF THE 'WADV.' PARAMETER
	PUSHJ	PP,PUTASN
	MOVS	CH,RWSAV4
	LSH	CH,6
	TLO	CH,20
	HRRI	CH,AS.CNB
	JRST	PUTASN

;SET PRINT-LINE TO SPACES

WRIG45:	SKIPGE	RWSAV7		;IF WE ARE GENERATING 'RD',
	POPJ	PP,		;  NO NEED FOR CODE
	MOVE	TE,[XWD ESAVRW,EBASEB];SET 'B' TO BE PRINT-LINE
	BLT	TE,EBASBX

	HRRZ	TA,CURMNE	;GET ADDRESS OF 'CODE' ENTRY
	JUMPE	TA,WRIG46	;IF ZERO, NO CODE

	MOVE	TD,[XWD ^D36,AS.MSC]	;SET UP 'A'
	MOVEM	TD,EBASEA	;  TO BE
	MOVE	TD,2(TA)	;  'CODE' LITERAL
	HRRZM	TD,EINCRA
	HRRZ	TD,1(TA)
	MOVEM	TD,ESIZEA
	SETZM	EDPLA
	MOVEI	TD,D6MODE
	MOVEM	TD,EMODEA
	SWOFF	FASUB!FANUM!FASIGN
	JRST	MXX.		;MOVE 'CODE' TO PRINT LINE

WRIG46:	MOVE	TE,ESIZEB	;SET SIZE
	MOVEM	TE,ESIZEZ	;  TO SIZE OF PRINT-LINE
	MOVE	TE,EMODEB	;CALL APPROPRIATE
	JRST	@MSX.(TE)	;  SPACING ROUTINE

WRIG47:	LDB	TB,RW.TYP	; [305] GET GROUP TYPE
	CAIN	TB,%RG.PH	; [305] PH?
	PUSHJ	PP,WRIG48	; [305] YES- DO PH CODING
	JRST	WRIG45		; [305] NO-DO REGLUAR LINE-SPACING

WRIG48:	AOS	RWSV10		; [342] FOR PAGE HEADING
	SETZM	RWSAV4		; [305] CLEAR COLUMN COUNT
	LDB	TA,RW.DAT	; [305] GET LINK TO DATAB LINE
	PUSHJ	PP,LNKSET	; [305] CONVERT TO REAL ADDR
	MOVEM	TA,CURDAT	; [305] SAVE IT
	GETRD			; [305] GET BACK RD LCOACTION
	LDB	CH,RW.PHL	; [305] GET HEADING-LINE
	MOVEI	TB,%RG.LN	; [305] INTEGER LINE MODE
	PJRST	WRIG50		; [305] GENERATE LINE.H CODE
;GENERATE 'LINE.X' CODE

WRIG50:	SKIPGE	RWSAV7		;IF WE ARE GENERATING 'RD',
	POPJ	PP,		;  NO NEED FOR CODE
	AOS	RWSAV9		; [342] BUMP INTRA-GROUP CNTR
	CAIE	TB,%RG.NP	; [342] IF NEXT-PAGE
	JRST	WRIG58		; [342] NOT NEXT PAGE-GO ON
	PUSHJ	PP,WRIG60	; [342] NEXT PAGE SPACING
	  POPJ	PP,		; [342] RETURN IF NO FURTHER SPACING NEEDED
WRIG58:	HRLI	CH,MOVEI.+AC15	; [342] SET UP DESIRED LINE NUMBER
	PUSHJ	PP,PUTASY	; [342]
	CAIE	TB,%RG.PI	;IS IT 'PLUS INTEGER'?
	JRST	WRIG55		;NO
	LDB	TB,RW.TYP	; [305] GET GROUP TYPE
	SKIPG	RWSAV9		; [305] BEEN HERE BEFORE?
	CAIE	TB,%RG.PH	; [305] PH?
	JRST	WRIG54		; [305] BEEN HERE BEFORE OR NOT PH-GO ON
	GETRD			; [305] GET RD PNTR
	HRLI	CH,MOVEI.+AC15	; [305] MOVEI AC15,LINE-INCREMENT
	PUSHJ	PP,PUTASY	; [305] 
	LDB	CH,RW.PHL	; [305] GET HEADING LINE
	HRLI	CH,AC15+ADDI.##	; [305] ADD IT TO PLUS INTEGER
	PUSHJ	PP,PUTASY	; [305] GENERATE ADDI 15,HEADING
	JRST	WRIG55		; [305] CONTINUE

WRIG54:	GETRD			; [305] GET RD ADDREESS
	LDB	CH,RW.LC	;GET ADDRESS OF LINE-COUNTER
	ANDI	CH,LMASKB	;CONVERT TO
	IORI	CH,AS.DAT	;  DATAB ASYFIL LINK
	HRLI	CH,AC15+AD##	;GENERATE
	PUSHJ	PP,PUTASY	;  <ADD 15,LINE-COUNTER>

WRIG55:	GETRD
	LDB	CH,RW.RWT	;GET ADDRESS OF RUN-TIME RPWTAB
	HRLI	CH,MOVEI.+AC16	;GENERATE
	PUSHJ	PP,RIFTAG	;REFERENCE TAG
	PUSHJ	PP,PUTASY	;  <MOVEI 16,RPWTAB>

	MOVE	CH,RWSAV7	;GET 'LINE.X'

WRIG56:	TSWT	FAS3		;ARE WE IN NON-RESIDENT SEGMENT?
	JRST	WRIG57		;NO
	MOVE	TE,CH		;YES--
	ANDI	TE,LMASKS	;  SET
	ADD	TE,EXTLOC	;  FLAG
	MOVSI	TD,1B18		;  IN
	IORM	TD,1(TE)	;  EXTAB

WRIG57:	HRLI	CH,EPJPP	;GENERATE <PUSHJ 17,LINE.X>
	PUSHJ	PP,RIFTAG	;REFERENCE IF TAG
	JRST	PUTASY		;  AND RETURN
;	LINE-NEXT PAGE CODE
;	FIRST FOURCE TOP OF PAGE CODE
;	THEN SPACE TO APPROPRIATE LINE DEPENDING ON TYPE OF LINE
;	IF NO PAGE-LIMIT CLAUSE OF IF LINE TO SPACE IS 1 OR LESS
;	 ONLY FORCE TO TOP OF PAGE
;	FOR SPACING ALL OTHERS
;	IF REPORT HEADING OR REPORT FOOTING OR PAGE HEADING SPACE TO HEADING LINE
;	IF DETAIL OR CONTROL HEADING OR CONTROL FOOTING SPACE TO FIRST DETAIL
;	IF PAGE FOOTING SPACE TO FOOTING

WRIG60:	HRLZI	CH,MOVEI.+AC15		; [342] SET TO LINE 0 TO FORCE TOP OF PAGE
	PUSHJ	PP,PUTASY		; [342]
	PUSHJ	PP,WRIG55		; [342] FINISH UP LINE.X CODE
	GETRD				; [342] PICK UP RD TABLE
	LDB	TB,RW.PAG		; [342] ANY PAGE CLAUSE
	MOVE	TA,CURRPW		; [342] POINT TO REPORT CLAUSE
	JUMPE	TB,WRIG69		; [342] EXIT NO PAGE CLAUSE
	LDB	TB,RW.TYP		; [342] GET TYPE OF LINE
	GETRD				; [342] PICK UP RD TABLE
	CAIE	TB,%RG.RH		; [342] IF REPORT HEADING
	CAIN	TB,%RG.PH		; [342] OR PAGE HEADING
	JRST	WRIG66			; [342] USE HEADING
	CAIN	TB,%RG.RF		; [342] IF REPORT FOOTING INCREMENT
	JRST	WRIG64			; [342] PAGE-COUNTER THEN USE HEADING
	CAIE	TB,%RG.DE		; [342] IF FIRST DETAIL
	CAIN	TB,%RG.CH		; [342] OR CONTROL HEADING
	JRST	WRIG65			; [342] USE FIRST DETAIL
	CAIN	TB,%RG.CF		; [342] LIKE-WISE FOR CONTROL FOOTING
	JRST	WRIG65			; [342]
	CAIE	TB,%RG.PF		; [342] FOR PAGE FOOTING USE FOTTING
	JRST	WRIG69			; [342] NONE OF THE ABOVE EXIT
	LDB	CH,RW.CFL		; [342] CONTROL FOOTING
	JRST	WRIG68			; [342] FINISH UP

WRIG65:	LDB	CH,RW.FDE		; [342] FIRST DETAIL
	JRST	WRIG68			; [342]

WRIG64:	PUSHJ	PP,ROUT2B		;[1007] GENERATE 'AOS PAGE-COUNTER'
WRIG66:	LDB	CH,RW.PHL		; [342] PAGE HEADING
WRIG68:	CAIG	CH,1			; [342] IF DESIRED LINE NOT > 1 EXIT NOW
	JRST	WRIG69			; [342] IT ISN'T
	MOVEI	TB,%RG.LN		; [342] SET LINE CODE FOR INTEGER
	AOS	(PP)			; [342] SET UP FOR SKIP RETURN
WRIG69:	MOVE	TA,CURRPW		; [342] POINT TO REPORT ITEM
	POPJ	PP,			; [342] RETURN
SUBTTL GENERATE SUMS WHICH REFERENCE CURRENT ITEM

;ENTER WITH LINK TO SUM IDENTIFIER IN RH OF RWSAV8,
;	AND DATAB LINK TO REPORT-GROUP IN LH OF RWSAV8

SUMIT:	MOVE	TA,CURRPW	;GET TO
	LDB	TA,RW.DAT	;  CF OR DE
	PUSHJ	PP,LNKSET	;  DATAB ENTRY
	LDB	TB,DA.LNC	;SAVE LN&CP FOR LATER USE
	MOVE	EACA,EOPLOC	;*
	MOVEM	TB,1(EACA)	;*
	MOVEM	EACA,EOPNXT	;SET 'EOPTAB IS EMPTY'

	GETRD
	LDB	TE,RW.NCI	;ANY CONTROL IDENTIFIERS?
	JUMPE	TE,CPOPJ	;IF NOT--QUIT
	PUSH	PP,CURRPW	;SAVE
	PUSH	PP,RWSAV1	;  SOME
	PUSH	PP,RWSAV2	;  STUFF

	MOVEM	TE,RWSAV1	;SAVE NUMBER OF CONTROL-ID'S
	LDB	TD,RW.CID	;COMPUTE
	ANDI	TD,LMASKB	;  ADDRESS OF
	HRRZM	TD,RWSAV2	;  AND SAVE IT

SUMIT1:	ADD	TD,RPWLOC
	HRRZ	TA,1(TD)	;GET LINK TO CF GROUP
SUMIT3:	ANDI	TA,LMASKB
	JUMPE	TA,SUMIT7	;IF NONE, NO CF

	ADD	TA,RPWLOC	;  ASSOCIATED RPWTAB ENTRY
	HRRM	TA,CURRPW	;SAVE IT

	LDB	TE,RW.SCD	;DOES THAT ITEM
	CAIE	TE,%RG.SM	;  HAVE A SUM CLAUSE?
	JRST	SUMIT6		;NO
	LDB	TE,RW.NSI	;YES--GET NUMBER OF SUM IDENTIFIERS
	JUMPE	TE,SUMIT6	;IF NONE--FORGET IT
	MOVEM	TE,RWSAV6	;SAVE IT
	HRRZ	TA,CURRPW	;COMPUTE BYTE-POINTER TO
	ADD	TA,[POINT 18,SZ.RPG]	;  SUM-IDENTIFIER LINKS
	MOVEM	TA,RWSAV5	;SAVE IT
SUMIT4:	ILDB	TE,RWSAV5	;GET LINK TO SUM-IDENTIFIER
	JUMPE	TE,SUMIT5	;IF ZERO, FORGET IT
	HRRZ	TD,RWSAV8	;IF NOT THE
	CAIE	TE,(TD)		;  ONE WE ARE AFTER,
	JRST	SUMIT5		;  GO TO NEXT IDENTIFIER

	MOVE	TA,CURRPW	;IF CLAUSE IS
	LDB	TE,RW.UPN	;  'SUM UPON',
	JUMPE	TE,SMIT4A	;  CODE IS GENERATED ONLY IF
	HLRZ	TD,RWSAV8	;  WE ARE WORKING
	CAIE	TE,(TD)		;  ON CORRECT DETAIL GROUP
	JRST	SUMIT5		;NO CODE GENERATED

SMIT4A:	MOVE	EACA,EOPLOC	;IS EOPTAB
	CAME	EACA,EOPNXT	;  EMPTY?
	JRST	SMIT4B		;NO--THERE MUST BE SUM RESULT OPS ALREADY

	HRRZ	TA,RWSAV8	;YES--SET UP
	MOVEM	TA,2(EACA)	;  EOPTAB FOR 'ADDTGN'
	PUSHJ	PP,LNKSET	;IF ITEM IS
	LDB	TE,DA.CLA	;  NOT
	CAIE	TE,%CL.NU	;  NUMERIC
	JRST	SMIT10		;  OR
	LDB	TE,DA.EDT	;  IT IS
	JUMPN	TE,SMIT10	;  EDITED, ERROR

	MOVSI	TD,(LKSFLG)	;[1105] SET LINKAGE SECTION BIT
	LDB	TC,DA.LKS	;[1105] FIND DATAB ENTRY BIT SETTING
	SKIPE	TC		;[1105] SKIP IF NOT LINKAGE ITEM
	IORM	TD,1(EACA)	;[1105] SET L.S. IN OPERAND
	ADD	EACA,[XWD 2,2]	;GENERATE
	MOVEM	EACA,EOPNXT	;  THE
	PUSHJ	PP,ADDTGN	;  FIRST HALF OF 'ADD TO'

	MOVE	EACA,EOPLOC
	MOVE	TA,CURRPW	; [326] GET CURRENT EPRT ITEM
	LDB	TA,RW.SLK	; [326] GET SOURCE (I.E. SUM ) ITEM POINTER
	MOVEM	TA,2(EACA)	; [326] PUT SUM ITEM IN EOPTAB
	PUSHJ	PP,LNKSET	; [326] CONVERT SUM POINTER TO REAL ADDRESS
	LDB	TB,DA.LNC	; [326] GET SOURCE LINE AND CHAR POSITION OF SUM ITEM
	MOVEM	TB,1(EACA)	; [326]	STORE THIS INTO EOPTAB
	JRST	SMIT4D		; [326] FINISH SETTING EOPTAB

SMIT4B:	MOVE	EACA,EOPNXT
	MOVE	TE,-1(EACA)	;GET LN,CP FROM PREVIOUS OPERAND
	MOVEM	TE,1(EACA)	;PUT IT IN THIS OPERAND

	MOVE	TA,CURRPW
	LDB	TA,RW.SLK
	MOVEM	TA,2(EACA)

SMIT4D:	ADD	EACA,[XWD 2,2]	; [326] BUMP UP EOPTAB POINTER
	MOVEM	EACA,EOPNXT
;STEP TO NEXT IDENTIFIER FOR THIS SUM

SUMIT5:	SOSLE	RWSAV6		;IF MORE SUM ID'S,
	JRST	SUMIT4		;  LOOP

SUMIT6:	PUSHJ	PP,NXTDAT	;GO TO NEXT DATAB ITEM
	JRST	SUMIT7			;NO MORE--WE ARE DONE WITH GROUP
	LDB	TE,DA.LVL	;IF THE NEXT IS
	CAIN	TE,LVL.01	;  01-LEVEL,
	JRST	SUMIT7		;  WE ARE DONE WITH GROUP

	LDB	TA,DA.RPW	;NOT DONE--GET ASSOCIATED RPWTAB ENTRY
	JRST	SUMIT3		;  AND LOOP

;STEP TO NEXT CONTROL PARAMETER

SUMIT7:	SOSG	RWSAV1		;ANY MORE CONTROL-ID PARAMETERS?
	JRST	SUMIT8		;NO--QUIT
	MOVEI	TD,EXTRAS	;YES--BUMP DOWN TO
	ADDB	TD,RWSAV2	;  NEXT AND
	JRST	SUMIT1		;  DO THAT CF GROUP

SUMIT8:	MOVE	EACA,EOPNXT	;IS THERE
	CAME	EACA,EOPLOC	;  ANYTHING IN EOPTAB?
	PUSHJ	PP,RESGEN	;YES--GENERATE 'RESULT'

	POP	PP,RWSAV2	;RESTORE
	POP	PP,RWSAV1	;  SOME
	POP	PP,CURRPW	;  LOCATIONS
	POPJ	PP,		;GO AWAY

;ERROR--ITEM TO BE SUMMED IS NOT NUMERIC

SMIT10:	MOVEI	DW,E.362
	PUSHJ	PP,RWERA
	JRST	SUMIT5
SUBTTL FIND LARGEST PRINTING RECORD FOR REPORT

;SET UP 'ESAVRW' WITH PARAMETERS SPECIFYING LARGEST RECORD OF
;	PRINTING FILE

FINDLG:	GETRD
	LDB	TA,RW.FIL	;GET LARGEST RECORD FOR FILE, IN
	JUMPE	TA,CPOPJ	;  OPERAND FORMAT, INTO
	MOVSM	TA,CURFIL
	PUSHJ	PP,LNKSET
	HRRM	TA,CURFIL
	PUSHJ	PP,LARGER##	;[245]  'EINTO'
	MOVEI	LN,ESAVRW	;[245] SET FOR OPERAND STORE
	MOVEI	TC,EINTR##	;[245] SET EOPTAB TYPE ADR
	SETZM	EINTR		;[245] CLEAN UP, SO ENDIFGEN WON'T BE CONFUSED
	PUSHJ	PP,SETOPN

	TSWT	FERROR		;IF ERROR,
	AOS	(PP)		;  DON'T BUMP RETURN
	POPJ	PP,
SUBTTL SKIP DOWN TO NEXT DATAB ITEM

;EXIT TO CALL+1 IF NO MORE DATAB ITEMS
;EXIT TO CALL+2 IF ANOTHER FOUND, WITH DATAB ADDRESS IN 'TA'

NXTDAT:	HRRZ	TA,CURRPW	;GET TO RPW ENTRY
	LDB	TA,RW.DAT	;GET TO
	PUSHJ	PP,LNKSET	;  CURRENT DATAB ENTRY

NXDAT1:	LDB	TE,DA.SON	;IF HE HAS A SON,
	JUMPN	TE,NXDAT3	;  HE IS WHAT WE WANT

NXDAT2:	LDB	TE,DA.FAL	;IF THERE IS A BROTHER,
	JUMPE	TE,NXDAT4	;  GO TO HIM

	LDB	TA,DA.POP	;GET FATHER LINK
	LDB	TE,LNKCOD	;GET TABLE TYPE
	CAIE	TE,TB.DAT	;IF NOT DATAB,
	POPJ	PP,		;  QUIT
	PUSHJ	PP,LNKSET	;GET ADDRESS AND
	JRST	NXDAT2		;  TRY HIM

NXDAT3:	SKIPA	TA,TE		;TA_SON LINK
NXDAT4:	LDB	TA,DA.BRO	;TA_BROTHER LINK
	JUMPE	TA,CPOPJ	;IF ZERO--EXIT TO CALL+1
	AOS	(PP)		;WE HAVE NEXT ITEM
	JRST	LNKSET		;CONVERT TO ADDRESS AND EXIT TO CALL+2
SUBTTL SET UP 'CURMNE' TO POINT TO 'CODE'

SETCOD:	GETRD
	LDB	TA,RW.COD	;GET LINK TO MNETAB ENTRY FOR 'CODE'
	SETZM	CURMNE		;CLEAR 'CURMNE'
	JUMPE	TA,CPOPJ	;IF ZERO, NO CODE

	PUSHJ	PP,LNKSET	;GET ADDRESS OF MNETAB ENTRY
	HRRZM	TA,CURMNE

	HLRZ	TE,2(TA)	;IF ALREADY SET UP,
	JUMPE	TE,CPOPJ	;  NO ACTION NEEDED

	HRRZ	TC,1(TA)	;GET SIZE OF CODE VALUE
	JUMPN	TC,SETCD1	;IF ZERO,
	SETZM	CURMNE		;  CLEAR OUT
	GETRD
	DPB	TC,RW.COD	;  LINK
	POPJ	PP,		;  AND FORGET THE WHOLE THING

;GENERATE LITERAL FOR CODE VALUE

SETCD1:	PUSH	PP,TC		;SAVE BYTE SIZE OF LITERAL
	ADDI	TC,5		;CONVERT
	IDIVI	TC,6		;  TO WORDS
	EXCH	TC,0(PP)	;  AND SAVE THAT

	MOVE	TA,0(PP)	;PUT OUT
	HRLI	TA,SIXLIT	;  SIXBIT LITERAL
	PUSHJ	PP,STASHP	;  HEADER

	HRRZ	TB,CURMNE	;BUILD BYTE-POINTER TO
	ADD	TB,[POINT 7,2]	;  LITERAL VALUE

SETCD2:	MOVEI	TA,0		;CLEAR TA
	MOVE	TE,[POINT 6,TA]

SETCD3:	ILDB	CH,TB		;GET LITERAL BYTE
	CAIG	CH,137		;IF IT IS
	CAIGE	CH,40		;  OUTSIDE SIXBIT RANGE,
	JRST	SETCD6		;  WE NEED SPECIAL PROCESSING
	SUBI	CH,40		;CONVERT TO SIXBIT
SETC3A:	IDPB	CH,TE		;STASH IN TA
	TLNE	TE,770000	;IS TA FULL?
	SOJG	TC,SETCD3	;NO--LOOP
	PUSHJ	PP,STASHQ	;YES--PUT TA IN LITAB
	SOJG	TC,SETCD2	;LOOP
;PUT OUT CODE VALUE (CONT'D)

SETCD4:	PUSHJ	PP,POOL		;POOL CURRENT LITERAL
	MOVE	TB,CURMNE	;PUT
	SKIPN	TE,PLITPC	;GET POOLED LIT PC
	MOVE	TE,ELITPC	;  ADDRESS
	IORI	TE,AS.LIT	;  OF LITERAL
	HRRZM	TE,2(TB)	;  INTO MNETAB

	POP	PP,TC		;GET WORD SIZE BACK
	SKIPN	PLITPC
	ADDM	TC,ELITPC	;BUMP LITERAL PC
	POPJ	PP,

;BYTE IS OUTSIDE SIXBIT RANGE

SETCD6:	CAIG	CH,"Z"+40	;IS IT
	CAIGE	CH,"A"+40	;  LOWER-CASE?
	JRST	SETCD7		;NO--TROUBLE
	SUBI	CH,100		;YES--CONVERT TO SIXBIT UPPER-CASE
	JRST	SETC3A		;  AND USE THAT

SETCD7:	PUSH	PP,TA
	PUSH	PP,TE
	GETRD
	MOVEI	DW,E.387
	LDB	LN,RW.LN
	LDB	CP,RW.CP
	PUSHJ	PP,FATAL
	POP	PP,TE
	POP	PP,TA
	MOVEI	CH,"\"-40
	JRST	SETC3A
SUBTTL	SUPSKE - GEN "SKIPE SUPPRESS-FLAG"

;CALL:	TA/ POINTS TO RD ENTRY FOR THE GROUP
;	TB/ IS THE SUPPRESS-FLAG %PARAM OFFSET
;	PUSHJ	PP,SUPSKE
;RETURN: SMASHES TA,TB

SUPSKE:	SUBI	TB,1		;GET REAL OFFSET
	ADD	TB,RPWPRS	;GET %PARAM+N
	PUSH	PP,TB		;SAVE IT
	MOVE	CH,[SKIPE.+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASY	;GEN FIRST PART OF INSTRUCTION
	POP	PP,CH		;RESTORE %PARAM+N
	PJRST	PUTASN		;FINISH INSTRUCTION AND RETURN

;ROUTINE TO GENERATE JRST %TAG AND STORE IT IN RWSV11
SUPJTG:	PUSHJ	PP,GETTAG	;GET A TAG
	HRRZM	CH,RWSV11##	;SAVE IT
	HRRZ	TA,CH		;GET TAG NUMBER
	PUSHJ	PP,REFTAG##	;REFERENCE IT

;PUT OUT "JRST %TAG"
	HRRZ	CH,RWSV11	;GET %TAG
	HRLI	CH,JRST.
	PJRST	PUTASY

;ROUTINE TO WRITE TAG% FROM RWSV11 IF WE PUT ONE THERE,
; AND ZERO IT
SUPPTG:	SKIPN	RWSV11		;IS THERE A TAG?
	 POPJ	PP,		;NO, JUST RETURN
	MOVE	CH,RWSV11	;GET IT
	PUSHJ	PP,PUTTAG	;WRITE THE %TAG OUT
	SETZM	RWSV11		;CLEAR TAG
	POPJ	PP,		;RETURN
SUBTTL PUT OUT AN ERROR DIAGNOSTIC

;ENTER WITH DIAG NUMBER IN 'DW'

RWERA:	MOVE	TA,CURRPW
	LDB	TA,RW.DAT
	PUSHJ	PP,LNKSET
RWERA1:	LDB	CP,DA.CP
	LDB	LN,DA.LN
	JRST	FATAL
	EXTRAS==3	;NUMBER OF WORDS PER CONTROL ID PARAMETER
	EQTEST==1B29	;'EQUAL' FLAG IN 'IF' OPERAND

EXTERNAL RWSAV9 ; [305]
EXTERNAL RWSAV1,RWSAV2,RWSAV3,RWSAV4,RWSAV5,RWSAV6,RWSAV7,RWSAV8
EXTERNAL RWBRKC,RWMBRK,RPWLIN,LMASKB,LMASKS

EXTERNAL EBASEA,EBASBX,ESIZEA,ESIZEB,EMODEA,EMODEB
EXTERNAL EBASEB,ESAVRW,EINCRA,EINCRB,EINCRX,EMODEX,EDPLX,ESIZEZ
EXTERNAL EDPLA,EDPLB,ERESA,ERESB,ESAVEB,ESAVBX,EBASBX

EXTERNAL EXTLOC,RPWLOC,RPWNXT,CURRPW,FILLOC,CURFIL,DATLOC,DATNXT,CURDAT
EXTERNAL EOPLOC,EOPNXT,CUREOP,LITNXT,CURMNE,EAS1PC,ELITPC
EXTERNAL OPERND,BYTE.W,BYTE.S,OPLINE,EINTO,LNKCOD
EXTERNAL D1MODE,D2MODE,D6MODE,D7MODE,DSMODE

EXTERNAL JRST.,EPJPP,MOVEI.,MOVEM.,SETOM.,POPJ.,AOS.,SOS.,SOSGE.,WADV.,ADDM.
EXTERNAL HRLOI.,SETZM.,SKIPE.,LINE.C,LINE.D,LINE.H,LIN.RH

EXTERNAL SIXLIT

EXTERNAL DA.POP,DA.BRO,DA.LNC,DA.LVL,DA.RES,DA.RPW,DA.SON,DA.USG,DA.EXS
EXTERNAL DA.LN,DA.CP,DA.FAL,DA.CLA,DA.SGN,DA.EDT,DA.RBS

EXTERNAL TB.DAT,TM.DAT

EXTERNAL AS.CNB,AS.DAT,AS.FIL,AS.MSC,AS.PAR,AS.XWD,AS.OCT,AS.TAG
EXTERNAL AS.LIT

EXTERNAL RW.BRO,RW.LN,RW.CP,RW.FIL,RW.FGP,RW.LC,RW.PC
EXTERNAL RW.PHL,RW.CFL,RW.FDE,RW.LDE,RW.PAG,RW.RWT,RW.RHR,RW.RFR
EXTERNAL RW.PHR,RW.PFR,RW.GIR,RW.COD,RW.CID,RW.NCI,RW.BKT,RW.FBT
EXTERNAL RW.RDL,RW.DAT,RW.LCD,RW.NLC,RW.SCD,RW.TYP,RW.NSI,RW.LIN
EXTERNAL RW.COL,RW.NXT,RW.RES,RW.SLK,RW.UPN,RW.GPI,RW.RSF,RW.USE
EXTERNAL RW.SUP
EXTERNAL CPOPJ,CPOPJ1
	END