diff options
| author | 2023-03-02 17:30:24 +0000 | |
|---|---|---|
| committer | 2023-03-02 17:30:24 +0000 | |
| commit | 945bcd68a54ebf6794fa791545426e5f29644029 (patch) | |
| tree | 0643c99cd5bfea1cba4a228c2919b2ac148c6764 /creole.c | |
| parent | 0.2.0 (diff) | |
add upsilon opcodes
Diffstat (limited to 'creole.c')
| -rw-r--r-- | creole.c | 61 |
1 files changed, 60 insertions, 1 deletions
@@ -13,6 +13,7 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "creole.h" +#include "upsilon_creole.h" /************************************************************************* * Static information @@ -53,7 +54,17 @@ static const struct { defop(JLE, 3, TYPE_IMM, TYPE_VAL, TYPE_VAL), defop(JE, 3, TYPE_IMM, TYPE_VAL, TYPE_VAL), defop(JNE, 3, TYPE_IMM, TYPE_VAL, TYPE_VAL), - defop(DB, 1, TYPE_IMM, TYPE_NONE, TYPE_NONE) + defop(DB, 1, TYPE_IMM, TYPE_NONE, TYPE_NONE), + defop(READ_ADC, 2, TYPE_VAL, TYPE_REG, TYPE_NONE), + defop(READ_DAC, 2, TYPE_VAL, TYPE_REG, TYPE_NONE), + defop(WRITE_DAC, 2, TYPE_VAL, TYPE_VAL, TYPE_NONE), + defop(SLEEP, 1, TYPE_VAL, TYPE_NONE, TYPE_NONE), + defop(CLOOP_READ, 2, TYPE_VAL, TYPE_REG, TYPE_NONE), + defop(CLOOP_WRITE, 2, TYPE_VAL, TYPE_VAL, TYPE_NONE), + defop(WF_LOAD, 2, TYPE_VAL, TYPE_IMM, TYPE_NONE), + defop(WF_EXEC, 3, TYPE_VAL, TYPE_VAL, TYPE_NONE), + defop(SENDVAL, 1, TYPE_VAL, TYPE_NONE, TYPE_NONE), + defop(SENDDAT, 1, TYPE_IMM, TYPE_NONE, TYPE_NONE) }; /************************************************************************* @@ -560,6 +571,7 @@ enum creole_run_ret creole_step(struct creole_env *env, creole_word *sc) switch (ins.opcode) { case CREOLE_DB: env->dats[ins.w[0]] = ins.datapt; + break; case CREOLE_PUSH: check(read_val(env, &ins, 0, &a1)); check(creole_push(env, a1)); @@ -621,6 +633,53 @@ enum creole_run_ret creole_step(struct creole_env *env, creole_word *sc) if (a1 != a2 && !creole_jump(env, a0)) return CREOLE_JUMP_OVERFLOW; break; + case CREOLE_READ_ADC: + check(read_val(env, &ins, 0, &a0)); + a1 = upsilon_get_adc(a0); + check(creole_reg_write(env, ins.w[1], a1)); + break; + case CREOLE_READ_DAC: + check(read_val(env, &ins, 0, &a0)); + a1 = upsilon_get_dac(a0); + check(creole_reg_write(env, ins.w[1], a1)); + break; + case CREOLE_WRITE_DAC: + check(read_val(env, &ins, 0, &a0)); + check(read_val(env, &ins, 1, &a1)); + upsilon_write_dac(a0, a1); + break; + case CREOLE_SLEEP: + check(read_val(env, &ins, 0, &a0)); + upsilon_sleep(a0); + break; + case CREOLE_CLOOP_READ: + check(read_val(env, &ins, 0, &a0)); + a1 = upsilon_control_loop_read(a0); + check(creole_reg_write(env, ins.w[1], a1)); + break; + case CREOLE_CLOOP_WRITE: + check(read_val(env, &ins, 0, &a0)); + check(read_val(env, &ins, 1, &a1)); + upsilon_control_loop_write(a0, a1); + break; + case CREOLE_WF_LOAD: + check(read_val(env, &ins, 0, &a0)); + check(read_val(env, &ins, 1, &a1)); + upsilon_load_waveform(env, a0, a1); + break; + case CREOLE_WF_EXEC: + check(read_val(env, &ins, 0, &a0)); + check(read_val(env, &ins, 1, &a1)); + upsilon_exec_waveform(a0, a1); + break; + case CREOLE_SENDVAL: + check(read_val(env, &ins, 0, &a0)); + upsilon_sendval(a0); + break; + case CREOLE_SENDDAT: + check(read_val(env, &ins, 0, &a0)); + upsilon_senddat(env, a0); + break; default: rcode = CREOLE_STEP_UNKNOWN_OPCODE; } |
