changeset 35:2e35be400012

took broken instructions out of the iset
author james <jb302@eecs.qmul.ac.uk>
date Thu, 17 Apr 2014 13:34:56 +0100
parents 4411dee34085
children 8205f1734ff2
files bin/emu dbg/dbg.pyc emu/iset.c out
diffstat 3 files changed, 224 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
Binary file bin/emu has changed
Binary file dbg/dbg.pyc has changed
--- a/emu/iset.c	Wed Apr 16 16:51:39 2014 +0100
+++ b/emu/iset.c	Thu Apr 17 13:34:56 2014 +0100
@@ -471,16 +471,63 @@
 
 }
 
+/* 0xA8 - ADDC A, R0
+ * 0xA9 - ADDC A, R1
+ * 0xAA - ADDC A, R2
+ * 0xAB - ADDC A, R3
+ * 0xAC - ADDC A, DPH
+ * 0xAD - ADDC A, DPL
+ * 0xAE - ADDC A, #data8
+ * 0xAF - ADDC A, @DPTR */
 void
 ADDC(void) {
-/* implement me */
+    if (NNN < 6) {
+        if ((A + get_reg(NNN) + get_flag(C)) > 0xFF) {
+            set_flag(C, 1);
+        }
+        else {
+            set_flag(C, 0);
+        }
+        A = A + get_reg(NNN) + get_flag(C);
+        set_zp(A);
+    }
+    else {
+        switch (NNN) {
+            
+            case 6:
+                tmpb = fetch();
+                if ((A + tmpb + get_flag(C)) > 0xFF) {
+                    set_flag(C, 1);
+                }
+                else {
+                    set_flag(C, 0);
+                }
+                A = A + tmpb + get_flag(C);
+                set_zp(A);
+                break;
+
+            case 7:
+                set_wide(TMP, get_wide(DPTR));
+                if ((A + mem[TMP] + get_flag(C)) > 0xFF) {
+                    set_flag(C, 1);
+                }
+                else {
+                    set_flag(C, 0);
+                }
+                A = A + mem[TMP] + get_flag(C);
+                set_zp(A);
+                break;
+        }
+    }
+
+
 }
 
 /* 0xB0 - SUB A, R0
  * 0xB1 - SUB A, R1
  * 0xB2 - SUB A, R2
  * 0xB3 - SUB A, R3
- * 0xB4 - SUB A, DPH
+ * 0xB4 - SB A, DPH
  * 0xB5 - SUB A, DPL
  * 0xB6 - SUB A, #data8
  * 0xB7 - SUB A, @DPTR */
@@ -526,9 +573,54 @@
     }
 }
 
+/* 0xB8 - SUBB A, R0
+ * 0xB9 - SUBB A, R1
+ * 0xBA - SUBB A, R2
+ * 0xBB - SUBB A, R3
+ * 0xBC - SUBB A, DPH
+ * 0xBD - SUBB A, DPL
+ * 0xBE - SUBB A, #data8
+ * 0xBF - SUBB A, @DPTR */
 void
 SUBB(void) {
-    /* implement me */
+    if (NNN < 6) {
+        if ((A - get_reg(NNN) - get_flag(C)) < 0){
+            set_flag(C, 1);
+        }
+        else {
+            set_flag(C, 0);
+        }
+        A = A - get_reg(NNN) -get_flag(C);
+        set_zp(A);
+    }
+    else {
+        switch (NNN) {
+            
+            case 6:
+                tmpb = fetch();
+                if ((A - tmpb - get_flag(C)) < 0) {
+                    set_flag(C, 1);
+                }
+                else {
+                    set_flag(C, 0);
+                }
+                A = A - tmpb - get_flag(C);
+                set_zp(A);
+                break;
+
+            case 7:
+                set_wide(TMP, get_wide(DPTR));
+                if ((A - mem[TMP] - get_flag(C)) < 0) {
+                    set_flag(C, 1);
+                }
+                else {
+                    set_flag(C, 0);
+                }
+                A = A - mem[TMP] - get_flag(C);
+                set_zp(A);
+                break;
+        }
+    }
 }
 
 void
@@ -547,25 +639,73 @@
  * 0xD3 - DJNZ R3, rel8 */
 void
 DJNZ(void) {
+    set_reg(NNN, get_reg(NNN) - 1);
+    if (get_reg(NNN) == 0) {
+        set_wide(PC, get_wide(PC) + (signed char)fetch() - 1);
+    }
+    else {
+        inc_pc(1);
+    }
 }
 
