.TITLE MR11.A STRING COMPARE ROUTINE .IDENT /MR11.A/ ; ; ; MOD LIST ; (A) ENABLE UPPERCASE/LOWER CASE MATCH COMPARES ; ; R$COMPARE:: ;COMPARE TWO CHARACTER STRINGS ; ; ENTRY POINTS ; +0 COMPARE EXACT ; +2 COMPARE UC/LC ASSUMED THE SAME ; ; ; ENTRY CONDITIONS ; R1 -> STRING (A) ; R2 -> STRING (B) ; IF THE ENTRY POINT IS +0 AN EXACT MATCH IS REQUIRED ; IF THE ENTRY POINT IS +2 UPPERCASE/LOWERCASE MATCH ALLOWED ; ; EXIT CONDITIONS ; IF BOTH STRINGS IDENTICAL R0 = ZERO STATUS = SUCCESS ; IF STRING (A) LARGEST R0 = POSITIVE STATUS = ERROR ; IF STRING (B) LARGEST R0 = NEGATIVE STATUS = ERROR ; ; NOTE. WHEN STRINGS OF DIFFERING LENGTHS ARE SUPPLIED ; THE CHARACTER ARE COMPARED OVER THE LENGTH OF THE ; SHORTEST STRING, IF ALL CHARS THE SAME THE SHORTEST ; STRING IF ASSUMED TO BE THE SMALLER ; ; ; ; PROGRAMMING NOTE 14(SP) = 1 = MATCH EXACT ; PROGRAMMING NOTE 12(SP) = EXACT MATCH REPLY ; BR 5$ ;MATCH EXACT ENTRY +0 (NORMAL ENTRY) CLR -(SP) ;MATCH UCLC ENTRY +2 (EDITOR OPTION) BR 10$ ;GO TO COMMON CODE ; 5$: MOV #1,-(SP) ;INDICATE MATCH EXACT ; ; COMMON CODE ; 10$: MOV #1,-(SP) ;ASSUME FIRST STRING (A) LARGEST SAVE R1,R2,R3,R4,R5 ;PROTECT REGISTERS ; TST @R1 ;ARE THERE ANY CHARACTERS IN STRING (A) BLE 61$ ;J IF STRING EMPTY TST @R2 ;ARE THERE ANY CHARACTERS IN STRING (B) BLE 60$ ;J IF STRING (B) EMPTY ; MOV @R2,R5 ;ASSUME STRING (B) SHORTEST CMP @R1,@R2 ;LOCATE LONGEST STRING BEQ 15$ ;J IF BOTH STRINGS THE SAME LENGTH BGT 20$ ;J IF STRING (B) IS THE SHORTEST ; MOV @R1,R5 ;HOLD LENGTH OF SHORTEST STRING NEG 12(SP) ;SET FLAG SHOWING STRING (A) = SHORTEST BR 20$ ;CONTINUE ; 15$: CLR 12(SP) ;INDICATE BOTH STRINGS SAME LENGTH 20$: CMP (R1)+,(R2)+ ;INCREMENT POINTERS TO FIRST CHARS IN ;BOTH STRING (A) AND STRING (B) ; TST 14(SP) ;IS MATCH EXACT REQUIRED BNE 40$ ;J IF EXACT MATCH REQUIRED ; ; COMPARE CHARACTERS UC/LC ASSUMED THE SAME ; 30$: CALL R$CMPC ;ARE CHARACTERS THE SAME IFERROR 40$ ;J IF CHARACTER DIFFER ;NOTE ON ENTRY TO LAB 40$ @R1 @R2 CHARACTERS ;DIFFER THERFORE BLT OR BGT JMP MUST TAKE PLACE 35$: CMPB (R1)+,(R2)+ ;INCREMENT TO NEXT CHARACTER SOB R5,30$ ;LOOP TILL ALL CHARACTERS COMPARED BR 50$ ;BOTH STRINGS THE SAME DECIDE ON LENGTH ; ; COMPARE CHARACTERS MATCH EXACT ; 40$: CMPB (R1)+,(R2)+ ;ARE THE CHARACTERS THE SAME, PUSH POINTERS BLT 61$ ;J IF STRING (B) THE BIGGEST BGT 60$ ;J IF STRING (A) THE BIGGEST SOB R5,40$ ;COMPARE ALL THE CHARACTERS ; ; BOTH STRINGS SAME LENGTH COMPARE BY SIZE ; 50$: TST 12(SP) ;LOCATE WHICH STRING IS THE LARGEST BLT 61$ ;J IF STRING (B) IS THE LARGEST BEQ 62$ ;J IF BOTH THE SAME ; ; INDICATE STRING (A) IS THE BIGGEST ; 60$: MOV #1,R0 ;STRING (A) THE BIGGEST BR 161$ ;EXIT WITH STATUS = ERROR ; ; INDICATE STRING (B) IS THE BIGGEST ; 61$: MOV #-1,R0 ;STRING (B) THE BIGGEST 161$: SETERROR 63$ ;EXIT WITH STATUS = ERROR ; ; INDICATE BOTH STRINGS IDENTICAL ; 62$: CLR R0 ;BOTH STRINGS THE SAME SETSUCCESS ;SET EXIT STATUS = SUCCESS 63$: UNSAVE R1,R2,R3,R4,R5 ;RESTORE REGISTERS MOV (SP)+,(SP)+ ;CORRECT THE STACK LEAVE C BIT STATUS ALONE RETURN ;RETURN TO CALLING PROGRAM ; ; .END ; ; ;