Commit Graph

32 Commits

Author SHA1 Message Date
Aryadev Chavali
9496da9d93 Added and implemented OP_JUMP_IF_*
Performs a jump when the (BYTE|HWORD|WORD) at the top of the stack is
non zero.
2023-10-23 01:45:54 +01:00
Aryadev Chavali
b93a4af495 Extracted code that performs a jump into its own routine
Checks if the operand given is a well defined program address, then
performs the jump.
2023-10-23 01:45:18 +01:00
Aryadev Chavali
2ef104f235 Fixed bug in vm_mov(byte|hword) where registers aren't set properly
This is because we just OR the bits into the specific byte of the
word.  This means the previous state may leave artefacts as the OR
doesn't clear the bits away.

To do so, we apply a bit mask to clear the specified byte(s) of the
word, then perform the OR.
2023-10-23 01:43:24 +01:00
Aryadev Chavali
20030e364c Moved macros to extract nth (byte|hword) from a word to base.h 2023-10-23 00:53:44 +01:00
Aryadev Chavali
00f3b3bf21 Rearrange what is printed in vm_print_all
First the program, then the registers then the stack.
2023-10-23 00:49:59 +01:00
Aryadev Chavali
19eb401498 Fixed bugs with ordering of bytes in some operations
Also fixed an overflow error in vm_dup_word, where I underflow the
index of vm->stack.data which causes a buffer overflow.
2023-10-23 00:28:39 +01:00
Aryadev Chavali
ae9bc91713 Added and implemented OP_PRINT*
Here is where we may have differing interpretations of what the bits
in the data pile may actually mean.  This in particular refers to
printing the signed or unsigned versions of the bits given.  Also,
interpreting some byte as a character or just a raw number.
2023-10-23 00:09:12 +01:00
Aryadev Chavali
45ad8f7296 Fixed bug where vm_print_program listing for program was incorrect
Only happens when vm_print_program(STDERR), as STDERR occurs before
STDOUT on Emacs.  So while the lines would print, no instructions
would follow.  This fixes that by using fp.
2023-10-23 00:08:53 +01:00
Aryadev Chavali
7243ac2533 Coupled some routines together, implemented OP_PLUS_*, -vm_peek
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-22 22:02:53 +01:00
Aryadev Chavali
cc84703725 Added runtime errors to virtual machine
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-22 21:45:38 +01:00
Aryadev Chavali
7f1994c7aa Added and implemented OP_JUMP_(STACK|REGISTER)
Uses the stack and register, respectively, to jump to an absolute
address.  The stack based jump pops a word off the stack to perform a
jump, while the register based one uses the operand to figure out
which register to use.
2023-10-22 20:57:29 +01:00
Aryadev Chavali
d8e45fce04 Removed ret register
Wasn't useful or necessary.
2023-10-22 20:54:29 +01:00
Aryadev Chavali
fffad9aea3 Added and implemented OP_JUMP_ABS
Jumps to the operand given, interpreted as a word, an absolute
address.
2023-10-22 20:54:04 +01:00
Aryadev Chavali
bc0e0fce25 Fixed bug in vm_execute_all, if no OP_HALT then program kept going
This adds a bound on vm_execute_all to stop program->ptr from going
past program->max.
2023-10-22 20:30:17 +01:00
Aryadev Chavali
9da31398ba Implemented vm_* routines for OP_DUP and vm_execute code 2023-10-22 20:30:05 +01:00
Aryadev Chavali
073a23152e Use conversion functions for (h)word to and from bytes instead of bit shifting
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-22 20:29:02 +01:00
Aryadev Chavali
aa3d1cb85f Added NUMBER_OF_OPCODES which aids in compilation errors
If I add a new operand I want the build system to be more helpful in
finding the places I need to change to make it work.
2023-10-22 20:28:10 +01:00
Aryadev Chavali
33364fddab Fix bug where accessing byte/hword registers > 8 wouldn't work
This is because we were checking them as if they were word registers.
2023-10-22 19:28:45 +01:00
Aryadev Chavali
36bcd90c81 When VEROBSE flag is set greater than 0, print traces in vm_execute_all
For each cycle, print the cycle and any changes.  We track changes on
the stack by remembering the previous stack pointer.  For registers, I
remember the previous array of registers and do a byte level compare
of the current registers and the remembered ones.

Produces pretty log messages and an easy way to track execution.
2023-10-22 18:07:41 +01:00
Aryadev Chavali
936971c1a3 Changed formats for vm_print_(stack|program)
Easier to read now
2023-10-22 18:07:41 +01:00
Aryadev Chavali
47c7d6baf7 Store the result of OP_POP in the last register as a word
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-22 17:34:30 +01:00
Aryadev Chavali
95723f36d2 Implemented vm routines for OP_EQ_* 2023-10-21 23:55:51 +01:00
Aryadev Chavali
50ce1b35cd Implemented vm routines for OP_XOR_* 2023-10-21 23:55:41 +01:00
Aryadev Chavali
c9b23b7b24 Implemented vm routines for OP_AND_* 2023-10-21 23:55:29 +01:00
Aryadev Chavali
6161a352e0 Implemented vm routines for OP_OR_* 2023-10-21 23:55:16 +01:00
Aryadev Chavali
ae7f0efc85 Implemented vm routines for OP_NOT_* 2023-10-21 23:54:59 +01:00
Aryadev Chavali
d2cdb211b2 Added vm_execute_all which executes an entire program
Handles OP_HALT
2023-10-21 23:31:48 +01:00
Aryadev Chavali
dcedb70a5c Switched from floats to halfword
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-21 22:57:43 +01:00
Aryadev Chavali
266b4e4572 Implemented vm_print_* routines
Prints each aspect of the vm, and vm_print_all does it all.
2023-10-16 12:55:19 +01:00
Aryadev Chavali
0f37a59940 MOV now uses the stack, removed register member in inst_t
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-16 01:05:42 +01:00
Aryadev Chavali
cd19f1e1d3 Better checking of opcode types
Introduced an enum (opcode_type_t) for the masks and values of each
opcode, which allows defining a single enum which checks an opcode by
a opcode_type_t.
2023-10-15 22:16:31 +01:00
Aryadev Chavali
639808a092 Moved vm_* code to its own file (runtime.(h|c)) 2023-10-15 21:41:16 +01:00