Merge pull request #255 from kichikuou/DnD-hlls

Implement HLLs for Dungeons & Dolls
This commit is contained in:
Nunuhara Cabbage
2025-07-13 08:26:10 -07:00
committed by GitHub
5 changed files with 673 additions and 0 deletions
+2
View File
@@ -109,8 +109,10 @@ 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
src/hll/CGManager.c
src/hll/CharSpriteManager.c
src/hll/ChipmunkSpriteEngine.c
+4
View File
@@ -414,8 +414,10 @@ 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;
extern struct static_library lib_CGManager;
extern struct static_library lib_ChipmunkSpriteEngine;
extern struct static_library lib_ChrLoader;
@@ -521,8 +523,10 @@ static struct static_library *static_libraries[] = {
&lib_AliceLogo4,
&lib_AliceLogo5,
&lib_AnteaterADVEngine,
&lib_Array,
&lib_BanMisc,
&lib_Bitarray,
&lib_CalcTable,
&lib_CGManager,
&lib_ChipmunkSpriteEngine,
&lib_ChrLoader,
+498
View File
@@ -0,0 +1,498 @@
/* Copyright (C) 2025 kichikuou <KichikuouChrome@gmail.com>
*
* 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 <http://gnu.org/licenses/>.
*/
#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)
);
+167
View File
@@ -0,0 +1,167 @@
/* Copyright (C) 2025 kichikuou <KichikuouChrome@gmail.com>
*
* 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 <http://gnu.org/licenses/>.
*/
#include <string.h>
#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)
);
+2
View File
@@ -70,8 +70,10 @@ xsystem4 = [version_h,
'hll/AliceLogo4.c',
'hll/AliceLogo5.c',
'hll/AnteaterADVEngine.c',
'hll/Array.c',
'hll/BanMisc.c',
'hll/Bitarray.c',
'hll/CalcTable.c',
'hll/CGManager.c',
'hll/CharSpriteManager.c',
'hll/ChipmunkSpriteEngine.c',