BS-X: Fixed flash erase, download process and reset behavior

This commit is contained in:
Sour 2020-02-22 11:14:55 -05:00
parent 26875e93ee
commit 75f170b739
5 changed files with 12 additions and 18 deletions

View file

@ -23,7 +23,7 @@ BsxMemoryPack::~BsxMemoryPack()
void BsxMemoryPack::Serialize(Serializer& s) void BsxMemoryPack::Serialize(Serializer& s)
{ {
s.Stream(_writeProtect, _enableCsr, _enableEsr, _enableVendorInfo, _writeByte, _command); s.Stream(_enableCsr, _enableEsr, _enableVendorInfo, _writeByte, _command);
if(s.IsSaving()) { if(s.IsSaving()) {
//Save content of memory pack as an IPS patch //Save content of memory pack as an IPS patch
@ -68,14 +68,13 @@ void BsxMemoryPack::ProcessCommand(uint8_t value, uint32_t page)
} }
switch(_command) { switch(_command) {
case 0x20D0: memset(_data + page * 0x10000, 0x10000, 0xFF); break; //Page erase case 0x20D0: memset(_data + page * 0x10000, 0xFF, 0x10000); break; //Page erase
case 0xA7D0: memset(_data, _dataSize, 0xFF); break; //Chip erase case 0xA7D0: memset(_data, 0xFF, _dataSize); break; //Chip erase
} }
} }
void BsxMemoryPack::Reset() void BsxMemoryPack::Reset()
{ {
_writeProtect = true;
_enableCsr = false; _enableCsr = false;
_enableEsr = false; _enableEsr = false;
_writeByte = false; _writeByte = false;
@ -141,10 +140,8 @@ uint8_t BsxMemoryPack::BsxMemoryPackHandler::Read(uint32_t addr)
void BsxMemoryPack::BsxMemoryPackHandler::Write(uint32_t addr, uint8_t value) void BsxMemoryPack::BsxMemoryPackHandler::Write(uint32_t addr, uint8_t value)
{ {
if(_memPack->_writeByte) { if(_memPack->_writeByte) {
if(!_memPack->_writeProtect) {
uint8_t currentByte = RamHandler::Read(addr); uint8_t currentByte = RamHandler::Read(addr);
RamHandler::Write(addr, value & currentByte); RamHandler::Write(addr, value & currentByte);
}
_memPack->_writeByte = false; _memPack->_writeByte = false;
} else if(addr == 0xC00000) { } else if(addr == 0xC00000) {
_memPack->ProcessCommand(value, _page); _memPack->ProcessCommand(value, _page);

View file

@ -15,7 +15,6 @@ class BsxMemoryPack : public ISerializable
uint8_t _calculatedSize = 0x0C; uint8_t _calculatedSize = 0x0C;
bool _writeProtect = true;
bool _enableCsr = false; bool _enableCsr = false;
bool _enableEsr = false; bool _enableEsr = false;
bool _enableVendorInfo = false; bool _enableVendorInfo = false;

View file

@ -99,13 +99,15 @@ void BsxSatellaview::ProcessClocks()
{ {
if(_stream[0].NeedUpdate() || _stream[1].NeedUpdate()) { if(_stream[0].NeedUpdate() || _stream[1].NeedUpdate()) {
uint64_t gap = _memoryManager->GetMasterClock() - _prevMasterClock; uint64_t gap = _memoryManager->GetMasterClock() - _prevMasterClock;
uint64_t clocksPerFrame = _console->GetMasterClockRate() / 1000; //1000 frames/sec (224kbits/sec)
while(gap >= 288 * 2) { while(gap >= clocksPerFrame) {
bool needUpdate = _stream[0].FillQueues() || _stream[1].FillQueues(); bool needUpdate = _stream[0].FillQueues() || _stream[1].FillQueues();
if(!needUpdate) { if(!needUpdate) {
gap = 0;
break; break;
} }
gap -= 288 * 2; gap -= clocksPerFrame;
} }
_prevMasterClock = _memoryManager->GetMasterClock() - gap; _prevMasterClock = _memoryManager->GetMasterClock() - gap;

View file

@ -191,9 +191,6 @@ void BsxStream::SetChannelLow(uint8_t value)
_fileIndex = 0; _fileIndex = 0;
} }
_channel = (_channel & 0xFF00) | value; _channel = (_channel & 0xFF00) | value;
if(_channel == 0) {
std::cout << "Test";
}
} }
void BsxStream::SetChannelHigh(uint8_t value) void BsxStream::SetChannelHigh(uint8_t value)
@ -202,9 +199,6 @@ void BsxStream::SetChannelHigh(uint8_t value)
_fileIndex = 0; _fileIndex = 0;
} }
_channel = (_channel & 0xFF) | ((value & 0x3F) << 8); _channel = (_channel & 0xFF) | ((value & 0x3F) << 8);
if(_channel == 0) {
std::cout << "Test";
}
} }
void BsxStream::SetPrefixLatch(uint8_t value) void BsxStream::SetPrefixLatch(uint8_t value)

View file

@ -318,10 +318,12 @@ void Console::Reset()
_memoryManager->Reset(); _memoryManager->Reset();
_spc->Reset(); _spc->Reset();
_ppu->Reset(); _ppu->Reset();
_cpu->Reset();
_cart->Reset(); _cart->Reset();
//_controlManager->Reset(); //_controlManager->Reset();
//Reset cart before CPU to ensure correct memory mappings when fetching reset vector
_cpu->Reset();
_notificationManager->SendNotification(ConsoleNotificationType::GameReset); _notificationManager->SendNotification(ConsoleNotificationType::GameReset);
ProcessEvent(EventType::Reset); ProcessEvent(EventType::Reset);