+/* 0xD4 - CJNE R0, #data, rel8
+ * 0xD5 - CJNE R1, #data, rel8
+ * 0xD6 - CJNE R2, #data, rel8
+ * 0xD7 - CJNE R3, #data, rel8 
+ * 0xDF - CJNE A, #data8, rel8 */
 void
 CJNE(void) {
+    switch(IR) {
+        
+        case 0xDF:
+             tmpb = fetch();
+            if (tmpb != A) {
+                set_wide(PC, get_wide(PC) + (signed char)fetch() - 1);
+            }
+            else {
+                inc_pc(1);
+            }
+            break;
+
+
+        default:
+            tmpb = fetch();
+            if (tmpb != get_reg(NNN - 4)) {
+                set_wide(PC, get_wide(PC) + (signed char)fetch() - 1);
+            }
+            else {
+                inc_pc(1);
+            }
+            break;
+    }
 }
 
 /* 0xD8 - LJMP addr16 */
 void
 LJMP(void) {
+    set_wide(PC, fetch_wide());
 }
 
+/* 0xD9 - LCALL addr16 */
 void
 LCALL(void) {
-    /* implement me */
+    /* push PC to stack */
+    mem[get_wide(SP)] = get_reg(PCL);
+    set_wide(SP, get_wide(SP) + 1);
+    mem[get_wide(SP)] = get_reg(PCH);
+    set_wide(SP, get_wide(SP) + 1);
+    /* jmp */
+    set_wide(PC, fetch_wide());
 }
 
+/* 0xDA - RET */
 void
 RET(void) {
-    /* implement me */
+    /* get PC from stack */
+    set_wide(SP, get_wide(SP) - 1);
+    tmpb = mem[get_wide(SP)]; /* PCH */
+    set_wide(SP, get_wide(SP) - 1);
+    set_wide(PC, MWIDE(tmpb, mem[get_wide(SP)]));
 }
 
 void
@@ -687,39 +827,112 @@
     }
 }
 
+/* 0xE8 - PUSH R0
+ * 0xE9 - PUSH R1
+ * 0xEA - PUSH R2
+ * 0xEB - PUSH R3
+ * 0xEC - PUSH DPH
+ * 0xED - PUSH DPL
+ * 0xEE - PUSH A
+ * 0xEF - PUSH FLAGS */
 void
 PUSH(void) {
+    if (NNN < 6) {
+        mem[get_wide(SP)] = get_reg(NNN);
+        set_wide(SP, get_wide(SP) + 1);
+
+    }
+    else {
+        switch(IR) {
+            
+            case 0xEE:
+                mem[get_wide(SP)] = A;
+                set_wide(SP, get_wide(SP) + 1);
+                break;
+
+            case 0xEF:
+                mem[get_wide(SP)] = flags;
+                set_wide(SP, get_wide(SP) + 1);
+                break;
+
+            default:
+                break;
+        }
+    }
 }
 
+/* 0xF0 - POP R0
+ * 0xF1 - POP R1
+ * 0xF2 - POP R2
+ * 0xF3 - POP R3
+ * 0xF4 - POP DPH
+ * 0xF5 - POP DPL
+ * 0xF6 - POP A
+ * 0xF7 - POP FLAGS */
 void
-POP(void) { 
+POP(void) {
+    if (NNN < 6) {
+        set_wide(SP, get_wide(SP) - 1);
+        set_reg(NNN, mem[get_wide(SP)]);
+    }
+    else {
+        switch(IR) {
+            
+            case 0xF6:
+                set_wide(SP, get_wide(SP) - 1);
+                A = mem[get_wide(SP)];
+                break;
+
+            case 0xF7:
+                set_wide(SP, get_wide(SP) - 1);
+                flags = mem[get_wide(SP)];
+                break;
+
+            default:
+                break;
+        }
+    }
 }
 
+
+/* 0xF8 - MUL R0, R1 */
 void
-MUL(void) {    
+MUL(void) {
+ /* implement me */    
 }
 
+/* 0xF9 - DIV R0, R1 */
 void
-DIV(void) {   
+DIV(void) {
+ /* implement me */   
 }
 
+/* 0xFA - DA A */
 void
-DA(void) {    
+DA(void) {
+ /* implement me */
 }
 
+/* 0xFC - IN port_addr */
 void
-IN(void) {   
+IN(void) {
+ /* implement me */   
 }
 
+/* 0xFD - OUT port_addr */
 void
 OUT(void) {
+ /* implement me */
 }
 
+/* 0xFE INT vect8 */
 void
-INT(void) {    
+INT(void) {
+ /* implement me */    
 }
 
 /* 0xFF - HLT */
 void
 HLT(void) {
+ /* implement me */
 }