From 7989ffc542ec4b1675d4b15a317c9479dfa0e64f Mon Sep 17 00:00:00 2001 From: kichikuou Date: Wed, 11 Jun 2025 12:13:19 +0900 Subject: [PATCH 1/2] Implement CalcTable HLL It provides 64-bit calculation functions with virtual registers. While the original CalcTable.dll accumulates instructions and executes them with CalcTable.Run(), this implementation performs calculations on the fly. This simplification is possible because Run() is only called with loop=1. --- CMakeLists.txt | 1 + src/ffi.c | 2 + src/hll/CalcTable.c | 167 ++++++++++++++++++++++++++++++++++++++++++++ src/meson.build | 1 + 4 files changed, 171 insertions(+) create mode 100644 src/hll/CalcTable.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 33723b4..cae6ce1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -111,6 +111,7 @@ target_sources(xsystem4 PRIVATE src/hll/AnteaterADVEngine.c src/hll/BanMisc.c src/hll/Bitarray.c + src/hll/CalcTable.c src/hll/CGManager.c src/hll/CharSpriteManager.c src/hll/ChipmunkSpriteEngine.c diff --git a/src/ffi.c b/src/ffi.c index 529ee21..5fa5b3c 100644 --- a/src/ffi.c +++ b/src/ffi.c @@ -416,6 +416,7 @@ extern struct static_library lib_AliceLogo5; extern struct static_library lib_AnteaterADVEngine; extern struct static_library lib_BanMisc; extern struct static_library lib_Bitarray; +extern struct static_library lib_CalcTable; extern struct static_library lib_CGManager; extern struct static_library lib_ChipmunkSpriteEngine; extern struct static_library lib_ChrLoader; @@ -523,6 +524,7 @@ static struct static_library *static_libraries[] = { &lib_AnteaterADVEngine, &lib_BanMisc, &lib_Bitarray, + &lib_CalcTable, &lib_CGManager, &lib_ChipmunkSpriteEngine, &lib_ChrLoader, diff --git a/src/hll/CalcTable.c b/src/hll/CalcTable.c new file mode 100644 index 0000000..90d28ac --- /dev/null +++ b/src/hll/CalcTable.c @@ -0,0 +1,167 @@ +/* Copyright (C) 2025 kichikuou + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#include +#include "hll.h" + +#define REG_COUNT 32 + +static int64_t regs[REG_COUNT]; + +#define REG_CHECK(reg) ((reg) >= 0 && (reg) < REG_COUNT) + +static int CalcTable_Get(int reg) +{ + if (reg < 0 || reg >= REG_COUNT) + return 0; + if (regs[reg] > INT32_MAX) + return INT32_MAX; + if (regs[reg] < INT32_MIN) + return INT32_MIN; + return (int)regs[reg]; +} + +static void CalcTable_Init(bool clear) +{ + if (clear) { + memset(regs, 0, sizeof(regs)); + } +} + +static bool CalcTable_Set(int regR, int num) +{ + if (!REG_CHECK(regR)) + return false; + regs[regR] = num; + return true; +} + +static bool CalcTable_Copy(int regR, int regA) +{ + if (!REG_CHECK(regR) || !REG_CHECK(regA)) + return false; + regs[regR] = regs[regA]; + return true; +} + +static bool CalcTable_Add(int regR, int regA, int regB) +{ + if (!REG_CHECK(regR) || !REG_CHECK(regA) || !REG_CHECK(regB)) + return false; + regs[regR] = regs[regA] + regs[regB]; + return true; +} + +static bool CalcTable_Sub(int regR, int regA, int regB) +{ + if (!REG_CHECK(regR) || !REG_CHECK(regA) || !REG_CHECK(regB)) + return false; + regs[regR] = regs[regA] - regs[regB]; + return true; +} + +static bool CalcTable_Mul(int regR, int regA, int regB) +{ + if (!REG_CHECK(regR) || !REG_CHECK(regA) || !REG_CHECK(regB)) + return false; + regs[regR] = regs[regA] * regs[regB]; + return true; +} + +static bool CalcTable_Div(int regR, int regA, int regB) +{ + if (!REG_CHECK(regR) || !REG_CHECK(regA) || !REG_CHECK(regB)) + return false; + regs[regR] = regs[regA] / regs[regB]; // NOTE: No check for division by zero + return true; +} + +static bool CalcTable_And(int regR, int regA, int regB) +{ + if (!REG_CHECK(regR) || !REG_CHECK(regA) || !REG_CHECK(regB)) + return false; + regs[regR] = regs[regA] & regs[regB]; + return true; +} + +static bool CalcTable_Or(int regR, int regA, int regB) +{ + if (!REG_CHECK(regR) || !REG_CHECK(regA) || !REG_CHECK(regB)) + return false; + regs[regR] = regs[regA] | regs[regB]; + return true; +} + +static bool CalcTable_Xor(int regR, int regA, int regB) +{ + if (!REG_CHECK(regR) || !REG_CHECK(regA) || !REG_CHECK(regB)) + return false; + regs[regR] = regs[regA] ^ regs[regB]; + return true; +} + +static bool CalcTable_ShiftL(int regR, int regA, int regB) +{ + if (!REG_CHECK(regR) || !REG_CHECK(regA) || !REG_CHECK(regB)) + return false; + regs[regR] = regs[regA] << regs[regB]; + return true; +} + +static bool CalcTable_ShiftR(int regR, int regA, int regB) +{ + if (!REG_CHECK(regR) || !REG_CHECK(regA) || !REG_CHECK(regB)) + return false; + regs[regR] = regs[regA] >> regs[regB]; + return true; +} + +static bool CalcTable_Percent(int regR, int regA, int regB, bool rounding) +{ + if (!REG_CHECK(regR) || !REG_CHECK(regA) || !REG_CHECK(regB)) + return false; + int64_t v = regs[regA] * regs[regB]; + int64_t q = v / 100; + int64_t r = v % 100; + regs[regR] = q + (rounding && r != 0 ? 1 : 0); + return true; +} + +static void CalcTable_Run(int loop) +{ + if (loop != 1) { + VM_ERROR("Unsupported loop count: %d", loop); + } + // This function is a no-op in this implementation. +} + +HLL_LIBRARY(CalcTable, + HLL_EXPORT(Get, CalcTable_Get), + HLL_EXPORT(Init, CalcTable_Init), + HLL_EXPORT(Set, CalcTable_Set), + HLL_EXPORT(Copy, CalcTable_Copy), + HLL_EXPORT(Add, CalcTable_Add), + HLL_EXPORT(Sub, CalcTable_Sub), + HLL_EXPORT(Mul, CalcTable_Mul), + HLL_EXPORT(Div, CalcTable_Div), + HLL_EXPORT(And, CalcTable_And), + HLL_EXPORT(Or, CalcTable_Or), + HLL_EXPORT(Xor, CalcTable_Xor), + HLL_EXPORT(ShiftL, CalcTable_ShiftL), + HLL_EXPORT(ShiftR, CalcTable_ShiftR), + HLL_EXPORT(Percent, CalcTable_Percent), + HLL_EXPORT(Run, CalcTable_Run) + ); diff --git a/src/meson.build b/src/meson.build index 0f821b2..dd6a127 100644 --- a/src/meson.build +++ b/src/meson.build @@ -72,6 +72,7 @@ xsystem4 = [version_h, 'hll/AnteaterADVEngine.c', 'hll/BanMisc.c', 'hll/Bitarray.c', + 'hll/CalcTable.c', 'hll/CGManager.c', 'hll/CharSpriteManager.c', 'hll/ChipmunkSpriteEngine.c', From e1ca00a27b4d4f1265d0b2d0634422397aa377d8 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Wed, 11 Jun 2025 12:41:57 +0900 Subject: [PATCH 2/2] Implement Array HLL This HLL defines numerous functions, but only two are used in Dungeons & Dolls: NV_eneq and NV_sceq. --- CMakeLists.txt | 1 + src/ffi.c | 2 + src/hll/Array.c | 498 ++++++++++++++++++++++++++++++++++++++++++++++++ src/meson.build | 1 + 4 files changed, 502 insertions(+) create mode 100644 src/hll/Array.c diff --git a/CMakeLists.txt b/CMakeLists.txt index cae6ce1..91333d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,6 +109,7 @@ target_sources(xsystem4 PRIVATE src/hll/AliceLogo4.c src/hll/AliceLogo5.c src/hll/AnteaterADVEngine.c + src/hll/Array.c src/hll/BanMisc.c src/hll/Bitarray.c src/hll/CalcTable.c diff --git a/src/ffi.c b/src/ffi.c index 5fa5b3c..94e349b 100644 --- a/src/ffi.c +++ b/src/ffi.c @@ -414,6 +414,7 @@ extern struct static_library lib_AliceLogo3; extern struct static_library lib_AliceLogo4; extern struct static_library lib_AliceLogo5; extern struct static_library lib_AnteaterADVEngine; +extern struct static_library lib_Array; extern struct static_library lib_BanMisc; extern struct static_library lib_Bitarray; extern struct static_library lib_CalcTable; @@ -522,6 +523,7 @@ static struct static_library *static_libraries[] = { &lib_AliceLogo4, &lib_AliceLogo5, &lib_AnteaterADVEngine, + &lib_Array, &lib_BanMisc, &lib_Bitarray, &lib_CalcTable, diff --git a/src/hll/Array.c b/src/hll/Array.c new file mode 100644 index 0000000..451cce9 --- /dev/null +++ b/src/hll/Array.c @@ -0,0 +1,498 @@ +/* Copyright (C) 2025 kichikuou + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#include "hll.h" +#include "vm/page.h" + +static void check_array(struct page *array) +{ + if (array->type != ARRAY_PAGE || array->a_type != AIN_ARRAY_INT || array->array.rank != 1) + VM_ERROR("Not a flat integer array"); +} + +//void Array_NV_copy(struct page **nArray, int nNum); +//void Array_NV_add(struct page **nArray, int nNum); +//void Array_NV_sub(struct page **nArray, int nNum); +//void Array_NV_mul(struct page **nArray, int nNum); +//void Array_NV_div(struct page **nArray, int nNum); +//void Array_NV_and(struct page **nArray, int nNum); +//void Array_NV_or(struct page **nArray, int nNum); +//void Array_NV_xor(struct page **nArray, int nNum); +//void Array_NV_min(struct page **nArray, int nNum); +//void Array_NV_max(struct page **nArray, int nNum); +//void Array_NN_copy(struct page **nArray, struct page *nArrayS); +//void Array_NN_add(struct page **nArray, struct page *nArrayS); +//void Array_NN_sub(struct page **nArray, struct page *nArrayS); +//void Array_NN_mul(struct page **nArray, struct page *nArrayS); +//void Array_NN_div(struct page **nArray, struct page *nArrayS); +//void Array_NN_and(struct page **nArray, struct page *nArrayS); +//void Array_NN_or(struct page **nArray, struct page *nArrayS); +//void Array_NN_xor(struct page **nArray, struct page *nArrayS); +//void Array_NN_min(struct page **nArray, struct page *nArrayS); +//void Array_NN_max(struct page **nArray, struct page *nArrayS); +//void Array_NS_copy(struct page **nArray, struct page *sArray, int nMember); +//void Array_NS_add(struct page **nArray, struct page *sArray, int nMember); +//void Array_NS_sub(struct page **nArray, struct page *sArray, int nMember); +//void Array_NS_mul(struct page **nArray, struct page *sArray, int nMember); +//void Array_NS_div(struct page **nArray, struct page *sArray, int nMember); +//void Array_NS_and(struct page **nArray, struct page *sArray, int nMember); +//void Array_NS_or(struct page **nArray, struct page *sArray, int nMember); +//void Array_NS_xor(struct page **nArray, struct page *sArray, int nMember); +//void Array_NS_min(struct page **nArray, struct page *sArray, int nMember); +//void Array_NS_max(struct page **nArray, struct page *sArray, int nMember); +//void Array_SV_copy(struct page **sArray, int nMember, int nNum); +//void Array_SV_add(struct page **sArray, int nMember, int nNum); +//void Array_SV_sub(struct page **sArray, int nMember, int nNum); +//void Array_SV_mul(struct page **sArray, int nMember, int nNum); +//void Array_SV_div(struct page **sArray, int nMember, int nNum); +//void Array_SV_and(struct page **sArray, int nMember, int nNum); +//void Array_SV_or(struct page **sArray, int nMember, int nNum); +//void Array_SV_xor(struct page **sArray, int nMember, int nNum); +//void Array_SV_min(struct page **sArray, int nMember, int nNum); +//void Array_SV_max(struct page **sArray, int nMember, int nNum); +//void Array_SN_copy(struct page **sArray, int nMember, struct page *nArray); +//void Array_SN_add(struct page **sArray, int nMember, struct page *nArray); +//void Array_SN_sub(struct page **sArray, int nMember, struct page *nArray); +//void Array_SN_mul(struct page **sArray, int nMember, struct page *nArray); +//void Array_SN_div(struct page **sArray, int nMember, struct page *nArray); +//void Array_SN_and(struct page **sArray, int nMember, struct page *nArray); +//void Array_SN_or(struct page **sArray, int nMember, struct page *nArray); +//void Array_SN_xor(struct page **sArray, int nMember, struct page *nArray); +//void Array_SN_min(struct page **sArray, int nMember, struct page *nArray); +//void Array_SN_max(struct page **sArray, int nMember, struct page *nArray); +//void Array_SS_copy(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS); +//void Array_SS_add(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS); +//void Array_SS_sub(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS); +//void Array_SS_mul(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS); +//void Array_SS_div(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS); +//void Array_SS_and(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS); +//void Array_SS_or(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS); +//void Array_SS_xor(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS); +//void Array_SS_min(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS); +//void Array_SS_max(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS); + +static int Array_NV_eneq(struct page *array, int num) +{ + if (!array) + return 0; + check_array(array); + int count = 0; + for (int i = 0; i < array->nr_vars; i++) { + if (array->values[i].i == num) + count++; + } + return count; +} + +//int Array_NV_enne(struct page *nArray, int nNum); +//int Array_NV_enlo(struct page *nArray, int nNum); +//int Array_NV_enhi(struct page *nArray, int nNum); +//int Array_NV_enra(struct page *nArray, int nMin, int nMax); +//int Array_NN_eneq(struct page *nArray, struct page *nArrayS); +//int Array_NN_enne(struct page *nArray, struct page *nArrayS); +//int Array_NN_enlo(struct page *nArray, struct page *nArrayS); +//int Array_NN_enhi(struct page *nArray, struct page *nArrayS); +//int Array_NS_eneq(struct page *nArray, struct page *sArray, int nMember); +//int Array_NS_enne(struct page *nArray, struct page *sArray, int nMember); +//int Array_NS_enlo(struct page *nArray, struct page *sArray, int nMember); +//int Array_NS_enhi(struct page *nArray, struct page *sArray, int nMember); +//int Array_SV_eneq(struct page *sArray, int nMember, int nNum); +//int Array_SV_enne(struct page *sArray, int nMember, int nNum); +//int Array_SV_enlo(struct page *sArray, int nMember, int nNum); +//int Array_SV_enhi(struct page *sArray, int nMember, int nNum); +//int Array_SV_enra(struct page *sArray, int nMember, int nMin, int nMax); +//int Array_SN_eneq(struct page *sArray, int nMember, struct page *nArray); +//int Array_SN_enne(struct page *sArray, int nMember, struct page *nArray); +//int Array_SN_enlo(struct page *sArray, int nMember, struct page *nArray); +//int Array_SN_enhi(struct page *sArray, int nMember, struct page *nArray); +//int Array_SS_eneq(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS); +//int Array_SS_enne(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS); +//int Array_SS_enlo(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS); +//int Array_SS_enhi(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS); +//void Array_NV_cheq(struct page **nArray, int nNum, int nChg); +//void Array_NV_chne(struct page **nArray, int nNum, int nChg); +//void Array_NV_chlo(struct page **nArray, int nNum, int nChg); +//void Array_NV_chhi(struct page **nArray, int nNum, int nChg); +//void Array_NV_chra(struct page **nArray, int nMin, int nMax, int nChg); +//void Array_NN_cheq(struct page **nArray, struct page *nArrayS, int nChg); +//void Array_NN_chne(struct page **nArray, struct page *nArrayS, int nChg); +//void Array_NN_chlo(struct page **nArray, struct page *nArrayS, int nChg); +//void Array_NN_chhi(struct page **nArray, struct page *nArrayS, int nChg); +//void Array_NS_cheq(struct page **nArray, struct page *sArray, int nMember, int nChg); +//void Array_NS_chne(struct page **nArray, struct page *sArray, int nMember, int nChg); +//void Array_NS_chlo(struct page **nArray, struct page *sArray, int nMember, int nChg); +//void Array_NS_chhi(struct page **nArray, struct page *sArray, int nMember, int nChg); +//void Array_SV_cheq(struct page **sArray, int nMember, int nNum, int nChg); +//void Array_SV_chne(struct page **sArray, int nMember, int nNum, int nChg); +//void Array_SV_chlo(struct page **sArray, int nMember, int nNum, int nChg); +//void Array_SV_chhi(struct page **sArray, int nMember, int nNum, int nChg); +//void Array_SV_chra(struct page **sArray, int nMember, int nMin, int nMax, int nChg); +//void Array_SN_cheq(struct page **sArray, int nMember, struct page *nArray, int nChg); +//void Array_SN_chne(struct page **sArray, int nMember, struct page *nArray, int nChg); +//void Array_SN_chlo(struct page **sArray, int nMember, struct page *nArray, int nChg); +//void Array_SN_chhi(struct page **sArray, int nMember, struct page *nArray, int nChg); +//void Array_SS_cheq(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS, int nChg); +//void Array_SS_chne(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS, int nChg); +//void Array_SS_chlo(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS, int nChg); +//void Array_SS_chhi(struct page **sArray, int nMember, struct page *sArrayS, int nMemberS, int nChg); +//void Array_NV_fweq(struct page *nArray, int nNum, struct page **nArrayD); +//void Array_NV_fwne(struct page *nArray, int nNum, struct page **nArrayD); +//void Array_NV_fwlo(struct page *nArray, int nNum, struct page **nArrayD); +//void Array_NV_fwhi(struct page *nArray, int nNum, struct page **nArrayD); +//void Array_NV_fwra(struct page *nArray, int nMin, int nMax, struct page **nArrayD); +//void Array_NV_faeq(struct page *nArray, int nNum, struct page **nArrayD); +//void Array_NV_fane(struct page *nArray, int nNum, struct page **nArrayD); +//void Array_NV_falo(struct page *nArray, int nNum, struct page **nArrayD); +//void Array_NV_fahi(struct page *nArray, int nNum, struct page **nArrayD); +//void Array_NV_fara(struct page *nArray, int nMin, int nMax, struct page **nArrayD); +//void Array_NV_foeq(struct page *nArray, int nNum, struct page **nArrayD); +//void Array_NV_fone(struct page *nArray, int nNum, struct page **nArrayD); +//void Array_NV_folo(struct page *nArray, int nNum, struct page **nArrayD); +//void Array_NV_fohi(struct page *nArray, int nNum, struct page **nArrayD); +//void Array_NV_fora(struct page *nArray, int nMin, int nMax, struct page **nArrayD); +//void Array_NN_fweq(struct page *nArray, struct page *nArrayS, struct page **nArrayD); +//void Array_NN_fwne(struct page *nArray, struct page *nArrayS, struct page **nArrayD); +//void Array_NN_fwlo(struct page *nArray, struct page *nArrayS, struct page **nArrayD); +//void Array_NN_fwhi(struct page *nArray, struct page *nArrayS, struct page **nArrayD); +//void Array_NN_faeq(struct page *nArray, struct page *nArrayS, struct page **nArrayD); +//void Array_NN_fane(struct page *nArray, struct page *nArrayS, struct page **nArrayD); +//void Array_NN_falo(struct page *nArray, struct page *nArrayS, struct page **nArrayD); +//void Array_NN_fahi(struct page *nArray, struct page *nArrayS, struct page **nArrayD); +//void Array_NN_foeq(struct page *nArray, struct page *nArrayS, struct page **nArrayD); +//void Array_NN_fone(struct page *nArray, struct page *nArrayS, struct page **nArrayD); +//void Array_NN_folo(struct page *nArray, struct page *nArrayS, struct page **nArrayD); +//void Array_NN_fohi(struct page *nArray, struct page *nArrayS, struct page **nArrayD); +//void Array_NS_fweq(struct page *nArray, struct page *sArray, int nMember, struct page **nArrayD); +//void Array_NS_fwne(struct page *nArray, struct page *sArray, int nMember, struct page **nArrayD); +//void Array_NS_fwlo(struct page *nArray, struct page *sArray, int nMember, struct page **nArrayD); +//void Array_NS_fwhi(struct page *nArray, struct page *sArray, int nMember, struct page **nArrayD); +//void Array_NS_faeq(struct page *nArray, struct page *sArray, int nMember, struct page **nArrayD); +//void Array_NS_fane(struct page *nArray, struct page *sArray, int nMember, struct page **nArrayD); +//void Array_NS_falo(struct page *nArray, struct page *sArray, int nMember, struct page **nArrayD); +//void Array_NS_fahi(struct page *nArray, struct page *sArray, int nMember, struct page **nArrayD); +//void Array_NS_foeq(struct page *nArray, struct page *sArray, int nMember, struct page **nArrayD); +//void Array_NS_fone(struct page *nArray, struct page *sArray, int nMember, struct page **nArrayD); +//void Array_NS_folo(struct page *nArray, struct page *sArray, int nMember, struct page **nArrayD); +//void Array_NS_fohi(struct page *nArray, struct page *sArray, int nMember, struct page **nArrayD); +//void Array_SV_fweq(struct page *sArray, int nMember, int nNum, struct page **nArrayD); +//void Array_SV_fwne(struct page *sArray, int nMember, int nNum, struct page **nArrayD); +//void Array_SV_fwlo(struct page *sArray, int nMember, int nNum, struct page **nArrayD); +//void Array_SV_fwhi(struct page *sArray, int nMember, int nNum, struct page **nArrayD); +//void Array_SV_fwra(struct page *sArray, int nMember, int nMin, int nMax, struct page **nArrayD); +//void Array_SV_faeq(struct page *sArray, int nMember, int nNum, struct page **nArrayD); +//void Array_SV_fane(struct page *sArray, int nMember, int nNum, struct page **nArrayD); +//void Array_SV_falo(struct page *sArray, int nMember, int nNum, struct page **nArrayD); +//void Array_SV_fahi(struct page *sArray, int nMember, int nNum, struct page **nArrayD); +//void Array_SV_fara(struct page *sArray, int nMember, int nMin, int nMax, struct page **nArrayD); +//void Array_SV_foeq(struct page *sArray, int nMember, int nNum, struct page **nArrayD); +//void Array_SV_fone(struct page *sArray, int nMember, int nNum, struct page **nArrayD); +//void Array_SV_folo(struct page *sArray, int nMember, int nNum, struct page **nArrayD); +//void Array_SV_fohi(struct page *sArray, int nMember, int nNum, struct page **nArrayD); +//void Array_SV_fora(struct page *sArray, int nMember, int nMin, int nMax, struct page **nArrayD); +//void Array_SN_fweq(struct page *sArray, int nMember, struct page *nArrayS, struct page **nArrayD); +//void Array_SN_fwne(struct page *sArray, int nMember, struct page *nArrayS, struct page **nArrayD); +//void Array_SN_fwlo(struct page *sArray, int nMember, struct page *nArrayS, struct page **nArrayD); +//void Array_SN_fwhi(struct page *sArray, int nMember, struct page *nArrayS, struct page **nArrayD); +//void Array_SN_faeq(struct page *sArray, int nMember, struct page *nArrayS, struct page **nArrayD); +//void Array_SN_fane(struct page *sArray, int nMember, struct page *nArrayS, struct page **nArrayD); +//void Array_SN_falo(struct page *sArray, int nMember, struct page *nArrayS, struct page **nArrayD); +//void Array_SN_fahi(struct page *sArray, int nMember, struct page *nArrayS, struct page **nArrayD); +//void Array_SN_foeq(struct page *sArray, int nMember, struct page *nArrayS, struct page **nArrayD); +//void Array_SN_fone(struct page *sArray, int nMember, struct page *nArrayS, struct page **nArrayD); +//void Array_SN_folo(struct page *sArray, int nMember, struct page *nArrayS, struct page **nArrayD); +//void Array_SN_fohi(struct page *sArray, int nMember, struct page *nArrayS, struct page **nArrayD); +//void Array_SS_fweq(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS, struct page **nArrayD); +//void Array_SS_fwne(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS, struct page **nArrayD); +//void Array_SS_fwlo(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS, struct page **nArrayD); +//void Array_SS_fwhi(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS, struct page **nArrayD); +//void Array_SS_faeq(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS, struct page **nArrayD); +//void Array_SS_fane(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS, struct page **nArrayD); +//void Array_SS_falo(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS, struct page **nArrayD); +//void Array_SS_fahi(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS, struct page **nArrayD); +//void Array_SS_foeq(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS, struct page **nArrayD); +//void Array_SS_fone(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS, struct page **nArrayD); +//void Array_SS_folo(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS, struct page **nArrayD); +//void Array_SS_fohi(struct page *sArray, int nMember, struct page *sArrayS, int nMemberS, struct page **nArrayD); + +static int Array_NV_sceq(struct page *array, int index, int num, int *out_index) +{ + if (!array) + return 0; + check_array(array); + + if (index >= 0) { + for (int i = index; i < array->nr_vars; i++) { + if (array->values[i].i == num) { + *out_index = i; + return 1; + } + } + } else { + // Negative index means backwards search + index &= 0x7fffffff; + if (index >= array->nr_vars) + return 0; + for (int i = index; i >= 0; --i) { + if (array->values[i].i == num) { + *out_index = i; + return 1; + } + } + } + return 0; + +} + +//int Array_NV_scne(struct page *nArray, int nIndex, int nNum, int *pnIndex); +//int Array_NV_sclo(struct page *nArray, int nIndex, int nNum, int *pnIndex); +//int Array_NV_schi(struct page *nArray, int nIndex, int nNum, int *pnIndex); +//int Array_NV_scra(struct page *nArray, int nIndex, int nMin, int nMax, int *pnIndex); +//int Array_SV_sceq(struct page *sArray, int nMember, int nIndex, int nNum, int *pnIndex); +//int Array_SV_scne(struct page *sArray, int nMember, int nIndex, int nNum, int *pnIndex); +//int Array_SV_sclo(struct page *sArray, int nMember, int nIndex, int nNum, int *pnIndex); +//int Array_SV_schi(struct page *sArray, int nMember, int nIndex, int nNum, int *pnIndex); +//int Array_SV_scra(struct page *sArray, int nMember, int nIndex, int nMin, int nMax, int *pnIndex); +//int Array_NN_sclowest(struct page *nArray, struct page **nArrayD, int *pnIndex); +//int Array_NN_schighest(struct page *nArray, struct page **nArrayD, int *pnIndex); +//int Array_NS_sclowest(struct page *nArray, struct page **sArray, int nMember, int *pnIndex); +//int Array_NS_schighest(struct page *nArray, struct page **sArray, int nMember, int *pnIndex); +//int Array_SN_sclowest(struct page *sArray, int nMember, struct page **nArray, int *pnIndex); +//int Array_SN_schighest(struct page *sArray, int nMember, struct page **nArray, int *pnIndex); +//int Array_SS_sclowest(struct page *sArray, int nMember, struct page **sArrayD, int nMemberS, int *pnIndex); +//int Array_SS_schighest(struct page *sArray, int nMember, struct page **sArrayD, int nMemberS, int *pnIndex); +//int Array_VN_add(struct page *nArray); +//int Array_VN_and(struct page *nArray); +//int Array_VN_or(struct page *nArray); +//int Array_VS_add(struct page *sArray, int nMember); +//int Array_VS_and(struct page *sArray, int nMember); +//int Array_VS_or(struct page *sArray, int nMember); + +HLL_LIBRARY(Array, + HLL_TODO_EXPORT(NV_copy, Array_NV_copy), + HLL_TODO_EXPORT(NV_add, Array_NV_add), + HLL_TODO_EXPORT(NV_sub, Array_NV_sub), + HLL_TODO_EXPORT(NV_mul, Array_NV_mul), + HLL_TODO_EXPORT(NV_div, Array_NV_div), + HLL_TODO_EXPORT(NV_and, Array_NV_and), + HLL_TODO_EXPORT(NV_or, Array_NV_or), + HLL_TODO_EXPORT(NV_xor, Array_NV_xor), + HLL_TODO_EXPORT(NV_min, Array_NV_min), + HLL_TODO_EXPORT(NV_max, Array_NV_max), + HLL_TODO_EXPORT(NN_copy, Array_NN_copy), + HLL_TODO_EXPORT(NN_add, Array_NN_add), + HLL_TODO_EXPORT(NN_sub, Array_NN_sub), + HLL_TODO_EXPORT(NN_mul, Array_NN_mul), + HLL_TODO_EXPORT(NN_div, Array_NN_div), + HLL_TODO_EXPORT(NN_and, Array_NN_and), + HLL_TODO_EXPORT(NN_or, Array_NN_or), + HLL_TODO_EXPORT(NN_xor, Array_NN_xor), + HLL_TODO_EXPORT(NN_min, Array_NN_min), + HLL_TODO_EXPORT(NN_max, Array_NN_max), + HLL_TODO_EXPORT(NS_copy, Array_NS_copy), + HLL_TODO_EXPORT(NS_add, Array_NS_add), + HLL_TODO_EXPORT(NS_sub, Array_NS_sub), + HLL_TODO_EXPORT(NS_mul, Array_NS_mul), + HLL_TODO_EXPORT(NS_div, Array_NS_div), + HLL_TODO_EXPORT(NS_and, Array_NS_and), + HLL_TODO_EXPORT(NS_or, Array_NS_or), + HLL_TODO_EXPORT(NS_xor, Array_NS_xor), + HLL_TODO_EXPORT(NS_min, Array_NS_min), + HLL_TODO_EXPORT(NS_max, Array_NS_max), + HLL_TODO_EXPORT(SV_copy, Array_SV_copy), + HLL_TODO_EXPORT(SV_add, Array_SV_add), + HLL_TODO_EXPORT(SV_sub, Array_SV_sub), + HLL_TODO_EXPORT(SV_mul, Array_SV_mul), + HLL_TODO_EXPORT(SV_div, Array_SV_div), + HLL_TODO_EXPORT(SV_and, Array_SV_and), + HLL_TODO_EXPORT(SV_or, Array_SV_or), + HLL_TODO_EXPORT(SV_xor, Array_SV_xor), + HLL_TODO_EXPORT(SV_min, Array_SV_min), + HLL_TODO_EXPORT(SV_max, Array_SV_max), + HLL_TODO_EXPORT(SN_copy, Array_SN_copy), + HLL_TODO_EXPORT(SN_add, Array_SN_add), + HLL_TODO_EXPORT(SN_sub, Array_SN_sub), + HLL_TODO_EXPORT(SN_mul, Array_SN_mul), + HLL_TODO_EXPORT(SN_div, Array_SN_div), + HLL_TODO_EXPORT(SN_and, Array_SN_and), + HLL_TODO_EXPORT(SN_or, Array_SN_or), + HLL_TODO_EXPORT(SN_xor, Array_SN_xor), + HLL_TODO_EXPORT(SN_min, Array_SN_min), + HLL_TODO_EXPORT(SN_max, Array_SN_max), + HLL_TODO_EXPORT(SS_copy, Array_SS_copy), + HLL_TODO_EXPORT(SS_add, Array_SS_add), + HLL_TODO_EXPORT(SS_sub, Array_SS_sub), + HLL_TODO_EXPORT(SS_mul, Array_SS_mul), + HLL_TODO_EXPORT(SS_div, Array_SS_div), + HLL_TODO_EXPORT(SS_and, Array_SS_and), + HLL_TODO_EXPORT(SS_or, Array_SS_or), + HLL_TODO_EXPORT(SS_xor, Array_SS_xor), + HLL_TODO_EXPORT(SS_min, Array_SS_min), + HLL_TODO_EXPORT(SS_max, Array_SS_max), + HLL_EXPORT(NV_eneq, Array_NV_eneq), + HLL_TODO_EXPORT(NV_enne, Array_NV_enne), + HLL_TODO_EXPORT(NV_enlo, Array_NV_enlo), + HLL_TODO_EXPORT(NV_enhi, Array_NV_enhi), + HLL_TODO_EXPORT(NV_enra, Array_NV_enra), + HLL_TODO_EXPORT(NN_eneq, Array_NN_eneq), + HLL_TODO_EXPORT(NN_enne, Array_NN_enne), + HLL_TODO_EXPORT(NN_enlo, Array_NN_enlo), + HLL_TODO_EXPORT(NN_enhi, Array_NN_enhi), + HLL_TODO_EXPORT(NS_eneq, Array_NS_eneq), + HLL_TODO_EXPORT(NS_enne, Array_NS_enne), + HLL_TODO_EXPORT(NS_enlo, Array_NS_enlo), + HLL_TODO_EXPORT(NS_enhi, Array_NS_enhi), + HLL_TODO_EXPORT(SV_eneq, Array_SV_eneq), + HLL_TODO_EXPORT(SV_enne, Array_SV_enne), + HLL_TODO_EXPORT(SV_enlo, Array_SV_enlo), + HLL_TODO_EXPORT(SV_enhi, Array_SV_enhi), + HLL_TODO_EXPORT(SV_enra, Array_SV_enra), + HLL_TODO_EXPORT(SN_eneq, Array_SN_eneq), + HLL_TODO_EXPORT(SN_enne, Array_SN_enne), + HLL_TODO_EXPORT(SN_enlo, Array_SN_enlo), + HLL_TODO_EXPORT(SN_enhi, Array_SN_enhi), + HLL_TODO_EXPORT(SS_eneq, Array_SS_eneq), + HLL_TODO_EXPORT(SS_enne, Array_SS_enne), + HLL_TODO_EXPORT(SS_enlo, Array_SS_enlo), + HLL_TODO_EXPORT(SS_enhi, Array_SS_enhi), + HLL_TODO_EXPORT(NV_cheq, Array_NV_cheq), + HLL_TODO_EXPORT(NV_chne, Array_NV_chne), + HLL_TODO_EXPORT(NV_chlo, Array_NV_chlo), + HLL_TODO_EXPORT(NV_chhi, Array_NV_chhi), + HLL_TODO_EXPORT(NV_chra, Array_NV_chra), + HLL_TODO_EXPORT(NN_cheq, Array_NN_cheq), + HLL_TODO_EXPORT(NN_chne, Array_NN_chne), + HLL_TODO_EXPORT(NN_chlo, Array_NN_chlo), + HLL_TODO_EXPORT(NN_chhi, Array_NN_chhi), + HLL_TODO_EXPORT(NS_cheq, Array_NS_cheq), + HLL_TODO_EXPORT(NS_chne, Array_NS_chne), + HLL_TODO_EXPORT(NS_chlo, Array_NS_chlo), + HLL_TODO_EXPORT(NS_chhi, Array_NS_chhi), + HLL_TODO_EXPORT(SV_cheq, Array_SV_cheq), + HLL_TODO_EXPORT(SV_chne, Array_SV_chne), + HLL_TODO_EXPORT(SV_chlo, Array_SV_chlo), + HLL_TODO_EXPORT(SV_chhi, Array_SV_chhi), + HLL_TODO_EXPORT(SV_chra, Array_SV_chra), + HLL_TODO_EXPORT(SN_cheq, Array_SN_cheq), + HLL_TODO_EXPORT(SN_chne, Array_SN_chne), + HLL_TODO_EXPORT(SN_chlo, Array_SN_chlo), + HLL_TODO_EXPORT(SN_chhi, Array_SN_chhi), + HLL_TODO_EXPORT(SS_cheq, Array_SS_cheq), + HLL_TODO_EXPORT(SS_chne, Array_SS_chne), + HLL_TODO_EXPORT(SS_chlo, Array_SS_chlo), + HLL_TODO_EXPORT(SS_chhi, Array_SS_chhi), + HLL_TODO_EXPORT(NV_fweq, Array_NV_fweq), + HLL_TODO_EXPORT(NV_fwne, Array_NV_fwne), + HLL_TODO_EXPORT(NV_fwlo, Array_NV_fwlo), + HLL_TODO_EXPORT(NV_fwhi, Array_NV_fwhi), + HLL_TODO_EXPORT(NV_fwra, Array_NV_fwra), + HLL_TODO_EXPORT(NV_faeq, Array_NV_faeq), + HLL_TODO_EXPORT(NV_fane, Array_NV_fane), + HLL_TODO_EXPORT(NV_falo, Array_NV_falo), + HLL_TODO_EXPORT(NV_fahi, Array_NV_fahi), + HLL_TODO_EXPORT(NV_fara, Array_NV_fara), + HLL_TODO_EXPORT(NV_foeq, Array_NV_foeq), + HLL_TODO_EXPORT(NV_fone, Array_NV_fone), + HLL_TODO_EXPORT(NV_folo, Array_NV_folo), + HLL_TODO_EXPORT(NV_fohi, Array_NV_fohi), + HLL_TODO_EXPORT(NV_fora, Array_NV_fora), + HLL_TODO_EXPORT(NN_fweq, Array_NN_fweq), + HLL_TODO_EXPORT(NN_fwne, Array_NN_fwne), + HLL_TODO_EXPORT(NN_fwlo, Array_NN_fwlo), + HLL_TODO_EXPORT(NN_fwhi, Array_NN_fwhi), + HLL_TODO_EXPORT(NN_faeq, Array_NN_faeq), + HLL_TODO_EXPORT(NN_fane, Array_NN_fane), + HLL_TODO_EXPORT(NN_falo, Array_NN_falo), + HLL_TODO_EXPORT(NN_fahi, Array_NN_fahi), + HLL_TODO_EXPORT(NN_foeq, Array_NN_foeq), + HLL_TODO_EXPORT(NN_fone, Array_NN_fone), + HLL_TODO_EXPORT(NN_folo, Array_NN_folo), + HLL_TODO_EXPORT(NN_fohi, Array_NN_fohi), + HLL_TODO_EXPORT(NS_fweq, Array_NS_fweq), + HLL_TODO_EXPORT(NS_fwne, Array_NS_fwne), + HLL_TODO_EXPORT(NS_fwlo, Array_NS_fwlo), + HLL_TODO_EXPORT(NS_fwhi, Array_NS_fwhi), + HLL_TODO_EXPORT(NS_faeq, Array_NS_faeq), + HLL_TODO_EXPORT(NS_fane, Array_NS_fane), + HLL_TODO_EXPORT(NS_falo, Array_NS_falo), + HLL_TODO_EXPORT(NS_fahi, Array_NS_fahi), + HLL_TODO_EXPORT(NS_foeq, Array_NS_foeq), + HLL_TODO_EXPORT(NS_fone, Array_NS_fone), + HLL_TODO_EXPORT(NS_folo, Array_NS_folo), + HLL_TODO_EXPORT(NS_fohi, Array_NS_fohi), + HLL_TODO_EXPORT(SV_fweq, Array_SV_fweq), + HLL_TODO_EXPORT(SV_fwne, Array_SV_fwne), + HLL_TODO_EXPORT(SV_fwlo, Array_SV_fwlo), + HLL_TODO_EXPORT(SV_fwhi, Array_SV_fwhi), + HLL_TODO_EXPORT(SV_fwra, Array_SV_fwra), + HLL_TODO_EXPORT(SV_faeq, Array_SV_faeq), + HLL_TODO_EXPORT(SV_fane, Array_SV_fane), + HLL_TODO_EXPORT(SV_falo, Array_SV_falo), + HLL_TODO_EXPORT(SV_fahi, Array_SV_fahi), + HLL_TODO_EXPORT(SV_fara, Array_SV_fara), + HLL_TODO_EXPORT(SV_foeq, Array_SV_foeq), + HLL_TODO_EXPORT(SV_fone, Array_SV_fone), + HLL_TODO_EXPORT(SV_folo, Array_SV_folo), + HLL_TODO_EXPORT(SV_fohi, Array_SV_fohi), + HLL_TODO_EXPORT(SV_fora, Array_SV_fora), + HLL_TODO_EXPORT(SN_fweq, Array_SN_fweq), + HLL_TODO_EXPORT(SN_fwne, Array_SN_fwne), + HLL_TODO_EXPORT(SN_fwlo, Array_SN_fwlo), + HLL_TODO_EXPORT(SN_fwhi, Array_SN_fwhi), + HLL_TODO_EXPORT(SN_faeq, Array_SN_faeq), + HLL_TODO_EXPORT(SN_fane, Array_SN_fane), + HLL_TODO_EXPORT(SN_falo, Array_SN_falo), + HLL_TODO_EXPORT(SN_fahi, Array_SN_fahi), + HLL_TODO_EXPORT(SN_foeq, Array_SN_foeq), + HLL_TODO_EXPORT(SN_fone, Array_SN_fone), + HLL_TODO_EXPORT(SN_folo, Array_SN_folo), + HLL_TODO_EXPORT(SN_fohi, Array_SN_fohi), + HLL_TODO_EXPORT(SS_fweq, Array_SS_fweq), + HLL_TODO_EXPORT(SS_fwne, Array_SS_fwne), + HLL_TODO_EXPORT(SS_fwlo, Array_SS_fwlo), + HLL_TODO_EXPORT(SS_fwhi, Array_SS_fwhi), + HLL_TODO_EXPORT(SS_faeq, Array_SS_faeq), + HLL_TODO_EXPORT(SS_fane, Array_SS_fane), + HLL_TODO_EXPORT(SS_falo, Array_SS_falo), + HLL_TODO_EXPORT(SS_fahi, Array_SS_fahi), + HLL_TODO_EXPORT(SS_foeq, Array_SS_foeq), + HLL_TODO_EXPORT(SS_fone, Array_SS_fone), + HLL_TODO_EXPORT(SS_folo, Array_SS_folo), + HLL_TODO_EXPORT(SS_fohi, Array_SS_fohi), + HLL_EXPORT(NV_sceq, Array_NV_sceq), + HLL_TODO_EXPORT(NV_scne, Array_NV_scne), + HLL_TODO_EXPORT(NV_sclo, Array_NV_sclo), + HLL_TODO_EXPORT(NV_schi, Array_NV_schi), + HLL_TODO_EXPORT(NV_scra, Array_NV_scra), + HLL_TODO_EXPORT(SV_sceq, Array_SV_sceq), + HLL_TODO_EXPORT(SV_scne, Array_SV_scne), + HLL_TODO_EXPORT(SV_sclo, Array_SV_sclo), + HLL_TODO_EXPORT(SV_schi, Array_SV_schi), + HLL_TODO_EXPORT(SV_scra, Array_SV_scra), + HLL_TODO_EXPORT(NN_sclowest, Array_NN_sclowest), + HLL_TODO_EXPORT(NN_schighest, Array_NN_schighest), + HLL_TODO_EXPORT(NS_sclowest, Array_NS_sclowest), + HLL_TODO_EXPORT(NS_schighest, Array_NS_schighest), + HLL_TODO_EXPORT(SN_sclowest, Array_SN_sclowest), + HLL_TODO_EXPORT(SN_schighest, Array_SN_schighest), + HLL_TODO_EXPORT(SS_sclowest, Array_SS_sclowest), + HLL_TODO_EXPORT(SS_schighest, Array_SS_schighest), + HLL_TODO_EXPORT(VN_add, Array_VN_add), + HLL_TODO_EXPORT(VN_and, Array_VN_and), + HLL_TODO_EXPORT(VN_or, Array_VN_or), + HLL_TODO_EXPORT(VS_add, Array_VS_add), + HLL_TODO_EXPORT(VS_and, Array_VS_and), + HLL_TODO_EXPORT(VS_or, Array_VS_or) + ); diff --git a/src/meson.build b/src/meson.build index dd6a127..a096cf8 100644 --- a/src/meson.build +++ b/src/meson.build @@ -70,6 +70,7 @@ xsystem4 = [version_h, 'hll/AliceLogo4.c', 'hll/AliceLogo5.c', 'hll/AnteaterADVEngine.c', + 'hll/Array.c', 'hll/BanMisc.c', 'hll/Bitarray.c', 'hll/CalcTable.c',