aboutsummaryrefslogtreecommitdiff
path: root/src/runtime.h
AgeCommit message (Collapse)Author
2023-10-23Extracted code that performs a jump into its own routineAryadev Chavali
Checks if the operand given is a well defined program address, then performs the jump.
2023-10-22Coupled some routines together, implemented OP_PLUS_*, -vm_peekAryadev Chavali
Routines that use the stack for their operands i.e. aren't supplied operands directly all have the same signature. We may as well stick them all together in one array and one conditional, just reduces the number of branches. Also looks nicer. Implemented OP_PLUS_*. Pretty simple to implement. Deleted vm_peek as it was only necessary to update the `ret` register.
2023-10-22Added runtime errors to virtual machineAryadev Chavali
Every vm routine now returns an err_t, which is an enumeration of possible error states. ERR_OK represents the good state and is 0 so error checking seems very natural in terms of language `if (err) ...`. Errors bubble up the runtime, with any callers forced to check if an error occurred. This does mean that routines that call other routines cannot provide an accurate trace of the subcaller (based on the fact that an error is generated for the current instruction), but this should be a non issue as no instruction should be complex enough to need proper traces.
2023-10-22Removed `ret` registerAryadev Chavali
Wasn't useful or necessary.
2023-10-22Implemented vm_* routines for OP_DUP and vm_execute codeAryadev Chavali
2023-10-22Use conversion functions for (h)word to and from bytes instead of bit shiftingAryadev Chavali
Wasn't very secure for endianness, and using these helpers abstracts the details away a bit in case I want to enforce a certain system.
2023-10-22Store the result of OP_POP in the last register as a wordAryadev Chavali
Instead of making routines to handle data in the `ret` register, just store the result of POP into the last word register. This means we are no longer using vm_pop_* or POP_ROUTINES for the vm_execute script on OP_POP: instead we'll just use vm_mov_* which automatically pops the datum for us, while moving the datum to the last register.
2023-10-21Implemented vm routines for OP_EQ_*Aryadev Chavali
2023-10-21Implemented vm routines for OP_XOR_*Aryadev Chavali
2023-10-21Implemented vm routines for OP_AND_*Aryadev Chavali
2023-10-21Implemented vm routines for OP_OR_*Aryadev Chavali
2023-10-21Implemented vm routines for OP_NOT_*Aryadev Chavali
2023-10-21Added vm_execute_all which executes an entire programAryadev Chavali
Handles OP_HALT
2023-10-21Switched from floats to halfwordAryadev Chavali
Registers are now just words, with pushing from and moving to registers with specified subtypes just pushing those types into the word registers. That means there are 8 word registers which can act as 16 half word registers, which themselves can act as 64 byte registers.
2023-10-16Implemented vm_print_* routinesAryadev Chavali
Prints each aspect of the vm, and vm_print_all does it all.
2023-10-16MOV now uses the stack, removed register member in inst_tAryadev Chavali
Instead of taking an operand and a register, mov just uses the stack for the operand. Therefore, there's no need for a register member in inst_t. As a result, PUSH_*_REGISTER now uses the operand for the register.
2023-10-15Moved vm_* code to its own file (runtime.(h|c))Aryadev Chavali