From 393a8f3b3889d64abede127beea750197d8174a2 Mon Sep 17 00:00:00 2001 From: Sour Date: Fri, 21 Feb 2020 23:30:14 -0500 Subject: [PATCH] BS-X: General fixes/improvements --- Core/BaseCartridge.cpp | 2 +- Core/BsxMemoryPack.cpp | 12 +++++++----- Core/BsxSatellaview.cpp | 42 ++++++++++++++++++++++++++++++++++++++--- Core/BsxSatellaview.h | 7 +++++++ Core/BsxStream.cpp | 40 ++++++++++++++++++++------------------- Core/BsxStream.h | 16 +++++++++++----- Core/FirmwareHelper.h | 4 ++-- README.md | 7 ------- 8 files changed, 88 insertions(+), 42 deletions(-) diff --git a/Core/BaseCartridge.cpp b/Core/BaseCartridge.cpp index c9ba87f..becf15b 100644 --- a/Core/BaseCartridge.cpp +++ b/Core/BaseCartridge.cpp @@ -439,7 +439,7 @@ void BaseCartridge::InitCoprocessor() _coprocessor.reset(new Spc7110(_console, _hasRtc)); } else if(_coprocessorType == CoprocessorType::Satellaview) { //Share save file across all .bs files that use the BS-X bios - _console->GetBatteryManager()->Initialize("bsxbios"); + _console->GetBatteryManager()->Initialize("BsxBios"); if(!_bsxMemPack) { //Create an empty memory pack if the BIOS was loaded directly (instead of a .bs file) diff --git a/Core/BsxMemoryPack.cpp b/Core/BsxMemoryPack.cpp index 31f1231..35b6488 100644 --- a/Core/BsxMemoryPack.cpp +++ b/Core/BsxMemoryPack.cpp @@ -140,11 +140,13 @@ uint8_t BsxMemoryPack::BsxMemoryPackHandler::Read(uint32_t addr) void BsxMemoryPack::BsxMemoryPackHandler::Write(uint32_t addr, uint8_t value) { - if(addr == 0xC00000) { + if(_memPack->_writeByte) { + if(!_memPack->_writeProtect) { + uint8_t currentByte = RamHandler::Read(addr); + RamHandler::Write(addr, value & currentByte); + } + _memPack->_writeByte = false; + } else if(addr == 0xC00000) { _memPack->ProcessCommand(value, _page); } - - if(!_memPack->_writeProtect) { - RamHandler::Write(addr, value); - } } diff --git a/Core/BsxSatellaview.cpp b/Core/BsxSatellaview.cpp index c22106f..4ac667e 100644 --- a/Core/BsxSatellaview.cpp +++ b/Core/BsxSatellaview.cpp @@ -1,11 +1,14 @@ #include "stdafx.h" #include "BsxSatellaview.h" #include "Console.h" +#include "MemoryManager.h" #include "EmuSettings.h" #include "../Utilities/Serializer.h" BsxSatellaview::BsxSatellaview(Console* console, IMemoryHandler* bBusHandler) { + _console = console; + _memoryManager = console->GetMemoryManager().get(); _customDate = console->GetSettings()->GetEmulationConfig().BsxCustomDate; _bBusHandler = bBusHandler; Reset(); @@ -13,10 +16,20 @@ BsxSatellaview::BsxSatellaview(Console* console, IMemoryHandler* bBusHandler) void BsxSatellaview::Reset() { + _prevMasterClock = 0; _streamReg = 0; _extOutput = 0xFF; - _stream[0].Reset(_customDate); - _stream[1].Reset(_customDate); + + time_t resetDate; + if(_customDate >= 0) { + resetDate = (time_t)_customDate; + } else { + //Use the current date/time as the BS-X date/time + time(&resetDate); + } + + _stream[0].Reset(_console, resetDate); + _stream[1].Reset(_console, resetDate); } uint8_t BsxSatellaview::Read(uint32_t addr) @@ -24,6 +37,8 @@ uint8_t BsxSatellaview::Read(uint32_t addr) addr &= 0xFFFF; if(addr >= 0x2188 && addr <= 0x219F) { //Handle BS-X $2188-219F registers + ProcessClocks(); + switch(addr) { case 0x2188: return _stream[0].GetChannel() & 0xFF; case 0x2189: return (_stream[0].GetChannel()) >> 8; @@ -58,6 +73,8 @@ void BsxSatellaview::Write(uint32_t addr, uint8_t value) addr &= 0xFFFF; if(addr >= 0x2188 && addr <= 0x219F) { //Handle BS-X register writes + ProcessClocks(); + switch(addr) { case 0x2188: _stream[0].SetChannelLow(value); break; case 0x2189: _stream[0].SetChannelHigh(value); break; @@ -78,6 +95,25 @@ void BsxSatellaview::Write(uint32_t addr, uint8_t value) } } +void BsxSatellaview::ProcessClocks() +{ + if(_stream[0].NeedUpdate() || _stream[1].NeedUpdate()) { + uint64_t gap = _memoryManager->GetMasterClock() - _prevMasterClock; + + while(gap >= 288 * 2) { + bool needUpdate = _stream[0].FillQueues() || _stream[1].FillQueues(); + if(!needUpdate) { + break; + } + gap -= 288 * 2; + } + + _prevMasterClock = _memoryManager->GetMasterClock() - gap; + } else { + _prevMasterClock = _memoryManager->GetMasterClock(); + } +} + uint8_t BsxSatellaview::Peek(uint32_t addr) { return 0; @@ -95,7 +131,7 @@ AddressInfo BsxSatellaview::GetAbsoluteAddress(uint32_t address) void BsxSatellaview::Serialize(Serializer& s) { - s.Stream(_extOutput, _streamReg); + s.Stream(_extOutput, _streamReg, _customDate, _prevMasterClock); s.Stream(&_stream[0]); s.Stream(&_stream[1]); } diff --git a/Core/BsxSatellaview.h b/Core/BsxSatellaview.h index 29058c9..79548b2 100644 --- a/Core/BsxSatellaview.h +++ b/Core/BsxSatellaview.h @@ -5,17 +5,24 @@ #include "../Utilities/ISerializable.h" class Console; +class MemoryManager; class BsxSatellaview : public IMemoryHandler, public ISerializable { private: IMemoryHandler* _bBusHandler; + Console* _console; + MemoryManager* _memoryManager; BsxStream _stream[2]; uint8_t _streamReg; uint8_t _extOutput; int64_t _customDate; + uint64_t _prevMasterClock; + + void ProcessClocks(); + public: BsxSatellaview(Console* console, IMemoryHandler *bBusHandler); diff --git a/Core/BsxStream.cpp b/Core/BsxStream.cpp index 7a465df..9bd225a 100644 --- a/Core/BsxStream.cpp +++ b/Core/BsxStream.cpp @@ -1,5 +1,7 @@ #include "stdafx.h" #include "BsxStream.h" +#include "Console.h" +#include "MemoryManager.h" #include "../Utilities/FolderUtilities.h" #include "../Utilities/HexUtilities.h" #include "../Utilities/Serializer.h" @@ -8,8 +10,11 @@ BsxStream::BsxStream() { } -void BsxStream::Reset(int64_t customDate) +void BsxStream::Reset(Console* console, int64_t resetDate) { + _console = console; + _memoryManager = console->GetMemoryManager().get(); + _file.close(); _channel = 0; @@ -30,9 +35,9 @@ void BsxStream::Reset(int64_t customDate) _activeChannel = 0; _activeFileIndex = 0; - _customDate = customDate; - time(&_resetTime); - _latchedTime = 0; + _resetDate = resetDate; + _resetMasterClock = 0; + _tm = {}; } @@ -41,10 +46,14 @@ uint16_t BsxStream::GetChannel() return _channel; } -void BsxStream::FillQueues() +bool BsxStream::NeedUpdate() { - //TODO: Make this run based on master clock - while(_queueLength > 0) { + return _queueLength > 0; +} + +bool BsxStream::FillQueues() +{ + if(_queueLength > 0) { _queueLength--; if(_prefixLatch && _prefixQueueLength < 0x80) { _prefixQueueLength++; @@ -53,6 +62,7 @@ void BsxStream::FillQueues() _dataQueueLength++; } } + return NeedUpdate(); } void BsxStream::OpenStreamFile() @@ -76,7 +86,6 @@ bool BsxStream::LoadStreamFile() _queueLength = (uint16_t)std::ceil(_file.tellg() / 22.0); _file.seekg(0, ios::beg); _fileIndex++; - FillQueues(); return true; } else { if(_fileIndex > 0) { @@ -106,7 +115,6 @@ uint8_t BsxStream::GetPrefixCount() if(_channel == 0) { //Time channel _queueLength = 1; - FillQueues(); _firstPacket = true; } else { LoadStreamFile(); @@ -213,16 +221,12 @@ void BsxStream::SetDataLatch(uint8_t value) void BsxStream::InitTimeStruct() { - if(_customDate >= 0) { - //Use custom date - time_t elapsed = _latchedTime - _resetTime; - _latchedTime = _customDate + elapsed; - } + time_t dateTime = _resetDate + ((_memoryManager->GetMasterClock() - _resetMasterClock) / _console->GetMasterClockRate()); #ifdef _MSC_VER - localtime_s(&_tm, &_latchedTime); + localtime_s(&_tm, &dateTime); #else - localtime_r(&_latchedTime, &_tm); + localtime_r(&dateTime, &_tm); #endif _tm.tm_wday++; @@ -233,7 +237,6 @@ void BsxStream::InitTimeStruct() uint8_t BsxStream::GetTime() { if(_fileOffset == 0) { - time(&_latchedTime); InitTimeStruct(); } @@ -264,8 +267,7 @@ void BsxStream::Serialize(Serializer& s) { s.Stream( _channel, _prefix, _data, _status, _prefixLatch, _dataLatch, _firstPacket, _fileOffset, _fileIndex, - _queueLength, _prefixQueueLength, _dataQueueLength, _latchedTime, _resetTime, _customDate, - _activeChannel, _activeFileIndex + _queueLength, _prefixQueueLength, _dataQueueLength, _resetDate, _resetMasterClock, _activeChannel, _activeFileIndex ); if(!s.IsSaving()) { diff --git a/Core/BsxStream.h b/Core/BsxStream.h index b50980d..8b5357e 100644 --- a/Core/BsxStream.h +++ b/Core/BsxStream.h @@ -2,9 +2,15 @@ #include "stdafx.h" #include "../Utilities/ISerializable.h" +class Console; +class MemoryManager; + class BsxStream : public ISerializable { private: + Console* _console; + MemoryManager* _memoryManager; + ifstream _file; tm _tm = {}; @@ -26,11 +32,9 @@ private: uint16_t _activeChannel = 0; uint8_t _activeFileIndex = 0; - int64_t _customDate = -1; - time_t _resetTime = 0; - time_t _latchedTime = 0; + int64_t _resetDate = -1; + uint64_t _resetMasterClock = 0; - void FillQueues(); void OpenStreamFile(); bool LoadStreamFile(); @@ -39,9 +43,11 @@ private: public: BsxStream(); - void Reset(int64_t customDate); + void Reset(Console* console, int64_t customDate); uint16_t GetChannel(); + bool NeedUpdate(); + bool FillQueues(); uint8_t GetPrefixCount(); uint8_t GetPrefix(); diff --git a/Core/FirmwareHelper.h b/Core/FirmwareHelper.h index 130f0a5..01f7eeb 100644 --- a/Core/FirmwareHelper.h +++ b/Core/FirmwareHelper.h @@ -38,7 +38,7 @@ private: static bool AttemptLoadBsxFirmware(uint8_t** prgRom, uint32_t& prgSize) { - VirtualFile firmware(FolderUtilities::CombinePath(FolderUtilities::GetFirmwareFolder(), "BS-X BIOS.sfc")); + VirtualFile firmware(FolderUtilities::CombinePath(FolderUtilities::GetFirmwareFolder(), "BsxBios.sfc")); if(firmware.IsValid() && firmware.GetSize() >= 0x8000) { *prgRom = new uint8_t[firmware.GetSize()]; prgSize = (uint32_t)firmware.GetSize(); @@ -82,7 +82,7 @@ public: } MissingFirmwareMessage msg; - msg.Filename = "BS-X BIOS.sfc"; + msg.Filename = "BsxBios.sfc"; msg.FirmwareType = CoprocessorType::Satellaview; msg.Size = 1024*1024; console->GetNotificationManager()->SendNotification(ConsoleNotificationType::MissingFirmware, &msg); diff --git a/README.md b/README.md index ecfe893..69deb1b 100644 --- a/README.md +++ b/README.md @@ -15,13 +15,6 @@ Windows: [![Build status](https://ci.appveyor.com/api/projects/status/cjk97u1yvw Linux: [![Build status](https://ci.appveyor.com/api/projects/status/arkaatgy94f23ll3/branch/master?svg=true)](https://ci.appveyor.com/project/Sour/mesen-s-hayo4/build/artifacts) -## Roadmap - -The following should be added over time (in no particular order): - -* Additions/improvements in the debugging tools -* Satellaview/BS-X support - ## Compiling See [COMPILING.md](COMPILING.md)