def opADC(self, x): data = self.ByteAt(x()) if self.p & self.DECIMAL: if self.p & self.CARRY: tmp = 1 else: tmp = 0 data = convert_to_bin(data) + convert_to_bin(self.a) + tmp self.p &= ~(self.CARRY+self.OVERFLOW+self.NEGATIVE+self.ZERO) if data > 99: self.p |= self.CARRY + self.OVERFLOW data -= 100 if data == 0: self.p |= self.ZERO else: self.p |= data & 128 self.a = convert_to_bcd(data) else: if self.p & self.CARRY: tmp = 1 else: tmp = 0 result = data + self.a + tmp self.p &= ~(self.CARRY+self.OVERFLOW+self.NEGATIVE+self.ZERO) if ( ~(self.a ^ data) & (self.a ^ result) ) & 0x80: self.p |= self.OVERFLOW data = result if data > 255: self.p |= self.CARRY data &=255 if data == 0: self.p |= self.ZERO else: self.p |= data & 128 self.a = data
def opSBC(self, x): data = self.ByteAt(x()) if self.p & self.DECIMAL: if self.p & self.CARRY: borrow = 0 else: borrow = 1 data = convert_to_bin(self.a) - convert_to_bin(data) - borrow self.p &= ~(self.CARRY + self.ZERO + self.NEGATIVE + self.OVERFLOW) if data == 0: self.p |= self.ZERO + self.CARRY elif data > 0: self.p |= self.CARRY else: self.p |= self.NEGATIVE data +=100 self.a = convert_to_bcd(data) else: if self.p & self.CARRY: borrow = 0 else: borrow = 1 result = self.a + (~data & 0xFF) + (self.p & self.CARRY) self.p &= ~(self.CARRY + self.ZERO + self.OVERFLOW + self.NEGATIVE) if ( (self.a ^ data) & (self.a ^ result) ) & 0x80: self.p |= self.OVERFLOW data = result & 0xFF if data == 0: self.p |= self.ZERO if result & 0x100: self.p |= self.CARRY self.p |= data & self.NEGATIVE self.a = data
def test_convert_to_bin(self): self.assertEqual(0, convert_to_bin(0)) self.assertEqual(99, convert_to_bin(0x99))