summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGriffinR <griffin.g.richards@gmail.com>2021-02-19 18:52:24 -0500
committerGriffinR <griffin.g.richards@gmail.com>2021-02-24 11:03:17 -0500
commite52b46ab43d50b02734d1b1b9eeeccdc8daf9789 (patch)
tree76a7aae10ae3f81e3decb3564f4085aeca4e2eb1
parent81a7f491b7053281ad63f6a13067bd1a36249a73 (diff)
Clean up script.c
-rw-r--r--include/script.h2
-rw-r--r--src/script.c84
2 files changed, 49 insertions, 37 deletions
diff --git a/include/script.h b/include/script.h
index f9fb09b5d..63f6f5aef 100644
--- a/include/script.h
+++ b/include/script.h
@@ -26,8 +26,6 @@ u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr);
void SetupNativeScript(struct ScriptContext *ctx, bool8 (*ptr)(void));
void StopScript(struct ScriptContext *ctx);
bool8 RunScriptCommand(struct ScriptContext *ctx);
-u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr);
-const u8 *ScriptPop(struct ScriptContext *ctx);
void ScriptJump(struct ScriptContext *ctx, const u8 *ptr);
void ScriptCall(struct ScriptContext *ctx, const u8 *ptr);
void ScriptReturn(struct ScriptContext *ctx);
diff --git a/src/script.c b/src/script.c
index 69899fdb3..701042da2 100644
--- a/src/script.c
+++ b/src/script.c
@@ -7,9 +7,14 @@
#define RAM_SCRIPT_MAGIC 51
+enum {
+ SCRIPT_MODE_STOPPED,
+ SCRIPT_MODE_BYTECODE,
+ SCRIPT_MODE_NATIVE,
+};
+
extern const u8* gRamScriptRetAddr;
-// ewram bss
static u8 sScriptContext1Status;
static struct ScriptContext sScriptContext1;
static struct ScriptContext sScriptContext2;
@@ -23,57 +28,60 @@ void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTable
{
s32 i;
- ctx->mode = 0;
- ctx->scriptPtr = 0;
+ ctx->mode = SCRIPT_MODE_STOPPED;
+ ctx->scriptPtr = NULL;
ctx->stackDepth = 0;
- ctx->nativePtr = 0;
+ ctx->nativePtr = NULL;
ctx->cmdTable = cmdTable;
ctx->cmdTableEnd = cmdTableEnd;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < (int)ARRAY_COUNT(ctx->data); i++)
ctx->data[i] = 0;
- for (i = 0; i < 20; i++)
- ctx->stack[i] = 0;
+ for (i = 0; i < (int)ARRAY_COUNT(ctx->stack); i++)
+ ctx->stack[i] = NULL;
}
u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr)
{
ctx->scriptPtr = ptr;
- ctx->mode = 1;
+ ctx->mode = SCRIPT_MODE_BYTECODE;
return 1;
}
void SetupNativeScript(struct ScriptContext *ctx, bool8 (*ptr)(void))
{
- ctx->mode = 2;
+ ctx->mode = SCRIPT_MODE_NATIVE;
ctx->nativePtr = ptr;
}
void StopScript(struct ScriptContext *ctx)
{
- ctx->mode = 0;
- ctx->scriptPtr = 0;
+ ctx->mode = SCRIPT_MODE_STOPPED;
+ ctx->scriptPtr = NULL;
}
bool8 RunScriptCommand(struct ScriptContext *ctx)
{
- if (ctx->mode == 0)
+ if (ctx->mode == SCRIPT_MODE_STOPPED)
return FALSE;
switch (ctx->mode)
{
- case 0:
+ case SCRIPT_MODE_STOPPED:
return FALSE;
- case 2:
+ case SCRIPT_MODE_NATIVE:
+ // Try to call a function in C
+ // Continue to bytecode if no function it returns TRUE
if (ctx->nativePtr)
{
if (ctx->nativePtr() == TRUE)
- ctx->mode = 1;
+ ctx->mode = SCRIPT_MODE_BYTECODE;
return TRUE;
}
- ctx->mode = 1;
- case 1:
+ ctx->mode = SCRIPT_MODE_BYTECODE;
+ // fallthrough
+ case SCRIPT_MODE_BYTECODE:
while (1)
{
u8 cmdCode;
@@ -81,7 +89,7 @@ bool8 RunScriptCommand(struct ScriptContext *ctx)
if (!ctx->scriptPtr)
{
- ctx->mode = 0;
+ ctx->mode = SCRIPT_MODE_STOPPED;
return FALSE;
}
@@ -97,11 +105,11 @@ bool8 RunScriptCommand(struct ScriptContext *ctx)
if (func >= ctx->cmdTableEnd)
{
- ctx->mode = 0;
+ ctx->mode = SCRIPT_MODE_STOPPED;
return FALSE;
}
- if ((*func)(ctx) == 1)
+ if ((*func)(ctx) == TRUE)
return TRUE;
}
}
@@ -109,21 +117,21 @@ bool8 RunScriptCommand(struct ScriptContext *ctx)
return TRUE;
}
-u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr)
+static bool8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr)
{
- if (ctx->stackDepth + 1 >= 20)
+ if (ctx->stackDepth + 1 >= (int)ARRAY_COUNT(ctx->stack))
{
- return 1;
+ return TRUE;
}
else
{
ctx->stack[ctx->stackDepth] = ptr;
ctx->stackDepth++;
- return 0;
+ return FALSE;
}
}
-const u8 *ScriptPop(struct ScriptContext *ctx)
+static const u8 *ScriptPop(struct ScriptContext *ctx)
{
if (ctx->stackDepth == 0)
return NULL;
@@ -196,10 +204,10 @@ void ScriptContext1_Init(void)
bool8 ScriptContext2_RunScript(void)
{
if (sScriptContext1Status == 2)
- return 0;
+ return FALSE;
if (sScriptContext1Status == 1)
- return 0;
+ return FALSE;
ScriptContext2_Enable();
@@ -207,10 +215,10 @@ bool8 ScriptContext2_RunScript(void)
{
sScriptContext1Status = 2;
ScriptContext2_Disable();
- return 0;
+ return FALSE;
}
- return 1;
+ return TRUE;
}
void ScriptContext1_SetupScript(const u8 *ptr)
@@ -234,7 +242,7 @@ void EnableBothScriptContexts(void)
void ScriptContext2_RunNewScript(const u8 *ptr)
{
- InitScriptContext(&sScriptContext2, &gScriptCmdTable, &gScriptCmdTableEnd);
+ InitScriptContext(&sScriptContext2, gScriptCmdTable, gScriptCmdTableEnd);
SetupBytecodeScript(&sScriptContext2, ptr);
while (RunScriptCommand(&sScriptContext2) == TRUE);
}
@@ -253,7 +261,7 @@ u8 *MapHeaderGetScriptTable(u8 tag)
if (*mapScripts == tag)
{
mapScripts++;
- return (u8 *)(mapScripts[0] + (mapScripts[1] << 8) + (mapScripts[2] << 16) + (mapScripts[3] << 24));
+ return T2_READ_PTR(mapScripts);
}
mapScripts += 5;
}
@@ -277,14 +285,20 @@ u8 *MapHeaderCheckScriptTable(u8 tag)
{
u16 varIndex1;
u16 varIndex2;
- varIndex1 = ptr[0] | (ptr[1] << 8);
+
+ // Read first var (or .2byte terminal value)
+ varIndex1 = T1_READ_16(ptr);
if (!varIndex1)
- return NULL;
+ return NULL; // Reached end of table
ptr += 2;
- varIndex2 = ptr[0] | (ptr[1] << 8);
+
+ // Read second var
+ varIndex2 = T1_READ_16(ptr);
ptr += 2;
+
+ // Run map script if vars are equal
if (VarGet(varIndex1) == VarGet(varIndex2))
- return (u8 *)(ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24));
+ return T2_READ_PTR(ptr);
ptr += 4;
}
}