1
0
mirror of https://github.com/mnaberez/py65.git synced 2024-06-06 20:29:34 +00:00

Fixed that ADC would not properly set the V flag. Closes #3.

This commit is contained in:
Mike Naberezny 2009-08-10 22:58:17 -07:00
parent e1df3e060b
commit 9bfc5a13d1
3 changed files with 124 additions and 5 deletions

View File

@ -4,6 +4,13 @@ Next Release
- Fixed that ASL would not properly set the Z flag. Closes #7.
- Fixed that ADC would not properly set the Overflow (V) flag. The
overflow calculation that is now used originated from XGS: Apple
IIGS Emulator (cputable.h). Originally written and Copyright
(C)1996 by Joshua M. Thompson. Copyright (C) 2006 by Samuel A.
Falvo II. http://bitbucket.org/kc5tja/lib65816/src/tip/src/cputable.h
Closes #3.
0.5 (2009-08-06)
- Fixed signatures of getc/putc callbacks in monitor that were broken

View File

@ -296,8 +296,11 @@ class MPU:
tmp = 1
else:
tmp = 0
data += self.a + tmp
result = data + self.a + tmp
self.flags &= ~(self.CARRY+self.OVERFLOW+self.NEGATIVE+self.ZERO)
if ( ~(self.a ^ data) & (self.a ^ result) ) & 0x80:
self.flags |= self.OVERFLOW
data = result
if data > 255:
self.flags|=self.OVERFLOW+self.CARRY
data &=255

View File

