2003-04-13 Michael Snyder <msnyder@redhat.com>
authorMichael Snyder <msnyder@vmware.com>
Sun, 13 Apr 2003 17:06:29 +0000 (17:06 +0000)
committerMichael Snyder <msnyder@vmware.com>
Sun, 13 Apr 2003 17:06:29 +0000 (17:06 +0000)
* compile.c (sim_resume): Implement 'daa' and 'das' instructions.

sim/h8300/ChangeLog
sim/h8300/compile.c

index c3d79ba750cd91ad5000130529322ceb07b881af..600e9cc08a9434b34d96d53f4790a949b956b39a 100644 (file)
@@ -1,3 +1,7 @@
+2003-04-13  Michael Snyder  <msnyder@redhat.com>
+
+       * compile.c (sim_resume): Implement 'daa' and 'das' instructions.
+
 2003-03-20  D.Venkatasubramanian  <dvenkat@noida.hcltech.com>
 
        * compile.c (cmdline_location): Added function to 
index 54a065913380cb43992a7b07288ace516ed62471..0e4b6d2b2912e952771c75a601b391b1ccddb36c 100644 (file)
@@ -2138,6 +2138,57 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
          }
          goto next;
 
+       case O (O_DAA, SB):
+         /* Decimal Adjust Addition.  This is for BCD arithmetic.  */
+         res = GET_B_REG (code->src.reg);
+         if (!c && (0 <= (res >>  4) && (res >>  4) <= 9) 
+             && !h && (0 <= (res & 0xf) && (res & 0xf) <= 9))
+           res = res;          /* Value added == 0.  */
+         else if (!c && (0  <= (res >>  4) && (res >>  4) <=  8) 
+                  && !h && (10 <= (res & 0xf) && (res & 0xf) <= 15))
+           res = res + 0x6;            /* Value added == 6.  */
+         else if (!c && (0 <= (res >>  4) && (res >>  4) <= 9) 
+                  && h && (0 <= (res & 0xf) && (res & 0xf) <= 3))
+           res = res + 0x6;            /* Value added == 6.  */
+         else if (!c && (10 <= (res >>  4) && (res >>  4) <= 15) 
+                  && !h && (0  <= (res & 0xf) && (res & 0xf) <=  9))
+           res = res + 0x60;           /* Value added == 60.  */
+         else if (!c && (9  <= (res >>  4) && (res >>  4) <= 15) 
+                  && !h && (10 <= (res & 0xf) && (res & 0xf) <= 15))
+           res = res + 0x66;           /* Value added == 66.  */
+         else if (!c && (10 <= (res >>  4) && (res >>  4) <= 15) 
+                  && h && (0  <= (res & 0xf) && (res & 0xf) <=  3))
+           res = res + 0x66;           /* Value added == 66.  */
+         else if (c && (1 <= (res >>  4) && (res >>  4) <= 2) 
+                  && !h && (0 <= (res & 0xf) && (res & 0xf) <= 9))
+           res = res + 0x160;          /* Value added == 60, plus 'carry'.  */
+         else if (c && (1  <= (res >>  4) && (res >>  4) <=  2) 
+                  && !h && (10 <= (res & 0xf) && (res & 0xf) <= 15))
+           res = res + 0x166;          /* Value added == 66, plus 'carry'.  */
+         else if (c && (1 <= (res >>  4) && (res >>  4) <= 3) 
+                  && h && (0 <= (res & 0xf) && (res & 0xf) <= 3))
+           res = res + 0x166;          /* Value added == 66, plus 'carry'.  */
+
+         goto alu8;
+
+       case O (O_DAS, SB):
+         /* Decimal Adjust Subtraction.  This is for BCD arithmetic.  */
+         res = GET_B_REG (code->src.reg); /* FIXME fetch, fetch2... */
+         if (!c && (0 <= (res >>  4) && (res >>  4) <= 9) 
+             && !h && (0 <= (res & 0xf) && (res & 0xf) <= 9))
+           res = res;          /* Value added == 0.  */
+         else if (!c && (0 <= (res >>  4) && (res >>  4) <=  8) 
+                  && h && (6 <= (res & 0xf) && (res & 0xf) <= 15))
+           res = res + 0xfa;           /* Value added == 0xfa.  */
+         else if (c && (7 <= (res >>  4) && (res >>  4) <= 15) 
+                  && !h && (0 <= (res & 0xf) && (res & 0xf) <=  9))
+           res = res + 0xa0;           /* Value added == 0xa0.  */
+         else if (c && (6 <= (res >>  4) && (res >>  4) <= 15) 
+                  && h && (6 <= (res & 0xf) && (res & 0xf) <= 15))
+           res = res + 0x9a;           /* Value added == 0x9a.  */
+
+         goto alu8;
+
        default:
        illegal:
          cpu.state = SIM_STATE_STOPPED;