.TITLE PINDX .IDENT /BL1.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 MAXPOS: .BLKW 1 ; Maximum position in line 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 RMARG,R0 ADD RIGSHI,R0 ADD EBSIZ1,R0 ADD EBSIZ2,R0 MOV R0,MAXPOS 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 BITNEB #X.SEN,STAT,45$ ; Is this subentry ? CALL GBYT ; get first char CMPEQB GCTABL(R1),#GC.UC,30$ ; first letter upper case? BIC #40,R1 ; no make upper 30$: MOVB R1,LCHAR ; save it MOV BF.FUL(R3),R1 ; Current index DEC R1 ; Now previous one CALL FNDBF ; Backspace by 1 char MOVB LCHAR,R1 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$: CALL INDEN2 BITEQ #X.ENT,STAT,70$ ; no entry to print MOV #TX2BF,R3 CALL CLRBF CLR TTSAV MOV CPOS,R2 ; Current position 50$: MOV #INXBF,R1 ; index buffer CALL GBYT1 ; Get 1 byte from index buffer BEQ 60$ ; Done ? INC R2 CALL PBYT ; Print it CMPNEB R1,#SPC,55$ ; Not space ? MOV INXBF+BF.FUL,TTSAV ; Rewind location CALL PSTRPA ; output it CALL CLRBF MOV CPOS,R2 55$: CMP R2,MAXPOS ; Check current position BLE 50$ ; Ok ? TSTEQ TTSAV,57$ ; Get last position MOV #INXBF,R1 ; index buffer CALL GBYT1 ; Get 1 byte from index buffer CMPEQB R1,#SPC,57$ ; Space ? MOV #INXBF,R3 ; Get index buffer MOV TTSAV,R1 ; Get last index CALL FNDBF ; Go back BR 58$ 57$: CALL PSTRPA ; Output the line 58$: CALL SKIPS ; Skip a line BR 45$ ; Continue till done 60$: MOV #SPC,R1 CALL PBYT CALL PSTRPA ; output it 70$: CALL SETTMP ; Set up temporary buffer 80$: TSTEQ (SP),95$ ; No numbers to convert ? MOV #TX2BF,R3 ; temporary buffer MOV BF.FUL(R3),TTSAV ; current index MOV #" ,R1 ; Blanks to pad TSTEQ TTSAV,90$ ; No numbers already ? MOV #", ,R1 ; comma between entries MOV #TX2BF,R3 ; temporary buffer 90$: CALL PWRD 95$: CALL PAGCV ; Convert page number into buffer MOV CPOS,R2 ; current position ADD BF.FUL(R3),R2 ; plus pending numbers CMP R2,MAXPOS ; are we past right margin BLT 160$ ; no BITEQB #X.ENT,STAT,100$; Not currently entry ? CALL SKIPS CALL TESTL ; Test if at end of page CALL INDENT ; And indent it BR 160$ ; Get next entry 100$: MOV TTSAV,R1 ; output buffer index BEQ 110$ ; Must output ? CALL RSTBF ; backup temporary buffer MOV LINK,FLINK ; backup input 110$: MOV MAXPOS,R2 ; NOW find how much padding? MOV #TX2BF,R3 ; temporary buffer MOV BF.FUL(R3),R0 ; Get resident # of bytes BEQ 150$ ; None to output SUB R0,R2 ; Subtract from max allowed SUB CPOS,R2 ; minus current position INC R2 BLE 140$ ; No room to justify ? BITEQ #JUSTF,F.1,140$ ; Justify flag not on? MOV R2,-(SP) BR 122$ 120$: BITEQ #FILLF,F.1,122$ ; Fill flag not on? MOVB #'.,R1 ; Ellipses ? BITEQ #1,(SP),123$ ; Yes ? 122$: MOV #SPC,R1 ; Output 1 space 123$: CALL CCPRN DEC (SP) ; Decrement counter BGT 120$ ; Till done TST (SP)+ ; Pop counter 140$: MOV #TX2BF,R3 ; Temporary buffer for page # CALL PSTRPA ; output it 150$: CALL NEWLIN ; Set up temporary buffer JMP 20$ 160$: CALL GPAG ; next entry BCS 110$ ; finish up 180$: BITNE #X.ENT,STAT,110$ ; new entry? TSTNEB DIFTST,80$ ; Non identical number ? 170$: TSTNE (SP)+,170$ ; no, kill this number BR 160$ ; Try next one ; ; Indent the text ; INDENT: CLR R2 INDEN2: MOVB STAT,R0 ; Get extra indent for subindex BIC #177770,R0 ; Get subindex number ADD R0,R2 ; Extra indentation ADD R0,R2 ; Extra indentation 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 MOV R2,R0 ; Proposed margin ADD #10.,R0 CMP R0,MAXPOS ; Too large margin ? BLE 10$ ; No ? MOV MAXPOS,R2 SUB #10.,R2 ; Indent leaving 10 spaces 10$: CALL NSPAC ; .. RETURN ; ; 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$: BITEQ #X.PAG,R2,70$ ; no page ? 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) ; ; Set up temporary buffer ; NEWLIN: CALL SKIPS CALL TESTL ; Test if at end of page SETTMP: MOV #TX2BF,R3 ; temporary buffer CALL CLRBF ; set it for input CLR TTSAV RETURN .END