.TITLE MT09.. TABLE MANIPULATION ROUTINE .IDENT /MT09../ ; ; AUTHOR :- J.S.CLIFTON ; DATE :- 21ST OCTOBER 81 ; ; ; T$CREATE:: ; ENTRY CONDITIONS ; R0 = MAX SIZE IN BYTES REQUIRED BY STRING ; R1 = MARKER TO LOCATE NODE WITH. ; ; EXIT CONDITIONS ; R0 -> ACCESS ADDRESS OF CREATED STRING IF STATUS = SUCCESS ; CMP #77777,R1 ;IF MARKER SAME AS SORT NODE BEQ 20$ ; THEN EXIT ERROR. ; CALL T$SETUP ;HAS TABLE BEEN SET UP. IFERROR RETURN ;IF ERROR THEN EXIT. ; CALL T$SCHK ;IS THERE ROOM IN SORT STRING IFERROR 5$ ;RESORT IF NOT. ; CALL N$CREATE ;IF NODE CREATED SUCCESSFULLY IFSUCCESS 10$ ; THEN CONTINUE ; 5$: CALL T$SQUEEZE ;SQUEEZE THE TABLE. IFERROR RETURN ;EXIT IF ERROR ; CALL T$SCHK ;IS THERE ROOM IN SORT STRING NOW. IFERROR 20$ ;EXIT IF NOT WITH ERROR ; CALL N$CREATE ;ELSE TRY TO CREATE AGAIN. IFERROR RETURN ;IF ERROR THIS TIME THEN RETURN. ; ; INSERT NEW SORT KEY. ; 10$: CALL T$IKEY ;INSERT CREATED ITEM IN SORT. IFERROR 20$ ;EXIT IF ERROR. ; EXITSUCCESS ; 20$: EXITERROR ; ; T$SCHK:: ;IS THER ROOM FOR SORT TABLE INSERT. ; EXIT CONDITIONS ; SUCCESS OR FAIL ; SAVE R0,R1 MOV TADDRESS,R0 MOV -2(R0),R1 BIC #100000,R1 CMP R1,(R0) BLE 10$ SETSUCCESS 20$ 10$: SETERROR 20$: UNSAVE R0,R1 RETURN ; ; T$IKEY:: ; ENTRY CONDITIONS ; R0 = ADDRESS OF STRING ; ; EXIT CONDITIONS ; R0 -> ACCESS ADDRESS OF INSERTED STRING IF STATUS = SUCCESS. ; ; MOV R0,TMADDR ;PUT ADDDRESS AND MARKER INTO MOV -4(R0),TMARKER ; STRING FORMAT. ; SAVE R0,R1,R2,R3,R4 ;SAVE THE REGISTERS. MOV TADDRESS,R0 ;GET TABLE STRING ADDRESS. MOV -2(R0),R1 ;ARE THERE 4 BYTES STILL FREE. BIC #100000,R1 ;CLEAR PROTECTION BIT. SUB (R0),R1 SUB #4,R1 ;IF NOT BLT 50$ ; THEN EXIT WITH ERROR. ; ; FIND INSERT STRING POSITION. ; MOV TADDRESS,R2 ;GET THE ADDRESS OF SORT NODE BIC #100000,-(R2) ;CLEAR WRITE PROTECT. MOV TFIRST,R1 ;R1 = MASTER STRING FIRST INDEX ;R2 = SORT NODE ADDRESS MOV TLAST,R4 ;R3 = CHARACTER INSERT POSITION CLR R3 ;R4 = ADDRESS OF END OF STRING. ; 10$: CMP R1,R4 ;IF END OF STRING REACHED BHI 30$ ; THEN EXIT LOOP. CMP (R1)+,TMARKER ;IF MARKER LESS THAN STRING MARKER BGT 30$ ; THEN EXIT LOOP. TST (R1)+ ; ELSE INCREMENT POINTERS AND LOOP. CMP (R3)+,(R3)+ ;R3 + 4 BR 10$ ; 30$: MOV TADDRESS,R1 ;WEDGE NEW STRING IN THE MOV #TMSTRNG,R2 ; SORT STRING AT THE CORRECT PLACE. CMP (R1),-2(R1) ;IS THERE ROOM LEFT IN STRING BEQ 50$ ;EXIT IF NOT WITH ERROR. CALL R$WEDGE ;WEDGE IN NEW SORT INDEX AND ADDRESS. ; MOV TFIRST,TPRESENT ;SET TPRESENT. ADD R3,TPRESENT ADD #4,TLAST ;ADD FOUR BYTES. MOV TADDRESS,R0 ;GET SORT STRING ADDRESS. BIS #100000,-(R0) ;SET PROTECT BIT. SETSUCCESS 55$ ; 50$: SETERROR ; 55$: UNSAVE R0,R1,R2,R3,R4 ; RETURN ; .END