.LIST TTM ;SEARCH ROUTINE CALLED BY ; CALL SEARCH(DSZ,IBUF,SSTRING) ;WHERE ; DSZ SIZE OF BUFFER & DIRECTION OF SEARCH ; IF SEARCH SUCCESFUL WILL CONTAIN POS'N ; IF UNSUCCESFUL WILL BE 0 ; IBUF ADDRES OF BUFFER TO BE SEARCHED ; SSTRING ADDRES OF SEARCH STRING, MUST TERMINATE WITH 0 BYTE ; .TITLE SEARCH .GLOBL SEARCH SEARCH: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV 4(R5),R3 ;IBUF MOV 6(R5),R4 ;SSTRING MOV @2(R5),R0 ;BUFFER SIZE BEQ 110$ ;NO BUFFER BGT 5$ NEG R0 5$: MOV R0,DSZ ;SAV ORIGINAL SIZE 8$: CALL SW TST @2(R5) ;FIND SEARCH DIRECTION BGT 20$ ; 10$: CMPB -(R3),(R4) BEQ 30$ ;START OF STRING FOUND SOB R0,10$ BR 100$ ;NOT FOUND ; 20$: CMPB (R3),R1 BEQ 25$ CMPB (R3)+,(R4) BEQ 30$ SOB R0,20$ BR 100$ ; 25$: TSTB (R3)+ 30$: DEC R0 MOV R0,-(SP) MOV R3,R2 TST @2(R5) BGT 40$ 35$: TSTB (R2)+ 40$: TSTB (R4)+ TSTB (R4) BEQ 50$ ;STRING FOUND CMP R0,DSZ ;BEGINNING OF BUFFER? BEQ 45$ ;YES INC R0 CALL SW CMPB (R2),R1 BEQ 35$ CMPB (R2)+,(R4) BEQ 40$ 45$: MOV 6(R5),R4 ;RESTORE SEARCH STRING MOV (SP)+,R0 BGT 8$ BR 100$ 50$: MOV (SP)+,R0 SUB DSZ,R0 TST @2(R5) BLE 100$ NEG R0 100$: MOV R0,@2(R5) 110$: MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN DSZ: .WORD 0 ; SW: MOVB (R4),R1 BITB #100,(R4) BEQ 30$ MOV R0,-(SP) MOV #40,R0 XOR R0,R1 MOV (SP)+,R0 30$: RETURN ; .END