mirror of
https://github.com/Oibaf66/uae-wii.git
synced 2024-11-22 10:39:19 +01:00
132 lines
2.4 KiB
C
132 lines
2.4 KiB
C
|
/*
|
||
|
* uaeexe.c - UAE remote cli
|
||
|
*
|
||
|
* (c) 1997 by Samuel Devulder
|
||
|
*/
|
||
|
|
||
|
#include "sysconfig.h"
|
||
|
#include "sysdeps.h"
|
||
|
|
||
|
#include "options.h"
|
||
|
#include "uae.h"
|
||
|
#include "memory.h"
|
||
|
#include "custom.h"
|
||
|
#include "newcpu.h"
|
||
|
#include "autoconf.h"
|
||
|
#include "traps.h"
|
||
|
#include "uaeexe.h"
|
||
|
|
||
|
static struct uae_xcmd *first = NULL;
|
||
|
static struct uae_xcmd *last = NULL;
|
||
|
static char running = 0;
|
||
|
static uae_u32 uaeexe_server (TrapContext *context) REGPARAM;
|
||
|
|
||
|
/*
|
||
|
* Install the server
|
||
|
*/
|
||
|
void uaeexe_install (void)
|
||
|
{
|
||
|
uaecptr loop;
|
||
|
|
||
|
loop = here ();
|
||
|
org (UAEEXE_ORG);
|
||
|
calltrap (deftrap (uaeexe_server));
|
||
|
dw (RTS);
|
||
|
org (loop);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Send command to the remote cli.
|
||
|
*
|
||
|
* To use this, just call uaeexe("command") and the command will be
|
||
|
* executed by the remote cli (provided you've started it in the
|
||
|
* s:user-startup for example). Be sure to add "run" if you want
|
||
|
* to launch the command asynchronously. Please note also that the
|
||
|
* remote cli works better if you've got the fifo-handler installed.
|
||
|
*/
|
||
|
int uaeexe (const char *cmd)
|
||
|
{
|
||
|
struct uae_xcmd *nw;
|
||
|
|
||
|
if (!running)
|
||
|
goto NORUN;
|
||
|
|
||
|
nw = (struct uae_xcmd *) malloc (sizeof *nw);
|
||
|
if (!nw)
|
||
|
goto NOMEM;
|
||
|
nw->cmd = (char *) malloc (strlen (cmd) + 1);
|
||
|
if (!nw->cmd) {
|
||
|
free (nw);
|
||
|
goto NOMEM;
|
||
|
}
|
||
|
|
||
|
strcpy (nw->cmd, cmd);
|
||
|
nw->prev = last;
|
||
|
nw->next = NULL;
|
||
|
|
||
|
if (!first)
|
||
|
first = nw;
|
||
|
if (last) {
|
||
|
last->next = nw;
|
||
|
last = nw;
|
||
|
} else
|
||
|
last = nw;
|
||
|
|
||
|
return UAEEXE_OK;
|
||
|
NOMEM:
|
||
|
return UAEEXE_NOMEM;
|
||
|
NORUN:
|
||
|
write_log ("Remote cli is not running.\n");
|
||
|
return UAEEXE_NOTRUNNING;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* returns next command to be executed
|
||
|
*/
|
||
|
static char *get_cmd (void)
|
||
|
{
|
||
|
struct uae_xcmd *cmd;
|
||
|
char *s;
|
||
|
|
||
|
if (!first)
|
||
|
return NULL;
|
||
|
s = first->cmd;
|
||
|
cmd = first;
|
||
|
first = first->next;
|
||
|
if (!first)
|
||
|
last = NULL;
|
||
|
free (cmd);
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* helper function
|
||
|
*/
|
||
|
#define ARG(x) (get_long (m68k_areg (&context->regs, 7) + 4*(x+1)))
|
||
|
static uae_u32 REGPARAM2 uaeexe_server (TrapContext *context)
|
||
|
{
|
||
|
int len;
|
||
|
char *cmd;
|
||
|
char *dst;
|
||
|
|
||
|
if (ARG(0) && !running) {
|
||
|
running = 1;
|
||
|
write_log ("Remote CLI started.\n");
|
||
|
}
|
||
|
|
||
|
cmd = get_cmd ();
|
||
|
if (!cmd)
|
||
|
return 0;
|
||
|
if (!ARG(0)) {
|
||
|
running = 0;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
dst = (char *) get_real_address (ARG (0));
|
||
|
len = ARG (1);
|
||
|
strncpy (dst, cmd, len);
|
||
|
write_log ("Sending '%s' to remote cli\n", cmd);
|
||
|
free (cmd);
|
||
|
return ARG (0);
|
||
|
}
|