[alt.sources.amiga] copdis - copper list disassembler

karl@sugar.hackercorp.com (Karl Lehenbauer) (10/06/89)

Here is the source to my copper list disassembler, copdis.  I heard someone
else wrote one already -- their's may well be better...

----------------------- cut here ---------------------
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then feed it
# into a shell via "sh file" or similar.  To overwrite existing files,
# type "sh file -c".
# The tool that generated this appeared in the comp.sources.unix newsgroup;
# send mail to comp-sources-unix@uunet.uu.net if you want that tool.
# If this archive is complete, you will see the following message at the end:
#		"End of shell archive."
# Contents:  README copdis.h copdis.c registers.c main.c makefile
#   copdis.uu
# Wrapped by karl@sugar on Thu Jun 29 23:10:36 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(3668 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
X
X
Xcopdis - copper disassembler  0.0a  6/29/89  (alpha release)
X
X
XOVERVIEW
X
XGreetings.  The intrepid Amiga hacker, seeking to gain knowledge in the
Xintricacies of the video coprocessor, or copper, may find use in this 
Xprogram: a copper list disassembler.
X
XThe copper is a source of unspeakable power and it must be studied.
X
XThe copper is a programmable processor, capable of executing a very simple
Xset of instructions that allow it to control much of the Amiga hardware,
Xincluding all of the display characteristics and functions, audio functions,
Xthe blitter, serial port and even the floppy disk drives.
X
XThe copper has the capability of synchronizing its operations with the
Xdrawing of the display.  Copper programs can use this to do specific
Xthings to specific portions of the screen such as alter color registers, 
Xchange display resolutions, etc.  It can also use this capability to
Xprovide a precision timer by which its operations can be precisely ordered, 
Xfor example, for using the copper to play music without the intervention
Xof the 68000 processor.
X
XThe copper has a particularly interesting, but little used, capability by
Xwhich a currently executing copper program (Copper programs basically must
Xcomplete within about 1/60th of a second.) can set up another address for
Xthe copper to begin executing at.  The copper would normally begin executing
Xat that address at the start of the next video field.  It can be forced to
Xbegin executing it immediately with an additional instruction.
X
XAs there are two copper "program counters," it is possible to have a
Xone-deep subroutine calling capability whereby programs execute running
Xcopper PC 1 and call subroutines by loading their addresses into copper
XPC 2 and strobing the location to causes the coppper to start executing
Xthe "subroutine."  At the completion of the subroutine, it strobes the
Xaddress that causes the copper to execute using PC 1, which resumes
Xthe caller -- UNTESTED
X
XIf that works, a deeper interrupt nesting scheme can be created, if
Xnecessary, involving the copper interrupting the 68000 and getting it
Xto handle a stack and such.  (kink value == maximum)
X
XUSING COPDIS
X
XThere are two ways to use copdis.  One is to execute the copdis program.
XThis goes out and finds various presumably interesting copper lists and
Xprints them out for you.
X
XThe other way to use copdis is to call it directly from your C program.
XSimply link copdis.o (after compiling it from copdis.c for the memory
Xmodel you're using) in with your program, and call the subroutine 'copdis'
Xwith a pointer to a copper instruction list.  Note that structures such 
Xas "struct cprlist" are not pointers to instruction lists but pointer
Xto structures that point to instruction lists or point to something that
Xpoints to an instruction list.  I think the calls in main are correct,
Xbut I'm not promising *anything.*
X
XBUGS
X
XThis program is in a primitive state.  Right now it doesn't take a length
Xand if it gets passed a bogus address (i.e., not an address of a real
Xand properly terminated copper list), it can run on and on.  For all I
Xknow, it may even get lost doing OK lists, but I haven't seen that happen,
Xat least not for a while.  It really ought to do a sanity check on the
Xsize of the list, like stop after an absurd number of instructions go
Xby, but you can always control-C anyway.
X
XNote also that I'm not a copper expert so any of the information in the
XREADME here could be wrong as well.
X
X
XRegards, Karl Lehenbauer @ The Hacker's Haven
X
X Hackercorp
X 3918 Panorama
X Missouri City, TX  77459
X
X (713) 274-5184
X usenet: uunet!sugar!karl
X Internet & BITNET: karl@sugar.hackercorp.com
X BIX: karl (rarely)

END_OF_FILE
echo shar: NEWLINE appended to \"'README'\"
if test 3669 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'copdis.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'copdis.h'\"
else
echo shar: Extracting \"'copdis.h'\" \(135 characters\)
sed "s/^X//" >'copdis.h' <<'END_OF_FILE'
X
X#define COLOR 1
X
Xstruct regstruct
X{
X	char *regname;
X	short regid;
X	short flags;
X};
X
Xstruct instruction 
X{
X	short ir1;
X	short ir2;
X};
X

END_OF_FILE
echo shar: NEWLINE appended to \"'copdis.h'\"
if test 136 -ne `wc -c <'copdis.h'`; then
    echo shar: \"'copdis.h'\" unpacked with wrong size!
fi
# end of 'copdis.h'
fi
if test -f 'copdis.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'copdis.c'\"
else
echo shar: Extracting \"'copdis.c'\" \(14768 characters\)
sed "s/^X//" >'copdis.c' <<'END_OF_FILE'
X/* copdis - standalone copper list disassembler
X *
X * by Karl Lehenbauer, April 1989
X *
X * This code is released to the public domain for any legal use.
X *
X * This is free software.  No warranties are expressed or implied.
X *
X *
X * There should be a text file, copdis.doc, that describes the function
X * of the program in greater detail.  If you don't have it, you've been
X * ripped off!
X *
X * A quick summary: to disassemble a copper list, call copdis and pass it
X * the address of the start of the copper list.  Note that this is not
X * the address of the cprlst or CopList data structure, but the actual
X * address of the first copper instruction.
X *
X * Some examples:
X *
X *  GfxBase's copinit list, this may not be right
X *  copdis(GfxBase->copinit);	
X *
X *	Top Viewport's display instructions for the "long frame"
X *  copdis(GfxBase->ActiView->ViewPort->DspIns->CopLStart);
X *
X *	Top Viewport's display instructions for the "short frame"
X *  copdis(GfxBase->ActiView->ViewPort->DspIns->CopSStart);
X *
X *	Currently active LOF copper list
X *  copdis(GfxBase->ActiView->LOFCprList->start);
X *
X *  Currently active SHF copper list:
X *  copdis(GfxBase->ActiView->SHFCprList->start);
X *
X */
X
X#include <functions.h>
X#include <stdio.h>
X
Xstruct copregstruct
X{
X	char *regname;
X	char *longname;
X	short regid;
X	short flags;
X};
X
Xstruct copinstruction 
X{
X	short ir1;
X	short ir2;
X};
X
X#define COLOR 1
X
Xstatic struct copregstruct copregisters[] =
X{
X	{"bltddat","blitter destination early read (dummy address)",0,0},
X	{"dmaconr","DMA control (and blitter status) read",0x2,0},
X	{"vposr","read vert most signif. bit (and frame flop)",0x4,0},
X	{"vhposr","read vert and horiz. position of beam",0x6,0},
X	{"dskdatr","disk data early read (dummy address)",0x8,0},
X	{"joy0dat","joystick-mouse 0 data (vert,horiz)",0xa,0},
X	{"joy1dat","joystick-mouse 1 data (vert,horiz)",0xc,0},
X	{"clxdat","collision data (read and clear)",0xe,0},
X	{"adkconr","audio, disk control register read",0x10,0},
X	{"pot0dat","pot counter pair 0 data (vert,horiz)",0x12,0},
X	{"pot1dat","pot counter pair 1 data (vert,horiz)",0x14,0},
X	{"potgor","pot port data read",0x16,0},
X	{"serdatr","serial port data and status read",0x18,0},
X	{"dskbytr","disk data byte and status read",0x1a,0},
X	{"intenar","interrupt enable bits read",0x1c,0},
X	{"intreqr","interrupt request bits read",0x1e,0},
X
X	{"dskpth","disk pointer (high 3 bits)",0x20,0},
X	{"dskptl","disk pointer (low 15 bits)",0x22,0},
X	{"dsklen","disk length",0x24,0},
X	{"dskdat","disk DMA data write",0x26,0},
X
X	{"refptr","refresh pointer",0x28,0},
X	{"vposw","write vert most signif. bit (and frame flop)",0x2a,0},
X	{"vhposw","write vert and horiz position of beam",0x2c,0},
X	{"copcon","copper control register (CDANG)",0x2e,0},
X	{"serdat","serial port data and stop bits write",0x30,0},
X	{"serper","serial port period and control",0x32,0},
X	{"potgo","pot port data write and start",0x34,0},
X	{"joytest","write all four joystick-mouse counters",0x36,0},
X	{"strequ","strobe for horiz sync with vertical blank and EQU",0x38,0},
X	{"strvbl","strobe for horiz sync with vertical blank",0x3a,0},
X	{"strhor","strobe for horizontal sync",0x3c,0},
X	{"strlong","strobe for identification of long horiz. line",0x3e,0},
X
X	{"bltcon0","blitter control register 0",0x40,0},
X	{"bltcon1","blitter control register 1",0x42,0},
X	{"bltafwm","blitter first word mask for source A",0x44,0},
X	{"bltalwm","blitter last word mask for source A",0x46,0},
X	{"bltcpth","blitter pointer to source C (high 3 bits)",0x48,0},
X	{"bltcptl","blitter pointer to source C (low 15 bits)",0x4a,0},
X	{"bltbpth","blitter pointer to source B (high 3 bits)",0x4c,0},
X	{"bltbptl","blitter pointer to source B (low 15 bits)",0x4e,0},
X	{"bltapth","blitter pointer to source A (high 3 bits)",0x50,0},
X	{"bltaptl","blitter pointer to source A (low 15 bits)",0x52,0},
X	{"bltdpth","blitter pointer to source D (high 3 bits)",0x54,0},
X	{"bltdptl","blitter pointer to source D (low 15 bits)",0x56,0},
X	{"bltsize","blitter start and size (window width, height)",0x58,0},
X	{"bltcmod","blitter modulo for source C",0x60,0},
X	{"bltbmod","blitter modulo for source B",0x62,0},
X	{"bltamod","blitter modulo for source A",0x64,0},
X	{"bltdmod","blitter modulo for source D",0x66,0},
X	{"bltcdat","blitter source C data",0x70,0},
X	{"bltbdat","blitter source B data",0x72,0},
X	{"bltadat","blitter source A data",0x74,0},
X
X	{"dsksync","disk sync pattern for disk read",0x7e,0},
X
X	{"cop1lch","copper first location (high 3 bits)",0x80,0},
X	{"cop1lcl","copper first location (low 15 bits)",0x82,0},
X	{"cop2lch","copper second location (high 3 bits)",0x84,0},
X	{"cop2lcl","copper second location (low 15 bits)",0x86,0},
X	{"copjmp1","restart copper at first location",0x88,0},
X	{"copjmp2","restart copper at second location",0x8a,0},
X	{"copins","copper instruction fetch identify",0x8c,0},
X	{"diwstrt","display window start (upper left vert-horiz position)",0x8e,0},
X	{"diwstop","display window stop (lower right vert-horiz position)",0x90,0},
X	{"ddfstrt","display bit plane data fetch start (horiz. position)",0x92,0},
X	{"ddfstop","display bit plane data fetch stop (horiz. position)",0x94,0},
X	{"dmacon","DMA control write (clear or set)",0x96,0},
X	{"clxcon","collision control",0x98,0},
X	{"intena","interrupt enable bits",0x9a,0},
X	{"intreq","interrupt request bits",0x9c,0},
X	{"adkcon","audio, disk, UART control",0x9e,0},
X
X	{"aud0lch","audio channel 0 location (high 3 bits)",0xa0,0},
X	{"aud0lcl","audio channel 0 location (low 15 bits)",0xa2,0},
X	{"aud0len","audio channel 0 length",0xa4,0},
X	{"aud0per","audio channel 0 period",0xa6,0},
X	{"aud0vol","audio channel 0 volume",0xa8,0},
X	{"aud0dat","audio channel 0 data",0xaa,0},
X
X	{"aud1lch","audio channel 1 location (high 3 bits)",0xb0,0},
X	{"aud1lcl","audio channel 1 location (low 15 bits)",0xb2,0},
X	{"aud1len","audio channel 1 length",0xb4,0},
X	{"aud1per","audio channel 1 period",0xb6,0},
X	{"aud1vol","audio channel 1 volume",0xb8,0},
X	{"aud1dat","audio channel 1 data",0xba,0},
X
X	{"aud2lch","audio channel 2 location (high 3 bits)",0xc0,0},
X	{"aud2lcl","audio channel 2 location (low 15 bits)",0xc2,0},
X	{"aud2len","audio channel 2 length",0xc4,0},
X	{"aud2per","audio channel 2 period",0xc6,0},
X	{"aud2vol","audio channel 2 volume",0xc8,0},
X	{"aud2dat","audio channel 2 data",0xca,0},
X
X	{"aud3lch","audio channel 3 location (high 3 bits)",0xd0,0},
X	{"aud3lcl","audio channel 3 location (low 15 bits)",0xd2,0},
X	{"aud3len","audio channel 3 length",0xd4,0},
X	{"aud3per","audio channel 3 period",0xd6,0},
X	{"aud3vol","audio channel 3 volume",0xd8,0},
X	{"aud3dat","audio channel 3 data",0xda,0},
X
X	{"bpl1pth","blitter plane 1 pointer (high 3 bits)",0xe0,0},
X	{"bpl1ptl","blitter plane 1 pointer (low 15 bits)",0xe2,0},
X	{"bpl2pth","blitter plane 2 pointer (high 3 bits)",0xe4,0},
X	{"bpl2ptl","blitter plane 2 pointer (low 15 bits)",0xe6,0},
X	{"bpl3pth","blitter plane 3 pointer (high 3 bits)",0xe8,0},
X	{"bpl3ptl","blitter plane 3 pointer (low 15 bits)",0xea,0},
X	{"bpl4pth","blitter plane 4 pointer (high 3 bits)",0xec,0},
X	{"bpl4ptl","blitter plane 4 pointer (low 15 bits)",0xee,0},
X	{"bpl5pth","blitter plane 5 pointer (high 3 bits)",0xf0,0},
X	{"bpl5ptl","blitter plane 5 pointer (low 15 bits)",0xf2,0},
X	{"bpl6pth","blitter plane 6 pointer (high 3 bits)",0xf4,0},
X	{"bpl6ptl","blitter plane 6 pointer (low 15 bits)",0xf6,0},
X
X	{"bplcon0","bit plane control bits",0x100,0},
X	{"bplcon1","bit plane scroll values for PF1 & PF2",0x102,0},
X	{"bplcon2","bit plane priority control",0x104,0},
X
X	{"bpl1mod","bit plane modulo for odd planes",0x108,0},
X	{"bpl2mod","bit plane modulo for even planes",0x10a,0},
X
X	{"bpl1dat","bit plane 1 data (parallel-to-serial convert)",0x110,0},
X	{"bpl2dat","bit plane 2 data (parallel-to-serial convert)",0x112,0},
X	{"bpl3dat","bit plane 3 data (parallel-to-serial convert)",0x114,0},
X	{"bpl4dat","bit plane 4 data (parallel-to-serial convert)",0x116,0},
X	{"bpl5dat","bit plane 5 data (parallel-to-serial convert)",0x118,0},
X	{"bpl6dat","bit plane 6 data (parallel-to-serial convert)",0x11a,0},
X
X	{"spr0pth","sprite 0 pointer (high 3 bits)",0x120,0},
X	{"spr0ptl","sprite 0 pointer (low 15 bits)",0x122,0},
X	{"spr1pth","sprite 1 pointer (high 3 bits)",0x124,0},
X	{"spr1ptl","sprite 1 pointer (low 15 bits)",0x126,0},
X	{"spr2pth","sprite 2 pointer (high 3 bits)",0x128,0},
X	{"spr2ptl","sprite 2 pointer (low 15 bits)",0x12a,0},
X	{"spr3pth","sprite 3 pointer (high 3 bits)",0x12c,0},
X	{"spr3ptl","sprite 3 pointer (low 15 bits)",0x12e,0},
X	{"spr4pth","sprite 4 pointer (high 3 bits)",0x130,0},
X	{"spr4ptl","sprite 4 pointer (low 15 bits)",0x132,0},
X	{"spr5pth","sprite 5 pointer (high 3 bits)",0x134,0},
X	{"spr5ptl","sprite 5 pointer (low 15 bits)",0x136,0},
X	{"spr6pth","sprite 6 pointer (high 3 bits)",0x138,0},
X	{"spr6ptl","sprite 6 pointer (low 15 bits)",0x13a,0},
X	{"spr7pth","sprite 7 pointer (high 3 bits)",0x13c,0},
X	{"spr7ptl","sprite 7 pointer (low 15 bits)",0x13e,0},
X
X	{"spr0pos","sprite 0 vert-horiz start position",0x140,0},
X	{"spr0ctl","sprite 0 vert stop position and control data",0x142,0},
X	{"spr0data","sprite 0 image data register A",0x144,0},
X	{"spr0datb","sprite 0 image data register B",0x146,0},
X	{"spr1pos","sprite 1 vert-horiz start position",0x148,0},
X	{"spr1ctl","sprite 1 vert stop position and control data",0x14a,0},
X	{"spr1data","sprite 1 image data register A",0x14c,0},
X	{"spr1datb","sprite 1 image data register B",0x14e,0},
X	{"spr2pos","sprite 2 vert-horiz start position",0x150,0},
X	{"spr2ctl","sprite 2 vert stop position and control data",0x152,0},
X	{"spr2data","sprite 2 image data register A",0x154,0},
X	{"spr2datb","sprite 2 image data register B",0x156,0},
X	{"spr3pos","sprite 3 vert-horiz start position",0x158,0},
X	{"spr3ctl","sprite 3 vert stop position and control data",0x15a,0},
X	{"spr3data","sprite 3 image data register A",0x15c,0},
X	{"spr3datb","sprite 3 image data register B",0x15e,0},
X	{"spr4pos","sprite 4 vert-horiz start position",0x160,0},
X	{"spr4ctl","sprite 4 vert stop position and control data",0x162,0},
X	{"spr4data","sprite 4 image data register A",0x164,0},
X	{"spr4datb","sprite 4 image data register B",0x166,0},
X	{"spr5pos","sprite 5 vert-horiz start position",0x168,0},
X	{"spr5ctl","sprite 5 vert stop position and control data",0x16a,0},
X	{"spr5data","sprite 5 image data register A",0x16c,0},
X	{"spr5datb","sprite 5 image data register B",0x16e,0},
X	{"spr6pos","sprite 6 vert-horiz start position",0x170,0},
X	{"spr6ctl","sprite 6 vert stop position and control data",0x172,0},
X	{"spr6data","sprite 6 image data register A",0x174,0},
X	{"spr6datb","sprite 6 image data register B",0x176,0},
X	{"spr7pos","sprite 7 vert-horiz start position",0x178,0},
X	{"spr7ctl","sprite 7 vert stop position and control data",0x17a,0},
X	{"spr7data","sprite 7 image data register A",0x17c,0},
X	{"spr7datb","sprite 7 image data register B",0x17e,0},
X
X	{"color0","",0x180,COLOR},
X	{"color1","",0x182,COLOR},
X	{"color2","",0x184,COLOR},
X	{"color3","",0x186,COLOR},
X	{"color4","",0x188,COLOR},
X	{"color5","",0x18a,COLOR},
X	{"color6","",0x18c,COLOR},
X	{"color7","",0x18e,COLOR},
X	{"color8","",0x190,COLOR},
X	{"color9","",0x192,COLOR},
X	{"color10","",0x194,COLOR},
X	{"color11","",0x196,COLOR},
X	{"color12","",0x198,COLOR},
X	{"color13","",0x19a,COLOR},
X	{"color14","",0x19c,COLOR},
X	{"color15","",0x19e,COLOR},
X	{"color16","",0x1a0,COLOR},
X	{"color17","",0x1a2,COLOR},
X	{"color18","",0x1a4,COLOR},
X	{"color19","",0x1a6,COLOR},
X	{"color20","",0x1a8,COLOR},
X	{"color21","",0x1aa,COLOR},
X	{"color22","",0x1ac,COLOR},
X	{"color23","",0x1ae,COLOR},
X	{"color24","",0x1b0,COLOR},
X	{"color25","",0x1b2,COLOR},
X	{"color26","",0x1b4,COLOR},
X	{"color27","",0x1b6,COLOR},
X	{"color28","",0x1b8,COLOR},
X	{"color29","",0x1ba,COLOR},
X	{"color30","",0x1bc,COLOR},
X	{"color31","",0x1be,COLOR},
X	{"","",-1,0}
X};
X
Xstruct copregstruct *find_copper_register_info(reg)
Xint reg;
X{
X	struct copregstruct *regp;
X
X	for (regp = &copregisters[0]; regp->regid != -1; regp++)
X	{
X		if (regp->regid == reg)
X			return(regp);
X	}
X	return(0);
X}
X
Xdisassemble_copper_instruction(ip)
Xstruct copinstruction *ip;
X{
X	short vp, hp, ve, he, bfd;
X	int registerid;
X	struct copregstruct *regp;
X	char *regtext, *longtext;
X
X	/* printf("instruction %x, %x\n",ip->ir1,ip->ir2); */
X
X
X	/* true if it's a branch or skip instruction */
X	if (ip->ir1 & 1)
X	{
X		/* branch or skip instruction */
X
X		/* calculate vertical and horizontal position */
X		vp = (ip->ir1 >> 8) & 0xff;
X		hp = (ip->ir1 >> 1) & 0x7f;
X
X		/* calculate vertical and horizontal position compare bits
X		 * and blitter-finished-disable bit */
X		ve = (ip->ir2 >> 8) & 0x7f;
X		he = (ip->ir2 >> 1) & 0x7f;
X		bfd = (ip->ir2 & 0x8000);
X
X		/* print the instruction type, check bit 0 of second word */
X		if (ip->ir2 & 1)
X		{
X			/* it's a skip */
X			printf("\tskip");
X		}
X		else
X		{
X			/* it's a wait */
X			printf("\twait");
X		}
X
X		/* reverse sense of blitter finish wait disable to show blitter 
X		 * finish wait -- that way we occasionally say "blitter" instead
X		 * of almost always saying "no blitter"
X		 */
X		if (!bfd)
X			printf("\tbf,");
X		else
X			printf("\t");
X
X		/* print vertical and horizontal position */
X		printf("vpos=%d,hpos=%d",vp,hp);
X	printf("instruction %x, %x\n",ip->ir1,ip->ir2);
X
X		/* if enable masks are not basically "all", print them */
X		if ((ve != 0x7f) || (he != 0x7f))
X		{
X			printf(",vcomp=%d,hcomp=%d\n",ve,he);
X		}
X	}
X	else
X	{
X		/* it's a move instruction */
X
X		/* calculate register ID and look it up */
X		registerid = ip->ir1 & 0x1ff;
X		regp = find_copper_register_info(registerid);
X
X		/* if we found the register in our table, print the text
X		 * else whine about something we don't understand */
X		if (regp)
X		{
X			regtext = regp->regname;
X			longtext = regp->longname;
X		}
X		else
X		{
X			regtext = "UNKNOWN_OPCODE";
X			longtext = "";
X		}
X		printf("\tmove\t%x,%s",ip->ir2,regtext);
X
X		if (*longtext != '\0')
X			printf("\t;%s",longtext);
X	}
X	printf("\n");
X}
X
X/* have a go at disassembling a copper list */
Xcopdis(coplist)
Xstruct copinstruction *coplist;
X{
X
X	/* check and refuse null list pointers */
X	if (coplist == (struct copinstruction *)NULL)
X	{
X		fprintf(stderr,"copdis: copper list pointer is null\n");
X		return;
X	}
X
X	/* while we don't have an instruction of 0xffff 0xfffe, which is
X	 * a de facto END PROGRAM instruction, print instructions.
X	 *
X	 * Use of do-while is in order that the END instruction is also
X	 * disassembled.
X	 *
X	 * This should really have a sanity check (like no more than a few
X	 * hundred instructions, and/or a length -- heck, it's in the cprlst
X	 * and CopList structures anyway), but it doesn't, or at least not
X	 * yet
X	 */
X	do
X	{
X		disassemble_copper_instruction(coplist++);
X	}
X	while ((coplist->ir1 != 0xffff) && (coplist->ir2 != 0xfffe));
X
X	/* and disassemble the WAIT 255 instruction */
X	disassemble_copper_instruction(coplist);
X}

END_OF_FILE
echo shar: NEWLINE appended to \"'copdis.c'\"
if test 14769 -ne `wc -c <'copdis.c'`; then
    echo shar: \"'copdis.c'\" unpacked with wrong size!
fi
# end of 'copdis.c'
fi
if test -f 'registers.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'registers.c'\"
else
echo shar: Extracting \"'registers.c'\" \(4586 characters\)
sed "s/^X//" >'registers.c' <<'END_OF_FILE'
X#include "copdis.h"
X
Xstruct regstruct registers[] =
X{
X	{"bltddat",0,0},
X	{"dmaconr",0x2,0},
X	{"vposr",0x4,0},
X	{"vhposr",0x6,0},
X	{"dskdatr",0x8,0},
X	{"joy0dat",0xa,0},
X	{"joy1dat",0xc,0},
X	{"clxdat",0xe,0},
X	{"adkconr",0x10,0},
X	{"pot0dat",0x12,0},
X	{"pot1dat",0x14,0},
X	{"potgor",0x16,0},
X	{"serdatr",0x18,0},
X	{"dskbytr",0x1a,0},
X	{"intenar",0x1c,0},
X	{"intreqr",0x1e,0},
X
X	{"dskpth",0x20,0},
X	{"dskptl",0x22,0},
X	{"dsklen",0x24,0},
X	{"dskdat",0x26,0},
X
X	{"refptr",0x28,0},
X	{"vposw",0x2a,0},
X	{"vhposw",0x2c,0},
X	{"copcon",0x2e,0},
X	{"serdat",0x30,0},
X	{"serper",0x32,0},
X	{"potgo",0x34,0},
X	{"joytest",0x36,0},
X	{"strequ",0x38,0},
X	{"strvbl",0x3a,0},
X	{"strhor",0x3c,0},
X	{"strlong",0x3e,0},
X
X	{"bltcon0",0x40,0},
X	{"bltcon1",0x42,0},
X	{"bltafwm",0x44,0},
X	{"bltalwm",0x46,0},
X	{"bltcpth",0x48,0},
X	{"bltcptl",0x4a,0},
X	{"bltbpth",0x4c,0},
X	{"bltbptl",0x4e,0},
X	{"bltapth",0x50,0},
X	{"bltaptl",0x52,0},
X	{"bltdpth",0x54,0},
X	{"bltdptl",0x56,0},
X	{"bltsize",0x58,0},
X	{"bltcmod",0x60,0},
X	{"bltbmod",0x62,0},
X	{"bltamod",0x64,0},
X	{"bltdmod",0x66,0},
X	{"bltcdat",0x70,0},
X	{"bltbdat",0x72,0},
X	{"bltadat",0x74,0},
X
X	{"dsksync",0x7e,0},
X
X	{"cop1lch",0x80,0},
X	{"cop1lcl",0x82,0},
X	{"cop2lch",0x84,0},
X	{"cop2lcl",0x86,0},
X	{"copjmp1",0x88,0},
X	{"copjmp2",0x8a,0},
X	{"copins",0x8c,0},
X	{"diwstrt",0x8e,0},
X	{"diwstop",0x90,0},
X	{"ddfstrt",0x92,0},
X	{"ddfstop",0x94,0},
X	{"dmacon",0x96,0},
X	{"clxcon",0x98,0},
X	{"intena",0x9a,0},
X	{"intreq",0x9c,0},
X	{"adkcon",0x9e,0},
X
X	{"aud0lch",0xa0,0},
X	{"aud0lcl",0xa2,0},
X	{"aud0len",0xa4,0},
X	{"aud0per",0xa6,0},
X	{"aud0vol",0xa8,0},
X	{"aud0dat",0xaa,0},
X
X	{"aud1lch",0xb0,0},
X	{"aud1lcl",0xb2,0},
X	{"aud1len",0xb4,0},
X	{"aud1per",0xb6,0},
X	{"aud1vol",0xb8,0},
X	{"aud1dat",0xba,0},
X
X	{"aud2lch",0xc0,0},
X	{"aud2lcl",0xc2,0},
X	{"aud2len",0xc4,0},
X	{"aud2per",0xc6,0},
X	{"aud2vol",0xc8,0},
X	{"aud2dat",0xca,0},
X
X	{"aud3lch",0xd0,0},
X	{"aud3lcl",0xd2,0},
X	{"aud3len",0xd4,0},
X	{"aud3per",0xd6,0},
X	{"aud3vol",0xd8,0},
X	{"aud3dat",0xda,0},
X
X	{"bpl1pth",0xe0,0},
X	{"bpl1ptl",0xe2,0},
X	{"bpl2pth",0xe4,0},
X	{"bpl2ptl",0xe6,0},
X	{"bpl3pth",0xe8,0},
X	{"bpl3ptl",0xea,0},
X	{"bpl4pth",0xec,0},
X	{"bpl4ptl",0xee,0},
X	{"bpl5pth",0xf0,0},
X	{"bpl5ptl",0xf2,0},
X	{"bpl6pth",0xf4,0},
X	{"bpl6ptl",0xf6,0},
X
X	{"bplcon0",0x100,0},
X	{"bplcon1",0x102,0},
X	{"bplcon2",0x104,0},
X
X	{"bpl1mod",0x108,0},
X	{"bpl2mod",0x10a,0},
X
X	{"bpl1dat",0x110,0},
X	{"bpl2dat",0x112,0},
X	{"bpl3dat",0x114,0},
X	{"bpl4dat",0x116,0},
X	{"bpl5dat",0x118,0},
X	{"bpl6dat",0x11a,0},
X
X	{"spr0pth",0x120,0},
X	{"spr0ptl",0x122,0},
X	{"spr1pth",0x124,0},
X	{"spr1ptl",0x126,0},
X	{"spr2pth",0x128,0},
X	{"spr2ptl",0x12a,0},
X	{"spr3pth",0x12c,0},
X	{"spr3ptl",0x12e,0},
X	{"spr4pth",0x130,0},
X	{"spr4ptl",0x132,0},
X	{"spr5pth",0x134,0},
X	{"spr5ptl",0x136,0},
X	{"spr6pth",0x138,0},
X	{"spr6ptl",0x13a,0},
X	{"spr7pth",0x13c,0},
X	{"spr7ptl",0x13e,0},
X
X	{"spr0pos",0x140,0},
X	{"spr0ctl",0x142,0},
X	{"spr0data",0x144,0},
X	{"spr0datb",0x146,0},
X	{"spr1pos",0x148,0},
X	{"spr1ctl",0x14a,0},
X	{"spr1data",0x14c,0},
X	{"spr1datb",0x14e,0},
X	{"spr2pos",0x150,0},
X	{"spr2ctl",0x152,0},
X	{"spr2data",0x154,0},
X	{"spr2datb",0x156,0},
X	{"spr3pos",0x158,0},
X	{"spr3ctl",0x15a,0},
X	{"spr3data",0x15c,0},
X	{"spr3datb",0x15e,0},
X	{"spr4pos",0x160,0},
X	{"spr4ctl",0x162,0},
X	{"spr4data",0x164,0},
X	{"spr4datb",0x166,0},
X	{"spr5pos",0x168,0},
X	{"spr5ctl",0x16a,0},
X	{"spr5data",0x16c,0},
X	{"spr5datb",0x16e,0},
X	{"spr6pos",0x170,0},
X	{"spr6ctl",0x172,0},
X	{"spr6data",0x174,0},
X	{"spr6datb",0x176,0},
X	{"spr7pos",0x178,0},
X	{"spr7ctl",0x17a,0},
X	{"spr7data",0x17c,0},
X	{"spr7datb",0x17e,0},
X
X	{"color0",0x180,COLOR},
X	{"color1",0x182,COLOR},
X	{"color2",0x184,COLOR},
X	{"color3",0x186,COLOR},
X	{"color4",0x188,COLOR},
X	{"color5",0x18a,COLOR},
X	{"color6",0x18c,COLOR},
X	{"color7",0x18e,COLOR},
X	{"color8",0x190,COLOR},
X	{"color9",0x192,COLOR},
X	{"color10",0x194,COLOR},
X	{"color11",0x196,COLOR},
X	{"color12",0x198,COLOR},
X	{"color13",0x19a,COLOR},
X	{"color14",0x19c,COLOR},
X	{"color15",0x19e,COLOR},
X	{"color16",0x1a0,COLOR},
X	{"color17",0x1a2,COLOR},
X	{"color18",0x1a4,COLOR},
X	{"color19",0x1a6,COLOR},
X	{"color20",0x1a8,COLOR},
X	{"color21",0x1aa,COLOR},
X	{"color22",0x1ac,COLOR},
X	{"color23",0x1ae,COLOR},
X	{"color24",0x1b0,COLOR},
X	{"color25",0x1b2,COLOR},
X	{"color26",0x1b4,COLOR},
X	{"color27",0x1b6,COLOR},
X	{"color28",0x1b8,COLOR},
X	{"color29",0x1ba,COLOR},
X	{"color30",0x1bc,COLOR},
X	{"color31",0x1be,COLOR},
X	{"",-1,0}
X};
X
Xstruct regstruct *find_register_info(reg)
Xint reg;
X{
X	struct regstruct *regp;
X
X	for (regp = &registers[0]; regp->regid != -1; regp++)
X	{
X		if (regp->regid == reg)
X			return(regp);
X	}
X	return(0);
X}

END_OF_FILE
echo shar: NEWLINE appended to \"'registers.c'\"
if test 4587 -ne `wc -c <'registers.c'`; then
    echo shar: \"'registers.c'\" unpacked with wrong size!
fi
# end of 'registers.c'
fi
if test -f 'main.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'main.c'\"
else
echo shar: Extracting \"'main.c'\" \(841 characters\)
sed "s/^X//" >'main.c' <<'END_OF_FILE'
X
X#include <graphics/gfxbase.h>
X#include <graphics/view.h>
X#include <functions.h>
X#include <stdio.h>
X
Xstruct GfxBase *GfxBase = NULL;
X
X
Xmain()
X{
X	GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L); 
X
X	if (GfxBase == NULL)
X	{
X		fprintf(stderr,"couldn't open graphics.library\n");
X		exit(1);
X	}
X
X	printf("GfxBase's copinit list:\n");
X	copdis(GfxBase->copinit);
X
X	printf("\nTop Viewport's display L instructions:\n");
X	copdis(GfxBase->ActiView->ViewPort->DspIns->CopLStart);
X
X	printf("\nTop Viewport's display S instructions:\n");
X	copdis(GfxBase->ActiView->ViewPort->DspIns->CopSStart);
X
X	printf("\nCurrently active LOF copper list:\n");
X	copdis(GfxBase->ActiView->LOFCprList->start);
X
X	/* only seems to work in Interlace
X	 * printf("\nCurrently active SHF copper list:\n");
X	 * copdis(GfxBase->ActiView->SHFCprList->start);
X	 */
X}

