home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
wunderki.zip
/
STRH.ASM
< prev
next >
Wrap
Assembly Source File
|
1993-08-16
|
5KB
|
365 lines
; *******************************************************
; * *
; * Turbo Pascal Runtime Library *
; * String Support Routines *
; * *
; * Copyright (C) 1988,90 Borland International *
; * *
; *******************************************************
TITLE STRH
INCLUDE SE.ASM
CODE SEGMENT BYTE PUBLIC
ASSUME CS:CODE
; Publics
PUBLIC SLoad,SStore,SCopy,SConcat,SPos,SCompare
PUBLIC SChar,SPacked,SInsert,SDelete
; Load string
; In [SP+4] = Destination pointer
; [SP] = Source pointer
; Out SP = SP+4
SLoad:
CLD
MOV BX,SP
MOV DX,DS
LES DI,SS:[BX+8]
LDS SI,SS:[BX+4]
LODSB
STOSB
MOV CL,AL
XOR CH,CH
REP MOVSB
MOV DS,DX
RETF 4
; Store string
; In [SP+6] = Source pointer
; [SP+2] = Destination pointer
; [SP] = Maximum length
; Out SP = SP+10
SStore:
CLD
MOV BX,SP
MOV DX,DS
LDS SI,SS:[BX+10]
LES DI,SS:[BX+6]
MOV CX,SS:[BX+4]
LODSB
CMP AL,CL
JBE @@1
MOV AL,CL
@@1: STOSB
MOV CL,AL
XOR CH,CH
REP MOVSB
MOV DS,DX
RETF 10
; Copy standard function
; In [SP+8] = Destination pointer
; [SP+4] = Source pointer
; [SP+2] = Index
; [SP] = Length
; Out SP = SP+8
SCopy:
CLD
MOV BX,SP
MOV DX,DS
LES DI,SS:[BX+12]
LDS SI,SS:[BX+8]
MOV AL,[SI]
XOR AH,AH
MOV CX,SS:[BX+6]
OR CX,CX
JG @@1
MOV CX,1
@@1: ADD SI,CX
SUB AX,CX
JB @@3
INC AX
MOV CX,SS:[BX+4]
OR CX,CX
JGE @@2
XOR CX,CX
@@2: CMP AX,CX
JBE @@4
MOV AX,CX
JMP SHORT @@4
@@3: XOR AX,AX
@@4: STOSB
MOV CX,AX
REP MOVSB
MOV DS,DX
RETF 8
; Concat standard function
; In [SP+4] = Destination pointer
; [SP] = Source pointer
; Out SP = SP+4
SConcat:
CLD
MOV BX,SP
MOV DX,DS
LES DI,SS:[BX+8]
LDS SI,SS:[BX+4]
MOV CL,ES:[DI]
XOR CH,CH
LODSB
ADD ES:[DI],AL
JNC @@1
MOV BYTE PTR ES:[DI],255
MOV AL,CL
NOT AL
@@1: ADD DI,CX
INC DI
MOV CL,AL
REP MOVSB
MOV DS,DX
RETF 4
; Pos standard function
; In [SP+4] = Source pointer
; [SP] = Destination pointer
; Out AX = Position
; SP = SP+8
SPos:
ARG SourceP,DWORD,1
ARG DestP,DWORD,1
ENTRY FAR
PUSH DS
LDS SI,SourceP
CLD
LODSB
OR AL,AL
JE @@2
MOV DL,AL
XOR DH,DH
LES DI,DestP
MOV CL,ES:[DI]
XOR CH,CH
SUB CX,DX
JB @@2
INC CX
INC DI
@@1: LODSB
REPNE SCASB
JNE @@2
MOV AX,DI
MOV BX,CX
MOV CX,DX
DEC CX
REPE CMPSB
JE @@3
MOV DI,AX
MOV CX,BX
MOV SI,SourceP.ofs
INC SI
JMP @@1
@@2: XOR AX,AX
JMP SHORT @@4
@@3: DEC AX
SUB AX,DestP.ofs
@@4: POP DS
EXIT
; String compare
; In [SP+4] = Source pointer
; [SP] = Destination pointer
; Out ZF = 1 if Source = Dest
; CF = 1 if Source < Dest
; SP = SP+8
SCompare:
CLD
MOV BX,SP
MOV DX,DS
LDS SI,SS:[BX+8]
LES DI,SS:[BX+4]
LODSB
MOV AH,ES:[DI]
INC DI
MOV CL,AL
CMP CL,AH
JBE @@1
MOV CL,AH
@@1: OR CL,CL
JE @@2
XOR CH,CH
REP CMPSB
JNE @@3
@@2: CMP AL,AH
@@3: MOV DS,DX
RETF 8
; Convert character to string
; In [SP+2] = Destination pointer
; [SP] = Character
; Out SP = SP+2
SChar:
CLD
MOV BX,SP
LES DI,SS:[BX+6]
MOV AL,1
STOSB
MOV AL,SS:[BX+4]
STOSB
RETF 2
; Convert packed string to string
; In [SP+6] = Destination pointer
; [SP+2] = Source pointer
; [SP] = Length
; Out SP = SP+6
SPacked:
CLD
MOV BX,SP
MOV DX,DS
LES DI,SS:[BX+10]
LDS SI,SS:[BX+6]
MOV AX,SS:[BX+4]
STOSB
MOV CX,AX
REP MOVSB
MOV DS,DX
RETF 6
; Insert standard procedure
; Insert(S,D,I) = Copy(D,1,I-1) + S + Copy(D,I,255)
SInsert:
ARG SourceP,DWORD,1
ARG DestP,DWORD,1
ARG DestLen,WORD,1
ARG Index,WORD,1
LOC Temp1,BYTE,256
LOC Temp2,BYTE,256
ENTRY FAR
CMP Index,1
JGE @@1
MOV Index,1
@@1: LEA DI,Temp1
PUSH SS
PUSH DI
LES DI,DestP
PUSH ES
PUSH DI
MOV AX,1
PUSH AX
MOV AX,Index
DEC AX
PUSH AX
PUSH CS
CALL SCopy
LES DI,SourceP
PUSH ES
PUSH DI
PUSH CS
CALL SConcat
LEA DI,Temp2
PUSH SS
PUSH DI
LES DI,DestP
PUSH ES
PUSH DI
PUSH Index
MOV AX,255
PUSH AX
PUSH CS
CALL SCopy
PUSH CS
CALL SConcat
LES DI,DestP
PUSH ES
PUSH DI
PUSH DestLen
PUSH CS
CALL SStore
EXIT
; Delete standard procedure
; Delete(S,I,N) = Copy(S,1,I-1) + Copy(S,I+N,255)
SDelete:
ARG StrP,DWORD,1
ARG Index,WORD,1
ARG Count,WORD,1
LOC Temp1,BYTE,256
LOC Temp2,BYTE,256
ENTRY FAR
CMP Count,0
JLE @@2
CMP Index,0
JLE @@2
CMP Index,255
JG @@2
CMP Count,255
JLE @@1
MOV Count,255
@@1: LEA DI,Temp1
PUSH SS
PUSH DI
LES DI,StrP
PUSH ES
PUSH DI
MOV AX,1
PUSH AX
MOV AX,Index
DEC AX
PUSH AX
PUSH CS
CALL SCopy
LEA DI,Temp2
PUSH SS
PUSH DI
LES DI,StrP
PUSH ES
PUSH DI
MOV AX,Index
ADD AX,Count
PUSH AX
MOV AX,255
PUSH AX
PUSH CS
CALL SCopy
PUSH CS
CALL SConcat
LES DI,StrP
PUSH ES
PUSH DI
MOV AX,255
PUSH AX
PUSH CS
CALL SStore
@@2: EXIT
CODE ENDS
END