+ 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: