/* * dj64 - 64bit djgpp-compatible tool-chain * Copyright (C) 2021-2024 @stsp * * 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 . */ #include #ifndef _f #define _h # #define _f(x) x #define DEFINE(x, y) _f(_h)define x y #endif #define __ASYM(x) __##x() #define __ASYM_L(x) (*__##x()) #define __S(x) #x #define _S(x) __S(x) #ifndef IN_ASMOBJ #ifdef _IN_DJ64 #define ASM(t, x) t *__##x(void);/* */DEFINE(x, (*__##x()))/* */ #else #define ASM(t, x) t *__##x(void) #endif #define ASMh(t, x) \ t *___##x(int handle) \ { \ return (t *)djaddr2ptr2(djthunk_get_h(handle, _S(_##x)), sizeof(t)); \ } #ifdef _IN_DJ64 #define ASM_N(t, x) t *__##x(void);/* */DEFINE(x, (*__##x()))/* */ #else #define ASM_N(t, x) t *__##x(void) #endif #ifdef _IN_DJ64 #define ASM_P(t, x) t *__##x(void);/* */DEFINE(x, __##x())/* */ #else #define ASM_P(t, x) t *__##x(void) #endif #ifdef _IN_DJ64 #define ASM_ARR(t, x, l) t *__##x(void);/* */DEFINE(x, __##x())/* */ #else #define ASM_ARR(t, x, l) t *__##x(void) #endif #ifdef _IN_DJ64 #define ASM_F(x) unsigned __##x(void);/* */DEFINE(x, __##x())/* */ #else #define ASM_F(x) unsigned __##x(void) #endif #define EXTERN extern #else #if IN_ASMOBJ == 1 #define ASM_N(t, x) t _##x #endif #if IN_ASMOBJ == 2 #define ASM_N(t, x) t *__##x(void) #define ASM_Ni(t, x) \ t *__##x(void) \ { \ return (t *)djaddr2ptr2(djthunk_get(_S(_##x)), sizeof(t)); \ } #endif #if IN_ASMOBJ == 3 #undef ASM #define ASM(t, x) \ t *__##x(void) \ { \ return (t *)djaddr2ptr2(djthunk_get(_S(_##x)), sizeof(t)); \ } unsigned *____djgpp_base_address(void); #undef ASM_F #define ASM_F(x) \ unsigned __##x(void) \ { \ return (djthunk_get(_S(_##x)) - *____djgpp_base_address()); \ } #undef ASM_N #define ASM_N(t, x) t *__##x(void) #define _DP(l, s) \ djaddr2ptr2((*____djgpp_base_address()) + (l), s) #undef ASM_P #define ASM_P(t, x) \ t *__##x(void) \ { \ return (t *)_DP(*(unsigned *)djaddr2ptr(djthunk_get(_S(_##x))), sizeof(t)); \ } #undef ASM_ARR #define ASM_ARR(t, x, l) \ t *__##x(void) \ { \ return (t *)djaddr2ptr2(djthunk_get(_S(_##x)), sizeof(t) * (l)); \ } #endif #undef EXTERN #define EXTERN #endif #define __out