;:::::::::::::::::::::::::::::::::::::::::
;:      Sito:  www.byteman.it  OpenWeb  ::
;:  Raccolta:  Particelle PAS+ASM       ::
;:    Autore:  Salvo Rosta aka byteman  ::
;:    Titolo:  XSUBST.ASM               ::
;: Revisione:  25-08-1994               ::
;:::::::::::::::::::::::::::::::::::::::::


;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;: Function  XStSubst(QSt,PSt,String): Boolean;
;:                                 Cerca e Sostituisce QSt con PSt in String
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
CODE      SEGMENT BYTE PUBLIC
          ASSUME  CS:CODE
          PUBLIC  XStSubst

Function  EQU     AX
QSt       EQU     DWORD PTR [BP+14]
PSt       EQU     DWORD PTR [BP+10]
String    EQU     DWORD PTR [BP+6]
BfStr     EQU     BYTE PTR [BP-256]

;BfStr     DB 256 DUP(0)

XStSubst  PROC    FAR
          PUSH    BP
          MOV     BP,SP
          SUB     SP,256
          PUSH    DS
          LES     DI,String           ;Puntatore String in ES:DI
          LDS     SI,QSt              ;Puntatore SubSt  in DS:SI
          CMP     Byte Ptr DS:[SI],0
          JZ      XPEnd1              ;Esclude Caso Q:=''
          CMP     Byte Ptr ES:[DI],0
          JZ      XPEnd1              ;Esclude Caso St:=''
          INC     SI                  ;Offset Primo Carattere da Cercare
          MOV     DX,DI               ;In DX Offset Lunghezza Stringa da Analizzare
          XOR     CX,CX
          MOV     CL,ES:[DI]          ;Lunghezza Stringa da Analizzare
          INC     DI                  ;Primo Carattere da Analizzare
          CLD
ReSc1:    MOV     AL,DS:[SI]          ;Primo Carattere da Cercare
          REPNE   SCASB               ;Cerca Primo Carattere
          JNZ     XPEnd1              ;  Non Trovato: Concludi con DX=0

Sc1oK:    PUSH    CX                  ;  Trovato: Cerca il resto
          PUSH    SI
          PUSH    DI                  ;Salva lo Stato dei Puntatori
          DEC     DI
          MOV     BX,DI               ;Indirizzo Attuale Carattere Q[1] in St.
          XOR     CX,CX
          MOV     CL,DS:[SI-1]        ;Lunghezza Stringa da Cercare
          REPE    CMPSB               ;Confronta con la SottoStringa
          POP     DI
          POP     SI
          POP     CX
          JZ      XPEnd2              ;  Tutto Bene: Concludi con DX=Posiz
          JMP     ReSc1               ;   Non Bene: Ricomincia

XPEnd1:   MOV     BX,DX               ;Non Trovato, prepara Funzione=0
XPEnd2:   SUB     BX,DX               ;Calcolo valore Funzione

          CMP     BX,0
          JE      XPEnd3
          LDS     SI,String           ;Puntatore String in DS:SI
          MOV     AX,SS
          MOV     ES,AX
          LEA     DI,SS:BfStr
          XOR     CX,CX
          MOV     CL,DS:[SI]
          INC     CX
          REP     MOVSB

          LES     DI,String           ;Puntatore String in ES:DI
          PUSH    DI                  ;Salva Posizione Lunghezza
          LDS     SI,QSt
          XOR     AX,AX
          LODSB
          PUSH    AX                  ;Salva Lunghezza QSt

          LDS     SI,PSt
          XOR     AX,AX
          LODSB                       ;Legge Lunghezza PSt
          MOV     CX,AX
          MOV     DX,BX
          DEC     DX
          ADD     DX,CX
          ADD     DI,BX
          REP     MOVSB

          MOV     AX,SS
          MOV     DS,AX
          LEA     SI,SS:BfStr
          XOR     CX,CX
          MOV     CL,DS:[SI]
          POP     AX
          ADD     BX,AX
          SUB     CX,BX
          INC     CX
          ADD     DX,CX
          ADD     SI,BX
          REP     MOVSB
          MOV     AX,DX
          POP     DI
          STOSB
          MOV     Function,1
          JMP     XPEnd4


XPend3:   MOV     Function,0          ;Restituisce FALSE
XPEnd4:   POP     DS                  ;Ripristino Registri
          MOV     SP,BP
          POP     BP
          RET     12
XStSubst  ENDP

CODE      ENDS
          END