.TITLE SUPER INDEX SBROUTINES .SBTTL DEFINITIONS .IF NDF,RSX .MCALL .WRITW,.READW,.CLOSE .MCALL .PRINT,.EXIT .GLOBL OUTBUF,SUPBUF,IOARA,OUTBLK,FLOBLK,FLOPTR,FLOBUF .IFF .MCALL GET$,PUT$,QIOW$S,CLOSE$,OPNT$D,PRINT$,EXIT$S .GLOBL SPOOL,FLOFIL .ENDC .GLOBL SAVSUP,PNAME,BLNK,SNAME,SUPPTR,SUPBLK,DOFLOW,DOFLOW .GLOBL SUPER,OUTSUP,HIGHAV,HIGPTR,LOWAV,LOWPTR .GLOBL SRCSYM,VRSTPT,PRTLIN,PUTCHR,NOLINE,ENDLIN,CHRWD .GLOBL RAD50U,ERRCNT,SPOOL .PSECT SUPER,I,RO,GBL .PAGE .SBTTL SAVE VAR NAME IN SUPER INDEX FILE SAVSUP: .IF NDF,RSX MOV SUPPTR,R0 ; GET POINTER TO NEXT STORAGE LOC ; IN SUPER OUTPUT BUFFER .IFF MOV #SUPREC,R0 .IFTF CMP #135600,(R4) ; WAS VAR ACTUALLY A LABEL BLOS XIT ; IF YES-DONT WANT LABELS MOV (R4),(R0) ; SAVE VAR NAME MOV 2(R4),2(R0) ; IN RAD 50 FORMAT MOV PNAME,4(R0) ; DITTO FOR PROGRAM NAME MOV PNAME+2,6(R0) ; EACH VAR IS ENTERED ONCE PER PROGEM INTO THE SUPER INDEX BUFFER ; USEING A 4 WORD FORMAT ;WORD 1 VAR NAME HIGH(RAD 50) ;WORD 2 VAR NAME LOW ;WORD 3 PROGRAM NAME USEING VARIABLE(RAD 50) ;WORD 4 PROGRAM NAME LOW .IFT ADD #8.,SUPPTR ; INC TO NEXT ENTRY BLOCK CMP SUPPTR,#SUPBUF+512. ; BUFFER FULL BLO XIT ; IF YES DONE FOR THIS VAR .WRITW #IOARA,#14,#SUPBUF,#256.,SUPBLK ; WRITE IT OUT AND REFRESH BCC 1$ TST DOFLOW BNE 77$ .PRINT #SIOUF ; LOG OVERFLOW ERROR ON TERMINAL BISB #4,@#53 SUB #8.,SUPPTR ; BACK UP POINTER .IFF PUT$ #SUPFIL,#SUPREC,#8. BCC 1$ TST DOFLOW BNE 77$ QIOW$S #IO.WLB,#9.,#1,,,,<#SIOUF,#61.,#40> .IFTF INC ERRCNT CLR SUPER ; STOP SUPER INDEXING BR XIT ; AND GO 77$: .IFT .PRINT #FLOEXT BISB #10,@#53 .EXIT .IFF QIOW$S #IO.WLB,#9.,#1,,,,<#FLOEXT,#80.,#40> EXIT$S 1$: .IFT 1$: INC SUPBLK ; NEXT BLOCK MOV #SUPBUF,SUPPTR ; UPDATE POINTER MOV #SUPBUF,R0 MOV #256.,R1 2$: CLR (R0)+ DEC R1 BGT 2$ .ENDC XIT: RTS PC SIOUF: .ASCIZ / INDEX-W-SUPER INDEX DISK BUFFER OVERFLOW-SUPER INDEX ABORTED/ FLOEXT: .ASCII / INDEX-F-SUPER INDEX DISK BUFFER OVERFLOW DURING ENTRY POINT/ .ASCIZ / INDEX-INDEX ABORTED/ .EVEN .PAGE .SBTTL SORT THE SUPER INDEX FILE AND OUT PUT IT .IF DF,RSX SUPREC: .WORD 0,0,0,0 ENDSUP: .WORD -1,-1,-1,-1 .ENDC OUTSUP: MOV HIGHAV,HIGPTR MOV LOWAV,LOWPTR ; SET UP SYMBOL TABLE POINTERS CLR VRSTPT MOV #-2,SRCSYM .IF NDF,RSX .IFF PUT$ #SUPFIL,#ENDSUP,#8. CLR R1 MOV #1,R2 CLR R3 CALL .POINT ;REWIND SUPER INDEX FILE .IFTF ; THERE ARE THREE TYPES OF BLOCKS USED HERE ; ONE IS THE DATA BLOCK STROED BY SAVSUP ; THE SECOND IS THE VAR NAME BLOCK STORED AT THE BEGINNING ; OF THE BUFFER WORKING TOWARD HIGH MEMORY ; IT IS 4 WORD LONG AND HAS THE FOLLOWING FORMAT ; ;POINER POINTS HERE WORD 1 VAR NAME HIGH(R 50) ; WORD 2 VAR NAME LOW ; WORD 3 ADDR OF FIRST HOW USED BLOCK ; WORD 4 ADD OF NEXT VAR NAME BLOCK ; ; ; THE HOW HSED BLOCKS START AT HIGH MEMORY AND WORK ; DOWN, THER ARE 3 WORD LONG ; ; WORD 1 PROGRAM MANE HIGH(R 50) ; WORD 2 PROGRAM NAME LOW ;POINTER POINTS HERE WORD 3 ADD OF NEXT HOW USED BLOCK ; LOOP: .IFT SUB #8.,SUPPTR ; THE SUPER INDEX BUFER IS EMPTIED LIFO CMP #SUPBUF,SUPPTR ; EMPTIED THIS BUFFER BLOS 1$ ; NO SKIP TST SUPBLK ; HAS LAST BLOCK BEEN READ IN BNE 2$ JMP DMPSPR ; YES-GO DUMP SUPER INDEX 2$: DEC SUPBLK .READW #IOARA,#14,#SUPBUF,#256.,SUPBLK ; ELSE GET NEW BLOCK MOV #SUPBUF+512.-8.,SUPPTR ; RESET POINTER .IFF GET$ #SUPFIL,#SUPREC,#8. BCS 2$ ;ANY ERROR IS EOF CMP #-1,SUPREC ;CHECK FOR HOME MADE EOF BLOCK BNE 1$ 2$: JMP DMPSPR ;GO DUMP SUPER INDEX .IFTF 1$: TST VRSTPT ; IS THIS THE FIRST VAR BEQ FSTIM ; GO HANDEL SEPERATE .IFT MOV SUPPTR,R0 ; GET VAR .IFF MOV #SUPREC,R0 .IFTF MOV #VRSTPT-6,R1 ; SET UP REGISTERS MOV 6(R1),R2 MOV 6(R2),R3 ; R0=ADDR OF VAR TO BE INDEXED ; R1=ADD OF LAST VAR NAME BLOCK ; R2=ADDR OF CURR VN BLK ; R3=ADDR OF NEXT VN BLK CMPV: CMP (R2),(R0) ; MUST BE IN ALPHABETICAL ORDER BHI ENTRUN ; NEW ENTRY-GO ENTRER NEW VAR NAME BLO NXTVRB ; NOT YET-TRY NEXT CMP 2(R2),2(R0) ; BOTH WORD MUST MATCH BHI ENTRUN ; PAST ORDER-ENTER IT BLO NXTVRB ; NOT THERE YET BR ETRUSE ; ALREADY ENTERD- GO ADD HOW USED BLOCK NXTVRB: MOV R2,R1 ; UPDATE POINTERS MOV R3,R2 BEQ ENTEND ; OOPS-REACHED END OF LIST-ADD AT END MOV 6(R2),R3 ; UPDATE NEXT BR CMPV FSTIM: MOV #VRSTPT-6,R1 ; SIMULATE NORMAL ENTRY ENTEND: .IFT MOV SUPPTR,R0 .IFF MOV #SUPREC,R0 .IFTF MOV LOWPTR,6(R1) ; SET UP LAST POINTER MOV LOWPTR,R2 ; SET UP NEW LAST BLOCK MOV (R0),(R2) ; INSERT VNAM MOV 2(R0),2(R2) CLR 4(R2) ; NO HOPW USED BLOCK YET CLR 6(R2) ; AND LAST VNAM ADD #8.,LOWPTR ; UPDATE POINETR BR ETRUSE ; AND GO ADD HOW USED BNLOCK ENTRUN: MOV LOWPTR,R4 ; GET NEW BLOCK AREA MOV R4,6(R1) ; AND INSERT IT MOV R2,6(R4) MOV R4,R2 ; AND MAKE NEW CURR BLOCK MOV (R0),(R2) ; INSERT VANM MOV 2(R0),2(R2) CLR 4(R2) ; NO HOWUSED ADD #8.,LOWPTR ; UPDATE POINTER ETRUSE: TST 4(R2) ; NEW VAR BLK BEQ FSTUSE MOV R2,R1 ; SET UP REGISTERS ADD #4,R1 ; MAKE LOOK LIKE HOWMUSED BLOCK MOV (R1),R2 MOV (R2),R3 ; R1=LST HOW USE BLK ; R2=CURR ; R3=NXT CMPP: CMP -4(R2),4(R0) ; CHECK HIGH ORDER PNAME FOR ALPHABETICL BHI ENTRPN ; ORDER BLO NXTPRB CMP -2(R2),6(R0) ; DITTO LOW ORDER IF NEEDED BHIS ENTRPN ; INCASE 2 PROG SAME NAME SUPER'D-LIST BOTH NXTPRB: MOV R2,R1 ; UPDTATE POINGERS MOV R3,R2 BEQ ENTPND ; IF LAST-TACK ON END MOV (R2),R3 ; UPDATE NEXT BR CMPP FSTUSE: ADD #4,R2 ; SIMULATE PROPER ENTRY MOV R2,R1 ENTPND: MOV HIGPTR,(R1) ; PUT IN POINTER MOV HIGPTR,R3 SUB #6,HIGPTR ; ADJUSR POINTER CLR (R3) ; NO NEXT HOW USED BLOCK MOV 4(R0),-4(R3) ; LOAD PNAME MOV 6(R0),-2(R3) BR OVFLTS ; GO CHECK FOR OVERFLOW ENTRPN: MOV HIGPTR,R4 ; GET NEXT FREE HU BLOCK SUB #6,HIGPTR MOV R4,(R1) ; STICK BETWEEN LAST AND CURR MOV R2,(R4) MOV 4(R0),-4(R4) ; LOAD PNAME MOV 6(R0),-2(R4) OVFLTS: MOV LOWPTR,R0 ; CHECK TO SEE IF ROOM FRO ONE MORE ENTRY ADD #14.,R0 CMP R0,HIGPTR ; ROOM?? BLO NOOVFL ; YES-SKIP OVERFLOW HANDLER MOV #SOVFL,R0 JSR PC,PRTLIN .IFT .PRINT #SOVFL BISB #2,@#53 .IFF QIOW$S #IO.WLB,#9.,#1,,,,<#SOVFL,#41.,#40> .ENDC JSR PC,OUTSPR NOOVFL: JMP LOOP SOVFL: .ASCIZ / INDEX-W-SUPER INDEX SORT TABLE FULL-DUMP/ .EVEN DMPSPR: JSR PC,OUTSPR MOV #14,R0 ; FORMFEED AT END JSR PC,PUTCHR .IF NDF,RSX CMP OTBFPT,#OUTBUF BEQ 1$ ; CLOSE DOWN-DONE .WRITW #IOARA,#0,#OUTBUF,#256.,OUTBLK 1$: .CLOSE #0 MOV #SUPBUF,SUPPTR ; UPDATE POINTER MOV #SUPBUF,R0 MOV #FLOBUF,FLOPTR CLR FLOBLK MOV #FLOBUF,R2 MOV #256.,R1 2$: CLR (R0)+ CLR (R2)+ DEC R1 BGT 2$ CLR SUPBLK .IFF MOV #15,R0 JSR PC,PUTCHR TST SPOOL BEQ 8$ PRINT$ #LSTFIL BR 9$ 8$: CLOSE$ #LSTFIL 9$: MOV #SUPFIL,R0 CLR R1 MOV #1,R2 CLR R3 CALL .POINT MOV #FLOFIL,R0 CLR R1 MOV #1,R2 CLR R3 CALL .POINT .ENDC RTS PC OUTSPR: MOV #NOLINE,R0 JSR PC,PRTLIN MOV #VRSTPT-6,R4 ; SET UP FOR OUTPUT LB: MOV 6(R4),R4 ; GET NEXT V NAM BLK BEQ OUTDNE ; IF ZERO DONE MOV 4(R4),R5 ; SET UP HOW USED BLK MOV #SNAME,R0 ; SET UP TO OUTPUT VNAME MOV R4,R1 JSR PC,RAD50U ADD #2,R1 ; TWO RAD 50 WORDS JSR PC,RAD50U MOV #SNAME,R0 ; AND OUTPUT 8 CHRS JSR PC,PRTLIN BR 1$ 2$: MOV #BLNK,R0 ; MULTI LINE-NO V NAME JSR PC,PRTLIN 1$: MOV CHRWD,-(SP) ; SET UP OUTPUT CTR 3$: MOV #SNAME,R0 ; GET PNAME MOV R5,R1 SUB #4,R1 JSR PC,RAD50U ADD #2,R1 JSR PC,RAD50U MOV #SNAME,R0 JSR PC,PRTLIN ; CVT TO ASCII AND PRINTIT MOV (R5),R5 ; NEXT HOW USED BLOCK PLEAS BEQ 4$ ; IF DONE FINISH LINE DEC (SP) ; END OF LINE BNE 3$ ; NO CLR (SP)+ ; YES-SET UP NEW LINE MOV #ENDLIN,R0 JSR PC,PRTLIN BR 2$ 4$: MOV #ENDLIN,R0 JSR PC,PRTLIN ; SET UP FOR NEW LINE CLR (SP)+ BR LB OUTDNE: MOV HIGHAV,HIGPTR MOV LOWAV,LOWPTR CLR VRSTPT RTS PC .END