Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
experimental GBA stuff for XK :)
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2578 8ced0084-cf51-0410-be5f-012b33b47a6e
  • Loading branch information
shuffle2 committed Mar 6, 2009
1 parent 5ce9ffe commit 95cf4cd
Show file tree
Hide file tree
Showing 6 changed files with 343 additions and 84 deletions.
177 changes: 177 additions & 0 deletions Source/Core/Core/Src/HW/GBAPipe.cpp
@@ -0,0 +1,177 @@
// Copyright (C) 2003-2008 Dolphin Project.

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.

// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/

// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#ifdef _WIN32
#include <windows.h>
#endif

#include "Common.h"
#include "../Core.h"

#include "GBAPipe.h"
#include "../PowerPC/PowerPC.h"
#include "CommandProcessor.h"


#include "../Host.h"

#ifdef _WIN32

namespace GBAPipe
{

HANDLE m_hPipe;
bool m_bIsServer;
bool m_bEnabled;
u32 m_BlockStart;

#define PIPENAME "\\\\.\\pipe\\gbapipe"


void SetBlockStart(u32 addr)
{
m_BlockStart = addr;
}

void StartServer()
{
if (m_bEnabled)
return;

//TODO: error checking
m_hPipe = CreateNamedPipe(
PIPENAME,
PIPE_ACCESS_DUPLEX, // client and server can both r+w
PIPE_WAIT |/* PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE,*/ PIPE_TYPE_BYTE | PIPE_READMODE_BYTE,
1, //maxinst
0x1000, //outbufsize
0x1000, //inbufsize
INFINITE, //timeout
0);

if (m_hPipe == INVALID_HANDLE_VALUE)
{
INFO_LOG(SERIALINTERFACE, "Failed to create pipe.");
}
else
{
INFO_LOG(SERIALINTERFACE, "Pipe %s created.", PIPENAME);
}

m_bIsServer = true;
m_bEnabled = true;
}

void ConnectAsClient()
{
if (m_bEnabled)
return;

//TODO: error checking
m_hPipe = CreateFile(
PIPENAME,
GENERIC_READ|GENERIC_WRITE,
0, //share
NULL,
OPEN_EXISTING,
0,
NULL);

if (m_hPipe == INVALID_HANDLE_VALUE)
{
INFO_LOG(SERIALINTERFACE, "Failed to connect to pipe. %08x (2 = file not found)", GetLastError());
}

m_bEnabled = true;
m_bIsServer = false;
}

void Stop()
{
if (m_bEnabled)
{
if (m_bIsServer)
DisconnectNamedPipe(m_hPipe);

CloseHandle(m_hPipe);
m_bEnabled = false;
}
}

void Read(u8& data)
{
if (!m_bEnabled)
return;

u32 read;
memset(&data, 0x00, sizeof(data)); // pad with zeros for now
HRESULT result = ReadFile(m_hPipe, &data, sizeof(data), (LPDWORD)&read, FALSE);
if (FAILED(result)/* || read != sizeof(data)*/)
{
INFO_LOG(SERIALINTERFACE, "Failed to read pipe %s", PIPENAME);
Stop();
}
else
{
INFO_LOG(SERIALINTERFACE, "read %x bytes: 0x%02x", read, data);
}
}

void Write(u8 data)
{
if (!m_bEnabled)
return;

u32 written;
HRESULT result = WriteFile(m_hPipe, &data, sizeof(data), (LPDWORD)&written,FALSE);
if (FAILED(result))
{
INFO_LOG(SERIALINTERFACE, "Failed to write to pipe %s", PIPENAME);
Stop();
}
else
{
INFO_LOG(SERIALINTERFACE, "Wrote %x bytes: 0x%02x", written, data);
}
}

bool IsEnabled()
{
return m_bEnabled;
}

bool IsServer()
{
return m_bIsServer;
}


}
#else

namespace GBAPipe
{
void StartServer() { }
void ConnectAsClient() { }
void Stop() { }
void Read(u32& data){}
void Write(u32 data){}
bool IsEnabled() { return false; }
bool IsServer() { return false; }
}
// #error Provide a GBAPipe implementation or dummy it out, please

#endif
51 changes: 51 additions & 0 deletions Source/Core/Core/Src/HW/GBAPipe.h
@@ -0,0 +1,51 @@
// Copyright (C) 2003-2008 Dolphin Project.

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.

// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/

// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
// Sets up and maintains interprocess communication to make it possible
// to easily compare any two cpu cores by running two instances of DolphinHLE and
// comparing them to each other.
//

#ifndef _CPUCOMPARE_H
#define _CPUCOMPARE_H

#include "Common.h"

namespace GBAPipe
{
// start the server
void StartServer();

// connect as client
void ConnectAsClient();

// stop
void Stop();

// Transfer funcs
void Read(u8& data);
void Write(u8 data);

// IsEnabled
bool IsEnabled();

// IsServer
bool IsServer();

void SetBlockStart(u32 addr);
}

#endif
6 changes: 3 additions & 3 deletions Source/Core/Core/Src/HW/SI.cpp
Expand Up @@ -533,9 +533,9 @@ void ChangeDeviceCallback(u64 userdata, int cyclesLate)
{
u8 channel = (u8)(userdata >> 32);
// doubt this matters...
// g_Channel[channel].m_Out.Hex = 0;
// g_Channel[channel].m_InHi.Hex = 0;
// g_Channel[channel].m_InLo.Hex = 0;
g_Channel[channel].m_Out.Hex = 0;
g_Channel[channel].m_InHi.Hex = 0;
g_Channel[channel].m_InLo.Hex = 0;

// raise the NO RESPONSE error
switch (channel)
Expand Down

0 comments on commit 95cf4cd

Please sign in to comment.