/* * dj64 - 64bit djgpp-compatible tool-chain * Copyright (C) 2024 @stsp * Copyright (C) 2023 stsp, comcom32 project * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /* * NOTE: this file is a port of fmemcpy.c file from comcom32 project. * In comcom32 project it is distributed under the terms of GNU GPLv3+ * and is copyrighted (C) 2023 stsp. * As a sole author of the aforementioned fmemcpy.c, I donate the * code to dj64dev project, allowing to re-license it under the terms * of GNU LGPLv3+. * * --stsp */ #include #include #include #include #include #include void fmemcpy1(__dpmi_paddr dst, const void *src, unsigned len) { unsigned base; void *ptr; int en_dis = !(_crt0_startup_flags & _CRT0_FLAG_NEARPTR); int err; err = __dpmi_get_segment_base_address(dst.selector, &base); assert(!err); if (en_dis) __djgpp_nearptr_enable(); ptr = DATA_PTR(base + dst.offset32 + __djgpp_conventional_base); memcpy(ptr, src, len); if (en_dis) __djgpp_nearptr_disable(); } void fmemcpy2(void *dst, __dpmi_paddr src, unsigned len) { unsigned base; const void *ptr; int en_dis = !(_crt0_startup_flags & _CRT0_FLAG_NEARPTR); int err; err = __dpmi_get_segment_base_address(src.selector, &base); assert(!err); if (en_dis) __djgpp_nearptr_enable(); ptr = DATA_PTR(base + src.offset32 + __djgpp_conventional_base); memcpy(dst, ptr, len); if (en_dis) __djgpp_nearptr_disable(); } /* similar to sys/movedata.h's movedata(), but the src/dst swapped! */ void fmemcpy12(__dpmi_paddr dst, __dpmi_paddr src, unsigned len) { unsigned sbase, dbase; const void *sptr; void *dptr; int en_dis = !(_crt0_startup_flags & _CRT0_FLAG_NEARPTR); int err; err = __dpmi_get_segment_base_address(src.selector, &sbase); assert(!err); err = __dpmi_get_segment_base_address(dst.selector, &dbase); assert(!err); if (en_dis) __djgpp_nearptr_enable(); sptr = DATA_PTR(sbase + src.offset32 + __djgpp_conventional_base); dptr = DATA_PTR(dbase + dst.offset32 + __djgpp_conventional_base); memcpy(dptr, sptr, len); if (en_dis) __djgpp_nearptr_disable(); }