.TITLE IBREAK ; AUTHOR: MARTY PORTNER ; WORLD BOOK-CHILDCRAFT, INC. ; FUNCTION SUBROUTINE TO FIND THE POSITION WITHIN ONE STRING ; OF ANY ONE OF A SET OF CHARACTERS IN ANOTHER. ; FOR EXAMPLE, ; IBREAK(STR,'+-/*') ; RETURNS THE POSITION OF THE FIRST ARITHMETIC OPERATOR IN STR ; (IF ANY) . ; ; DEFAULTS SUPPLIED: NONE ; .IDENT *IBREA2* .PSECT $$STRG,RO,I,CON,LCL IBREAK:: CMPB #2,@R5 ;ENOUGH ARGUMENTS ?? BNE OWT$ ;NO, EXIT. CMP #-1,2(R5) ;CHECK ARGS FOR PRESENCE BEQ OWT$ ;AND EXIT IF ANY MISSING CMP #-1,4(R5) ; BEQ OWT$ ; MOV R1,-(SP) ;SAVE REGISTERS MOV R2,-(SP) ; MOV R3,-(SP) ; MOV R4,-(SP) ; MOV 2(R5),R2 ;FIND LENGTHS OF STRINGS PASSED AS PARAMETERS 1$: TSTB (R2)+ ; BNE 1$ ; SUB 2(R5),R2 ; DEC R2 ; BLE 10$ ; MOV 4(R5),R3 ;FIND LENGTH OF SET STRING 2$: TSTB (R3)+ ; BNE 2$ ; SUB 4(R5),R3 ; BLE 10$ ;IN CASE OF NULL STRING, RETURN ZERO MOV 2(R5),R1 ;ADDR OF STRING TO SEARCH IS IN R1 3$: MOV R3,R4 ;R4 HAS LENGTH OF SET STRING MOV 4(R5),R2 ; 4$: CMPB (R2)+,(R1) ;FIND BREAK POINT BEQ 5$ ;IF FOUND, COMPUTE POSITION SOB R4,4$ ;ELSE LOOP INC R1 ;STEP UP POINTER OF FIRST STRING TSTB (R1) ;IF END, RETURN ZERO BNE 3$ ;ELSE LOOP JMP 10$ ; 5$: SUB 2(R5),R1 ;COMPUTE POSITION INC R1 ; MOV R1,R0 ;RETURN THIS VALUE JMP 11$ ;EXIT 10$: CLR R0 ;RETURN ZERO 11$: MOV (SP)+,R4 ;RESTORE REGISTERS MOV (SP)+,R3 ; MOV (SP)+,R2 ; MOV (SP)+,R1 ; OWT$: RTS PC ;BYE !! .END ;