Trailing-Edge
-
PDP-10 Archives
-
BB-H506D-SM_1983
-
cobol/source/line.mac
There are 17 other files named line.mac in the archive. Click here to see a list.
; UPD ID= 3553 on 5/15/81 at 1:23 PM by NIXON
TITLE LINE FOR LIBOL
;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 FTDEFS ;GET FILE TABLE DEFINITIONS
;**; EDIT 404 FIX SO THAT PH STARTS AT HEADING. ALSO FIX CALL TO LINE.5 FORM LINE.6
;**; EDIT 331 LINE SPACING FIX AFTER FORCED PAGING
;**; EDIT 325 PRINTED LINE 1> THAN LINE COUNT
; PAGE COUNT 1 TOO HIGH
; ALSO FIXES THE CODE REPLACES EDIT 303 FOR REPORT CODE.
HISEG
;THIS ROUTINE GETS THE REPORT PAGE TO THE APPROPRIATE LINE, IN PREP-
;ERATION FOR PUTTING OUT A DETAIL, CONTROL, REPORT OR PAGE LINE.
;IF WE ARE ALREADY AT THE CORRECT LINE, NO ACTION IS TAKEN. OTHERWISE,
;THE DESIRED LINE IS CHECKED TO SEE IF IT IS WITHIN THE APPROPRIATE
;LIMITS (FIRST-DETAIL THRU LAST-DETAIL FOR DETAIL LINES, FIRST-DETAIL
;THRU LAST-FOOTING FOR CONTROL LINES). IF NOT, OR IF THE DESIRED LINE IS
;LESS THAN THE CURRENT LINE, PAGE FOOTING/HEADINGS ARE WRITTEN.
;CALLING SEQUENCE:
; MOVEI 15,<DESIRED LINE NUMBER>
; MOVEI 16,<ADDRESS OF REPORT TABLE>
; PUSHJ 17,LINE.C/LINE.D/LINE.H
EXTERNAL UOCAL.,KILL.,RET.2,WRPW.
ENTRY LINE.C ;FOR CONTROL LINES
ENTRY LINE.D ;FOR DETAIL LINES
ENTRY LINE.H ;FOR PAGE HEADING/FOOTING LINES
ENTRY LIN.RH ;TEST TO SEE IF REPORT IS INITIATED
ENTRY INIT. ;'INITIATE'
ENTRY TERM. ;'TERMINATE'
;ACCUMULATORS:
PP=17 ;PUSH-DOWN POINTER
PA=16 ;ADDRESS OF REPORT TABLE
DL=15 ;DESIRED LINE NUMBER
LA=14 ;ADDRESS OF CURRENT LINE NUMBER
TA=13 ;TEMPORARY
TB=11 ;TEMPORARY
TC=10 ;TEMPORARY
TD=7 ;TEMPORARY
;UUO CODE FOR 'WADV.'
WADV.==002200
;FORMAT OF REPORT TABLE:
; (1) PAGE-LIMIT, CURRENT-LINE ADDRESS
; (2) FIRST-DETAIL LINE, LAST-DETAIL LINE
; (3) FOOTING LIMIT, REPORT-HEADING ROUTINE
; (4) PAGE-HEADING ROUTINE, PAGE-FOOTING ROUTINE
; [404] (5) ADDRESS OF ASSOCIATED FILE TABLE,HEADING
; (6) SIZE OF CODE, ADDRESS OF CODE
PAGLIM==0
CURLIN==0
FIRSTD==1
LASTD==1
FOOT==2
REPORT==2
PAGEH==3
PAGEF==3
FILTAB==4
HEADNG==4 ; [404] LOCATION OF HEADING
CODER==5
;[325] AFTER CODER DEFINITION
CD.MASC==40 ;RECORD USAGE IS DISPLAY-7.
CD.EBC==20 ;RECORD USAGE IS DISPLAY-9.
HIGBIT==400000 ; [420] START ON FIRST DETAIL.
;ENTRY FOR A DETAIL LINE
LINE.D: SKIPA TA,LASTD(PA) ;PICK UP LAST-DETAIL LIMIT
;ENTRY FOR CONTROL LINE
LINE.C: MOVS TA,FOOT(PA) ;PICK UP CONTROL-FOOTING LIMIT
MOVE LA,CURLIN(PA) ;PICK UP ADDRESS OF CURRENT LINE COUNT
SKIPLE TB,(LA) ; [420] IS START FIRST LINE ON?
JRST LINEC1 ; [420] NO BEYOND FIRST LINE; NORMAL PROCESSING
MOVSI TB,HIGBIT ; [420] TURN OFF NO START
ANDCAM TB,0(LA) ; [420] IN REAL LINE NUMBER
TLZE DL,HIGBIT ; [420] AND IN DESIRED LINE TOO; FIRST LINE?
HLRZ DL,FIRSTD(PA) ; [420] FIRST DE LINE WITH NO HEADERS AND WITH LINE PLUS
; [420] START AT FIRST DETAIL
LINEC1: CAMN DL,0(LA) ;ARE WE AT DESIRED LINE?
POPJ PP, ;YES--SIMPLY RETURN
MOVE TB,(PP) ;SET ERROR LOCATION FOR
MOVEM TB,UOCAL. ; 'KILL.'
HLRZ TB,PAGLIM(PA) ;IF THERE IS NO PAGE LIMIT,
JUMPE TB,LINE.0 ; DON'T TEST FOR LIMIT
CAILE DL,0(TA) ;ARE WE PAST THE LIMIT LINE?
JRST LINE.2 ;YES
LINE.0: CAML DL,0(LA) ;IS DESIRED LINE BEFORE CURRENT ONE?
JRST LINE.1 ;NO
PUSH PP,DL ;YES--SAVE DESIRED LINE NUMBER
PUSHJ PP,LINE.6 ;PUT OUT PAGE FOOTING/HEADING
POP PP,DL ;RESTORE DESIRED LINE NUMBER
CAMLE DL,0(LA) ;IF DESIRED LINE IS AFTER CURRENT ONE,
JRST LINE.3 ; GO DO SOME MORE
POPJ PP, ; OTHERWISE WE ARE DONE
LINE.1: JUMPE TB,LINE.3 ;IF NO PAGE-LIMIT, NO TEST
HLRZ TA,FIRSTD(PA) ;ARE WE BEFORE THE FIRST DETAIL LINE?
CAIGE DL,(TA)
MOVEI DL,(TA) ;YES--PRETEND WE WANT FIRST DETAIL
JRST LINE.3 ;NO
LINE.2: SUB DL,0(LA) ; [331] GET DIFFERENCE BETWEEN DL AND REAL LINE
PUSH PP,DL ; [331] SAVE DIFFERENCE
SETZ DL, ; [420] START AT TOP OF NEW LINE
; (THIS HERE IN CASE NO HEADING OR FOOTING)
PUSHJ PP,LINE.6 ;PUT OUT PAGE FOOTING/HEADING
POP PP,TA ; [331] GET BACK SAVED SPACING DIFFERENCE
HLRZ DL,FIRSTD(PA) ;PRETEND WE WANT FIRST-DETAIL LINE
PUSHJ PP,PHDR ; [420] SEE IF REAL PAGE HEADER
JRST LINE.3 ; [331] YES WANT FIRST DE
HRRZ TB,(LA) ; [420] NO USE FIRST DETAIL
ADD TB,TA ; [420] ADD BACK DIFFERENCE
CAMG DL,TB ; [420] USE LARGER OF NEW LINE OR FIRST DE
MOVE DL,TB ; [420] NEW LINE LARGER USE IT.
JRST LINE.3 ; [331] NOW WE GOT CORRECT SPACING
;ENTRY FOR 'PAGE' AND 'REPORT' HEADING/FOOTING LINES
LINE.H: MOVE TB,(PP) ;SET ERROR LOCATION FOR
MOVEM TB,UOCAL. ; 'KILL.'
MOVE LA,CURLIN(PA) ;PICK UP ADDRESS OF CURRENT LINE
LINE.3: CAMN DL,0(LA) ;ARE WE AT DESIRED LINE?
POPJ PP, ;YES--RETURN
CAMG DL,0(LA) ;ARE WE BEFORE DESIRED LINE?
JRST LINE.5 ;NO
MOVE TA,0(LA) ;YES--STASH NEW
LINE.4: MOVEM DL,0(LA) ; VALUE AND
SUB DL,TA ; COMPUTE DIFFERENCE
LINE.7: HRLI DL,120 ;SET 'BEFORE' AND 'LINE-FEED' CODES
JRST LINE.W ;WRITE LINE AND RETURN
;WE ARE ALREADY AFTER THE DESIRED LINE
LINE.5: PUSH PP,DL ;SAVE
PUSH PP,PA ; IMPORTANT AC'S
MOVE DL,[XWD 121,1] ;SET 'BEFORE' AND 'FORM-FEED'
PUSHJ PP,LINE.W ;WRITE OUT A FORM-FEED
POP PP,PA ;RESTORE
HRRZ LA,0(PA) ; THE
HRRZ DL,(PP) ; AC'S
MOVEI TD,1 ; [325] START AT 1.
MOVEM TD,(LA) ; [325] FOR LINE NO.
CAILE DL,1 ;IF WE WANTED LINE 1, QUIT
PUSHJ PP,LINE.3 ; [325] ELSE ADVANCE THE FORM
POP PP,DL ;RESTORE AC
POPJ PP,
;PUT OUT PAGE FOOTING/HEADING
LINE.6: PUSH PP,PA ;SAVE RPWTAB POINTER
PUSH PP,DL ; [420] SAVE DESIRED LINE
HRRZ TA,PAGEF(PA) ;EXECUTE ANY
PUSHJ PP,LINE.R ; PAGE-FOOTING ROUTINE
POP PP,DL ; [420] RESTORE DESIRED LINE ON NEXT PAGE
MOVE PA,(PP) ;RESTORE PA
PUSHJ PP,PHDR ; [420] SEE IF REAL OR NOT DEFINED PAGE HDR
PUSHJ PP,LINE.5 ;IF THE LATTER, PUT OUT A FORM FEED
MOVE PA,(PP) ;RESTORE PA
HLRZ TA,PAGEH(PA) ;EXECUTE ANY
PUSHJ PP,LINE.R ; PAGE-HEADING ROUTINE
POP PP,PA ;RESTORE THE
HRRZ LA,CURLIN(PA) ; ACCUMULATORS
POPJ PP,
PHDR: HLRZ TC,PAGEH(PA) ; [420] GET ADDR OF PAGE HEADING ROUTINE
HLRZ TC,1(TC) ; [420] USER-DEFINED PAGE HEADING OR
CAIE TC,(JRST) ; [420] JUST "AOS PAGE-COUNTER- JRST GI"?
AOS (PP) ; [420] REAL PAGE HEADER - SKIP RETURN.
POPJ PP, ; [420]
;CALL THE 'WADV.' ROUTINE
LINE.W: MOVE TB,CODER(PA) ;GET SIZE AND ADDRESS OF CODE
HLRZ TC,TB ;GET SIZE OF CODE
DPB TC,[POINT 12,DL,11];STASH IN PARAMETER
HLRZ PA,FILTAB(PA) ;GET FILTAB ADDRESS
HRLI PA,WADV.+1B18 ;SET 'WADV.' UUO CODE
SOS (PP) ;DEFEAT THE SKIP RETURN FROM WADV
JUMPE TC,WRPW. ;IF NO CODE, GO TO WADV
MOVE TA,F.WFLG(PA) ;GET RECORD ADDRESS AND FLAGS
MOVEI TD,(POINT 6,0) ;ASSUME RECORD IS SIXBIT
TLNE TA,CD.MASC ; [325] IS IT REALLY SIXBIT?
MOVEI TD,(POINT 7,0) ;NO--IT IS ASCII
HRLI TA,(TD) ;MAKE 'TA' BE A BYTE-POINTER
HRLI TB,(POINT 6,0) ;CODE IS SIXBIT
LINW1: ILDB TD,TB ;GET CODE CHARACTER
TLNE TA,100 ;IS RECORD ASCII?
ADDI TD,40 ;YES--CONVERT BYTE TO ASCII
TLNE TA,1000
LDB TD,RPC.79##
IDPB TD,TA ;STASH IT IN RECORD
SOJG TC,LINW1 ;LOOP
JRST WRPW. ;GO TO 'WADV'
;PUT OUT REPORT HEADING & PAGE HEADING IF NECESSARY
;IF NOT, SKIP RETURN
LIN.RH: MOVE LA,CURLIN(PA) ;GET ADDRESS OF CURRENT LINE
SKIPLE TA,0(LA) ;IS LINE-COUNT POSITIVE?
JRST RET.2 ;YES--QUIT
HRRZ TB,-1(PP) ;SET ADDRESS FOR
MOVEM TB,UOCAL. ; ANY ERROR
CAMN TA,[EXP -1] ;IF LINE-COUNT IS -1 -- ERROR.
JRST LINRHE
TDNE TA,[XWD 377777,-1]
JRST RET.2
MOVEI TD,1 ; [325] RESET TO 1
MOVEM TD,0(LA) ; [325] THE LINE NUMBER
HLRZ TD,PAGEH(PA) ;GET ADDRESS OF PAGE-HEADER ROUTINE
SKIPE @(TD) ;IF PAGE NUMBER IS ALREADY ZERO LEAVE IT
SOS @(TD) ;ELSE REDUCE SINCE WE WILL ADVANCE IT NEXT
PUSH PP,PA ;SAVE 'PA'
;IF A TERMINATE HAS ALREADY BEEN DONE, PUT A FORM FEED OUT TO
; SEPARATE THE TWO REPORTS.
HLRZ PA,FILTAB(PA) ;GET ADDRESS OF FILTAB
LDB TA,[F%BRPT] ;CHECK FLAG TO SEE IF
JUMPE TA,LIN.R0 ; A 'TERMINATE' WAS DONE
MOVE DL,[XWD 121,1] ;YES, PUT OUT
MOVE PA,(PP) ;LINE.W NEEDS ORIGINAL PA
PUSHJ PP,LINE.W ; FORM-FEED
LIN.R0: MOVE PA,(PP) ;FETCH PA AGAIN
HRRZ TA,REPORT(PA) ;EXECUTE ANY
JUMPN TA,LIN.R1 ; [420] IF ANY DON'T SET START
PUSHJ PP,PHDR ; [420] SEE IF ANY USER DEFINED PAGE HEADER
TRNA ; [420] GO TO SET START
JRST LIN.R1 ; [420] PAGE HEADER LINE STARTING OKAY
MOVSI TD,HIGBIT ; [420] SET START SO THAT FIRST
; [420] DETAIL LINE WILL START ON FIRST DETAIL
ADDM TD,(LA) ; [420] ADD IN START BIT
LIN.R1: PUSHJ PP,LINE.R ; [420] REPORT-HEADING ROUTINE
POP PP,PA ;RESTORE PA AGAIN
HLRZ TA,PAGEH(PA) ;EXECUTE ANY PAGE-HEADING ROUTINE
;PUT OUT A HEADING/FOOTING ROUTINE IF NECESSARY
LINE.R: JUMPN TA,(TA)
POPJ PP,
SUBTTL 'INITIATE' AND 'TERMINATE' ROUTINES
;'INITIATE'
INIT.: MOVE LA,0(PA) ;PICK UP ADDRESS OF LINE-COUNTER
SKIPL 0(LA) ;IS IT NEGATIVE?
JRST INIT.E ;NO--ERROR
SETZM 0(LA) ;YES--SET IT TO ZERO
POPJ PP,
;'TERMINATE'
TERM.: MOVE LA,0(PA) ;PICK UP ADDRESS OF LINE-COUNTER
SKIPGE LA,(LA) ;IF IT ISN'T -1
CAME LA,[EXP -1]
CAIA ;OK
JRST LINRHE ;ERROR
;SET BIT SAYING THAT THE REPORT HAS BEEN TERMINATED. THEN
; IF ANOTHER INITIATE IS DONE, A FORM FEED WILL BE PUT OUT
; TO SEPARATE THE TWO REPORTS.
HLRZ PA,FILTAB(PA) ;ADDRESS OF FILTAB
SETO TA, ;GET A 1 BIT
DPB TA,[F%BRPT] ;SET IT
POPJ PP, ; RETURN-- ALL IS WELL
;ERROR--REPORT IS NOT INITIATED
LINRHE: PUSHJ PP,REP.ER ;PRINT REPORT [NAME]
OUTSTR [ASCIZ 'is not initiated']
JRST KILL.
INIT.E: PUSHJ PP,REP.ER ;PRINT REPORT [NAME]
OUTSTR [ASCIZ 'is already initiated']
JRST KILL.
REP.ER: OUTSTR [ASCIZ 'Report [']
HLRZ TA,FILTAB(PA) ;GET ADDRESS OF FILTAB
HRLI TA,(POINT 6,) ;FORM BYTE POINTER
MOVEI TB,^D30 ;MAX. LENGTH OF NAME
REP.E1: ILDB TC,TA
JUMPE TC,REP.E2 ;ALL DONE
ADDI TC," " ;MAKE ASCII
OUTCHR TC
SOJG TB,REP.E1
REP.E2: OUTSTR [ASCIZ '] ']
POPJ PP,
END