Mesen2/Core/NES/Mappers/FDS/FdsInputButtons.cpp

126 lines
3.1 KiB
C++

#include "pch.h"
#include "NES/Mappers/FDS/FdsInputButtons.h"
#include "NES/Mappers/FDS/Fds.h"
#include "Shared/Emulator.h"
#include "Shared/MessageManager.h"
#include "Shared/BaseControlDevice.h"
#include "Utilities/Serializer.h"
FdsInputButtons::FdsInputButtons(Fds* fds, Emulator* emu) : BaseControlDevice(emu, ControllerType::None, BaseControlDevice::MapperInputPort)
{
_fds = fds;
_emu = emu;
_sideCount = fds->GetSideCount();
}
string FdsInputButtons::GetKeyNames()
{
return string("E0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").substr(0, _sideCount + 1);
}
void FdsInputButtons::Serialize(Serializer& s)
{
BaseControlDevice::Serialize(s);
SV(_needEjectDisk); SV(_insertDiskNumber); SV(_insertDiskDelay);
}
void FdsInputButtons::OnAfterSetState()
{
if(_needEjectDisk) {
SetBit(FdsInputButtons::FdsButtons::EjectDiskButton);
_needEjectDisk = false;
}
if(_insertDiskDelay > 0) {
_insertDiskDelay--;
if(_insertDiskDelay == 0) {
SetBit(FdsInputButtons::FdsButtons::InsertDisk1 + _insertDiskNumber);
}
}
bool needEject = IsPressed(FdsInputButtons::FdsButtons::EjectDiskButton);
int diskToInsert = -1;
for(int i = 0; i < 16; i++) {
if(IsPressed(FdsInputButtons::FdsButtons::InsertDisk1 + i)) {
diskToInsert = i;
break;
}
}
if(needEject || diskToInsert >= 0) {
if(needEject) {
_fds->EjectDisk();
}
if(diskToInsert >= 0) {
_fds->InsertDisk(diskToInsert);
}
}
}
void FdsInputButtons::EjectDisk()
{
auto lock = _emu->AcquireLock();
_needEjectDisk = true;
}
void FdsInputButtons::InsertDisk(uint8_t diskNumber)
{
auto lock = _emu->AcquireLock();
if(diskNumber >= _sideCount) {
return;
}
if(_fds->IsDiskInserted()) {
//Eject disk on next frame, then insert new disk 2 seconds later
_needEjectDisk = true;
_insertDiskNumber = diskNumber;
_insertDiskDelay = FdsInputButtons::ReinsertDiskFrameDelay;
} else {
//Insert disk on next frame
_insertDiskNumber = diskNumber;
_insertDiskDelay = 1;
}
MessageManager::DisplayMessage("FDS", "FdsDiskInserted", std::to_string(diskNumber / 2 + 1), diskNumber & 0x01 ? "B" : "A");
}
void FdsInputButtons::SwitchDiskSide()
{
if(!_fds->IsAutoInsertDiskEnabled()) {
if(_fds->IsDiskInserted()) {
auto lock = _emu->AcquireLock();
InsertDisk((_fds->GetCurrentDisk() ^ 0x01) % _fds->GetSideCount());
}
}
}
void FdsInputButtons::InsertNextDisk()
{
if(!_fds->IsAutoInsertDiskEnabled()) {
auto lock = _emu->AcquireLock();
InsertDisk(((_fds->GetCurrentDisk() & 0xFE) + 2) % _fds->GetSideCount());
}
}
uint8_t FdsInputButtons::ReadRam(uint16_t addr)
{
return 0;
}
void FdsInputButtons::WriteRam(uint16_t addr, uint8_t value)
{
}
void FdsInputButtons::ProcessNotification(ConsoleNotificationType type, void* parameter)
{
if(type == ConsoleNotificationType::ExecuteShortcut) {
ExecuteShortcutParams* params = (ExecuteShortcutParams*)parameter;
switch(params->Shortcut) {
default: break;
case EmulatorShortcut::FdsEjectDisk: EjectDisk(); break;
case EmulatorShortcut::FdsSwitchDiskSide: SwitchDiskSide(); break;
case EmulatorShortcut::FdsInsertNextDisk: InsertNextDisk(); break;
case EmulatorShortcut::FdsInsertDiskNumber: InsertDisk(params->Param); break;
}
}
}