diff options
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; +} |