summaryrefslogtreecommitdiff
path: root/strings/strxmov.asm
diff options
context:
space:
mode:
Diffstat (limited to 'strings/strxmov.asm')
-rw-r--r--strings/strxmov.asm103
1 files changed, 103 insertions, 0 deletions
diff --git a/strings/strxmov.asm b/strings/strxmov.asm
new file mode 100644
index 00000000000..9b027ad4276
--- /dev/null
+++ b/strings/strxmov.asm
@@ -0,0 +1,103 @@
+; Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+;
+; This library is free software; you can redistribute it and/or
+; modify it under the terms of the GNU Library General Public
+; License as published by the Free Software Foundation; either
+; version 2 of the License, or (at your option) any later version.
+;
+; This library is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+; Library General Public License for more details.
+;
+; You should have received a copy of the GNU Library General Public
+; License along with this library; if not, write to the Free
+; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+; MA 02111-1307, USA
+
+ TITLE Optimized strxmov for MSDOS / Intel 8086
+
+ifndef M_I386
+ .8087
+ DOSSEG
+ .MODEL LARGE
+ .CODE
+
+ PUBLIC _strxmov
+_strxmov PROC
+ mov bx,sp
+ add bx,4
+ push si
+ push di
+ mov cx,ds ; Save ds
+ASSUME DS: NOTHING
+ASSUME ES: NOTHING
+ les di,DWORD PTR ss:[bx] ; dst
+ jmp next_str
+
+start_str:
+ mov al,ds:[si]
+ movsb ; move arg
+ and al,al
+ jnz start_str ; Not last
+ dec di
+
+next_str:
+ add bx,4
+ lds si,DWORD PTR ss:[bx]
+ mov ax,ds
+ or ax,si
+ jnz start_str
+
+ mov byte ptr es:[di],0 ; Force end null (if no source)
+ mov ds,cx
+ mov ax,di ; Return ptr to last 0
+ mov dx,es
+ pop di
+ pop si
+ ret
+_strxmov ENDP
+
+else
+
+include macros.asm
+
+ begcode strxmov
+ public _strxmov
+
+_strxmov PROC near
+ASSUME DS: NOTHING
+ASSUME ES: NOTHING
+ push EBP
+ mov EBP,ESP
+ mov EDX,EBX ; Save EBX
+ mov ECX,ESI ; Save ESI
+ push EDI
+ mov EDI,8[EBP] ; Get destination
+ lea EBX,8[EBP] ; Get adress to first source - 4
+ xor al,al
+ jmp next_str
+
+start_str: movsb
+ cmp AL,[EDI-1]
+ jne start_str
+ dec EDI ; Don't copy last null
+
+next_str: add EBX,4
+ mov ESI,[EBX]
+ or ESI,ESI
+ jne start_str
+ mov byte ptr [EDI],0 ; Force last null
+
+ mov EAX,EDI ; Return ptr to null
+ pop EDI
+ mov ESI,ECX
+ mov EBX,EDX
+ pop EBP
+ ret
+_strxmov endp
+ endcode strxmov
+
+endif
+
+ END