.TITLE MRC6.. CHARACTER PROCEDURES IN MACRO .IDENT /MRC6.A/ ; ; MODS LIST ; ; (A) PROCEDURE ADDED TO INDICATE POSITION MATCH ONLY ; ; .PAGE .SBTTL . LOCATE POSITION OF CHARACTER IN STRING ; R$POSC:: ; ENTRY CONDITIONS ; ; R0 = CHARACTER TO LOCATE ; R1 -> STRING ADDRESS TO LOCTATE CHARACTER IN ; R2 = START POSITION TO START SEARCH IN STRING ; ; EXIT CONDITIONS ; ; R2 = UNCHANGED IF CHARACTER NOT FOUND + EXITERROR ; R2 = CHARACTER POSITION + EXITSUCCESS ; TST @R1 ;ARE THERE ANY CHARACTER IN STRING BLE 62$ ;J IF STRING EMPTY TST R2 ;IS SEARCH POSITION WITHIN STRING BLE 10$ ;IF LESS OR ZERO ASSSUME THE START OF THE STRING CMP @R1,R2 ;IS START POSITION AFTER END OF STRING BLT 62$ ;IF BEYOND STRING END EXIT ; 10$: SAVE R3,R4 ;PROTECT REGISTERS MOV R2,R3 ;HOLD START SEARCH POSITION BGT 15$ ;IS POSITION VALID MOV #1,R3 ;ASSUME DEFAULT START OF STRING POSITION ; 15$: MOV @R1,R4 ;HOLD SEARCH STRING LENGTH SUB R3,R4 ;HOLD COUNT OF NUMBER OF CHARS TO COMPARE ; INC R4 ;NUMBER OF CHARS COUNT CORRECTION INC R3 ;OFFSET ADDRESS CORRECTION ADD R1,R3 ;ABSOLUTE ADDRESS OF CHARACTER POSITION ; 30$: CMPB (R3)+,R0 ;CHECK IF THIS IS THE REQUIRED CHARACTER ;THEN INDEX POINTER TO NEXT CHARACTER BEQ 40$ ;JUMP IF A CHARACTER MATCH HAS BEEN FOUND SOB R4,30$ ;LOOP THRO TO END OF STRING ; UNSAVE R3,R4 ;RESTORE REGISTERS 62$: EXITERROR ;EXIT INDICATING MATCH NOT FOUND ; ; 40$: SUB R1,R3 ;CONVERT ABSOLUTE ADDRRESS TO RELATIVE ADDRESS SUB #2,R3 ;CONVERT RELATIVE ADDRESS TO CHAR POSITION MOV R3,R2 ;HOLD NEW LOCATED CHARACTER POSITION UNSAVE R3,R4 ;RESTORE REGISTERS EXITSUCCESS ;INDICATE POSITION FOUND ; ; .PAGE .SBTTL . POSITION LOCATE STATUS REPLY ONLY ; ; R$POSS:: ;LOCATE CHARACTER POSITION ; ; ENTRY CONDITIONS ; ; R0 = CHARACTER TO FIND ; R1 -> STRING ADDRESS ; ; EXIT CONDITIONS ; ; STATUS = SUCCESS IF CHARACTER FOUND ; SAVE R2 ;PROTECT REGISTER TWO CLR R2 ;DEFAULT START OF LINE POSITION CALL R$POSC ;LOCATE CHARACTER IF POSIBLE UNSAVE R2 ;RESTORE STATUS OF REGISTER TWO RETURN ;RETURN TO CALLING PROGRAM WITH STATUS INDICATOR ; ; ; .END ;