#ifndef bci_core_methods_h__ #define bci_core_methods_h__ #include "interpreter.h" /* * This library brings a set of essential core methods. * */ /* * Naming conventions: * * x = 0, 1, 2, 3...: arguments. * 0: small_arg (6 bit) * 1, 2, ...: 16 bit optional arguments * * $x: value of data register x * @x: value of memory word x * #x: value of argument x * 0, 1, 2, ...: integer 0, 1, 2, ... * * -> write result in register/word on the right * * st_reg: status register * su_reg: shutdown register * pc: program counter * * stack: the builtin stack * */ // #1 -> $0 char bci_cm_ldi(uint8_t small_arg, machine_state_t state); // @($1) -> $0 char bci_cm_ld(uint8_t small_arg, machine_state_t state); // $0 -> @($1) char bci_cm_st(uint8_t small_arg, machine_state_t state); // NOTES on inc, dec, add, sub, mul, div: // // These methods will store the overflow-word in $st_reg. // $0 + 1 -> $0 char bci_cm_inc(uint8_t small_arg, machine_state_t state); // $0 - 1 -> $0 char bci_cm_dec(uint8_t small_arg, machine_state_t state); // $0 + $1 -> $0 char bci_cm_add(uint8_t small_arg, machine_state_t state); // $0 - $1 -> $0 char bci_cm_sub(uint8_t small_arg, machine_state_t state); // $0 * $1 -> $0 char bci_cm_mul(uint8_t small_arg, machine_state_t state); // $0 / $1 -> $0 char bci_cm_div(uint8_t small_arg, machine_state_t state); // if($0 > 0): 1 -> $st_reg // else: 0 -> $st_reg char bci_cm_gt(uint8_t small_arg, machine_state_t state); // if($0 >= 0): 1 -> $st_reg // else: 0 -> $st_reg char bci_cm_ge(uint8_t small_arg, machine_state_t state); // if($0 < 0): 1 -> $st_reg // else: 0 -> $st_reg char bci_cm_lt(uint8_t small_arg, machine_state_t state); // if($0 <= 0): 1 -> $st_reg // else: 0 -> $st_reg char bci_cm_le(uint8_t small_arg, machine_state_t state); // if($0 == 0): 1 -> $st_reg // else: 0 -> $st_reg char bci_cm_eq(uint8_t small_arg, machine_state_t state); // if($st_reg): 0 -> $st_reg // else: 1 -> $st_reg char bci_cm_not(uint8_t small_arg, machine_state_t state); // $1 -> $pc char bci_cm_jmp(uint8_t small_arg, machine_state_t state); // if($st_reg): $1 -> $pc // else: do nothing char bci_cm_cjmp(uint8_t small_arg, machine_state_t state); // $pc -> @stack // $0 -> $pc char bci_cm_call(uint8_t small_arg, machine_state_t state); // if($st_reg): $pc -> @stack; $0 -> $pc // else: do nothing char bci_cm_ccall(uint8_t small_arg, machine_state_t state); // @stack -> $pc char bci_cm_ret(uint8_t small_arg, machine_state_t state); // 0 -> $st_reg char bci_cm_cl(uint8_t small_arg, machine_state_t state); // 1 -> $su_reg char bci_cm_stop(uint8_t small_arg, machine_state_t state); #endif