13.05.2010

parent c7eb4939
This diff is collapsed.
This diff is collapsed.
ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = m4 amiga docs CHANGES README
SUBDIRS = src
dist_noinst_SCRIPTS = bootstrap.sh
dist-hook:
rm -rf `find $(distdir) -name CVS`
rm -rf `find $(distdir) -name *.bak`
rm -rf `find $(distdir) -name *~`
rm -rf `find $(distdir) -name *.orig`
This diff is collapsed.
#!/usr/bin/make -f
# Makefile to build UAE amiga tools with GCC
CC = gcc
CFLAGS = -O2 -noixemul -fomit-frame-pointer -msmall-code -fbaserel
LDFLAGS = $(CFLAGS) -s
timehack: timehack.o
clean:
-rm timehack timehack.o
SECTION code
xdef _mousehackint
_mousehackint:
moveq.l #1,d0
jsr.l $F0FF70
move.l d0,d1
moveq.l #2,d0
jsr.l $F0FF70
cmp.l (a1),d1
bne l1
cmp.l 4(a1),d0
beq l2
l1:
move.l d0,4(a1)
move.l d1,(a1)
move.l 8(a1),d0
move.l 12(a1),a1
move.l 4.w,a6
jsr -324(a6) ; Signal
l2:
lea $DFF000,a0
moveq.l #0,d0
rts
END
/*
* IEvent mouse hack
*
* Compile with DCC
*
* Copyright 1997 Bernd Schmidt
*/
#include <stdio.h>
#include <exec/devices.h>
#include <exec/interrupts.h>
#include <exec/nodes.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <intuition/intuitionbase.h>
#include <intuition/preferences.h>
#include <devices/input.h>
#include <devices/inputevent.h>
#include <devices/timer.h>
#include <hardware/intbits.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
int (*calltrap)(__d0 int) = 0xF0FF70;
extern void mousehackint(void);
struct {
ULONG mx;
ULONG my;
ULONG sigbit;
struct Task *mt;
} foo;
struct Interrupt myint = {
{ 0, 0, NT_INTERRUPT, 5, "UAE mouse hack" },
&foo,
mousehackint
};
int main(int argc, char **argv)
{
struct IntuitionBase *ibase;
struct InputEvent *iev;
struct IOStdReq *ioreq = 0;
struct MsgPort *port;
struct timerequest *timereq = 0;
struct MsgPort *timeport;
int oldx = 0, oldy = 0;
int i;
i = (*calltrap) (0);
if (i == 0) {
fprintf(stderr, "mousehack not needed for this version of UAE.\n");
exit (0);
}
if (i == -1) {
fprintf(stderr, "mousehack already running.\n");
exit (5);
}
i = AllocSignal (-1);
if (i < 0)
goto fail;
foo.sigbit = 1 << i;
port = CreatePort(0, 0);
timeport = CreatePort (0, 0);
if (port)
ioreq = CreateStdIO(port);
if (timeport)
timereq = CreateStdIO(timeport);
if (ioreq == 0)
goto fail;
if (timereq == 0)
goto fail;
iev = AllocMem (sizeof (struct InputEvent), MEMF_CLEAR + MEMF_PUBLIC);
if (iev == 0)
goto fail;
if (OpenDevice ("input.device", 0, ioreq, 0) != 0)
goto fail;
if (OpenDevice ("timer.device", 0, timereq, 0) != 0)
goto fail;
foo.mx = (ULONG)-1;
foo.my = (ULONG)-1;
foo.mt = FindTask (0);
AddIntServer(INTB_VERTB, &myint);
ibase = OpenLibrary ("intuition.library", 0);
SetTaskPri (foo.mt, 20); /* same as input.device */
for (;;) {
int newx, newy;
Wait (foo.sigbit);
ioreq->io_Command = IND_WRITEEVENT;
ioreq->io_Length = sizeof (struct InputEvent);
ioreq->io_Data = iev;
ioreq->io_Flags = IOF_QUICK;
iev->ie_Class = IECLASS_POINTERPOS;
iev->ie_SubClass = 0;
iev->ie_Code = 0;
iev->ie_Qualifier = 0;
#if 0
newx = (*calltrap) (1);
newy = (*calltrap) (2);
if (oldy != newy || oldx != newx)
#endif
{
timereq->tr_node.io_Flags = IOF_QUICK;
timereq->tr_node.io_Command = TR_GETSYSTIME;
DoIO (timereq);
iev->ie_TimeStamp = timereq->tr_time;
/* Those are signed, so I hope negative values are OK... */
/* I wonder why I have to multiply those by 2... but it works,
* at least for me. */
iev->ie_position.ie_xy.ie_x = foo.mx - ibase->ViewLord.DxOffset*2;
iev->ie_position.ie_xy.ie_y = foo.my - ibase->ViewLord.DyOffset*2;
oldx = newx;
oldy = newy;
DoIO(ioreq);
}
#if 0
timereq->tr_node.io_Flags = IOF_QUICK;
timereq->tr_time.tv_secs = 0;
timereq->tr_time.tv_micro = 20000;
timereq->tr_node.io_Command = TR_ADDREQUEST;
DoIO(timereq);
#endif
}
fail:
fprintf (stderr, "Couldn't start mousehack (that's bad!)\n");
exit (5);
}
/*
* synchronize system time with the host's time
*
* Compile with DCC (or SAS/C) or GCC
*
* Copyright 1997, 1999 Bernd Schmidt
* Copyright 1999 Patrick Ohly
* Copyright 2003 Richard Drummond
*
* 0.3 - 20031106
* Silly me. Timehack was demanding clock be exactly in sync
* to 1us accuracy. Make it less strict and only update amiga
* time if it's out by more than 1ms.
* 0.2 - 20031011
* Oops. I got the the sign of the offset wrong in TZ. Apparently
* negative values are ahead of UTC. Go figure . . .
* 0.1 - 20031011
* Quick and dirty support for using TZ offset added.
* Can now be killed with ^C
* Can now be built with GCC
* Replaced fprintf() with fputs() for smaller code size with GCC.
*/
#include <stdio.h>
#include <stdlib.h>
#include <exec/devices.h>
#include <exec/interrupts.h>
#include <exec/nodes.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <intuition/intuitionbase.h>
#include <intuition/preferences.h>
#include <devices/input.h>
#include <devices/inputevent.h>
#include <devices/timer.h>
#include <hardware/intbits.h>
#include <clib/alib_protos.h>
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <clib/timer_protos.h>
#ifdef __GNUC__
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/timer.h>
#include <inline/alib.h>
#endif
#ifdef _DCC
int (*calltrap)(__d0 int, __a0 struct timeval *) = 0xF0FFA0;
#elif defined (__GNUC__)
int (*calltrap)(int __asm("d0"),struct timeval * __asm("a0")) = (APTR)0xF0FFA0;
#else
/* SAS */
__asm int (*calltrap)(register __d0 int, register __a0 struct timeval *) = (APTR)0xF0FFA0;
#endif
#ifdef __GNUC__
/* Don't link with command-line parser to save code size */
int __nocommandline = 0;
#endif
/* We'll give this a verson number now. We have to
* to start somewhere - Rich */
char verstag[] = "\0$VER: timehack 0.3";
#ifndef ABS
#define ABS(x) ((x)>=0?(x):-(x))
#endif
/*
* get_tz_offset()
*
* Get offset from local time to UTC and return it as
* a timeval (seconds and usecs). The local timezone
* is read from the env variable TZ and this is expected
* to be in standard format, for example, EST+5.
* If TZ isn't present or can't be parsed, this will
* return an offset 0 seconds.
*/
struct timeval *get_tz_offset()
{
static struct timeval tz_offset;
BPTR file;
char tz_str[7];
if ((file = Open ("ENV:TZ", MODE_OLDFILE))!=NULL) {
int len;
if ((len = Read (file, &tz_str[0], 6)) >= 4) {
tz_str[len]='\0';
// N.B.: negative offsets in ENV:TZ are ahead of UTC
tz_offset.tv_secs = -1 * atol(&tz_str[3]) * 3600;
}
Close(file);
} else
tz_offset.tv_secs = 0;
tz_offset.tv_micro = 0;
return &tz_offset;
}
int main (int argc, char **argv)
{
struct timerequest *timereq = 0;
struct MsgPort *timeport;
struct timeval *tz_offset;
struct Device *TimerBase;
int quit = 0;
int result = calltrap (0, 0);
if (result == 1)
fputs ("timehack already running.\n", stderr);
else if (result == 2)
fputs ("timehack not supported with this version of UAE.\n", stderr);
if (result != 0)
exit (5);
timeport = (struct MsgPort *) CreatePort (0, 0);
if (timeport)
timereq = (struct timerequest *) CreateStdIO(timeport);
if (timereq == 0)
goto fail;
if (OpenDevice ("timer.device", UNIT_VBLANK, (struct IORequest *) timereq, 0) != 0)
goto fail;
TimerBase = timereq->tr_node.io_Device;
SetTaskPri (FindTask (NULL), 20); /* same as input.device */
tz_offset = get_tz_offset();
while (!quit) {
struct timeval cur_sys_time;
timereq->tr_node.io_Command = TR_GETSYSTIME;
DoIO ((struct IORequest *)timereq);
cur_sys_time = timereq->tr_time;
calltrap (1, &timereq->tr_time);
if (timereq->tr_time.tv_secs != cur_sys_time.tv_secs
|| (timereq->tr_time.tv_secs == cur_sys_time.tv_secs
&& ABS(timereq->tr_time.tv_micro - cur_sys_time.tv_micro) > 1000))
{
AddTime (&timereq->tr_time, tz_offset);
timereq->tr_node.io_Command = TR_SETSYSTIME;
DoIO ((struct IORequest *)timereq);
}
timereq->tr_time.tv_secs = 1;
timereq->tr_time.tv_micro = 0;
timereq->tr_node.io_Command = TR_ADDREQUEST;
DoIO ((struct IORequest *)timereq);
if (SetSignal(0L,SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)
quit = TRUE;
}
/* Exit and error handling badly needs tidying up - Rich */
CloseDevice ((struct IORequest *)timereq);
DeleteStdIO ((struct IOStdReq *)timereq);
DeletePort (timeport);
exit (0);
fail:
fputs ("Couldn't start timehack (that's bad!)\n", stderr);
exit (5);
}
/*
* Transdisk V4.2
* Copyright 1995-97 Bernd Schmidt, Marcus Sundberg, Stefan Ropke,
* Rodney Hester, Joanne Dow
*
* Use DICE and 2.0 includes or above to compile. SAS C should work too.
*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <strings.h>
#include <exec/devices.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <devices/trackdisk.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
static void usage(void);
static void usage(void)
{
fprintf(stderr, "Usage: transdisk options\n");
fprintf(stderr, "Recognized options:\n");
fprintf(stderr, "-h: Assume device is high density\n");
fprintf(stderr, "-d device unit: Use this device instead of DF0:\n");
fprintf(stderr, "-s n: Begin transfer at track n\n");
fprintf(stderr, "-e n: End transfer at track n\n");
fprintf(stderr, "-w filename: writes the ADF file <filename> to disk\n\n");
fprintf(stderr, "Example:\n");
fprintf(stderr, "transdisk >RAM:df1.adf.1 -d trackdisk 1 -s 0 -e 39\n");
fprintf(stderr, "transfers the first half of the floppy in DF1: into\n");
fprintf(stderr, "a file in the RAM disk.\n");
fprintf(stderr, "Or:\n");
fprintf(stderr, "transdisk -w test.adf\n");
fprintf(stderr, "writes the ADF-file test.adf to the disk in df0:\n");
}
int main(int argc, char **argv)
{
char *filename, *openMode="rb";
FILE *ADFFile;
int write=0;
struct IOStdReq *ioreq;
struct MsgPort *port;
UBYTE *buffer;
char devicebuf[256];
char *devicename = "trackdisk.device";
char devicenum = 0;
int i;
int starttr = 0, endtr = 79;
int sectors = 11;
for (i = 1; i < argc;) {
if (argv[i][0] != '-' || argv[i][2] != 0) {
usage();
exit(1);
}
switch (argv[i][1]) {
case 'h':
sectors = 22;
i++;
break;
case 'd':
if (i+2 >= argc) {
usage();
exit(1);
}
devicenum = atoi(argv[i+2]);
sprintf(devicebuf, "%s.device", argv[i+1]);
devicename = devicebuf;
i += 3;
break;
case 's':
if (i+1 >= argc) {
usage();
exit(1);
}
starttr = atoi(argv[i+1]);
i += 2;
break;
case 'e':
if (i+1 >= argc) {
usage();
exit(1);
}
endtr = atoi(argv[i+1]);
i += 2;
break;
case 'w':
if (i+1 >= argc) {
usage();
exit(1);
}
filename=argv[i+1];
write=1;
i += 2;
break;
default:
usage();
exit(1);
}
}
fprintf(stderr,"Using %s unit %d\n", devicename, devicenum);
fprintf(stderr,"Tracks are %d sectors\n", sectors);
fprintf(stderr,"First track %d, last track %d\n", starttr, endtr);
buffer = AllocMem(512, MEMF_CHIP);
if (write) {
ADFFile = fopen(filename,openMode);
if (!ADFFile) {
fprintf(stderr,"Error while opening input file\n");
exit (1);
}
}
port = CreatePort(0, 0);
if (port) {
ioreq = CreateStdIO(port);
if (ioreq) {
if (OpenDevice(devicename, devicenum, (struct IORequest *) ioreq, 0) == 0) {
int tr, sec;
ioreq->io_Command = write ? CMD_WRITE : CMD_READ;
ioreq->io_Length = 512;
ioreq->io_Data = buffer;
for (tr = starttr*2; tr < (endtr+1)*2; tr++) {
fprintf(stderr,"Track: %d\r",tr/2);
for (sec = 0; sec < sectors; sec++) {
fflush(stderr);
if (write)
if (fread(buffer, sizeof(UBYTE), 512, ADFFile) < 512) {
fprintf(stderr, "Error: ADF file to short?\n");
exit(1);
}
ioreq->io_Offset = 512 * (tr * sectors + sec);
DoIO( (struct IORequest *) ioreq);
if (!write)
fwrite(buffer, sizeof(UBYTE), 512, stdout);
}
}
if (write) { /* Make sure the last track is written to disk */
ioreq->io_Command = CMD_UPDATE;
DoIO( (struct IORequest *) ioreq);
}
ioreq->io_Command = TD_MOTOR; /* Turn Disk-motor off */
ioreq->io_Length = 0;
DoIO( (struct IORequest *) ioreq);
CloseDevice( (struct IORequest *) ioreq);
} else
fprintf(stderr,"Unable to open %s unit %d\n", devicename, devicenum);
DeleteStdIO(ioreq);
}
DeletePort(port);
}
fprintf(stderr,"\n");
FreeMem(buffer, 512);
if (write)
fclose (ADFFile);
return 0;
}
/*
* Transrom V4.1
* Copyright 1995,1996 Bernd Schmidt, Marcus Sundberg, Stefan Ropke,
* Rodney Hester
*
* Use DICE and 2.0 includes or above to compile
*/
#include <stdio.h>
int main(int argc, char **argv)
{
int l;
if (l=OpenLibrary("exec.library",35L)) /* Not sure about V35 */
{
fprintf(stderr,"Writing 512K Kickstart image...\n");
fflush(stderr);
fwrite((char *)0xF80000,sizeof(char),0x80000,stdout);
CloseLibrary(l);
}
else
{
fprintf(stderr,"Writing 256K Kickstart image...\n");
fflush(stderr);
fwrite((char *)0xF80000,sizeof(char),0x40000,stdout);
}
return 0;
}
#define __NOLIBBASE__
#include <proto/exec.h>
#include <proto/dos.h>
#define OUTBUFSIZE 1000
long (*UaeConf) (...);
struct Library *SysBase;
struct Library *DOSBase;
char outbuf[OUTBUFSIZE+1];
__saveds long start (register __a0 param,register __d0 paramlen)
{
long rc = 20;
long index;
BPTR out;
char *s;
BOOL brk = FALSE;
UaeConf = (void *) 0xf0ff60;
SysBase = *((struct Library **)4);
if (DOSBase = OpenLibrary ("dos.library",0))
{
out = Output();
if (*((ULONG *)UaeConf))
{
index = -1;
do {
outbuf[0] = 0;
rc = UaeConf (82,index,param,paramlen,outbuf,OUTBUFSIZE);
if (outbuf[0] && out)
{
for (s = outbuf; *s; s++);
*s++ = '\n';
Write (out,outbuf,s - outbuf);
}
index++;
if (SetSignal(0,0) & SIGBREAKF_CTRL_C)
brk = TRUE;
} while (!brk && rc < 0);
if (brk && out)
{
Write (out,"*** Break\n",10);
rc = 10;
}
}
else
if (out)
Write (out,"Your version of WinUAE is too old\n",34);
CloseLibrary (DOSBase);
}
return (rc);
}
; uae-configuration Amiga-side part
; (c) Toni Wilen 2004
OUTBUFSIZE = 1000
move.l a0,a3
move.l d0,d3
sub.l a4,a4
moveq #20,d7
lea $f0ff60,a5
tst.l (a5)
beq.s end
move.l 4,a6
lea dos(pc),a1
moveq #0,d0
jsr -$228(a6) ;OpenLibrary
tst.l d0
beq.s end
move.l d0,a4
move.l a4,a6
moveq #-1,d6
loop
lea outbuf,a2
move.l #OUTBUFSIZE,-(sp) ;out len
move.l a2,-(sp) ;out
clr.b (a2)
move.l d3,-(sp) ;param len
move.l a3,-(sp) ;param
move.l d6,-(sp) ;index
moveq #82,d0
move.l d0,-(sp)
jsr (a5)
lea 6*4(sp),sp
move.l d0,d7
; do we have output?
move.l d3,-(sp)
tst.b (a2)
beq.s noout
jsr -$003c(a6) ;Output
move.l d0,d4
beq.s noout
move.l d4,d1
move.l a2,d2
moveq #-1,d3
out1
addq.l #1,d3
tst.b (a2)+
bne.s out1
jsr -$0030(a6) ; Write
move.l d4,d1
lea lf(pc),a0
move.l a0,d2
moveq #1,d3
jsr -$0030(a6) ; Write
noout
move.l (sp)+,d3
tst.l d7
bpl.s end
; list all -mode
addq.l #1,d6
bra loop
end
move.l a4,d0
beq.s end2
move.l d0,a1
move.l 4,a6
jsr -$19e(a6) ;CloseLibrary
end2
move.l d7,d0
rts
dos dc.b "dos.library",0
lf dc.b 10
section 2,bss
outbuf
ds.b OUTBUFSIZE
This diff is collapsed.
/*
* UAE - The U*nix Amiga Emulator
*
* UAE-Control - Emulator control from inside emulation
* (c) 1996 Tauno Taipaleenmaki <tataipal@raita.oulu.fi>
* (c) 1998 Cloanto <info@cloanto.com>
*/
#define GAD_RESET 1
#define GAD_DEBUG 2
#define GAD_EXITEMU 3
#define GAD_EJECT_DF0 4
#define GAD_INSERT_DF0 5
#define GAD_EJECT_DF1 6
#define GAD_INSERT_DF1 7
#define GAD_EJECT_DF2 8
#define GAD_INSERT_DF2 9
#define GAD_EJECT_DF3 10
#define GAD_INSERT_DF3 11
#define GAD_SOUND 12
#define GAD_JOYSTICK 13
#define GAD_FRAMERATE 14
#define GAD_CHIPMEMSIZE 15
#define GAD_SLOWMEMSIZE 16
#define GAD_FASTMEMSIZE 17
#define GAD_LANGUAGE 18
#define GAD_OK 1
#define GAD_CANCEL 2
#define GAD_STRING 3
/*
* Configuration structure
*/
struct UAE_CONFIG
{
ULONG version;
ULONG chipmemsize;
ULONG slowmemsize;
ULONG fastmemsize;
ULONG framerate;
ULONG do_output_sound;
ULONG do_fake_joystick;
ULONG keyboard;
UBYTE disk_in_df0;
UBYTE disk_in_df1;
UBYTE disk_in_df2;
UBYTE disk_in_df3;
char df0_name[256];
char df1_name[256];
char df2_name[256];
char df3_name[256];
};
static int (*calltrap)(...) = (int (*)(...))0xF0FF60;
static int GetVersion(void)
{
calltrap (0);
}
static int GetUaeConfig(struct UAE_CONFIG *a)
{
calltrap (1, a);
}
static int SetUaeConfig(struct UAE_CONFIG *a)
{
calltrap (2, a);
}
static int HardReset(void)
{
calltrap (3);
}
static int Reset(void)
{
calltrap (4);
}
static int EjectDisk(ULONG drive)
{
calltrap (5, "", drive);
}
static int InsertDisk(UBYTE *name, ULONG drive)
{
calltrap (5, name, drive);
}
static int EnableSound(void)
{
calltrap (6, 2);
}
static int DisableSound(void)
{
calltrap (6, 1);
}
static int EnableJoystick(void)
{
calltrap (7, 1);
}
static int DisableJoystick(void)
{
calltrap (7, 0);
}
static int SetFrameRate(ULONG rate)
{
calltrap (8, rate);
}
static int ChgCMemSize(ULONG mem)
{
calltrap (9, mem);
}
static int ChgSMemSize(ULONG mem)
{
calltrap (10, mem);
}
static int ChgFMemSize(ULONG mem)
{
calltrap (11, mem);
}
static int ChangeLanguage(ULONG lang)
{
calltrap (12, lang);
}
static int ExitEmu(void)
{
calltrap (13);
}
static int GetDisk(ULONG drive, UBYTE *name)
{
calltrap (14, drive, name);
}
static int DebugFunc(void)
{
calltrap (15);
}
;/* compile with: execute uae_rcli.c
failat 11
sc uae_rcli.c opt link to uae_rcli noicons
if ERROR
gcc uae_rcli.c -O3 -o uae_rcli -noixemul
endif
quit
*/
/*
* uae_rcli.c - UAE remote cli
*
* (c) 1997 by Samuel Devulder
*/
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <libraries/dosextens.h>
#ifdef __GNUC__
#include "../../src/include/uaeexe.h"
#else
#include "//src/include/uaeexe.h"
#endif
#define NAME "uae_rcli"
#define LEN 512
static int (*calltrap)(char *, int) = (void*)UAEEXE_ORG;
static int delay = 20;
static int debug = 0;
static int nofifo = 0;
static ULONG fifo;
static char buf[LEN];
/*
* lowlevel I/O
*/
static void WR(ULONG f,char *s)
{
Write(f,s,strlen(s));
}
static void PR(char *s)
{
WR(Output(),s);
}
/*
* self explanatory
*/
static void usage(char *name)
{
PR("Usage: ");PR(name);PR(" [-h|?] [-debug] [-nofifo] [<delay>]\n");
exit(0);
}
/*
* grab options
*/
static void parse_cmdline(int ac, char **av)
{
char *name = *av++;
for(;--ac;++av) {
if(!strcmp(*av,"-debug")) debug = 1; else
if(!strcmp(*av,"-nofifo")) nofifo = 1; else
if(!strcmp(*av,"-h")) usage(name); else
if(!strcmp(*av,"?")) usage(name); else
if(**av>='0' && **av<='9') delay = atoi(*av); else
{PR("Bad argument: \"");PR(*av);PR("\"\n");exit(0);}
}
if(!delay) delay = 1;
}
/*
* See if command matches. Returns pointer to arguments.
*/
static char *match(char *src,char *cmd)
{
while(*src == ' ' || *src == '\t') ++src;
while(*src && tolower(*src) == tolower(*cmd)) {++src;++cmd;}
while(*src==' ' || *src=='\t') ++src;
return (*cmd)?NULL:src;
}
/*
* get command
*/
static int getcmd(void)
{
if(debug) PR("-> Calltrap\n");
if(calltrap(buf, LEN-1)) {
if(debug) PR("-> 1\n");
return 1;
} else {
if(debug) PR("-> 0\n");
return 0;
}
/*
PR(">> ");
if(fgets(buf,LEN-1,stdin) == NULL) strcpy(buf,"quit");
if(*buf=='\n') return 0;
return 1;
*/
}
/*
* execute command
*/
static void my_exec(void)
{
if(debug) {PR("-> Exec \"");PR(buf);PR("\"\n");}
if(fifo) {
WR(fifo,buf);
WR(fifo,"\n");
} else { /* nofifo => emulate cli */
char *s;
if((s=match(buf,"cd"))) {
if(*s==';' || !*s) {
char buff[128];
getcwd(buff,sizeof(buff)-1);
PR(buff);PR("\n");
} else {
chdir(s);
}
} else {
System(buf, NULL);
}
}
*buf = '\0';
}
/*
* Open without requester
*/
ULONG myOpen(char *name, ULONG mode)
{
ULONG rt, wd;
struct Process *pr;
pr = (void*)FindTask(NULL);
if(pr->pr_Task.tc_Node.ln_Type != NT_PROCESS) return 0;
wd = (ULONG)pr->pr_WindowPtr;
pr->pr_WindowPtr = (APTR)-1;
rt = Open(name,mode);
pr->pr_WindowPtr = (APTR)wd;
return rt;
}
/*
* Guess :)
*/
int main(int ac, char **av)
{
int running = 1;
parse_cmdline(ac,av);
if(!nofifo) {
if(debug) PR("-> Open fifo\n");
fifo = myOpen("fifo:"NAME"/wmke",MODE_NEWFILE);
if(!fifo) {
if(debug) PR("-> Starting fifo-handler\n");
System("run <nil: >nil: l:fifo-handler",NULL);
Delay(100);
if(debug) PR("-> Reopen fifo\n");
fifo = myOpen("fifo:"NAME"/wmke",MODE_NEWFILE);
}
}
if(fifo) {
if(debug) PR("-> Spawning shell\n");
System("run execute fifo:"NAME"/rsk",NULL);
if(debug) WR(fifo,"echo \"-> Remote cli running\"\n");
} else if(debug) PR("-> No fifo found\n");
do {
while(running && getcmd()) {
if(match(buf,"endcli")) running = 0; else
if(match(buf,"endshell")) running = 0; else
if(match(buf,"quit")) running = 0;
if(SetSignal(0L, SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D) &
(SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D)) {
running = 0;
}
if(running) my_exec();
}
if(running) Delay(delay);
} while(running);
if(debug) PR("-> Exiting\n");
(*calltrap)(0,0);
if(fifo) {
Close(fifo);
}
}
/***********************************************************
* UAE - The U*nix Amiga Emulator *
* *
* UAE-Ctrl -- Emulator Control from Inside Emulation *
* (c) 1996 Tauno Taipaleenmaki <tataipal@raita.oulu.fi> *
* *
* Version 0.1 *
* *
* Command line version, Should work with any KS version *
* *
***********************************************************/
#include <clib/exec_protos.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "uae-control.h"
#include "uae_pragmas.h"
#define MAX_DRV_NAME 20
struct UAE_CONFIG config;
void print_drive_status(void);
void quit_program(int error, char *text);
/************************************
* Main program *
************************************/
int main()
{
int quit = 0,i, correct,number;
char buf[257];
char *langs[]={
"US\0","DE\0","SE\0","FR\0","IT\0",
};
/* Read UAE configuration */
i = GetUaeConfig( &config );
while( quit == 0 ) {
printf(" UAE-Control v0.1\n\n");
printf(" 1) Reset\n");
printf(" 2) Debug\n");
printf(" 3) Exit Emulator\n");
printf(" 4) Change framerate (Currently : %ld)\n", config.framerate);
printf(" 5) Toggle sound (Currently : %s)\n", config.do_output_sound ? "ON" : "OFF");
printf(" 6) Toggle fake joystick (Currently : %s)\n", config.do_fake_joystick ? "ON" : "OFF");
printf(" 7) Change language (Currently : %s)\n", langs[config.keyboard]);
printf(" 8) Eject a disk\n");
printf(" 9) Insert a disk\n");
printf("10) Exit UAE-Control\n\n");
correct = 0;
while( correct == 0 ) {
printf(" Command : ");
gets( buf );
i = atoi( buf );
if ((i > 0) && (i < 11))
correct = 1;
}
switch( i ) {
case 1:
HardReset();
break;
case 2:
DebugFunc();
break;
case 3:
ExitEmu();
break;
case 4:
printf(" Enter new framerate (1-20) :");
gets( buf );
number = atoi( buf );
if (SetFrameRate (number))
GetUaeConfig(&config);
else
printf(" Illegal value, not changed.\n");
break;
case 5:
if (config.do_output_sound)
DisableSound();
else
EnableSound();
GetUaeConfig( &config );
break;
case 6:
if (config.do_fake_joystick)
DisableJoystick();
else
EnableJoystick();
GetUaeConfig( &config );
break;
case 7:
printf(" 1 = US, 2 = DE, 3 = SE, 4 = FR, 5 = IT\n");
printf(" What will it be : ");
gets( buf );
number = atoi( buf );
if ((number >= 1) && (number <= 5)) {
ChangeLanguage( number-1 );
GetUaeConfig( &config );
} else {
printf(" Illegal value, not changed.\n");
}
break;
case 8:
print_drive_status();
printf(" Eject which drive (1-4): ");
gets( buf );
number = atoi( buf );
if ((number >= 1) && (number <=4 )) {
EjectDisk( number-1 );
GetUaeConfig( &config );
} else {
printf(" Illegal drive, not changed.\n");
}
break;
case 9:
print_drive_status();
printf(" Enter disk to drive (1-4): ");
gets( buf );
number = atoi( buf );
if ((number >= 1) && (number <= 4)) {
printf("Name of diskfile :");
gets( buf );
InsertDisk( (UBYTE *)&buf, number - 1 );
GetUaeConfig( &config );
} else {
printf(" Illegal drive, not changed.\n");
}
break;
case 10:
quit = 1;
break;
}
}
quit_program(0, "");
return(0);
}
/******************************************
* Prints drive status *
******************************************/
void print_drive_status(void)
{
printf(" DF0 : %s\n", config.disk_in_df0 ? config.df0_name : "EMPTY");
printf(" DF1 : %s\n", config.disk_in_df1 ? config.df1_name : "EMPTY");
printf(" DF2 : %s\n", config.disk_in_df2 ? config.df2_name : "EMPTY");
printf(" DF3 : %s\n", config.disk_in_df3 ? config.df3_name : "EMPTY");
}
/******************************************
* Quits the program *
******************************************/
void quit_program(int error, char *text)
{
if (error > 0) {
printf(" UAE-Control v0.1\n");
printf(" (c)1996 Tauno Taipaleenmaki\n\n");
printf(" ERROR: %s\n", text);
}
}
#!/bin/sh
echo .
echo .
echo Please Wait..
echo .
aclocal -I m4 \
&& automake --foreign --add-missing \
&& autoconf
echo ..almost over..
echo .
cd src/tools
aclocal
autoconf
echo Done. Thank you.
echo .
./bootstrap.sh
./configure --with-sdl --with-sdl-gl --with-sdl-gfx --with-sdl-sound --with-caps --with-gayle --enable-drvsnd --enable-amax --enable-cd32 --enable-scsi-device
make clean
make
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Networking
==========
The Amiga environment running within UAE may share the host machine's
network access via an emulation of the bsdsocket.library (this library
provides the standard Amiga networking API). This isn't supported on
all target platforms yet, but it should work on Linux, Unix and
Mac OS X.
The emulation of the bsdsocket.library API is not complete, but should
be sufficient to allow you to use most popular AmigaOS network
clients, such as web browsers and mail readers.
To enable the bsdsocket.library emulation (assuming you are using a
version of E-UAE with this feature compiled in), add the option
bsdsocket_emu=true
to your config file.
Note that you do not need to install any real Amiga network stack - such
as AmiTCP or Miami - to be able to use the bsdsocket emulation.
Also note that when using the bsdsocket.library emulation that your
AmigaOS environment will use the same IP address as the host platform.
This may limit the types of networking software you can run in the
emulated Amiga environment. For example, Amiga software will not be
able to bind to ports already in use by host software, and your host
operating system may impose access controls on certain ranges of ports.
Older versions of E-UAE required that a bsdsocket.library wrapper file
be installed somewhere in the LIBS: path in your Amiga environment.
This is no longer the case, and this file should now be removed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Floppy drive emulation
======================
E-UAE emulates up to four floppy drives. Standard PC floppy drives cannot
read Amiga floppies, so floppy disks are currently supported as image files
(support for Catweasel hardware, a floppy controller which can read Amiga
floppies - and other unusual disk formats - will be added in a future
version).
E-UAE supports a number of floppy image formats, optionally compressed by
gzip or packed inside a Zip archive.
ADF
---
The classic floppy image format for UAE, a plain raw image of the disk's
formatted contents.
DMS
---
DMS was a popular disk image cruncher. E-UAE can transparently read DMS
images.
FDI
---
FDI is a floppy image format used by the Disk2FDI tool. See
http://www.oldskool.org/disk2fdi.
IPF
---
IPF is the floppy image format employed by the CAPS project (see
http://caps-project.org/). A suitable plug-in, downloadble from the CAPS web
site, must be installed on the host system to allow IPF images to be used.
(At the time of writing, the plug-in is available for only x86 and PPC Linux
hosts and AmigaOS hosts.)
Creating blank ADF images
=========================
On Unix-like platforms, a blank floppy image can be created as follows. To
create a standard 3.5" DD image, use:
dd if=/dev/zero of=blank.adf count=1760
To create a 3.5" HD image, use:
dd if=/dev/zero of=blank.adf count=3520
This diff is collapsed.
This diff is collapsed.
make_hdf
========
make_hdf is a command-line tool for creating unformatted hard disk
images (hard files) for E-UAE (and other versions of UAE). It will
also print a config option that can be added to a UAE config file to
mount the created disk image.
Usage
-----
make_hdf accepts the following parameters:
make_hdf <path> <size> [<device>]
<path> The path to the file to create. Note that any directories
included in this path must already exist; make_hdf will not
create them for you.
<size> The size of the hard disk image to create in MB. Add a trailing
'G' to the size to specify a size in GB or a 'K' for a size
in KB.
<device> Device name to be included in the generated config option.
This is optional and defaults to DH0: if omitted.
Example
-------
> make_hdf hdf/my_disk.hdf 2G DH5:
Will generate a 1 GB disk as the file 'hdf/my_disk.hdf' and the
following config options are output (see configuration.txt).
hardfile2=rw,DH5:hdf/my_disk.hdf,32,2,2,512,0,
hardfile=rw,32,2,2,512,hdf/my_disk.hdf
Limits
------
On systems that do not support large files sizes (i.e, systems without
support for 64-bit file sizes), make_hdf is limited to creating hard
files up to 2GB in size.
On systems that do support large file sizes, make_hdf can create hard
files up to around 2TB in size (whether you can make use of disks that
in AmigaOS is another question).
Sparse files
------------
Where supported (e.g., Linux, MacOS X), make_hdf will create sparse
files. This allows hard disk images which are not full to take up less
space on disk.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
AM_CPPFLAGS = @UAE_CPPFLAGS@
AM_CPPFLAGS += -I$(top_srcdir)/src/include -I$(top_builddir)/src -I$(top_srcdir)/src
AM_CFLAGS = @UAE_CFLAGS@
noinst_LIBRARIES = libcaps.a
libcaps_a_SOURCES = caps.c
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
AM_CPPFLAGS = @UAE_CPPFLAGS@
AM_CPPFLAGS += -I$(top_srcdir)/src/include -I$(top_builddir)/src -I$(top_srcdir)/src
AM_CFLAGS = @UAE_CFLAGS@
noinst_LIBRARIES = libdms.a
libdms_a_SOURCES = crc_csum.c getbits.c maketbl.c pfile.c tables.c \
u_deep.c u_heavy.c u_init.c u_medium.c u_quick.c \
u_rle.c
noinst_HEADERS = cdata.h crc_csum.h getbits.h maketbl.h pfile.h tables.h \
u_deep.h u_heavy.h u_init.h u_medium.h u_quick.h u_rle.h
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment