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 = ®isters[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 SE4 "\M A.N@*02H!83V8.3KH" XMFCE B]1P_TY=3G5P Ϥ $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 = ®isters[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 SE4 "\M A.N@*02H!83V8.3KH" XMFCE B]1P_TY=3G5P Ϥ $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