; PINDX.MAC .TITLE PINDX .IDENT /M02.3/ TEMP: 0 INDMG: .ASCIZ / ./ .EVEN DOINX:: MOV XMSECT,-(SP) ;sector for default index BR DOX DOINXI::MOV XISECT,-(SP) BR DOX DOINXJ::MOV XJSECT,-(SP) BR DOX DOINXK::MOV XKSECT,-(SP) BR DOX DOINXL::MOV XLSECT,-(SP) BR DOX DOTOC:: MOV TCSECT,-(SP) DOX: ;common index code MOV (SP),TEMP ;save sector CLR $CBON ;stop change bar MOV TTLP1,TTLP2 ;clear title MOV STTLP1,STTLP2 ;and subtitle MOV #1,CHPTN ;needed to get appendix paging MOV #SPCNG,NSPNG ;initial spacing BIS #FILLF!JUSTF!PJUSTF,(5) ;set fill/justify flags CLR PAGENO ;reset page no. TSTNE LINEC,10$ ;at top of page? INC PAGENO INC ABSPAG 10$: CALL LDWRKS ;load index records TST XFIRST ;anything there? BEQ 40$ ;if not, skip MOVB DXAPN,APNDN ;set appendix SUB #'A-1,APNDN MOV #XTITLE,R3 MOV XTITLN,R2 ;length 20$: MOVB (3)+,R1 ;character MOV #TTLP1,R4 ;buffer CALL WCI ;write character to buffer DEC R2 BNE 20$ ;loop till done CALL PAGEC ;next page MOV TEMP,-(SP) CALL LDWRKS ;have to reload after footnote MOV #6,R2 ;skip 6 lines CALL SKIPN MOV RMARG,R2 ADD TTLP1,R2 SUB TTLP2,R2 ASR R2 ADD RIGSHI,R2 ;add on shifts (to center title) CALL NSPAC MOV #TTLP1,R4 TSTB DXTYP ;TOC itself? BEQ 30$ ;if yes, skip MOV #SDBUF,R5 MOVB DXAPN,(5)+ MOVB #'#,(5)+ ;one space MOV (4),R3 INC R3 ;point to text 25$: MOVB (3)+,(5)+ ;transfer text BEQ 27$ CMP R3,2(4) ;to end? BLOS 25$ CLRB (5)+ ;guard zero 27$: MOV R5,SDINP+2 ;set length of title CALL SETTOC ;enter into title info 30$: CALL PSTRPA ;output note text MOV #2,R2 CALL SKIPN ;skip MOV TEMP,-(SP) CALL LDWRKS ;reload index CALL PNDX ;print it 40$: RETURN PINDX:: MOV XMSECT,-(SP) BR PNDX0 PINDXI::MOV XISECT,-(SP) BR PNDX0 PINDXJ::MOV XJSECT,-(SP) BR PNDX0 PINDXK::MOV XKSECT,-(SP) BR PNDX0 PINDXL::MOV XLSECT,-(SP) PNDX0:: CALL LDWRKS ;load work space PNDX: MOV XFIRST,R5 ;first item BEQ PNDEX ;if empty, done INC IDXINP ;set index in progress CLR CRNTST ;clear current letter 10$: MOV 4(5),R1 ;next text MOVB (1),R2 CMP R2,#141 ;lower case? BLT 20$ BIC #40,R2 ;convert 20$: CMPB R2,CRNTST ;new letter? BNE 25$ ;if yes, skip TSTB DXTYP ;TOC? BNE 30$ ;if not, skip CMPB 1(1),CRNTST+1 ;next letter the same? BEQ 30$ ;if yes, skip skip 25$: MOVB R2,CRNTST MOVB 1(1),CRNTST+1 ;hold first two characters CALL SKIP1 30$: MOV LMARG,R2 ;space in ADD RIGSHI,R2 CALL NSPAC MOV 4(5),S1 ;assume it is unmangled string TSTB DXTYP ;TOC? BNE 40$ CALL EXPTCS ;jimmy string 40$: CALL PSTRAZ ;output string of ASCII CALL GTCOLM ;determine column SUB CPOS,R2 ;-current pos. BLE 60$ ASR R2 BCC 50$ CALL CCSPC ;extra space 50$: MOV #INDMG,S1 CALL FMSG ;dot-space DEC R2 BGT 50$ 60$: CALL CCSPC ;one more space MOV 10(5),R1 ;chapter/appendix BEQ 90$ ;if eq, no BMI 70$ ;neg. => chapter ADD #'A-1,R1 ;convert to letter CALL FOUT1 BR 80$ 70$: MOV R1,R0 COM R0 ;actual chapter no. CALL DECPRX 80$: MOV #'-,R1 CALL FOUT1 90$: MOV 6(5),R0 ;page no. CALL DECPRX 100$: MOV R5,R0 ;get next MOV (0),R5 BEQ PNDEX ;if no more done CMPNE 4(5),4(0),120$ ;different? CMPNE 6(5),6(0),110$ ;page different? CMPEQ 10(5),10(0),100$ ;if same chapter & page, skip 110$: MOV #',,R1 CALL FOUT1 CMP RMSPC,#4 ;space for another? BGT 60$ ;if yes, loop CALL SKIPS ;skip line CALL GTCOLM MOV #40,R1 ;spaces 116$: CALL FOUT DEC R2 BNE 116$ BR 60$ 120$: CALL SKIPS ;skip BR 10$ ;new item PNDEX: CALL SKIPS MOV WKSTOP,XBOT ;empty index CLR IDXINP ;no longerin progress CLR XFIRST RETURN ;done CRNTST: .WORD 0 ;holds current starting letters RMSPC: .WORD 0 ;holds remaining space on line GTCOLM: ;returns R2=start of right column TSTB DXTYP ;TOC? BNE 10$ ;if not, skip MOV RMARG,R2 SUB #8.,R2 ;simple here MOV R2,RMSPC ;remaining space RETURN 10$: MOV RMARG,R2 MOV R2,RMSPC SUB LMARG,R2 CLC ROR R2 ;3/4 MOV R2,-(SP) ASR R2 ADD (SP)+,R2 SUB R2,RMSPC ;space left on line RETURN DECPRX: MOV #10.,R1 ;use standard divide CALL $DIV MOV R1,-(SP) ;remainder TST R0 ;another character? BEQ 10$ CALL DECPRX ;recursive 10$: MOV (SP)+,R1 ;stored char. BISB #60,R1 FOUT1: DEC RMSPC ;less space JMP FOUT EXPTCS: ;expands TOC string MOV #TCS,R1 ;buffer MOV S1,R2 ;original string MOV R1,S1 CLR R3 CLR R4 10$: MOVB (2)+,R0 ;character BGE 40$ ;skip if normal MOV MXTOCN,R0 ;no. of spaces ADD #2,R0 ADD R4,R0 ;extra space per period SUB R3,R0 BLE 10$ 20$: MOVB #' ,(1)+ DEC R0 BNE 20$ BR 10$ 40$: INC R3 CMP #'.,R0 ;period? BNE 50$ CMPB (2),#'0 ;level header? BEQ 50$ ;if yes, dont count period INC R4 50$: MOVB R0,(1)+ BNE 10$ ;loop till done RETURN TCS: .BLKB 80. .END