Disableable link support
Enable separate SRAM and VBA.INI profile for multiple instances
This commit is contained in:
parent
c5b5894d19
commit
687152c4ed
45
src/GBA.cpp
45
src/GBA.cpp
|
@ -2998,8 +2998,13 @@ void CPUUpdateRegister(u32 address, u16 value)
|
|||
cpuNextEvent = cpuTotalTicks;
|
||||
break;
|
||||
case 0x128:
|
||||
StartLink(value); // Link
|
||||
/* if(value & 0x80) {
|
||||
if (linkenable)
|
||||
{
|
||||
StartLink(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(value & 0x80) {
|
||||
value &= 0xff7f;
|
||||
if(value & 1 && (value & 0x4000)) {
|
||||
UPDATE_REG(0x12a, 0xFF);
|
||||
|
@ -3008,12 +3013,15 @@ void CPUUpdateRegister(u32 address, u16 value)
|
|||
value &= 0x7f7f;
|
||||
}
|
||||
}
|
||||
UPDATE_REG(0x128, value);*/
|
||||
UPDATE_REG(0x128, value);
|
||||
}
|
||||
break;
|
||||
case 0x12a:
|
||||
if(lspeed)
|
||||
if(linkenable && lspeed)
|
||||
{
|
||||
LinkSSend(value);
|
||||
UPDATE_REG(0x12a, value);
|
||||
UPDATE_REG(0x134, value);
|
||||
}
|
||||
break;
|
||||
case 0x130:
|
||||
P1 |= (value & 0x3FF);
|
||||
|
@ -3022,14 +3030,20 @@ void CPUUpdateRegister(u32 address, u16 value)
|
|||
case 0x132:
|
||||
UPDATE_REG(0x132, value & 0xC3FF);
|
||||
break;
|
||||
/* breaks sonic games
|
||||
case 0x134:
|
||||
if (linkenable)
|
||||
StartGPLink(value);
|
||||
break;*/
|
||||
case 0x140:
|
||||
StartJOYLink(value);
|
||||
break;
|
||||
else
|
||||
UPDATE_REG(0x134, value);
|
||||
|
||||
break;
|
||||
case 0x140:
|
||||
if (linkenable)
|
||||
StartJOYLink(value);
|
||||
else
|
||||
UPDATE_REG(0x140, value);
|
||||
|
||||
break;
|
||||
case 0x200:
|
||||
IE = value & 0x3FFF;
|
||||
UPDATE_REG(0x200, IE);
|
||||
|
@ -3858,7 +3872,7 @@ void CPULoop(int ticks)
|
|||
int timerOverflow = 0;
|
||||
// variable used by the CPU core
|
||||
cpuTotalTicks = 0;
|
||||
// if(cpuDmaHack2)
|
||||
if(linkenable && cpuDmaHack2)
|
||||
cpuNextEvent = 1;
|
||||
cpuBreakLoop = false;
|
||||
cpuNextEvent = CPUUpdateTicks();
|
||||
|
@ -4323,10 +4337,9 @@ void CPULoop(int ticks)
|
|||
#endif
|
||||
|
||||
ticks -= clockTicks;
|
||||
/* Link
|
||||
----------------------------------*/
|
||||
|
||||
if (linkenable)
|
||||
LinkUpdate(clockTicks);
|
||||
/* ----------------------------- */
|
||||
|
||||
cpuNextEvent = CPUUpdateTicks();
|
||||
|
||||
|
@ -4342,8 +4355,8 @@ void CPULoop(int ticks)
|
|||
goto updateLoop;
|
||||
}
|
||||
|
||||
// if(cpuDmaHack2)
|
||||
// cpuNextEvent = 1;
|
||||
if(linkenable && cpuDmaHack2)
|
||||
cpuNextEvent = 1;
|
||||
|
||||
if(IF && (IME & 1) && armIrqEnable) {
|
||||
int res = IF & IE;
|
||||
|
|
|
@ -29,6 +29,7 @@ extern bool cpuFlashEnabled;
|
|||
extern bool cpuEEPROMEnabled;
|
||||
extern bool cpuEEPROMSensorEnabled;
|
||||
extern int lspeed;
|
||||
extern bool linkenable;
|
||||
extern void LinkSStop(void);
|
||||
extern bool cpuDmaHack;
|
||||
extern bool cpuDmaHack2;
|
||||
|
@ -93,7 +94,7 @@ static inline u32 CPUReadMemory(u32 address)
|
|||
value = READ32LE(((u32 *)&internalRAM[address & 0x7ffC]));
|
||||
break;
|
||||
case 4:
|
||||
if((address>=0x4000120||address<=0x4000126)&&lspeed)
|
||||
if(linkenable && (address>=0x4000120||address<=0x4000126)&&lspeed)
|
||||
LinkSStop();
|
||||
if((address < 0x4000400) && ioReadable[address & 0x3fc]) {
|
||||
if(ioReadable[(address & 0x3fc) + 2])
|
||||
|
@ -218,7 +219,7 @@ static inline u32 CPUReadHalfWord(u32 address)
|
|||
value = READ16LE(((u16 *)&internalRAM[address & 0x7ffe]));
|
||||
break;
|
||||
case 4:
|
||||
if((address>=0x4000120||address<=0x4000126)&&lspeed)
|
||||
if(linkenable && (address>=0x4000120||address<=0x4000126)&&lspeed)
|
||||
LinkSStop();
|
||||
if((address < 0x4000400) && ioReadable[address & 0x3fe])
|
||||
{
|
||||
|
@ -333,7 +334,7 @@ static inline u8 CPUReadByte(u32 address)
|
|||
case 3:
|
||||
return internalRAM[address & 0x7fff];
|
||||
case 4:
|
||||
if((address>=0x4000120||address<=0x4000126)&&lspeed)
|
||||
if(linkenable&&(address>=0x4000120||address<=0x4000126)&&lspeed)
|
||||
LinkSStop();
|
||||
if((address < 0x4000400) && ioReadable[address & 0x3ff])
|
||||
return ioMem[address & 0x3ff];
|
||||
|
|
26
src/Link.cpp
26
src/Link.cpp
|
@ -37,10 +37,9 @@ int linktime = 0;
|
|||
u8 tspeed=3;
|
||||
u8 transfer=0;
|
||||
LINKDATA *linkmem=NULL;
|
||||
int linkid = 1, vbaid = 1;
|
||||
int linkid = 0, vbaid = 0;
|
||||
HANDLE linksync[4];
|
||||
int savedlinktime=0;
|
||||
char inifile[] = "vba1.ini";
|
||||
HANDLE mmf=NULL;
|
||||
char linkevent[] = "VBA link event ";
|
||||
static int i, j;
|
||||
|
@ -54,6 +53,7 @@ lserver ls;
|
|||
lclient lc;
|
||||
bool oncewait = false, after = false;
|
||||
bool adapter = false;
|
||||
bool linkenable = false;
|
||||
u8 rfu_cmd, rfu_qsend, rfu_qrecv;
|
||||
int rfu_state, rfu_polarity, linktime2, counter, rfu_masterq;
|
||||
int transferend, numtransfers = 0;
|
||||
|
@ -72,6 +72,22 @@ int StartServer(void);
|
|||
int GetSioMode(u16, u16);
|
||||
u16 StartRFU(u16);
|
||||
|
||||
char *MakeInstanceFilename(const char *Input)
|
||||
{
|
||||
if (vbaid == 0)
|
||||
return (char *)Input;
|
||||
|
||||
static char *result=NULL;
|
||||
if (result!=NULL)
|
||||
free(result);
|
||||
|
||||
result = (char *)malloc(strlen(Input)+3);
|
||||
char *p = strrchr((char *)Input, '.');
|
||||
sprintf(result, "%.*s-%d.%s", (int)(p-Input), Input, vbaid+1, p+1);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
void StartLink(WORD value){
|
||||
if(ioMem==NULL) return;
|
||||
if(adapter){
|
||||
|
@ -160,6 +176,8 @@ void StartGPLink(u16 value){
|
|||
else if(!adapter) fprintf(linklogfile, "Attempt to use General-purpose mode %04x\n", value);
|
||||
}
|
||||
if(adapter) rfu_state = RFU_INIT;
|
||||
// This was not there, but sonic games won't start if it's not here.
|
||||
UPDATE_REG(0x134, value);
|
||||
break;
|
||||
case JOYBUS:
|
||||
UPDATE_REG(0x134, value);
|
||||
|
@ -549,7 +567,6 @@ int InitLink(void){
|
|||
BOOL disable = true;
|
||||
|
||||
linkid = 0;
|
||||
inifile[3]='1';
|
||||
|
||||
if(WSAStartup(MAKEWORD(1,1), &wsadata)!=0){
|
||||
WSACleanup();
|
||||
|
@ -588,7 +605,6 @@ int InitLink(void){
|
|||
vbaid = 0;
|
||||
|
||||
if(vbaid==0){
|
||||
inifile[3]='1';
|
||||
linkid = 0;
|
||||
if(linkmem->linkflags&LINK_PARENTLOST){
|
||||
linkmem->numgbas++;
|
||||
|
@ -615,6 +631,7 @@ int InitLink(void){
|
|||
vbaid=linkmem->numgbas;
|
||||
linkid = vbaid;
|
||||
linkmem->numgbas++;
|
||||
|
||||
linklog = 0;
|
||||
if(linkmem->numgbas>4){
|
||||
linkmem->numgbas=4;
|
||||
|
@ -625,7 +642,6 @@ int InitLink(void){
|
|||
CloseHandle(mmf);
|
||||
return 0;
|
||||
}
|
||||
inifile[3]=(char)linkmem->numgbas+'0';
|
||||
for(i=0;i<4;i++){
|
||||
linkevent[15]=(char)i+'1';
|
||||
if((linksync[i]=OpenEvent(EVENT_ALL_ACCESS, false, linkevent))==NULL){
|
||||
|
|
|
@ -109,12 +109,14 @@ extern void LinkChildSend(u16);
|
|||
extern int openLinkLog(void);
|
||||
extern void closeLinkLog();
|
||||
extern void CloseLanLink(void);
|
||||
extern char *MakeInstanceFilename(const char *Input);
|
||||
|
||||
extern LANLINKDATA lanlink;
|
||||
extern FILE *linklogfile;
|
||||
extern int vbaid;
|
||||
extern int linklog;
|
||||
extern bool adapter;
|
||||
extern bool linkenable;
|
||||
extern int linktimeout;
|
||||
extern lclient lc;
|
||||
extern int linkid;
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include "../RTC.h"
|
||||
#include "../Sound.h"
|
||||
#include "../Util.h"
|
||||
#include "../Link.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
|
@ -386,6 +387,9 @@ BEGIN_MESSAGE_MAP(MainWnd, CWnd)
|
|||
ON_UPDATE_COMMAND_UI(ID_OPTIONS_LINK_LOG, OnUpdateOptionsLinkLog)
|
||||
ON_COMMAND(ID_OPTIONS_LINK_WIRELESSADAPTER, OnOptionsLinkRFU)
|
||||
ON_UPDATE_COMMAND_UI(ID_OPTIONS_LINK_WIRELESSADAPTER, OnUpdateOptionsLinkRFU)
|
||||
ON_COMMAND(ID_OPTIONS_LINK_ENABLE, OnOptionsLinkEnable)
|
||||
ON_UPDATE_COMMAND_UI(ID_OPTIONS_LINK_ENABLE, OnUpdateOptionsLinkEnable)
|
||||
|
||||
//}}AFX_MSG_MAP
|
||||
ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE10, OnFileRecentFile)
|
||||
ON_COMMAND_EX_RANGE(ID_FILE_LOADGAME_SLOT1, ID_FILE_LOADGAME_SLOT10, OnFileLoadSlot)
|
||||
|
@ -932,7 +936,7 @@ void MainWnd::writeBatteryFile()
|
|||
filename.Format("%s\\%s.sav", saveDir, buffer);
|
||||
|
||||
if(theApp.emulator.emuWriteBattery)
|
||||
theApp.emulator.emuWriteBattery(filename);
|
||||
theApp.emulator.emuWriteBattery(MakeInstanceFilename((const char *)filename));
|
||||
}
|
||||
|
||||
|
||||
|
@ -971,7 +975,7 @@ void MainWnd::readBatteryFile()
|
|||
bool res = false;
|
||||
|
||||
if(theApp.emulator.emuReadBattery)
|
||||
res = theApp.emulator.emuReadBattery(filename);
|
||||
res = theApp.emulator.emuReadBattery(MakeInstanceFilename(filename));
|
||||
|
||||
if(res)
|
||||
systemScreenMessage(winResLoadString(IDS_LOADED_BATTERY));
|
||||
|
|
|
@ -433,12 +433,13 @@ public:
|
|||
afx_msg void OnOptionsVideoFullscreen1024x768();
|
||||
afx_msg void OnUpdateOptionsVideoFullscreen1024x768(CCmdUI *pCmdUI);
|
||||
afx_msg void OnUpdateOptionsVideoFullscreen1280x1024(CCmdUI *pCmdUI);
|
||||
void OnLinkOptions();
|
||||
void OnOptionsLinkLog() ;
|
||||
void OnUpdateOptionsLinkLog(CCmdUI* pCmdUI) ;
|
||||
void OnOptionsLinkRFU() ;
|
||||
void OnUpdateOptionsLinkRFU(CCmdUI* pCmdUI) ;
|
||||
|
||||
afx_msg void OnLinkOptions();
|
||||
afx_msg void OnOptionsLinkLog() ;
|
||||
afx_msg void OnUpdateOptionsLinkLog(CCmdUI* pCmdUI) ;
|
||||
afx_msg void OnOptionsLinkRFU() ;
|
||||
afx_msg void OnUpdateOptionsLinkRFU(CCmdUI* pCmdUI) ;
|
||||
afx_msg void OnOptionsLinkEnable() ;
|
||||
afx_msg void OnUpdateOptionsLinkEnable(CCmdUI* pCmdUI) ;
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -1905,6 +1905,16 @@ void MainWnd::OnOptionsLinkRFU()
|
|||
}
|
||||
}
|
||||
|
||||
void MainWnd::OnUpdateOptionsLinkEnable(CCmdUI* pCmdUI)
|
||||
{
|
||||
pCmdUI->SetCheck(linkenable);
|
||||
}
|
||||
|
||||
void MainWnd::OnOptionsLinkEnable()
|
||||
{
|
||||
linkenable = !linkenable;
|
||||
}
|
||||
|
||||
void MainWnd::OnUpdateOptionsLinkRFU(CCmdUI* pCmdUI)
|
||||
{
|
||||
pCmdUI->SetCheck(adapter);
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "..\Link.h"
|
||||
|
||||
static char buffer[2048];
|
||||
static HKEY vbKey = NULL;
|
||||
|
@ -43,7 +44,7 @@ void regInit(const char *path)
|
|||
regVbaPath = NULL;
|
||||
}
|
||||
regVbaPath = new CString();
|
||||
regVbaPath->Format("%s\\vba.ini", path);
|
||||
regVbaPath->Format(MakeInstanceFilename("%s\\vba.ini"), path);
|
||||
}
|
||||
|
||||
void regShutdown()
|
||||
|
|
|
@ -482,16 +482,16 @@ BOOL VBA::InitInstance()
|
|||
systemVerbose = GetPrivateProfileInt("config",
|
||||
"verbose",
|
||||
0,
|
||||
"VBA.ini");
|
||||
MakeInstanceFilename("VBA.ini"));
|
||||
|
||||
systemDebug = GetPrivateProfileInt("config",
|
||||
"debug",
|
||||
0,
|
||||
"VBA.ini");
|
||||
MakeInstanceFilename("VBA.ini"));
|
||||
ddrawDebug = GetPrivateProfileInt("config",
|
||||
"ddrawDebug",
|
||||
0,
|
||||
"VBA.ini") ? true : false;
|
||||
MakeInstanceFilename("VBA.ini")) ? true : false;
|
||||
|
||||
wndClass = AfxRegisterWndClass(0, LoadCursor(IDC_ARROW), (HBRUSH)GetStockObject(BLACK_BRUSH), LoadIcon(IDI_ICON));
|
||||
|
||||
|
@ -1571,6 +1571,7 @@ void VBA::loadSettings()
|
|||
openLinkLog();
|
||||
|
||||
adapter = regQueryDwordValue("RFU", false) ? true : false;
|
||||
linkenable = regQueryDwordValue("linkEnabled", false) ? true : false;
|
||||
|
||||
lanlink.active = regQueryDwordValue("LAN", 0) ? true : false;
|
||||
if (autoFrameSkip)
|
||||
|
@ -2421,6 +2422,7 @@ void VBA::saveSettings()
|
|||
regSetDwordValue("LinkTimeout", linktimeout);
|
||||
regSetDwordValue("Linklog", linklog);
|
||||
regSetDwordValue("RFU", adapter);
|
||||
regSetDwordValue("linkEnabled", linkenable);
|
||||
}
|
||||
|
||||
void winSignal(int, int)
|
||||
|
|
|
@ -1799,6 +1799,7 @@ BEGIN
|
|||
END
|
||||
POPUP "Li&nk"
|
||||
BEGIN
|
||||
MENUITEM "Enable GBA Linking", ID_OPTIONS_LINK_ENABLE
|
||||
MENUITEM "&Wireless Adapter", ID_OPTIONS_LINK_WIRELESSADAPTER
|
||||
MENUITEM "&Log", ID_OPTIONS_LINK_LOG
|
||||
MENUITEM "&Options...", ID_OPTIONS_LINK_OPTIONS
|
||||
|
|
|
@ -796,13 +796,14 @@
|
|||
#define ID_OPTIONS_EMULATOR_REMOVEINTROSGBA 40331
|
||||
#define ID_Menu 40332
|
||||
#define ID_OPTIONS_VIDEO_RENDEROPTIONS_GLANISOTROPIC 40333
|
||||
#define ID_OPTIONS_LINK_ENABLE 40335
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 159
|
||||
#define _APS_NEXT_COMMAND_VALUE 40334
|
||||
#define _APS_NEXT_COMMAND_VALUE 40336
|
||||
#define _APS_NEXT_CONTROL_VALUE 1269
|
||||
#define _APS_NEXT_SYMED_VALUE 103
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue