Hab nochmal eine Ähnliche Frage:
Der Code aus XRoar (siehe:
https://github.com/jedie/XRoar/blob/mas ... mon.c#L295 ) brauche ich in Python:
Code: Alles auswählen
#define N_EOR_V ((REG_CC & CC_N)^((REG_CC & CC_V)<<2))
case 0xe: cond = !(N_EOR_V || REG_CC & CC_Z); break; // BGT, LBGT
Zusammengefasst ist es doch:
Code: Alles auswählen
!(((REG_CC & CC_N)^((REG_CC & CC_V)<<2)) || REG_CC & CC_Z)
Vereinfacht also:
oder?
Code der eigentlich das selbe machen soll, aus 6809.js (siehe:
https://github.com/maly/6809js/blob/master/6809.js#L781 ):
Code: Alles auswählen
(!((CC&F_NEGATIVE) ^ ((CC&F_OVERFLOW)<<2) || (CC&F_ZERO)))
ist vereinfacht das:
oder?
Ist da die Klammern falsch gesetzt?
In Python habe ich aktuell das:
Code: Alles auswählen
if not ((self.cc.N ^ self.cc.V) == 1 or self.cc.Z == 1):
self.program_counter = ea
Der Text zu BGT lautet allerdings:
Causes a branch if the N (negative) bit and V (overflow) bit are either both set or both clear and the Z (zero) bit is clear.
Das heißt doch aber einfach nur das:
Code: Alles auswählen
if self.cc.N == self.cc.V and self.cc.Z == 0:
self.program_counter = ea
Entspricht das dem C Code von XRoar?
EDIT: Merke gerade
not ((self.cc.N ^ self.cc.V) == 1 or self.cc.Z == 1) ist das selbe wie
self.cc.N == self.cc.V and self.cc.Z == 0 nur viel komplizierter ausgedrückt
EDIT2: Und
not ((self.cc.N ^ self.cc.V) | self.cc.Z) führt ebenfalls zum selben Ergebnis.