/*
* 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
#ifdef _IN_DJ64
#include "thunks_c.h"
#endif
#define ___assert(x)
#define _ARG(n, t, ap) (*(t *)(ap + n))
#define _ARG_PTR(n, t, ap) ((t *)(ap + n))
#define _ARG_R(t) t
#define _ARG_RPTR(t) t *
#define _RET(r) r
#define _RET_PTR(r) PTR_DATA(r)
#ifdef _IN_DJ64
#define DJ64_DISPATCH_FN dj64_thunk_call
#define STATIC
#else
#define STATIC static
static dj64dispatch_t DJ64_DISPATCH_FN;
__attribute__((constructor))
static void init(void)
{
register_dispatch_fn(DJ64_DISPATCH_FN);
}
#endif
STATIC UDWORD DJ64_DISPATCH_FN(int fn, UBYTE *sp, int *r_len)
{
UDWORD ret;
UBYTE rsz = 0;
#define _SP sp
#define _DISP_CMN(f, c) { \
djlogprintf("DJ64: dispatch " #f "\n"); \
c; \
djlogprintf("DJ64: dispatch " #f " done\n"); \
}
#define _DISPATCH(r, rv, rc, f, ...) _DISP_CMN(f, { \
rv _r; \
_r = f(__VA_ARGS__); \
ret = rc(_r); \
rsz = (r); \
})
#define _DISPATCH_v(f, ...) _DISP_CMN(f, { \
ret = ASM_OK; \
f(__VA_ARGS__); \
})
switch (fn) {
#include "thunk_calls.h"
default:
// fdprintf("unknown fn %i\n", fn);
// _fail();
return 0;
}
*r_len = rsz;
return ret;
}