From bc89850c00a9c1d56a5ece182cca65e0b4f4a88c Mon Sep 17 00:00:00 2001 From: Elaina Claus Date: Sat, 12 Oct 2024 14:48:26 -0400 Subject: [PATCH] first version of kmemcpy5/kmemset4 --- include/util/kmemcpy5_func.nasm | 53 +++++++++++++++++++++++++++++++++ include/util/kmemset4_func.nasm | 47 +++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 include/util/kmemcpy5_func.nasm create mode 100644 include/util/kmemset4_func.nasm diff --git a/include/util/kmemcpy5_func.nasm b/include/util/kmemcpy5_func.nasm new file mode 100644 index 0000000..81a6b64 --- /dev/null +++ b/include/util/kmemcpy5_func.nasm @@ -0,0 +1,53 @@ +; Copyright (c) 2024 Elaina Claus +; +; Permission is hereby granted, free of charge, to any person obtaining a copy +; of this software and associated documentation files (the "Software"), to deal +; in the Software without restriction, including without limitation the rights +; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +; copies of the Software, and to permit persons to whom the Software is +; furnished to do so, subject to the following conditions: +; +; The above copyright notice and this permission notice shall be included in all +; copies or substantial portions of the Software. +; +; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +; SOFTWARE. + +%ifndef __INC_KMEMCPY5_FUNC +%include 'cdecl16.inc' + +; uint8_t* kmemset(word dest_segment, word dest, word src_segment, word src, byte len); +; not overlap safe, only for +ALIGN 4, db 0x90 +kmemcpy5: + __CDECL16_ENTRY + push ds + push es +.setup_segments + mov ax, [bp + 4] + mov ds, ax ; destination segment + + mov ax, [ bp + 8] + mov es, ax ; source segment +.func: + mov cx, [bp + 12] ; len + mov si, [bp + 10] ; src + mov di, [bp + 6] ; dest + + cld ; ensure we are incrementing + rep movsb ; move ds:si -> es:di + mov ax, di ; return pointer to dest +.restore_segments: + pop es + pop ds +.endf: + __CDECL16_EXIT + ret + +%define __INC_KMEMCPY5_FUNC +%endif \ No newline at end of file diff --git a/include/util/kmemset4_func.nasm b/include/util/kmemset4_func.nasm new file mode 100644 index 0000000..9f0a734 --- /dev/null +++ b/include/util/kmemset4_func.nasm @@ -0,0 +1,47 @@ +; Copyright (c) 2024 Elaina Claus +; +; Permission is hereby granted, free of charge, to any person obtaining a copy +; of this software and associated documentation files (the "Software"), to deal +; in the Software without restriction, including without limitation the rights +; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +; copies of the Software, and to permit persons to whom the Software is +; furnished to do so, subject to the following conditions: +; +; The above copyright notice and this permission notice shall be included in all +; copies or substantial portions of the Software. +; +; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +; SOFTWARE. + +%ifndef __INC_KMEMSET4_FUNC +%include 'cdecl16.inc' + +; word kmemset_byte(word segment, word dst, byte val, word len); +ALIGN 4, db 0x90 +kmemset4: + __CDECL16_ENTRY +.setup_segment: + push es + mov ax, [bp + 4] + mov es, ax + .func: + mov cx, [bp + 10] ; size_t len + mov al, [bp + 8] ; uint8_t val + mov di, [bp + 6] ; word dst + + cld + rep stosb ; move al -> es:di + mov ax, di ; return pointer to dest +.restore_segments: + pop es +.endf: + __CDECL16_EXIT + ret + +%endif +%define __INC_KMEMSET4_FUNC \ No newline at end of file