.TITLE MT10.. TABLE MANIPULATION ROUTINES .IDENT /MT10../ ; ; AUTHOR :- J.S.CLIFTON ; DATE :- 21ST OCTOBER 81. ; ; T$SQUEEZE:: T$SORT:: ; ENTRY CONDITIONS. ; NON ; ; EXIT CONDITIONS. ; INDEX 32767 (OCTAL '77777') HOLDS SORTED KEYS/ADDRESSES ; STATUS ; ; CALL N$SETUP ;IS THE TABLE SET UP. IFERROR RETURN ;RETURN IF NOT ; SAVE R0,R1,R2 ;SAVE THE REGISTERS. MOV TADDRESS,R0 TST R0 ;IS THERE A SORT STRING. BEQ 20$ ;BRANCH IF NOT. ; BIC #100000,-2(R0) ;UNPROTECT IT IF THERE IS. MOV #77777,R1 ;SET THE INDEX. CALL N$DELETE ;DELETE IT. CLR TFIRST ;CLEAR THE SORT MARKERS. CLR TLAST CLR TPRESENT CLR TADDRESS CALL N$SQUEEZE ;SQUEEZE THE TABLE PRIOR TO SORT. ; ; FIND NUMBER OF VALID ENTRIES IN TABLE. ; 20$: MOV NNODE,R0 ;R0 = NUMBER OF STRINGS. ; ; CREATE SORT NODE OF APPROPRIATE LENGTH. ; 40$: ASL R0 ;R0 * 4 (BYTES REQUIRED PER ENTRY) ASL R0 ADD #200,R0 ;ADD 32. MORE ENTRIES TO NODE LENGTH. ; MOV #77777,R1 ;SET SORT NODE MARKER. MOV R0,R2 ;REMEMBER MAX LENGTH. 45$: CALL N$CREATE ;CREATE THE SORT NODE IFSUCCESS 50$ ;CONTINUE IF SUCCESSFUL. CMP -(R2),-(R2) ;DECREMENT THE LENGTH BY 4. CMP R2,NNODE ;HAS STRING STILL A LENGTH GREATER THAN NODES. BLE 100$ ;EXIT WITH ERROR IF NOT MOV R2,R0 ;SET THE LENGTH BACK. BR 45$ ;OR TRY AGAIN. 50$: MOV R0,R2 ;MOVE ACCESS SORT NODE ADDRESS TO R2 MOV R0,TADDRESS ;REMEMBER SORT STRING ADDRESS TST -(R0) ;DECREMENT R0 MOV R0,TLAST ;SET TLAST ADDRESS CMP (R0)+,(R0)+ ;INCREMENT R0 MOV R0,TFIRST ;SET TFIRST ADDRESS. ; ; SORT EXISTING ENTRIES INTO NEW SORT STRING. ; MOV NFIRST,R0 ;GET THE FIRST NODE. MOV R0,NPRESENT MOV R0,NNEXT ; 60$: TST 2(R0) ;IF ITS THE LAST BEQ 80$ ; THEN EXIT LOOP BIT #100000,(R0) ;IF ITS DELETED BNE 70$ ; THEN IGNORE IT CMP (R0)+,(R0)+ ;INCREMENT ADDRESS CMP R0,TADDRESS ;IF ITS THE SORT STRING BEQ 70$ ;THEN IGNORE IT. CALL T$IKEY ;INSERT THE KEY IFERROR 100$ ;EXIT IF ERROR ; 70$: MOV NNEXT,R0 ;GET THE NEXT NODE. ADD #6,NNEXT MOV 2(R0),R0 BIC #100000,R0 ;CLEAR TOP BIT FOR ADDITION. ADD R0,NNEXT ;NNEXT NEXT NOW AT NEXT NODE. MOV NNEXT,R0 BR 60$ ;RE-LOOP ; ; 80$: MOV TADDRESS,R0 ;PROTECT THE SORT NODE. BIS #100000,-2(R0) ; 90$: SETSUCCESS 110$ ;EXIT SUCCESSFULLY. ; 100$: SETERROR ; 110$: UNSAVE R0,R1,R2 ; RETURN ; .END