X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=sim%2Fucsim%2Fhc08.src%2Finst.cc;h=08f786fb6290a1de2effc065d887b85dce65219a;hb=014ffb2177ce6852557ae1895d9a800856831c55;hp=839af77375a74f6d505f5190e6310e69491900ec;hpb=bf67f8d705935961d3758f9735e5f528141a47be;p=fw%2Fsdcc diff --git a/sim/ucsim/hc08.src/inst.cc b/sim/ucsim/hc08.src/inst.cc index 839af773..08f786fb 100644 --- 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; + unsigned char maskedP; 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 = (regs.P & BIT_C) || !(regs.P & BIT_Z); + taken = !(regs.P & (BIT_C | BIT_Z)); 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 - 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; - case 1: // BLT - taken = (!(((regs.P & BIT_N)!=0) ^ ((regs.P & BIT_V)!=0))) - || (regs.P & BIT_Z); + case 1: // BGT + maskedP = regs.P & (BIT_N | BIT_V | BIT_Z); + taken = !maskedP || (maskedP == (BIT_N | BIT_V)); break; default: return(resHALT);