.TITLE MR05.A STRING PROCEDURES IN MACRO .IDENT /MR05.A/ ; ; ; MOD LIST ; (A) ENABLE UPPERCASE/LOWER CASE MATCH POSITION SEARCH ; ; .PAGE .SBTTL . CHARACTER POSITION REGISTER BASED ROUTINES ; ; R$POS3:: ;REGISTER ONLY POSITION PROCEDURE 3 PARAMETERS ; ; ENTRY POINTS ; ; ENTRY +0 VALIDATE CHARACTERS EXACT ; ENTRY +2 VALIDATE UPPER AND LOWER CASE CHARACTERS ; ; ENTRY CONDITIONS ; R1 -> MASTER STRING ; R2 -> SEARCH STRING ; R0 = START POSITION OF SEARCH ; ; EXIT CONDITIONS ; ; SEE R$POS ; BR 5$ ;EXACT ENTRY CLR -(SP) ;INDICATE UPPER CASE LOWER CASE MATCHING BR 10$ ;ENTER COMMON SECTION ; 5$: MOV #1,-(SP) ;INDICATE MATCH EXACT 10$: SAVE R3,R4,R5 ;SAVE REGISTERS R3 TO R5 DEC R0 ;CHARACTER POINTER START POS -1 JMP R$POS ;ENTER PROCESSING ROUTINE ; ; R$POS2:: ;REGISTER ONLY POSITION PROCEDURE 2 PARAMETERS ; ; ENTRY POINTS ; ; ENTRY +0 VALIDATE CHARACTERS EXACT ; ENTRY +2 VALIDATE UPPER AND LOWER CASE CHARACTERS ; ; ENTRY CONDITIONS ; R1 -> MASTER STRING ; R2 -> SEARCH STRING ; SEARCH STARTS A START OF MASTER STRING ; ; EXIT CONDITIONS ; ; SEE R$POS ; BR 5$ ;EXACT ENTRY CLR -(SP) ;INDICATE UPPER CASE LOWER CASE MATCHING BR 10$ ;ENTER COMMON SECTION ; 5$: MOV #1,-(SP) ;INDICATE MATCH EXACT 10$: SAVE R3,R4,R5 ;SAVE REGISTERS R3 TO R5 CLR R0 ;CHARACTER POINTER START POS -1 JMP R$POS ;ENTER PROCESSING ROUTINE ; ; ; ; ; .PAGE .SBTTL . COMMON POSITION SEEK ROUTINE ; ; R$POS:: ;POSITION PROCESSING ROUTINE ; ENTRY CONDITIONS ; ; R3 R4 AND R5 MUST BE SAVED ; R1 -> MASTER STRING ADDRESS ; R2 -> SEARCH STRING ADDRESS ; R0 = START POINT IN STRING TO SEARCH FROM ; ; EXIT CONDITIONS ; ; R0 = POSITION OF FIRST CHARACTER IF POSITION MATCH FOUND ; R0 = ZERO IF NO MATCH FOUND ; ; C BIT CLEAR IF MATCH FOUND ; C BIT SET IF MATCH NOT FOUND ; ; ;NOTE R0 CONTAINS 1 LESS THAN LOCATION POSITION ;THIS IS BECAUSE R0 IS USED TO POSTION INCREMENT ;AND COUNTING WOULD START FROM ONE BUT FOR INCREMENTING ;WE MUST START COUNTING FROM ZERO ; 10$: MOV @R2,R4 ;HOLD LENGTH OF SLAVE STRING ADD R0,R4 ;INCREMENT TO END POSITION INC R0 ;SET POINTER TO NEXT CHARACTER CMP R4,@R1 ;WILL THIS LOOP TERMINATE SEQUENCE BGT 40$ ;J IF END ; MOV R1,R3 ;HOLD START ADDRESS OF MASTER STRING MOV R2,R4 ;HOLD START ADDRESS OF SLAVE STRING INC R3 ;MASTER START CHARACTER (-1 PLACE) ADD #2,R4 ;1ST CHARACTER IN SLAVE STRING ADD R0,R3 ;ACTUAL CHARACTER IN MASTER STRING ; MOV @R2,R5 ;SET UP COMPARE COUNTER 20$: CMPB (R4)+,(R3)+ ;COMPARE CHARACTERS BEQ 35$ ;J IF CHARACTERS MATCH EXACT TST 6(SP) ;IS UPPER/LOWER CASE MATCH ALLOWED BNE 10$ ;J IF NOT TRY NEXT POSITION SAVE R1,R2 ;PROTECT REGISTERS R1 AND R2 MOV R3,R1 ;HOLD ADDRESS+1 OF CHAR ONE MOV R4,R2 ;HOLD ADDRESS+1 OF CHAR TWO CMPB -(R1),-(R2) ;DECREMENT RR1 AND R2 BY ONE CALL R$CMPC ;COMPARE THE TWO CHARACTERS UNSAVE R1,R2 ;RESTORE REGISTERS R1 AND R2 IFERROR 10$ ;J IF CHARACTERS DO NOT MATCH 35$: SOB R5,20$ ;TRY NEXT CHARACTER BR 50$ ;EXIT R0 -> TO CHARACTER ; 40$: CLR R0 ;EXIT NO MATCH FOUND 50$: UNSAVE R3,R4,R5 ;RESTORE REGISTERS R3 TO R5 TST (SP)+ ;CORRECT STACK TST R0 ;WAS POSITION FOUND BEQ 62$ ;J IF NO MATCH FOUND 60$: EXITSUCCESS ;MATCH FOUND 62$: EXITERROR ;NO MATCH FOUND ; ; ; ; ; ; .END