BS-X: General fixes/improvements

This commit is contained in:
Sour 2020-02-21 23:30:14 -05:00
parent b29fabbb57
commit 393a8f3b38
8 changed files with 88 additions and 42 deletions

View file

@ -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)

View file

@ -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);
}
}

View file

@ -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]);
}

View file

@ -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);

View file

@ -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()) {

View file

@ -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();

View file

@ -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);

View file

@ -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)