mirror of
https://github.com/mnaberez/py65.git
synced 2025-08-08 13:25:01 +00:00
Fixed that ADC would not properly set the V flag. Closes #3.
This commit is contained in:
@@ -4,6 +4,13 @@ Next Release
|
|||||||
|
|
||||||
- Fixed that ASL would not properly set the Z flag. Closes #7.
|
- 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)
|
0.5 (2009-08-06)
|
||||||
|
|
||||||
- Fixed signatures of getc/putc callbacks in monitor that were broken
|
- Fixed signatures of getc/putc callbacks in monitor that were broken
|
||||||
|
@@ -296,8 +296,11 @@ class MPU:
|
|||||||
tmp = 1
|
tmp = 1
|
||||||
else:
|
else:
|
||||||
tmp = 0
|
tmp = 0
|
||||||
data += self.a + tmp
|
result = data + self.a + tmp
|
||||||
self.flags &= ~(self.CARRY+self.OVERFLOW+self.NEGATIVE+self.ZERO)
|
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:
|
if data > 255:
|
||||||
self.flags|=self.OVERFLOW+self.CARRY
|
self.flags|=self.OVERFLOW+self.CARRY
|
||||||
data &=255
|
data &=255
|
||||||
|
@@ -71,6 +71,19 @@ class Common6502Tests:
|
|||||||
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
||||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
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
|
# ADC Zero Page
|
||||||
|
|
||||||
def test_adc_bcd_off_zp_carry_clear_in_accumulator_zeroes(self):
|
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.NEGATIVE, mpu.flags & mpu.NEGATIVE)
|
||||||
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
||||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
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
|
# ADC Immediate
|
||||||
|
|
||||||
@@ -192,6 +218,17 @@ class Common6502Tests:
|
|||||||
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
||||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
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
|
# ADC Absolute, X-Indexed
|
||||||
|
|
||||||
def test_adc_bcd_off_abs_x_carry_clear_in_accumulator_zeroes(self):
|
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(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
||||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
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
|
# ADC Absolute, Y-Indexed
|
||||||
|
|
||||||
def test_adc_bcd_off_abs_y_carry_clear_in_accumulator_zeroes(self):
|
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(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
||||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
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
|
# ADC Zero Page, X-Indexed
|
||||||
|
|
||||||
def test_adc_bcd_off_zp_x_carry_clear_in_accumulator_zeroes(self):
|
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(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
||||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
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)
|
# ADC Indirect, Indexed (X)
|
||||||
|
|
||||||
def test_adc_bcd_off_indirect_indexed_carry_clear_in_accumulator_zeroes(self):
|
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(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
||||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
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)
|
# ADC Indexed, Indirect (Y)
|
||||||
|
|
||||||
def test_adc_bcd_off_indexed_indirect_carry_clear_in_accumulator_zeroes(self):
|
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):
|
def test_adc_bcd_off_indexed_indirect_indexed_overflow(self):
|
||||||
mpu = self._make_mpu()
|
mpu = self._make_mpu()
|
||||||
mpu.a = 0xFF
|
mpu.a = 0xFF
|
||||||
mpu.x = 0x03
|
mpu.y = 0x03
|
||||||
self._write(mpu.memory, 0x0000, (0x61, 0x10)) #=> $0000 ADC ($0010,X)
|
self._write(mpu.memory, 0x0000, (0x71, 0x10)) #=> $0000 ADC ($0010),Y
|
||||||
self._write(mpu.memory, 0x0013, (0xCD, 0xAB)) #=> Vector to $ABCD
|
self._write(mpu.memory, 0x0010, (0xCD, 0xAB)) #=> Vector to $ABCD
|
||||||
mpu.memory[0xABCD] = 0xFF
|
mpu.memory[0xABCD + mpu.y] = 0xFF
|
||||||
mpu.step()
|
mpu.step()
|
||||||
self.assertEquals(0x0002, mpu.pc)
|
self.assertEquals(0x0002, mpu.pc)
|
||||||
self.assertEquals(0xFE, mpu.a)
|
self.assertEquals(0xFE, mpu.a)
|
||||||
@@ -542,6 +636,21 @@ class Common6502Tests:
|
|||||||
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
||||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
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)
|
# AND (Absolute)
|
||||||
|
|
||||||
def test_and_absolute_all_zeros_setting_zero_flag(self):
|
def test_and_absolute_all_zeros_setting_zero_flag(self):
|
||||||
|
Reference in New Issue
Block a user