def addc(self, a, b, c):
if 0 == self.pc_state.P.get_D():
r = ctypes.c_short(a + b + c).value
rc = ctypes.c_byte(a + b + c).value
self.pc_state.P.set_N((0,1)[0x80 == (rc & 0x80)])
self.pc_state.P.set_Z((0,1)[rc == 0x0])
self.pc_state.P.set_V((0,1)[rc != r]) # Overflow
r = ((a & 0xFF) + (b & 0xFF) + c) & 0xFFFF
self.pc_state.P.set_C((0,1)[0x100 == (r & 0x100)])
result = (a + b + c)
elif 1 == self.pc_state.P.get_D():
# Decimal Addition
# FIXME need to fix flags
#
r = ctypes.c_short(((a >> 4) & 0xF)* 10+ ((a & 0xF) %10) + ((b>>4) & 0xF)* 10 + ((b & 0xF) %10) + c).value
rc = ctypes.c_byte(a + b + c).value # ???? TODO
self.pc_state.P.set_N((0,1)[r < 0])
self.pc_state.P.set_Z((0,1)[rc == 0x0])
# self.pc_state.P.V = (rc != r) ? 1:0; # Overflow
self.pc_state.P.set_C((0,1)[(r > 99) or (r < 0)])
result = ((((int(r/10) % 10) << 4) & 0xf0) + (r%10))
return result & 0xFF
评论列表
文章目录