.TITLE PINDX .IDENT /M03.1/ ;This program has been completely rewritten by: J. CLEMENT ; The original prototype was a written by L. WADE. ; ; ; ; PRINT INDEX COMMAND ; ; COMMAND ROUTINE IS ENTERED WITH: ; ; R4=ADDRESS OF NUMBER CONVERSION ROUTINE. ; ; LOCAL DATA ; ; OUTPUT TEXT ; .PSECT TEXT,D,RO,LCL,CON DOTXT: .ASCIZ /INDEX/ ; INDEX HEADING INDMG: .ASCIZ / ./ ; INDEX ELIPSIS TEXT BLKMG: .ASCIZ / / ; 2 spaces .EVEN .psect $TEMP,D,RW,GBL,OVR STAT: .BLKW 1 ; input status LINK: .BLKW 1 ; current link FLINK: .BLKW 1 ; foreward link TTSAV: .BLKW 1 ; temporary buffer index FIRST: .BLKW 1 ; last leading character LCHAR: .BLKW 1 ; current leading char NIND: .BLKW 1 ; Indentation for numbers CHSAV: .BLKW 1 ; Save chapter/appendix PAGSAV: .BLKW 1 ; Last page number SBPSAV: .BLKW 1 ; Last subpage number DIFTST: .BLKB 1 ; Non zero if current nunmber not = last STSAV: .BLKB 1 ; Previous status ; ; DO INDEX COMMAND ; .PSECT $CODE,RO,I,LCL DOINX:: TSTEQB $INXSW,5$ ; INDEXING ENABLED? RETURN ; 5$: BISB #100,$CBRSW ; STOP CHANGE BAR MOV #TTLBF,R3 ; CLEAR TITLE BUFFER CALL CLRBF MOV #STLBF,R3 ; CLEAR SUBTITLE CALL CLRBF MOV PLMRG,LMARG ; Reset left margin MOV PRMRG,RMARG ; SET RIGHT MARGIN MOV PLMRG,LMARG MOV PTMRG,TMARG MOV PSPNG,NSPNG ; Permanent spacing CALL PAGRST ; New page and reset page number MOV #14.,R2 ; SET LINE COUNT CALL SKIPN ; SKIP SEVEN LINES CALL SETTL ; MOVE TITLE TO TITLE BUFFER TSTNE BF.SPC(R3),30$ ; TITLE SPECIFIED? MOV #DOTXT,R2 ; POINT TO DEFAULT TEXT 20$: MOVB (R2)+,R1 ; GET NEXT BYTE BEQ 30$ ; IF EQ DONE MOV #TTLBF,R3 ; POINT TO TITLE DESCRIPTOR CALL PBYT ; WRITE CHARACTER IN BUFFER INC BF.SPC(R3) ; INCREMENT CHAR COUNTER BR 20$ ; 30$: MOV RMARG,R2 ; CALCULATE SPACE COUNT TO CENTER TITLE TEXT SUB BF.SPC(R3),R2 ; ASR R2 ; ADD RIGSHI,R2 ; ADD ON SHIFT CALL NSPAC ; SPACE TO TEXT POSITION MOV #TTLBF,R3 ; SET ADDRESS OF LINE DESCRIPTOR CALL PSTRPA ; OUTPUT NOTE TEXT MOV #LINSP,R2 ; SET LINE COUNT CALL SKIPN ; SKIP LINES MOVB APNDN,-(SP) ; SAVE CURRENT APPENDIX MOVB #'I-'A+1,APNDN ; SET APPENDIX TO 'I' FOR INDEX CALL PINDX ; PRINT THE INDEX MOVB (SP)+,APNDN ; RESTORE APPENDIX NUMBER RETURN ; ; ; PRINT INDEX COMMAND ; PINDX:: MOV #INXBF,R3 ; get index buffer CLRB FIRST ; first letter CLR STAT ; no status CALL BEGBF ; Start at beginning CALL GWRD BCC 10$ ; no index items? 1$: CLR XFIRST ; declare index empty CALL CLRBF ; clear buffer also RETURN 10$: MOV R1,FLINK 20$: BITNE #X.ENT,STAT,25$ ; already have entry? CALL GPAG ; Get first page of data BCS 1$ ; Nothing to index BITEQ #X.ENT,STAT,40$ ; no entries? 25$: MOV #INXBF,R3 ; index buffer CALL GBYT ; get first char MOVB R1,LCHAR ; save it CMPEQB GCTABL(R1),#GC.UC,30$ ; first letter upper case? BIC #40,R1 ; no make upper 30$: CMPEQB R1,FIRST,45$ ; SAME AS INITIAL LETTER OF PREVIOUS ONE? MOVB R1,FIRST ; SAVE THIS CHARACTER CALL TESTL ; Test if at end of page TSTEQB $PAGBR,45$ ; Already broken? MOV PARSP,R1 ; Get spacing BEQ 35$ ; None? CALL SKIPL ; Skip N lines 35$: MOV PARPT,R1 ; Paragraph test page CALL TESTT ; Check if enough lines available BR 45$ 40$: CALL TESTL ; Test if at end of page MOV PARIND,R2 ; Indent non index item BR 46$ 45$: CALL TESTL ; test if at end of page CLR R2 46$: ADD LMARG,R2 ; SPACE IN TO LEFT MARGIN ADD RIGSHI,R2 ; ALLOW FOR RIGHT SHIFT ADD EBSIZ1,R2 ; add change bar shift ADD EBSIZ2,R2 CALL NSPAC ; .. BITEQ #X.ENT,STAT,60$ ; no entry to print MOV #INXBF,R3 ; index buffer MOV BF.FUL(R3),R1 ; Current index DEC R1 ; Now previous one CALL FNDBF ; Backspace by 1 char CALL CCOUT 55$: MOV #5,R2 ; Spacing between name and number BITNE #JUSTF,F.1,60$ ; Justify? CALL NSPAC ; .. 60$: MOV #TTBF,R3 ; temporary buffer CALL CLRBF ; set it for input CALL CCSPC ; insert space BITEQ #1,CPOS,70$ ; even number position? BITEQ #JUSTF,F.1,70$ ; No justity? CALL CCSPC ; no insert 1 space to make even 70$: MOV #TTBF,R3 ; MOV BF.FUL(R3),TTSAV ; current index BR 90$ ; skip comma 80$: MOV #", ,R1 ; comma between entries MOV #TTBF,R3 ; temporary buffer MOV BF.FUL(R3),TTSAV CALL PWRD 90$: CALL PAGCV ; Convert page number into buffer MOV CPOS,R2 ; current position SUB RIGSHI,R2 ; minus right shift SUB EBSIZ1,R2 ; minus extra shift ADD EBSIZ2,R2 ADD BF.FUL(R3),R2 ; plus pending numbers CMP R2,RMARG ; are we past right margin BLT 160$ ; no MOV LINK,FLINK ; backup input MOV #TTBF,R3 ; temporary buffer MOV TTSAV,R1 ; output buffer index CALL RSTBF ; backup temporary buffer 110$: MOV RMARG,R2 ; NOW find how much padding? ADD EBSIZ1,R2 ; minus shift ADD EBSIZ2,R2 ADD RIGSHI,R2 ; minus shift MOV #TTBF,R3 ; temporary buffer SUB BF.FUL(R3),R2 ; minus numbers to print SUB CPOS,R2 ; minus current position BITEQ #JUSTF,F.1,140$ ; Justify flag not on? 120$: CMP R2,#1 ; no more ellipses BLE 130$ ; THERE ALREADY 122$: MOV #SPC,R1 ; Output 1 space CALL CCPRN BITEQ #FILLF,F.1,123$ ; Fill flag not on? MOV #'.,R1 ; No, Pad with ellipses 123$: CALL CCPRN SUB #2,R2 ; End of padding? BR 120$ 130$: INC R2 ; compensate position BEQ 140$ CALL NSPAC ; 1 blank 140$: MOV #TTBF,R3 ; Temporary buffer for page # CALL PSTRPA ; output it CALL SKIPS JMP 20$ 160$: CALL GPAG ; next entry BCS 110$ ; finish up BITNE #X.ENT,STAT,110$ ; new entry? ; BR 80$ ; *** DEBUG TSTNEB DIFTST,80$ ; Non Identical number ? 170$: TSTNE (SP)+,170$ ; no, kill this number BR 160$ ; Now try next number ; ; Subroutine to get initial params ; GPAG: MOV (SP)+,R4 ; unstack CLR STAT ; initial status MOV #INXBF,R3 ; index buffer MOV FLINK,R1 ; next entry MOV R1,LINK ; save current entry BEQ 110$ ; no more? 10$: CALL FNDBF ; get it CALL GWRD ; get foreward linkk BCS 100$ ; End of buffer MOV R1,FLINK ; save it CALL GBYT ; status BITEQ #X.ENT,R1,20$ ; New entry ? CLR PAGSAV ; Clear page number so no match 20$: MOV R1,STAT ; save it MOV R1,R2 CLR -(SP) ; end of numbers CLRB DIFTST ; Initially no differences BIC #^C,R1 ; Clear out non relevant bits CMPEQB STSAV,R1,30$ ; Status same ? INCB DIFTST ; No 30$: MOVB R1,STSAV ; Save current status BITEQ #X.AP,R2,50$ ; no appendix? CALL GBYT ; get appendix MOV APNDSP,-(SP) ; set the format MOVB R1,(SP) ; save it CMPEQ R1,CHSAV,50$ ; Appendix same ? INCB DIFTST ; No MOV R1,CHSAV 50$: BITEQ #X.CH,R2,60$ ; no chapter? CALL GBYT ; get chapter MOV CHPDSP,-(SP) ; set the format MOVB R1,(SP) ; save it CMPEQ R1,CHSAV,60$ ; Chapter same ? INCB DIFTST ; No MOV R1,CHSAV 60$: CALL GWRD ; get page number MOV R1,-(SP) ; save it CMPEQ R1,PAGSAV,70$ ; Page same ? INCB DIFTST ; No MOV R1,PAGSAV 70$: BITEQB #X.SPG,R2,80$ ; no subpage? CALL GBYT ; get subpage MOV SUBDSP,-(SP) ; set format MOVB R1,(SP) ; save it CMPEQ R1,SBPSAV,80$ ; Subpage same ? INCB DIFTST ; No MOV R1,SBPSAV 80$: CLC ; OK! 100$: JMP (R4) ; return 110$: SEC ; mark it as end JMP (R4) .END