projects
/
fw
/
sdcc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
* sim/ucsim/hc08.src/inst.cc (inst_condbranch): fixed simulation of
[fw/sdcc]
/
sim
/
ucsim
/
hc08.src
/
inst.cc
diff --git
a/sim/ucsim/hc08.src/inst.cc
b/sim/ucsim/hc08.src/inst.cc
index 839af77375a74f6d505f5190e6310e69491900ec..08f786fb6290a1de2effc065d887b85dce65219a 100644
(file)
--- a/
sim/ucsim/hc08.src/inst.cc
+++ b/
sim/ucsim/hc08.src/inst.cc
@@
-867,6
+867,7
@@
cl_hc08::inst_condbranch(t_mem code, bool prefix)
{
bool taken;
signed char ofs;
{
bool taken;
signed char ofs;
+ unsigned char maskedP;
if ((code & 0xf0)==0x20) {
switch ((code>>1) & 7) {
if ((code & 0xf0)==0x20) {
switch ((code>>1) & 7) {
@@
-874,7
+875,7
@@
cl_hc08::inst_condbranch(t_mem code, bool prefix)
taken = 1;
break;
case 1: // BHI
taken = 1;
break;
case 1: // BHI
- taken =
(regs.P & BIT_C) || !(regs.P & BIT_Z
);
+ taken =
!(regs.P & (BIT_C | BIT_Z)
);
break;
case 2: // BCC
taken = !(regs.P & BIT_C);
break;
case 2: // BCC
taken = !(regs.P & BIT_C);
@@
-900,11
+901,12
@@
cl_hc08::inst_condbranch(t_mem code, bool prefix)
else if ((code & 0xf0)==0x90) {
switch ((code>>1) & 7) {
case 0: // BGE
else if ((code & 0xf0)==0x90) {
switch ((code>>1) & 7) {
case 0: // BGE
- taken = !(((regs.P & BIT_N)!=0) ^ ((regs.P & BIT_V)!=0));
+ maskedP = regs.P & (BIT_N | BIT_V);
+ taken = !maskedP || (maskedP == (BIT_N | BIT_V));
break;
break;
- case 1: // B
L
T
- taken = (!(((regs.P & BIT_N)!=0) ^ ((regs.P & BIT_V)!=0)))
-
|| (regs.P & BIT_Z
);
+ case 1: // B
G
T
+ maskedP = regs.P & (BIT_N | BIT_V | BIT_Z);
+
taken = !maskedP || (maskedP == (BIT_N | BIT_V)
);
break;
default:
return(resHALT);
break;
default:
return(resHALT);