mirror of
https://github.com/krgamestudios/Toy.git
synced 2026-04-15 23:04:08 +10:00
@@ -50,6 +50,7 @@ jobs:
|
||||
commands:
|
||||
- { build: make repl, run: out/repl.exe -f '../scripts/example.toy' }
|
||||
- { build: make repl, run: out/repl.exe -f '../scripts/example-print.toy' }
|
||||
- { build: make repl, run: out/repl.exe -f '../scripts/example-variables.toy' }
|
||||
|
||||
runs-on: ${{ matrix.platforms.os }}
|
||||
steps:
|
||||
|
||||
@@ -29,6 +29,9 @@ print 6 * 7;
|
||||
//strings can be concatenated with the .. operator
|
||||
print "Hello" .. "world!";
|
||||
|
||||
//declare a variable
|
||||
var foobar = 42;
|
||||
|
||||
//more examples to be added as the features are implemented
|
||||
```
|
||||
|
||||
@@ -53,6 +56,7 @@ This source code is covered by the zlib license (see [LICENSE.md](LICENSE.md)).
|
||||
|
||||
For a guide on how you can contribute, see [CONTRIBUTING.md](CONTRIBUTING.md).
|
||||
|
||||
@8051Enthusiast - `fixAlignment()` trick
|
||||
@hiperiondev - v1 Disassembler, v1 porting support and feedback
|
||||
@add00 - v1 Library support
|
||||
@gruelingpine185 - Unofficial v1 MacOS support
|
||||
|
||||
@@ -15,24 +15,23 @@
|
||||
vm->routine[vm->routineCounter++]
|
||||
|
||||
#define READ_UNSIGNED_INT(vm) \
|
||||
*((unsigned int*)(vm->routine + _read_postfix(&(vm->routineCounter), 4)))
|
||||
*((unsigned int*)(vm->routine + readPostfixUtil(&(vm->routineCounter), 4)))
|
||||
|
||||
#define READ_INT(vm) \
|
||||
*((int*)(vm->routine + _read_postfix(&(vm->routineCounter), 4)))
|
||||
*((int*)(vm->routine + readPostfixUtil(&(vm->routineCounter), 4)))
|
||||
|
||||
#define READ_FLOAT(vm) \
|
||||
*((float*)(vm->routine + _read_postfix(&(vm->routineCounter), 4)))
|
||||
*((float*)(vm->routine + readPostfixUtil(&(vm->routineCounter), 4)))
|
||||
|
||||
static inline int _read_postfix(unsigned int* ptr, int amount) {
|
||||
static inline int readPostfixUtil(unsigned int* ptr, int amount) {
|
||||
int ret = *ptr;
|
||||
*ptr += amount;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void fix_alignment(Toy_VM* vm) {
|
||||
if (vm->routineCounter % 4 != 0) {
|
||||
vm->routineCounter += (4 - vm->routineCounter % 4);
|
||||
}
|
||||
static inline void fixAlignment(Toy_VM* vm) {
|
||||
//NOTE: It's a tilde, not a negative sign
|
||||
vm->routineCounter = (vm->routineCounter + 3) & ~0b11;
|
||||
}
|
||||
|
||||
//instruction handlers
|
||||
@@ -53,19 +52,19 @@ static void processRead(Toy_VM* vm) {
|
||||
}
|
||||
|
||||
case TOY_VALUE_INTEGER: {
|
||||
fix_alignment(vm);
|
||||
fixAlignment(vm);
|
||||
value = TOY_VALUE_FROM_INTEGER(READ_INT(vm));
|
||||
break;
|
||||
}
|
||||
|
||||
case TOY_VALUE_FLOAT: {
|
||||
fix_alignment(vm);
|
||||
fixAlignment(vm);
|
||||
value = TOY_VALUE_FROM_FLOAT(READ_FLOAT(vm));
|
||||
break;
|
||||
}
|
||||
|
||||
case TOY_VALUE_STRING: {
|
||||
fix_alignment(vm);
|
||||
fixAlignment(vm);
|
||||
//grab the jump as an integer
|
||||
unsigned int jump = *(unsigned int*)(vm->routine + vm->jumpsAddr + READ_INT(vm));
|
||||
|
||||
@@ -107,13 +106,13 @@ static void processRead(Toy_VM* vm) {
|
||||
Toy_pushStack(&vm->stack, value);
|
||||
|
||||
//leave the counter in a good spot
|
||||
fix_alignment(vm);
|
||||
fixAlignment(vm);
|
||||
}
|
||||
|
||||
static void processDeclare(Toy_VM* vm) {
|
||||
Toy_ValueType type = READ_BYTE(vm); //variable type
|
||||
unsigned int len = READ_BYTE(vm); //name length
|
||||
fix_alignment(vm); //one spare byte
|
||||
fixAlignment(vm); //one spare byte
|
||||
|
||||
//grab the jump
|
||||
unsigned int jump = *(unsigned int*)(vm->routine + vm->jumpsAddr + READ_INT(vm));
|
||||
@@ -412,7 +411,7 @@ static void process(Toy_VM* vm) {
|
||||
}
|
||||
|
||||
//prepare for the next instruction
|
||||
fix_alignment(vm);
|
||||
fixAlignment(vm);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user