2003-04-13 Michael Snyder <msnyder@redhat.com>
* compile.c (sim_resume): Implement 'daa' and 'das' instructions.
This commit is contained in:
parent
a68f3a3f68
commit
b7f97e9cb4
2 changed files with 55 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue