.TITLE INDEX .IDENT /M03/ ; ; This is a completely rewritten version of INDEX designed ; to word with the dynamic memory routines. ; ; J. CLEMENT September 1982 ; ; INDEX COMMAND ; ; LOCAL DATA .psect $TEMP,RW,D,GBL,OVR ; ; Impure data section ; BLINK: .BLKW 1 ; Points back to last item LINK: .BLKW 1 ; Points to current item FLINK: .BLKW 1 ; Points to next item PSTAT: .BLKW 1 ; Page difference STAT: .BLKW 1 ; Status byte ; ; Table format: ; ; byte 1+2 Foreward link to next entry ; byte 3 Status byte X.SPG==100 ; Subpage byte present X.PAG==40 ; Page bytes present X.CH==20 ; Chapter byte present X.AP==10 ; Appendix byte present X.ENT==200 ; Index entry follows page/chapter.. bytes ; X.SEN=7 ; these bits number subentries. ; byte 4-n ; Subpabage/page/chapter/appendix bytes ; byte n+1-m ; Index entry if X.ENT ; .psect $CODE,ro,i,LCL,con ;+ ; **-INDEX-ADD INDEX ITEM TO INDEX DATA ;- INDEX:: CALL $FRCND ;FORCE TO LOGICAL END OF COMMAND CLR BLINK ; clear links CLR LINK CLR FLINK MOV #TTBF,R3 ; BUFFER TO GET TITLE CALL SETBF ; GET TITLE TSTEQB $INXSW,10$ ; INDEXING ENABLED? RETURN ; NO 10$: CLR R1 CALL PBYT ; Insert null into title MOV #INXBF,R3 ; Index buffer TSTEQ XFIRST,STARTX ; not first time for indexing CALL BEGBF ; Set to start of buffer CALL GWRD ; get foreward link MOV R1,FLINK ; foreward link 20$: CALL GETLNK ; Get link and status BCS 100$ ; None so save current entry CALL TSTP ; Skip over page entry BITEQ #X.ENT,STAT,20$ ; No entry to try? CALL TSTS ; Test the string BGT 20$ ; Input string > table entry BNE 100$ ; New entry/ save it 30$: TSTEQ PSTAT,80$ ; Page number same also? CALL GETLNK ; Get next link BCS 50$ ; At end of table BITNE #X.ENT,STAT,50$ ; End of page numbers only? CALL TSTP ; test page number against table BEQ 80$ ; found one the same BR 30$ 50$: CLR STAT ; Do not store string, only page numbers JMP KEEP 80$: RETURN 100$: MOV #X.ENT,STAT ; Status/ save all JMP KEEP ; Keep string and page numbers in table ; ; Subroutine to Keep the entry + fill in page number etc. ; STARTX:: CALL CLRBF DEC XFIRST ; set not first MOV #X.ENT,STAT ; first entry status CLR R1 ; clear word CALL PWRD ; for first link BR KEEP1 KEEP: CALL ENDBF ; Get end buffer address KEEP1: MOV BF.FUL(R3),R2 ; Final index MOV BLINK,R1 ; Backward link CALL FNDBF ; go to it MOV R2,R1 ; last buffer address CALL PWRD ; link it in CALL ENDBF ; back to end buffer 5$: MOV LINK,R1 ; foreward link CALL PWRD ; link it in MOV STAT,R1 ; Initial status TSTNE $CHPSW,20$ ; no chapter print? TSTEQB APNDN,10$ ; No appendix? BIS #X.AP,R1 ; Set appendix status BR 20$ ; no chapter if appendix 10$: TSTEQB CHPTN,20$ ; No chapter? BIS #X.CH,R2 20$: TSTEQ PAGENO,30$ ; No pagenumber? BIS #X.PAG,R1 30$: TSTEQ SUBPGE,40$ ; No subpage? BIS #X.SPG,R1 40$: MOVB R1,STAT ; Save total status CALL PBYT ; Store status MOV R1,R2 ; Save BITEQ #X.AP,R2,50$ ; no appendix? MOVB APNDN,R1 CALL PBYT ; put appendix 50$: BITEQ #X.CH,R2,60$ ; no chapter? MOVB CHPTN,R1 CALL PBYT ; put chapter 60$: BITEQB #X.PAG,R2,70$ ; no page number? MOV PAGENO,R1 BIS PAGDSP,R1 ; set current format 65$: CALL PWRD ; put chapter 70$: BITEQB #X.SPG,R2,80$ ; no subpage? MOVB SUBPGE,R1 CALL PBYT ; put subpage 80$: BITEQB #X.ENT,R2,100$ ; NOT Save entry? MOV #TTBUF,R2 ; Entry buffer 90$: MOVB (R2)+,R1 ; get byte CALL PBYT ; save it TSTNE R1,90$ ; more to come? 100$: RETURN ; ; Subroutine to get next link ; GETLNK: MOV LINK,BLINK MOV FLINK,LINK ; stack the links MOV FLINK,R1 ; next entry BEQ 20$ ; no more CALL FNDBF ; find it CALL GWRD ; get next foreward link BCS 10$ ; end of input MOV R1,FLINK ; next foreward link CALL GBYT ; get status byte MOV R1,STAT ; save status CLC ; Success for next entry 10$: RETURN 20$: SEC ; end of buffer RETURN ; ; Subroutine to compare current page with stored page ; TSTP: MOV STAT,R2 ; get status CLR PSTAT ; matches so far BITEQ #X.AP,R2,10$ ; no appendix? CALL GBYT ; get appendix CMPEQB APNDN,R1,40$ ; equal? MOV SP,PSTAT ; not equal BR 40$ 10$: TSTEQ APNDN,20$ ; appendix not exist? MOV SP,PSTAT ; not equal 20$: BITEQ #X.CH,R2,30$ ; no chapter? CALL GBYT ; get chapter CMPEQB CHPTN,R1,40$ ; equal? MOV SP,PSTAT ; not equal BR 40$ 30$: TSTEQ CHPTN,40$ ; chapter not exist? MOV SP,PSTAT ; not equal 40$: BITEQB #X.PAG,R2,50$ ; no page number? CALL GWRD ; get page number CMPEQ PAGENO,R1,60$ ; equal? MOV SP,PSTAT ; not equal BR 60$ 50$: TSTEQ PAGENO,60$ ; page number not exist? MOV SP,PSTAT ; not equal 60$: BITEQB #X.SPG,R2,70$ ; no subpage? CALL GBYT ; get subpage CMPEQB SUBPGE,R1,80$ ; not equal? MOV SP,PSTAT ; not equal BR 80$ 70$: TSTEQ SUBPGE,80$ ; subpage not exist? MOV SP,PSTAT ; not equal 80$: TST PSTAT RETURN ; with status EQ,NE ; ; Subroutine to compare input string to table ; TSTS: MOV #TTBUF,R2 ; Input string address 10$: CALL GBYT ; get table entry BIC #^C<177>,R1 ; strip char. CMPNEB GCTABL(R1),#GC.LC,20$ ; Not lower case? SUB #40,R1 ; Convert to upper case 20$: MOVB (R2)+,R0 ; input string char BEQ 50$ ; Done? BEQ 50$ ; end of string? BIC #^C<177>,R0 ; strip char. CMPNEB GCTABL(R0),#GC.LC,30$ ; Not lower case? SUB #40,R0 ; Convert to upper case 30$: CMPEQ R0,R1,10$ ; same, continue RETURN 50$: CMP R0,R1 ; final compare RETURN .END