Interactive Bootstraps“Going FORTH” →Requiring your immediate attention

4ed640c995dd0cc25b6058ec6f1b81983071801e
🐶
Allow encoding any suitably-sized literal
If we create a special instruction, which skips over executing the next
number, and instead puts it on the stack, we can put any number onto the
stack without having to call `increment` repeatedly.
TODO: Compare to instructions with immediates

⟨forth.c⟩≡

@@ -1,3+1,4@@
1
+#include <stdint.h>
1 2
 #include <stdio.h>
2 3
 
3 4
 #define ASIZE(x) (sizeof((x)) / sizeof((x)[0]))
@@ -10,18+11,15@@unsigned stack_p;
10 11
 void push(int value) { stack[stack_p++] = value; }
11 12
 int pop(void) { return stack[--stack_p]; }
12 13
 
13
-instruction put_0;
14
-instruction increment;
14
+instruction lit;
15 15
 
16 16
 instruction *prog[] = {
17
-	&put_0,
18
-	&increment,
17
+	&lit,
18
+	(instruction *)2,
19 19
 };
20 20
 int pc = 0;
21 21
 
22
-void put_0(void) { push(0); }
23
-
24
-void increment(void) { push(pop() + 1); }
22
+void lit(void) { push((int)(intptr_t)prog[++pc]); }
25 23
 
26 24
 int main(int argc, char *argv[]) {
27 25
 	for (pc = 0; pc < ASIZE(prog); pc++) {