END_OF_FILE
echo shar: NEWLINE appended to \"'main.c'\"
if test 842 -ne `wc -c <'main.c'`; then
    echo shar: \"'main.c'\" unpacked with wrong size!
fi
# end of 'main.c'
fi
if test -f 'makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'makefile'\"
else
echo shar: Extracting \"'makefile'\" \(107 characters\)
sed "s/^X//" >'makefile' <<'END_OF_FILE'
X
XCFLAGS= -n -Z8000
X
XOFILES= copdis.o main.o
X
Xall:	copdis
X
Xcopdis:	$(OFILES)
X	ln -g -o copdis $(OFILES) -lc

END_OF_FILE
echo shar: NEWLINE appended to \"'makefile'\"
if test 108 -ne `wc -c <'makefile'`; then
    echo shar: \"'makefile'\" unpacked with wrong size!
fi
# end of 'makefile'
fi
if test -f 'copdis.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'copdis.uu'\"
else
echo shar: Extracting \"'copdis.uu'\" \(23597 characters\)
sed "s/^X//" >'copdis.uu' <<'END_OF_FILE'
Xbegin 644 copdis
XM   #\P         #          (   PK   "^P    $   /I   ,*T[Z("1B
XM;'1D9&%T &)L:71T97(@9&5S=&EN871I;VX@96%R;'D@<F5A9" H9'5M;7D@
XM861D<F5S<RD 9&UA8V]N<@!$34$@8V]N=')O;" H86YD(&)L:71T97(@<W1A
XM='5S*2!R96%D '9P;W-R ')E860@=F5R="!M;W-T('-I9VYI9BX@8FET("AA
XM;F0@9G)A;64@9FQO<"D =FAP;W-R ')E860@=F5R="!A;F0@:&]R:7HN('!O
XM<VET:6]N(&]F(&)E86T 9'-K9&%T<@!D:7-K(&1A=&$@96%R;'D@<F5A9" H
XM9'5M;7D@861D<F5S<RD :F]Y,&1A= !J;WES=&EC:RUM;W5S92 P(&1A=&$@
XM*'9E<G0L:&]R:7HI &IO>3%D870 :F]Y<W1I8VLM;6]U<V4@,2!D871A("AV
XM97)T+&AO<FEZ*0!C;'AD870 8V]L;&ES:6]N(&1A=&$@*')E860@86YD(&-L
XM96%R*0!A9&MC;VYR &%U9&EO+"!D:7-K(&-O;G1R;VP@<F5G:7-T97(@<F5A
XM9 !P;W0P9&%T '!O="!C;W5N=&5R('!A:7(@,"!D871A("AV97)T+&AO<FEZ
XM*0!P;W0Q9&%T '!O="!C;W5N=&5R('!A:7(@,2!D871A("AV97)T+&AO<FEZ
XM*0!P;W1G;W( <&]T('!O<G0@9&%T82!R96%D '-E<F1A='( <V5R:6%L('!O
XM<G0@9&%T82!A;F0@<W1A='5S(')E860 9'-K8GET<@!D:7-K(&1A=&$@8GET
XM92!A;F0@<W1A='5S(')E860 :6YT96YA<@!I;G1E<G)U<'0@96YA8FQE(&)I
XM=',@<F5A9 !I;G1R97%R &EN=&5R<G5P="!R97%U97-T(&)I=',@<F5A9 !D
XM<VMP=&@ 9&ES:R!P;VEN=&5R("AH:6=H(#,@8FET<RD 9'-K<'1L &1I<VL@
XM<&]I;G1E<B H;&]W(#$U(&)I=',I &1S:VQE;@!D:7-K(&QE;F=T: !D<VMD
XM870 9&ES:R!$34$@9&%T82!W<FET90!R969P='( <F5F<F5S:"!P;VEN=&5R
XM '9P;W-W '=R:71E('9E<G0@;6]S="!S:6=N:68N(&)I=" H86YD(&9R86UE
XM(&9L;W I '9H<&]S=P!W<FET92!V97)T(&%N9"!H;W)I>B!P;W-I=&EO;B!O
XM9B!B96%M &-O<&-O;@!C;W!P97(@8V]N=')O;"!R96=I<W1E<B H0T1!3D<I
XM '-E<F1A= !S97)I86P@<&]R="!D871A(&%N9"!S=&]P(&)I=',@=W)I=&4 
XM<V5R<&5R '-E<FEA;"!P;W)T('!E<FEO9"!A;F0@8V]N=')O; !P;W1G;P!P
XM;W0@<&]R="!D871A('=R:71E(&%N9"!S=&%R= !J;WET97-T '=R:71E(&%L
XM;"!F;W5R(&IO>7-T:6-K+6UO=7-E(&-O=6YT97)S '-T<F5Q=0!S=')O8F4@
XM9F]R(&AO<FEZ('-Y;F,@=VET:"!V97)T:6-A;"!B;&%N:R!A;F0@15%5 '-T
XM<G9B; !S=')O8F4@9F]R(&AO<FEZ('-Y;F,@=VET:"!V97)T:6-A;"!B;&%N
XM:P!S=')H;W( <W1R;V)E(&9O<B!H;W)I>F]N=&%L('-Y;F, <W1R;&]N9P!S
XM=')O8F4@9F]R(&ED96YT:69I8V%T:6]N(&]F(&QO;F<@:&]R:7HN(&QI;F4 
XM8FQT8V]N, !B;&ET=&5R(&-O;G1R;VP@<F5G:7-T97(@, !B;'1C;VXQ &)L
XM:71T97(@8V]N=')O;"!R96=I<W1E<B Q &)L=&%F=VT 8FQI='1E<B!F:7)S
XM="!W;W)D(&UA<VL@9F]R('-O=7)C92!! &)L=&%L=VT 8FQI='1E<B!L87-T
XM('=O<F0@;6%S:R!F;W(@<V]U<F-E($$ 8FQT8W!T: !B;&ET=&5R('!O:6YT
XM97(@=&\@<V]U<F-E($,@*&AI9V@@,R!B:71S*0!B;'1C<'1L &)L:71T97(@
XM<&]I;G1E<B!T;R!S;W5R8V4@0R H;&]W(#$U(&)I=',I &)L=&)P=&@ 8FQI
XM='1E<B!P;VEN=&5R('1O('-O=7)C92!"("AH:6=H(#,@8FET<RD 8FQT8G!T
XM; !B;&ET=&5R('!O:6YT97(@=&\@<V]U<F-E($(@*&QO=R Q-2!B:71S*0!B
XM;'1A<'1H &)L:71T97(@<&]I;G1E<B!T;R!S;W5R8V4@02 H:&EG:" S(&)I
XM=',I &)L=&%P=&P 8FQI='1E<B!P;VEN=&5R('1O('-O=7)C92!!("AL;W<@
XM,34@8FET<RD 8FQT9'!T: !B;&ET=&5R('!O:6YT97(@=&\@<V]U<F-E($0@
XM*&AI9V@@,R!B:71S*0!B;'1D<'1L &)L:71T97(@<&]I;G1E<B!T;R!S;W5R
XM8V4@1" H;&]W(#$U(&)I=',I &)L='-I>F4 8FQI='1E<B!S=&%R="!A;F0@
XM<VEZ92 H=VEN9&]W('=I9'1H+"!H96EG:'0I &)L=&-M;V0 8FQI='1E<B!M
XM;V1U;&\@9F]R('-O=7)C92!# &)L=&)M;V0 8FQI='1E<B!M;V1U;&\@9F]R
XM('-O=7)C92!" &)L=&%M;V0 8FQI='1E<B!M;V1U;&\@9F]R('-O=7)C92!!
XM &)L=&1M;V0 8FQI='1E<B!M;V1U;&\@9F]R('-O=7)C92!$ &)L=&-D870 
XM8FQI='1E<B!S;W5R8V4@0R!D871A &)L=&)D870 8FQI='1E<B!S;W5R8V4@
XM0B!D871A &)L=&%D870 8FQI='1E<B!S;W5R8V4@02!D871A &1S:W-Y;F, 
XM9&ES:R!S>6YC('!A='1E<FX@9F]R(&1I<VL@<F5A9 !C;W Q;&-H &-O<'!E
XM<B!F:7)S="!L;V-A=&EO;B H:&EG:" S(&)I=',I &-O<#%L8VP 8V]P<&5R
XM(&9I<G-T(&QO8V%T:6]N("AL;W<@,34@8FET<RD 8V]P,FQC: !C;W!P97(@
XM<V5C;VYD(&QO8V%T:6]N("AH:6=H(#,@8FET<RD 8V]P,FQC; !C;W!P97(@
XM<V5C;VYD(&QO8V%T:6]N("AL;W<@,34@8FET<RD 8V]P:FUP,0!R97-T87)T
XM(&-O<'!E<B!A="!F:7)S="!L;V-A=&EO;@!C;W!J;7 R ')E<W1A<G0@8V]P
XM<&5R(&%T('-E8V]N9"!L;V-A=&EO;@!C;W!I;G, 8V]P<&5R(&EN<W1R=6-T
XM:6]N(&9E=&-H(&ED96YT:69Y &1I=W-T<G0 9&ES<&QA>2!W:6YD;W<@<W1A
XM<G0@*'5P<&5R(&QE9G0@=F5R="UH;W)I>B!P;W-I=&EO;BD 9&EW<W1O< !D
XM:7-P;&%Y('=I;F1O=R!S=&]P("AL;W=E<B!R:6=H="!V97)T+6AO<FEZ('!O
XM<VET:6]N*0!D9&9S=')T &1I<W!L87D@8FET('!L86YE(&1A=&$@9F5T8V@@
XM<W1A<G0@*&AO<FEZ+B!P;W-I=&EO;BD 9&1F<W1O< !D:7-P;&%Y(&)I="!P
XM;&%N92!D871A(&9E=&-H('-T;W @*&AO<FEZ+B!P;W-I=&EO;BD 9&UA8V]N
XM $1-02!C;VYT<F]L('=R:71E("AC;&5A<B!O<B!S970I &-L>&-O;@!C;VQL
XM:7-I;VX@8V]N=')O; !I;G1E;F$ :6YT97)R=7!T(&5N86)L92!B:71S &EN
XM=')E<0!I;G1E<G)U<'0@<F5Q=65S="!B:71S &%D:V-O;@!A=61I;RP@9&ES
XM:RP@54%25"!C;VYT<F]L &%U9#!L8V@ 875D:6\@8VAA;FYE;" P(&QO8V%T
XM:6]N("AH:6=H(#,@8FET<RD 875D,&QC; !A=61I;R!C:&%N;F5L(# @;&]C
XM871I;VX@*&QO=R Q-2!B:71S*0!A=60P;&5N &%U9&EO(&-H86YN96P@,"!L
XM96YG=&@ 875D,'!E<@!A=61I;R!C:&%N;F5L(# @<&5R:6]D &%U9#!V;VP 
XM875D:6\@8VAA;FYE;" P('9O;'5M90!A=60P9&%T &%U9&EO(&-H86YN96P@
XM,"!D871A &%U9#%L8V@ 875D:6\@8VAA;FYE;" Q(&QO8V%T:6]N("AH:6=H
XM(#,@8FET<RD 875D,6QC; !A=61I;R!C:&%N;F5L(#$@;&]C871I;VX@*&QO
XM=R Q-2!B:71S*0!A=60Q;&5N &%U9&EO(&-H86YN96P@,2!L96YG=&@ 875D
XM,7!E<@!A=61I;R!C:&%N;F5L(#$@<&5R:6]D &%U9#%V;VP 875D:6\@8VAA
XM;FYE;" Q('9O;'5M90!A=60Q9&%T &%U9&EO(&-H86YN96P@,2!D871A &%U
XM9#)L8V@ 875D:6\@8VAA;FYE;" R(&QO8V%T:6]N("AH:6=H(#,@8FET<RD 
XM875D,FQC; !A=61I;R!C:&%N;F5L(#(@;&]C871I;VX@*&QO=R Q-2!B:71S
XM*0!A=60R;&5N &%U9&EO(&-H86YN96P@,B!L96YG=&@ 875D,G!E<@!A=61I
XM;R!C:&%N;F5L(#(@<&5R:6]D &%U9#)V;VP 875D:6\@8VAA;FYE;" R('9O
XM;'5M90!A=60R9&%T &%U9&EO(&-H86YN96P@,B!D871A &%U9#-L8V@ 875D
XM:6\@8VAA;FYE;" S(&QO8V%T:6]N("AH:6=H(#,@8FET<RD 875D,VQC; !A
XM=61I;R!C:&%N;F5L(#,@;&]C871I;VX@*&QO=R Q-2!B:71S*0!A=60S;&5N
XM &%U9&EO(&-H86YN96P@,R!L96YG=&@ 875D,W!E<@!A=61I;R!C:&%N;F5L
XM(#,@<&5R:6]D &%U9#-V;VP 875D:6\@8VAA;FYE;" S('9O;'5M90!A=60S
XM9&%T &%U9&EO(&-H86YN96P@,R!D871A &)P;#%P=&@ 8FQI='1E<B!P;&%N
XM92 Q('!O:6YT97(@*&AI9V@@,R!B:71S*0!B<&PQ<'1L &)L:71T97(@<&QA
XM;F4@,2!P;VEN=&5R("AL;W<@,34@8FET<RD 8G!L,G!T: !B;&ET=&5R('!L
XM86YE(#(@<&]I;G1E<B H:&EG:" S(&)I=',I &)P;#)P=&P 8FQI='1E<B!P
XM;&%N92 R('!O:6YT97(@*&QO=R Q-2!B:71S*0!B<&PS<'1H &)L:71T97(@
XM<&QA;F4@,R!P;VEN=&5R("AH:6=H(#,@8FET<RD 8G!L,W!T; !B;&ET=&5R
XM('!L86YE(#,@<&]I;G1E<B H;&]W(#$U(&)I=',I &)P;#1P=&@ 8FQI='1E
XM<B!P;&%N92 T('!O:6YT97(@*&AI9V@@,R!B:71S*0!B<&PT<'1L &)L:71T
XM97(@<&QA;F4@-"!P;VEN=&5R("AL;W<@,34@8FET<RD 8G!L-7!T: !B;&ET
XM=&5R('!L86YE(#4@<&]I;G1E<B H:&EG:" S(&)I=',I &)P;#5P=&P 8FQI
XM='1E<B!P;&%N92 U('!O:6YT97(@*&QO=R Q-2!B:71S*0!B<&PV<'1H &)L
XM:71T97(@<&QA;F4@-B!P;VEN=&5R("AH:6=H(#,@8FET<RD 8G!L-G!T; !B
XM;&ET=&5R('!L86YE(#8@<&]I;G1E<B H;&]W(#$U(&)I=',I &)P;&-O;C  
XM8FET('!L86YE(&-O;G1R;VP@8FET<P!B<&QC;VXQ &)I="!P;&%N92!S8W)O
XM;&P@=F%L=65S(&9O<B!01C$@)B!01C( 8G!L8V]N,@!B:70@<&QA;F4@<')I
XM;W)I='D@8V]N=')O; !B<&PQ;6]D &)I="!P;&%N92!M;V1U;&\@9F]R(&]D
XM9"!P;&%N97, 8G!L,FUO9 !B:70@<&QA;F4@;6]D=6QO(&9O<B!E=F5N('!L
XM86YE<P!B<&PQ9&%T &)I="!P;&%N92 Q(&1A=&$@*'!A<F%L;&5L+71O+7-E
XM<FEA;"!C;VYV97)T*0!B<&PR9&%T &)I="!P;&%N92 R(&1A=&$@*'!A<F%L
XM;&5L+71O+7-E<FEA;"!C;VYV97)T*0!B<&PS9&%T &)I="!P;&%N92 S(&1A
XM=&$@*'!A<F%L;&5L+71O+7-E<FEA;"!C;VYV97)T*0!B<&PT9&%T &)I="!P
XM;&%N92 T(&1A=&$@*'!A<F%L;&5L+71O+7-E<FEA;"!C;VYV97)T*0!B<&PU
XM9&%T &)I="!P;&%N92 U(&1A=&$@*'!A<F%L;&5L+71O+7-E<FEA;"!C;VYV
XM97)T*0!B<&PV9&%T &)I="!P;&%N92 V(&1A=&$@*'!A<F%L;&5L+71O+7-E
XM<FEA;"!C;VYV97)T*0!S<'(P<'1H '-P<FET92 P('!O:6YT97(@*&AI9V@@
XM,R!B:71S*0!S<'(P<'1L '-P<FET92 P('!O:6YT97(@*&QO=R Q-2!B:71S
XM*0!S<'(Q<'1H '-P<FET92 Q('!O:6YT97(@*&AI9V@@,R!B:71S*0!S<'(Q
XM<'1L '-P<FET92 Q('!O:6YT97(@*&QO=R Q-2!B:71S*0!S<'(R<'1H '-P
XM<FET92 R('!O:6YT97(@*&AI9V@@,R!B:71S*0!S<'(R<'1L '-P<FET92 R
XM('!O:6YT97(@*&QO=R Q-2!B:71S*0!S<'(S<'1H '-P<FET92 S('!O:6YT
XM97(@*&AI9V@@,R!B:71S*0!S<'(S<'1L '-P<FET92 S('!O:6YT97(@*&QO
XM=R Q-2!B:71S*0!S<'(T<'1H '-P<FET92 T('!O:6YT97(@*&AI9V@@,R!B
XM:71S*0!S<'(T<'1L '-P<FET92 T('!O:6YT97(@*&QO=R Q-2!B:71S*0!S
XM<'(U<'1H '-P<FET92 U('!O:6YT97(@*&AI9V@@,R!B:71S*0!S<'(U<'1L
XM '-P<FET92 U('!O:6YT97(@*&QO=R Q-2!B:71S*0!S<'(V<'1H '-P<FET
XM92 V('!O:6YT97(@*&AI9V@@,R!B:71S*0!S<'(V<'1L '-P<FET92 V('!O
XM:6YT97(@*&QO=R Q-2!B:71S*0!S<'(W<'1H '-P<FET92 W('!O:6YT97(@
XM*&AI9V@@,R!B:71S*0!S<'(W<'1L '-P<FET92 W('!O:6YT97(@*&QO=R Q
XM-2!B:71S*0!S<'(P<&]S '-P<FET92 P('9E<G0M:&]R:7H@<W1A<G0@<&]S
XM:71I;VX <W!R,&-T; !S<')I=&4@,"!V97)T('-T;W @<&]S:71I;VX@86YD
XM(&-O;G1R;VP@9&%T80!S<'(P9&%T80!S<')I=&4@,"!I;6%G92!D871A(')E
XM9VES=&5R($$ <W!R,&1A=&( <W!R:71E(# @:6UA9V4@9&%T82!R96=I<W1E
XM<B!" '-P<C%P;W, <W!R:71E(#$@=F5R="UH;W)I>B!S=&%R="!P;W-I=&EO
XM;@!S<'(Q8W1L '-P<FET92 Q('9E<G0@<W1O<"!P;W-I=&EO;B!A;F0@8V]N
XM=')O;"!D871A '-P<C%D871A '-P<FET92 Q(&EM86=E(&1A=&$@<F5G:7-T
XM97(@00!S<'(Q9&%T8@!S<')I=&4@,2!I;6%G92!D871A(')E9VES=&5R($( 
XM<W!R,G!O<P!S<')I=&4@,B!V97)T+6AO<FEZ('-T87)T('!O<VET:6]N '-P
XM<C)C=&P <W!R:71E(#(@=F5R="!S=&]P('!O<VET:6]N(&%N9"!C;VYT<F]L
XM(&1A=&$ <W!R,F1A=&$ <W!R:71E(#(@:6UA9V4@9&%T82!R96=I<W1E<B!!
XM '-P<C)D871B '-P<FET92 R(&EM86=E(&1A=&$@<F5G:7-T97(@0@!S<'(S
XM<&]S '-P<FET92 S('9E<G0M:&]R:7H@<W1A<G0@<&]S:71I;VX <W!R,V-T
XM; !S<')I=&4@,R!V97)T('-T;W @<&]S:71I;VX@86YD(&-O;G1R;VP@9&%T
XM80!S<'(S9&%T80!S<')I=&4@,R!I;6%G92!D871A(')E9VES=&5R($$ <W!R
XM,V1A=&( <W!R:71E(#,@:6UA9V4@9&%T82!R96=I<W1E<B!" '-P<C1P;W, 
XM<W!R:71E(#0@=F5R="UH;W)I>B!S=&%R="!P;W-I=&EO;@!S<'(T8W1L '-P
XM<FET92 T('9E<G0@<W1O<"!P;W-I=&EO;B!A;F0@8V]N=')O;"!D871A '-P
XM<C1D871A '-P<FET92 T(&EM86=E(&1A=&$@<F5G:7-T97(@00!S<'(T9&%T
XM8@!S<')I=&4@-"!I;6%G92!D871A(')E9VES=&5R($( <W!R-7!O<P!S<')I
XM=&4@-2!V97)T+6AO<FEZ('-T87)T('!O<VET:6]N '-P<C5C=&P <W!R:71E
XM(#4@=F5R="!S=&]P('!O<VET:6]N(&%N9"!C;VYT<F]L(&1A=&$ <W!R-61A
XM=&$ <W!R:71E(#4@:6UA9V4@9&%T82!R96=I<W1E<B!! '-P<C5D871B '-P
XM<FET92 U(&EM86=E(&1A=&$@<F5G:7-T97(@0@!S<'(V<&]S '-P<FET92 V
XM('9E<G0M:&]R:7H@<W1A<G0@<&]S:71I;VX <W!R-F-T; !S<')I=&4@-B!V
XM97)T('-T;W @<&]S:71I;VX@86YD(&-O;G1R;VP@9&%T80!S<'(V9&%T80!S
XM<')I=&4@-B!I;6%G92!D871A(')E9VES=&5R($$ <W!R-F1A=&( <W!R:71E
XM(#8@:6UA9V4@9&%T82!R96=I<W1E<B!" '-P<C=P;W, <W!R:71E(#<@=F5R
XM="UH;W)I>B!S=&%R="!P;W-I=&EO;@!S<'(W8W1L '-P<FET92 W('9E<G0@
XM<W1O<"!P;W-I=&EO;B!A;F0@8V]N=')O;"!D871A '-P<C=D871A '-P<FET
XM92 W(&EM86=E(&1A=&$@<F5G:7-T97(@00!S<'(W9&%T8@!S<')I=&4@-R!I
XM;6%G92!D871A(')E9VES=&5R($( 8V]L;W(P  !C;VQO<C$  &-O;&]R,@  
XM8V]L;W(S  !C;VQO<C0  &-O;&]R-0  8V]L;W(V  !C;VQO<C<  &-O;&]R
XM.   8V]L;W(Y  !C;VQO<C$P  !C;VQO<C$Q  !C;VQO<C$R  !C;VQO<C$S
XM  !C;VQO<C$T  !C;VQO<C$U  !C;VQO<C$V  !C;VQO<C$W  !C;VQO<C$X
XM  !C;VQO<C$Y  !C;VQO<C(P  !C;VQO<C(Q  !C;VQO<C(R  !C;VQO<C(S
XM  !C;VQO<C(T  !C;VQO<C(U  !C;VQO<C(V  !C;VQO<C(W  !C;VQO<C(X
XM  !C;VQO<C(Y  !C;VQO<C,P  !C;VQO<C,Q     $Y5__Q![( "*TC__& >
XM(&W__# H  BP;0 (9@@@+?_\3EU.=0:M    #/_\(&W__ QH__\ "&;6< !@
XMY$Y5_^@@;0 (""@    !9P  XB!M  @P$.! P'P _SM __X@;0 (,!#B0,!\
XM '\[0/_\(&T "# H  +@0,!\ '\[0/_Z(&T "# H  +B0,!\ '\[0/_X(&T 
XM"# H  + ?(  .T#_]B!M  @(*     -G#$AZ 0!.N@@"6$]@"DAZ /I.N@?V
XM6$]*;?_V9@Q(>@#P3KH'YEA/8 I(>@#I3KH'VEA//RW__#\M__Y(>@#93KH'
XMR%!/(&T "#\H  (@;0 (/Q!(>@#13KH'L%!/#&T ?__Z9@@,;0!___AG$C\M
XM__@_+?_Z2'H PTZZ!XY03V!T(&T "# 0P'P!_SM __0_+?_T3KK^OE1/*T#_
XM\$JM__!G%"!M__ K4/_L(&W_\"MH  3_Z& 00?H E2M(_^Q!^@"<*TC_Z"\M
XM_^P@;0 (/R@  DAZ (E.N@<P3^\ "B!M_^A*$&<.+RW_Z$AZ 'U.N@<84$](
XM>@!X3KH'#EA/3EU.=0ES:VEP  EW86ET  EB9BP "0!V<&]S/25D+&AP;W,]
XM)60 :6YS=')U8W1I;VX@)7@L("5X"@ L=F-O;7 ])60L:&-O;7 ])60* %5.
XM2TY/5TY?3U!#3T1%   );6]V90DE>"PE<P ).R5S  H 3E4  $JM  AF$DAZ
XM $)(;(H"3KH!TE!/3EU.=2!M  A8K0 (+PA.NOWV6$\@;0 (#%#__V<,(&T 
XM" QH__X  F;:+RT "$ZZ_=983V#*8V]P9&ES.B!C;W!P97(@;&ES="!P;VEN
XM=&5R(&ES(&YU;&P*  !.50  0J=(>@"J3KH1Q%!/*4")/DJLB3YF&$AZ *=(
XM;(H"3KH!3E!//SP  4ZZ#T)43TAZ *].N@7L6$\@;(D^+R@ )DZZ_T983TAZ
XM +!.N@746$\@;(D^(F@ (B!1(F@ ""\I !1.NO\D6$](>@"W3KH%LEA/(&R)
XM/B)H "(@42)H  @O*0 83KK_ EA/2'H ODZZ!9!83R!LB3XB:  B(&D !"\H
XM  1.NO[B6$].74YU9W)A<&AI8W,N;&EB<F%R>0!C;W5L9&XG="!O<&5N(&=R
XM87!H:6-S+FQI8G)A<GD* $=F>$)A<V4G<R!C;W!I;FET(&QI<W0Z"@ *5&]P
XM(%9I97=P;W)T)W,@9&ES<&QA>2!,(&EN<W1R=6-T:6]N<SH*  I4;W @5FEE
XM=W!O<G0G<R!D:7-P;&%Y(%,@:6YS=')U8W1I;VYS.@H "D-U<G)E;G1L>2!A
XM8W1I=F4@3$]&(&-O<'!E<B!L:7-T.@H 3E4  "EM  B+FDAM ! O+0 ,2'H 
XM#DZZ!41/[P ,3EU.=4Y5   O+(N:/RT "$ZZ"09<3TY=3G5A<$/LBYI%[(N:
XMM<EF#C(\ !1K"'0 (L)1R?_\*4^+HBQX  0I3HNF2.> @ @N  0!*6<02_H 
XM"$ZN_^)@!D*G\U].<T/Z "!.KOYH*4"+JF8,+CP  X '3J[_E& $3KH &E!/
XM3G5D;W,N;&EB<F%R>0!)^0  ?_Y.=4Y5   O"DAY  $  # LBX[!_  &+P!.
XMN@]6*4"+KE!/9A1"ITAY  $  $ZZ#QI03RYLBZ).=2!LBZY":  $(&R+KC%\
XM  $ $"!LBZXQ?  !  H@;(NB("R+HI"H  10@"E B[(@;(NR(+Q-04Y80J=.
XMN@\*)$!*J@"L6$]G+B\M  PO+0 (+PI.N@"N.7P  8NV(&R+K@!H@   !"!L
XMBZX :(    I/[P ,8$)(:@!<3KH/*$AJ %Q.N@[F*4"+N"!LB[A*J  D4$]G
XM$"!LB[@B:  D+Q%.N@X&6$\O+(NX+PI.N@)H*6R+N(N\4$].N@X&(&R+KB" 
XM3KH.)B!LBZXA0  &9Q9(> /M2'H *DZZ#@(@;(NN(4  #%!/+RR+O#\LB\!.
XMNORV0F=.N@P@4$\D7TY=3G4J $Y5  !(YPPP)&T $"!M  A*J "L9Q@@;0 (
XM("@ K.6 *  @1" H !#E@"9 8 0F;(N0$!-(@$C T*T #%2 .4"+PD*G,"R+
XMPDC +P!.N@WH*4"+Q%!/9@A,WPPP3EU.=1 32( Z #\%($M2B"\(+RR+Q$ZZ
XM 7XP!4C ($#1[(O$0_H!1!#99OP_+0 .+PHO+(O$3KH!.B!LB\1",%  .7P 
XM 8O , 5(P-"LB\0F0%*+)$M/[P 4$!-(@#H L'P (&<8NGP "6<2NGP #&<,
XMNGP #6<&NGP "F8$4HM@V P3 "!M>@P3 ")F+E*+($M2BQ 02( Z &<>($I2
XMBA"%NGP (F80#!, (F8$4HM@!D(J__]@ F#68#@@2U*+$!!(@#H 9R:Z?  @
XM9R"Z?  )9QJZ?  ,9Q2Z?  -9PZZ?  *9P@@2E**$(5@SB!*4HI"$$I%9@)3
XMBU)LB\!@ /]:0A)"IS LB\!20$C Y8 O $ZZ#,8I0(N\4$]F"$)LB\!@ /[8
XM>@ F;(O$8"0P!4C Y8 @;(N\(8L( "!+( A*&&;\D<!3B# (4D!(P-? 4D6Z
XM;(O ;=8P!4C Y8 @;(N\0K ( &  _I0@ # \?_]@!# O  P@;P $2AAF_%-(
XM(F\ "%- $-E7R/_\9P)"$" O  1.=4SO P  !" (,B\ #& "$-E7R?_\9P92
XM06 "0AA1R?_\3G5.50  2.<.,"1M  A"ITAZ (Y.N@Q0*4"+R%!/9@A,WPQP
XM3EU.=2!M  PB:  D+RD !$ZZ#( H %A/9U)(>@!M($0O*  V3KH,4B9 2H!0
XM3V<T2'@#[2\+3KH+;"P 4$]G)" &Y8 J "!%)6@ " "D)48 G$AX ^U(>@ X
XM3KH+2"5  *!03R\$3KH,'EA/+RR+R$ZZ"WY"K(O(6$]@@&EC;VXN;&EB<F%R
XM>0!724Y$3U< *@!.50  2&T #"\M  A(>@1@3KH F$_O  Q.74YU3E4  $CG
XM"" D;0 .#&T !  29@@@;0 (*!!@'$IM  QO#"!M  AP # 0* !@"B!M  @P
XM$$C * !";0 22FT #&P01&T #$J$; A$A#M\  $ $C(M  Q(P2 $3KH#D$'L
XMB4)3BA2P   R+0 ,2,$@!$ZZ X8H &;:2FT $F<&4XH4O  M( I,WP003EU.
XM=4Y5_R)(YP@P)&T ""9M  Q";?_Z*VT $/_\($M2BQ 02( X &<  NZX?  E
XM9@ "S$(M_S [?  !__@[?  @__8[?"<0__0@2U*+$!!(@#@ L'P +68.0FW_
XM^"!+4HL0$$B . "X?  P9A [?  P__8@2U*+$!!(@#@ N'P *F88(&W__%2M
XM__P[4/_R($M2BQ 02( X & R0FW_\F <,"W_\L'\  K01)!\ # [0/_R($M2
XMBQ 02( X # $4D!![(E4"#   @  9M2X?  N9EH@2U*+$!!(@#@ L'P *F88
XM(&W__%2M__P[4/_T($M2BQ 02( X & R0FW_]& <,"W_],'\  K01)!\ # [
XM0/_T($M2BQ 02( X # $4D!![(E4"#   @  9M0[?  "__"X? !L9A(@2U*+
XM$!!(@#@ .WP !/_P8!"X? !H9@H@2U*+$!!(@#@ , 1(P&!Z.WP "/_N8!8[
XM?  *_^Y@#CM\ !#_[F &.WS_]O_N/RW_\$AM_S _+?_N+RW__$ZZ_>0K0/_J
XM,"W_\$C T:W__$_O  Q@7"!M__Q8K?_\(E K2?_J( E*&6;\D\!3B3M)__!@
XM2B!M__Q4K?_\.!!![?\O*TC_ZA"$8"B0O    &-GXE. 9Y*0O     MG /]R
XM68!GLE6 9P#_<%> 9P#_<F#,0>W_,)'M_^H[2/_P,"W_\+!M__1O!CMM__3_
XM\$IM__AG:"!M_^H,$  M9PH@;?_J#!  *V8N#&T ,/_V9B93;?_R(&W_ZE*M
XM_^H0$$B /P!.DK!\__]43V8*</],WPP03EU.=6 6/RW_]DZ2L'S__U1/9@1P
XM_V#D4FW_^C M__)3;?_RL&W_\&[<0FW_[F @(&W_ZE*M_^H0$$B /P!.DK!\
XM__]43V8$</]@L%)M_^X@;?_J2A!G"C M_^ZP;?_T;<XP+?_NT6W_^DIM__AF
XM*& 8/SP ($Z2L'S__U1/9@9P_V  _WA2;?_Z,"W_\E-M__*P;?_P;MI@%C\$
XM3I*P?/__5$]F!G#_8 #_4E)M__I@ /T(,"W_^F  _T)(YT@ 0H1*@&H$1(!2
XM1$J!:@9$@0I$  %A/DI$9P)$@$S? !)*@$YU2.=( $*$2H!J!$2 4D1*@6H"
XM1(%A&B !8-@O 6$2( $B'TJ 3G4O 6$&(A]*@$YU2.<P $A!2D%F($A!-@$T
XM $) 2$" PR( 2$ R H+#, %"04A!3-\ #$YU2$$F 2( 0D%(04A 0D!T#]" 
XMTX&V@6($DH-20%'*__),WP ,3G5.50  2&R)[#\M  A.N@ (7$].74YU3E4 
XM "\$."T ""\M  H_!$ZZ #"X?  *7$]F)"!M  H0*  ,2( (   '9Q0_//__
XM+RT "DZZ /1<3R@?3EU.=6#X3E4  "\*)&T "B!2L>H !&48,"T ",!\ /\_
XM "\*3KH R%Q/)%].74YU(%)2DA M  D0@$B P'P _V#H3E4  "\*0>R)UB1(
XM($K5_    !8O"&$06$]![(N.M<AEZB1?3EU.=4Y5  !(YP@@)&T "'@ ( IF
XM"G#_3-\$$$Y=3G5**@ ,9U (*@ "  QG##\\__\O"F%2. !<3Q J  U(@#\ 
XM3KH%'(A ""H  0 ,5$]G"B\J  A.N@(N6$\(*@ %  QG$B\J !).N@+ +RH 
XM$DZZ A103T*20JH !$*J  A"*@ ,, 1@D$Y5__Y(YP@@)&T "$'Z_T8I2(O,
XM""H !  ,9PIP_TS?!!!.74YU""H  @ ,9S @4I'J  @X"#\$+RH "! J  U(
XM@#\ 3KH"@+!$4$]G$ CJ  0 #$*20JH !'#_8, ,;?__  QF$ BJ  ( #$*2
XM0JH !'  8*A*J@ (9@@O"DZZ )I83PQJ  $ $&8J&VT #?__/SP  4AM__\0
XM*@ -2( _ $ZZ B*P?  !4$]FH# M  Q@ /]J)*H "# J !!(P-"J  @E0  $
XM".H  @ ,(%)2DA M  T0@$B P'P _V  _SY.50  +PI![(G6)$A**@ ,9QC5
XM_    !9![(N.M<AE"'  )%].74YU8.)"DD*J  1"J@ (( I@ZDY5__PO"B1M
XM  @_/ 0 3KH P"M __Q43V88-7P  0 0($K1_     XE2  ()%].74YU-7P$
XM   0".H  0 ,)6W__  ($"H #4B /P!.N@#B2D!43V<& "H @  ,8,Y.50  
XM2.< ,"1LBYY@%"92("H !%" +P O"DZZ!$Y03R1+( IFZ$*LBYY,WPP 3EU.
XM=4Y5   O"D'Z_\8I2(O00J<@+0 (4( O $ZZ _PD0$J 4$]F"'  )%].74YU
XM)*R+GB5M  @ !"E*BYX@"E" 8.9.50  <  P+0 (+P!ALEA/3EU.=4Y5  !(
XMYP PE\LD;(N>8 X@;0 (48BQRF<2)DHD4B *9NYP_TS?# !.74YU( MG!":2
XM8 0I4HN>("H !%" +P O"DZZ Z!P %!/8-A.50  +PHP+0 (P?P !B1 U>R+
XMKDIM  AM#C M  BP;(N.; 1*DF8..7P  HO4</\D7TY=3G4P+0 (P?P !B!L
XMBZXO, @ 3KH"QDJ 6$]G!' !8 )P &#83E4  "\M  A.N@*02H!83V8.3KH"
XMFCE B]1P_TY=3G5P &#X3E4  $CG#" X+0 (3KH <# $P?P !B1 U>R+KDI$
XM;0JX;(N.; 1*DF80.7P  HO4</],WP0P3EU.=3 J  3 ?  #9@HY?  %B]1P
XM_V#D<  P+0 .+P O+0 *+Q).N@)F*@"PO/____]/[P ,9@Q.N@(:.4"+U'#_
XM8+@@!6"T3E7__$AX$ !"ITZZ LXK0/_\"   #%!/9Q)*;(NV9@@@+?_\3EU.
XM=4ZZ  9P &#T3E4  $AX  1(>@ <3KH!\"\ 3KH" C\\  %.N@ .3^\ #DY=
XM3G5>0PH 3E4  $JLB\QG!B!LB\Q.D#\M  A.N@ (5$].74YU3E7__"\$,"T 
XM"$C *T#__$JLBZYG*'@ 8 H_!$ZZ /Y43U)$N&R+CFWP,"R+CL'\  8O "\L
XMBZY.N@'L4$]*K(O09P8@;(O03I!*K(N49PHO+(N43KH!:%A/2JR+UF<((&R+
XMUB"LB]I*K(O>9PHO+(O>3KH!A%A/2JR+XF<*+RR+XDZZ 7183TJLB^9G"B\L
XMB^9.N@%D6$]*K(OJ9PHO+(OJ3KH!5%A/+'@ ! @N  0!*6<4+PU+^@ *3J[_
XMXBI?8 9"I_-?3G-*K(NX9C!*K(O$9R@P+(O"2, O "\LB\1.N@%$,"R+P%) 
XM2,#E@"\ +RR+O$ZZ 3!/[P 08 Y.N@$>+RR+N$ZZ 4Y83R M__PN;(NB3G4H
XM'TY=3G5.50  2.<.(#@M  @P!,'\  8D0-7LBZY*1&T*N&R+CFP$2I)F$#E\
XM  *+U'#_3-\$<$Y=3G4(*@ '  1F""\23KH "EA/0I)P &#B(B\ !"QLBZI.
XM[O_<(B\ !"QLBZI.[O^"(B\ !"QLBZI.[O^X+&R+JD[N_\HL;(NJ3N[_?"(O
XM  0L;(NJ3N[_*$SO  8 !"QLBZI.[O_B+&R+JD[N_\1.^@ "(B\ !"QLBZI.
XM[O^F3.\ #@ $+&R+JD[N_]!(YP$$3.\@@  ,+&R+IDZN_Y1,WR" 3G5.^@ "
XM(F\ !"QLBZ9.[OYB3.\  P $+&R+ID[N_SHB;P $+&R+ID[N_MHL;(NF3N[_
XM?")O  0@+P (+&R+ID[N_RX@;P $+&R+ID[N_HQ.^@ "+&R+IB)O  0@+P (
XM3N[]V")O  0L;(NF3N[^ADSO  , !"QLBZ9.[O[.(&\ !"QLBZ9.[OZ 3.\#
XM   $+&R+R$[N_Z @;P $+&R+R$[N_Z8@;P $+&R+R$[N_[(   /L     0  
XM  $  "":         _(   /J   "Y@    0    ,         #L   !#  ( 
XM     &D   !O  0      )L   "B  8      ,@   #0  @      /4   #]
XM  H      2    $H  P      4L   %2  X      7(   %Z !       9P 
XM  &D !(      <D   '1 !0      ?8   '] !8      A    (8 !@     
XM CD   )! !H      F    )H !P      H,   *+ !X      J<   *N "  
XM     LD   +0 "(      NL   +R "0      OX   ,% "8      QD   ,@
XM "@      S    ,V "H      V,   -J "P      Y    .7 "X      [< 
XM  .^ #       ^,   /J #(     ! D   0/ #0     !"T   0U #8     
XM!%P   1C #@     !)4   2< #H     !,8   3- #P     !.@   3P #X 
XM    !1X   4F $      !4$   5) $(     !60   5L $0     !9$   69
XM $8     !;T   7% $@     !>\   7W $H     !B$   8I $P     !E, 
XM  9; $X     !H4   :- %      !K<   :_ %(     !ND   ;Q %0     
XM!QL   <C %8     !TT   =5 %@     !X,   >+ &      !Z<   >O &( 
XM    !\L   ?3 &0     !^\   ?W &8     "!,   @; '      "#$   @Y
XM '(     "$\   A7 '0     "&T   AU 'X     ")4   B= (      ",$ 
XM  C) ((     ".T   CU (0     "1H   DB (8     "4<   E/ (@     
XM"7    EX (H     "9H   FA (P     "<,   G+ (X     "@$   H) )  
XM    "C\   I' )(     "GP   J$ )0     "K@   J_ )8     "N    KG
XM )@     "OD   L  )H     "Q8   L= )P     "S0   L[ )X     "U4 
XM  M= *      "X0   N, *(     "[,   N[ *0     "](   O: *8     
XM"_$   OY *@     #!    P8 *H     #"T   PU +      #%P   QD +( 
XM    #(L   R3 +0     #*H   RR +8     #,D   S1 +@     #.@   SP
XM +H     #04   T- ,      #30   T\ ,(     #6,   UK ,0     #8( 
XM  V* ,8     #:$   VI ,@     #<    W( ,H     #=T   WE -      
XM#@P   X4 -(     #CL   Y# -0     #EH   YB -8     #GD   Z! -@ 
XM    #I@   Z@ -H     #K4   Z] .      #N,   [K .(     #Q$   \9
XM .0     #S\   ]' .8     #VT   ]U .@     #YL   ^C .H     #\D 
XM  _1 .P     #_<   __ .X     $"4  ! M /      $%,  !!; /(     
XM$($  !") /0     $*\  !"W /8     $-T  !#E 0      $/P  !$$ 0( 
XM    $2H  !$R 00     $4T  !%5 0@     $74  !%] 0H     $9X  !&F
XM 1      $=0  !'< 1(     $@H  !(2 10     $D   !)( 18     $G8 
XM !)^ 1@     $JP  !*T 1H     $N(  !+J 2      $PD  !,1 2(     
XM$S   !,X 20     $U<  !-? 28     $WX  !.& 2@     $Z4  !.M 2H 
XM    $\P  !/4 2P     $_,  !/[ 2X     %!H  !0B 3      %$$  !1)
XM 3(     %&@  !1P 30     %(\  !27 38     %+8  !2^ 3@     %-T 
XM !3E 3H     %00  !4, 3P     %2L  !4S 3X     %5(  !5: 4      
XM%7T  !6% 4(     %;(  !6[ 40     %=H  !7C 48     %@(  !8* 4@ 
XM    %BT  !8U 4H     %F(  !9K 4P     %HH  !:3 4X     %K(  !:Z
XM 5      %MT  !;E 5(     %Q(  !<; 50     %SH  !=# 58     %V( 
XM !=J 5@     %XT  !>5 5H     %\(  !?+ 5P     %^H  !?S 5X     
XM&!(  !@: 6      &#T  !A% 6(     &'(  !A[ 60     &)H  !BC 68 
XM    &,(  !C* 6@     &.T  !CU 6H     &2(  !DK 6P     &4H  !E3
XM 6X     &7(  !EZ 7      &9T  !FE 7(     &=(  !G; 70     &?H 
XM !H# 78     &B(  !HJ 7@     &DT  !I5 7H     &H(  !J+ 7P     
XM&JH  !JS 7X     &M(  !K9 8   0  &MH  !KA 8(  0  &N(  !KI 80 
XM 0  &NH  !KQ 88  0  &O(  !KY 8@  0  &OH  !L! 8H  0  &P(  !L)
XM 8P  0  &PH  !L1 8X  0  &Q(  !L9 9   0  &QH  !LA 9(  0  &R( 
XM !LJ 90  0  &RL  !LS 98  0  &S0  !L\ 9@  0  &ST  !M% 9H  0  
XM&T8  !M. 9P  0  &T\  !M7 9X  0  &U@  !M@ :   0  &V$  !MI :( 
XM 0  &VH  !MR :0  0  &W,  !M[ :8  0  &WP  !N$ :@  0  &X4  !N-
XM :H  0  &XX  !N6 :P  0  &Y<  !N? :X  0  &Z   !NH ;   0  &ZD 
XM !NQ ;(  0  &[(  !NZ ;0  0  &[L  !O# ;8  0  &\0  !O, ;@  0  
XM&\T  !O5 ;H  0  &]8  !O> ;P  0  &]\  !OG ;X  0  &^@  !OI__\ 
XM       P,3(S-#4V-S@Y86)C9&5F    (" @(" @(" @,# P,# @(" @(" @
XM(" @(" @(" @(""00$! 0$! 0$! 0$! 0$! # P,# P,# P,#$! 0$! 0$ )
XM"0D)"0D! 0$! 0$! 0$! 0$! 0$! 0$! 4! 0$! 0 H*"@H*"@(" @(" @("
XM @(" @(" @(" @("0$! 0"                   0     !            
XM          $!     0                     ! @    $             
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM            %                 /L   !B@              !     P 
XM   0    &    !P    D    *    #     T    /    $    !(    3   
XM %0   !8    8    &0   !L    <    '@   !\    A    (@   "0    
XME    )P   "@    J    *P   "T    N    ,    #$    S    -    #8
XM    W    .0   #H    \    /0   #\   !     0@   $,   !%    1@ 
XM  $@   !)    2P   $P   !.    3P   %$   !2    5    %4   !7   
XM 6    %H   !;    70   %X   !@    80   &,   !D    9@   &<   !
XMI    :@   &P   !M    ;P   '    !R    <P   '4   !V    >    'D
XM   ![    ?    'X   !_    @0   ((   "$    A0   (<   "(    B@ 
XM  (L   "-    C@   )    "1    DP   )0   "6    EP   )D   ":   
XM G    )T   "?    H    *(   "C    I0   *8   "H    J0   *L   "
XML    K@   *\   "Q    L@   +0   "U    MP   +@   "Z    NP   +T
XM   "^    P    ,$   ##    Q    ,8   #'    R0   ,H   #,    S0 
XM  ,\   #0    T@   -,   #5    U@   -@   #9    VP   -P   #>   
XM WP   .$   #B    Y    .4   #G    Z    .H   #K    [0   .X   #
XMP    \0   /,   #T    ]@   /<   #Y    ^@   /P   #]    _P   0 
XM   $"   ! P   04   $&   !"    0D   $+   !#    0X   $/   !$0 
XM  1(   $4   !%0   1<   $8   !&@   1L   $=   !'@   2    $A   
XM!(P   20   $F   !)P   2D   $J   !+    2T   $O   !,    3(   $
XMS   !-0   38   $X   !.0   3L   $\   !/@   3\   %!   !0@   40
XM   %%   !1P   4@   %*   !2P   4T   %.   !4    5$   %3   !5  
XM  58   %7   !60   5H   %<   !70   5\   %@   !8@   6,   %E   
XM!9@   6@   %I   !:P   6P   %N   !;P   7$   %R   !=    74   %
XMW   !>    7H   %[   !?0   7X   &    !@0   8,   &$   !A@   8<
XM   &)   !B@   8P   &-   !CP   9    &2   !DP   94   &6   !F  
XM  9D   &;   !G    9X   &?   !H0   :(   &D   !I0   :<   &H   
XM!J@   :L   &M   !K@   ;    &Q   !LP   ;0   &V   !MP   ;D   &
XMZ   !O    ;T   &_   !P    <(   '#   !Q0   <8   '(   !R0   <L
XM   ',   !S@   <\   '1   !T@   =0   '5   !UP   =@   ':   !VP 
XM  =T   '>   !X    >$   'C   !Y    >8   'G   !Z0   >H   'L   
XM![0   >\   'P   !\@   ?,   'U   !]@   ?@   'Y   !^P   ?P   '
XM^   !_P   @$   ("   "!    @4   ('   ""    @H   (+   "#0   @X
XM   (0   "$0   A,   (4   "%@   A<   (9   "&@   AP   (=   "'P 
XM  B    (B   "(P   B4   (F   "*    BD   (K   "+    BX   (O   
XM",0   C(   (T   "-0   C<   (X   ".@   CL   (]   "/@   D    )
XM!   "0P   D0   )&   "1P   DD   )*   "3    DT         _(   /K
X(     0   _(0
X 
Xend

END_OF_FILE
echo shar: NEWLINE appended to \"'copdis.uu'\"
if test 23598 -ne `wc -c <'copdis.uu'`; then
    echo shar: \"'copdis.uu'\" unpacked with wrong size!
fi
# end of 'copdis.uu'
fi
echo shar: End of shell archive.
exit 0
-- 
-- uunet!sugar!karl	"There is hopeful symbolism in the fact that 
-- 			 flags do not wave in a vacuum."  -- Arthur C. Clarke
-- Usenet access: (713) 438-5018

karl@sugar.hackercorp.com (Karl Lehenbauer) (10/06/89)

[reposted with an Approved line]

Here is the source to my copper list disassembler, copdis.  I heard someone
else wrote one already -- their's may well be better...

----------------------- cut here ---------------------
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then feed it
# into a shell via "sh file" or similar.  To overwrite existing files,
# type "sh file -c".
# The tool that generated this appeared in the comp.sources.unix newsgroup;
# send mail to comp-sources-unix@uunet.uu.net if you want that tool.
# If this archive is complete, you will see the following message at the end:
#		"End of shell archive."
# Contents:  README copdis.h copdis.c registers.c main.c makefile
#   copdis.uu
# Wrapped by karl@sugar on Thu Jun 29 23:10:36 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(3668 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
X
X
Xcopdis - copper disassembler  0.0a  6/29/89  (alpha release)
X
X
XOVERVIEW
X
XGreetings.  The intrepid Amiga hacker, seeking to gain knowledge in the
Xintricacies of the video coprocessor, or copper, may find use in this 
Xprogram: a copper list disassembler.
X
XThe copper is a source of unspeakable power and it must be studied.
X
XThe copper is a programmable processor, capable of executing a very simple
Xset of instructions that allow it to control much of the Amiga hardware,
Xincluding all of the display characteristics and functions, audio functions,
Xthe blitter, serial port and even the floppy disk drives.
X
XThe copper has the capability of synchronizing its operations with the
Xdrawing of the display.  Copper programs can use this to do specific
Xthings to specific portions of the screen such as alter color registers, 
Xchange display resolutions, etc.  It can also use this capability to
Xprovide a precision timer by which its operations can be precisely ordered, 
Xfor example, for using the copper to play music without the intervention
Xof the 68000 processor.
X
XThe copper has a particularly interesting, but little used, capability by
Xwhich a currently executing copper program (Copper programs basically must
Xcomplete within about 1/60th of a second.) can set up another address for
Xthe copper to begin executing at.  The copper would normally begin executing
Xat that address at the start of the next video field.  It can be forced to
Xbegin executing it immediately with an additional instruction.
X
XAs there are two copper "program counters," it is possible to have a
Xone-deep subroutine calling capability whereby programs execute running
Xcopper PC 1 and call subroutines by loading their addresses into copper
XPC 2 and strobing the location to causes the coppper to start executing
Xthe "subroutine."  At the completion of the subroutine, it strobes the
Xaddress that causes the copper to execute using PC 1, which resumes
Xthe caller -- UNTESTED
X
XIf that works, a deeper interrupt nesting scheme can be created, if
Xnecessary, involving the copper interrupting the 68000 and getting it
Xto handle a stack and such.  (kink value == maximum)
X
XUSING COPDIS
X
XThere are two ways to use copdis.  One is to execute the copdis program.
XThis goes out and finds various presumably interesting copper lists and
Xprints them out for you.
X
XThe other way to use copdis is to call it directly from your C program.
XSimply link copdis.o (after compiling it from copdis.c for the memory
Xmodel you're using) in with your program, and call the subroutine 'copdis'
Xwith a pointer to a copper instruction list.  Note that structures such 
Xas "struct cprlist" are not pointers to instruction lists but pointer
Xto structures that point to instruction lists or point to something that
Xpoints to an instruction list.  I think the calls in main are correct,
Xbut I'm not promising *anything.*
X
XBUGS
X
XThis program is in a primitive state.  Right now it doesn't take a length
Xand if it gets passed a bogus address (i.e., not an address of a real
Xand properly terminated copper list), it can run on and on.  For all I
Xknow, it may even get lost doing OK lists, but I haven't seen that happen,
Xat least not for a while.  It really ought to do a sanity check on the
Xsize of the list, like stop after an absurd number of instructions go
Xby, but you can always control-C anyway.
X
XNote also that I'm not a copper expert so any of the information in the
XREADME here could be wrong as well.
X
X
XRegards, Karl Lehenbauer @ The Hacker's Haven
X
X Hackercorp
X 3918 Panorama
X Missouri City, TX  77459
X
X (713) 274-5184
X usenet: uunet!sugar!karl
X Internet & BITNET: karl@sugar.hackercorp.com
X BIX: karl (rarely)

END_OF_FILE
echo shar: NEWLINE appended to \"'README'\"
if test 3669 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'copdis.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'copdis.h'\"
else
echo shar: Extracting \"'copdis.h'\" \(135 characters\)
sed "s/^X//" >'copdis.h' <<'END_OF_FILE'
X
X#define COLOR 1
X
Xstruct regstruct
X{
X	char *regname;
X	short regid;
X	short flags;
X};
X
Xstruct instruction 
X{
X	short ir1;
X	short ir2;
X};
X

END_OF_FILE
echo shar: NEWLINE appended to \"'copdis.h'\"
if test 136 -ne `wc -c <'copdis.h'`; then
    echo shar: \"'copdis.h'\" unpacked with wrong size!
fi
# end of 'copdis.h'
fi
if test -f 'copdis.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'copdis.c'\"
else
echo shar: Extracting \"'copdis.c'\" \(14768 characters\)
sed "s/^X//" >'copdis.c' <<'END_OF_FILE'
X/* copdis - standalone copper list disassembler
X *
X * by Karl Lehenbauer, April 1989
X *
X * This code is released to the public domain for any legal use.
X *
X * This is free software.  No warranties are expressed or implied.
X *
X *
X * There should be a text file, copdis.doc, that describes the function
X * of the program in greater detail.  If you don't have it, you've been
X * ripped off!
X *
X * A quick summary: to disassemble a copper list, call copdis and pass it
X * the address of the start of the copper list.  Note that this is not
X * the address of the cprlst or CopList data structure, but the actual
X * address of the first copper instruction.
X *
X * Some examples:
X *
X *  GfxBase's copinit list, this may not be right
X *  copdis(GfxBase->copinit);	
X *
X *	Top Viewport's display instructions for the "long frame"
X *  copdis(GfxBase->ActiView->ViewPort->DspIns->CopLStart);
X *
X *	Top Viewport's display instructions for the "short frame"
X *  copdis(GfxBase->ActiView->ViewPort->DspIns->CopSStart);
X *
X *	Currently active LOF copper list
X *  copdis(GfxBase->ActiView->LOFCprList->start);
X *
X *  Currently active SHF copper list:
X *  copdis(GfxBase->ActiView->SHFCprList->start);
X *
X */
X
X#include <functions.h>
X#include <stdio.h>
X
Xstruct copregstruct
X{
X	char *regname;
X	char *longname;
X	short regid;
X	short flags;
X};
X
Xstruct copinstruction 
X{
X	short ir1;
X	short ir2;
X};
X
X#define COLOR 1
X
Xstatic struct copregstruct copregisters[] =
X{
X	{"bltddat","blitter destination early read (dummy address)",0,0},
X	{"dmaconr","DMA control (and blitter status) read",0x2,0},
X	{"vposr","read vert most signif. bit (and frame flop)",0x4,0},
X	{"vhposr","read vert and horiz. position of beam",0x6,0},
X	{"dskdatr","disk data early read (dummy address)",0x8,0},
X	{"joy0dat","joystick-mouse 0 data (vert,horiz)",0xa,0},
X	{"joy1dat","joystick-mouse 1 data (vert,horiz)",0xc,0},
X	{"clxdat","collision data (read and clear)",0xe,0},
X	{"adkconr","audio, disk control register read",0x10,0},
X	{"pot0dat","pot counter pair 0 data (vert,horiz)",0x12,0},
X	{"pot1dat","pot counter pair 1 data (vert,horiz)",0x14,0},
X	{"potgor","pot port data read",0x16,0},
X	{"serdatr","serial port data and status read",0x18,0},
X	{"dskbytr","disk data byte and status read",0x1a,0},
X	{"intenar","interrupt enable bits read",0x1c,0},
X	{"intreqr","interrupt request bits read",0x1e,0},
X
X	{"dskpth","disk pointer (high 3 bits)",0x20,0},
X	{"dskptl","disk pointer (low 15 bits)",0x22,0},
X	{"dsklen","disk length",0x24,0},
X	{"dskdat","disk DMA data write",0x26,0},
X
X	{"refptr","refresh pointer",0x28,0},
X	{"vposw","write vert most signif. bit (and frame flop)",0x2a,0},
X	{"vhposw","write vert and horiz position of beam",0x2c,0},
X	{"copcon","copper control register (CDANG)",0x2e,0},
X	{"serdat","serial port data and stop bits write",0x30,0},
X	{"serper","serial port period and control",0x32,0},
X	{"potgo","pot port data write and start",0x34,0},
X	{"joytest","write all four joystick-mouse counters",0x36,0},
X	{"strequ","strobe for horiz sync with vertical blank and EQU",0x38,0},
X	{"strvbl","strobe for horiz sync with vertical blank",0x3a,0},
X	{"strhor","strobe for horizontal sync",0x3c,0},
X	{"strlong","strobe for identification of long horiz. line",0x3e,0},
X
X	{"bltcon0","blitter control register 0",0x40,0},
X	{"bltcon1","blitter control register 1",0x42,0},
X	{"bltafwm","blitter first word mask for source A",0x44,0},
X	{"bltalwm","blitter last word mask for source A",0x46,0},
X	{"bltcpth","blitter pointer to source C (high 3 bits)",0x48,0},
X	{"bltcptl","blitter pointer to source C (low 15 bits)",0x4a,0},
X	{"bltbpth","blitter pointer to source B (high 3 bits)",0x4c,0},
X	{"bltbptl","blitter pointer to source B (low 15 bits)",0x4e,0},
X	{"bltapth","blitter pointer to source A (high 3 bits)",0x50,0},
X	{"bltaptl","blitter pointer to source A (low 15 bits)",0x52,0},
X	{"bltdpth","blitter pointer to source D (high 3 bits)",0x54,0},
X	{"bltdptl","blitter pointer to source D (low 15 bits)",0x56,0},
X	{"bltsize","blitter start and size (window width, height)",0x58,0},
X	{"bltcmod","blitter modulo for source C",0x60,0},
X	{"bltbmod","blitter modulo for source B",0x62,0},
X	{"bltamod","blitter modulo for source A",0x64,0},
X	{"bltdmod","blitter modulo for source D",0x66,0},
X	{"bltcdat","blitter source C data",0x70,0},
X	{"bltbdat","blitter source B data",0x72,0},
X	{"bltadat","blitter source A data",0x74,0},
X
X	{"dsksync","disk sync pattern for disk read",0x7e,0},
X
X	{"cop1lch","copper first location (high 3 bits)",0x80,0},
X	{"cop1lcl","copper first location (low 15 bits)",0x82,0},
X	{"cop2lch","copper second location (high 3 bits)",0x84,0},
X	{"cop2lcl","copper second location (low 15 bits)",0x86,0},
X	{"copjmp1","restart copper at first location",0x88,0},
X	{"copjmp2","restart copper at second location",0x8a,0},
X	{"copins","copper instruction fetch identify",0x8c,0},
X	{"diwstrt","display window start (upper left vert-horiz position)",0x8e,0},
X	{"diwstop","display window stop (lower right vert-horiz position)",0x90,0},
X	{"ddfstrt","display bit plane data fetch start (horiz. position)",0x92,0},
X	{"ddfstop","display bit plane data fetch stop (horiz. position)",0x94,0},
X	{"dmacon","DMA control write (clear or set)",0x96,0},
X	{"clxcon","collision control",0x98,0},
X	{"intena","interrupt enable bits",0x9a,0},
X	{"intreq","interrupt request bits",0x9c,0},
X	{"adkcon","audio, disk, UART control",0x9e,0},
X
X	{"aud0lch","audio channel 0 location (high 3 bits)",0xa0,0},
X	{"aud0lcl","audio channel 0 location (low 15 bits)",0xa2,0},
X	{"aud0len","audio channel 0 length",0xa4,0},
X	{"aud0per","audio channel 0 period",0xa6,0},
X	{"aud0vol","audio channel 0 volume",0xa8,0},
X	{"aud0dat","audio channel 0 data",0xaa,0},
X
X	{"aud1lch","audio channel 1 location (high 3 bits)",0xb0,0},
X	{"aud1lcl","audio channel 1 location (low 15 bits)",0xb2,0},
X	{"aud1len","audio channel 1 length",0xb4,0},
X	{"aud1per","audio channel 1 period",0xb6,0},
X	{"aud1vol","audio channel 1 volume",0xb8,0},
X	{"aud1dat","audio channel 1 data",0xba,0},
X
X	{"aud2lch","audio channel 2 location (high 3 bits)",0xc0,0},
X	{"aud2lcl","audio channel 2 location (low 15 bits)",0xc2,0},
X	{"aud2len","audio channel 2 length",0xc4,0},
X	{"aud2per","audio channel 2 period",0xc6,0},
X	{"aud2vol","audio channel 2 volume",0xc8,0},
X	{"aud2dat","audio channel 2 data",0xca,0},
X
X	{"aud3lch","audio channel 3 location (high 3 bits)",0xd0,0},
X	{"aud3lcl","audio channel 3 location (low 15 bits)",0xd2,0},
X	{"aud3len","audio channel 3 length",0xd4,0},
X	{"aud3per","audio channel 3 period",0xd6,0},
X	{"aud3vol","audio channel 3 volume",0xd8,0},
X	{"aud3dat","audio channel 3 data",0xda,0},
X
X	{"bpl1pth","blitter plane 1 pointer (high 3 bits)",0xe0,0},
X	{"bpl1ptl","blitter plane 1 pointer (low 15 bits)",0xe2,0},
X	{"bpl2pth","blitter plane 2 pointer (high 3 bits)",0xe4,0},
X	{"bpl2ptl","blitter plane 2 pointer (low 15 bits)",0xe6,0},
X	{"bpl3pth","blitter plane 3 pointer (high 3 bits)",0xe8,0},
X	{"bpl3ptl","blitter plane 3 pointer (low 15 bits)",0xea,0},
X	{"bpl4pth","blitter plane 4 pointer (high 3 bits)",0xec,0},
X	{"bpl4ptl","blitter plane 4 pointer (low 15 bits)",0xee,0},
X	{"bpl5pth","blitter plane 5 pointer (high 3 bits)",0xf0,0},
X	{"bpl5ptl","blitter plane 5 pointer (low 15 bits)",0xf2,0},
X	{"bpl6pth","blitter plane 6 pointer (high 3 bits)",0xf4,0},
X	{"bpl6ptl","blitter plane 6 pointer (low 15 bits)",0xf6,0},
X
X	{"bplcon0","bit plane control bits",0x100,0},
X	{"bplcon1","bit plane scroll values for PF1 & PF2",0x102,0},
X	{"bplcon2","bit plane priority control",0x104,0},
X
X	{"bpl1mod","bit plane modulo for odd planes",0x108,0},
X	{"bpl2mod","bit plane modulo for even planes",0x10a,0},
X
X	{"bpl1dat","bit plane 1 data (parallel-to-serial convert)",0x110,0},
X	{"bpl2dat","bit plane 2 data (parallel-to-serial convert)",0x112,0},
X	{"bpl3dat","bit plane 3 data (parallel-to-serial convert)",0x114,0},
X	{"bpl4dat","bit plane 4 data (parallel-to-serial convert)",0x116,0},
X	{"bpl5dat","bit plane 5 data (parallel-to-serial convert)",0x118,0},
X	{"bpl6dat","bit plane 6 data (parallel-to-serial convert)",0x11a,0},
X
X	{"spr0pth","sprite 0 pointer (high 3 bits)",0x120,0},
X	{"spr0ptl","sprite 0 pointer (low 15 bits)",0x122,0},
X	{"spr1pth","sprite 1 pointer (high 3 bits)",0x124,0},
X	{"spr1ptl","sprite 1 pointer (low 15 bits)",0x126,0},
X	{"spr2pth","sprite 2 pointer (high 3 bits)",0x128,0},
X	{"spr2ptl","sprite 2 pointer (low 15 bits)",0x12a,0},
X	{"spr3pth","sprite 3 pointer (high 3 bits)",0x12c,0},
X	{"spr3ptl","sprite 3 pointer (low 15 bits)",0x12e,0},
X	{"spr4pth","sprite 4 pointer (high 3 bits)",0x130,0},
X	{"spr4ptl","sprite 4 pointer (low 15 bits)",0x132,0},
X	{"spr5pth","sprite 5 pointer (high 3 bits)",0x134,0},
X	{"spr5ptl","sprite 5 pointer (low 15 bits)",0x136,0},
X	{"spr6pth","sprite 6 pointer (high 3 bits)",0x138,0},
X	{"spr6ptl","sprite 6 pointer (low 15 bits)",0x13a,0},
X	{"spr7pth","sprite 7 pointer (high 3 bits)",0x13c,0},
X	{"spr7ptl","sprite 7 pointer (low 15 bits)",0x13e,0},
X
X	{"spr0pos","sprite 0 vert-horiz start position",0x140,0},
X	{"spr0ctl","sprite 0 vert stop position and control data",0x142,0},
X	{"spr0data","sprite 0 image data register A",0x144,0},
X	{"spr0datb","sprite 0 image data register B",0x146,0},
X	{"spr1pos","sprite 1 vert-horiz start position",0x148,0},
X	{"spr1ctl","sprite 1 vert stop position and control data",0x14a,0},
X	{"spr1data","sprite 1 image data register A",0x14c,0},
X	{"spr1datb","sprite 1 image data register B",0x14e,0},
X	{"spr2pos","sprite 2 vert-horiz start position",0x150,0},
X	{"spr2ctl","sprite 2 vert stop position and control data",0x152,0},
X	{"spr2data","sprite 2 image data register A",0x154,0},
X	{"spr2datb","sprite 2 image data register B",0x156,0},
X	{"spr3pos","sprite 3 vert-horiz start position",0x158,0},
X	{"spr3ctl","sprite 3 vert stop position and control data",0x15a,0},
X	{"spr3data","sprite 3 image data register A",0x15c,0},
X	{"spr3datb","sprite 3 image data register B",0x15e,0},
X	{"spr4pos","sprite 4 vert-horiz start position",0x160,0},
X	{"spr4ctl","sprite 4 vert stop position and control data",0x162,0},
X	{"spr4data","sprite 4 image data register A",0x164,0},
X	{"spr4datb","sprite 4 image data register B",0x166,0},
X	{"spr5pos","sprite 5 vert-horiz start position",0x168,0},
X	{"spr5ctl","sprite 5 vert stop position and control data",0x16a,0},
X	{"spr5data","sprite 5 image data register A",0x16c,0},
X	{"spr5datb","sprite 5 image data register B",0x16e,0},
X	{"spr6pos","sprite 6 vert-horiz start position",0x170,0},
X	{"spr6ctl","sprite 6 vert stop position and control data",0x172,0},
X	{"spr6data","sprite 6 image data register A",0x174,0},
X	{"spr6datb","sprite 6 image data register B",0x176,0},
X	{"spr7pos","sprite 7 vert-horiz start position",0x178,0},
X	{"spr7ctl","sprite 7 vert stop position and control data",0x17a,0},
X	{"spr7data","sprite 7 image data register A",0x17c,0},
X	{"spr7datb","sprite 7 image data register B",0x17e,0},
X
X	{"color0","",0x180,COLOR},
X	{"color1","",0x182,COLOR},
X	{"color2","",0x184,COLOR},
X	{"color3","",0x186,COLOR},
X	{"color4","",0x188,COLOR},
X	{"color5","",0x18a,COLOR},
X	{"color6","",0x18c,COLOR},
X	{"color7","",0x18e,COLOR},
X	{"color8","",0x190,COLOR},
X	{"color9","",0x192,COLOR},
X	{"color10","",0x194,COLOR},
X	{"color11","",0x196,COLOR},
X	{"color12","",0x198,COLOR},
X	{"color13","",0x19a,COLOR},
X	{"color14","",0x19c,COLOR},
X	{"color15","",0x19e,COLOR},
X	{"color16","",0x1a0,COLOR},
X	{"color17","",0x1a2,COLOR},
X	{"color18","",0x1a4,COLOR},
X	{"color19","",0x1a6,COLOR},
X	{"color20","",0x1a8,COLOR},
X	{"color21","",0x1aa,COLOR},
X	{"color22","",0x1ac,COLOR},
X	{"color23","",0x1ae,COLOR},
X	{"color24","",0x1b0,COLOR},
X	{"color25","",0x1b2,COLOR},
X	{"color26","",0x1b4,COLOR},
X	{"color27","",0x1b6,COLOR},
X	{"color28","",0x1b8,COLOR},
X	{"color29","",0x1ba,COLOR},
X	{"color30","",0x1bc,COLOR},
X	{"color31","",0x1be,COLOR},
X	{"","",-1,0}
X};
X
Xstruct copregstruct *find_copper_register_info(reg)
Xint reg;
X{
X	struct copregstruct *regp;
X
X	for (regp = &copregisters[0]; regp->regid != -1; regp++)
X	{
X		if (regp->regid == reg)
X			return(regp);
X	}
X	return(0);
X}
X
Xdisassemble_copper_instruction(ip)
Xstruct copinstruction *ip;
X{
X	short vp, hp, ve, he, bfd;
X	int registerid;
X	struct copregstruct *regp;
X	char *regtext, *longtext;
X
X	/* printf("instruction %x, %x\n",ip->ir1,ip->ir2); */
X
X
X	/* true if it's a branch or skip instruction */
X	if (ip->ir1 & 1)
X	{
X		/* branch or skip instruction */
X
X		/* calculate vertical and horizontal position */
X		vp = (ip->ir1 >> 8) & 0xff;
X		hp = (ip->ir1 >> 1) & 0x7f;
X
X		/* calculate vertical and horizontal position compare bits
X		 * and blitter-finished-disable bit */
X		ve = (ip->ir2 >> 8) & 0x7f;
X		he = (ip->ir2 >> 1) & 0x7f;
X		bfd = (ip->ir2 & 0x8000);
X
X		/* print the instruction type, check bit 0 of second word */
X		if (ip->ir2 & 1)
X		{
X			/* it's a skip */
X			printf("\tskip");
X		}
X		else
X		{
X			/* it's a wait */
X			printf("\twait");
X		}
X
X		/* reverse sense of blitter finish wait disable to show blitter 
X		 * finish wait -- that way we occasionally say "blitter" instead
X		 * of almost always saying "no blitter"
X		 */
X		if (!bfd)
X			printf("\tbf,");
X		else
X			printf("\t");
X
X		/* print vertical and horizontal position */
X		printf("vpos=%d,hpos=%d",vp,hp);
X	printf("instruction %x, %x\n",ip->ir1,ip->ir2);
X
X		/* if enable masks are not basically "all", print them */
X		if ((ve != 0x7f) || (he != 0x7f))
X		{
X			printf(",vcomp=%d,hcomp=%d\n",ve,he);
X		}
X	}
X	else
X	{
X		/* it's a move instruction */
X
X		/* calculate register ID and look it up */
X		registerid = ip->ir1 & 0x1ff;
X		regp = find_copper_register_info(registerid);
X
X		/* if we found the register in our table, print the text
X		 * else whine about something we don't understand */
X		if (regp)
X		{
X			regtext = regp->regname;
X			longtext = regp->longname;
X		}
X		else
X		{
X			regtext = "UNKNOWN_OPCODE";
X			longtext = "";
X		}
X		printf("\tmove\t%x,%s",ip->ir2,regtext);
X
X		if (*longtext != '\0')
X			printf("\t;%s",longtext);
X	}
X	printf("\n");
X}
X
X/* have a go at disassembling a copper list */
Xcopdis(coplist)
Xstruct copinstruction *coplist;
X{
X
X	/* check and refuse null list pointers */
X	if (coplist == (struct copinstruction *)NULL)
X	{
X		fprintf(stderr,"copdis: copper list pointer is null\n");
X		return;
X	}
X
X	/* while we don't have an instruction of 0xffff 0xfffe, which is
X	 * a de facto END PROGRAM instruction, print instructions.
X	 *
X	 * Use of do-while is in order that the END instruction is also
X	 * disassembled.
X	 *
X	 * This should really have a sanity check (like no more than a few
X	 * hundred instructions, and/or a length -- heck, it's in the cprlst
X	 * and CopList structures anyway), but it doesn't, or at least not
X	 * yet
X	 */
X	do
X	{
X		disassemble_copper_instruction(coplist++);
X	}
X	while ((coplist->ir1 != 0xffff) && (coplist->ir2 != 0xfffe));
X
X	/* and disassemble the WAIT 255 instruction */
X	disassemble_copper_instruction(coplist);
X}

END_OF_FILE
echo shar: NEWLINE appended to \"'copdis.c'\"
if test 14769 -ne `wc -c <'copdis.c'`; then
    echo shar: \"'copdis.c'\" unpacked with wrong size!
fi
# end of 'copdis.c'
fi
if test -f 'registers.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'registers.c'\"
else
echo shar: Extracting \"'registers.c'\" \(4586 characters\)
sed "s/^X//" >'registers.c' <<'END_OF_FILE'
X#include "copdis.h"
X
Xstruct regstruct registers[] =
X{
X	{"bltddat",0,0},
X	{"dmaconr",0x2,0},
X	{"vposr",0x4,0},
X	{"vhposr",0x6,0},
X	{"dskdatr",0x8,0},
X	{"joy0dat",0xa,0},
X	{"joy1dat",0xc,0},
X	{"clxdat",0xe,0},
X	{"adkconr",0x10,0},
X	{"pot0dat",0x12,0},
X	{"pot1dat",0x14,0},
X	{"potgor",0x16,0},
X	{"serdatr",0x18,0},
X	{"dskbytr",0x1a,0},
X	{"intenar",0x1c,0},
X	{"intreqr",0x1e,0},
X
X	{"dskpth",0x20,0},
X	{"dskptl",0x22,0},
X	{"dsklen",0x24,0},
X	{"dskdat",0x26,0},
X
X	{"refptr",0x28,0},
X	{"vposw",0x2a,0},
X	{"vhposw",0x2c,0},
X	{"copcon",0x2e,0},
X	{"serdat",0x30,0},
X	{"serper",0x32,0},
X	{"potgo",0x34,0},
X	{"joytest",0x36,0},
X	{"strequ",0x38,0},
X	{"strvbl",0x3a,0},
X	{"strhor",0x3c,0},
X	{"strlong",0x3e,0},
X
X	{"bltcon0",0x40,0},
X	{"bltcon1",0x42,0},
X	{"bltafwm",0x44,0},
X	{"bltalwm",0x46,0},
X	{"bltcpth",0x48,0},
X	{"bltcptl",0x4a,0},
X	{"bltbpth",0x4c,0},
X	{"bltbptl",0x4e,0},
X	{"bltapth",0x50,0},
X	{"bltaptl",0x52,0},
X	{"bltdpth",0x54,0},
X	{"bltdptl",0x56,0},
X	{"bltsize",0x58,0},
X	{"bltcmod",0x60,0},
X	{"bltbmod",0x62,0},
X	{"bltamod",0x64,0},
X	{"bltdmod",0x66,0},
X	{"bltcdat",0x70,0},
X	{"bltbdat",0x72,0},
X	{"bltadat",0x74,0},
X
X	{"dsksync",0x7e,0},
X
X	{"cop1lch",0x80,0},
X	{"cop1lcl",0x82,0},
X	{"cop2lch",0x84,0},
X	{"cop2lcl",0x86,0},
X	{"copjmp1",0x88,0},
X	{"copjmp2",0x8a,0},
X	{"copins",0x8c,0},
X	{"diwstrt",0x8e,0},
X	{"diwstop",0x90,0},
X	{"ddfstrt",0x92,0},
X	{"ddfstop",0x94,0},
X	{"dmacon",0x96,0},
X	{"clxcon",0x98,0},
X	{"intena",0x9a,0},
X	{"intreq",0x9c,0},
X	{"adkcon",0x9e,0},
X
X	{"aud0lch",0xa0,0},
X	{"aud0lcl",0xa2,0},
X	{"aud0len",0xa4,0},
X	{"aud0per",0xa6,0},
X	{"aud0vol",0xa8,0},
X	{"aud0dat",0xaa,0},
X
X	{"aud1lch",0xb0,0},
X	{"aud1lcl",0xb2,0},
X	{"aud1len",0xb4,0},
X	{"aud1per",0xb6,0},
X	{"aud1vol",0xb8,0},
X	{"aud1dat",0xba,0},
X
X	{"aud2lch",0xc0,0},
X	{"aud2lcl",0xc2,0},
X	{"aud2len",0xc4,0},
X	{"aud2per",0xc6,0},
X	{"aud2vol",0xc8,0},
X	{"aud2dat",0xca,0},
X
X	{"aud3lch",0xd0,0},
X	{"aud3lcl",0xd2,0},
X	{"aud3len",0xd4,0},
X	{"aud3per",0xd6,0},
X	{"aud3vol",0xd8,0},
X	{"aud3dat",0xda,0},
X
X	{"bpl1pth",0xe0,0},
X	{"bpl1ptl",0xe2,0},
X	{"bpl2pth",0xe4,0},
X	{"bpl2ptl",0xe6,0},
X	{"bpl3pth",0xe8,0},
X	{"bpl3ptl",0xea,0},
X	{"bpl4pth",0xec,0},
X	{"bpl4ptl",0xee,0},
X	{"bpl5pth",0xf0,0},
X	{"bpl5ptl",0xf2,0},
X	{"bpl6pth",0xf4,0},
X	{"bpl6ptl",0xf6,0},
X
X	{"bplcon0",0x100,0},
X	{"bplcon1",0x102,0},
X	{"bplcon2",0x104,0},
X
X	{"bpl1mod",0x108,0},
X	{"bpl2mod",0x10a,0},
X
X	{"bpl1dat",0x110,0},
X	{"bpl2dat",0x112,0},
X	{"bpl3dat",0x114,0},
X	{"bpl4dat",0x116,0},
X	{"bpl5dat",0x118,0},
X	{"bpl6dat",0x11a,0},
X
X	{"spr0pth",0x120,0},
X	{"spr0ptl",0x122,0},
X	{"spr1pth",0x124,0},
X	{"spr1ptl",0x126,0},
X	{"spr2pth",0x128,0},
X	{"spr2ptl",0x12a,0},
X	{"spr3pth",0x12c,0},
X	{"spr3ptl",0x12e,0},
X	{"spr4pth",0x130,0},
X	{"spr4ptl",0x132,0},
X	{"spr5pth",0x134,0},
X	{"spr5ptl",0x136,0},
X	{"spr6pth",0x138,0},
X	{"spr6ptl",0x13a,0},
X	{"spr7pth",0x13c,0},
X	{"spr7ptl",0x13e,0},
X
X	{"spr0pos",0x140,0},
X	{"spr0ctl",0x142,0},
X	{"spr0data",0x144,0},
X	{"spr0datb",0x146,0},
X	{"spr1pos",0x148,0},
X	{"spr1ctl",0x14a,0},
X	{"spr1data",0x14c,0},
X	{"spr1datb",0x14e,0},
X	{"spr2pos",0x150,0},
X	{"spr2ctl",0x152,0},
X	{"spr2data",0x154,0},
X	{"spr2datb",0x156,0},
X	{"spr3pos",0x158,0},
X	{"spr3ctl",0x15a,0},
X	{"spr3data",0x15c,0},
X	{"spr3datb",0x15e,0},
X	{"spr4pos",0x160,0},
X	{"spr4ctl",0x162,0},
X	{"spr4data",0x164,0},
X	{"spr4datb",0x166,0},
X	{"spr5pos",0x168,0},
X	{"spr5ctl",0x16a,0},
X	{"spr5data",0x16c,0},
X	{"spr5datb",0x16e,0},
X	{"spr6pos",0x170,0},
X	{"spr6ctl",0x172,0},
X	{"spr6data",0x174,0},
X	{"spr6datb",0x176,0},
X	{"spr7pos",0x178,0},
X	{"spr7ctl",0x17a,0},
X	{"spr7data",0x17c,0},
X	{"spr7datb",0x17e,0},
X
X	{"color0",0x180,COLOR},
X	{"color1",0x182,COLOR},
X	{"color2",0x184,COLOR},
X	{"color3",0x186,COLOR},
X	{"color4",0x188,COLOR},
X	{"color5",0x18a,COLOR},
X	{"color6",0x18c,COLOR},
X	{"color7",0x18e,COLOR},
X	{"color8",0x190,COLOR},
X	{"color9",0x192,COLOR},
X	{"color10",0x194,COLOR},
X	{"color11",0x196,COLOR},
X	{"color12",0x198,COLOR},
X	{"color13",0x19a,COLOR},
X	{"color14",0x19c,COLOR},
X	{"color15",0x19e,COLOR},
X	{"color16",0x1a0,COLOR},
X	{"color17",0x1a2,COLOR},
X	{"color18",0x1a4,COLOR},
X	{"color19",0x1a6,COLOR},
X	{"color20",0x1a8,COLOR},
X	{"color21",0x1aa,COLOR},
X	{"color22",0x1ac,COLOR},
X	{"color23",0x1ae,COLOR},
X	{"color24",0x1b0,COLOR},
X	{"color25",0x1b2,COLOR},
X	{"color26",0x1b4,COLOR},
X	{"color27",0x1b6,COLOR},
X	{"color28",0x1b8,COLOR},
X	{"color29",0x1ba,COLOR},
X	{"color30",0x1bc,COLOR},
X	{"color31",0x1be,COLOR},
X	{"",-1,0}
X};
X
Xstruct regstruct *find_register_info(reg)
Xint reg;
X{
X	struct regstruct *regp;
X
X	for (regp = &registers[0]; regp->regid != -1; regp++)
X	{
X		if (regp->regid == reg)
X			return(regp);
X	}
X	return(0);
X}

END_OF_FILE
echo shar: NEWLINE appended to \"'registers.c'\"
if test 4587 -ne `wc -c <'registers.c'`; then
    echo shar: \"'registers.c'\" unpacked with wrong size!
fi
# end of 'registers.c'
fi
if test -f 'main.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'main.c'\"
else
echo shar: Extracting \"'main.c'\" \(841 characters\)
sed "s/^X//" >'main.c' <<'END_OF_FILE'
X
X#include <graphics/gfxbase.h>
X#include <graphics/view.h>
X#include <functions.h>
X#include <stdio.h>
X
Xstruct GfxBase *GfxBase = NULL;
X
X
Xmain()
X{
X	GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L); 
X
X	if (GfxBase == NULL)
X	{
X		fprintf(stderr,"couldn't open graphics.library\n");
X		exit(1);
X	}
X
X	printf("GfxBase's copinit list:\n");
X	copdis(GfxBase->copinit);
X
X	printf("\nTop Viewport's display L instructions:\n");
X	copdis(GfxBase->ActiView->ViewPort->DspIns->CopLStart);
X
X	printf("\nTop Viewport's display S instructions:\n");
X	copdis(GfxBase->ActiView->ViewPort->DspIns->CopSStart);
X
X	printf("\nCurrently active LOF copper list:\n");
X	copdis(GfxBase->ActiView->LOFCprList->start);
X
X	/* only seems to work in Interlace
X	 * printf("\nCurrently active SHF copper list:\n");
X	 * copdis(GfxBase->ActiView->SHFCprList->start);
X	 */
X}

END_OF_FILE
echo shar: NEWLINE appended to \"'main.c'\"
if test 842 -ne `wc -c <'main.c'`; then
    echo shar: \"'main.c'\" unpacked with wrong size!
fi
# end of 'main.c'
fi
if test -f 'makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'makefile'\"
else
echo shar: Extracting \"'makefile'\" \(107 characters\)
sed "s/^X//" >'makefile' <<'END_OF_FILE'
X
XCFLAGS= -n -Z8000
X
XOFILES= copdis.o main.o
X
Xall:	copdis
X
Xcopdis:	$(OFILES)
X	ln -g -o copdis $(OFILES) -lc

END_OF_FILE
echo shar: NEWLINE appended to \"'makefile'\"
if test 108 -ne `wc -c <'makefile'`; then
    echo shar: \"'makefile'\" unpacked with wrong size!
fi
# end of 'makefile'
fi
if test -f 'copdis.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'copdis.uu'\"
else
echo shar: Extracting \"'copdis.uu'\" \(23597 characters\)
sed "s/^X//" >'copdis.uu' <<'END_OF_FILE'
Xbegin 644 copdis
XM   #\P         #          (   PK   "^P    $   /I   ,*T[Z("1B
XM;'1D9&%T &)L:71T97(@9&5S=&EN871I;VX@96%R;'D@<F5A9" H9'5M;7D@
XM861D<F5S<RD 9&UA8V]N<@!$34$@8V]N=')O;" H86YD(&)L:71T97(@<W1A
XM='5S*2!R96%D '9P;W-R ')E860@=F5R="!M;W-T('-I9VYI9BX@8FET("AA
XM;F0@9G)A;64@9FQO<"D =FAP;W-R ')E860@=F5R="!A;F0@:&]R:7HN('!O
XM<VET:6]N(&]F(&)E86T 9'-K9&%T<@!D:7-K(&1A=&$@96%R;'D@<F5A9" H
XM9'5M;7D@861D<F5S<RD :F]Y,&1A= !J;WES=&EC:RUM;W5S92 P(&1A=&$@
XM*'9E<G0L:&]R:7HI &IO>3%D870 :F]Y<W1I8VLM;6]U<V4@,2!D871A("AV
XM97)T+&AO<FEZ*0!C;'AD870 8V]L;&ES:6]N(&1A=&$@*')E860@86YD(&-L
XM96%R*0!A9&MC;VYR &%U9&EO+"!D:7-K(&-O;G1R;VP@<F5G:7-T97(@<F5A
XM9 !P;W0P9&%T '!O="!C;W5N=&5R('!A:7(@,"!D871A("AV97)T+&AO<FEZ
XM*0!P;W0Q9&%T '!O="!C;W5N=&5R('!A:7(@,2!D871A("AV97)T+&AO<FEZ
XM*0!P;W1G;W( <&]T('!O<G0@9&%T82!R96%D '-E<F1A='( <V5R:6%L('!O
XM<G0@9&%T82!A;F0@<W1A='5S(')E860 9'-K8GET<@!D:7-K(&1A=&$@8GET
XM92!A;F0@<W1A='5S(')E860 :6YT96YA<@!I;G1E<G)U<'0@96YA8FQE(&)I
XM=',@<F5A9 !I;G1R97%R &EN=&5R<G5P="!R97%U97-T(&)I=',@<F5A9 !D
XM<VMP=&@ 9&ES:R!P;VEN=&5R("AH:6=H(#,@8FET<RD 9'-K<'1L &1I<VL@
XM<&]I;G1E<B H;&]W(#$U(&)I=',I &1S:VQE;@!D:7-K(&QE;F=T: !D<VMD
XM870 9&ES:R!$34$@9&%T82!W<FET90!R969P='( <F5F<F5S:"!P;VEN=&5R
XM '9P;W-W '=R:71E('9E<G0@;6]S="!S:6=N:68N(&)I=" H86YD(&9R86UE
XM(&9L;W I '9H<&]S=P!W<FET92!V97)T(&%N9"!H;W)I>B!P;W-I=&EO;B!O
XM9B!B96%M &-O<&-O;@!C;W!P97(@8V]N=')O;"!R96=I<W1E<B H0T1!3D<I
XM '-E<F1A= !S97)I86P@<&]R="!D871A(&%N9"!S=&]P(&)I=',@=W)I=&4 
XM<V5R<&5R '-E<FEA;"!P;W)T('!E<FEO9"!A;F0@8V]N=')O; !P;W1G;P!P
XM;W0@<&]R="!D871A('=R:71E(&%N9"!S=&%R= !J;WET97-T '=R:71E(&%L
XM;"!F;W5R(&IO>7-T:6-K+6UO=7-E(&-O=6YT97)S '-T<F5Q=0!S=')O8F4@
XM9F]R(&AO<FEZ('-Y;F,@=VET:"!V97)T:6-A;"!B;&%N:R!A;F0@15%5 '-T
XM<G9B; !S=')O8F4@9F]R(&AO<FEZ('-Y;F,@=VET:"!V97)T:6-A;"!B;&%N
XM:P!S=')H;W( <W1R;V)E(&9O<B!H;W)I>F]N=&%L('-Y;F, <W1R;&]N9P!S
XM=')O8F4@9F]R(&ED96YT:69I8V%T:6]N(&]F(&QO;F<@:&]R:7HN(&QI;F4 
XM8FQT8V]N, !B;&ET=&5R(&-O;G1R;VP@<F5G:7-T97(@, !B;'1C;VXQ &)L
XM:71T97(@8V]N=')O;"!R96=I<W1E<B Q &)L=&%F=VT 8FQI='1E<B!F:7)S
XM="!W;W)D(&UA<VL@9F]R('-O=7)C92!! &)L=&%L=VT 8FQI='1E<B!L87-T
XM('=O<F0@;6%S:R!F;W(@<V]U<F-E($$ 8FQT8W!T: !B;&ET=&5R('!O:6YT
XM97(@=&\@<V]U<F-E($,@*&AI9V@@,R!B:71S*0!B;'1C<'1L &)L:71T97(@
XM<&]I;G1E<B!T;R!S;W5R8V4@0R H;&]W(#$U(&)I=',I &)L=&)P=&@ 8FQI
XM='1E<B!P;VEN=&5R('1O('-O=7)C92!"("AH:6=H(#,@8FET<RD 8FQT8G!T
XM; !B;&ET=&5R('!O:6YT97(@=&\@<V]U<F-E($(@*&QO=R Q-2!B:71S*0!B
XM;'1A<'1H &)L:71T97(@<&]I;G1E<B!T;R!S;W5R8V4@02 H:&EG:" S(&)I
XM=',I &)L=&%P=&P 8FQI='1E<B!P;VEN=&5R('1O('-O=7)C92!!("AL;W<@
XM,34@8FET<RD 8FQT9'!T: !B;&ET=&5R('!O:6YT97(@=&\@<V]U<F-E($0@
XM*&AI9V@@,R!B:71S*0!B;'1D<'1L &)L:71T97(@<&]I;G1E<B!T;R!S;W5R
XM8V4@1" H;&]W(#$U(&)I=',I &)L='-I>F4 8FQI='1E<B!S=&%R="!A;F0@
XM<VEZ92 H=VEN9&]W('=I9'1H+"!H96EG:'0I &)L=&-M;V0 8FQI='1E<B!M
XM;V1U;&\@9F]R('-O=7)C92!# &)L=&)M;V0 8FQI='1E<B!M;V1U;&\@9F]R
XM('-O=7)C92!" &)L=&%M;V0 8FQI='1E<B!M;V1U;&\@9F]R('-O=7)C92!!
XM &)L=&1M;V0 8FQI='1E<B!M;V1U;&\@9F]R('-O=7)C92!$ &)L=&-D870 
XM8FQI='1E<B!S;W5R8V4@0R!D871A &)L=&)D870 8FQI='1E<B!S;W5R8V4@
XM0B!D871A &)L=&%D870 8FQI='1E<B!S;W5R8V4@02!D871A &1S:W-Y;F, 
XM9&ES:R!S>6YC('!A='1E<FX@9F]R(&1I<VL@<F5A9 !C;W Q;&-H &-O<'!E
XM<B!F:7)S="!L;V-A=&EO;B H:&EG:" S(&)I=',I &-O<#%L8VP 8V]P<&5R
XM(&9I<G-T(&QO8V%T:6]N("AL;W<@,34@8FET<RD 8V]P,FQC: !C;W!P97(@
XM<V5C;VYD(&QO8V%T:6]N("AH:6=H(#,@8FET<RD 8V]P,FQC; !C;W!P97(@
XM<V5C;VYD(&QO8V%T:6]N("AL;W<@,34@8FET<RD 8V]P:FUP,0!R97-T87)T
XM(&-O<'!E<B!A="!F:7)S="!L;V-A=&EO;@!C;W!J;7 R ')E<W1A<G0@8V]P
XM<&5R(&%T('-E8V]N9"!L;V-A=&EO;@!C;W!I;G, 8V]P<&5R(&EN<W1R=6-T
XM:6]N(&9E=&-H(&ED96YT:69Y &1I=W-T<G0 9&ES<&QA>2!W:6YD;W<@<W1A
XM<G0@*'5P<&5R(&QE9G0@=F5R="UH;W)I>B!P;W-I=&EO;BD 9&EW<W1O< !D
XM:7-P;&%Y('=I;F1O=R!S=&]P("AL;W=E<B!R:6=H="!V97)T+6AO<FEZ('!O
XM<VET:6]N*0!D9&9S=')T &1I<W!L87D@8FET('!L86YE(&1A=&$@9F5T8V@@
XM<W1A<G0@*&AO<FEZ+B!P;W-I=&EO;BD 9&1F<W1O< !D:7-P;&%Y(&)I="!P
XM;&%N92!D871A(&9E=&-H('-T;W @*&AO<FEZ+B!P;W-I=&EO;BD 9&UA8V]N
XM $1-02!C;VYT<F]L('=R:71E("AC;&5A<B!O<B!S970I &-L>&-O;@!C;VQL
XM:7-I;VX@8V]N=')O; !I;G1E;F$ :6YT97)R=7!T(&5N86)L92!B:71S &EN
XM=')E<0!I;G1E<G)U<'0@<F5Q=65S="!B:71S &%D:V-O;@!A=61I;RP@9&ES
XM:RP@54%25"!C;VYT<F]L &%U9#!L8V@ 875D:6\@8VAA;FYE;" P(&QO8V%T
XM:6]N("AH:6=H(#,@8FET<RD 875D,&QC; !A=61I;R!C:&%N;F5L(# @;&]C
XM871I;VX@*&QO=R Q-2!B:71S*0!A=60P;&5N &%U9&EO(&-H86YN96P@,"!L
XM96YG=&@ 875D,'!E<@!A=61I;R!C:&%N;F5L(# @<&5R:6]D &%U9#!V;VP 
XM875D:6\@8VAA;FYE;" P('9O;'5M90!A=60P9&%T &%U9&EO(&-H86YN96P@
XM,"!D871A &%U9#%L8V@ 875D:6\@8VAA;FYE;" Q(&QO8V%T:6]N("AH:6=H
XM(#,@8FET<RD 875D,6QC; !A=61I;R!C:&%N;F5L(#$@;&]C871I;VX@*&QO
XM=R Q-2!B:71S*0!A=60Q;&5N &%U9&EO(&-H86YN96P@,2!L96YG=&@ 875D
XM,7!E<@!A=61I;R!C:&%N;F5L(#$@<&5R:6]D &%U9#%V;VP 875D:6\@8VAA
XM;FYE;" Q('9O;'5M90!A=60Q9&%T &%U9&EO(&-H86YN96P@,2!D871A &%U
XM9#)L8V@ 875D:6\@8VAA;FYE;" R(&QO8V%T:6]N("AH:6=H(#,@8FET<RD 
XM875D,FQC; !A=61I;R!C:&%N;F5L(#(@;&]C871I;VX@*&QO=R Q-2!B:71S
XM*0!A=60R;&5N &%U9&EO(&-H86YN96P@,B!L96YG=&@ 875D,G!E<@!A=61I
XM;R!C:&%N;F5L(#(@<&5R:6]D &%U9#)V;VP 875D:6\@8VAA;FYE;" R('9O
XM;'5M90!A=60R9&%T &%U9&EO(&-H86YN96P@,B!D871A &%U9#-L8V@ 875D
XM:6\@8VAA;FYE;" S(&QO8V%T:6]N("AH:6=H(#,@8FET<RD 875D,VQC; !A
XM=61I;R!C:&%N;F5L(#,@;&]C871I;VX@*&QO=R Q-2!B:71S*0!A=60S;&5N
XM &%U9&EO(&-H86YN96P@,R!L96YG=&@ 875D,W!E<@!A=61I;R!C:&%N;F5L
XM(#,@<&5R:6]D &%U9#-V;VP 875D:6\@8VAA;FYE;" S('9O;'5M90!A=60S
XM9&%T &%U9&EO(&-H86YN96P@,R!D871A &)P;#%P=&@ 8FQI='1E<B!P;&%N
XM92 Q('!O:6YT97(@*&AI9V@@,R!B:71S*0!B<&PQ<'1L &)L:71T97(@<&QA
XM;F4@,2!P;VEN=&5R("AL;W<@,34@8FET<RD 8G!L,G!T: !B;&ET=&5R('!L
XM86YE(#(@<&]I;G1E<B H:&EG:" S(&)I=',I &)P;#)P=&P 8FQI='1E<B!P
XM;&%N92 R('!O:6YT97(@*&QO=R Q-2!B:71S*0!B<&PS<'1H &)L:71T97(@
XM<&QA;F4@,R!P;VEN=&5R("AH:6=H(#,@8FET<RD 8G!L,W!T; !B;&ET=&5R
XM('!L86YE(#,@<&]I;G1E<B H;&]W(#$U(&)I=',I &)P;#1P=&@ 8FQI='1E
XM<B!P;&%N92 T('!O:6YT97(@*&AI9V@@,R!B:71S*0!B<&PT<'1L &)L:71T
XM97(@<&QA;F4@-"!P;VEN=&5R("AL;W<@,34@8FET<RD 8G!L-7!T: !B;&ET
XM=&5R('!L86YE(#4@<&]I;G1E<B H:&EG:" S(&)I=',I &)P;#5P=&P 8FQI
XM='1E<B!P;&%N92 U('!O:6YT97(@*&QO=R Q-2!B:71S*0!B<&PV<'1H &)L
XM:71T97(@<&QA;F4@-B!P;VEN=&5R("AH:6=H(#,@8FET<RD 8G!L-G!T; !B
XM;&ET=&5R('!L86YE(#8@<&]I;G1E<B H;&]W(#$U(&)I=',I &)P;&-O;C  
XM8FET('!L86YE(&-O;G1R;VP@8FET<P!B<&QC;VXQ &)I="!P;&%N92!S8W)O
XM;&P@=F%L=65S(&9O<B!01C$@)B!01C( 8G!L8V]N,@!B:70@<&QA;F4@<')I
XM;W)I='D@8V]N=')O; !B<&PQ;6]D &)I="!P;&%N92!M;V1U;&\@9F]R(&]D
XM9"!P;&%N97, 8G!L,FUO9 !B:70@<&QA;F4@;6]D=6QO(&9O<B!E=F5N('!L
XM86YE<P!B<&PQ9&%T &)I="!P;&%N92 Q(&1A=&$@*'!A<F%L;&5L+71O+7-E
XM<FEA;"!C;VYV97)T*0!B<&PR9&%T &)I="!P;&%N92 R(&1A=&$@*'!A<F%L
XM;&5L+71O+7-E<FEA;"!C;VYV97)T*0!B<&PS9&%T &)I="!P;&%N92 S(&1A
XM=&$@*'!A<F%L;&5L+71O+7-E<FEA;"!C;VYV97)T*0!B<&PT9&%T &)I="!P
XM;&%N92 T(&1A=&$@*'!A<F%L;&5L+71O+7-E<FEA;"!C;VYV97)T*0!B<&PU
XM9&%T &)I="!P;&%N92 U(&1A=&$@*'!A<F%L;&5L+71O+7-E<FEA;"!C;VYV
XM97)T*0!B<&PV9&%T &)I="!P;&%N92 V(&1A=&$@*'!A<F%L;&5L+71O+7-E
XM<FEA;"!C;VYV97)T*0!S<'(P<'1H '-P<FET92 P('!O:6YT97(@*&AI9V@@
XM,R!B:71S*0!S<'(P<'1L '-P<FET92 P('!O:6YT97(@*&QO=R Q-2!B:71S
XM*0!S<'(Q<'1H '-P<FET92 Q('!O:6YT97(@*&AI9V@@,R!B:71S*0!S<'(Q
XM<'1L '-P<FET92 Q('!O:6YT97(@*&QO=R Q-2!B:71S*0!S<'(R<'1H '-P
XM<FET92 R('!O:6YT97(@*&AI9V@@,R!B:71S*0!S<'(R<'1L '-P<FET92 R
XM('!O:6YT97(@*&QO=R Q-2!B:71S*0!S<'(S<'1H '-P<FET92 S('!O:6YT
XM97(@*&AI9V@@,R!B:71S*0!S<'(S<'1L '-P<FET92 S('!O:6YT97(@*&QO
XM=R Q-2!B:71S*0!S<'(T<'1H '-P<FET92 T('!O:6YT97(@*&AI9V@@,R!B
XM:71S*0!S<'(T<'1L '-P<FET92 T('!O:6YT97(@*&QO=R Q-2!B:71S*0!S
XM<'(U<'1H '-P<FET92 U('!O:6YT97(@*&AI9V@@,R!B:71S*0!S<'(U<'1L
XM '-P<FET92 U('!O:6YT97(@*&QO=R Q-2!B:71S*0!S<'(V<'1H '-P<FET
XM92 V('!O:6YT97(@*&AI9V@@,R!B:71S*0!S<'(V<'1L '-P<FET92 V('!O
XM:6YT97(@*&QO=R Q-2!B:71S*0!S<'(W<'1H '-P<FET92 W('!O:6YT97(@
XM*&AI9V@@,R!B:71S*0!S<'(W<'1L '-P<FET92 W('!O:6YT97(@*&QO=R Q
XM-2!B:71S*0!S<'(P<&]S '-P<FET92 P('9E<G0M:&]R:7H@<W1A<G0@<&]S
XM:71I;VX <W!R,&-T; !S<')I=&4@,"!V97)T('-T;W @<&]S:71I;VX@86YD
XM(&-O;G1R;VP@9&%T80!S<'(P9&%T80!S<')I=&4@,"!I;6%G92!D871A(')E
XM9VES=&5R($$ <W!R,&1A=&( <W!R:71E(# @:6UA9V4@9&%T82!R96=I<W1E
XM<B!" '-P<C%P;W, <W!R:71E(#$@=F5R="UH;W)I>B!S=&%R="!P;W-I=&EO
XM;@!S<'(Q8W1L '-P<FET92 Q('9E<G0@<W1O<"!P;W-I=&EO;B!A;F0@8V]N
XM=')O;"!D871A '-P<C%D871A '-P<FET92 Q(&EM86=E(&1A=&$@<F5G:7-T
XM97(@00!S<'(Q9&%T8@!S<')I=&4@,2!I;6%G92!D871A(')E9VES=&5R($( 
XM<W!R,G!O<P!S<')I=&4@,B!V97)T+6AO<FEZ('-T87)T('!O<VET:6]N '-P
XM<C)C=&P <W!R:71E(#(@=F5R="!S=&]P('!O<VET:6]N(&%N9"!C;VYT<F]L
XM(&1A=&$ <W!R,F1A=&$ <W!R:71E(#(@:6UA9V4@9&%T82!R96=I<W1E<B!!
XM '-P<C)D871B '-P<FET92 R(&EM86=E(&1A=&$@<F5G:7-T97(@0@!S<'(S
XM<&]S '-P<FET92 S('9E<G0M:&]R:7H@<W1A<G0@<&]S:71I;VX <W!R,V-T
XM; !S<')I=&4@,R!V97)T('-T;W @<&]S:71I;VX@86YD(&-O;G1R;VP@9&%T
XM80!S<'(S9&%T80!S<')I=&4@,R!I;6%G92!D871A(')E9VES=&5R($$ <W!R
XM,V1A=&( <W!R:71E(#,@:6UA9V4@9&%T82!R96=I<W1E<B!" '-P<C1P;W, 
XM<W!R:71E(#0@=F5R="UH;W)I>B!S=&%R="!P;W-I=&EO;@!S<'(T8W1L '-P
XM<FET92 T('9E<G0@<W1O<"!P;W-I=&EO;B!A;F0@8V]N=')O;"!D871A '-P
XM<C1D871A '-P<FET92 T(&EM86=E(&1A=&$@<F5G:7-T97(@00!S<'(T9&%T
XM8@!S<')I=&4@-"!I;6%G92!D871A(')E9VES=&5R($( <W!R-7!O<P!S<')I
XM=&4@-2!V97)T+6AO<FEZ('-T87)T('!O<VET:6]N '-P<C5C=&P <W!R:71E
XM(#4@=F5R="!S=&]P('!O<VET:6]N(&%N9"!C;VYT<F]L(&1A=&$ <W!R-61A
XM=&$ <W!R:71E(#4@:6UA9V4@9&%T82!R96=I<W1E<B!! '-P<C5D871B '-P
XM<FET92 U(&EM86=E(&1A=&$@<F5G:7-T97(@0@!S<'(V<&]S '-P<FET92 V
XM('9E<G0M:&]R:7H@<W1A<G0@<&]S:71I;VX <W!R-F-T; !S<')I=&4@-B!V
XM97)T('-T;W @<&]S:71I;VX@86YD(&-O;G1R;VP@9&%T80!S<'(V9&%T80!S
XM<')I=&4@-B!I;6%G92!D871A(')E9VES=&5R($$ <W!R-F1A=&( <W!R:71E
XM(#8@:6UA9V4@9&%T82!R96=I<W1E<B!" '-P<C=P;W, <W!R:71E(#<@=F5R
XM="UH;W)I>B!S=&%R="!P;W-I=&EO;@!S<'(W8W1L '-P<FET92 W('9E<G0@
XM<W1O<"!P;W-I=&EO;B!A;F0@8V]N=')O;"!D871A '-P<C=D871A '-P<FET
XM92 W(&EM86=E(&1A=&$@<F5G:7-T97(@00!S<'(W9&%T8@!S<')I=&4@-R!I
XM;6%G92!D871A(')E9VES=&5R($( 8V]L;W(P  !C;VQO<C$  &-O;&]R,@  
XM8V]L;W(S  !C;VQO<C0  &-O;&]R-0  8V]L;W(V  !C;VQO<C<  &-O;&]R
XM.   8V]L;W(Y  !C;VQO<C$P  !C;VQO<C$Q  !C;VQO<C$R  !C;VQO<C$S
XM  !C;VQO<C$T  !C;VQO<C$U  !C;VQO<C$V  !C;VQO<C$W  !C;VQO<C$X
XM  !C;VQO<C$Y  !C;VQO<C(P  !C;VQO<C(Q  !C;VQO<C(R  !C;VQO<C(S
XM  !C;VQO<C(T  !C;VQO<C(U  !C;VQO<C(V  !C;VQO<C(W  !C;VQO<C(X
XM  !C;VQO<C(Y  !C;VQO<C,P  !C;VQO<C,Q     $Y5__Q![( "*TC__& >
XM(&W__# H  BP;0 (9@@@+?_\3EU.=0:M    #/_\(&W__ QH__\ "&;6< !@
XMY$Y5_^@@;0 (""@    !9P  XB!M  @P$.! P'P _SM __X@;0 (,!#B0,!\
XM '\[0/_\(&T "# H  +@0,!\ '\[0/_Z(&T "# H  +B0,!\ '\[0/_X(&T 
XM"# H  + ?(  .T#_]B!M  @(*     -G#$AZ 0!.N@@"6$]@"DAZ /I.N@?V
XM6$]*;?_V9@Q(>@#P3KH'YEA/8 I(>@#I3KH'VEA//RW__#\M__Y(>@#93KH'
XMR%!/(&T "#\H  (@;0 (/Q!(>@#13KH'L%!/#&T ?__Z9@@,;0!___AG$C\M
XM__@_+?_Z2'H PTZZ!XY03V!T(&T "# 0P'P!_SM __0_+?_T3KK^OE1/*T#_
XM\$JM__!G%"!M__ K4/_L(&W_\"MH  3_Z& 00?H E2M(_^Q!^@"<*TC_Z"\M
XM_^P@;0 (/R@  DAZ (E.N@<P3^\ "B!M_^A*$&<.+RW_Z$AZ 'U.N@<84$](
XM>@!X3KH'#EA/3EU.=0ES:VEP  EW86ET  EB9BP "0!V<&]S/25D+&AP;W,]
XM)60 :6YS=')U8W1I;VX@)7@L("5X"@ L=F-O;7 ])60L:&-O;7 ])60* %5.
XM2TY/5TY?3U!#3T1%   );6]V90DE>"PE<P ).R5S  H 3E4  $JM  AF$DAZ
XM $)(;(H"3KH!TE!/3EU.=2!M  A8K0 (+PA.NOWV6$\@;0 (#%#__V<,(&T 
XM" QH__X  F;:+RT "$ZZ_=983V#*8V]P9&ES.B!C;W!P97(@;&ES="!P;VEN
XM=&5R(&ES(&YU;&P*  !.50  0J=(>@"J3KH1Q%!/*4")/DJLB3YF&$AZ *=(
XM;(H"3KH!3E!//SP  4ZZ#T)43TAZ *].N@7L6$\@;(D^+R@ )DZZ_T983TAZ
XM +!.N@746$\@;(D^(F@ (B!1(F@ ""\I !1.NO\D6$](>@"W3KH%LEA/(&R)
XM/B)H "(@42)H  @O*0 83KK_ EA/2'H ODZZ!9!83R!LB3XB:  B(&D !"\H
XM  1.NO[B6$].74YU9W)A<&AI8W,N;&EB<F%R>0!C;W5L9&XG="!O<&5N(&=R
XM87!H:6-S+FQI8G)A<GD* $=F>$)A<V4G<R!C;W!I;FET(&QI<W0Z"@ *5&]P
XM(%9I97=P;W)T)W,@9&ES<&QA>2!,(&EN<W1R=6-T:6]N<SH*  I4;W @5FEE
XM=W!O<G0G<R!D:7-P;&%Y(%,@:6YS=')U8W1I;VYS.@H "D-U<G)E;G1L>2!A
XM8W1I=F4@3$]&(&-O<'!E<B!L:7-T.@H 3E4  "EM  B+FDAM ! O+0 ,2'H 
XM#DZZ!41/[P ,3EU.=4Y5   O+(N:/RT "$ZZ"09<3TY=3G5A<$/LBYI%[(N:
XMM<EF#C(\ !1K"'0 (L)1R?_\*4^+HBQX  0I3HNF2.> @ @N  0!*6<02_H 
XM"$ZN_^)@!D*G\U].<T/Z "!.KOYH*4"+JF8,+CP  X '3J[_E& $3KH &E!/
XM3G5D;W,N;&EB<F%R>0!)^0  ?_Y.=4Y5   O"DAY  $  # LBX[!_  &+P!.
XMN@]6*4"+KE!/9A1"ITAY  $  $ZZ#QI03RYLBZ).=2!LBZY":  $(&R+KC%\
XM  $ $"!LBZXQ?  !  H@;(NB("R+HI"H  10@"E B[(@;(NR(+Q-04Y80J=.
XMN@\*)$!*J@"L6$]G+B\M  PO+0 (+PI.N@"N.7P  8NV(&R+K@!H@   !"!L
XMBZX :(    I/[P ,8$)(:@!<3KH/*$AJ %Q.N@[F*4"+N"!LB[A*J  D4$]G
XM$"!LB[@B:  D+Q%.N@X&6$\O+(NX+PI.N@)H*6R+N(N\4$].N@X&(&R+KB" 
XM3KH.)B!LBZXA0  &9Q9(> /M2'H *DZZ#@(@;(NN(4  #%!/+RR+O#\LB\!.
XMNORV0F=.N@P@4$\D7TY=3G4J $Y5  !(YPPP)&T $"!M  A*J "L9Q@@;0 (
XM("@ K.6 *  @1" H !#E@"9 8 0F;(N0$!-(@$C T*T #%2 .4"+PD*G,"R+
XMPDC +P!.N@WH*4"+Q%!/9@A,WPPP3EU.=1 32( Z #\%($M2B"\(+RR+Q$ZZ
XM 7XP!4C ($#1[(O$0_H!1!#99OP_+0 .+PHO+(O$3KH!.B!LB\1",%  .7P 
XM 8O , 5(P-"LB\0F0%*+)$M/[P 4$!-(@#H L'P (&<8NGP "6<2NGP #&<,
XMNGP #6<&NGP "F8$4HM@V P3 "!M>@P3 ")F+E*+($M2BQ 02( Z &<>($I2
XMBA"%NGP (F80#!, (F8$4HM@!D(J__]@ F#68#@@2U*+$!!(@#H 9R:Z?  @
XM9R"Z?  )9QJZ?  ,9Q2Z?  -9PZZ?  *9P@@2E**$(5@SB!*4HI"$$I%9@)3
XMBU)LB\!@ /]:0A)"IS LB\!20$C Y8 O $ZZ#,8I0(N\4$]F"$)LB\!@ /[8
XM>@ F;(O$8"0P!4C Y8 @;(N\(8L( "!+( A*&&;\D<!3B# (4D!(P-? 4D6Z
XM;(O ;=8P!4C Y8 @;(N\0K ( &  _I0@ # \?_]@!# O  P@;P $2AAF_%-(
XM(F\ "%- $-E7R/_\9P)"$" O  1.=4SO P  !" (,B\ #& "$-E7R?_\9P92
XM06 "0AA1R?_\3G5.50  2.<.,"1M  A"ITAZ (Y.N@Q0*4"+R%!/9@A,WPQP
XM3EU.=2!M  PB:  D+RD !$ZZ#( H %A/9U)(>@!M($0O*  V3KH,4B9 2H!0
XM3V<T2'@#[2\+3KH+;"P 4$]G)" &Y8 J "!%)6@ " "D)48 G$AX ^U(>@ X
XM3KH+2"5  *!03R\$3KH,'EA/+RR+R$ZZ"WY"K(O(6$]@@&EC;VXN;&EB<F%R
XM>0!724Y$3U< *@!.50  2&T #"\M  A(>@1@3KH F$_O  Q.74YU3E4  $CG
XM"" D;0 .#&T !  29@@@;0 (*!!@'$IM  QO#"!M  AP # 0* !@"B!M  @P
XM$$C * !";0 22FT #&P01&T #$J$; A$A#M\  $ $C(M  Q(P2 $3KH#D$'L
XMB4)3BA2P   R+0 ,2,$@!$ZZ X8H &;:2FT $F<&4XH4O  M( I,WP003EU.
XM=4Y5_R)(YP@P)&T ""9M  Q";?_Z*VT $/_\($M2BQ 02( X &<  NZX?  E
XM9@ "S$(M_S [?  !__@[?  @__8[?"<0__0@2U*+$!!(@#@ L'P +68.0FW_
XM^"!+4HL0$$B . "X?  P9A [?  P__8@2U*+$!!(@#@ N'P *F88(&W__%2M
XM__P[4/_R($M2BQ 02( X & R0FW_\F <,"W_\L'\  K01)!\ # [0/_R($M2
XMBQ 02( X # $4D!![(E4"#   @  9M2X?  N9EH@2U*+$!!(@#@ L'P *F88
XM(&W__%2M__P[4/_T($M2BQ 02( X & R0FW_]& <,"W_],'\  K01)!\ # [
XM0/_T($M2BQ 02( X # $4D!![(E4"#   @  9M0[?  "__"X? !L9A(@2U*+
XM$!!(@#@ .WP !/_P8!"X? !H9@H@2U*+$!!(@#@ , 1(P&!Z.WP "/_N8!8[
XM?  *_^Y@#CM\ !#_[F &.WS_]O_N/RW_\$AM_S _+?_N+RW__$ZZ_>0K0/_J
XM,"W_\$C T:W__$_O  Q@7"!M__Q8K?_\(E K2?_J( E*&6;\D\!3B3M)__!@
XM2B!M__Q4K?_\.!!![?\O*TC_ZA"$8"B0O    &-GXE. 9Y*0O     MG /]R
XM68!GLE6 9P#_<%> 9P#_<F#,0>W_,)'M_^H[2/_P,"W_\+!M__1O!CMM__3_
XM\$IM__AG:"!M_^H,$  M9PH@;?_J#!  *V8N#&T ,/_V9B93;?_R(&W_ZE*M
XM_^H0$$B /P!.DK!\__]43V8*</],WPP03EU.=6 6/RW_]DZ2L'S__U1/9@1P
XM_V#D4FW_^C M__)3;?_RL&W_\&[<0FW_[F @(&W_ZE*M_^H0$$B /P!.DK!\
XM__]43V8$</]@L%)M_^X@;?_J2A!G"C M_^ZP;?_T;<XP+?_NT6W_^DIM__AF
XM*& 8/SP ($Z2L'S__U1/9@9P_V  _WA2;?_Z,"W_\E-M__*P;?_P;MI@%C\$
XM3I*P?/__5$]F!G#_8 #_4E)M__I@ /T(,"W_^F  _T)(YT@ 0H1*@&H$1(!2
XM1$J!:@9$@0I$  %A/DI$9P)$@$S? !)*@$YU2.=( $*$2H!J!$2 4D1*@6H"
XM1(%A&B !8-@O 6$2( $B'TJ 3G4O 6$&(A]*@$YU2.<P $A!2D%F($A!-@$T
XM $) 2$" PR( 2$ R H+#, %"04A!3-\ #$YU2$$F 2( 0D%(04A 0D!T#]" 
XMTX&V@6($DH-20%'*__),WP ,3G5.50  2&R)[#\M  A.N@ (7$].74YU3E4 
XM "\$."T ""\M  H_!$ZZ #"X?  *7$]F)"!M  H0*  ,2( (   '9Q0_//__
XM+RT "DZZ /1<3R@?3EU.=6#X3E4  "\*)&T "B!2L>H !&48,"T ",!\ /\_
XM "\*3KH R%Q/)%].74YU(%)2DA M  D0@$B P'P _V#H3E4  "\*0>R)UB1(
XM($K5_    !8O"&$06$]![(N.M<AEZB1?3EU.=4Y5  !(YP@@)&T "'@ ( IF
XM"G#_3-\$$$Y=3G5**@ ,9U (*@ "  QG##\\__\O"F%2. !<3Q J  U(@#\ 
XM3KH%'(A ""H  0 ,5$]G"B\J  A.N@(N6$\(*@ %  QG$B\J !).N@+ +RH 
XM$DZZ A103T*20JH !$*J  A"*@ ,, 1@D$Y5__Y(YP@@)&T "$'Z_T8I2(O,
XM""H !  ,9PIP_TS?!!!.74YU""H  @ ,9S @4I'J  @X"#\$+RH "! J  U(
XM@#\ 3KH"@+!$4$]G$ CJ  0 #$*20JH !'#_8, ,;?__  QF$ BJ  ( #$*2
XM0JH !'  8*A*J@ (9@@O"DZZ )I83PQJ  $ $&8J&VT #?__/SP  4AM__\0
XM*@ -2( _ $ZZ B*P?  !4$]FH# M  Q@ /]J)*H "# J !!(P-"J  @E0  $
XM".H  @ ,(%)2DA M  T0@$B P'P _V  _SY.50  +PI![(G6)$A**@ ,9QC5
XM_    !9![(N.M<AE"'  )%].74YU8.)"DD*J  1"J@ (( I@ZDY5__PO"B1M
XM  @_/ 0 3KH P"M __Q43V88-7P  0 0($K1_     XE2  ()%].74YU-7P$
XM   0".H  0 ,)6W__  ($"H #4B /P!.N@#B2D!43V<& "H @  ,8,Y.50  
XM2.< ,"1LBYY@%"92("H !%" +P O"DZZ!$Y03R1+( IFZ$*LBYY,WPP 3EU.
XM=4Y5   O"D'Z_\8I2(O00J<@+0 (4( O $ZZ _PD0$J 4$]F"'  )%].74YU
XM)*R+GB5M  @ !"E*BYX@"E" 8.9.50  <  P+0 (+P!ALEA/3EU.=4Y5  !(
XMYP PE\LD;(N>8 X@;0 (48BQRF<2)DHD4B *9NYP_TS?# !.74YU( MG!":2
XM8 0I4HN>("H !%" +P O"DZZ Z!P %!/8-A.50  +PHP+0 (P?P !B1 U>R+
XMKDIM  AM#C M  BP;(N.; 1*DF8..7P  HO4</\D7TY=3G4P+0 (P?P !B!L
XMBZXO, @ 3KH"QDJ 6$]G!' !8 )P &#83E4  "\M  A.N@*02H!83V8.3KH"
XMFCE B]1P_TY=3G5P &#X3E4  $CG#" X+0 (3KH <# $P?P !B1 U>R+KDI$
XM;0JX;(N.; 1*DF80.7P  HO4</],WP0P3EU.=3 J  3 ?  #9@HY?  %B]1P
XM_V#D<  P+0 .+P O+0 *+Q).N@)F*@"PO/____]/[P ,9@Q.N@(:.4"+U'#_
XM8+@@!6"T3E7__$AX$ !"ITZZ LXK0/_\"   #%!/9Q)*;(NV9@@@+?_\3EU.
XM=4ZZ  9P &#T3E4  $AX  1(>@ <3KH!\"\ 3KH" C\\  %.N@ .3^\ #DY=
XM3G5>0PH 3E4  $JLB\QG!B!LB\Q.D#\M  A.N@ (5$].74YU3E7__"\$,"T 
XM"$C *T#__$JLBZYG*'@ 8 H_!$ZZ /Y43U)$N&R+CFWP,"R+CL'\  8O "\L
XMBZY.N@'L4$]*K(O09P8@;(O03I!*K(N49PHO+(N43KH!:%A/2JR+UF<((&R+
XMUB"LB]I*K(O>9PHO+(O>3KH!A%A/2JR+XF<*+RR+XDZZ 7183TJLB^9G"B\L
XMB^9.N@%D6$]*K(OJ9PHO+(OJ3KH!5%A/+'@ ! @N  0!*6<4+PU+^@ *3J[_
XMXBI?8 9"I_-?3G-*K(NX9C!*K(O$9R@P+(O"2, O "\LB\1.N@%$,"R+P%) 
XM2,#E@"\ +RR+O$ZZ 3!/[P 08 Y.N@$>+RR+N$ZZ 4Y83R M__PN;(NB3G4H
XM'TY=3G5.50  2.<.(#@M  @P!,'\  8D0-7LBZY*1&T*N&R+CFP$2I)F$#E\
XM  *+U'#_3-\$<$Y=3G4(*@ '  1F""\23KH "EA/0I)P &#B(B\ !"QLBZI.
XM[O_<(B\ !"QLBZI.[O^"(B\ !"QLBZI.[O^X+&R+JD[N_\HL;(NJ3N[_?"(O
XM  0L;(NJ3N[_*$SO  8 !"QLBZI.[O_B+&R+JD[N_\1.^@ "(B\ !"QLBZI.
XM[O^F3.\ #@ $+&R+JD[N_]!(YP$$3.\@@  ,+&R+IDZN_Y1,WR" 3G5.^@ "
XM(F\ !"QLBZ9.[OYB3.\  P $+&R+ID[N_SHB;P $+&R+ID[N_MHL;(NF3N[_
XM?")O  0@+P (+&R+ID[N_RX@;P $+&R+ID[N_HQ.^@ "+&R+IB)O  0@+P (
XM3N[]V")O  0L;(NF3N[^ADSO  , !"QLBZ9.[O[.(&\ !"QLBZ9.[OZ 3.\#
XM   $+&R+R$[N_Z @;P $+&R+R$[N_Z8@;P $+&R+R$[N_[(   /L     0  
XM  $  "":         _(   /J   "Y@    0    ,         #L   !#  ( 
XM     &D   !O  0      )L   "B  8      ,@   #0  @      /4   #]
XM  H      2    $H  P      4L   %2  X      7(   %Z !       9P 
XM  &D !(      <D   '1 !0      ?8   '] !8      A    (8 !@     
XM CD   )! !H      F    )H !P      H,   *+ !X      J<   *N "  
XM     LD   +0 "(      NL   +R "0      OX   ,% "8      QD   ,@
XM "@      S    ,V "H      V,   -J "P      Y    .7 "X      [< 
XM  .^ #       ^,   /J #(     ! D   0/ #0     !"T   0U #8     
XM!%P   1C #@     !)4   2< #H     !,8   3- #P     !.@   3P #X 
XM    !1X   4F $      !4$   5) $(     !60   5L $0     !9$   69
XM $8     !;T   7% $@     !>\   7W $H     !B$   8I $P     !E, 
XM  9; $X     !H4   :- %      !K<   :_ %(     !ND   ;Q %0     
XM!QL   <C %8     !TT   =5 %@     !X,   >+ &      !Z<   >O &( 
XM    !\L   ?3 &0     !^\   ?W &8     "!,   @; '      "#$   @Y
XM '(     "$\   A7 '0     "&T   AU 'X     ")4   B= (      ",$ 
XM  C) ((     ".T   CU (0     "1H   DB (8     "4<   E/ (@     
XM"7    EX (H     "9H   FA (P     "<,   G+ (X     "@$   H) )  
XM    "C\   I' )(     "GP   J$ )0     "K@   J_ )8     "N    KG
XM )@     "OD   L  )H     "Q8   L= )P     "S0   L[ )X     "U4 
XM  M= *      "X0   N, *(     "[,   N[ *0     "](   O: *8     
XM"_$   OY *@     #!    P8 *H     #"T   PU +      #%P   QD +( 
XM    #(L   R3 +0     #*H   RR +8     #,D   S1 +@     #.@   SP
XM +H     #04   T- ,      #30   T\ ,(     #6,   UK ,0     #8( 
XM  V* ,8     #:$   VI ,@     #<    W( ,H     #=T   WE -      
XM#@P   X4 -(     #CL   Y# -0     #EH   YB -8     #GD   Z! -@ 
XM    #I@   Z@ -H     #K4   Z] .      #N,   [K .(     #Q$   \9
XM .0     #S\   ]' .8     #VT   ]U .@     #YL   ^C .H     #\D 
XM  _1 .P     #_<   __ .X     $"4  ! M /      $%,  !!; /(     
XM$($  !") /0     $*\  !"W /8     $-T  !#E 0      $/P  !$$ 0( 
XM    $2H  !$R 00     $4T  !%5 0@     $74  !%] 0H     $9X  !&F
XM 1      $=0  !'< 1(     $@H  !(2 10     $D   !)( 18     $G8 
XM !)^ 1@     $JP  !*T 1H     $N(  !+J 2      $PD  !,1 2(     
XM$S   !,X 20     $U<  !-? 28     $WX  !.& 2@     $Z4  !.M 2H 
XM    $\P  !/4 2P     $_,  !/[ 2X     %!H  !0B 3      %$$  !1)
XM 3(     %&@  !1P 30     %(\  !27 38     %+8  !2^ 3@     %-T 
XM !3E 3H     %00  !4, 3P     %2L  !4S 3X     %5(  !5: 4      
XM%7T  !6% 4(     %;(  !6[ 40     %=H  !7C 48     %@(  !8* 4@ 
XM    %BT  !8U 4H     %F(  !9K 4P     %HH  !:3 4X     %K(  !:Z
XM 5      %MT  !;E 5(     %Q(  !<; 50     %SH  !=# 58     %V( 
XM !=J 5@     %XT  !>5 5H     %\(  !?+ 5P     %^H  !?S 5X     
XM&!(  !@: 6      &#T  !A% 6(     &'(  !A[ 60     &)H  !BC 68 
XM    &,(  !C* 6@     &.T  !CU 6H     &2(  !DK 6P     &4H  !E3
XM 6X     &7(  !EZ 7      &9T  !FE 7(     &=(  !G; 70     &?H 
XM !H# 78     &B(  !HJ 7@     &DT  !I5 7H     &H(  !J+ 7P     
XM&JH  !JS 7X     &M(  !K9 8   0  &MH  !KA 8(  0  &N(  !KI 80 
XM 0  &NH  !KQ 88  0  &O(  !KY 8@  0  &OH  !L! 8H  0  &P(  !L)
XM 8P  0  &PH  !L1 8X  0  &Q(  !L9 9   0  &QH  !LA 9(  0  &R( 
XM !LJ 90  0  &RL  !LS 98  0  &S0  !L\ 9@  0  &ST  !M% 9H  0  
XM&T8  !M. 9P  0  &T\  !M7 9X  0  &U@  !M@ :   0  &V$  !MI :( 
XM 0  &VH  !MR :0  0  &W,  !M[ :8  0  &WP  !N$ :@  0  &X4  !N-
XM :H  0  &XX  !N6 :P  0  &Y<  !N? :X  0  &Z   !NH ;   0  &ZD 
XM !NQ ;(  0  &[(  !NZ ;0  0  &[L  !O# ;8  0  &\0  !O, ;@  0  
XM&\T  !O5 ;H  0  &]8  !O> ;P  0  &]\  !OG ;X  0  &^@  !OI__\ 
XM       P,3(S-#4V-S@Y86)C9&5F    (" @(" @(" @,# P,# @(" @(" @
XM(" @(" @(" @(""00$! 0$! 0$! 0$! 0$! # P,# P,# P,#$! 0$! 0$ )
XM"0D)"0D! 0$! 0$! 0$! 0$! 0$! 0$! 4! 0$! 0 H*"@H*"@(" @(" @("
XM @(" @(" @(" @("0$! 0"                   0     !            
XM          $!     0                     ! @    $             
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM            %                 /L   !B@              !     P 
XM   0    &    !P    D    *    #     T    /    $    !(    3   
XM %0   !8    8    &0   !L    <    '@   !\    A    (@   "0    
XME    )P   "@    J    *P   "T    N    ,    #$    S    -    #8
XM    W    .0   #H    \    /0   #\   !     0@   $,   !%    1@ 
XM  $@   !)    2P   $P   !.    3P   %$   !2    5    %4   !7   
XM 6    %H   !;    70   %X   !@    80   &,   !D    9@   &<   !
XMI    :@   &P   !M    ;P   '    !R    <P   '4   !V    >    'D
XM   ![    ?    'X   !_    @0   ((   "$    A0   (<   "(    B@ 
XM  (L   "-    C@   )    "1    DP   )0   "6    EP   )D   ":   
XM G    )T   "?    H    *(   "C    I0   *8   "H    J0   *L   "
XML    K@   *\   "Q    L@   +0   "U    MP   +@   "Z    NP   +T
XM   "^    P    ,$   ##    Q    ,8   #'    R0   ,H   #,    S0 
XM  ,\   #0    T@   -,   #5    U@   -@   #9    VP   -P   #>   
XM WP   .$   #B    Y    .4   #G    Z    .H   #K    [0   .X   #
XMP    \0   /,   #T    ]@   /<   #Y    ^@   /P   #]    _P   0 
XM   $"   ! P   04   $&   !"    0D   $+   !#    0X   $/   !$0 
XM  1(   $4   !%0   1<   $8   !&@   1L   $=   !'@   2    $A   
XM!(P   20   $F   !)P   2D   $J   !+    2T   $O   !,    3(   $
XMS   !-0   38   $X   !.0   3L   $\   !/@   3\   %!   !0@   40
XM   %%   !1P   4@   %*   !2P   4T   %.   !4    5$   %3   !5  
XM  58   %7   !60   5H   %<   !70   5\   %@   !8@   6,   %E   
XM!9@   6@   %I   !:P   6P   %N   !;P   7$   %R   !=    74   %
XMW   !>    7H   %[   !?0   7X   &    !@0   8,   &$   !A@   8<
XM   &)   !B@   8P   &-   !CP   9    &2   !DP   94   &6   !F  
XM  9D   &;   !G    9X   &?   !H0   :(   &D   !I0   :<   &H   
XM!J@   :L   &M   !K@   ;    &Q   !LP   ;0   &V   !MP   ;D   &
XMZ   !O    ;T   &_   !P    <(   '#   !Q0   <8   '(   !R0   <L
XM   ',   !S@   <\   '1   !T@   =0   '5   !UP   =@   ':   !VP 
XM  =T   '>   !X    >$   'C   !Y    >8   'G   !Z0   >H   'L   
XM![0   >\   'P   !\@   ?,   'U   !]@   ?@   'Y   !^P   ?P   '
XM^   !_P   @$   ("   "!    @4   ('   ""    @H   (+   "#0   @X
XM   (0   "$0   A,   (4   "%@   A<   (9   "&@   AP   (=   "'P 
XM  B    (B   "(P   B4   (F   "*    BD   (K   "+    BX   (O   
XM",0   C(   (T   "-0   C<   (X   ".@   CL   (]   "/@   D    )
XM!   "0P   D0   )&   "1P   DD   )*   "3    DT         _(   /K
X(     0   _(0
X 
Xend

END_OF_FILE
echo shar: NEWLINE appended to \"'copdis.uu'\"
if test 23598 -ne `wc -c <'copdis.uu'`; then
    echo shar: \"'copdis.uu'\" unpacked with wrong size!
fi
# end of 'copdis.uu'
fi
echo shar: End of shell archive.
exit 0
-- 
-- uunet!sugar!karl	"There is hopeful symbolism in the fact that 
-- 			 flags do not wave in a vacuum."  -- Arthur C. Clarke
-- Usenet access: (713) 438-5018