.TITLE PINDX .IDENT /M03X/ ; PRINT INDEX COMMANDS ; ; AUTHOR: L. WADE 1-JUN-72 ; ; MODIFIED BY: ; ; E. POLLACK U. OF W. 19-DEC-73 ; ; D. N. CUTLER 22-SEP-75 ; ; C. H. SPALDING, UNIMATION, APR. '82 ; ; MODIFICATIONS ; ; CHS03 - REDUCE BLANK LINES FROM "DO INDEX" COMMAND ; CHS16 - USE LOCAL SYMBOLS IN PLACE OF CONSTANTS ; CHS24 - FIX SKIP AT BOTTOM OF PAGE ; CHS28A- PREVENT BLANK LINE AT TOP OF CONTINUATION PAGE ; CHS28B- DO A "TEST PAGE 3" BEFORE EACH LETTER GROUP ; CHS37 - FIX "FIGURE" TO WORK AS CLAIMED; ADDED QUEUE ; CHS39 - ADD "LAYOUT" COMMAND ; CHS40 - EXPAND "HEADER" COMMAND ; CHS41 - ADD CONTROL OF BLANK LINES BETWEEN LETTER GROUPS ; CHS47 - ALLOW CONSECUTIVE SUBPAGES ; CHS51 - ADD "ENTRY" COMMAND & SUBINDEXING ; CHS52A- CORRECT SPACING OF UNDERLINED INDEX ENTRIES ; CHS52B- DON'T EXCEED RIGHT MARGIN WITH PAGE NUMBERS ; ; COMMAND ROUTINE IS ENTERED WITH: ; ; R4=ADDRESS OF NUMBER CONVERSION ROUTINE. ; R5=ADDRESS OF FLAG WORD F.1. ; ; LOCAL DATA .IIF NZ XSPNG, XSPCNG: .BLKW 1 ;SPACING BETWEEN LETTER GROUPS ;CHS41 .IIF NZ XENTRY, PAGOUT: .BLKB 1 ;FLAG FOR PAGE # ALREADY ON LINE ;CHS51A .IIF NZ SUBIDX, XIDNT: .BLKB 1 ;BUFFER FOR SUBINDEX INDENT ;CHS51B .IF NZ IDXRM ;CHS52B XMID: .BLKW 1 ;BUFFER FOR RIGHT-HALF LENGTH ;CHS52B XPOS: .BLKW 1 ;BUFFER FOR SPACE REMAINING ;CHS52B .ENDC ; NZ IDXRM ;CHS52B ; OUTPUT TEXT DOTXT: .ASCIZ /INDEX/ ;INDEX HEADING INDMG: .ASCIZ / ./ ;INDEX ELIPSIS TEXT .IF NZ SUBIDX ;CHS51B .ENABL LC ;CHS51B CONMSG: .ASCIZ / (continued)/ ;CHS51B .ENDC ; NZ SUBIDX ;CHS51B .EVEN ; ; DO INDEX COMMAND ; DOINX:: .IIF NZ FIGFIX, CALL FIGDMP ;PROCESS ALL PENDING FIGURES ;CHS37 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 .IIF NZ XSPNG, MOV NSPNG,XSPCNG ;SAVE CURRENT LINE SPACING ;CHS41 .IIF NZ SUBIDX, MOVB #XINDNT,XIDNT ;SET SUBINDEX INDENT ;CHS51B MOV #SPCNG,NSPNG ;SET INITIAL SPACING BIS #FILLF!JUSTF!PJUSTF,(R5) ;SET FILL AND JUSTIFY FLAGS CLR PAGENO ;CLEAR PAGE NUMBER TSTNE LINEC,10$ ;AT TOP OF PAGE ALREADY? INC PAGENO ;INCREMENT PAGE NUMBER 10$: .IF NZ SBPFIX ;CHS47 CALL ENDSBP ;BREAK CURRENT PAGE (END ANY SUBPAGE) ;CHS47 .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 ;CHS03 SUB $HDRSW,R2 ;DECREASE BY HEADER LENGTH ;CHS40 BLE 15$ ;NOTHING TO DO? ;CHS03 .IFF ;... OR USE FIXED NO. BLANK LINES ;CHS03 MOV #7.,R2 ;SET LINE COUNT .ENDC ; -NZ BLSW ;CHS03 CALL SKIPN ;SKIP LINES 15$: CALL SETTL ;MOVE TITLE TO TITLE BUFFER CMPNE TTLP1,TTLP2,30$ ;TITLE SPECIFIED? MOV #DOTXT,R3 ;POINT TO DEFAULT TEXT 20$: MOVB (R3)+,R1 ;GET NEXT BYTE BEQ 30$ ;IF EQ DONE MOV #TTLP1,R4 ;POINT TO TITLE DESCRIPTOR CALL WCI ;WRITE CHARACTER IN BUFFER BR 20$ ; 30$: MOV RMARG,R2 ;CALCULATE SPACE COUNT TO CENTER TITLE TEXT SUB LMARG,R2 ;CHS16 ADD TTLP1,R2 ; SUB TTLP2,R2 ; ASR R2 ; ADD LMARG,R2 ;OFFSET BY COMPLETE LEFT MARGIN ;CHS39 .IF NZ LAYOUT ;CHS39 CALL NSPACB ;SPACE OVER FROM BASE MARGIN ;CHS39 .IFF ;CHS39 CALL NSPAC ;SPACE TO TEXT POSITION .ENDC ; -NZ LAYOUT ;CHS39 MOV #TTLP1,R4 ;SET ADDRESS OF LINE DESCRIPTOR CALL PSTRPA ;OUTPUT NOTE TEXT MOV #INDXBL,R2 ;SET LINE COUNT ;CHS16 CALL SKIPN ;SKIP LINES MOVB APNDN,-(SP) ;SAVE CURRENT APPENDIX MOVB #'I-'A+1,APNDN ;SET APPENDIX TO 'I' FOR INDEX .IF NZ XSPNG+SUBIDX ;CHS41 CALL PINDX0 ;PRINT THE INDEX ;CHS41 .IFF ;CHS41 CALL PINDX ;PRINT THE INDEX ;CHS41 .ENDC ; -NZ XSPNG+SUBIDX ;CHS41 MOVB (SP)+,APNDN ;RESTORE APPENDIX NUMBER RETURN ; ; ; PRINT INDEX COMMAND ; PINDX:: .IF NZ SUBIDX ;CHS51B CALL (R4) ;GET SUBINDEX INDENT AMOUNT ;CHS51B MOV #XINDNT,R3 ;DEFAULT VALUE ;CHS51B MOVB R3,XIDNT ;STORE FOR LATER USE ;CHS51B .ENDC ; NZ SUBIDX ;CHS51B .IF NZ XSPNG ;CHS41 CALL (R4) ;GET EXTRA GROUP SPACING ;CHS41 MOV #1,R3 ;DEFAULT TO 1 ;CHS41 MOV R3,XSPCNG ;STORE FOR LATER USE ;CHS41 PINDX0: ;CHS41 .ENDC ; NZ XSPNG ;CHS41 CLR -(SP) ;CLEAR CURRENT LETTER .IIF NZ SKPFIX, MOV SP,$IDXAC ;SIGNAL INDEX BEING OUTPUT ;CHS24 MOV XFIRST,R5 ;GET FIRST ITEM IN INDEX .IF NZ IDXRM ;CHS52B BNE PINDL1 ;CONTINUE IF NOT ZERO ;CHS52B JMP PINDXX ;CHS52B .IFF ;CHS52B BEQ PINDXX ;IF EQ NONE .ENDC ; -NZ IDXRM ;CHS52B PINDL1: MOVB @4(R5),R1 ;GET FIRST LETTER CMP R1,#141 ;LOWER CASE? BLT 10$ BIC #40,R1 ;YES. MAKE UPPER 10$: CMPEQ R1,(SP),PINDX1 ;SAME AS INITIAL LETTER OF PREVIOUS ONE? MOV R1,(SP) ;SAVE THIS CHARACTER CMP LINEC,$HDRSW ;AT TOP OF PAGE? ;CHS28A BLE PINDX1 ; YES, DON'T WANT A BLANK LINE ;CHS28A .IF NZ XSPNG ;CHS41 MOV XSPCNG,R2 ;SET SKIP COUNT ;CHS41 CALL SKIPN ;SKIP LINES ;CHS41 .IFF ;CHS41 CALL SKIP1 ;SKIP ONE LINE .ENDC ; -NZ XSPNG ;CHS41 .IF NZ XTSTPG ;CHS28B MOV #XTSTPG,R3 ;SET TEST COUNT ;CHS28B CALL TESTP ;CHECK IF PAGE SHOULD BE BROKEN ;CHS28B .ENDC ; NZ XTSTPG ;CHS28B PINDX1: MOV LMARG,R2 ;SPACE IN TO LEFT MARGIN .IIF NZ LAYOUT, ADD BASMRG,R2 ;INCLUDING BASE MARGIN ;CHS39 .IF NZ SUBIDX ;CHS51B MOV 4(R5),R3 ;POINT TO ASCII STRING ;CHS51B .IFTF ;CHS51B 10$: CALL NSPAC ;SPACE IN ;CHS51B .IFF ;CHS51B MOV 4(R5),S1 ;.. .IFT ;CHS51B MOV R3,S1 ;SET OUTPUT POINTER ;CHS51B 20$: TSTB (R3)+ ;SCAN FOR SUBINDEX FLAG ;CHS51B BGT 20$ ;CHS51B BEQ 40$ ; MARKS END OF STRING ;CHS51B CMP LINEC,$HDRSW ;AT TOP OF PAGE? ;CHS51C BGT 30$ ; NO, CONTINUE ;CHS51C CLRB -1(R3) ; YES, MARK END OF MAIN ENTRY ;CHS51C CALL PSTRAZ ;OUTPUT IT ;CHS51C MOV #CONMSG,S1 ; FOLLOWED BY " (continued)" ;CHS51C CALL PSTRAZ ;CHS51C CALL SKIPS ;START NEW LINE ;CHS51C MOV LMARG,R2 ;SPACE IN TO LEFT MARGIN ;CHS51C .IF NZ LAYOUT ;CHS39 CALL NSPACB ;SPACE OVER FROM BASE MARGIN ;CHS39 .IFF ;CHS39 CALL NSPAC ;CHS51C .ENDC ; -NZ LAYOUT ;CHS39 30$: MOVB XIDNT,R2 ;SET INDENT COUNT ;CHS51B BR 10$ ;OUTPUT THE SPACES ;CHS51B 40$: ;CHS51B .ENDC ; NZ SUBIDX ;CHS51B CLR XNSPCH ;CLEAR COUNT OF 'S ;CHS52A .IF NZ XENTRY ;CHS51A TSTNE 6(R5),50$ ;SKIP IF NOT JUST ENTRY ;CHS51C MOV NLPG,R2 ;CALCULATE SPACE LEFT ON PAGE ;CHS51C SUB LINEC,R2 ;CHS51C SUB NSPNG,R2 ;CHS51C DEC R2 ;CHS51C BGT 50$ ;START NEW PAGE IF NO SPACE... ;CHS51C MOV S1,-(SP) ;CHS51C CALL PAGEC ; ...FOR AT LEAST ONE SUB ENTRY ;CHS51C MOV (SP)+,S1 ;CHS51C MOV LMARG,R2 ;SPACE IN TO LEFT MARGIN ;CHS51C .IF NZ LAYOUT ;CHS39 CALL NSPACB ;SPACE OVER FROM BASE MARGIN ;CHS39 .IFF ;CHS39 CALL NSPAC ;CHS51C .ENDC ; -NZ LAYOUT ;CHS39 .IFTF ;CHS51A 50$: CALL PSTRAZ ;OUTPUT STRING OF ASCIZ .IFT ;CHS51A CLRB PAGOUT ;CLEAR PAGE-OUTPUT FLAG ;CHS51A TSTEQ 6(R5),PINDX2 ;SKIP IF NO PAGE NUMBER ;CHS51A PIND1: ;CHS51A .ENDC ; NZ XENTRY ;CHS51A MOV RMARG,R2 ;NOW GO TO MIDDLE OF LINE SUB LMARG,R2 ;IF NOT THERE YET ROR R2 ; .. .IF NZ IDXRM ;CHS52B INC R2 ;SAVE WHERE WE ARE ;CHS52B MOV R2,XMID ;CHS52B MOV R2,XPOS ;CHS52B DEC R2 ;CHS52B .ENDC ; NZ IDXRM ;CHS52B .IIF NZ LAYOUT, ADD BASMRG,R2 ;INCLUDING BASE MARGIN ;CHS39 SUB CPOS,R2 ;MINUS CURRENT POSITION ADD XNSPCH,R2 ;ADJUST FOR ANY 'S ;CHS52A BLE PIND2 ;THERE ALREADY ASR R2 ;EVEN NUMBER OF SPACES AND DOTS? BCC 10$ ;IF CC YES CALL CCSPC ;OUTPUT A SPACE 10$: MOV #INDMG,S1 ; .. CALL FMSG ; .. DEC R2 ;MIDDLE OF LINE? BGT 10$ ;IF GT NO PIND2: CALL CCSPC ;OUTPUT A SPACE .IIF NZ IDXRM, CALL TSTRM ;NEED TO START NEW LINE? MOV 10(R5),R1 ;CHAPTER/APPENDIX NUMBER? BEQ 30$ ;IF EQ NO BMI 10$ ;IF MI CHAPTER NUMBER ADD #'A-1,R1 ;CONVERT TO LETTER CALL FOUT ;OUTPUT APPENDIX DESIGNATION BR 20$ ; 10$: CLR R0 ;GET CHAPTER NUMBER BISB R1,R0 ; CALL DECPRT ;CONVERT CHAPTER NUMBER 20$: MOV #'-,R1 ;OUTPUT A DASH CALL FOUT ; 30$: MOV 6(R5),R0 ;GET PAGE NUMBER .IIF NZ XENTRY, INCB PAGOUT ;SET PAGE-OUTPUT FLAG ;CHS51A CALL DECPRT ;OUTPUT PAGE NUMBER PINDX2: MOV R5,R0 ;GET SUCCESSOR OF THIS ENTRY MOV (R0),R5 ; BEQ PINDXX ;END OF LIST? JUMP IF SO. CMPNE 4(R5),4(R0),PINDX3 ;NEXT ITEM DIFFERENT FROM CURRENT? ; CMPNE 6(R5),6(R0),10$ ;;PAGE NUMBERS DIFFERENT? ;CHS21D ; CMPEQ 10(R5),10(R0),PINDX2 ;CHAPTER/APPENDIX MATCH? ;CHS21D 10$: .IF NZ XENTRY ;CHS51A TSTEQ 6(R5),PINDX2 ;SKIP IF NEW RECORD IS "ENTRY" ;CHS51A TSTNE 6(R0),20$ ;CONTINUE NORMALLY IF OLD NOT "ENTRY" ;CHS51A TSTEQB PAGOUT,PIND1 ;OUTPUT DOTS IF FIRST NUMBER ;CHS51A 20$: ;CHS51A .ENDC ; NZ XENTRY ;CHS51A MOV #',,R1 ;PUT COMMA BETWEEN PAGE NUMBERS CALL FOUT BR PIND2 ;AND THEN OUTPUT NUMBER PINDX3: CALL SKIPS ; .. .IF NZ IDXRM ;CHS52B JMP PINDL1 ;GO ON TO NEXT ITEM IN LIST ;CHS52B .IFF ;CHS52B BR PINDL1 ;GO ON TO NEXT ITEM IN LIST .ENDC ; -NZ IDXRM ;CHS52B PINDXX: CALL SKIPS ; .. MOV XTOP,XBOT CLR XFIRST .IIF NZ SKPFIX, CLR $IDXAC ;SIGNAL INDEX OUTPUT DONE ;CHS24 TST (SP)+ ;CLEAN STACK RETURN ; ; LOCAL SUBROUTINE TO MAKE SURE REFERENCES DO NOT EXCEED RIGHT MARGIN ;CHS52B .IF NZ IDXRM ;CHS52B TSTRM: MOV XPOS,R2 ;GET CURRENT SPACE AVAILABLE ;CHS52B SUB #2,R2 ;ADJUST FOR SPACE & COMMA ;CHS52B MOV 10(R5),R1 ;GET CHAPTER/APPENDIX NUMBER ;CHS52B BEQ 30$ ;SKIP IF NONE ;CHS52B BMI 10$ ;NEGATIVE INDICATES CHAPTER ;CHS52B DEC R2 ;ADJUST FOR APPENDIX LETTER ;CHS52B BR 20$ ;CHS52B 10$: CLR R0 ;ADJUST FOR CHAPTER NUMBER ;CHS52B BISB R1,R0 ;CHS52B CALL PPGNO ;CHS52B 20$: DEC R2 ;ADJUST FOR DASH ;CHS52B 30$: MOV 6(R5),R0 ;GET PAGE NUMBER ;CHS52B CALL PPGNO ;ADJUST FOR IT ;CHS52B TSTEQ $SBPSW,40$ ;SUBPAGE? ;CHS52B DEC R2 ; YES, COUNT LETTER ;CHS52B 40$: MOV R2,XPOS ;SAVE NEW SPACE AVAILABLE ;CHS52B BGE 50$ ;OKAY IF THERE IS SOME ;CHS52B CALL SKIP1 ;ELSE, START NEW LINE ;CHS52B MOV XMID,R2 ;FIGURE SPACING TO MIDDLE ;CHS52B MOV R2,XPOS ;CHS52B .IF NZ LAYOUT ;CHS39 CALL NSPACB ;SPACE OVER FROM BASE MARGIN ;CHS39 .IFF ;CHS39 CALL NSPAC ;OUTPUT THAT MANY SPACES ;CHS52B .ENDC ; -NZ LAYOUT ;CHS39 BR TSTRM ;ADJUST FOR PENDING REFERENCE ;CHS52B 50$: RETURN ;CHS52B .ENDC ; NZ IDXRM ;CHS52B .END