.TITLE COMP .IDENT /V01/ ; ; THIS SUBROUTINE IS CALLED BY THE SORT MODULE TO COMPARE A LIST OF ; SORT KEYS AND DETERMINE WHICH IS THE NUMERICALLY SMALLEST. THE ; CALLING SEQUENCE IS AS FOLLOWS: CALL COMP(INDX,KEYSIZ,ADDLST), ; WHERE INDX IS THE LENGTH OF ADDLST, KEYSIZ IS THE SIZE IN WORDS ; OF THE KEYS, AND ADDLST IS A LIST OF ADDRESSES OF THE KEYS. ; A -1 IN ANY ENTRY IN ADDLST INDICATES THERE IS NO KEY AT THAT POSITION ; IN THE LIST TO COMPARE AGAINST THE OTHERS. ; ; COMP RETURNS THE INDEX OF THE LOWEST KEY INTO INDX. (THE INDEX OF ; THE FIRST KEY IN ADDLST IS ONE, THE SECOND TWO, AND SO ON.) IF TWO ; OR MORE KEYS ARE EQUAL AND LOW, COMP RETURNS THE INDEX OF THE ; "LEFTMOST" KEY (THE ONE APPEARING EARLIEST IN ADDLST). ; ; REGISTER ASSIGNMENTS: ; R0 COUNT OF KEYS COMPARED ; R1 KEYSIZE ; R2 ADDRESS OF LOW KEY ; R3 ADDRESS OF KEY TO COMPARE AGAINST R2 KEY ; R4 INDEX OF LOW KEY ; R5 POINTER TO CALLING PARAMETERS ; ; AUTHOR: GLEN HOFFING ; DATE: 19-MAY-81 ; .MCALL SMACIT COMP:: SMACIT ;ENABLE SUPERMAC LET @2(R5) := @2(R5) L.SHIFT 1 ;BYTE ADDRESSING LET R4 := #0 LET R0 := #0 LOOP: LET R0 := R0 + #2 IF R0 EQ @2(R5) GOTO DONE LET R2 := 6(R5) ;R2 = ADDRESS OF ADDLST LET R3 := R2 ;R3 = ADDRESS OF ADDLST LET R2 := R2 + R4 ;ADD LOW KEY COUNT TO R2 LET R2 := (R2) ;R2 = ADDRESS OF LOW KEY IF R2 EQ #-1 ;SKIP THIS KEY IF ADDRESS = -1 LET R4 := R4 + #2 GOTO LOOP END LET R3 := R3 + R0 ;ADD CURRENT KEY COUNT TO R3 LET R3 := (R3) ;R3 = ADDRESS OF CURRENT KEY IF R3 EQ #-1 GOTO LOOP ;SKIP THIS KEY IF ADDRESS = -1 LET R1 := @4(R5) THRU R1 ;LOOP KEYSIZE TIMES IF (R3) GT (R2) GOTO LOOP ;CURRENT KEY IS GREATER IF (R3)+ LT (R2)+ ;CURRENT KEY IS LESS LET R4 := R0 ;RESET INDEX OF LOW KEY GOTO LOOP END END GOTO LOOP DONE: LET @2(R5) := R4 R.SHIFT 1 ;INDX = (R4 / 2) + 1 LET @2(R5) := @2(R5) + #1 RETURN LST$$: .WORD 1 .END