summaryrefslogtreecommitdiff
path: root/igen/sux-igen/utils.igen
diff options
context:
space:
mode:
Diffstat (limited to 'igen/sux-igen/utils.igen')
-rw-r--r--igen/sux-igen/utils.igen50
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;
+}