aboutsummaryrefslogtreecommitdiff
path: root/pu2
diff options
context:
space:
mode:
Diffstat (limited to 'pu2')
-rw-r--r--pu2/pu2.c66
-rw-r--r--pu2/pu2.out.c3
2 files changed, 48 insertions, 21 deletions
diff --git a/pu2/pu2.c b/pu2/pu2.c
index ef5ffd6..fd436a3 100644
--- a/pu2/pu2.c
+++ b/pu2/pu2.c
@@ -518,17 +518,41 @@ clean_slice_ref(slice_t *val) { free(val->ref); }
#define varqual(F) ((F) == '@' || isalpha(F) || (F) == '_')
#define litqual(F) (isdigit(F) || (F) == '\'' || (F) == '"' || (F) == '&')
-// #define emit(OP, VAL) (*code++ = (OP), *code++ = (VAL))
-#define store() (emit(opcode.acc, 1), op(str))
-#define op(mode) emit(opcode.mode, 0)
+#define p_cat(a, b) a##b
+#define cat(a, b) p_cat(a, b)
+
+#define not_subpart_1(__a)
+#define not_subpart_(__a) __a
+#define not(val, ...) cat(not_subpart_, __VA_OPT__(1))(val)
+#define op(mode, ...) emit(opcode.mode, not(0, __VA_ARGS__) __VA_ARGS__)
+
+#define store() (op(acc, 1), op(str))
#define swap() op(swp)
-#define imm(value) emit(opcode.imm, value)
+#define imm(value) op(imm, value)
#define load() op(lod)
-#define imm_in_mem(__mem, __imm) (imm(__mem), emit(opcode.cb3, __imm))
-#define mov_mem_mem(__mem1, __mem2) (imm(__mem1), emit(opcode.cb4, __mem2))
-#define mem_in_a(__mem) emit(opcode.cb2, __mem)
-#define a_in_mem(__mem) emit(opcode.cb1, __mem)
+#define imm_in_mem(__mem, __imm) (imm(__mem), op(cb3, __imm))
+#define mov_mem_mem(__mem1, __mem2) (imm(__mem1), op(cb4, __mem2))
+#define mem_in_a(__mem) op(cb2, __mem)
+#define a_in_mem(__mem) op(cb1, __mem)
#define deref_a() (op(b2u), swap(), load(), op(u2b))
+
+wowie() { op(acc); }
+
+#define check_stack() (0)
+#define perf_sp(__op) \
+ (mem_in_a(storage.stack_pointer), \
+ op(acc, 1), \
+ op(u2b), \
+ op(__op), \
+ a_in_mem(storage.stack_pointer))
+#define inc_sp() perf_sp(add)
+#define dec_sp() perf_sp(sub)
+
+#define push_imm(__imm) (mem_in_a(storage.stack_pointer), op(cb3, __imm), dec_sp())
+#define push_mem(__mem) (mem_in_a(storage.stack_pointer), op(cb4, __mem), dec_sp())
+#define pop_stack_a() (inc_sp(), mem_in_a(storage.stack_pointer), deref_a())
+// #define pop_stack_mem(__mem)
+
#define perform_op(operation) \
({ \
mem_in_a(mem2_index); \
@@ -585,15 +609,15 @@ __ir2_get_var_loc(slice_t name, label_t variables[ 1 << 11 ], string error_I, st
run_err(error_I, "unknown variable name \"%.*s\"", name.len, name.ref);
}
-struct ir2_storage {
+typedef struct {
int *assembly_target;
macro_t *macros;
label_t *labels;
label_delegated_t *forward_refs;
label_t *variables;
-};
+} ir2_storage;
-string _ir2(string I, string filepath, struct ir2_storage storage) {
+string _ir2(string I, string filepath, ir2_storage storage) {
char T;
string init_I = I;
ERR = "all good";
@@ -843,7 +867,7 @@ string _ir2(string I, string filepath, struct ir2_storage storage) {
checkskip(';', "expected semicolon after call");
// actually emit stuff
- if (old != I) emit(opcode.imm, value);
+ if (old != I) imm(value);
op(hlt);
continue;
@@ -1051,9 +1075,9 @@ string _ir2(string I, string filepath, struct ir2_storage storage) {
label_t *variables_G = calloc(1 << 5, sizeof(label_t));
pointers.data = pointers.code = m2;
- struct ir2_storage useless_storage = storage;
- useless_storage.variables = variables_G;
- useless_storage.assembly_target = m2;
+ ir2_storage useless_storage = storage;
+ useless_storage.variables = variables_G;
+ useless_storage.assembly_target = m2;
// get new I location
string new_I = _ir2(I, filepath, useless_storage);
@@ -1138,9 +1162,9 @@ string _ir2(string I, string filepath, struct ir2_storage storage) {
label_t *variables_G = calloc(1 << 5, sizeof(label_t));
pointers.data = pointers.code = m2;
- struct ir2_storage useless_storage = storage;
- useless_storage.assembly_target = m2;
- useless_storage.variables = variables_G;
+ ir2_storage useless_storage = storage;
+ useless_storage.assembly_target = m2;
+ useless_storage.variables = variables_G;
// get new I location
string new_I = _ir2(I, filepath, useless_storage);
@@ -1390,7 +1414,7 @@ string _ir2(string I, string filepath, struct ir2_storage storage) {
checkskip(';', "expected semicolon");
mem_in_a(mem_index);
if (lhs_deref) deref_a();
- emit(opcode.acc, 1);
+ op(acc, 1);
op(u2b);
op(sub);
swap();
@@ -1407,7 +1431,7 @@ string _ir2(string I, string filepath, struct ir2_storage storage) {
checkskip(';', "expected semicolon");
mem_in_a(mem_index);
if (lhs_deref) deref_a();
- emit(opcode.acc, 1);
+ op(acc, 1);
op(u2b);
op(add);
swap();
@@ -1538,7 +1562,7 @@ ir2(string I, string filepath, int *assembly_target) {
label_t *variables = calloc(vars_n, sizeof(*variables));
label_delegated_t *forward_refs = calloc(fwd_n, sizeof(*forward_refs));
- struct ir2_storage storage = { assembly_target, macros, labels, forward_refs, variables };
+ ir2_storage storage = { assembly_target, macros, labels, forward_refs, variables };
if (!macros || !labels || !variables || !forward_refs) {
perror("calloc");
diff --git a/pu2/pu2.out.c b/pu2/pu2.out.c
index 6922ccf..15cff49 100644
--- a/pu2/pu2.out.c
+++ b/pu2/pu2.out.c
@@ -329,6 +329,9 @@ PU2_END:
// 16 CB2: a = m[imm]
// 17 CB3: m[a] = imm
// 18 CB4: m[a] = m[imm]
+// -- should i implement these?
+// 19 CB5: push(a)
+// 20 CB6: pop() -> a
// NOTE: Memory indexes less than 1024 should be considered as temporary/compute memory, and
// programs should be written at index 1024 and upwards.