; ; J=POS(MSTRING,SUBSTR,[START],[MAX CHARACTERS]) ; THIS FUNCTION RETURNS THE FIRST OCCURANCE OF THE SUBSTRING ; IN THE MAINSTRING. AN OPTIONAL PARAMETER IS THE STARTING ; POSITION IN THE MAIN STRING TO BEGIN SEARCHING. ALSO ; OPTIONAL IS THE MAXIMUM NUMBER OF CHARACTERS IN THE MAIN ; STRING TO SEARCH. ; IMPORTANT--POS MUST BE DEFINED AS AN INTEGER IN THE CALLING PROGRAM ; OR THIS WILL NOT WORK. ; .TITLE POSI .GLOBL POSI POSI: MOV #1,R1 ; 1 IS THE DEFAULT FOR STARTING POSITION CMP (R5),#3 ; IS THERE LESS THAN 3 ARGUMENTS BLT 3$ ; YES TST 6(R5) ; IS THERE A 3RD ARGUMENT BLE 1$ ; NO THERE ISN'T MOV @6(R5),R1 ; GET THE STARTING POSITION 1$: CMP (R5),#4 ; IS THERE A FOURTH ARGUMENT? BLT 3$ ; NO THERE ISN'T MOV @10(R5),21$ ; GET THE NO. OF CHARACTERS TO SEARCH DEC 21$ 3$: MOV R1,R0 DEC R0 ADD 2(R5),R1 ; R1 IS STARTING ADDRESS OF MAIN STRING MOV 4(R5),R2 ; R2 IS STARTING ADDRESS OF TST STRING INC 21$ DEC R1 DEC R1 11$: CLR 22$ ; LOOK AT NEXT CHAR IN MAIN STRING CMP R0,21$ ; HAVE WE SEARCHED MAX NO. OF CHAR BEQ 99$ ; YES WE HAVE INC R0 ; WE ARE AT NEXT POSITION IN MAIN STRING INC R1 TSTB (R1) BEQ 99$ MOV R1,R3 MOV R2,R4 2$: MOV R0,22$ ; HAVE WE SEARCHED THE DESIRED NO. OF CHAR 5$: TSTB (R4) ; IS THIS A NULL CHARACTER? BEQ 19$ ; YES IT IS MOVB (R3)+,23$ MOVB (R4)+,24$ CMPB 23$,#140 ; IS THIS A CAPITAL LETTER? BLE 25$ SUB #40,23$ ; CHANGE IT TO A CAPITAL 25$: CMPB 24$,#140 ; IS THE CHARACTER FROM 2ND ARRAY CAPITAL BLE 26$ ; YES IT IS SUB #40,24$ ; CHANGE IT TO CAPITAL 26$: CMPB 23$,24$ ; MAKE THE COMPARISON BNE 11$ ; NO MATCH YET CMP 22$,21$ ; HAVE WE REACHED MAX CHARACTERS BEQ 19$ ; YES WE HAVE INC 22$ BR 5$ 19$: RTS PC ; FOUND A MATCH, R0 IS ITS POSITION 99$: CLR R0 ; DIDN'T FIND A MATCH RTS PC 21$: .WORD ; NUMBER OF CHARACTERS TO SEARCH 22$: .WORD ; NO. OF CHARACTERS SEARCHED 23$: .WORD ; TEMPORARY STORAGE FOR CHAR FROM 1ST ARRAY 24$: .WORD ; TEMPORARY STORAGE FOR CHAR FROM 2ND ARRAY .END