From fc9263fb3a76ae0db53b784c2350a5649e30cb52 Mon Sep 17 00:00:00 2001 From: Adrian Conlon Date: Sat, 4 May 2019 12:44:53 +0100 Subject: [PATCH] M6502: Avoid allocating "Tuples" when processing crossed page boundary conditions. (~20% speedup) Signed-off-by: Adrian Conlon --- M6502/M6502.cs | 55 +++++++++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/M6502/M6502.cs b/M6502/M6502.cs index 0b91483..ca2ea08 100644 --- a/M6502/M6502.cs +++ b/M6502/M6502.cs @@ -13,6 +13,7 @@ namespace EightBit private const byte NMIvector = 0xfa; // NMI vector private readonly Register16 intermediate = new Register16(); + private byte crossedPage; private bool handlingRESET = false; private bool handlingNMI = false; @@ -627,30 +628,30 @@ namespace EightBit return Chip.LowByte(address + this.Y); } - private Tuple Address_AbsoluteX() + private Register16 Address_AbsoluteX() { var address = this.Address_Absolute(); - var page = address.High; + this.crossedPage = address.High; address.Word += this.X; - return new Tuple(address, page); + return address; } - private Tuple Address_AbsoluteY() + private Register16 Address_AbsoluteY() { var address = this.Address_Absolute(); - var page = address.High; + this.crossedPage = address.High; address.Word += this.Y; - return new Tuple(address, page); + return address; } private Register16 Address_IndexedIndirectX() => this.GetWordPaged(0, this.Address_ZeroPageX()); - private Tuple Address_IndirectIndexedY() + private Register16 Address_IndirectIndexedY() { var address = this.Address_ZeroPageIndirect(); - var page = address.High; + this.crossedPage = address.High; address.Word += this.Y; - return new Tuple(address, page); + return address; } private ushort Address_relative_byte() @@ -668,11 +669,9 @@ namespace EightBit private byte AM_AbsoluteX(PageCrossingBehavior behaviour = PageCrossingBehavior.MaybeReadTwice) { - var crossed = this.Address_AbsoluteX(); - var address = crossed.Item1; - var page = crossed.Item2; - var possible = this.BusRead(address.Low, page); - if ((behaviour == PageCrossingBehavior.AlwaysReadTwice) || (page != address.High)) + var address = this.Address_AbsoluteX(); + var possible = this.BusRead(address.Low, this.crossedPage); + if ((behaviour == PageCrossingBehavior.AlwaysReadTwice) || (this.crossedPage != address.High)) { possible = this.BusRead(address.Word); } @@ -682,11 +681,9 @@ namespace EightBit private byte AM_AbsoluteY() { - var crossed = this.Address_AbsoluteY(); - var address = crossed.Item1; - var page = crossed.Item2; - var possible = this.BusRead(address.Low, page); - if (page != address.High) + var address = this.Address_AbsoluteY(); + var possible = this.BusRead(address.Low, this.crossedPage); + if (this.crossedPage != address.High) { possible = this.BusRead(address.Word); } @@ -702,11 +699,9 @@ namespace EightBit private byte AM_IndirectIndexedY() { - var crossed = this.Address_IndirectIndexedY(); - var address = crossed.Item1; - var page = crossed.Item2; - var possible = this.BusRead(address.Low, page); - if (page != address.High) + var address = this.Address_IndirectIndexedY(); + var possible = this.BusRead(address.Low, this.crossedPage); + if (this.crossedPage != address.High) { possible = this.BusRead(address); } @@ -982,19 +977,15 @@ namespace EightBit private void STA_AbsoluteX() { - var crossed = this.Address_AbsoluteX(); - var address = crossed.Item1; - var page = crossed.Item2; - this.BusRead(address.Low, page); + var address = this.Address_AbsoluteX(); + this.BusRead(address.Low, this.crossedPage); this.BusWrite(address, this.A); } private void STA_AbsoluteY() { - var crossed = this.Address_AbsoluteY(); - var address = crossed.Item1; - var page = crossed.Item2; - this.BusRead(address.Low, page); + var address = this.Address_AbsoluteY(); + this.BusRead(address.Low, this.crossedPage); this.BusWrite(address, this.A); } }