summaryrefslogtreecommitdiff
path: root/core/strecpy.inc
diff options
context:
space:
mode:
Diffstat (limited to 'core/strecpy.inc')
-rw-r--r--core/strecpy.inc28
1 files changed, 28 insertions, 0 deletions
diff --git a/core/strecpy.inc b/core/strecpy.inc
new file mode 100644
index 00000000..1fc53e96
--- /dev/null
+++ b/core/strecpy.inc
@@ -0,0 +1,28 @@
+;
+; strecpy: Copy DS:SI -> ES:DI up to and including a null byte;
+; on exit SI and DI point to the byte *after* the null byte.
+; BP holds a pointer to the first byte beyond the end of the
+; target buffer; return with CF=1 if target buffer overflows;
+; the output is still zero-terminated.
+;
+ section .text
+
+strecpy:
+ push ax
+ push bp
+ dec bp
+ dec bp
+.loop: lodsb
+ stosb
+ and al,al ; CF=0
+ jz .done
+ cmp bp,di ; CF set if BP < DI
+ jnc .loop
+
+ ; Zero-terminate overflow string
+ mov al,0 ; Avoid changing flags
+ stosb
+.done:
+ pop bp
+ pop ax
+ ret