diff options
| author | 2025-08-26 18:42:48 +0330 | |
|---|---|---|
| committer | 2025-08-26 18:42:48 +0330 | |
| commit | fa66a83e2dd1940a9b222bc1c54f3a30305f2140 (patch) | |
| tree | f36b1af29d958e72683d31daeb08200ce3e63fbb /pu2 | |
| parent | compartmentalized the code (diff) | |
small changes
Diffstat (limited to 'pu2')
| -rw-r--r-- | pu2/pu2.c | 66 | ||||
| -rw-r--r-- | pu2/pu2.out.c | 3 |
2 files changed, 48 insertions, 21 deletions
@@ -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. |
