diff emu/mem.c @ 28:6d32e54e5c16

emulator overhauled really, new a better memory structure also cleaned up the file system some what.
author james <jb302@eecs.qmul.ac.uk>
date Fri, 11 Apr 2014 14:38:09 +0100
parents
children 83e80c2c489c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emu/mem.c	Fri Apr 11 14:38:09 2014 +0100
@@ -0,0 +1,67 @@
+/* mem.c
+ * functions for accessing emulator memory */
+#include "mem.h"
+
+/* get flag value
+ * if invalid flag is requested value is 0 */
+BYTE
+get_flag(BYTE flag) {
+    if (flag > 7) {
+        return 0;
+    }
+    else {
+        return GBIT(flags, flag);
+    }
+}
+
+/*  set flag to 0 if on == 0
+ *  otherwise set flag to 1 */
+void
+set_flag(BYTE flag, BYTE on) {
+    if (flag <= 7) {
+        switch (on) {
+            
+            case 0:
+                flags = CBIT(flags, flag);
+
+            default:
+                flags = SBIT(flags, flag);
+        }
+    }
+}
+
+WIDE
+get_wide(BYTE reg) {
+    /* low | (high << 8) */
+    return (regs[reg + 12] | (regs[reg + 4] << 8));
+}
+
+void
+set_wide(BYTE reg, WIDE val) {
+    regs[reg + 4] = (val >> 8) & 0xFF; /* high */
+    regs[reg + 12] = val & 0xFF; /* low */
+}
+
+void 
+inc_pc(BYTE n) {
+    if ((regs[PCL] + n) > 0xFF) {
+        regs[PCH]++;
+    }
+    regs[PCL] += n;
+}
+
+BYTE 
+fetch(void) {
+    BYTE val = mem[get_wide(PC)];
+    inc_pc(1);
+    return val;
+}
+
+WIDE
+fetch_wide(void) {
+    WIDE val = mem[get_wide(PC)] | (mem[get_wide(PC + 1)] << 8);
+    inc_pc(2);
+    return val;
+}
+
+