.TITLE PRTOC .IDENT /M3.0/ ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * ;* General permission to copy (but not for profit) is hereby * ;* granted, provided that reference is made to the fact that * ;* reproduction privileges were granted by DECUS. * ;* * ;* The information in this document is subject to change with- * ;* out notice and should not be construed as a commitment by * ;* the contributor(s), DECUS or Digital Equipment Corporation. * ;* * ;* These parties make no warranty as to the suitability of this * ;* material for use by the recipient, nor as to the accuracy or * ;* functioning of the software or related material, and no * ;* responsibility is assumed in connection therewith. * ;* * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; COMMANDS FOR OUTPUTTING TABLES OF CONTENTS ; ; AUTHOR: C. H. SPALDING, Unimation, Jan. '83 ; ; MODIFIED BY: ; ; MODIFICATIONS ; ; COMMAND ROUTINE IS ENTERED WITH: ; ; R4 = Address of number conversion routine ; R5 = Address of flag word F.1 ; ; LOCAL DATA TSPCNG: .BLKW TBLCON ;BUFFERS FOR LINE SPACING DOPTR: .WORD DOTXT1,DOTXT2,DOTXT3,0 ;TABLE OF POINTERS TO STRINGS ; OUTPUT TEXT DOTXT1: .ASCIZ \CONTENTS\ DOTXT2: .ASCIZ \FIGURES\ DOTXT3: .ASCIZ \TABLES\ SPDOT: .ASCIZ \ .\ ;ELIPSIS TEXT .EVEN ; DO CONTENTS command .IF NZ TBLCON ;chs82+ .IF Z PTCOVL DMPTOC::CLRB TFLAG ;SIGNAL THIS ENTRY POINT BR DTOC1 ; (FROM EOF DUMP) DOTOC:: MOVB #1,TFLAG ;SIGNAL THIS ENTRY POINT DTOC1: .IIF NZ FIGFIX, CALL FIGDMP ;PROCESS ALL PENDING FIGURES ;chs37 .IIF NZ BLKCMD, CALL BLKDMP ;PROCESS ALL QUEUED TEXT BLOCKS ;chs78a .IFF DTOC2:: .ENDC ; -Z PTCOVL MOV #TOC1ST,R0 ;POINT AT FIRST LIST POINTER MOV #TBLCON,R1 ;NUMBER OF LISTS 10$: TSTNE (R0)+,20$ ;GO AHEAD IF LIST IN USE SOB R1,10$ ;LOOK AT ALL LISTS BR DTOCXT ;QUIT IF ALL EMPTY ; Get command-line arguments 20$: MOV #TSPCNG,R2 ;POINT AT SPACING BUFFERS 30$: TSTEQB TFLAG,40$ ;SKIP IF DOING AUTO DUMP CALL (R4) ;GET NEXT ARGUMENT 40$: MOV NSPNG,R3 ;DEFAULT TO CURRENT SETTING MOV R3,(R2)+ ;STORE THIS VALUE CMPNE R2,#<2*TBLCON+TSPCNG>,30$ ;LOOP IF NOT DONE ; Setup page format MOV NSPNG,-(SP) ;SAVE CURRENT LINE SPACING MOV TTLP1,TTLP2 ;CLEAR TITLE BUFFER MOV STTLP1,STTLP2 ;CLEAR SUBTITLE BUFFER MOV #ILMRG,LMARG ;SET LEFT MARGIN ;chs16 MOV PRMRG,RMARG ;SET RIGHT MARGIN CLR $NUMSW ;TURN OFF PAGE NUMBERING CLR R1 ;INITIAL TABLE OFFSET LOOP: TSTEQ TOC1ST(R1),40$ ;SKIP THIS LIST IF EMPTY MOV R1,-(SP) ;SAVE TABLE OFFSET ; Start new page; output leading blank lines CLR PAGENO ;CLEAR PAGE NUMBER TO FORCE ODD TSTNE LINEC,5$ ;AT TOP OF PAGE ALREADY? INC PAGENO ;INCREMENT PAGE NUMBER 5$: .IF NZ SBPFIX ;chs47+ CALL ENDSBP ;BREAK CURRENT PAGE (END ANY SUBPAGE) .IFF ;chs47- CALL PAGEC ;BREAK CURRENT PAGE .ENDC ; -NZ SBPFIX ;chs47 .IF NZ BLSW ;USE CONTROLLABLE NO. BLANK LINES ;chs03+ MOV CHPSKP,R2 ;SET LINE COUNT SUB $HDRSW,R2 ;DECREASE BY HEADER LENGTH ;chs40 BLE 10$ ;NOTHING TO DO? .IFF ;... OR USE FIXED NO. BLANK LINES ;chs03- MOV #7.,R2 ;SET LINE COUNT .ENDC ; -NZ BLSW ;chs03 CALL SKIPN ;SKIP LINES 10$: MOV (SP),R1 ;RESTORE TABLE OFFSET MOV DOPTR(R1),R3 ;POINT TO HEADING TEXT CALL SDINI ;INITIALIZE SECONDARY BUFFER POINTERS 20$: MOVB (R3)+,R1 ;GET NEXT BYTE BEQ 30$ ;IF EQ DONE CALL SDWCI ;WRITE CHARACTER IN BUFFER BR 20$ 30$: MOV RMARG,R2 ;CALCULATE SPACE COUNT TO CENTER TITLE TEXT SUB LMARG,R2 ADD SDINP,R2 ;INCLUDE TEXT LENGTH SUB ,R2 ASR R2 ADD LMARG,R2 ;OFFSET BY COMPLETE LEFT MARGIN ;chs39+ .IF NZ LAYOUT CALL NSPACB ;SPACE OVER FROM BASE MARGIN .IFF ;chs39- CALL NSPAC ;SPACE TO TEXT POSITION .ENDC ; -NZ LAYOUT ;chs39 MOV #SDINP,R4 ;SET ADDRESS OF LINE DESCRIPTOR CALL PSTRPA ;OUTPUT HEADING TEXT MOV #,R2 ;SET LINE COUNT CALL SKIPN ;SKIP LINES MOV (SP),R3 ;GET LIST TABLE OFFSET MOV TSPCNG(R3),NSPNG ;SET LINE SPACING FOR THIS LIST CALL PRTOC0 ;PRINT THE TABLE OF CONTENTS MOV (SP)+,R1 ;GET LIST TABLE OFFSET 40$: TST (R1)+ ;INCREMENT BY TWO CMP R1,#<2*TBLCON> ;LAST LIST CONSIDERED? BLT LOOP ; NO, LOOP BACK MOV (SP)+,NSPNG ;RESTORE LINE SPACING DTOCXT: RETURN ; PRINT CONTENTS command PRTOC:: CALL (R4) ;GET INDEX OF TABLE MOV #1,R3 ;DEFAULT TO "CONTENTS" LIST DEC R3 ;CONVERT TO TABLE OFFSET ASL R3 ;; CALL (R4) ;GET EXTRA GROUP SPACING ;; MOV #XGRPSP,R3 ;DEFAULT VALUE ;; MOV R3,TSPCNG ;STORE FOR LATER USE ; Second entry point used by DO CONTENTS (R3 = Table offset) PRTOC0: ADD #TOC1ST,R3 ;ADDRESS OF FIRST POINTER .IIF NZ SKPFIX, MOV SP,$IDXAC ;SIGNAL INDEX BEING OUTPUT ;chs24 MOV (R3),R5 ;GET POINTER TO FIRST RECORD BNE 10$ ;CONTINUE IF LIST NOT EMPTY JMP PRTOCX 10$: CLR (R3) ;MARK THIS LIST AS PROCESSED CLRB TFLAG ;SIGNAL START OF OUTPUT ;; TSTEQ (R5),PRTOC1 ;DON'T DO TEST PAGE IF LAST ENTRY ;; MOV #IDXTP,R3 ;SET TEST COUNT ;; .IF NZ XTSTPG ;chs69+ ;; CALL TESTL ;TEST IF PAGE SHOULD BE BROKEN ;; .IFF ;chs69- ;; CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN ;; .ENDC ; -NZ XTSTPG ;chs69 PRTOC1: MOV LMARG,R2 ;SPACE IN TO LEFT MARGIN .IF NZ LAYOUT ;chs39+ CALL NSPACB ;SPACE OVER FROM BASE MARGIN .IFF ;chs39- CALL NSPAC ;chs51c .ENDC ; -NZ LAYOUT ;chs39 MOV 4(R5),R3 ;GET POINTER TO ASCII TEXT MOVB (R3)+,-(SP) ;GET "LEVEL" NUMBER BEQ 30$ ;SKIP IF GENERAL RECORD CMPNEB #1,(SP),10$ ;SKIP IF THIS ISN'T "CHAPTER" RECORD TSTEQB TFLAG,15$ ;OR IF THIS IS FIRST LINE CALL SKIP1 ;OUTPUT BLANK LINE MOV LMARG,R2 ;SPACE IN TO LEFT MARGIN .IF NZ LAYOUT ;chs39+ CALL NSPACB ;SPACE OVER FROM BASE MARGIN .IFF ;chs39- CALL NSPAC ;chs51c .ENDC ; -NZ LAYOUT ;chs39 BR 15$ ; Space in to section number 10$: MOVB (SP),R4 ;GET LEVEL NUMBER ADD #,R4 ;POINT AT INDENT BUFFER CLR R2 ;CLEAR COUNTER 12$: MOVB -(R4),R1 ;GET INDENT ADD R1,R2 ;ADD TO COUNT CMPNE R4,#TOCIND,12$ ;LOOP UNTIL AT FIRST INDENT CALL NSPAC ;OUTPUT THE SPACES 15$: MOV CPOS,R2 ;SAVE CURRENT POSITION ; Output section number MOV R3,R4 ;POINT AT TEXT 20$: CMPNEB #QTS,(R4)+,20$ ;LOOK FOR QUOTED SPACE CLRB -(R4) ;MARK AS END OF SUBSTRING CMPB (R4)+,(R4)+ ;SKIP OVER TWO BYTES MOV R4,-(SP) ;SAVE STRING POINTER MOV R3,S1 ;POINT AT START OF STRING CALL PSTRAZ ;OUTPUT SUBSTRING MOV (SP)+,R3 ;POINT AT REST OF STRING ; Space over to start of text MOVB (SP),R4 ;GET LEVEL NUMBER MOVB (R4),R4 ;GET INDENT FOR THIS LEVEL ADD R4,R2 ;ADD TO WHERE WE WERE SUB CPOS,R2 ;SUBTRACT WHERE WE ARE CALL NSPAC ;OUTPUT SPACES ; Output text 30$: TSTEQB (R3),85$ ;NO OUTPUT IF NO TEXT INCB TFLAG ;SIGNAL OUTPUT BEGUN CLR XNSPCH ;CLEAR COUNT OF 'S MOV R3,S1 ;POINT AT START OF STRING CALL PSTRAZ ;OUTPUT SUBSTRING ; Calculate number of dots needed to get to page number MOV RMARG,R2 ;CALCULATE DISTANCE TO RIGHT MARGIN SUB LMARG,R2 .IIF NZ LAYOUT, ADD BASMRG,R2 ;INCLUDE BASE LEFT MARGIN SUB TOCPAG,R2 ;ADJUST FOR LENGTH OF PAGE REFERENCE DEC R2 ; AND SPACE BEFORE PAGE REF. ; Adjust for text already output ADD XNSPCH,R2 ;ADJUST FOR ANY 'S SUB CPOS,R2 ;MINUS CURRENT POSITION ASR R2 ;CALCULATE NUMBER OF DOTS NEEDED BCC 35$ ;SKIP IF EVEN SPACING CALL CCSPC ;OUTPUT A SPACE 35$: TST R2 ;ANY DOTS TO BE OUTPUT? BLE 50$ ; NO, SKIP ; Output dots 40$: MOV #SPDOT,S1 ;POINT TO " ." STRING CALL FMSG ;OUTPUT A DOT SOB R2,40$ ;LOOP UNTIL ALL DOTS OUTPUT ; Determine length of page reference 50$: CLR R2 ;BUILD LENGTH HERE MOV 10(R5),R1 ;GET CHAPTER/APPENDIX NUMBER BEQ 56$ ;SKIP IF NONE BMI 52$ ;IF MI, CHAPTER NUMBER DEC R2 ;ADJUST FOR APPENDIX LETTER BR 54$ 52$: CLR R0 ;GET CHAPTER NUMBER BISB R1,R0 CALL PPGNO ;ADJUST FOR LENGTH 54$: DEC R2 ;ADJUST FOR DASH 56$: MOV 6(R5),R0 ;GET PAGE NUMBER CALL PPGNO ;ADJUST FOR ITS LENGTH ADD TOCPAG,R2 ;DETERMINE EXTRA PADDING NEEDED INC R2 ;ADD EXTRA SPACE CALL NSPAC ;OUTPUT THE SPACES (.GE. 0) ; Output page number MOV 10(R5),R1 ;GET CHAPTER/APPENDIX NUMBER BEQ 80$ ;SKIP IF NONE BMI 60$ ;IF MI, CHAPTER NUMBER ADD #'A-1,R1 ;CONVERT TO LETTER CALL FOUT ;OUTPUT APPENDIX LETTER BR 70$ 60$: CLR R0 ;GET CHAPTER NUMBER BISB R1,R0 CALL DECPRT ;CONVERT CHAPTER NUMBER 70$: MOV #'-,R1 ;OUTPUT A DASH CALL FOUT 80$: MOV 6(R5),R0 ;GET PAGE NUMBER CALL DECPRT ;OUTPUT PAGE NUMBER CALL SKIPS ;OUTPUT THE LINE ; Output blank line if doing chapter record CMPNEB #1,(SP),90$ ;SKIP IF NOT DOING LEVEL "1" RECORD? 85$: CALL SKIP1 ;OUTPUT BLANK LINE CLRB TFLAG ;SET FLAG TO PREVENT ANOTHER BLANK LINE 90$: TST (SP)+ ;CLEAN STACK MOV (R5),R5 ;GET POINTER TO NEXT RECORD BEQ PRTOCX ;QUIT IF AT END OF LIST JMP PRTOC1 ; ELSE LOOP PRTOCX: MOV #XFIRST,R0 ;POINT TO FIRST LIST POINTER MOV #,R1 ;NUMBER OF LISTS 10$: TSTNE (R0)+,20$ ;SKIP IF ONE ISN'T EMPTY SOB R1,10$ ;LOOP TO CHECK ALL MOV XTOP,XBOT ;INDICATE WHOLE BUFFER EMPTY 20$: .IIF NZ SKPFIX, CLR $IDXAC ;SIGNAL INDEX OUTPUT DONE ;chs24 RETURN .ENDC ; NZ TBLCON ;chs82- .END