;*********************************************************************
;* INSTRING.ASM dd 850619, Auteur P.J. Huizinga.                     *
;*********************************************************************
;  routine zoekt naar source string in destination string
;  let op: case sensitive; evt. eerst uppercase maken.
;
;  input : DS:SI wijst naar 1e karakter source string
;          ES:DI wijst naar 1e karakter destination string
;          AX    bevat lengte source string
;          CX    bevat lengte destination string
;
;  output: AX    bevat offset source string in destination string
;                = 0 indien geen exact match gevonden
;          overige registers ongewijzigd
;
;  vb.   : als DS:SI wijst naar 'MNO'                   en AX = 3
;           en ES:DI wijst naar 'ABCDEFGHIJKLMNOP'      en CX = 16,
;          dan is na return AX = DI + 12
;
INSTRING        PROC    NEAR
                PUSH    SI              ; red gebruikte registers
                PUSH    DI
                PUSH    DX
                PUSH    CX
                PUSH    BX
                PUSH    AX
                MOV     DX,DI           ; offset 1e karakter destination
                MOV     BX,SI           ; idem source
                CMP     AX,0            ; controleer lengtes:
                JG      INSTRING_01     ; moeten positief zijn
                JMP     INSTRING_05
INSTRING_01:    CMP     CX,0
                JG      INSTRING_02
                JMP     INSTRING_05
INSTRING_02:    CMP     AX,CX           ; vergelijk lengtes:
                JNG     INSTRING_03     ; source str mag niet langer zijn
                JMP     INSTRING_05
;
; zoek naar 1e karakter van source in destination string
;
INSTRING_03:    MOV     DI,DX
                MOV     SI,BX
                MOV     AL,[SI]         ; AL := 1e karakter source string
                CLD                     ; zet direction flag voorwaarts
        REPNZ   SCASB                   ; zoek tot match of tot CX=0
                JNZ     INSTRING_05     ; geen match gevonden
;
; match van 1e karakter gevonden,
; controleer of rest ook matcht.
;
                MOV     DX,DI           ; onthou positie in dest. str.
                DEC     DI              ; DI op match-karakter dest. str.
                POP     AX              ; lengte source string van stack
                PUSH    AX              ; herstel stackpointer
                XCHG    AX,CX           ; lengte in CX en bewaar CX
        REPZ    CMPSB                   ; vergelijk source met destination
                JZ      INSTRING_04     ; ZF=0 -->> match gevonden
;
; mis. verder zoeken
;
                XCHG    AX,CX           ; herstel waar we waren
                JMP     INSTRING_03     ; en verder zoeken
;
; raak. outputparm zetten en return
;
INSTRING_04:    MOV     AX,DX           ; offset in dest. str.
                DEC     AX              ; was al 1 opgehoogd
                JMP     SHORT E_INSTRING ; klaar
;
; source string komt niet voor in destination string
; (of inputparms niet correct)
;
INSTRING_05:    MOV     AX,0            ; geen match gevonden
;
; exit
;
E_INSTRING:     POP     BX              ; AX op stack, is outputparm
                POP     BX              ; herstel overige registers
                POP     CX
                POP     DX
                POP     DI
                POP     SI
                RET                     ; en return
INSTRING        ENDP