@ -71,6 +71,19 @@ class Common6502Tests:
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
def test_adc_bcd_off_absolute_overflow_set_on_40_plus_40(self):
mpu = self._make_mpu()
mpu.flags &= ~(mpu.OVERFLOW)
mpu.a = 0x40
self._write(mpu.memory, 0x0000, (0x6D, 0x00, 0xC0)) #=> $0000 ADC $C000
mpu.memory[0xC000] = 0x40
mpu.step()
self.assertEquals(0x0003, mpu.pc)
self.assertEquals(0x80, mpu.a)
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
# ADC Zero Page
def test_adc_bcd_off_zp_carry_clear_in_accumulator_zeroes(self):
@ -133,6 +146,19 @@ class Common6502Tests:
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
def test_adc_bcd_off_zp_overflow_set_on_40_plus_40(self):
mpu = self._make_mpu()
mpu.a = 0x40
mpu.flags &= ~(mpu.OVERFLOW)
self._write(mpu.memory, 0x0000, (0x65, 0xB0)) #=> $0000 ADC $00B0
mpu.memory[0x00B0] = 0x40
mpu.step()
self.assertEquals(0x0002, mpu.pc)
self.assertEquals(0x80, mpu.a)
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
# ADC Immediate
@ -192,6 +218,17 @@ class Common6502Tests:
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
def test_adc_bcd_off_immediate_overflow_set_on_40_plus_40(self):
mpu = self._make_mpu()
mpu.a = 0x40
self._write(mpu.memory, 0x0000, (0x69, 0x40)) #=> $0000 ADC #$40
mpu.step()
self.assertEquals(0x0002, mpu.pc)
self.assertEquals(0x80, mpu.a)
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
# ADC Absolute, X-Indexed
def test_adc_bcd_off_abs_x_carry_clear_in_accumulator_zeroes(self):
@ -260,6 +297,20 @@ class Common6502Tests:
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
def test_adc_bcd_off_abs_x_overflow_set_on_40_plus_40(self):
mpu = self._make_mpu()
mpu.flags &= ~(mpu.OVERFLOW)
mpu.a = 0x40
mpu.x = 0x03
self._write(mpu.memory, 0x0000, (0x7D, 0x00, 0xC0)) #=> $0000 ADC $C000,X
mpu.memory[0xC000 + mpu.x] = 0x40
mpu.step()
self.assertEquals(0x0003, mpu.pc)
self.assertEquals(0x80, mpu.a)
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
# ADC Absolute, Y-Indexed
def test_adc_bcd_off_abs_y_carry_clear_in_accumulator_zeroes(self):
@ -328,6 +379,20 @@ class Common6502Tests:
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
def test_adc_bcd_off_abs_y_overflow_set_on_40_plus_40(self):
mpu = self._make_mpu()
mpu.flags &= ~(mpu.OVERFLOW)
mpu.a = 0x40
mpu.y = 0x03
self._write(mpu.memory, 0x0000, (0x79, 0x00, 0xC0)) #=> $0000 ADC $C000,Y
mpu.memory[0xC000 + mpu.y] = 0x40
mpu.step()
self.assertEquals(0x0003, mpu.pc)
self.assertEquals(0x80, mpu.a)
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
# ADC Zero Page, X-Indexed
def test_adc_bcd_off_zp_x_carry_clear_in_accumulator_zeroes(self):
@ -396,6 +461,20 @@ class Common6502Tests:
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
def test_adc_bcd_off_zp_x_overflow_set_on_40_plus_40(self):
mpu = self._make_mpu()
mpu.flags &= ~(mpu.OVERFLOW)
mpu.a = 0x40
mpu.x = 0x03
self._write(mpu.memory, 0x0000, (0x75, 0x10)) #=> $0000 ADC $0010,X
mpu.memory[0x0010 + mpu.x] = 0x40
mpu.step()
self.assertEquals(0x0002, mpu.pc)
self.assertEquals(0x80, mpu.a)
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
# ADC Indirect, Indexed (X)
def test_adc_bcd_off_indirect_indexed_carry_clear_in_accumulator_zeroes(self):
@ -469,6 +548,21 @@ class Common6502Tests:
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
def test_adc_bcd_off_indirect_indexed_overflow_set_on_40_plus_40(self):
mpu = self._make_mpu()
mpu.flags &= ~(mpu.OVERFLOW)
mpu.a = 0x40
mpu.x = 0x03
self._write(mpu.memory, 0x0000, (0x61, 0x10)) #=> $0000 ADC ($0010,X)
self._write(mpu.memory, 0x0013, (0xCD, 0xAB)) #=> Vector to $ABCD
mpu.memory[0xABCD] = 0x40
mpu.step()
self.assertEquals(0x0002, mpu.pc)
self.assertEquals(0x80, mpu.a)
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
# ADC Indexed, Indirect (Y)
def test_adc_bcd_off_indexed_indirect_carry_clear_in_accumulator_zeroes(self):
@ -531,10 +625,10 @@ class Common6502Tests:
def test_adc_bcd_off_indexed_indirect_indexed_overflow(self):
mpu = self._make_mpu()
mpu.a = 0xFF
mpu.x = 0x03
self._write(mpu.memory, 0x0000, (0x61, 0x10)) #=> $0000 ADC ($0010,X)
self._write(mpu.memory, 0x0013, (0xCD, 0xAB)) #=> Vector to $ABCD
mpu.memory[0xABCD] = 0xFF
mpu.y = 0x03
self._write(mpu.memory, 0x0000, (0x71, 0x10)) #=> $0000 ADC ($0010),Y
self._write(mpu.memory, 0x0010, (0xCD, 0xAB)) #=> Vector to $ABCD
mpu.memory[0xABCD + mpu.y] = 0xFF
mpu.step()
self.assertEquals(0x0002, mpu.pc)
self.assertEquals(0xFE, mpu.a)
@ -542,6 +636,21 @@ class Common6502Tests:
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
def test_adc_bcd_off_indexed_indirect_overflow_set_on_40_plus_40(self):
mpu = self._make_mpu()
mpu.flags &= ~(mpu.OVERFLOW)
mpu.a = 0x40
mpu.y = 0x03
self._write(mpu.memory, 0x0000, (0x71, 0x10)) #=> $0000 ADC ($0010),Y
self._write(mpu.memory, 0x0010, (0xCD, 0xAB)) #=> Vector to $ABCD
mpu.memory[0xABCD + mpu.y] = 0x40
mpu.step()
self.assertEquals(0x0002, mpu.pc)
self.assertEquals(0x80, mpu.a)
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
self.assertEquals(0, mpu.flags & mpu.ZERO)
# AND (Absolute)
def test_and_absolute_all_zeros_setting_zero_flag(self):