diff --git a/src/interpreter.cc b/src/interpreter.cc index 63ceda7..541614b 100644 --- a/src/interpreter.cc +++ b/src/interpreter.cc @@ -15,50 +15,161 @@ #include #include +typedef struct ProgramListNode { + Program* program; + struct ProgramListNode* next; // next + struct ProgramListNode* prev; // prev +} ProgramListNode; + +static int _defaultTimerFunc(); +static char* _defaultFilename_(char* s); +static int _outputStr(char* a1); +static int _checkWait(Program* program); +static char* programGetCurrentProcedureName(Program* s); +static opcode_t stackReadInt16(unsigned char* data, int pos); +static int stackReadInt32(unsigned char* a1, int a2); +static void stackWriteInt16(int value, unsigned char* a2, int a3); +static void stackWriteInt32(int value, unsigned char* stack, int pos); +static void stackPushInt16(unsigned char* a1, int* a2, int value); +static void stackPushInt32(unsigned char* a1, int* a2, int value); +static int stackPopInt32(unsigned char* a1, int* a2); +static opcode_t stackPopInt16(unsigned char* a1, int* a2); +static void programReturnStackPushInt16(Program* program, int value); +static opcode_t programReturnStackPopInt16(Program* program); +static int programReturnStackPopInt32(Program* program); +static void _detachProgram(Program* program); +static void _purgeProgram(Program* program); +static void programFree(Program* program); +static void programMarkHeap(Program* program); +static void opNoop(Program* program); +static void opPush(Program* program); +static void opPushBase(Program* program); +static void opPopBase(Program* program); +static void opPopToBase(Program* program); +static void op802C(Program* program); +static void opDump(Program* program); +static void opDelayedCall(Program* program); +static void opConditionalCall(Program* program); +static void opWait(Program* program); +static void opCancel(Program* program); +static void opCancelAll(Program* program); +static void opIf(Program* program); +static void opWhile(Program* program); +static void opStore(Program* program); +static void opFetch(Program* program); +static void opConditionalOperatorNotEqual(Program* program); +static void opConditionalOperatorEqual(Program* program); +static void opConditionalOperatorLessThanEquals(Program* program); +static void opConditionalOperatorGreaterThanEquals(Program* program); +static void opConditionalOperatorLessThan(Program* program); +static void opConditionalOperatorGreaterThan(Program* program); +static void opAdd(Program* program); +static void opSubtract(Program* program); +static void opMultiply(Program* program); +static void opDivide(Program* program); +static void opModulo(Program* program); +static void opLogicalOperatorAnd(Program* program); +static void opLogicalOperatorOr(Program* program); +static void opLogicalOperatorNot(Program* program); +static void opUnaryMinus(Program* program); +static void opBitwiseOperatorNot(Program* program); +static void opFloor(Program* program); +static void opBitwiseOperatorAnd(Program* program); +static void opBitwiseOperatorOr(Program* program); +static void opBitwiseOperatorXor(Program* program); +static void opSwapReturnStack(Program* program); +static void opLeaveCriticalSection(Program* program); +static void opEnterCriticalSection(Program* program); +static void opJump(Program* program); +static void opCall(Program* program); +static void op801F(Program* program); +static void op801C(Program* program); +static void op801D(Program* program); +static void op8020(Program* program); +static void op8021(Program* program); +static void op8025(Program* program); +static void op8026(Program* program); +static void op8022(Program* program); +static void op8023(Program* program); +static void op8024(Program* program); +static void op801E(Program* program); +static void opAtoD(Program* program); +static void opDtoA(Program* program); +static void opExitProgram(Program* program); +static void opStopProgram(Program* program); +static void opFetchGlobalVariable(Program* program); +static void opStoreGlobalVariable(Program* program); +static void opSwapStack(Program* program); +static void opFetchProcedureAddress(Program* program); +static void opPop(Program* program); +static void opDuplicate(Program* program); +static void opStoreExternalVariable(Program* program); +static void opFetchExternalVariable(Program* program); +static void opExportProcedure(Program* program); +static void opExportVariable(Program* program); +static void opExit(Program* program); +static void opDetach(Program* program); +static void opCallStart(Program* program); +static void opSpawn(Program* program); +static Program* forkProgram(Program* program); +static void opFork(Program* program); +static void opExec(Program* program); +static void opCheckProcedureArgumentCount(Program* program); +static void opLookupStringProc(Program* program); +static void _setupCallWithReturnVal(Program* program, int address, int a3); +static void _setupExternalCallWithReturnVal(Program* program1, Program* program2, int address, int a4); +static void _doEvents(); +static void programListNodeFree(ProgramListNode* programListNode); +static void interpreterPrintStats(); + // 0x50942C -char _aCouldnTFindPro[] = ""; +static char _aCouldnTFindPro[] = ""; // sayTimeoutMsg // 0x519038 int _TimeOut = 0; // 0x51903C -int _Enabled = 1; +static int _Enabled = 1; // 0x519040 -int (*_timerFunc)() = _defaultTimerFunc; +static int (*_timerFunc)() = _defaultTimerFunc; // 0x519044 -int _timerTick = 1000; +static int _timerTick = 1000; // 0x519048 -char* (*_filenameFunc)(char*) = _defaultFilename_; +static char* (*_filenameFunc)(char*) = _defaultFilename_; // 0x51904C -int (*_outputFunc)(char*) = _outputStr; +static int (*_outputFunc)(char*) = _outputStr; // 0x519050 -int _cpuBurstSize = 10; +static int _cpuBurstSize = 10; // 0x59E230 -OpcodeHandler* gInterpreterOpcodeHandlers[342]; +static OpcodeHandler* gInterpreterOpcodeHandlers[342]; // 0x59E78C -Program* gInterpreterCurrentProgram; +static Program* gInterpreterCurrentProgram; // 0x59E790 -ProgramListNode* gInterpreterProgramListHead; -int _suspendEvents; -int _busy; +static ProgramListNode* gInterpreterProgramListHead; + +// 0x59E794 +static int _suspendEvents; + +// 0x59E798 +static int _busy; // 0x4670A0 -int _defaultTimerFunc() +static int _defaultTimerFunc() { return _get_time(); } // 0x4670B4 -char* _defaultFilename_(char* s) +static char* _defaultFilename_(char* s) { return s; } @@ -70,13 +181,13 @@ char* _interpretMangleName(char* s) } // 0x4670C0 -int _outputStr(char* a1) +static int _outputStr(char* a1) { return 1; } // 0x4670C8 -int _checkWait(Program* program) +static int _checkWait(Program* program) { return 1000 * _timerFunc() / _timerTick <= program->field_70; } @@ -107,7 +218,7 @@ int _interpretOutput(const char* format, ...) } // 0x467160 -char* programGetCurrentProcedureName(Program* program) +static char* programGetCurrentProcedureName(Program* program) { int procedureCount = stackReadInt32(program->procedures, 0); unsigned char* ptr = program->procedures + 4; @@ -153,7 +264,7 @@ char* programGetCurrentProcedureName(Program* program) } // 0x467290 -opcode_t stackReadInt16(unsigned char* data, int pos) +static opcode_t stackReadInt16(unsigned char* data, int pos) { // TODO: The return result is probably short. opcode_t value = 0; @@ -163,7 +274,7 @@ opcode_t stackReadInt16(unsigned char* data, int pos) } // 0x4672A4 -int stackReadInt32(unsigned char* data, int pos) +static int stackReadInt32(unsigned char* data, int pos) { int value = 0; value |= data[pos++] << 24; @@ -175,7 +286,7 @@ int stackReadInt32(unsigned char* data, int pos) } // 0x4672D4 -void stackWriteInt16(int value, unsigned char* stack, int pos) +static void stackWriteInt16(int value, unsigned char* stack, int pos) { stack[pos++] = (value >> 8) & 0xFF; stack[pos] = value & 0xFF; @@ -184,7 +295,7 @@ void stackWriteInt16(int value, unsigned char* stack, int pos) // NOTE: Inlined. // // 0x4672E8 -void stackWriteInt32(int value, unsigned char* stack, int pos) +static void stackWriteInt32(int value, unsigned char* stack, int pos) { stack[pos++] = (value >> 24) & 0xFF; stack[pos++] = (value >> 16) & 0xFF; @@ -194,7 +305,7 @@ void stackWriteInt32(int value, unsigned char* stack, int pos) // pushShortStack // 0x467324 -void stackPushInt16(unsigned char* data, int* pointer, int value) +static void stackPushInt16(unsigned char* data, int* pointer, int value) { if (*pointer + 2 >= 0x1000) { programFatalError("pushShortStack: Stack overflow."); @@ -207,7 +318,7 @@ void stackPushInt16(unsigned char* data, int* pointer, int value) // pushLongStack // 0x46736C -void stackPushInt32(unsigned char* data, int* pointer, int value) +static void stackPushInt32(unsigned char* data, int* pointer, int value) { int v1; @@ -224,7 +335,7 @@ void stackPushInt32(unsigned char* data, int* pointer, int value) // popStackLong // 0x4673C4 -int stackPopInt32(unsigned char* data, int* pointer) +static int stackPopInt32(unsigned char* data, int* pointer) { if (*pointer < 4) { programFatalError("\nStack underflow long."); @@ -237,7 +348,7 @@ int stackPopInt32(unsigned char* data, int* pointer) // popStackShort // 0x4673F0 -opcode_t stackPopInt16(unsigned char* data, int* pointer) +static opcode_t stackPopInt16(unsigned char* data, int* pointer) { if (*pointer < 2) { programFatalError("\nStack underflow short."); @@ -305,7 +416,7 @@ int programStackPopInt32(Program* program) } // 0x467510 -void programReturnStackPushInt16(Program* program, int value) +static void programReturnStackPushInt16(Program* program, int value) { stackPushInt16(program->returnStack, &(program->returnStackPointer), value); @@ -316,7 +427,7 @@ void programReturnStackPushInt16(Program* program, int value) } // 0x467574 -opcode_t programReturnStackPopInt16(Program* program) +static opcode_t programReturnStackPopInt16(Program* program) { opcode_t type; int v5; @@ -331,7 +442,7 @@ opcode_t programReturnStackPopInt16(Program* program) } // 0x4675B8 -int programReturnStackPopInt32(Program* program) +static int programReturnStackPopInt32(Program* program) { return stackPopInt32(program->returnStack, &(program->returnStackPointer)); } @@ -339,7 +450,7 @@ int programReturnStackPopInt32(Program* program) // NOTE: Inlined. // // 0x4675C8 -void _detachProgram(Program* program) +static void _detachProgram(Program* program) { Program* parent = program->parent; if (parent != NULL) { @@ -352,7 +463,7 @@ void _detachProgram(Program* program) } // 0x4675F4 -void _purgeProgram(Program* program) +static void _purgeProgram(Program* program) { if (!program->exited) { _removeProgramReferences_(program); @@ -361,7 +472,7 @@ void _purgeProgram(Program* program) } // 0x467614 -void programFree(Program* program) +static void programFree(Program* program) { // NOTE: Uninline. _detachProgram(program); @@ -476,7 +587,7 @@ char* programGetIdentifier(Program* program, int offset) // - negative block length - block is free, attempt to merge with next block. // // 0x4679E0 -void programMarkHeap(Program* program) +static void programMarkHeap(Program* program) { unsigned char* ptr; short len; @@ -595,12 +706,12 @@ int programPushString(Program* program, char* string) } // 0x467C90 -void opNoop(Program* program) +static void opNoop(Program* program) { } // 0x467C94 -void opPush(Program* program) +static void opPush(Program* program) { int pos = program->instructionPointer; program->instructionPointer = pos + 4; @@ -615,7 +726,7 @@ void opPush(Program* program) // - Sets frame pointer to the stack pointer minus number of arguments. // // 0x467CD0 -void opPushBase(Program* program) +static void opPushBase(Program* program) { opcode_t opcode = stackPopInt16(program->stack, &(program->stackPointer)); int value = stackPopInt32(program->stack, &(program->stackPointer)); @@ -632,7 +743,7 @@ void opPushBase(Program* program) // pop_base // 0x467D3C -void opPopBase(Program* program) +static void opPopBase(Program* program) { opcode_t opcode = programReturnStackPopInt16(program); int data = stackPopInt32(program->returnStack, &(program->returnStackPointer)); @@ -647,7 +758,7 @@ void opPopBase(Program* program) } // 0x467D94 -void opPopToBase(Program* program) +static void opPopToBase(Program* program) { while (program->stackPointer != program->framePointer) { opcode_t opcode = stackPopInt16(program->stack, &(program->stackPointer)); @@ -660,13 +771,13 @@ void opPopToBase(Program* program) } // 0x467DE0 -void op802C(Program* program) +static void op802C(Program* program) { program->basePointer = program->stackPointer; } // 0x467DEC -void opDump(Program* program) +static void opDump(Program* program) { opcode_t opcode = stackPopInt16(program->stack, &(program->stackPointer)); int data = stackPopInt32(program->stack, &(program->stackPointer)); @@ -693,7 +804,7 @@ void opDump(Program* program) } // 0x467EA4 -void opDelayedCall(Program* program) +static void opDelayedCall(Program* program) { opcode_t opcode[2]; int data[2]; @@ -732,7 +843,7 @@ void opDelayedCall(Program* program) } // 0x468034 -void opConditionalCall(Program* program) +static void opConditionalCall(Program* program) { opcode_t opcode[2]; int data[2]; @@ -762,7 +873,7 @@ void opConditionalCall(Program* program) } // 0x46817C -void opWait(Program* program) +static void opWait(Program* program) { opcode_t opcode = programStackPopInt16(program); int data = programStackPopInt32(program); @@ -782,7 +893,7 @@ void opWait(Program* program) } // 0x468218 -void opCancel(Program* program) +static void opCancel(Program* program) { opcode_t opcode = programStackPopInt16(program); int data = programStackPopInt32(program); @@ -806,7 +917,7 @@ void opCancel(Program* program) } // 0x468330 -void opCancelAll(Program* program) +static void opCancelAll(Program* program) { int procedureCount = stackReadInt32(program->procedures, 0); @@ -821,7 +932,7 @@ void opCancelAll(Program* program) } // 0x468400 -void opIf(Program* program) +static void opIf(Program* program) { opcode_t opcode = stackPopInt16(program->stack, &(program->stackPointer)); int data = stackPopInt32(program->stack, &(program->stackPointer)); @@ -847,7 +958,7 @@ void opIf(Program* program) } // 0x4684A4 -void opWhile(Program* program) +static void opWhile(Program* program) { opcode_t opcode = stackPopInt16(program->stack, &(program->stackPointer)); int data = stackPopInt32(program->stack, &(program->stackPointer)); @@ -869,7 +980,7 @@ void opWhile(Program* program) } // 0x468518 -void opStore(Program* program) +static void opStore(Program* program) { opcode_t opcode[2]; int data[2]; @@ -907,7 +1018,7 @@ void opStore(Program* program) // fetch // 0x468678 -void opFetch(Program* program) +static void opFetch(Program* program) { char err[256]; @@ -931,7 +1042,7 @@ void opFetch(Program* program) } // 0x46873C -void opConditionalOperatorNotEqual(Program* program) +static void opConditionalOperatorNotEqual(Program* program) { opcode_t opcode[2]; int data[2]; @@ -1021,7 +1132,7 @@ void opConditionalOperatorNotEqual(Program* program) } // 0x468AA8 -void opConditionalOperatorEqual(Program* program) +static void opConditionalOperatorEqual(Program* program) { int arg; opcode_t type[2]; @@ -1111,7 +1222,7 @@ void opConditionalOperatorEqual(Program* program) } // 0x468E14 -void opConditionalOperatorLessThanEquals(Program* program) +static void opConditionalOperatorLessThanEquals(Program* program) { int arg; opcode_t type[2]; @@ -1201,7 +1312,7 @@ void opConditionalOperatorLessThanEquals(Program* program) } // 0x469180 -void opConditionalOperatorGreaterThanEquals(Program* program) +static void opConditionalOperatorGreaterThanEquals(Program* program) { int arg; opcode_t type[2]; @@ -1292,7 +1403,7 @@ void opConditionalOperatorGreaterThanEquals(Program* program) } // 0x4694EC -void opConditionalOperatorLessThan(Program* program) +static void opConditionalOperatorLessThan(Program* program) { opcode_t opcodes[2]; int values[2]; @@ -1381,7 +1492,7 @@ void opConditionalOperatorLessThan(Program* program) } // 0x469858 -void opConditionalOperatorGreaterThan(Program* program) +static void opConditionalOperatorGreaterThan(Program* program) { int arg; opcode_t type[2]; @@ -1471,7 +1582,7 @@ void opConditionalOperatorGreaterThan(Program* program) } // 0x469BC4 -void opAdd(Program* program) +static void opAdd(Program* program) { // TODO: Check everything, too many conditions, variables and allocations. opcode_t opcodes[2]; @@ -1585,7 +1696,7 @@ void opAdd(Program* program) } // 0x46A1D8 -void opSubtract(Program* program) +static void opSubtract(Program* program) { opcode_t type[2]; int value[2]; @@ -1633,7 +1744,7 @@ void opSubtract(Program* program) } // 0x46A300 -void opMultiply(Program* program) +static void opMultiply(Program* program) { int arg; opcode_t type[2]; @@ -1682,7 +1793,7 @@ void opMultiply(Program* program) } // 0x46A424 -void opDivide(Program* program) +static void opDivide(Program* program) { // TODO: Check entire function, probably errors due to casts. opcode_t type[2]; @@ -1745,7 +1856,7 @@ void opDivide(Program* program) } // 0x46A5B8 -void opModulo(Program* program) +static void opModulo(Program* program) { opcode_t type[2]; int value[2]; @@ -1785,7 +1896,7 @@ void opModulo(Program* program) } // 0x46A6B4 -void opLogicalOperatorAnd(Program* program) +static void opLogicalOperatorAnd(Program* program) { opcode_t type[2]; int value[2]; @@ -1864,7 +1975,7 @@ void opLogicalOperatorAnd(Program* program) } // 0x46A8D8 -void opLogicalOperatorOr(Program* program) +static void opLogicalOperatorOr(Program* program) { opcode_t type[2]; int value[2]; @@ -1939,7 +2050,7 @@ void opLogicalOperatorOr(Program* program) } // 0x46AACC -void opLogicalOperatorNot(Program* program) +static void opLogicalOperatorNot(Program* program) { opcode_t type; int value; @@ -1956,7 +2067,7 @@ void opLogicalOperatorNot(Program* program) } // 0x46AB2C -void opUnaryMinus(Program* program) +static void opUnaryMinus(Program* program) { opcode_t type; int value; @@ -1972,7 +2083,7 @@ void opUnaryMinus(Program* program) } // 0x46AB84 -void opBitwiseOperatorNot(Program* program) +static void opBitwiseOperatorNot(Program* program) { opcode_t type; int value; @@ -1990,7 +2101,7 @@ void opBitwiseOperatorNot(Program* program) // floor // 0x46ABDC -void opFloor(Program* program) +static void opFloor(Program* program) { opcode_t type = stackPopInt16(program->stack, &(program->stackPointer)); int data = stackPopInt32(program->stack, &(program->stackPointer)); @@ -2011,7 +2122,7 @@ void opFloor(Program* program) } // 0x46AC78 -void opBitwiseOperatorAnd(Program* program) +static void opBitwiseOperatorAnd(Program* program) { opcode_t type[2]; int value[2]; @@ -2061,7 +2172,7 @@ void opBitwiseOperatorAnd(Program* program) } // 0x46ADA4 -void opBitwiseOperatorOr(Program* program) +static void opBitwiseOperatorOr(Program* program) { opcode_t type[2]; int value[2]; @@ -2111,7 +2222,7 @@ void opBitwiseOperatorOr(Program* program) } // 0x46AED0 -void opBitwiseOperatorXor(Program* program) +static void opBitwiseOperatorXor(Program* program) { opcode_t type[2]; int value[2]; @@ -2161,7 +2272,7 @@ void opBitwiseOperatorXor(Program* program) } // 0x46AFFC -void opSwapReturnStack(Program* program) +static void opSwapReturnStack(Program* program) { opcode_t v1; int v5; @@ -2182,19 +2293,19 @@ void opSwapReturnStack(Program* program) } // 0x46B070 -void opLeaveCriticalSection(Program* program) +static void opLeaveCriticalSection(Program* program) { program->flags &= ~PROGRAM_FLAG_CRITICAL_SECTION; } // 0x46B078 -void opEnterCriticalSection(Program* program) +static void opEnterCriticalSection(Program* program) { program->flags |= PROGRAM_FLAG_CRITICAL_SECTION; } // 0x46B080 -void opJump(Program* program) +static void opJump(Program* program) { opcode_t type; int value; @@ -2218,7 +2329,7 @@ void opJump(Program* program) } // 0x46B108 -void opCall(Program* program) +static void opCall(Program* program) { opcode_t type = stackPopInt16(program->stack, &(program->stackPointer)); int value = stackPopInt32(program->stack, &(program->stackPointer)); @@ -2244,7 +2355,7 @@ void opCall(Program* program) } // 0x46B590 -void op801F(Program* program) +static void op801F(Program* program) { opcode_t opcode[3]; int data[3]; @@ -2265,14 +2376,14 @@ void op801F(Program* program) // pop stack 2 -> set program address // 0x46B63C -void op801C(Program* program) +static void op801C(Program* program) { programReturnStackPopInt16(program); program->instructionPointer = stackPopInt32(program->returnStack, &(program->returnStackPointer)); } // 0x46B658 -void op801D(Program* program) +static void op801D(Program* program) { programReturnStackPopInt16(program); program->instructionPointer = stackPopInt32(program->returnStack, &(program->returnStackPointer)); @@ -2281,7 +2392,7 @@ void op801D(Program* program) } // 0x46B67C -void op8020(Program* program) +static void op8020(Program* program) { op801F(program); programReturnStackPopInt16(program); @@ -2289,7 +2400,7 @@ void op8020(Program* program) } // 0x46B698 -void op8021(Program* program) +static void op8021(Program* program) { op801F(program); programReturnStackPopInt16(program); @@ -2298,7 +2409,7 @@ void op8021(Program* program) } // 0x46B6BC -void op8025(Program* program) +static void op8025(Program* program) { opcode_t type; int value; @@ -2319,7 +2430,7 @@ void op8025(Program* program) } // 0x46B73C -void op8026(Program* program) +static void op8026(Program* program) { opcode_t type; int value; @@ -2352,7 +2463,7 @@ void op8026(Program* program) } // 0x46B808 -void op8022(Program* program) +static void op8022(Program* program) { Program* v1; @@ -2372,7 +2483,7 @@ void op8022(Program* program) } // 0x46B86C -void op8023(Program* program) +static void op8023(Program* program) { Program* v1; @@ -2395,7 +2506,7 @@ void op8023(Program* program) // pop value from stack 1 and push it to script popped from stack 2 // 0x46B8D8 -void op8024(Program* program) +static void op8024(Program* program) { opcode_t type; int value; @@ -2442,14 +2553,14 @@ void op8024(Program* program) } // 0x46BA10 -void op801E(Program* program) +static void op801E(Program* program) { programReturnStackPopInt16(program); programReturnStackPopInt32(program); } // 0x46BA2C -void opAtoD(Program* program) +static void opAtoD(Program* program) { opcode_t opcode = programReturnStackPopInt16(program); int data = stackPopInt32(program->returnStack, &(program->returnStackPointer)); @@ -2459,7 +2570,7 @@ void opAtoD(Program* program) } // 0x46BA68 -void opDtoA(Program* program) +static void opDtoA(Program* program) { opcode_t opcode = stackPopInt16(program->stack, &(program->stackPointer)); int data = stackPopInt32(program->stack, &(program->stackPointer)); @@ -2473,19 +2584,19 @@ void opDtoA(Program* program) } // 0x46BAC0 -void opExitProgram(Program* program) +static void opExitProgram(Program* program) { program->flags |= PROGRAM_FLAG_EXITED; } // 0x46BAC8 -void opStopProgram(Program* program) +static void opStopProgram(Program* program) { program->flags |= PROGRAM_FLAG_STOPPED; } // 0x46BAD0 -void opFetchGlobalVariable(Program* program) +static void opFetchGlobalVariable(Program* program) { opcode_t opcode = programStackPopInt16(program); int data = programStackPopInt32(program); @@ -2505,7 +2616,7 @@ void opFetchGlobalVariable(Program* program) } // 0x46BB5C -void opStoreGlobalVariable(Program* program) +static void opStoreGlobalVariable(Program* program) { opcode_t type[2]; int value[2]; @@ -2540,7 +2651,7 @@ void opStoreGlobalVariable(Program* program) } // 0x46BCAC -void opSwapStack(Program* program) +static void opSwapStack(Program* program) { opcode_t opcode[2]; int data[2]; @@ -2563,7 +2674,7 @@ void opSwapStack(Program* program) // fetch_proc_address // 0x46BD60 -void opFetchProcedureAddress(Program* program) +static void opFetchProcedureAddress(Program* program) { opcode_t opcode = stackPopInt16(program->stack, &(program->stackPointer)); int data = stackPopInt32(program->stack, &(program->stackPointer)); @@ -2588,7 +2699,7 @@ void opFetchProcedureAddress(Program* program) // Pops value from stack and throws it away. // // 0x46BE10 -void opPop(Program* program) +static void opPop(Program* program) { opcode_t opcode = stackPopInt16(program->stack, &(program->stackPointer)); int data = stackPopInt32(program->stack, &(program->stackPointer)); @@ -2599,7 +2710,7 @@ void opPop(Program* program) } // 0x46BE4C -void opDuplicate(Program* program) +static void opDuplicate(Program* program) { opcode_t opcode = programStackPopInt16(program); int data = programStackPopInt32(program); @@ -2616,7 +2727,7 @@ void opDuplicate(Program* program) } // 0x46BEC8 -void opStoreExternalVariable(Program* program) +static void opStoreExternalVariable(Program* program) { opcode_t opcode[2]; int data[2]; @@ -2641,7 +2752,7 @@ void opStoreExternalVariable(Program* program) } // 0x46BF90 -void opFetchExternalVariable(Program* program) +static void opFetchExternalVariable(Program* program) { opcode_t opcode = programStackPopInt16(program); int data = programStackPopInt32(program); @@ -2665,7 +2776,7 @@ void opFetchExternalVariable(Program* program) } // 0x46C044 -void opExportProcedure(Program* program) +static void opExportProcedure(Program* program) { opcode_t type; int value; @@ -2703,7 +2814,7 @@ void opExportProcedure(Program* program) } // 0x46C120 -void opExportVariable(Program* program) +static void opExportVariable(Program* program) { opcode_t opcode = stackPopInt16(program->stack, &(program->stackPointer)); int data = stackPopInt32(program->stack, &(program->stackPointer)); @@ -2720,7 +2831,7 @@ void opExportVariable(Program* program) } // 0x46C1A0 -void opExit(Program* program) +static void opExit(Program* program) { program->flags |= PROGRAM_FLAG_EXITED; @@ -2738,7 +2849,7 @@ void opExit(Program* program) } // 0x46C1EC -void opDetach(Program* program) +static void opDetach(Program* program) { Program* parent = program->parent; if (parent == NULL) { @@ -2755,7 +2866,7 @@ void opDetach(Program* program) // callstart // 0x46C218 -void opCallStart(Program* program) +static void opCallStart(Program* program) { opcode_t type; int value; @@ -2797,7 +2908,7 @@ void opCallStart(Program* program) // spawn // 0x46C344 -void opSpawn(Program* program) +static void opSpawn(Program* program) { opcode_t type; int value; @@ -2850,7 +2961,7 @@ void opSpawn(Program* program) // fork // 0x46C490 -Program* forkProgram(Program* program) +static Program* forkProgram(Program* program) { opcode_t opcode = stackPopInt16(program->stack, &(program->stackPointer)); int data = stackPopInt32(program->stack, &(program->stackPointer)); @@ -2881,13 +2992,13 @@ Program* forkProgram(Program* program) // NOTE: Uncollapsed 0x46C490 with different signature. // // 0x46C490 -void opFork(Program* program) +static void opFork(Program* program) { forkProgram(program); } // 0x46C574 -void opExec(Program* program) +static void opExec(Program* program) { Program* parent = program->parent; Program* fork = forkProgram(program); @@ -2914,7 +3025,7 @@ void opExec(Program* program) } // 0x46C5D8 -void opCheckProcedureArgumentCount(Program* program) +static void opCheckProcedureArgumentCount(Program* program) { opcode_t opcode[2]; int data[2]; @@ -2943,7 +3054,7 @@ void opCheckProcedureArgumentCount(Program* program) // lookup_string_proc // 0x46C6B4 -void opLookupStringProc(Program* program) +static void opLookupStringProc(Program* program) { opcode_t opcode = programStackPopInt16(program); int data = programStackPopInt32(program); @@ -3178,7 +3289,7 @@ void _interpret(Program* program, int a2) // Prepares program stacks for executing proc at [address]. // // 0x46CED0 -void _setupCallWithReturnVal(Program* program, int address, int returnAddress) +static void _setupCallWithReturnVal(Program* program, int address, int returnAddress) { // Save current instruction pointer stackPushInt32(program->returnStack, &(program->returnStackPointer), program->instructionPointer); @@ -3203,7 +3314,7 @@ void _setupCallWithReturnVal(Program* program, int address, int returnAddress) } // 0x46CF9C -void _setupExternalCallWithReturnVal(Program* program1, Program* program2, int address, int a4) +static void _setupExternalCallWithReturnVal(Program* program1, Program* program2, int address, int a4) { stackPushInt32(program2->returnStack, &(program2->returnStackPointer), program2->instructionPointer); programReturnStackPushInt16(program2, VALUE_TYPE_INT); @@ -3383,13 +3494,13 @@ void _executeProcedure(Program* program, int procedure_index) } // 0x46DEE4 -void _doEvents() +static void _doEvents() { // TODO: Incomplete. } // 0x46E10C -void programListNodeFree(ProgramListNode* programListNode) +static void programListNodeFree(ProgramListNode* programListNode) { ProgramListNode* tmp; @@ -3468,7 +3579,7 @@ void interpreterRegisterOpcode(int opcode, OpcodeHandler* handler) } // 0x46E5EC -void interpreterPrintStats() +static void interpreterPrintStats() { ProgramListNode* programListNode = gInterpreterProgramListHead; while (programListNode != NULL) { diff --git a/src/interpreter.h b/src/interpreter.h index ff0d9f8..8bfb005 100644 --- a/src/interpreter.h +++ b/src/interpreter.h @@ -161,148 +161,30 @@ typedef struct Program { typedef void OpcodeHandler(Program* program); -typedef struct ProgramListNode { - Program* program; - struct ProgramListNode* next; // next - struct ProgramListNode* prev; // prev -} ProgramListNode; - extern int _TimeOut; -extern int _Enabled; -extern int (*_timerFunc)(); -extern int _timerTick; -extern char* (*_filenameFunc)(char*); -extern int (*_outputFunc)(char*); -extern int _cpuBurstSize; -extern OpcodeHandler* gInterpreterOpcodeHandlers[OPCODE_MAX_COUNT]; -extern Program* gInterpreterCurrentProgram; -extern ProgramListNode* gInterpreterProgramListHead; -extern int _suspendEvents; -extern int _busy; - -int _defaultTimerFunc(); -char* _defaultFilename_(char* s); char* _interpretMangleName(char* s); -int _outputStr(char* a1); -int _checkWait(Program* program); void _interpretOutputFunc(int (*func)(char*)); int _interpretOutput(const char* format, ...); -char* programGetCurrentProcedureName(Program* s); [[noreturn]] void programFatalError(const char* str, ...); -opcode_t stackReadInt16(unsigned char* data, int pos); -int stackReadInt32(unsigned char* a1, int a2); -void stackWriteInt16(int value, unsigned char* a2, int a3); -void stackWriteInt32(int value, unsigned char* stack, int pos); -void stackPushInt16(unsigned char* a1, int* a2, int value); -void stackPushInt32(unsigned char* a1, int* a2, int value); -int stackPopInt32(unsigned char* a1, int* a2); -opcode_t stackPopInt16(unsigned char* a1, int* a2); void programPopString(Program* program, opcode_t a2, int a3); void programStackPushInt16(Program* program, int value); void programStackPushInt32(Program* program, int value); opcode_t programStackPopInt16(Program* program); int programStackPopInt32(Program* program); -void programReturnStackPushInt16(Program* program, int value); -opcode_t programReturnStackPopInt16(Program* program); -int programReturnStackPopInt32(Program* program); -void _detachProgram(Program* program); -void _purgeProgram(Program* program); -void programFree(Program* program); Program* programCreateByPath(const char* path); char* programGetString(Program* program, opcode_t opcode, int offset); char* programGetIdentifier(Program* program, int offset); -void programMarkHeap(Program* program); int programPushString(Program* program, char* string); -void opNoop(Program* program); -void opPush(Program* program); -void opPushBase(Program* program); -void opPopBase(Program* program); -void opPopToBase(Program* program); -void op802C(Program* program); -void opDump(Program* program); -void opDelayedCall(Program* program); -void opConditionalCall(Program* program); -void opWait(Program* program); -void opCancel(Program* program); -void opCancelAll(Program* program); -void opIf(Program* program); -void opWhile(Program* program); -void opStore(Program* program); -void opFetch(Program* program); -void opConditionalOperatorNotEqual(Program* program); -void opConditionalOperatorEqual(Program* program); -void opConditionalOperatorLessThanEquals(Program* program); -void opConditionalOperatorGreaterThanEquals(Program* program); -void opConditionalOperatorLessThan(Program* program); -void opConditionalOperatorGreaterThan(Program* program); -void opAdd(Program* program); -void opSubtract(Program* program); -void opMultiply(Program* program); -void opDivide(Program* program); -void opModulo(Program* program); -void opLogicalOperatorAnd(Program* program); -void opLogicalOperatorOr(Program* program); -void opLogicalOperatorNot(Program* program); -void opUnaryMinus(Program* program); -void opBitwiseOperatorNot(Program* program); -void opFloor(Program* program); -void opBitwiseOperatorAnd(Program* program); -void opBitwiseOperatorOr(Program* program); -void opBitwiseOperatorXor(Program* program); -void opSwapReturnStack(Program* program); -void opLeaveCriticalSection(Program* program); -void opEnterCriticalSection(Program* program); -void opJump(Program* program); -void opCall(Program* program); -void op801F(Program* program); -void op801C(Program* program); -void op801D(Program* program); -void op8020(Program* program); -void op8021(Program* program); -void op8025(Program* program); -void op8026(Program* program); -void op8022(Program* program); -void op8023(Program* program); -void op8024(Program* program); -void op801E(Program* program); -void opAtoD(Program* program); -void opDtoA(Program* program); -void opExitProgram(Program* program); -void opStopProgram(Program* program); -void opFetchGlobalVariable(Program* program); -void opStoreGlobalVariable(Program* program); -void opSwapStack(Program* program); -void opFetchProcedureAddress(Program* program); -void opPop(Program* program); -void opDuplicate(Program* program); -void opStoreExternalVariable(Program* program); -void opFetchExternalVariable(Program* program); -void opExportProcedure(Program* program); -void opExportVariable(Program* program); -void opExit(Program* program); -void opDetach(Program* program); -void opCallStart(Program* program); -void opSpawn(Program* program); -Program* forkProgram(Program* program); -void opFork(Program* program); -void opExec(Program* program); -void opCheckProcedureArgumentCount(Program* program); -void opLookupStringProc(Program* program); void interpreterRegisterOpcodeHandlers(); void _interpretClose(); void _interpret(Program* program, int a2); -void _setupCallWithReturnVal(Program* program, int address, int a3); -void _setupExternalCallWithReturnVal(Program* program1, Program* program2, int address, int a4); void _executeProc(Program* program, int procedure_index); int programFindProcedure(Program* prg, const char* name); void _executeProcedure(Program* program, int procedure_index); -void _doEvents(); -void programListNodeFree(ProgramListNode* programListNode); void programListNodeCreate(Program* program); void _updatePrograms(); void programListFree(); void interpreterRegisterOpcode(int opcode, OpcodeHandler* handler); -void interpreterPrintStats(); #endif /* INTERPRETER_H */