mirror of
https://github.com/Oibaf66/frodo-wii.git
synced 2024-11-22 03:19:24 +01:00
Unbreak Wii again
This commit is contained in:
parent
b714e699fb
commit
1f1c7da4ef
3
Makefile
3
Makefile
@ -63,7 +63,8 @@ export DEPSDIR := $(CURDIR)/$(BUILD)
|
||||
CFILES := gcaudio.c
|
||||
CPPFILES := Display.cpp main.cpp Prefs.cpp SID.cpp REU.cpp IEC.cpp 1541fs.cpp \
|
||||
1541d64.cpp 1541t64.cpp 1541job.cpp SAM.cpp C64_SC.cpp CPUC64_SC.cpp VIC_SC.cpp \
|
||||
CIA_SC.cpp CPU1541_SC.cpp menu.cpp CPU_common.cpp VirtualKeyboard.cpp
|
||||
CIA_SC.cpp CPU1541_SC.cpp menu.cpp CPU_common.cpp VirtualKeyboard.cpp \
|
||||
Network.cpp
|
||||
sFILES :=
|
||||
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S)))
|
||||
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
|
||||
|
@ -207,7 +207,6 @@ void C64Display::Update(uint8 *src_pixels)
|
||||
SDL_Rect srcrect = {0, 0, DISPLAY_X, DISPLAY_Y};
|
||||
SDL_Rect dstrect = {0, 0, FULL_DISPLAY_X, FULL_DISPLAY_Y};
|
||||
Uint8 *dst_pixels = (Uint8*)sdl_screen->pixels;
|
||||
const Uint16 dst_pitch = sdl_screen->pitch;
|
||||
|
||||
/* Draw 1-1 */
|
||||
for (int y = 0; y < DISPLAY_Y; y++)
|
||||
@ -332,7 +331,6 @@ int C64Display::BitmapXMod(void)
|
||||
void C64Display::FakeKeyPress(int kc, uint8 *CIA_key_matrix,
|
||||
uint8 *CIA_rev_matrix)
|
||||
{
|
||||
int shifted = kc & 0x80;
|
||||
// Clear matrices
|
||||
for (int i = 0; i < 8; i ++)
|
||||
{
|
||||
|
@ -778,4 +778,8 @@ uint8 Network::sample_buf[NETWORK_SOUND_BUF_SIZE];
|
||||
int Network::sample_head;
|
||||
int Network::sample_tail;
|
||||
|
||||
#if defined(GEKKO)
|
||||
#include "NetworkWii.h"
|
||||
#else
|
||||
#include "NetworkUnix.h"
|
||||
#endif
|
||||
|
198
Src/NetworkWii.h
Normal file
198
Src/NetworkWii.h
Normal file
@ -0,0 +1,198 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <network.h>
|
||||
|
||||
static int set_sock_opts(int sock)
|
||||
{
|
||||
struct timeval tv;
|
||||
int d = 1;
|
||||
|
||||
memset(&tv, 0, sizeof(tv));
|
||||
tv.tv_sec = 2;
|
||||
net_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,
|
||||
&tv, sizeof(struct timeval));
|
||||
net_setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO,
|
||||
&tv, sizeof(struct timeval));
|
||||
net_setsockopt(sock,SOL_SOCKET,SO_REUSEADDR, &d, sizeof(int));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* From glibc docs */
|
||||
static int make_socket (uint16_t port)
|
||||
{
|
||||
struct sockaddr_in name;
|
||||
int sock;
|
||||
|
||||
/* Create the socket. */
|
||||
sock = net_socket (PF_INET, SOCK_STREAM, 0);
|
||||
if (sock < 0)
|
||||
{
|
||||
perror ("socket");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
set_sock_opts(sock);
|
||||
|
||||
/* Give the socket a name. */
|
||||
name.sin_family = AF_INET;
|
||||
name.sin_port = htons (port);
|
||||
name.sin_addr.s_addr = htonl (INADDR_ANY);
|
||||
if (net_bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0)
|
||||
{
|
||||
perror ("bind");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
return sock;
|
||||
}
|
||||
|
||||
bool init_sockaddr (struct sockaddr_in *name,
|
||||
const char *hostname, uint16_t port)
|
||||
{
|
||||
struct hostent *hostinfo;
|
||||
|
||||
name->sin_family = AF_INET;
|
||||
name->sin_port = htons (port);
|
||||
hostinfo = net_gethostbyname ((char*)hostname);
|
||||
if (hostinfo == NULL)
|
||||
{
|
||||
fprintf (stderr, "Unknown host %s.\n", hostname);
|
||||
return false;
|
||||
}
|
||||
//name->sin_addr = *(struct in_addr *) hostinfo->h_addr;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool Network::StartListener(int port)
|
||||
{
|
||||
Network::listen_sock = make_socket(port);
|
||||
|
||||
if (Network::listen_sock < 0)
|
||||
return false;
|
||||
if (net_listen(Network::listen_sock, MAX_NETWORK_PEERS) < 0)
|
||||
{
|
||||
perror("listen");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Network::CheckNewConnection()
|
||||
{
|
||||
struct timeval tv;
|
||||
struct sockaddr_in peer_name;
|
||||
size_t size;
|
||||
int peer_sock;
|
||||
fd_set listen_fds;
|
||||
Network *peer;
|
||||
|
||||
/* Not initialized yet */
|
||||
if (Network::listen_sock <= 0)
|
||||
return false;
|
||||
|
||||
/* No more than that thanks... */
|
||||
if (Network::n_peers >= MAX_NETWORK_PEERS)
|
||||
return false;
|
||||
|
||||
FD_ZERO(&listen_fds);
|
||||
FD_SET(Network::listen_sock, &listen_fds);
|
||||
|
||||
/* If something connects, create a new client */
|
||||
memset(&tv, 0, sizeof(tv));
|
||||
int v = net_select(Network::listen_sock + 1, &listen_fds, NULL, NULL, &tv);
|
||||
|
||||
if ( v < 0)
|
||||
{
|
||||
perror("select");
|
||||
exit(1);
|
||||
}
|
||||
else if ( v == 0 )
|
||||
return false;
|
||||
|
||||
size = sizeof(peer_name);
|
||||
peer_sock = net_accept(Network::listen_sock, (struct sockaddr*)&peer_name, &size);
|
||||
if (peer_sock < 0)
|
||||
{
|
||||
fprintf(stderr, "Accepting peer failed\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
/* And add the new one! */
|
||||
Network::AddPeer(new Network(peer_sock, true));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Network::ConnectTo(const char *hostname, int port)
|
||||
{
|
||||
/* Again from glibc docs */
|
||||
struct sockaddr_in servername;
|
||||
int sock;
|
||||
|
||||
/* Create the socket. */
|
||||
sock = net_socket (PF_INET, SOCK_STREAM, 0);
|
||||
if (sock < 0)
|
||||
{
|
||||
perror ("socket (client)");
|
||||
return false;
|
||||
}
|
||||
|
||||
set_sock_opts(sock);
|
||||
|
||||
/* Connect to the server. */
|
||||
init_sockaddr (&servername, hostname, port);
|
||||
if (net_connect(sock, (struct sockaddr *) &servername,
|
||||
sizeof (servername)) != 0)
|
||||
{
|
||||
perror ("connect (client)");
|
||||
return false;
|
||||
}
|
||||
|
||||
Network::AddPeer( new Network(sock, false) );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
ssize_t Network::ReceiveFrom(void *dst, int sock, size_t sz,
|
||||
struct sockaddr_in *from)
|
||||
{
|
||||
socklen_t from_sz = from ? sizeof(struct sockaddr_in) : 0;
|
||||
|
||||
return net_recvfrom(sock, dst, sz, 0, (struct sockaddr*)from, &from_sz);
|
||||
}
|
||||
|
||||
ssize_t Network::SendTo(void *src, int sock, size_t sz, struct sockaddr_in *to)
|
||||
{
|
||||
socklen_t to_sz = sizeof(struct sockaddr_in);
|
||||
|
||||
assert(to);
|
||||
return net_sendto(sock, src, sz, 0, (struct sockaddr*)to, to_sz);
|
||||
}
|
||||
|
||||
bool Network::Select(int sock, struct timeval *tv)
|
||||
{
|
||||
fd_set fds;
|
||||
int v;
|
||||
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(sock, &fds);
|
||||
|
||||
v = net_select(sock + 1, &fds, NULL, NULL, tv);
|
||||
if (v < 0)
|
||||
{
|
||||
fprintf(stderr, "Select failed\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
/* v is 0 if the sock is not ready */
|
||||
return v > 0;
|
||||
}
|
||||
|
||||
void Network::CloseSocket()
|
||||
{
|
||||
net_close(this->sock);
|
||||
}
|
@ -16,6 +16,9 @@ extern int init_graphics(void);
|
||||
* Create application object and start it
|
||||
*/
|
||||
|
||||
char *fixme_tmp_network_client = 0;
|
||||
int fixme_tmp_network_server = 0;
|
||||
|
||||
extern "C" int main(int argc, char **argv)
|
||||
{
|
||||
Frodo *the_app;
|
||||
|
Loading…
Reference in New Issue
Block a user