Commit Graph

448 Commits

Author SHA1 Message Date
Aryadev Chavali
62b9b230c5 Update README 2024-06-25 00:41:43 +01:00
Aryadev Chavali
a24196f236 Fix up some TODOs 2024-06-24 17:03:19 +01:00
Aryadev Chavali
3cd2dbc2ac Registers are now fixed size
todo.org contains an explanation for this
2024-06-24 15:14:11 +01:00
Aryadev Chavali
4ad3d46996 LE ordering in data oriented instructions, make more macros
Little Endian ordering is now ensured for stack based and register
based operations e.g.  PUSH now pushes datums in LE ordering onto the
stack, POP pops data on the stack, converting from LE ordering to host
ordering.

More functions in the runtime are now macro defined, so there's less
code while still maintaining the lookup table.

--------------------------------------------------------------------------------

What LE ordering means for actual source code is that I utilise the
convert_*_to_* functions for PUSH and POP.  All other data oriented
instructions are completely internal to the system and any data
storage must be in Little Endian.  So MOV, PUSH-REGISTER and DUP can
all directly memcpy the data around the system without needing to
consider endian at all.

Macros were a necessity after I felt the redefinition of push for 4
different data types was too much.  Most functions are essentially
copies for each datatype.  Lisp macros would make this so easy :(
2024-06-24 14:29:05 +01:00
Aryadev Chavali
8984c97d33 Clean up runtime source code a little bit 2024-06-20 02:28:15 +01:00
Aryadev Chavali
ecadcb5e36 Remove an include and define BYTE_SIZE 2024-06-20 02:24:23 +01:00
Aryadev Chavali
05235497dc Propagate addition of short based instructions to runtime
Lots of busy work
2024-06-19 21:48:13 +01:00
Aryadev Chavali
1ae28bdb3b Propagating short addition to data types into instructions
(De)Serialising routines now can deal with shorts.
2024-06-19 21:36:39 +01:00
Aryadev Chavali
f2addcef0a Introducing short to data_t and handlers for converting endian 2024-06-19 20:31:16 +01:00
Aryadev Chavali
213d4afcfd long -> sword, int -> shword, char -> sbyte 2024-06-19 20:31:16 +01:00
Aryadev Chavali
bdc6e15ae9 Updated includes, README and TODO 2024-06-19 20:01:20 +01:00
Aryadev Chavali
e3aabff845 Disable -Werror 2024-06-19 19:14:01 +01:00
Aryadev Chavali
92bbf1f9a3 Fix errors in GitHub workflows version of GCC 2024-06-19 19:11:32 +01:00
Aryadev Chavali
c142578254 GitHub workflow now generates release builds 2024-06-19 19:09:12 +01:00
Aryadev Chavali
11f79a84a3 Clean errors in compilation when VERBOSE > 0 2024-06-19 19:07:50 +01:00
Aryadev Chavali
002b21b649 Fix some errors in pedantic mode for testing.h 2024-06-18 23:57:09 +01:00
Aryadev Chavali
4e513dbf01 Fix stupid issues in prog_write_bytecode
In particular, not writing the full words for the program header and
incrementing bytes prematurely.
2024-06-18 23:49:42 +01:00
Aryadev Chavali
99fb0a0e2e Moved OP_HALT to the beginning (stable ABI)
OP_HALT = 1 now.  This commit also adjusts the error checking in
inst_read_bytecode.

The main reasoning behind this is when other platforms or applications
target the AVM: whenever a new opcode may be added, the actual binary
for OP_HALT changes (as a result of how C enums work).

Say your application targets commit alpha of AVM.  OP_HALT is, say,
98.  In commit beta, AVM is updated with a new opcode so OP_HALT is
changed to 99 (due to the new opcode being placed before OP_HALT).  If
your application builds a binary for AVM version alpha and AVM version
beta is used instead, OP_HALT will be interpreted as another
instruction, which can lead to undefined behaviour.

This can be hard to debug, so here I've made the decision to try and
not place new opcodes in between old ones; new ones will always be
placed *before* NUMBER_OF_OPCODES.
2024-06-18 23:49:42 +01:00
Aryadev Chavali
d0ab1644cb Modified Makefile for less colours and a release build option 2024-06-18 23:49:42 +01:00
Aryadev Chavali
66153afbde Some light header pruning 2024-06-17 23:11:30 +01:00
Aryadev Chavali
a60108ae1d Made heap a vector of pages
Instead of using a linked list, which is incredibly fragmented, a
vector keeps all pointers together.  Keeps all our stuff together and
in theory we should have less cache misses when deleting pages.

It does introduce the issue of fragmenting, where if we allocate and
then delete many times a lot of the heap vector will be empty so
traversal will be over a ton of useless stuff.
2024-06-17 23:11:20 +01:00
Aryadev Chavali
b3de11d1f7 Making better documentation 2024-06-04 02:57:51 +01:00
Aryadev Chavali
95a8747c7f Cleaned up .dir-locals.el 2024-06-01 01:14:17 +01:00
Aryadev Chavali
d65da8eb0d char8_t -> char_t 2024-05-05 20:26:07 +05:30
Aryadev Chavali
91af3e14ef Clean up code 2024-05-05 20:20:25 +05:30
Aryadev Chavali
b77cc5639c Now base.c and inst.c are used to make a shared library
Instead of targeting the needed object files, users just need to link
with the shared library.
2024-05-05 20:20:25 +05:30
Aryadev Chavali
7a3e6d180f Use eglot for project
I rely on eglot being enabled for this to work
2024-05-05 20:20:25 +05:30
Aryadev Chavali
a40eaf29b8 OP_HALT is its own opcode, fixed some other minor bugs 2024-05-01 22:36:34 +05:30
Aryadev Chavali
fcc6bce6f9 Added header file for all INST_ macros that I deleted
This can be a possible method of native compilation, albeit requiring
the source code of the project.  Until I explore that this thing will
stay.
2024-04-29 01:42:08 +05:30
Aryadev Chavali
a83653f45d Added vm/struct.h and vm/main.c to documenting TODO 2024-04-29 01:38:51 +05:30
Aryadev Chavali
f64f456dff Finished documenting lib/heap.h 2024-04-29 01:38:43 +05:30
Aryadev Chavali
8ba25b2bf2 Use memset instead of setting properties manually
Does the same thing but it's a bit clearer that I'm not setting
anything.
2024-04-29 01:37:47 +05:30
Aryadev Chavali
e9d5aafde4 Trying to get github tests to work 2024-04-29 01:16:07 +05:30
Aryadev Chavali
ba573fd230 Quick fix to make compilation with VERBOSE=2 work 2024-04-29 01:11:33 +05:30
Aryadev Chavali
d88e297921 Added test to github workflows 2024-04-29 01:10:02 +05:30
Aryadev Chavali
05c3342e27 Added test for darr_append_bytes 2024-04-29 01:07:15 +05:30
Aryadev Chavali
3e64d7855a Changed darr_at to return a pointer 2024-04-29 01:06:58 +05:30
Aryadev Chavali
1fcdf853bd Implemented tests for darr_ensure_capacity and darr_append_byte 2024-04-29 00:38:49 +05:30
Aryadev Chavali
e8671042df Add angle brackets to suite output 2024-04-29 00:11:50 +05:30
Aryadev Chavali
cd6eeeeafe Fix some undefined behaviour in tests 2024-04-29 00:11:35 +05:30
Aryadev Chavali
33ec19566a Started unit testing darr.h 2024-04-28 23:32:01 +05:30
Aryadev Chavali
fadc61c2b0 INFO(..."Testing ... = ...") to "Testing ... -> ..." 2024-04-28 23:30:48 +05:30
Aryadev Chavali
c799eb2706 Adjust DARR_REALLOC_MULT 2024-04-28 23:29:50 +05:30
Aryadev Chavali
fd21e46aa7 Don't run tests on build, make it it's own recipe 2024-04-28 23:29:23 +05:30
Aryadev Chavali
15ed8e32c2 test_lib -> test_lib_base and implement remaining tests for base
Also refactored tests to new byteswap method
2024-04-28 22:33:35 +05:30
Aryadev Chavali
dede607036 If VERBOSE >= 1 then RUN_TEST_SUITE logs for each test of the suite 2024-04-28 22:32:18 +05:30
Aryadev Chavali
2ab1ee34f9 Use byteswap to implement conversion to and from bytes
Cleaner looking implementations
2024-04-28 22:31:41 +05:30
Aryadev Chavali
8aecb7b681 Fixed problem with detecting little endian
Copied the code from stack overflow without thinking about it.  The
first byte in little endian order should always be LSB so I construct
a more contrived example (0xFFFF0000) which should make it easier to
detect what the first byte is considered on the machine.  If it's 0
then the LSB is the first byte hence little endian, otherwise it's big
endian.

On a greater note: Don't never copy no code from stack overflow, bro.
I went up there at 11 o'clock last night trynna get me some code.
Bro, I copied that shit, woke up, my motherfucking LITTLE_ENDIAN
detection don't work.  Explain, bro.
2024-04-28 22:17:51 +05:30
Aryadev Chavali
08c9726333 Fixed bug with converting (h)word to (h)word in terms of endian
While it helped with understanding to use unions as a safe way to
access the underlying bits, this shift based mechanism actually makes
more sense at a glance, particularly by utilising WORD_NTH_BYTE
2024-04-28 20:57:41 +05:30
Aryadev Chavali
7ca9f1b98b Added test_lib_base_hword_to_bytes 2024-04-28 20:57:24 +05:30