diff options
author | mrb0nk500 <b0nk@b0nk.xyz> | 2022-02-13 20:20:59 -0400 |
---|---|---|
committer | mrb0nk500 <b0nk@b0nk.xyz> | 2022-02-13 20:20:59 -0400 |
commit | f478e6c1223cc8370fa51d44b9244ec25be99788 (patch) | |
tree | 4abe8889888c0b098ea99ee020c446254822a923 /igen/sux-igen/utils.igen | |
parent | 6833f6bc2a5730169084c74d8e8fc0b76666b2a0 (diff) |
igen: Start work on writing an instruction handler
generator.
This will make it easier in the long run to modify
instructions, add new instructions, and move the opcode
tables around.
Diffstat (limited to 'igen/sux-igen/utils.igen')
-rw-r--r-- | igen/sux-igen/utils.igen | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/igen/sux-igen/utils.igen b/igen/sux-igen/utils.igen new file mode 100644 index 0000000..7385117 --- /dev/null +++ b/igen/sux-igen/utils.igen @@ -0,0 +1,50 @@ +update_flags_nz(value) { + cpu->ps.N = bit(value, msb-1); + cpu->ps.Z = value == 0; +} + +get_flag(name, match, flag) { + if (name == match) { + return flag; + } else { + return !flag; + } +} + +jump(addr, fallback, flag) { + if (flag) { + return addr; + } else { + return fallback; + } +} + +read(addr, size) { + return read_value(addr, size); +} + +write(value, addr, size) { + write_value(value, addr, size); +} + +adc(a, b, carry) { + sum = a + b + carry; + update_flags_nz(sum); + cpu->ps.C = sum < b; + cpu->ps.V = bit(a^b, msb-1) && bit(a^sum, msb-1); + return sum; +} + +mul(a, b) { + sum = a * b; + update_flags_nz(sum); + cpu->ps.V = bit(a^b, msb-1) && bit(a^sum, msb-1); + return sum; +} + +div(a, b, *rem) { + sum = a / b; + *rem = a % b; + update_flags_nz(sum); + return sum; +} |