[comp.sources.amiga] v89i140: c64 - commodore 64 emulator spoof

page%swap@Sun.COM (Bob Page) (05/17/89)

Submitted-by: ecarroll@vax1.tcd.ie (Eddy Carroll)
Posting-number: Volume 89, Issue 140
Archive-name: fun/c64.1

This "C64 Emulator" was written for April Fools day of 1988. It's
designed to let you fool your friends (however briefly) into thinking
your Amiga is a C64.

[uuencoded executable included.  ..bob]

# This is a shell archive.
# Remove anything above and including the cut line.
# Then run the rest of the file through 'sh'.
# Unpacked files will be owned by you and have default permissions.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: SHell ARchive
# Run the following text through 'sh' to create:
#	README
#	makefile
#	commands.c
#	main.c
#	screen.c
#	commands.h
#	screen.h
#	C64.info.uu
#	C64.uu
# This is archive 1 of a 1-part kit.
# This archive created: Wed May 17 20:22:17 1989
echo "extracting README"
sed 's/^X//' << \SHAR_EOF > README
X
X			   =========================
X                            C 6 4   E M U L A T O R
X			   =========================
X
XThis "C64 Emulator" was written for April Fools day of 1988. It's designed
Xto let you fool your friends (however briefly) into thinking your Amiga is
Xa C64. I had quite a bit of fun with this at that time, because I have
Xboth a C64 and Amiga, and I've also written a fairly good "Amiga ball"
Xdemonstration for the C64. With both of them running at the same time,
Xpeople get very confused :-)
X
XAnyway, load the program by typing C64 from the CLI or click on the icon
Xfrom workbench. Once loaded, you are presented with the C64 startup screen,
Xand you can type in commands. The C64's usual editing facilities are
Xavailable: The cursor keys move the cursor, F10 homes the cursor, F20 clears
Xthe screen and DEL inserts characters at the current cursor position. All
Xthe other function keys are mapped to some of the commands available.
X
XThe emulator knows about quite a few of the standard C64 commands - try
Xout your favourites.
X
XModifying the commands and error messages merely requires you to edit
Xthe commands.c file appropriately, and recompile.
X
XEddy Carroll
Xecarroll@cs.tcd.ie
SHAR_EOF
echo "extracting makefile"
sed 's/^X//' << \SHAR_EOF > makefile
X#
X# Aztec Make makefile, for Lattice C V4.0 :-)
X#
X# Commodore 64 spoof Emulator, April 1988
X#
X
XOBJS   = main.o commands.o screen.o
X#
X#
X#
X.c.o:
X	lc -s -v $*.c
X#
X#
X#
Xall: c64
X
Xc64: $(OBJS)
X    blink from lib:c.o $(OBJS) to C64 sc sd nd map ram:map \
X		  lib lib:lc.lib lib:amiga.lib
X
Xmain.o:	main.c screen.h commands.h
Xscreen.o: screen.c screen.h
Xcommands.o: commands.c commands.h
SHAR_EOF
echo "extracting commands.c"
sed 's/^X//' << \SHAR_EOF > commands.c
X/*
X *		Commodore 64 Spoof Emulator (C) Eddy Carroll, 1st April 1988
X *
X * Module: COMMANDS.C
X *
X * Contains definitions for the commands, error messages, and standard
X * prompts used in the emulator. To change the messages, only this module
X * need be recompiled.
X *
X */
X
X#include <exec/types.h>
X#include "commands.h"
X
X/* 
X * List of commands and standard responses. Each record stores a command
X * name, it's length, and a "response" message for that command.
X * Note: The first entry corresponds to a line number being entered.
X *
X */
X
Xstruct commandlist command[] = {
X
X{NULL,		4, 0,
X{"Hmmm...a would-be programmer, eh?\r",
X "In fact, this emulator doesn't\ractually emulate PROGRAMS.\r",
X NULL
X}},
X{"GO AMIGA",4,0,
X{"Ah - very good! If you can have GO 64\ron a C128, why not GO AMIGA\r",
X"Nah...that won't work\r",
XNULL
X}},
X{"LIST",	4, 0,
X{"3 Bags Flour\r6 Doz Eggs\r1 Loaf Bread\r",
X "1 3.5\42 Disk Drive\r1 Colour Monitor\r1 Amiga 500\r",
X NULL
X}},
X{"LOAD\42$\42",	7,	0,
X{"You want a directory? Try a phone\rbook instead.\r",
X"Sorry - I don't feel up to disk access\rjust at the moment. In fact, \
XI'm feelingrather depressed if you must know.\rBrain the size of a \
Xplanet, and what\rdo people do - try and get a\rDIRECTORY. I don't know \
Xwhat the\rworld is coming too...\r",
X"Look, if you try that ONCE more I'll\rbe very cross\r"
X}},
X{"LOAD",	4, 0,
X{"Erm...I'm afraid that this emulation\rdoesn't emulate the LOAD command.\r",
X "And just how do you expect me to\raccomplish that on an Amiga?\r",
X"Ok, I'LL load a program when YOU show\rme where you've plugged in the 1541\r"
X}},
X{"RUN",		3, 0,
X{"Oh God, not another one of these\rkeep-fit addicts.\r",
X"Can't - my ankle's twisted!\r",
X NULL
X}},
X{"SAVE",	4, 0,
X{"Yes! Yes! Yes! With the E.B.S.\r",
X"Only Jesus can do that.\r",
XNULL
X}},
X{"CLOSE",	5, 0,
X{"Hmm ... another Public holiday?\r",
X"Shut up, yourself!\r",
XNULL
X}},
X{"CLR",		3, 0,
X{"... as clear as mud, I reckon.\r",
X"Okay, I'm thinking clearly now.\rEverything makes perfect sense\r\
XDaisy, where are you now?\r",
X"Pardon?\r"
X}},
X{"CONT",	4, 0,
X{"Won't continue error\r",
X"Same to you with knobs on!\r",
XNULL
X}},
X{"DATA",	4, 0,
X{"Blind data error.\r",
X"You like Police records, then?\r",
XNULL
X}},
X{"DIM",		3, 0,
X{"I am not!\r",
X"It's dark enough, thanks.\r",
X"Okay, put on the specs, it's in\r3-d from now on.\r"
X}},
X{"END",		3, 0,
X{".. of the universe ?\r",
X"Okay, I'm finished working.\r",
XNULL
X}},
X{"GET",		3, 0,
X{"I'm not getting anymore messages\rfor you.\r",
X"I got that yesterday!\r",
X"I never get that kind of joke.\r"
X}},
X{"GOSUB",	5, 0,
X{"Into submarines, are we?\r",
X"Okay, but I won't return.\r",
X"No! Use procedures.\r"
X}},
X{"GO",		2, 0,
X{"I'm fed up going here, going there\rand never a word of thanks.\r",
X"Now where?\r",
X"I've already been there - it's very\rboring.\r"
X}},
X{"IF",		2, 0,
X{"No 'ifs', be sure!\r",
X"If I were a rich man...\r",
XNULL
X}},
X{"INPUT",	5, 0,
X{"Ask whatever you want, I'm not\rtelling.\r",
X"You'll have to ask someone else.\r",
XNULL
X}},
X{"LET",		3, 0,
X{"Let bygones be bygones.\r",
X"Let it be.\r",
X"This computer is not to let.\r"
X}},
X{"NEW",		4, 0,
X{"Okay, I'm brand new.\r",
X"No news today .. sorry!\r",
XNULL
X}},
X{"STOP",	4, 0,
X{"Arrggghhh .. can't stop now.\r",
X"Sccrreeeeech ....\r",
X"Bl@@dy lollipop person!\r"
X}}
X
X
X
X
X};
X
Xint MAXCOMMANDS = 19;
X
X/*
X * Now come the error messages, these are printed out whenever the
X * emulator is given a command it doesn't recognise.
X *
X */
X
Xchar *errormsg[] = {
X
X"?Too many fingers on keyboard error\r",
X"?String too tangled error\r",
X"?Formula too boring error\r",
X"?Novice programmer error\r",
X"?Computer too busy error\r",
X"?Atari Owner in vicinity error\r",
X"?Command too trivial error\r",
X"?Hardware malfunction error\r",
X"?No silver lining on cloud error\r",
X"?Year not a leap year error\r",
X"?Hyper-space misdirection error\r",
X"?Memory empty error\r",
X"?No bits to bite error\r",
X"?Commodore 64 incompatibility error\r",
X"?Invalid lexical indicator error\r",
X"?4th dimensional error\r",
X"?Nth dimensional error\r",
X"?Out of this world error\r",
X"?Too many users on system error\r",
X"?Too many characters on screen error\r",
X};
X
Xint MAXERRORS = 20;
X
X/*
X * Now come a few standard messages.
X *
X */
X
Xchar *STARTUP =
X"\r    **** Commodore 64 Basic V2 ****\r\r\
X 64K Ram System  38911 Basic Bytes Free\r\r";
X
Xchar *ABOUT =
X"\r     *** Commodore 64 Emulator ***\r\r\
X    by Eddy Carroll 1st April 1988\r\r";
X
Xchar *READY =
X"Ready.\r";
SHAR_EOF
echo "extracting main.c"
sed 's/^X//' << \SHAR_EOF > main.c
X/*
X *		Commodore 64 Spoof Emulator (C) Eddy Carroll, 1st April 1988
X *
X * Module: MAIN.C
X *
X * This module is the mainline - it handles the input loop and command
X * interpretation logic.
X *
X */
X
X#include <exec/types.h>
X#include <exec/io.h>
X#include <intuition/intuition.h>
X#include <proto/exec.h>
X#include <proto/intuition.h>
X#include <proto/graphics.h>
X#include "screen.h"
X#include "commands.h"
X
X#define DEL '\177'
X/* 
X *  Defining the following functions here stops them from being pulled into
X *  the program from the Lattice library when we link.
X */
X
Xint chkabort() {return(0);}
Xvoid MemCleanup() {}
X
X/*
X *	Global references
X */
X
Xextern struct Menu mymenus;
Xextern struct IntuiText mytext[];
X
Xextern struct commandlist command[];	/* Commands & Responses */
Xextern char *errormsg[];				/* List of error msgs	*/
Xextern int  MAXCOMMANDS;				/* Number of commands	*/
Xextern int  MAXERRORS;					/* Number of messages	*/
Xextern char *STARTUP;					/* Startup message		*/
Xextern char *ABOUT;						/* "About..." message	*/
Xextern char *READY;						/* Ready prompt			*/
X
X/*
X * Executes one of the menu commands
X *
X */
X
Xvoid domenu(opt)
Xint opt;
X{
X	CURSOROFF;
X
X	switch (opt) {
X
X	case M_ABOUT:
X		clearscreen();
X		if (titlebar) printchar('\r'); /* Skip past title bar if on */
X		printmess(ABOUT);
X		printmess(READY);
X		break;
X
X	case M_TITLE:
X		titlebar = !titlebar;
X		ClearMenuStrip(mywin);
X		mytext[1].IText = titlebar ? " Hide Title" : " Show Title";
X		SetMenuStrip(mywin,&mymenus);
X		ShowTitle(myscreen, titlebar);
X		break;
X
X	case M_QUIT:
X		cleanup(0);
X		break;
X
X	}
X}
X
X/*
X * Returns a random number in range 0..range-1.
X *
X */
X
Xint random(range)
Xint range;
X{
X	LONG seconds,micros;
X	CurrentTime(&seconds,&micros);
X	return (micros % range);
X}
X
X
X/*
X * Reads current line from screen into string, stripping off any extra
X * leading or trailing spaces.
X *
X */
X
Xvoid getcommand(s)
Xchar *s;
X{
X	int i = 0, j = 39;
X	char *p; 
X	p = screen[cursory];
X	while (p[i] == ' ' && i < 40)
X		i++;
X	if (i == 40) {
X		*s = '\0';
X		return;
X	} 
X
X	while (p[j] == ' ')
X		j--;
X	while (i <= j) {
X		*s++ = toupper(p[i]);
X		i++;
X	}
X	*s = '\0';
X}
X
X
X/*
X * Returns TRUE if the first n chars of the two strings are equal, else
X * returns FALSE
X *
X */
X
Xint match(s1,s2,n)
Xchar *s1,*s2;
Xint n;
X{
X	while (*s1++ == *s2++ && n)
X		n--;
X	return (!n);
X}
X
X
X/*
X * Initialises error messages to be in random order.
X *
X */
X
Xvoid initerror()
X{
X	int i, x, y;
X	char *p;
X
X	for (i = 0; i < MAXERRORS; i++) {
X		x = random(MAXERRORS);
X		y = MAXERRORS - 1 - random(MAXERRORS);
X		p = errormsg[x];
X		errormsg[x] = errormsg[y];
X		errormsg[y] = p;
X	}
X}
X
X
X/*
X * Prints a suitable response for command in string s. If a match is found
X * in the command list, then a reponse appropriate to that command is
X * printed, else one of the standard error messages is printed.
X *
X */
X
Xvoid docommand(s)
Xchar *s;
X{
X	static int curerr = 0;
X	int i = 1, k = -1, x, y;
X	char *p;
X	struct commandlist *com;
X
X	if (*s >= '0' && *s <= '9')
X		k = 0;
X	else {
X		while (i < MAXCOMMANDS && k < 0) {
X			if (match(command[i].asc,s,command[i].len))
X				k = i; 
X			i++;
X		}
X	}
X
X	printchar('\r');
X	if (k >= 0) {
X		com = &command[k];
X		do {
X			com->num++;
X
X			/* If we have printed all three messages once each, re-arrange	*/
X			/* the order of them before we print them again to make it		*/
X			/* seem random.													*/
X
X			if (com->num >= MAXRESPONSE) {
X				com->num = 0;
X				x = random(MAXRESPONSE); y = random(MAXRESPONSE);
X				p = com->response[x];
X				com->response[x] = com->response[y];
X				com->response[y] = p;
X			}
X		} while ((p = com->response[com->num]) == NULL);
X		printmess(p);
X	} else {
X		printmess(errormsg[curerr]);
X		curerr++;
X		if (curerr >= MAXERRORS) {
X			curerr = 0;
X			initerror();
X		}
X	}
X
X	printmess(READY);
X}
X
X
X/*
X * Initialises the message headers to point to random messages
X *
X */
X
Xvoid initmess()
X{
X	int i;
X	for (i = 0; i < MAXCOMMANDS; i++)
X		command[i].num = random(3);
X}
X
X
X/*
X *  Returns code for function key n, where n = 0..20
X *  Returns 0 if no char equivalent. Also binds otherwise undefined
X *  function keys to common commands recognised.
X */
X
Xchar fkey(n)
Xint n;
X{
X	register char ch = 0;
X	switch (n) {
X
X	case 9:		ch = C_HOME;
X				break;
X	case 19:	ch = C_CLEAR;
X				break;
X	case 20: 	printmess("HELP");
X				break;
X	default:	if (n >= 0 & n <= 19)
X					printmess(command[n].asc);	/* Get command & print it */
X				break;
X	}
X	return (ch);
X}
X
X/*
X * Converts code (an escape character) into one of the internal codes
X * (or 0 if no corresponding code)
X *
X */
X
Xchar convert(ch)
Xchar ch;
X{
X	switch (ch) {
X
X	case 'A': ch = C_UP;		break;
X	case 'B': ch = C_DOWN;		break;
X	case 'C': ch = C_RIGHT;		break;
X	case 'D': ch = C_LEFT;		break;
X
X	default:  ch = 0;
X	}
X
X	return(ch);
X}
X
X/*
X * Mainline
X *
X */
X
Xvoid _main()
X{
X	LONG MenuNumber;
X	struct MenuItem *item;
X	register struct IntuiMessage *message;
X	register struct Message *conmessage;
X	int escape = 0;
X	LONG class;
X	USHORT code;
X	int time = 3, curstate = 0, fkeynum;
X	char s[50], ch;
X
X
X	titlebar = 0;	/* Initially hidden */
X	initscreen();
X	initmess();
X	initerror();
X	printmess(STARTUP);
X	printmess(READY);
X	CURSORON;
X
X
X	/* Main loop */
X
X#define INTUIBITS	(1 << mywin->UserPort->mp_SigBit)
X#define CONSOLEBITS	(1 << ConReadPort->mp_SigBit)
X
X	while (1) {
X
X		/* Reset message pointers, just in case 2nd part of conditional */
X		/* && isn't executed. */
X		message    = NULL;
X		conmessage = NULL;
X
X		while ((message = (struct IntuiMessage *)
X					GetMsg(mywin->UserPort)) == NULL &&
X				(conmessage = (struct Message *)
X					GetMsg(ConReadPort)) == NULL)
X			Wait ( INTUIBITS | CONSOLEBITS);
X
X
X		if (message) {		/* Got an IntuiMessage */
X			class = message->Class;
X			code = message->Code;
X			ReplyMsg((struct Message *)message);
X
X			switch (class) {
X
X			case MENUPICK:
X				MenuNumber = code;
X				while (MenuNumber != MENUNULL) {
X					item = (struct MenuItem *)ItemAddress(&mymenus,MenuNumber);
X					code = item->Command;
X					MenuNumber = item->NextSelect;
X				}
X				domenu(code);
X				break;
X
X			case INTUITICKS:
X				if (time == 0) {
X					curstate = 1 - curstate;
X					if (curstate)
X						CURSORON;
X					else
X						CURSOROFF;
X					time = 3;
X				} else --time;
X				break;
X
X			}
X		}
X
X		if (conmessage) {		/* Character from console */
X			ch = *constring;
X			/* Retrieve char, then line up request for next char */
X			QueueRead(ConReadReq,constring);
X			if (ch == CSI)
X				escape = 1, fkeynum = 0;
X			else {
X				if (escape) {
X					if (isdigit(ch))
X						fkeynum = fkeynum * 10 + ch - '0', ch = 0;
X					else if (ch == '?')
X						fkeynum = 20, ch = 0;
X					else if (ch == ' ')
X						escape = 2, ch = 0;
X					else {
X						escape = 0;
X						if (ch == '~')
X							ch = fkey(fkeynum);
X						else if (escape != 2)
X							ch = convert(ch);
X					}
X				}
X				CURSOROFF;
X				if (ch == '\r') {
X					getcommand(s);	/* Read command from screen */
X					printchar(ch);
X					if (*s)
X						docommand(s);
X				} else {
X					if (ch == DEL)		/* If delete key (Ascii #127)	*/
X						ch = C_INSERT;	/* Make it act as insert		*/
X					printchar(ch);
X				}
X				CURSORON;
X				time = 3;
X				curstate = 1;
X			}
X		}
X	}
X}
SHAR_EOF
echo "extracting screen.c"
sed 's/^X//' << \SHAR_EOF > screen.c
X/*
X *		Commodore 64 Spoof Emulator (C) Eddy Carroll, 1st April 1988
X *
X * Module: SCREEN.C
X *
X * This module contains the various screen handling routines used by
X * the emulator.
X *
X */
X
X#define  SCREEN
X
X#include <exec/types.h>
X#include <exec/io.h>
X#include <intuition/intuition.h>
X#include <proto/exec.h>
X#include <proto/graphics.h>
X#include <proto/intuition.h>
X#include "screen.h"
X
Xstruct RastPort *rp;
Xint openconsole = 0;
X
Xstruct NewScreen NewScreen = {
X	0,0,320,200,	/* Screen position & size 	*/
X	2,				/* 2 bitplanes = 4 colours 	*/
X	0,1,			/* Default text colours		*/
X	0,				/* Lores, non-interlace		*/
X	CUSTOMSCREEN,	/* Screen type				*/
X	0,				/* Use default font for now	*/
X	"C64 Emulator",	/* Screen title				*/
X	0,				/* No gadgets 				*/
X	0				/* No custom bitmap			*/
X};
X
X#define NORMALFLAGS WINDOWCLOSE | WINDOWSIZING | WINDOWDEPTH | WINDOWDRAG
Xstruct NewWindow NewWindow = {
X	0,0,320,200,  	/* Window position & Size	*/
X	0,1,			/* Default text colours		*/
X	MENUPICK      |	/* Ok, we want to know 		*/
X	INTUITICKS,		/* about menus & timings 	*/
X	BACKDROP      |	/* These four flags define	*/
X	BORDERLESS    |	/* the type of window we	*/
X	ACTIVATE      |	/* open. Here, we want an	*/
X	0       ,		/* "invisible" window.		*/
X	NULL,			/* No gadgets				*/
X	NULL,			/* Default menus check mark	*/
X	NULL,          	/* No window title			*/
X	NULL,			/* Will point to our screen	*/
X	NULL,			/* No special bitmap used	*/
X	0,0,320,200,	/* No resizing so not used  */
X	CUSTOMSCREEN 	/* Open this on OUR screen	*/
X};
X
XUWORD blackcol[4] = {	/* All black array for initial screen   */
X	0,0,0,0};
X
XUWORD screencol[4] = {	/* Default colours for custom screen	*/
X	0x077E,				/* Colour 0 = Light blue				*/
X	0x0EEE,				/* Colour 1 = White    					*/
X	0x077E,				/* Colour 2 = Lighter blue				*/
X	0x011C 				/* Colour 3 = Dark Blue					*/
X};
X
Xstruct IntuiText mytext[] = {
X/*  Pens   Mode   Pos   Font    Text                       Next */
X{   0,1,   JAM1,  0,0,  NULL,   (UBYTE *)" About...",       NULL},
X{   0,1,   JAM1,  0,0,  NULL,   (UBYTE *)" Show Title",     NULL},
X{   0,1,   JAM1,  0,0,  NULL,   (UBYTE *)" Quit",           NULL}};
X
X
X
X#define MENUFLAGS ITEMTEXT | ITEMENABLED | HIGHCOMP
X#define IDATA(off,str,key) 0,off,110,9,MENUFLAGS,0,str,NULL,key,NULL,NULL
X
Xstruct MenuItem myitems[] = {
X{ &myitems[1],  IDATA( 0, (APTR)&mytext[0],  M_ABOUT)  },
X{ &myitems[2],  IDATA(10, (APTR)&mytext[1],  M_TITLE)  },
X{ NULL,         IDATA(20, (APTR)&mytext[2],  M_QUIT )  }};
X
Xstruct Menu mymenus = {NULL, 0,0,100,10, MENUENABLED, "Project", myitems};
X
X
X/* 
X * Free all resources allocated in this module
X *
X */
X
Xvoid cleanup(err)
Xint err;
X{
X	if (openconsole)
X		CloseDevice(ConReadReq);
X
X	if (ConReadReq)
X		DeleteStdIO(ConReadReq);
X
X	if (ConReadPort)
X		DeletePort(ConReadPort);
X
X	if (mywin) {
X		ClearMenuStrip(mywin);
X		CloseWindow(mywin);
X	}
X	if (myscreen)
X		CloseScreen(myscreen);
X
X	if (IntuitionBase)
X		CloseLibrary(IntuitionBase);
X
X	if (GfxBase)
X		CloseLibrary(GfxBase);
X
X	exit(err);
X}
X
X
X
X/* 
X * Clears the screen
X *
X */
X
Xvoid clearscreen()
X{
X	register char *p;
X	register int i;
X	SetRast(rp,3);
X	for (p = (char *)screen, i = 1000; i--; *p++ = ' ')
X		;
X	cursorx = 0;
X	cursory = 0;
X}
X
X
X/* 
X * Tells console device we want to read a character from keyboard
X *
X */
X
Xvoid QueueRead(request,whereto)
Xstruct IOStdReq *request;
Xchar *whereto;
X{
X	request->io_Command	= CMD_READ;
X	request->io_Data	= (APTR)whereto;
X	request->io_Length	= 1;
X	SendIO(request);
X}
X
X/*  
X * Initialises the screen, character set, colours etc. Exits program with
X * error code if an error occurs.
X *
X */
X
Xvoid initscreen()
X{
X	if (!mywin) {
X		if ((IntuitionBase = 
X			(struct IntuitionBase *)OpenLibrary("intuition.library",0)) == 0)
X			cleanup(1);
X
X		if ((GfxBase =
X			(struct GfxBase *)OpenLibrary("graphics.library",0)) == 0)
X			cleanup(2);
X
X		if ((myscreen = (struct Screen *)OpenScreen(&NewScreen)) == 0)
X			cleanup(3);
X
X		LoadRGB4(&(myscreen->ViewPort),blackcol,4); 
X		ShowTitle(myscreen,0);
X		NewWindow.Screen = myscreen;
X
X		if ((mywin =  (struct Window *)OpenWindow(&NewWindow)) == 0)
X			cleanup(4);
X
X		SetMenuStrip(mywin, &mymenus);
X		rp = mywin->RPort;
X
X		/* Initialise communication ports for Console */
X
X		if ((ConReadPort = CreatePort(0,0)) == NULL)
X			cleanup(5);
X
X		if ((ConReadReq = CreateStdIO(ConReadPort)) == NULL)
X			cleanup(6);
X
X		ConReadReq->io_Data = (APTR)mywin;
X		ConReadReq->io_Length = sizeof(*mywin);
X
X		/* Open console and tell it to turn off the cursor */
X		if (OpenDevice("console.device",0,ConReadReq,0))
X			cleanup(7);
X		openconsole = 1;
X
X		/* Tell console to get first character ready for us */
X		QueueRead(ConReadReq,constring);
X
X		SetAPen(rp,2);	/* Set primary colour */
X		SetBPen(rp,3);	/* Set secondary colour */
X		clearscreen();	/* Fill screen to raster colour */
X		LoadRGB4(&(myscreen->ViewPort),screencol,4); 
X
X	}
X}
X
X
X/*
X * Outputs a character to the screen at co-ordinates x,y. If mode is 0,
X * then output normal character, else output reverse character.
X *
X */
X
Xvoid writechar(x,y,ch,mode)
Xint x,y;
Xchar ch;
Xint mode;
X{
X	char s[2];
X	s[0] = ch;
X	Move(rp,x * 8, y * 8 + 6); /* Quick multiply by 8 */
X	if (mode) {
X		SetDrMd(rp,INVERSVID|JAM2);
X		Text(rp,s,1);
X		SetDrMd(rp,          JAM2);
X	} else
X		Text(rp,s,1);
X}
X
X/* 
X * Scrolls the screen up one line. Both the visible rastport screen, 
X * and the internal screen are scrolled.
X *
X */
X
Xvoid scrollup()
X{
X	register char *p, *q;
X	register int i;
X
X	ScrollRaster(rp,0,8,0,0,319,199);
X	for (p = (char *)screen,q = (char *)screen+40, i = 960; i--; *p++ = *q++)
X		;
X	for (i = 40; i--; *p++ = ' ')
X		;
X	cursory--;
X
X}
X
X
X
X/*
X * Handles special characters like CR, cursor keys etc.
X *
X */
X
Xvoid special(ch)
Xchar ch;
X{
X	register char *p, *q;
X	register int i,j;
X
X	switch (ch) {
X
X	case C_CR: /* Carriage Return */
X		cursorx = 0;
X		cursory++;
X		if (cursory >= 25)
X			scrollup();
X		break;
X
X	case C_UP: /* Cursor Up */
X		if (cursory)
X			cursory--;
X		break;
X
X	case C_DOWN: /* Cursor Down */
X		cursory++;
X		if (cursory >= 25)
X			scrollup();
X		break;
X
X	case C_LEFT: /* Cursor Left */
X		if (cursorx == 0) {
X			if (cursory) {
X				cursorx = 39;
X				cursory--;
X			}
X		} else
X			cursorx--;
X		break;
X
X	case C_RIGHT: /* Cursor Right */
X		cursorx++;
X		if (cursorx >= 40) {
X			cursorx = 0;
X			cursory++;
X			if (cursory >= 25)
X				scrollup();
X		}
X		break;
X
X	case C_DEL: /* Delete */
X		if (cursorx == 0) {
X			if (cursory) {
X				cursorx = 39;
X				cursory--;
X				screen[cursory][cursorx] = ' ';
X				writechar(cursorx,cursory,' ',0);
X			}
X		} else {
X			ScrollRaster(rp,8,0,cursorx*8,cursory*8,319,cursory*8+7);
X			/* Move chars from here to end of line back one space */
X			for (q = &(screen[cursory][cursorx]),
X						p = q - 1, i = 40 - cursorx;
X						i--;
X						*p++ = *q++)
X						;
X			*p = ' ';
X			cursorx--;
X		}
X		break;
X
X	case C_INSERT: /* Insert */
X		if (screen[cursory][39] == ' ' && cursorx < 39) {
X			ScrollRaster(rp,-8,0,cursorx*8,cursory*8,319,cursory*8+7);
X			for (p = &screen[cursory][39], q = p - 1, i = 39 - cursorx;
X					i--; *p-- = *q--)
X						;
X			*p = ' ';
X		}
X		break;
X
X	case C_CLEAR: /* Clear screen */
X		clearscreen();
X		break;
X
X	case C_HOME: /* Home cursor */
X		cursorx = 0;
X		cursory = 0;
X		break;
X
X	case C_REDRAW: /* Redraw entire screen */
X		for (i = 0; i < 25; i++)
X			for (j = 0; j < 40; j++)
X				writechar(j,i,screen[i][j],0);
X		break;
X
X	}
X}
X
X
X
X/*
X * Outputs character to screen at current cursor position, and advances
X * cursor to next position. Scrolls screen if necessary.
X *
X */
X
Xvoid printchar(ch)
Xchar ch;
X{
X	if (ch < ' ')
X		special(ch);
X	else {
X		writechar(cursorx,cursory,ch,0);
X		screen[cursory][cursorx] = ch;
X		cursorx++;
X		if (cursorx >= 40) {
X			cursorx = 0;
X			cursory++;
X			if (cursory >= 25)
X				scrollup();
X		}
X	}
X}
X
X
X/* 
X * Outputs string to screen at current cursor position
X *
X */
X
Xvoid printmess(s)
Xchar *s;
X{
X	while (*s)
X		printchar(*s++);
X}
SHAR_EOF
echo "extracting commands.h"
sed 's/^X//' << \SHAR_EOF > commands.h
X/*
X *		Commodore 64 Spoof Emulator (C) Eddy Carroll, 1st April 1988
X *
X * Module: COMMANDS.H
X *
X * This module defines the structure used to contain commands and 
X * the responses to those commands.
X *
X */
X
X#define MAXRESPONSE 3
X
Xstruct commandlist {
X	char *asc;			/* Pointer to command name (in uppercase)		*/
X	int len;			/* Length of command name (speeds up matching)	*/
X	int num;			/* Number of message to be printed next			*/
X	char *response[MAXRESPONSE];	/* The message to print in response	*/
X};
SHAR_EOF
echo "extracting screen.h"
sed 's/^X//' << \SHAR_EOF > screen.h
X/*
X *		Commodore 64 Spoof Emulator (C) Eddy Carroll, 1st April 1988
X *
X * Module: SCREEN.H
X *
X * This module contains standard definitions for all modules
X * the emulator.
X *
X */
X
X/* Control character representations */
X#define C_CR		'\r'	/* Must be real */
X#define C_UP		'\01'
X#define C_DOWN		'\02'
X#define C_LEFT		'\03'
X#define C_RIGHT		'\04'
X#define C_HOME		'\05'
X#define C_INSERT	'\06'
X#define C_CLEAR		'\07'
X#define C_DEL		'\010'	/* Must be real */
X#define C_REDRAW	'\014'	/* Control-L	*/
X
X#define CSI			'\233'
X
X/* Menu keys */
X#define M_ABOUT 1
X#define M_TITLE 2
X#define M_QUIT  3
X
X/* For enabling/disabling cursor */
X#define CURSORON  writechar(cursorx,cursory,screen[cursory][cursorx],1)
X#define CURSOROFF writechar(cursorx,cursory,screen[cursory][cursorx],0)
X
X#ifndef SCREEN
X#define GLOB extern
X#endif
X#ifdef SCREEN
X#define GLOB
X#endif
X
X/*
X * Global Variables
X *
X */
X
XGLOB int cursorx, cursory;		/* Position of cursor on screen */
XGLOB int titlebar;				/* Start off with titlebar off  */
XGLOB char screen[25][40];		/* Stores characters for screen */
XGLOB struct Screen *myscreen;
XGLOB struct Window *mywin;
XGLOB struct IntuitionBase *IntuitionBase;
XGLOB struct GfxBase *GfxBase;
XGLOB char constring[5];			/* For reads from console 		*/
XGLOB struct IOStdReq *ConReadReq;
XGLOB struct MsgPort *ConReadPort;
X
Xextern struct MsgPort *CreatePort();
Xextern struct IOStdReq *CreateStdIO();
Xextern void DeletePort(),DeleteStdIO();
SHAR_EOF
echo "extracting C64.info.uu"
sed 's/^X//' << \SHAR_EOF > C64.info.uu
X
Xbegin 644 C64.info
XMXQ```0``````*``0`#,`'@`&``,``0`!)G```2LP````````````````````Z
XM`````TP``%X@``"I@````#L````%```````````````````````S`!T``@`"*
XM;3@#``````````````````````````````?___P`````"````@`````3___Y]
XM`````!/___D`````$P``&0`````3=O>9`````!,``!D`````$V``&0`````3:
XM```9`````!,``!D`````$P``&0`````3```9`````!,``!D`````$___^0``3
XM```3___Y``````@```(`````!____````````````````!____\`````?,S,%
XMS,````'9F9F9\```!S,S,S,\```?______\`````````````````````````*
XM``````````````````````````````````````````````````````?___P`!
XM````#____@`````/___^``````\``!X`````#P``'@`````/```>``````\`L
XM`!X`````#P``'@`````/```>``````\``!X`````#P``'@`````/```>````_
XM``____X`````#____@`````'___\````````````````````````````````7
XM``````____\`````/____X````#_____X``````````````?______\```__,
XM_____@``````````````````````````````,P`=``(``X+P`P``````````%
XM```````````````````'___\``````@```(`````$````0`````0'P\!````;
XM`!`P&8$`````$#<9@0`````0,QF!`````!`>#P$`````$````0`````0/QF!0
XM`````!`P&8$`````$#\?@0`````0,P&!`````!`_`8$`````$````0`````(X
XM```"``````?___P````````````````?____`````'S,S,S````!V9F9F?``4
XM``<S,S,S/```'_______````````````````````````````````````````I
XM```````````````````````````````````````'___\``````P```8`````3
XM#!\/!@`````,,!F&``````PW&88`````##,9A@`````,'@\&``````P```8`L
XM````##\9A@`````,,!F&``````P_'X8`````##,!A@`````,/P&&``````P`9
XM``8`````!____``````````````````````````````````````/____````3
XM`#____^`````_____^``````````````'_______```/______X`````````[
X>```````````````````!``````P````!``````$`/
X``
Xend
Xsize 1065
SHAR_EOF
echo "extracting C64.uu"
sed 's/^X//' << \SHAR_EOF > C64.uu
X
Xbegin 644 C64
XM```#\P`````````"``````````$```7.```%80```^D```7.2.=^_DOO`#0DN
XM2"0`2?D`````+'@`!"E.`$`I3P!,0JP`2)/)3J[^VB9`*6L`F``X2JL`K&<`)
XM`'`@#9"M``0&@````(`I0``$80`!>B!K`*S1R-'((F@`$-/)T\D@`G(`$ADI0
XM20!4T(%2@$)G4H`"0/_^G\!5@$)W"``@`E.`U($?L@``(`!3@E'(__8?O``@(
XM(`!3@A^Q(``@`%'*__@B3R\)8```;"EK`#H`!`:L````@``$80`!#F$``/@I&
XM0`!(+P`D0"`J`"1G$BQL$"`@0"(H```I00`X3J[_@B(J`"!G&B0\```#[4ZN,
XM_^(I0`!09PKEB"!`)V@`"`"D(&P`2"\(2&P``"!H`"0I:``$`%1'^0``$"QR5
XM`"`\```!5F`")L%1R/_\3KH%?'``8`0@+P`$+P`@+``L9P0@0$Z03KH`G"QX8
XM``0B;!`@3J[^8DJL$"1G"")L$"1.KOYB2JP0*&<((FP0*$ZN_F)*K`!89P@BS
XM;`!83J[^8DJL`$AG)"(L`#QG!$ZN_]PB+`!09P1.KO_<+'@`!$ZN_WPB;`!(*
XM3J[^AB`?+FP`3$S??WY.=7!D8(!!ZP!<3J[^@$'K`%Q.KOZ,3G5#[`!<<`!.@
XMKOW8*4`0(&?:3G4``'``3G5.=4Y5``!(YP`"("P0,'(H3KH1ED'L$#C1P"`L1
XM$"S1P!(02(%(P4*G+P$O+!`P+P!.N@K.3^\`$"`M``@,@`````-G``"0#(``Y
XM```"9S0,@`````%F``"&3KH(@DJL$#1G"DAX``U.N@XJ6$\O+`X43KH.EEA/7
XM+RP.($ZZ#HQ83V!:2JP0-%?`1`!(@$C`*4`0-"!L%"0L;!0H3J[_RDJL$#1G<
XM!D'L`&A@!$'L`'0I2`[2(&P4)$/L#UPL;!0H3J[^^"!L%"`@+!`T+&P4*$ZNU
XM_N9@"$*G3KH'9%A/3-]``$Y=3G5.5?_X2.<``D'M__Q#[?_X+&P4*$ZN_ZP@>
XM+?_X(BT`"$ZZ#]X@`4S?0`!.74YU3E7_\$CG(`!"K?_\<"<K0/_X("P0,'(H4
XM3KH0?$'L$#C1P"M(__0@;?_T(BW__!`P&``,```@9@X,@0```"AL!E*M__Q@#
XMX`RM````*/_\9@@@;0`(0A!@5"!M__0B+?_X$#`8``P``"!F!E.M__A@Z"(M)
XM__RRK?_X;BP@;0`(4JT`"")M__00,1@`2(!(P"\`+T@`"$ZZ#K183R!O``00T
XM@%*M__Q@RB!M``A"$$S?``1.74YU3E4``$CG(``@;0`($!!2K0`((&T`#!(01
XM4JT`#+`!9@Q*K0`09P93K0`08-Q*K0`05\!$`$B`2,!,WP`$3EU.=4Y5__!(7
XMYR`P0JW__"(L#7(D+?_\M(%L3B\!80#^PEA/+RP-<BM`__AA`/ZT6$\B+`URD
XMDH!3@2`M__CE@$'L#2(B2-/`)%$B2-/`(`'E@"9(U\`BD]'`((HK0?_T*TK_H
XM\%*M__Q@IDS?#`1.74YU3E7_Z$CG(`!P`2M`__QP_RM`__@@;0`($A`,`0`P.
XM;0P,`0`Y;@9"K?_X8$0B+?_\LJP*R&PZ2JW_^&HT<!A.N@[T0>P(T")(T\#1.
XMP"\H``0O+0`(+Q%A`/[Z3^\`#$J`9P@@+?_\*T#_^%*M__Q@O$AX``U.N@NHC
XM6$]*K?_X:P``C"`M__AR&$ZZ#JI![`C0T<`K2/_H(&W_Z%*H``@,J`````,`W
XM"&U`0J@`"$AX``-A`/V^6$](>``#*T#_]&$`_;!83R(M__3E@2)M_^@@<1@,6
XM)`#E@B.Q*`P8#".(*`PK0/_P*TC_["!M_^@@*``(Y8`@<`@,*TC_[+#\``!G,
XMEB\M_^Q.N@N.6$]@*B`L`(#E@$'L#2+1P"\03KH+>%A/4JP`@"(L`("RK`URG
XM;0A"K`"`80#^7B\L#B!.N@M86$],WP`$3EU.=4Y5__A"K?_\(BW__+*L"LAL"
XM*'`83KH-UD'L"-#1P$AX``,O2``$80#]`%A/(&\``"%```A2K?_\8,Y.74YU"
XM3E7__DCG(0!^`"`M``@,@````!1G&`R`````$V<,#(`````)9A1^!6!*?@=@5
XM1DAL`(1.N@K:6$]@.DJM``A:P$0`2(!(P"0M``@,@@```!-?P40!2(%(P<"!*
XM2H!G%B`"<AA.N@U*0>P(T-'`+Q!.N@J>6$\@!TS?`(1.74YU3E4``!`M``M(U
XM@`1``$%M-`Q```1L+N-`3OL``F`&8`Q@$F`8&WP``0`+8!P;?``"``M@%!M\(
XM``0`"V`,&WP``P`+8`1"+0`+$"T`"TY=3G5.5?^F2.<P(G``<@,K0?_B*4`0H
XM-"M`_]XK0/_L3KH$;F$`_M)A`/T8+RP-QDZZ"A)83R\L#B!.N@H(6$\@+!`P"
XM<BA.N@R<0>P0.-'`("P0+-'`$A!(@4C!2'@``2\!+RP0,"\`3KH%TD_O`!"5:
XMRD*M__`B;!0D(&D`5BQX``1.KOZ,)$"T_```9D8@;!0Z+'@`!$ZN_HPK0/_P=
XM2JW_\&8P(FP4)"!I`%9P`!`H``]R`20!X:)P`"!L%#H0*``/)@'AHX2#(`(L$
XM>``$3J[^PF"BM/P``&<``08K:@`4_^@[:@`8_^8B2BQX``1.KOZ&("W_Z`R`>
XM`$```&=@#(````$`9@``VG``,"W_YBM`__PB+?_\#($``/__9RY![`]<("W_Z
XM_"QL%"A.KO]P*T#_^"!M__@0*``:2(!R`#(H`"`[0/_F*T'__&#&<``P+?_F&
XM+P!A`/GH6$]@``"$2JW_XF9X<`$B`)*M_]XK0?_>2H%G,B`L$#!R*$ZZ"VA!P
XM[!`XT<`@+!`LT<`2$$B!2,%(>``!+P$O+!`P+P!.N@2>3^\`$&`N("P0,'(HY
XM3KH+-D'L$#C1P"`L$"S1P!(02(%(P4*G+P$O+!`P+P!.N@1N3^\`$'`#*T#_D
XMXF`$4ZW_XDJM__!G`/Z*&VP4,/^G2&P4,"\L%#9.N@)B4$\2+?^G#`$`FV8.6
XM<`%"K?_:*T#_[&``_EY*K?_L9P``GDB!2,$O`4ZZ"0A83TJ`9R8@+?_:<@I.[
XMN@JP$BW_ITB!2,'0@02`````,'(`*T#_VAM!_Z=@9@PM`#__IV8.<!1R`"M`A
XM_]H;0?^G8%`,+0`@_Z=F#G`"*T#_['``&T#_IV`Z0JW_[`PM`'[_IV80+RW_9
XMVF$`_*983QM`_Z=@'@RM`````O_L9Q00+?^G2(!(P"\`80#]!%A/&T#_IR`L<
XM$#!R*$ZZ"B1![!`XT<`@+!`LT<`2$$B!2,%"IR\!+RP0,"\`3KH#7$_O`!`,'
XM+0`-_Z=F+$AM_ZAA`/E:6$\0+?^G2(!(P"\`3KH&REA/2BW_J&<J2&W_J&$`V
XM^IQ83V`>#"T`?_^G9@9P!AM`_Z<0+?^G2(!(P"\`3KH&FEA/("P0,'(H3KH)D
XMI$'L$#C1P"`L$"S1P!(02(%(P4AX``$O`2\L$#`O`$ZZ`MI/[P`0<`,K0/_BC
XM<`$K0/_>8`#\^DY5``!(YP`"2JP.)&<,(FP4-BQX``1.KOX^2JP4-F<*+RP46
XM-DZZ"\)83TJL%#IG"B\L%#I.N@M86$]*K!0D9Q@@;!0D+&P4*$ZN_\H@;!0DP
XM+&P4*$ZN_[A*K!0@9PP@;!0@+&P4*$ZN_[Y*K!0H9PPB;!0H+'@`!$ZN_F)*N
XMK!0L9PPB;!0L+'@`!$ZN_F(O+0`(3KH&O%A/3-]``$Y=3G5.5?_X2.<!(B)L9
XM%#YP`RQL%"Q.KO\61>P0."X\```#Z"`'4X=*@&<(%+P`(%**8/!P`"E`$"PI0
XM0!`P3-]$@$Y=3G5.5?_\2.<``B!M``@Q?``"`!PA;0`,`"AP`2%``"0O2``$_
XM(F\`!"QX``1.KOXR3-]``$Y=3G5.5?_\2.<``DJL%"1F``&60^P/>G``+'@`(
XM!$ZN_=@I0!0H2JP4*&8*2'@``6$`_KI83T/L#XQP`"QX``1.KOW8*4`4+$JLO
XM%"QF"DAX``)A`/Z86$]![`XV+&P4*$ZN_SHI0!0@2JP4(&8*2'@``V$`_GA8S
XM3R!L%"#0_``L+T@`!"!O``1#[`Z&<`0L;!0L3J[_0"!L%"!P`"QL%"A.KO[F#
XM*6P4(`YT0>P.5BQL%"A.KO\T*4`4)$JL%"1F"DAX``1A`/XF6$\@;!0D0^P/0
XM7"QL%"A.KO[X(&P4)"EH`#(4/G``+P`O`$ZZ"/A03RE`%#I*@&8*2'@`!6$`'
XM_>Y83R\L%#I.N@FX6$\I0!0V2H!F"DAX``9A`/W26$\@;!0V(6P4)``H(&P48
XM-B%\````A``D0>P/GG``(FP4-G(`+'@`!$ZN_D1*@&<*2'@`!V$`_9I83W`!'
XM*4`.)$AL%#`O+!0V80#^:%!/(FP4/G`"+&P4+$ZN_JHB;!0^<`,L;!0L3J[^1
XMI&$`_@0@;!0@T/P`+"](``0@;P`$0^P.CG`$+&P4+$ZN_T!,WT``3EU.=4Y5;
XM__9(YP`"&VT`$__^("T`".>`(BT`#.>!7($O0``$+T$`"")L%#X@+P`$(B\`)
XM""QL%"Q.KO\02JT`%&<P(FP4/G`%+&P4+$ZN_IXB;!0^0>W__G`!+&P4+$ZNB
XM_\0B;!0^<`$L;!0L3J[^GF`2(FP4/D'M__YP`2QL%"Q.KO_$3-]``$Y=3G5.P
XM5?_T2.<!($AX`,=(>`$_<``O`"\`2'@`""\`+RP4/DZZ"9)/[P`<1>P0.$'LT
XM$&`N/````\`K2/_X(`=3ATJ`9PX@;?_X%)!2K?_X4HI@ZGXH(`=3ATJ`9P@4_
XMO``@4HI@\%.L$#!,WP2`3EU.=4Y5__!(YR,@$"T`"TB`!$```6T``H`,0``-%
XM;``">.5`3OL``F```$Y@``!:8```;F```(Y@``(08``!;F```@)@``"J8``"+
XM3F```DI@``)&8``"`&````)"K!`L4JP0,`RL````&1`P;0`"*F$`_R1@``(B`
XM2JP0,&<``AI3K!`P8``"$E*L$#`,K````!D0,&T``@)A`/[\8``!^DJL$"QFZ
XM%DJL$#!G``'L<"<I0!`L4ZP0,&```=Y3K!`L8``!UE*L$"P,K````"@0+&T`/
XM`<9"K!`L4JP0,`RL````&1`P;0`!LF$`_JQ@``&J2JP0+&9&2JP0,&<``9QP^
XM)RE`$"Q3K!`P("P0,'(H3KH$ID'L$#C1P"`L$"S1P!"\`"!"ITAX`"`O+!`P2
XM+RP0+&$`_=Q/[P`08``!7B`L$"SG@"(L$##G@20!7H(O`DAX`3\O`2\`0J=()
XM>``(+RP4/DZZ!^A/[P`<("P0,'(H3KH$1D'L$#C1P"`L$"S1P"M(__A3B"1(&
XMDH`N`2`'4X=*@&<.(&W_^!204JW_^%**8.H4O``@4ZP0+&```.X@+!`P<BA.R
XMN@0"0>P0.-'`$"@`)PP``"!F``#2(BP0+`R!````)VP``,0@`>>`(BP0,.>!U
XM)`%>@B\"2'@!/R\!+P!"ITAX__@O+!0^3KH'4$_O`!P@+!`P<BA.N@.N0>P0W
XM.-'`T/P`)R1(($H@2E.(<">0K!`L+@`K2/_X(`=3ATJ`9PX@;?_X%)!3K?_X=
XM4XI@ZA2\`"!@5&$`^J1@3G``*4`0+"E`$#!@0GX`#(<````9;#A\``R&````T
XM*&PJ(`=R*$ZZ`T9![!`XT<#1QA`02(!(P$*G+P`O!R\&80#\A$_O`!!2AF#.5
XM4H=@P$S?!,1.74YU3E4``!(M``L,`0`@;`Y(@4C!+P%A`/U.6$]@5DB!2,%"-
XMIR\!+RP0,"\L$"QA`/Q`3^\`$"`L$#!R*$ZZ`MI![!`XT<`@+!`LT<`0K0`+E
XM4JP0+`RL````*!`L;19"K!`L4JP0,`RL````&1`P;01A`/R&3EU.=4Y5```@7
XM;0`(2A!G%!`02(!(P%*M``@O`&$`_W!83V#D3EU.=4Y5__Q(YR``<``I0``8W
XM2JT`"&LD)"T`"+2L$!QL&B("YX%![!1$(DC3P4J19PHB`N>!T<$@"&`(<`DID
XM0`^P<`!,WP`$3EU.=0`````````````````````"?P#'`````$Y5__1(YP`@Y
XM1>P/M+3\``!G-@@J``(`&V8J""H``0`;9R(@*@`$D*H`$"M`__A*@&<2+P`O2
XM*@`0+RH`'$ZZ`*I/[P`,)%)@Q"\M``A.N@'N6$],WP0`3EU.=0``````````D
XM<&%.50``(BT`"`R!````,&T,#($````Y;@1P`6`"<`!.74YU``!.5?_V+RT`>
XM"$ZZ_PY83RM`__9*@&8$</]@*B\M`!`O+0`,(&W_]B\H``1.N@(L3^\`#"M`M
XM__I*K``89P1P_V`$("W_^DY=3G4@+P`$#```86T*#```>FX$!```($YU``!.=
XM5?_X+RT`"$ZZ_JY83RM`__A*@&8$</]@2"!M__@(*``#``-G$DAX``)"IR\MR
XM``A.NO]N3^\`#"\M`!`O+0`,(&W_^"\H``1.N@%23^\`#"M`__Q*K``89P1PN
XM_V`$("W__$Y=3G4``````%```'!A2H!J```>1(!*@6H```Q$@6$``"!$@4YU?
XM80``&$2`1(%.=4J!:@``#$2!80``!D2`3G4O`DA!-`%F```B2$!(04A"-`!GF
XM```&A,$P`DA`-`"$P3`"2$(R`B0?3G4O`W80#$$`@&0```;AF5%##$$(`&0`J
XM``;IF5E##$$@`&0```;EF55#2D%K```&XYE30S0`YJA(0D)"YJI(0X#!-@`PQ
XM`C0#2$'$P9""9```"%-#T(%D_G(`,@-(0^>X2$##0"8?)!].=2!"(D,D`"8!'
XM2$)(0\3!QL#`P=1#2$)"0M"")@DD"$YU3E7_^$CG`2!^`$7L%$2^K!`<;!Y*1
XMDF<4""H``@`#9P)@"B\J``1.N@$06$]2AU"*8-PO+0`,+RT`"$ZZ[4Y03TS?\
XM!(!.74YU3E7__$CG`0!*K``P9P1.NNW<0JP`&"(M``@D+0`,)BT`$"QL$"!.5
XMKO_0+@`,A_____]F$BQL$"!.KO]\*4``&'`%*4`/L"`'3-\`@$Y=3G4```!0?
XM``-S``#_@`!.5?_X2.<Q`DJL`#!G!$ZZ[8!"K``8("T`$%.`+T``$"(M``@DG
XM+0`,)B\`$"QL$"!.KO^^+@`,A_____]F$BQL$"!.KO]\*4``&'`6*4`/L"`M/
XM`!`,@`````)G'`R``````6<*2H!F(B`M``Q@'"`'(`?0K0`,8!(B+0`(=`!V0
XM`"QL$"!.KO^^3G%,WT",3EU.=0``3E4``$JL`#!G!$ZZ[/`B+0`(+&P0($ZN8
XM_]QP`$Y=3G4@;P`$((A8D$*H``0A2``(3G4``$CG/"`F+P`8%"\`'WK_+P5.3
XMN0``%L@2`'``$`$H`'+_LH!8CV8$<`!@9B\\``$``4AX`").N0``%H0D0"H*$
XM4(]F#B\$3KD``!;<<`!8CV!`)4,`"A5"``D5?``$``A"*@`.%40`#T*G3KD`W
XM`!:T)4``$$J#6(]G"B\*3KD``!;P8`I(:@`43KD``!3\6(\@"DS?!#Q.=2\*I
XM)&\`"$JJ``IG"B\*3KD``!<$6(\5?`#_``AP_R5``!1P`!`J``\O`$ZY```61
XMW$AX`"(O"DZY```6G$_O``PD7TYU```@+P`$2'@`,"\`3KD``!804(].=2`O0
XM``0O`$ZY```64EB/3G5(YS@`)"\`$"8O`!1*@F8$<`!@*"\\``$``2\#3KD`3
XM`!:$($`H"%"/9@)@Y!%\``4`"#%#`!(A0@`.(`A,WP`<3G4@;P`$(`AF`F`D?
XM$7P`_P`(</\A0``4</\A0``8<``P*``2+P`O"$ZY```6G%"/3G4``"\.+'D`=
XM``!`3.\``P`(3J[_.BQ?3G4``"\.+'D```!`(F\`""`O``Q.KO\N+%].=2\.3
XM+'D```!`(F\`"$ZN_MHL7TYU+PXL>0```$`@+P`(3J[^MBQ?3G4O#BQY````Y
XM0"`O``A.KOZP+%].=2\.+'D```!`(F\`"$ZN_IXL7TYU+PXL>0```$`B;P`(K
XM3J[^F"Q?3G5(YSP"+'D``!0L(F\`&$SO`#\`'$ZN_G1,WT`\3G4``````^P`X
XM```-````````%BX``!9Z```5^```%@@``!5&```5(@``%7H``!72```55@``_
XM%8P``!68```5M@``%=X````*`````0``%QX``!<(```6]```%N```!;,```6C
XMN```%J```!:(```!$@````X````````#\@```^H```0+````````````````>
XM`````````````````````````````````````````````````````````````
XM``````````````````````````````````````````````!D;W,N;&EB<F%RP
XM>0`@2&ED92!4:71L90`@4VAO=R!4:71L90``````2$5,4`````!(;6UM+BXN:
XM82!W;W5L9"UB92!P<F]G<F%M;65R+"!E:#\-``!);B!F86-T+"!T:&ES(&5M,
XM=6QA=&]R(&1O97-N)W0-86-T=6%L;'D@96UU;&%T92!04D]'4D%-4RX-``!'Q
XM3R!!34E'00``06@@+2!V97)Y(&=O;V0A($EF('EO=2!C86X@:&%V92!'3R`V"
XM-`UO;B!A($,Q,C@L('=H>2!N;W0@1T\@04U)1T$-``!.86@N+BYT:&%T('=O,
XM;B=T('=O<FL-``!,25-4```S($)A9W,@1FQO=7(--B!$;WH@16=G<PTQ($QO\
XM868@0G)E860-`#$@,RXU(B!$:7-K($1R:79E#3$@0V]L;W5R($UO;FET;W(-'
XM,2!!;6EG82`U,#`-`$Q/040B)"(`66]U('=A;G0@82!D:7)E8W1O<GD_(%1RL
XM>2!A('!H;VYE#6)O;VL@:6YS=&5A9"X-``!3;W)R>2`M($D@9&]N)W0@9F5E0
XM;"!U<"!T;R!D:7-K(&%C8V5S<PUJ=7-T(&%T('1H92!M;VUE;G0N($EN(&9A6
XM8W0L($DG;2!F965L:6YG<F%T:&5R(&1E<')E<W-E9"!I9B!Y;W4@;75S="!K_
XM;F]W+@U"<F%I;B!T:&4@<VEZ92!O9B!A('!L86YE="P@86YD('=H870-9&\@D
XM<&5O<&QE(&1O("T@=')Y(&%N9"!G970@80U$25)%0U1/4EDN($D@9&]N)W0@M
XM:VYO=R!W:&%T('1H90UW;W)L9"!I<R!C;VUI;F<@=&]O+BXN#0``3&]O:RP@L
XM:68@>6]U('1R>2!T:&%T($].0T4@;6]R92!))VQL#6)E('9E<GD@8W)O<W,-M
XM`$Q/040``$5R;2XN+DDG;2!A9G)A:60@=&AA="!T:&ES(&5M=6QA=&EO;@UDZ
XM;V5S;B=T(&5M=6QA=&4@=&AE($Q/040@8V]M;6%N9"X-`$%N9"!J=7-T(&AOH
XM=R!D;R!Y;W4@97AP96-T(&UE('1O#6%C8V]M<&QI<V@@=&AA="!O;B!A;B!!3
XM;6EG83\-``!/:RP@22=,3"!L;V%D(&$@<')O9W)A;2!W:&5N(%E/52!S:&]WA
XM#6UE('=H97)E('EO=2=V92!P;'5G9V5D(&EN('1H92`Q-30Q#0``4E5.`$]H=
XM($=O9"P@;F]T(&%N;W1H97(@;VYE(&]F('1H97-E#6ME97`M9FET(&%D9&ECO
XM=',N#0!#86XG="`M(&UY(&%N:VQE)W,@='=I<W1E9"$-``!3059%``!997,AZ
XM(%EE<R$@665S(2!7:71H('1H92!%+D(N4RX-`$]N;'D@2F5S=7,@8V%N(&1OC
XM('1H870N#0``0TQ/4T4`2&UM("XN+B!A;F]T:&5R(%!U8FQI8R!H;VQI9&%YH
XM/PT``%-H=70@=7`L('EO=7)S96QF(0T`0TQ2`"XN+B!A<R!C;&5A<B!A<R!MO
XM=60L($D@<F5C:V]N+@T`3VMA>2P@22=M('1H:6YK:6YG(&-L96%R;'D@;F]W$
XM+@U%=F5R>71H:6YG(&UA:V5S('!E<F9E8W0@<V5N<V4-1&%I<WDL('=H97)E&
XM(&%R92!Y;W4@;F]W/PT`4&%R9&]N/PT``$-/3E0``%=O;B=T(&-O;G1I;G5E-
XM(&5R<F]R#0!386UE('1O('EO=2!W:71H(&MN;V)S(&]N(0T`1$%400``0FQI2
XM;F0@9&%T82!E<G)O<BX-``!9;W4@;&EK92!0;VQI8V4@<F5C;W)D<RP@=&AEN
XM;C\-`$1)30!)(&%M(&YO="$-``!)="=S(&1A<FL@96YO=6=H+"!T:&%N:W,NL
XM#0``3VMA>2P@<'5T(&]N('1H92!S<&5C<RP@:70G<R!I;@TS+60@9G)O;2!N/
XM;W<@;VXN#0!%3D0`+BX@;V8@=&AE('5N:79E<G-E(#\-`$]K87DL($DG;2!FG
XM:6YI<VAE9"!W;W)K:6YG+@T``$=%5`!))VT@;F]T(&=E='1I;F<@86YY;6]RV
XM92!M97-S86=E<PUF;W(@>6]U+@T``$D@9V]T('1H870@>65S=&5R9&%Y(0T`5
XM`$D@;F5V97(@9V5T('1H870@:VEN9"!O9B!J;VME+@T`1T]354(`26YT;R!SF
XM=6)M87)I;F5S+"!A<F4@=V4_#0!/:V%Y+"!B=70@22!W;VXG="!R971U<FXNC
XM#0``3F\A(%5S92!P<F]C961U<F5S+@T``$=/``!))VT@9F5D('5P(&=O:6YG*
XM(&AE<F4L(&=O:6YG('1H97)E#6%N9"!N979E<B!A('=O<F0@;V8@=&AA;FMS7
XM+@T`3F]W('=H97)E/PT`22=V92!A;')E861Y(&)E96X@=&AE<F4@+2!I="=S9
XM('9E<GD-8F]R:6YG+@T``$E&``!.;R`G:69S)RP@8F4@<W5R92$-`$EF($D@#
XM=V5R92!A(')I8V@@;6%N+BXN#0``24Y0550`07-K('=H871E=F5R('EO=2!WV
XM86YT+"!))VT@;F]T#71E;&QI;F<N#0``66]U)VQL(&AA=F4@=&\@87-K('-OX
XM;65O;F4@96QS92X-`$Q%5`!,970@8GEG;VYE<R!B92!B>6=O;F5S+@T``$QEC
XM="!I="!B92X-`%1H:7,@8V]M<'5T97(@:7,@;F]T('1O(&QE="X-`$Y%5P!/#
XM:V%Y+"!))VT@8G)A;F0@;F5W+@T`3F\@;F5W<R!T;V1A>2`N+B!S;W)R>2$->
XM``!35$]0``!!<G)G9V=H:&@@+BX@8V%N)W0@<W1O<"!N;W<N#0!38V-R<F5E=
XM965E8V@@+BXN+@T``$)L0$!D>2!L;VQL:7!O<"!P97)S;VXA#0``````````:
XM``0`````````C````+``````````[`````0`````````]@```3H````````!B
XM4@````0````````!6````7X````````!K@````<````````!M@```>@```+6<
XM```#"@````0````````#$````U@```.8```#Y`````,````````#Z```!!P`/
XM```````$.@````0````````$0```!&`````````$>@````4````````$@```Q
XM!*(````````$M@````,````````$N@``!-H```4T```%/@````0````````%$
XM1```!5H````````%=@````0````````%?```!9`````````%L`````,`````P
XM```%M```!<````7<```&#@````,````````&$@``!B@````````&1@````,`+
XM```````&2@``!G8```:.```&K@````4````````&M```!LX```;J```'````>
XM``(````````'!```!T0```=0```'?@````(````````'@@``!Y8````````'C
XML`````4````````'M@``!^`````````(`@````,````````(!@``""````@L0
XM```(2@````0````````(3@``"&0````````(?@````0````````(A```"*(`8
XM``BV````$S]4;V\@;6%N>2!F:6YG97)S(&]N(&ME>6)O87)D(&5R<F]R#0``J
XM/U-T<FEN9R!T;V\@=&%N9VQE9"!E<G)O<@T``#]&;W)M=6QA('1O;R!B;W)I1
XM;F<@97)R;W(-```_3F]V:6-E('!R;V=R86UM97(@97)R;W(-`#]#;VUP=71E>
XM<B!T;V\@8G5S>2!E<G)O<@T`/T%T87)I($]W;F5R(&EN('9I8VEN:71Y(&5RV
XM<F]R#0`_0V]M;6%N9"!T;V\@=')I=FEA;"!E<G)O<@T`/TAA<F1W87)E(&UA=
XM;&9U;F-T:6]N(&5R<F]R#0``/TYO('-I;'9E<B!L:6YI;F<@;VX@8VQO=60@/
XM97)R;W(-`#]996%R(&YO="!A(&QE87`@>65A<B!E<G)O<@T``#](>7!E<BUS*
XM<&%C92!M:7-D:7)E8W1I;VX@97)R;W(-```_365M;W)Y(&5M<'1Y(&5R<F]RK
XM#0``/TYO(&)I=',@=&\@8FET92!E<G)O<@T`/T-O;6UO9&]R92`V-"!I;F-OP
XM;7!A=&EB:6QI='D@97)R;W(-```_26YV86QI9"!L97AI8V%L(&EN9&EC871OR
XM<B!E<G)O<@T`/S1T:"!D:6UE;G-I;VYA;"!E<G)O<@T`/TYT:"!D:6UE;G-I4
XM;VYA;"!E<G)O<@T`/T]U="!O9B!T:&ES('=O<FQD(&5R<F]R#0`_5&]O(&UA#
XM;GD@=7-E<G,@;VX@<WES=&5M(&5R<F]R#0``/U1O;R!M86YY(&-H87)A8W1ES
XM<G,@;VX@<V-R965N(&5R<F]R#0````K,```*\@``"PX```LJ```+1```"UX`Q
XM``M^```+F@``"[@```O:```+^```#!H```PP```,2```#&X```R0```,J```9
XM#,````S:```,_````!0-("`@("HJ*BH@0V]M;6]D;W)E(#8T($)A<VEC(%8R\
XM("HJ*BH-#2`V-$L@4F%M(%-Y<W1E;2`@,S@Y,3$@0F%S:6,@0GET97,@1G)E(
XM90T-````#78-("`@("`J*BH@0V]M;6]D;W)E(#8T($5M=6QA=&]R("HJ*@T-=
XM("`@(&)Y($5D9'D@0V%R<F]L;"`Q<W0@07!R:6P@,3DX.`T-````#<I296%DG
XM>2X-````#A@`````0S8T($5M=6QA=&]R`````````4``R``"``$````/````+
XM````#B@````````````````!0`#(``$`0`$````9````````````````````:
XM``````````````%``,@`#P``````````!WX.[@=^`1P@06)O=70N+BX`(%-H[
XM;W<@5&ET;&4`(%%U:70```$````````````````.E@```````0``````````Q
XM``````Z@```````!````````````````#JP````````/$```````;@`)`%(`1
XM```````.L@`````!````````````#S(````*`&X`"0!2````````#L8`````I
XM`@``````````````````%`!N``D`4@````````[:``````,`````````4')O[
XM:F5C=`````````````!D``H``0``#U0```[N``````````!I;G1U:71I;VXN%
XM;&EB<F%R>0!G<F%P:&EC<RYL:6)R87)Y``!C;VYS;VQE+F1E=FEC90``````Z
XM```````/U@``````````````````````````````````````````#_@`````L
XM`````````````````````````````````````````````````````````````
XM```````````````````````````H```````````````````#[````&L````!#
XM```/U@``#[0```]N```/:@``#T0```\B```/$```#P````[N```.Y@``#M(`@
XM``Z^```.2@``#B````X4```-Q@``#6X```UJ```-9@``#6(```U>```-6@``M
XM#58```U2```-3@``#4H```U&```-0@``#3X```TZ```--@``#3(```TN```-R
XM*@``#28```TB```*Q```"L````J\```*L```"J@```JD```*F```"I0```J0>
XM```*C```"H````IX```*=```"F@```I@```*7```"E````I,```*2```"D0`R
XM``HX```*-```"C````HL```*(```"AP```H8```*%```"@@```H````)_```A
XM"?````GL```)Z```">0```G8```)T```"<P```G````)N```";0```FH```)<
XMI```":````F<```)D```"8@```F$```)>```"7````EL```)8```"5@```E4_
XM```)2```"40```E````)/```"3````DL```)*```"20```D8```)$```"0P`'
X?``D````(^```"/0```CH```(X```"-P````````#\B0`:
X``
Xend
Xsize 10696
SHAR_EOF
echo "End of archive 1 (of 1)"
# if you want to concatenate archives, remove anything after this line
exit