foobar
[eightysix] / kern / src / libc / string.asm
diff --git a/kern/src/libc/string.asm b/kern/src/libc/string.asm
new file mode 100644 (file)
index 0000000..b3f0f98
--- /dev/null
@@ -0,0 +1,65 @@
+       cpu 8086
+       bits 16
+       section .text
+
+global memset
+memset:
+       push bp
+       mov bp, sp
+       push di
+       mov di, [bp + 4]
+       mov ax, [bp + 6]
+       mov ah, al
+       mov cx, [bp + 8]
+       test di, 1
+       jz .skip_odd_addr
+       stosb
+       dec cx
+.skip_odd_addr:
+       test cx, 1
+       jz .skip_odd_cx
+       push bx
+       mov bx, cx
+       mov [bx + di], al
+       inc di
+       pop bx
+.skip_odd_cx:
+       shr cx, 1       ; count words
+       rep stosw
+       pop di
+       pop bp
+       ret
+
+global fmemset
+fmemset:
+       push bp
+       mov bp, sp
+       push di
+       push es
+       mov di, [bp + 4]
+       mov ax, [bp + 6]
+       mov es, ax
+       mov ax, [bp + 8]
+       mov ah, al
+       mov cx, [bp + 10]
+       test di, 1
+       jz .skip_odd_addr
+       stosb
+       dec cx
+.skip_odd_addr:
+       test cx, 1
+       jz .skip_odd_cx
+       push bx
+       mov bx, cx
+       mov [es:bx + di], al
+       inc di
+       pop bx
+.skip_odd_cx:
+       shr cx, 1       ; count words
+       rep stosw
+       pop es
+       pop di
+       pop bp
+       ret
+
+; vi:ts=8 sts=8 sw=8 ft=nasm: