enable directPokeBase for RAM banks in CartridgeEnhanced

This commit is contained in:
thrust26 2020-04-17 20:47:29 +02:00
parent 0bf12045d8
commit b57c2d05c2
1 changed files with 19 additions and 27 deletions

View File

@ -82,6 +82,7 @@ void CartridgeEnhanced::install(System& system)
for(uInt16 addr = ROM_OFFSET + myReadOffset; addr < ROM_OFFSET + myReadOffset + myRamSize; addr += System::PAGE_SIZE) for(uInt16 addr = ROM_OFFSET + myReadOffset; addr < ROM_OFFSET + myReadOffset + myRamSize; addr += System::PAGE_SIZE)
{ {
uInt16 offset = addr & myRamMask; uInt16 offset = addr & myRamMask;
access.directPeekBase = &myRAM[offset]; access.directPeekBase = &myRAM[offset];
access.romAccessBase = &myRomAccessBase[myReadOffset + offset]; access.romAccessBase = &myRomAccessBase[myReadOffset + offset];
access.romPeekCounter = &myRomAccessCounter[myReadOffset + offset]; access.romPeekCounter = &myRomAccessCounter[myReadOffset + offset];
@ -126,19 +127,18 @@ uInt8 CartridgeEnhanced::peek(uInt16 address)
return peekRAM(myRAM[((myCurrentSegOffset[(peekAddress & ROM_MASK) >> myBankShift] - mySize) >> 1) + address], return peekRAM(myRAM[((myCurrentSegOffset[(peekAddress & ROM_MASK) >> myBankShift] - mySize) >> 1) + address],
peekAddress); peekAddress);
} }
else address &= ROM_MASK;
{
address &= ROM_MASK;
// Write port is e.g. at 0xF000 - 0xF07F (128 bytes) // Write port is e.g. at 0xF000 - 0xF07F (128 bytes)
if(address < myReadOffset + myRamSize && address >= myReadOffset) if(address < myReadOffset + myRamSize && address >= myReadOffset)
// This is a read access to a write port! {
// Reading from the write port triggers an unwanted write // This is a read access to a write port!
return peekRAM(myRAM[address], peekAddress); // Reading from the write port triggers an unwanted write
else return peekRAM(myRAM[address], peekAddress);
return myImage[myCurrentSegOffset[(peekAddress & ROM_MASK) >> myBankShift]
+ (peekAddress & myBankMask)];
} }
return myImage[myCurrentSegOffset[(peekAddress & ROM_MASK) >> myBankShift]
+ (peekAddress & myBankMask)];
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -153,6 +153,7 @@ bool CartridgeEnhanced::poke(uInt16 address, uInt8 value)
if(myRamSize > 0) if(myRamSize > 0)
{ {
// Code should never get here (System::PageAccess::directPoke() handles this)
uInt16 pokeAddress = address; uInt16 pokeAddress = address;
if(isRamBank(address)) if(isRamBank(address))
@ -165,14 +166,6 @@ bool CartridgeEnhanced::poke(uInt16 address, uInt8 value)
pokeAddress, value); pokeAddress, value);
return true; return true;
} }
else
{
// Writing to the read port should be ignored, but trigger a break if option enabled
uInt8 dummy;
pokeRAM(dummy, pokeAddress, value);
myRamWriteAccess = pokeAddress;
}
} }
else else
{ {
@ -182,15 +175,12 @@ bool CartridgeEnhanced::poke(uInt16 address, uInt8 value)
pokeRAM(myRAM[address & myRamMask], pokeAddress, value); pokeRAM(myRAM[address & myRamMask], pokeAddress, value);
return true; return true;
} }
else
{
// Writing to the read port should be ignored, but trigger a break if option enabled
uInt8 dummy;
pokeRAM(dummy, pokeAddress, value);
myRamWriteAccess = pokeAddress;
}
} }
// Writing to the read port should be ignored, but trigger a break if option enabled
uInt8 dummy;
pokeRAM(dummy, pokeAddress, value);
myRamWriteAccess = pokeAddress;
} }
return false; return false;
} }
@ -255,6 +245,7 @@ bool CartridgeEnhanced::bank(uInt16 bank, uInt16 segment)
{ {
uInt32 offset = bankOffset + (addr & myRamMask); uInt32 offset = bankOffset + (addr & myRamMask);
access.directPokeBase = &myRAM[offset - mySize];
access.romAccessBase = &myRomAccessBase[offset]; access.romAccessBase = &myRomAccessBase[offset];
access.romPeekCounter = &myRomAccessCounter[offset]; access.romPeekCounter = &myRomAccessCounter[offset];
access.romPokeCounter = &myRomAccessCounter[offset + myAccessSize]; access.romPokeCounter = &myRomAccessCounter[offset + myAccessSize];
@ -265,6 +256,7 @@ bool CartridgeEnhanced::bank(uInt16 bank, uInt16 segment)
fromAddr = (ROM_OFFSET + segmentOffset + myReadOffset) & ~System::PAGE_MASK; fromAddr = (ROM_OFFSET + segmentOffset + myReadOffset) & ~System::PAGE_MASK;
toAddr = (ROM_OFFSET + segmentOffset + myReadOffset + (myBankSize >> 1)) & ~System::PAGE_MASK; toAddr = (ROM_OFFSET + segmentOffset + myReadOffset + (myBankSize >> 1)) & ~System::PAGE_MASK;
access.type = System::PageAccessType::READ; access.type = System::PageAccessType::READ;
access.directPokeBase = nullptr;
for(uInt16 addr = fromAddr; addr < toAddr; addr += System::PAGE_SIZE) for(uInt16 addr = fromAddr; addr < toAddr; addr += System::PAGE_SIZE)
{ {