†Æ¾�Á! † "ÀW Àü‡NÅ,¿Äà½÷ RÀ=Í ÷ „  @÷� #ôÁåD ï‡ï ŠD Òƒ÷T÷èP÷ Æ B ¤Ñ‹ü �Áe@W 0ó‡÷ ò¹·,"€&€ ¡ 7   ý‡÷ ‚÷ Ê0ß‹pÿýÀ¬@ÀE€ÿ A‡ Z‚Àe  À  À Í À ÷‹|@ý€7x@‡€ŸÍ Ž úÎeÎE‡ " ü‡æ¾ ÛÆçÀèþÁâþÉÉ‹þÉ È-lÿöÉÉ‹þÉ ðÂeÂ-RÿôéàNÿàHÿàÉ‹þÉ Û‡÷^?‡Àramsrc.a¤‘dbË@-¯‘Gramtek.doc¤‘d M-@̪?pdemos/wine.ram$‘d "@@´–ªÈdemos/README¤�d @¶§éÖdemos/car.ram$‘d æ@@´¨r‹demos/gob.ram$‘d "@@´¶Vwdemos/bottle.ram$‘d "@@´ÇNdemos/seethrum‘d ª,@“´Øádemos/graythrum‘d ž,@“´ïÝ¡demos/graym‘d 8&@“´†demos/tower.ram$‘d "@@´^demos/ramtekm‘d  $@“´+ 2eÿcharout.c@S§d ¤�æ#include "ramtek.h" charout(chrctr,flag) char chrctr,flag; { register int WT,n; register char chr; extern int XNOW,YNOW; chr= ((chrctr>='a')&&(chrctr<='z')? chrctr+'A'-'a':chrctr); WT= 06013; /* WT+RP+OF+DF */ if ((n=nargs())>1) { if ((flag>0) && (flag<4)) WT=| (flag<<4); } in_buf(WT); in_buf(START_POINT); in_buf(XNOW); in_buf(YNOW-9); in_buf(1); in_buf(chr); flush_buf(); in_buf(SET|OF); in_buf(START_POINT); in_buf((XNOW=+ 7)); in_buf(YNOW); flush_buf(); } color_table.c@S§d ¤‘5#include "/user/ramtek/ramtek.h" #define DEBUG 0 #define RGB 0 #define CMY 1 #define HCI 2 #define GRAY 3 #define GREY 3 /* so don't have to fart with correct spelling (if there is one) */ #define NUM_LEVELS 16 #define PI 3.14159 /* * * ****** color_table ******* * * purpose: loads color look-up table. * * calling sequence: color_table(color_space,start_loc,number,comp1,comp2) * * where: * color_space is one of the following * "rgb" - red,green,blue color space * "cmy" - cyan,magenta,yellow color space * "hci" - hue,saturation,lightness color space "gray" or "grey" - gray scale (last 2 components of comp1,comp2 ignored) * * start_loc is the entry in the color table to be * loaded first. (0 TABLE_SIZE) { printf("starting location not in color table \7"); exit(); } if(start_loc + number > TABLE_SIZE) { printf("color table size exceeded \7"); exit(); } if (number <= 0) { printf("illegal number of color table entries\7"); exit(); } for (i=0;i <=2; i++) { if( space==GRAY && i>0 ) break; /* only test first */ if(*pt1 < 0.0 || *pt1 > 1.0 ) { printf("color component out of range \7"); exit(); } if(number > 1) { if(*pt2 < 0.0 || *pt2 > 1.0) { printf("color component out of range \7"); exit(); } delta[i] = ( *pt2 - *pt1 )/(number - 1); /* compute change per entry */ } pt1++; pt2++; } in_buf(LAM); /* send instruction, starting location and number to device */ in_buf(start_loc); in_buf(2*number); pt1 = comp1; pt2 = comp2; comp[0] = *pt1; comp[1] = *(pt1 + 1); comp[2] = *(pt1 + 2); for(i=start_loc;i<(start_loc+number);i++) { switch(space) { case RGB: in_buf(rgb_cvt(comp)); break; case CMY: in_buf(cmy_cvt(comp)); break; case HCI: in_buf(hci_cvt(comp)); break; case GRAY: in_buf( gray_cvt(comp) ); break; } for(j=0;j<=2;j++)comp[j] = comp[j] + delta[j]; } flush_buf(DEBUG); } /* * * convert red blue green values 0-1 into values between * 1-16 and form data word * */ rgb_cvt(comp) float *comp; { int red,blue,green; register float *pt; /* pointer to incoming color vector */ pt = comp; /* pt is now an array base */ red = *pt * (NUM_LEVELS - 1) + 0.5; green = *(pt + 1) * (NUM_LEVELS - 1) + 0.5; blue = *(pt + 2) * (NUM_LEVELS - 1) + 0.5; return( 0 | blue | (green<<4) | (red<<8)); } /* * * transform cyan magenta yellow into red blue green * */ cmy_cvt(comp) float *comp; { int i; /* counter */ float newcomp[3]; /* transformed color vector */ register float *p; /* incoming color vector base */ p = comp; /* set pointer to first element */ for(i = 0;i <= 2;i++) { newcomp[i] = 1. - *p; p++; } return(rgb_cvt(newcomp)); } /* * * transform hue chroma intensity into red blue green * */ hci_cvt(comp) float *comp; { float newcomp[3]; /* transformed hci */ register int i,j; /* counters */ register float *ptr; /* color vector pointer */ float ang; /* temporary variable */ float cos(); /* determine rgb corresponding to hue */ ptr = comp; if(*ptr < 0.1666667 || *ptr > 0.833333)newcomp[0] = 1.0; else if(*ptr < 0.333333) newcomp[0] = 2.0 -6.0 * *ptr; else if( *ptr < 0.666667) newcomp[0] = 0.0; else newcomp[0] = 6.0 * *ptr - 4.; if(*ptr < 0.166667) newcomp[1] = 6.0 * *ptr; else if(*ptr < 0.5) newcomp[1] = 1.0; else if(*ptr < 0.666667) newcomp[1] = 4.0 - 6.0 **ptr; else newcomp[1] = 0.0; if(*ptr < 0.33333) newcomp[2] = 0.0; else if(*ptr < 0.5) newcomp[2] = 6.0 * *ptr - 2.0; else if(*ptr < 0.833333) newcomp[2] = 1.0; else newcomp[2] = 6.0 - 6.0 * *ptr; /* adjust new components to smooth discontinuities */ for(i = 0; i <= 2; i++) { ang = (1.0 - newcomp[i]) * PI; newcomp[i] = (1.0 + cos(ang))/2.0; } /* adjust new components for chroma and intensity */ for (i = 0; i <= 2;i++) { if (*(ptr + 2) < 0.5 ) { newcomp[i] = (0.5 + *(ptr + 1) * ( newcomp[i] - 0.5)) * 2.0 * *(ptr + 2); } else { newcomp[i] = 0.5 + *(ptr + 1) * (newcomp[i] - 0.5) + (0.5 - *(ptr + 1) * ( newcomp[i] - 0.5)) * (-1.0 + 2.0 * *(ptr + 2)); } } return(rgb_cvt(newcomp)); } /* * grey scale: */ gray_cvt(comp) float *comp; { register int j; j = 255.*(*comp) + 0.5; /* simply convert to an integer */ j=& 0377; /* be sure is in the range 0-255 */ return(j); } idraw.c@S§d ¤�¯#include "ramtek.h" draw(x,y,newcolor,iwid) float x,y; { int n,ix,iy; extern int XNOW,YNOW,COLORNOW,IWIDTH; ix=x*XFACT; iy=511-y*YFACT; n=nargs(); if (n>8) { foregrd(newcolor); COLORNOW=newcolor; } if (n>9) IWIDTH=iwid; if (IWIDTH==3) { in_buf(07001); in_buf(36); in_buf(XNOW-1); in_buf(YNOW); in_buf(ix-1); in_buf(iy); in_buf(ix); in_buf(iy-1); in_buf(XNOW); in_buf(YNOW-1); in_buf(XNOW+1); in_buf(YNOW); in_buf(ix+1); in_buf(iy); in_buf(ix); in_buf(iy+1); in_buf(XNOW); in_buf(YNOW+1); in_buf(XNOW); in_buf(YNOW); flush_buf(0); } in_buf(07001); in_buf(4); in_buf(ix); in_buf(iy); flush_buf(); XNOW=ix; YNOW=iy; } nfill.c@S§d ¤‘æ# #define DEBUG 0 #include "/user/ramtek/ramtek.h" #define WI 05000 /* write-image */ /* * perform a scan-line color fill of a polygon: * * calling sequence: * fill(n,p[,t]) * int n; * struct { * float x , y; * int color; * } p[]; * double t; * * * last point will be joined with the first point. * * if given, t is transparency factor (0.0=perfectly opaque / 1.0=perfectly transparent) * if not given, t=0.0 * */ #define MAX 30 /* max expected edges */ struct { /* structure containing one scan-line of info */ int scanx; /* x position */ float color; int flag; /* 0=normal , >0=first of horizontal pair , <0=second of horizontal pair */ int next; /* array index of next point to the right (-1=end-of-list) */ } scanbuf[MAX] , dummy; struct vert { int x , y; int col; } ppt[MAX]; fill(nn , p , t) int nn; char *p; double t; { struct { float fx , fy; int kolor; } *pts; register struct vert *pt; register int j , n; int maxy , miny , y , ib , jp1 , jp2; int i , k , l , jj , maxcol , mincol , n_pixels; float ratio , delta , dcolor , color; extern int BUFFER[] , NWORDS; /* * default "t" if not given: */ if( nargs() != 6 ) t = 0.0; pt = &ppt[0]; n = nn; pts = p; /* * scan the data for maxy and miny and convert the LL user system to the UL ramtek system: */ maxy = maxcol = -1; miny=513; mincol = 2048; for(j=0;j 511 ) pt[j].y = 511; if( pt[j].y < 0 ) pt[j].y = 0; if( pt[j].y > maxy ) maxy = pt[j].y; if( pt[j].y < miny ) miny = pt[j].y; if( pt[j].col > maxcol ) maxcol = pt[j].col; if( pt[j].col < mincol ) mincol = pt[j].col; } /* * start the scan lines from the top to the bottom and from left to right: */ for(y=miny; y<=maxy; y++) { ib=0; /* scanbuf counter */ for(j=0;j 0 ) continue; /* scan line does not cross this vector */ if( pt[j].y==y && pt[jp1].y==y ) { /* horizontal! */ scanbuf[ib].scanx = pt[j].x; scanbuf[ib].color = pt[j].col; scanbuf[ib].flag = ib+1; scanbuf[ib].next = -1; scanbuf[++ib].scanx = pt[jp1].x; scanbuf[ib].color = pt[jp1].col; scanbuf[ib].flag = -1; scanbuf[ib].next = -1; ib++; continue; } if( pt[jp1].y==y ) { /* check for a singularity at pt[jp1] */ jp2 = j+2; if( j>=n-2 ) jp2=- n; if( (pt[j].y-pt[jp1].y) * (pt[jp2].y-pt[jp1].y) <= 0 ) continue; } /* otherwise, determine the intersection of the line (pt[j]-pt[jp1]) and the scan */ ratio = y - pt[j].y; ratio=/ (pt[jp1].y - pt[j].y); scanbuf[ib].scanx = pt[j].x + (pt[jp1].x-pt[j].x)*ratio; scanbuf[ib].color = pt[j].col + (pt[jp1].col-pt[j].col)*ratio; scanbuf[ib].flag = 0; scanbuf[ib++].next = -1; } /* j */ /* * now sort the scan line intersections: */ if( ib==0 ) continue; /* insurance */ j = sort( 0 , ib-1 ); /* j is the index of the first pt */ for(; j>=0; j=scanbuf[j].next) { if( scanbuf[j].next== -1 ) break; /* something out-of-wack! */ if( (i=scanbuf[j].flag) == 0) { /* normal */ i = scanbuf[j].next; n_pixels = scanbuf[i].scanx - scanbuf[j].scanx + 1; if( t != 0.0 ) { read_pix(&BUFFER[5] , n_pixels-1 , scanbuf[j].scanx , 511 - y); if( DEBUG ) printf("\n Read %d Pixels",n_pixels-1); } delta = scanbuf[i].color - scanbuf[j].color; dcolor = delta / n_pixels; color = scanbuf[j].color; BUFFER[0] = WI|DF|OF; BUFFER[1] = START_POINT; BUFFER[2] = scanbuf[j].scanx; BUFFER[3] = y; BUFFER[4] = (n_pixels-1)<<1; for(k=0; k=u ) return(l); /* same pt! */ return( merge( sort(l,mid) , sort(mid+1,u) ) ); } merge(ii,jj) { register int i , j; register char *last; i=ii; j=jj; last = &dummy; while( i>=0 && j>=0 ) { if( scanbuf[i].flag < 0 ) { /* ignore this pt */ i = scanbuf[i].next; continue; } if( scanbuf[j].flag<0 ) { j = scanbuf[j].next; continue; } if( scanbuf[i].scanx <= scanbuf[j].scanx ) { last->next = i; last = &scanbuf[i]; i = last->next; } else { last->next = j; last = &scanbuf[j]; j = last->next; } } /* * fill out remaining list: */ if( i >= 0 ) last->next = i; else last->next = j; return( dummy.next ); } /* * combine 2 colors: * (cf is foreground, cb is background) * (t=0 means all cf / t=1 means all cb) */ #define BLACK 0 #define WHITE 239 add(cf , cb , t) float t; { register int i; if( cf==BLACK || cb==WHITE ) t = 0.00; if( cb==BLACK ) t = 0.90; return( (i=(1.-t)*cf + t*cb) ); } fill2.c@S§d ¶‘# #include "/user/ramtek/ramtek.h" #define WI 05000 /* write-image */ /* * perform a scan-line color fill of a polygon: * * calling sequence: * fill2(n,p,width) * int n; * struct { * int x , y , color#; * } p[]; * * * last point will be joined with the first point. * */ #define MAXSCAN 20 /* max expected intersections per scan line */ struct { /* structure containing one scan-line of info */ int scanx; /* x position */ float color; int flag; /* 0=normal , >0=first of horizontal pair , <0=second of horizontal pair */ int next; /* array index of next point to the right (-1=end-of-list) */ } scanbuf[MAXSCAN] , dummy; fill2(nn , p , width) int nn , width; char *p; { register struct { int x , y , col; /* form the argument list is in */ } *pt; register int j , n; int maxy , miny , y , ib , jp1 , jp2; int i , k , l , jj , maxcol , mincol , n_pixels; float ratio , delta , dcolor , color , rnd; n = nn; pt = p; /* * scan the data for maxy and miny and convert the LL user system to the UL ramtek system: */ maxy = maxcol = -1; miny=513; mincol = 2048; for(j=0;j 512 ) pt[j].y = 512; if( pt[j].y < 0 ) pt[j].y = 0; if( pt[j].y > maxy ) maxy = pt[j].y; if( pt[j].y < miny ) miny = pt[j].y; if( pt[j].col > maxcol ) maxcol = pt[j].col; if( pt[j].col < mincol ) mincol = pt[j].col; } /* * start the scan lines from the top to the bottom and from left to right: */ for(y=miny; y<=maxy; y++) { ib=0; /* scanbuf counter */ for(j=0;j 0 ) continue; /* scan line does not cross this vector */ if( pt[j].y==y && pt[jp1].y==y ) { /* horizontal! */ scanbuf[ib].scanx = pt[j].x; scanbuf[ib].color = pt[j].col; scanbuf[ib].flag = ib+1; scanbuf[ib].next = -1; scanbuf[++ib].scanx = pt[jp1].x; scanbuf[ib].color = pt[jp1].col; scanbuf[ib].flag = -1; scanbuf[ib].next = -1; ib++; continue; } if( pt[jp1].y==y ) { /* check for a singularity at pt[jp1] */ jp2 = j+2; if( j>=n-2 ) jp2=- n; if( (pt[j].y-pt[jp1].y) * (pt[jp2].y-pt[jp1].y) <= 0 ) continue; } /* otherwise, determine the intersection of the line (pt[j]-pt[jp1]) and the scan */ ratio = y - pt[j].y; ratio=/ (pt[jp1].y - pt[j].y); scanbuf[ib].scanx = pt[j].x + (pt[jp1].x-pt[j].x)*ratio; scanbuf[ib].color = pt[j].col + (pt[jp1].col-pt[j].col)*ratio; scanbuf[ib].flag = 0; scanbuf[ib++].next = -1; } /* j */ /* * now sort the scan line intersections: */ if( ib==0 ) continue; /* insurance */ j = sort( 0 , ib-1 ); /* j is the index of the first pt */ for(; j>=0; j=scanbuf[j].next) { if( scanbuf[j].next== -1 ) break; /* something out-of-wack! */ cop( scanbuf[j].scanx , y); /* start span */ if( (i=scanbuf[j].flag) == 0) { /* normal */ i = scanbuf[j].next; n_pixels = scanbuf[i].scanx - scanbuf[j].scanx + 1; delta = scanbuf[i].color - scanbuf[j].color; if( width==0 && delta==0.0 ) write_image(n_pixels , (jj=scanbuf[i].color) ); else { dcolor = delta / n_pixels; color = scanbuf[j].color; in_buf(WI|DF); /* write image + data flag */ in_buf(n_pixels<<1); /* # bytes */ for(k=0; k239 ) l=239; } in_buf(l); color=+ dcolor; } flush_buf(); } j = i; continue; } /* must be a horizontal line */ k = scanbuf[j].next; if( scanbuf[i].scanx <= scanbuf[k].scanx ) { /* ie, not overlapping horizontal lines */ n_pixels = scanbuf[i].scanx - scanbuf[j].scanx + 1; delta = scanbuf[i].color - scanbuf[j].color; if( delta==0.0 ) { write_image(n_pixels , (jj=scanbuf[i].color) ); } else { dcolor = delta / n_pixels; color = scanbuf[j].color; in_buf(WI|DF); /* write image + data flag */ in_buf(n_pixels<<1); /* # bytes */ for(k=0; k=u ) return(l); /* same pt! */ return( merge( sort(l,mid) , sort(mid+1,u) ) ); } merge(ii,jj) { register int i , j; register char *last; i=ii; j=jj; last = &dummy; while( i>=0 && j>=0 ) { if( scanbuf[i].flag < 0 ) { /* ignore this pt */ i = scanbuf[i].next; continue; } if( scanbuf[j].flag<0 ) { j = scanbuf[j].next; continue; } if( scanbuf[i].scanx <= scanbuf[j].scanx ) { last->next = i; last = &scanbuf[i]; i = last->next; } else { last->next = j; last = &scanbuf[j]; j = last->next; } } /* * fill out remaining list: */ if( i >= 0 ) last->next = i; else last->next = j; return( dummy.next ); } cop(x,y) { in_buf(04000|OF); in_buf(START_POINT); in_buf(x); in_buf(y); flush_buf(); } find_glitch.c@S§d ¤�ƒmain() { register int i , j , back; int iback , array[512]; ram_setup(); backgrd("blue"); erase(); read_pix(&iback , 1 , 511 , 256); back = iback; printf("\nback = %d",back); for(i=255; i>=0; i--) { printf("\n\ti = %d",i); read_pix(array , 512); for(j=0; j<511; j++) { if( array[j] != back ) { printf("\n%d , %d = %d (%o)",i,j,array[j],array[j]); } } } } ;graythru.c@S§d ¤�( # #include "/user/ramtek/ramtek.h" #define DEBUG 0 #define MAXSIDES 20 /* max # sides */ #define NSQ 12 float one[] { 0.0 , 0.0 , 0.0 }; float two[] { 1.0 , 0.0 , 0.0 }; float xsq[] { 1. , 1. , 2. , 5. , 7.8 , 9. , 7.9 , 3.9 , 6.8 , 5.7 , 2.0 , 4.9}; float ysq[] { 1. , 3. , 5. , 2. , 5.8 , 5. , 2.5 , 3.5 , 4.0 , 4.5 , 6.5 , 5.4}; int csq[] { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}; struct { char *next; int nsides; struct { int x , y , z , color; } side[]; } head; struct { float xx , yy; int col; } vertices[MAXSIDES]; char *memend; main(argc , argv) int argc; char *argv[]; { register char *cp , *last; register int j; char *now , *sbrk() , *alloc() , *before; int nsides , min , i , width; char iobuf[518]; float cosine , pow() , power , atof() , xx , yy; int c , cc; float i100 , j100; if( argc>3 || argc<2 ) { printf("\n syntax: ramtek filename [width]\n\7"); exit(1); } if( argc==3 ) { width = atoi(argv[2]); srand(1); } else width = 0; if( fopen(argv[1],iobuf) < 0 ) { printf("\n cannot open %s\n\7",argv[1]); exit(1); } memend = sbrk(0); memend++; memend=& 0177776; brk(0157776); last = &head; while( (nsides=getw(iobuf)) > 0) { if( nsides>MAXSIDES ) { printf("\n %d - need to increase MAXSIDES in ramtek.c\n\7",nsides); goto contin; } last = last->next = alloc(4+8*nsides); last->nsides = nsides; last->next=0; if( DEBUG ) printf("\n nsides = %d",nsides); for(j=0;jside[j].x = getw(iobuf); last->side[j].y = getw(iobuf); last->side[j].z = getw(iobuf); cosine = getw(iobuf); cosine=/ 250.; last->side[j].color = 180.*cosine + 30. + 0.5; if( DEBUG ) printf("\n\t%d %d %d %d",last->side[j].x,last->side[j].y,last->side[j].z,last->side[j].color); if( (i=last->side[j].x) <0 || i> 511) goto bad; if( (i=last->side[j].y) <0 || i>511) goto bad; if( (i=last->side[j].color) <0 || i>239 ) goto bad; continue; bad: last->nsides=0; } } /* * start the display: */ contin: printf("\7\7"); ram_setup(); color_table("gray",0,240,one,two); backgrd(239); erase(); for(j=0; jnext ) { if( cp->nsides <= 0 ) continue; for(j=0;jnsides;j++) if( cp->side[j].z < min ) { min = cp->side[j].z; now = cp; before = last; } } if( (cp=now) == 0 ) break; /* done */ before->next = cp->next; /* so will skip this one next time */ for(j=0;jnsides;j++) { vertices[j].xx = cp->side[j].x/XFACT; vertices[j].yy = cp->side[j].y/YFACT; vertices[j].col = cp->side[j].color; } fill(cp->nsides , &vertices[0] , 0.50); } close( iobuf[0] ); } char *alloc(nbytes) { register char *m; m=memend; memend=+ nbytes; if( memend > 0157776 ) { printf("\n out of memory!\7"); exit(1); } return(m); } lights.c@S§d ¤�ù#include "ramtek.h" /* * turn one of the console lights on or off: * * (tricky! they are labelled from R-L but accessed L-R) * */ on_light(i) int i; /* i corresponds to number printed on the console */ { register int ri; ri=i; ri=& 07; /* range = 0-7 */ ri = 7 - ri; /* now i corresponds to LEFT-RIGHT order */ in_buf(014000); in_buf(0300|ri); flush_buf(); } off_light(i) int i; { register int ri; ri=i; ri=& 07; ri = 7 - ri; in_buf(014000); in_buf(0200|ri); flush_buf(); } tline.c@S§d ¤�¸#include "ramtek.h" line(x,y,np,inc,newcolor) float x[],y[]; { register int n,ix,iy; extern int COLORNOW,XNOW,YNOW; n=nargs(); if (n>4) { foregrd(newcolor); COLORNOW=newcolor; } in_buf(07003); in_buf(0100000); ix=x[0]*XFACT; iy=511-y[0]*YFACT; in_buf(ix); in_buf(iy); in_buf(4*np-4); for (n=inc;n MAX ) { printf("\n need to increase MAX in polygon.c and fill.c!\7\n"); exit(1); } parg = &arg1; pt = &p[0]; for(j=0;jx = parg->xd; pt->y = parg->yd; pt->color = parg->col; pt++; parg++; } fill(n , &p[0] , 0.0); } ram_color.c@S§d ¤‘n#include "/user/ramtek/ramtek.h" #define DEBUG 0 #define BLACK 00000 #define RED 07400 #define BLUE 00017 #define GREEN 00360 #define CYAN 00377 #define MAGENTA 07417 #define YELLOW 07760 #define WHITE 07777 #define BLACK_INDEX 248 #define RED_INDEX 249 #define BLUE_INDEX 250 #define GREEN_INDEX 251 #define CYAN_INDEX 252 #define MAGENTA_INDEX 253 #define YELLOW_INDEX 254 #define WHITE_INDEX 255 /* * * ****** foregrd ****** * * purpose: sets the foreground color for suceeding commands. * * calling sequence: foregrd(color) * * where color can be a nnamed color or an index * to the color look up table. named colors * include: * "black" "blue" "red" "green" "cyan" * "magenta" "yellow" "white" * */ foregrd(color) char *color; /* color name if color > 255 */ /* color index if 0<= color <= 255 */ { int index; /* entry in color look up table*/ int strcmp();/* string cmparison function */ /* 0 - no match */ /* 1 - match */ extern int COLORNOW; /* current color index setting */ /* check for legal index or name and if name */ /* convert to an index */ index = color_name(color); COLORNOW = index; in_buf(SET | OF); /* form command word */ in_buf(FOREGROUND); /* set operand flag word */ in_buf(index); /* set foreground color index */ flush_buf(DEBUG); /* flush buffer */ } /* * * determine if two strings are equal * */ strcmp(s,t) char *s, *t; /* strings to be compared */ { int i; /* index used in comparison */ for (; *s == *t; s++, t++) if (*s == '\0' )return(1); return(0); } /* * ***** table_init() ***** * * * purpose: load named colors into the color look table starting at * location BLACK_INDEX and set initial * background color to black and * foreground to red. * * */ table_init() { int word; /* variable used to form instructions */ in_buf(LAM); /* send opcode */ in_buf(BLACK_INDEX); /* set starting address where named entries are to be stored */ in_buf(020); /* set number of entries to be loaded */ in_buf(BLACK); /* send entries to ramtek */ in_buf(RED); in_buf(BLUE); in_buf(GREEN); in_buf(CYAN); in_buf(MAGENTA); in_buf(YELLOW); in_buf(WHITE); flush_buf(DEBUG); foregrd("red"); backgrd("black"); erase(); } /* * * ****** backgrd ****** * * purpose: sets background color for suceeding commands. * * calling sequence: backgrd(color) * * where color can be a named color or an index * to the color look up table. named colors * include: * "black" "blue" "red" "green" "cyan" * "magenta" "yellow" "white" * */ backgrd(color) char *color; /* color name if color > 255 */ /* color index if 0<= color <= 255 */ { int index; /* color index */ int word; /* used for forming instructions for the ramtek */ /* check for legal index or name and convert to index */ index = color_name(color); in_buf(SET | OF); /* send command word */ in_buf(BACKGROUND); /* send operand flag word */ in_buf(index); /* send new background color index */ flush_buf(DEBUG); /* flush buffer */ } /* * * ****** erase() ****** * * purpose: writes the current background color into refresh memory. * * calling sequence: erase() * */ erase() { in_buf(ERASE); flush_buf(DEBUG); } /* * * This routine checks for legal color index or name and if * name, it is converted to an index. * */ color_name(color) char *color; { int index; if(color > 255) /* determine if specified by name or index */ { if (strcmp(color,"black"))index = BLACK_INDEX; else if (strcmp(color,"red"))index = RED_INDEX; else if (strcmp(color,"blue")) index = BLUE_INDEX; else if (strcmp(color,"green")) index = GREEN_INDEX; else if (strcmp(color,"cyan")) index = CYAN_INDEX; else if (strcmp(color,"magenta"))index = MAGENTA_INDEX; else if (strcmp(color,"yellow")) index = YELLOW_INDEX; else if(strcmp(color,"white"))index = WHITE_INDEX; else { printf(" %s is an illegal color \7",color); exit(); } } else if (color >= 0)index = color; else { printf(" %d is an illegal color index \7",color); exit(); } return(index); } ram_cursor.c@S§d ¤�s# /* * routines to write to and read from the ramtek cursor: */ #include "ramtek.h" move_cursor(x,y) { int v[3]; extern int FDKB; if( FDKB <= 0 ) if( (FDKB=open("/dev/rmkb",2)) < 0 ) { printf("Cannot open /dev/rmkb!\7"); exit(1); } v[0] = x; v[1] = 511-y; v[2] = SETCUR; stty(FDKB , v); } /* * read ramtek cursor: if 4 args, wait for ENTER . */ read_cursor(xp , yp , sp) int *xp , *yp , *sp; { int v[3]; extern int FDKB; extern int RMFLAGS[3]; if( FDKB <= 0 ) if( (FDKB=open("/dev/rmkb",2)) < 0 ) { printf("Cannot open /dev/rmkb!\7"); exit(1); } if( nargs() > 3 ){ if( (RMFLAGS[2] & WAITEN) == 0){ RMFLAGS[2] =| WAITEN; stty( FDKB, RMFLAGS); } }else{ if( RMFLAGS[2] & WAITEN ){ RMFLAGS[2] =& ~WAITEN; stty( FDKB, RMFLAGS); } } gtty(FDKB , v); *xp = v[0] &0777; *yp = 511 - (v[1]& 0777); *sp = (v[1]>>9) & 0177; } ram_kb.c@S§d ¤�ƒ# /* * read ramtek keyboard. no arg = no wait; arg = wait. */ #include "ramtek.h" #define ND 020000 /* no data flag */ ram_kb() { int input; extern int FDKB; extern int RMFLAGS[3]; if( FDKB<=0 ) /* hasn't been opened yet */ if( (FDKB=open("/dev/rmkb",0)) < 0 ) { printf("Cannot open /dev/rmkb!\7"); exit(1); } if( nargs() > 0){ /* wait */ if( (RMFLAGS[2]&WAITKB)==0 ){ RMFLAGS[2] =| WAITKB; stty( FDKB, RMFLAGS); } }else{ if( RMFLAGS[2]&WAITKB ){ RMFLAGS[2] =& ~WAITKB; stty( FDKB, RMFLAGS); } } read(FDKB , &input , 2); if( input&ND ) return(0); /* nothing hit */ return( input&0377 ); } kram_move.c@S§d¤�À#include "ramtek.h" ram_move(x,y,newcolor,iwid) /*change current operating point and color */ float x,y; { int n; extern int COLORNOW,XNOW,YNOW,IWIDTH; XNOW=x*XFACT; YNOW=512-y*YFACT; n=nargs(); if (n>8) { foregrd(newcolor); COLORNOW=newcolor; } if (n>9) IWIDTH=iwid; in_buf(04002); /*set+operand flag */ in_buf(0100000); /* c o p change */ in_buf(XNOW); in_buf(YNOW); flush_buf(); } read_pix.c@S§d¤�S#include "../ramtek.h" read_pix(array , npix , ix , iy) int *array; { register int opcode , n , nbytes; opcode = 05400|DF; if( (n=nargs()) > 3 ) opcode=| OF; in_buf(opcode); if( n > 3 ) { in_buf(START_POINT); in_buf(ix); in_buf(511-iy); } nbytes = npix<<1; in_buf(nbytes); flush_buf(); ram_read(array , nbytes); } rread_vlt.c@S§d¤�«read_vlt(start,buffer,number) int start,number,*buffer; { extern FDRAM; in_buf(02000); in_buf(start); in_buf(number); flush_buf(); read(FDRAM,buffer,number*2); } urio.c@S§d¤�“# /* * This is the I/O for the "BAAL" UNIX-Ramtek package: * * Rick Adams * Sheldon Applegate * Greg Laib * Mike Bailey * * Computer Aided Design and Graphics Lab * School of Mechanical Engineering * Purdue University * W. Lafayette, Indiana 47907 * (317) 493-9385 * * Spring 1979 */ #include "../ramtek.h" #define DEBUG 0 /* * globals: */ int FDRAM, FDPIO, FDKB; int BUFFER[BUFSIZE] , NWORDS; /* word buffer and counter */ int XNOW , YNOW , COLORNOW , IWIDTH; /* current statuses */ int RMFLAGS[3] {0,0,0}; /* for stty/gtty */ /* * ram_setup - open port(s) and set some variables: */ ram_setup() { if( (FDRAM=open("/dev/rm",2)) < 0 ) { printf("\n Cannot open /dev/rm! \7\n"); exit(1); } /* comment out pio for now if( (FDPIO=open("/dev/rmpio",2)) < 0 ) { printf("\n Cannot open /dev/rmpio! \7\n"); exit(1); } */ NWORDS = XNOW = YNOW = 0; IWIDTH=1; in_buf( 02400 ); /* reset */ flush_buf(DEBUG); in_buf( 04000|OF ); /* "set" command and operand flag */ in_buf( START_POINT ); in_buf( 0 ); in_buf( 512 ); /* set current point to LL corner */ flush_buf(DEBUG); table_init(); /* initialize named colors in colortable */ } /* * place a word in the buffer: * (if buffer is full, send it) */ in_buf( word ) int word; { if( NWORDS > BUFSIZE-1 ) /* no more room */ flush_buf(DEBUG); /* send it and reset NWORDS to 0 */ BUFFER[NWORDS++] = word; } /* * send the entire buffer: * (eventually want to test whether it would be better to use FDRAM or FDRAM ) */ flush_buf(dump) int dump; /* 1 - print contents of buffer */ /* 0 (or no argument) - do not print contents of buffer */ { register int j; /* counter */ if( nargs() <= 0 ) dump=0; /* no args = no dump! */ if( NWORDS>0 ){ if( write(FDRAM,BUFFER,2*NWORDS)<0){ printf("Ramtek write error\7\n"); exit(1); } if( dump ) for(j=0; j3 || argc<2 ) { printf("\n syntax: ramtek filename [width]\n\7"); exit(1); } if( argc==3 ) { width = atoi(argv[2]); srand(1); } else width = 0; if( fopen(argv[1],iobuf) < 0 ) { printf("\n cannot open %s\n\7",argv[1]); exit(1); } memend = sbrk(0); memend++; memend=& 0177776; brk(0157776); last = &head; while( (nsides=getw(iobuf)) > 0) { if( nsides>MAXSIDES ) { printf("\n %d - need to increase MAXSIDES in ramtek.c\n\7",nsides); goto contin; } last = last->next = alloc(4+8*nsides); last->nsides = nsides; last->next=0; if( DEBUG ) printf("\n nsides = %d",nsides); for(j=0;jside[j].x = getw(iobuf); last->side[j].y = getw(iobuf); last->side[j].z = getw(iobuf); cosine = getw(iobuf); cosine=/ 250.; last->side[j].color = 180.*cosine + 30. + 0.5; if( DEBUG ) printf("\n\t%d %d %d %d",last->side[j].x,last->side[j].y,last->side[j].z,last->side[j].color); if( (i=last->side[j].x) <0 || i> 511) goto bad; if( (i=last->side[j].y) <0 || i>511) goto bad; if( (i=last->side[j].color) <0 || i>239 ) goto bad; continue; bad: last->nsides=0; } } /* * start the display: */ contin: printf("\7\7"); ram_setup(); color_table("hci",0,240,one,two); backgrd(239); erase(); for(j=0; jnext ) { if( cp->nsides <= 0 ) continue; for(j=0;jnsides;j++) if( cp->side[j].z < min ) { min = cp->side[j].z; now = cp; before = last; } } if( (cp=now) == 0 ) break; /* done */ before->next = cp->next; /* so will skip this one next time */ for(j=0;jnsides;j++) { vertices[j].xx = cp->side[j].x/XFACT; vertices[j].yy = cp->side[j].y/YFACT; vertices[j].col = cp->side[j].color; } fill(cp->nsides , &vertices[0] , 0.550); } close( iobuf[0] ); } char *alloc(nbytes) { register char *m; m=memend; memend=+ nbytes; if( memend > 0157776 ) { printf("\n out of memory!\7"); exit(1); } return(m); } asymbol.c@S§d ¤‘l# #include "../ramtek.h" #define D2R 0.01745 char font[] { 022,024,004,000,040,044,024,022,022,024,014,003,001,010,030 , 041,043,034,024,022,022,024,000,040,024,022,022,024,020,022 , 002,042,022,022,004,040,022,044,000,022,022,024,002,020,042 , 024,022,022,002,024,042,022,024,020,022,022,004,044,022,000 , 022,040,022,022,044,004,070,040,000,022,022,004,022,044,022 , 020,022,022,044,033,013,004,013,011,000,011,031,040,031,033 , 022,022,004,040,022,044,000,022,024,020,022,002,042,022,022 , 004,044,000,040,022,022,024,020,022,040,003,043,000,024,040 , 002,042,024,020,024,020,011,031,020,020,024,033,013,024,000 , 040,070,002,042,070,004,044,002,042,033,031,042,003,013,014 , 004,003,070,000,044,070,040,041,031,030,040,002,044,006,070 , 001,041,000,024,040,001,041,070,003,043,070,034,010,011,031 , 070,022,024,023,033,013,020,010,001,003,014,024,033,031,020 , 013,024,020,010,030,014,034,032,012,010,030,014,034,012,032 , 030,010,014,012,042,032,034,030,034,014,012,032,030,010,027 , 024,070,022,012,011,012,022,015,017,070,027,025,010,026,070 , 036,020,070,002,042,070,044,004,002,011,031,042,043,004,005 , 016,036,045,070,020,027,026,016,015,025,026,070,047,000,070 , 021,031,032,022,021,040,015,016,027,036,035,002,001,010,020 , 042,027,024,020,011,016,027,020,031,036,027,021,025,023,003 , 043,023,001,045,023,005,041,021,025,023,003,043,031,021,022 , 032,031,020,003,043,031,021,022,032,031,000,047,037,017,006 , 001,010,030,041,046,037,070,022,030,010,020,027,016,005,006 , 017,037,046,044,002,000,040,006,017,037,046,045,034,014,034 , 043,041,030,010,001,007,003,043,033,030,037,002,001,010,030 , 041,043,034,004,007,047,001,003,014,034,043,041,030,010,001 , 006,017,037,046,006,007,047,046,020,001,003,014,005,006,017 , 037,046,045,034,014,034,043,041,030,010,001,046,044,033,013 , 004,006,017,037,046,041,030,010,001,025,024,034,035,025,070 , 031,021,022,032,031,025,024,034,035,025,070,031,021,022,032 , 031,020,042,004,046,004,044,070,001,041,002,044,006,006,006 , 017,037,046,045,034,024,023,070,022,012,011,021,022,031,021 , 012,013,024,034,031,041,045,036,016,005,001,010,040,000,003 , 043,003,006,017,037,046,040,000,007,037,046,045,034,004,034 , 043,041,030,000,041,030,010,001,006,017,037,046,000,007,037 , 046,041,030,000,047,007,004,034,004,000,040,047,007,004,034 , 004,000,023,043,041,030,010,001,006,017,037,046,045,007,000 , 004,044,040,047,030,010,020,027,017,037,002,001,010,030,041 , 047,007,000,003,025,047,070,025,040,040,000,007,000,007,023 , 047,040,000,007,040,047,025,047,037,017,006,001,010,030,041 , 046,037,000,007,037,046,045,034,004,037,017,006,001,010,030 , 041,046,037,070,022,040,000,000,007,037,046,045,034,004,024 , 040,002,001,010,030,041,043,034,014,005,006,017,037,046,020 , 027,007,047,007,002,001,010,030,041,047,007,006,020,046,047 , 007,000,024,040,047,000,047,070,007,040,007,023,020,023,047 , 007,047,000,040,070,014,044,040,000,007,047,007,040,007,047 , 040,000,006,027,046,000,040,000 }; int kct[] { 8,12, 6, 7, 7, 7, 8, 8, 7, 7,14,13, 6, 4, 6, 2, 2, 5, 5, 8, 5,14, 6, 3, 8, 8, 9, 5, 6, 6, 6, 6, 0, 8, 5,11,13,14,11, 2, 4, 4,11, 5, 6, 2, 5, 2, 11, 5, 9,13, 6,10,13, 5,17,13,11,12, 3, 5, 3,15, 15, 9,12, 8, 7, 7, 6,11, 6, 6, 6, 8, 3, 5, 4,11, 7,13, 9,13, 4, 7, 5, 5, 5, 5, 7, 4, 2, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int koc[] { 0, 8, 20, 26, 33, 40, 47, 55, 63, 70, 77, 91,104,110,114,120, 122,124,129,134,142,147,161,167,170,178,186,195,200,206,212,218, 224,224,232,237,248,261,275,286,288,292,296,307,312,318,320,325, 327,338,343,352,365,371,381,394,399,416,429,440,452,455,460,463, 478,493,502,514,522,529,536,542,553,559,565,571,579,582,587,591, 602,609,622,631,644,648,655,660,665,670,675,682,686,688,692,695, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; symbol(x1,y1,h,str,theta) float x1,y1,h,theta; char *str; { float th , si , co , x , y , fact , xa , ya , xt , yt; float xx , yy , xn , yn; double sin() , cos() , fabs(); int nc , ic , ii , ict , loc , iy; int nchar , ixn , iyn; register int i , i1 , itsub; if( (nc=count_char(str)) == 0) return; nchar = nc; th = theta*D2R; /* radians */ si = sin(th); co = cos(th); x=x1; y=y1; if( nc>=1 ) goto L50; fact=h/4.0; x=x-2.0*fact*(co-si); y=y-2.0*fact*(co+si); nc=1; if( nchar >= -1 ) goto L60; ic=2; goto L70; L50: fact=h/7.0; L60: ic=3; L70: xa=fact*co; ya=fact*si; xt=xa*6.0; yt=ya*6.0; for(i1=0; i1>3) & 07; if( xx==7.0 ) { ic=3; continue; } yy = iy & 07; xn = x + xa*xx - ya*yy; yn = y + ya*xx + xa*yy; plot(xn,yn,ic); ic=2; } x=+ xt; y=+ yt; ic=3; } } /* * count the # of chars in a string: */ count_char(str) char *str; { register char *rcp; rcp = str; while(*rcp != 0) rcp++; return(rcp-str); } testvlt.c@S§d¤�qmain() { int buffer[100],i; float comp1[3],comp2[3]; comp1[0] = 0.0; comp1[1] = 0.0; comp1[2] = 0.0; comp2[1] = 1.0; comp2[2] = 1.0; comp2[0] = 1.0; printf("assignment made\n"); color_table("rgb",0,100,comp1,comp2); printf("color table loaded\n"); read_vlt(0,buffer,100); printf("color table read\n"); for (i=0;i<100;i++) printf(" %d \n",buffer[i]); } atext.c@S§d ¤�C#include "ramtek.h" text(string,txtmod,x,y) char string[]; int txtmod; float x,y; { extern int XNOW,YNOW; int WT,i,j,n,ix,iy,buf[30]; char *c,*k; WT= 06013; /* WT|RP|OF|DF */ k= &buf[0]; k--; /* change to caps */ for (c= &string[0]; (*(++k) = *c) != '\0';c++) if ((*k>='a') && (*k<='z')) *k=+ 'A'-'a'; i= c- &string[0]; if ((n=nargs())>1) { /* AP or BK flags */ if ((txtmod>0) && (txtmod<4)) WT=| (txtmod<<4); } /* change style of output */ if (n>4) { ix= XFACT*x; iy= 502-YFACT*y; YNOW= iy+9; } else { ix= XNOW; iy= YNOW-9; } XNOW= ix+7*i; in_buf(WT); in_buf(START_POINT); in_buf(ix); in_buf(iy); n= (i+1)/2; in_buf(i); for (j=0;j511) x=511; /* limit ranges to 0-511 */ in_buf(x); /* by clipping high or low numbers */ y = YFACT*yt + 0.5; if (y<0) y=0; if (y>511) y=511; in_buf(511-y); x = XFACT*xr + 0.5; if (x<0) x=0; if (x>511) x=511; in_buf(x); y = YFACT*yb + 0.5; if (y<0) y=0; if (y>511) y=511; in_buf(511-y); flush_buf(); } write_image.c@S§d ¤�ð#include "ramtek.h" #define COLOR 1 /* use color #0 */ write_image(nn , col) { register int j , n , color; n=nn; color = col; in_buf(05000|DF); in_buf( n<<1 ); /* # bytes */ for(j=0;j3 || argc<2 ) { printf("\n syntax: ramtek filename [power]\n\7"); exit(1); } if( argc==3 ) power = atof( argv[2] ); else power = 2.0; if( fopen(argv[1],iobuf) < 0 ) { printf("\n cannot open %s\n\7",argv[1]); exit(1); } memend = sbrk(0); memend++; memend=& 0177776; brk(0157776); last = &head; while( (nsides=getw(iobuf)) > 0) { if( nsides>MAXSIDES ) { printf("\n %d - need to increase MAXSIDES in ramtek.c\n\7",nsides); goto contin; } last = last->next = alloc(4+8*nsides); last->nsides = nsides; last->next=0; if( DEBUG ) printf("\n nsides = %d",nsides); for(j=0;jside[j].x = getw(iobuf); last->side[j].y = getw(iobuf); last->side[j].z = getw(iobuf); cosine = getw(iobuf); cosine=/ 250.; if( power==2.0 ) cosine=* cosine; else if( power!=1.0 ) cosine = pow(cosine,power); last->side[j].color = 240.*cosine + 0.5; if( DEBUG ) printf("\n\t%d %d %d %d",last->side[j].x,last->side[j].y,last->side[j].z,last->side[j].color); if( (i=last->side[j].x) <0 || i> 511) goto bad; if( (i=last->side[j].y) <0 || i>511) goto bad; if( (i=last->side[j].color) <0 || i>239 ) goto bad; continue; bad: last->nsides=0; } } /* * start the display: */ contin: printf("\7\7"); ram_setup(); color_table("hci",2,250,backg,backg); backgrd(250); erase(); color_table("hci",0,240,one,two); for(;;) { now=0; min=32767; last= &head; for(cp=head.next; cp!=0; cp= (last=cp)->next ) { if( cp->nsides <= 0 ) continue; for(j=0;jnsides;j++) if( cp->side[j].z < min ) { min = cp->side[j].z; now = cp; before = last; } } if( (cp=now) == 0 ) break; /* done */ before->next = cp->next; /* so will skip this one next time */ for(j=0;jnsides;j++) { vertices[j].xx = cp->side[j].x; vertices[j].yy = cp->side[j].y; vertices[j].col = cp->side[j].color; } fill(cp->nsides , &vertices[0] ); } close( iobuf[0] ); } char *alloc(nbytes) { register char *m; m=memend; memend=+ nbytes; if( memend > 0157776 ) { printf("\n out of memory!\7"); exit(1); } return(m); } cram_plot.c@̤ ¤�Ò#include "/user/ramtek/ramtek.h" plot(x,y,pen) float x,y; int pen; { switch ( abs(pen)) { case 2: draw(x,y); break; case 3: move(x,y); break; } } gray.cêÞ° ¤�d # #define DEBUG 0 #define MAXSIDES 20 /* max # sides */ float one[] { 0.0 , 0.0 , 0.0 }; float two[] {1. , 0. , 0.}; float backg[] {.4 , 0. , 0.}; struct { char *next; int nsides; struct { int x , y , z , color; } side[]; } head; struct { int xx , yy , col; } vertices[MAXSIDES]; main(argc , argv) int argc; char *argv[]; { register char *cp , *last; register int j; char *now , *sbrk() , *before; int nsides , min , i , width; char iobuf[518]; float cosine , rnd; if( argc>3 || argc<2 ) { printf("\n syntax: gray filename [width]\n\7"); exit(1); } if( argc==3 ) { width = atoi(argv[2]); srand(1); } else width = 0; if( fopen(argv[1],iobuf) < 0 ) { printf("\n cannot open %s\n\7",argv[1]); exit(1); } last = &head; while( (nsides=getw(iobuf)) > 0) { if( nsides>MAXSIDES ) { printf("\n %d - need to increase MAXSIDES in gray.c\n\7",nsides); goto contin; } last = last->next = sbrk(4+8*nsides); last->nsides = nsides; last->next=0; if( DEBUG ) printf("\n nsides = %d",nsides); for(j=0;jside[j].x = getw(iobuf); last->side[j].y = getw(iobuf); last->side[j].z = getw(iobuf); cosine = getw(iobuf); cosine=/ 250.; cosine=* cosine; last->side[j].color = 240.*cosine + 0.5; if( DEBUG ) printf("\n\t%d %d %d %d",last->side[j].x,last->side[j].y,last->side[j].z,last->side[j].color); if( (i=last->side[j].x) <0 || i> 511) goto bad; if( (i=last->side[j].y) <0 || i>511) goto bad; if( (i=last->side[j].color) <0 || i>239 ) goto bad; continue; bad: last->nsides=0; } } /* * start the display: */ contin: printf("\7\7"); ram_setup(); color_table("gray",250,2,backg,backg); backgrd(250); erase(); color_table("gray",0,240,one,two); for(;;) { now=0; min=32767; last= &head; for(cp=head.next; cp!=0; cp= (last=cp)->next ) { if( cp->nsides <= 0 ) continue; for(j=0;jnsides;j++) if( cp->side[j].z < min ) { min = cp->side[j].z; now = cp; before = last; } } if( (cp=now) == 0 ) break; /* done */ before->next = cp->next; /* so will skip this one next time */ for(j=0;jnsides;j++) { vertices[j].xx = cp->side[j].x; vertices[j].yy = cp->side[j].y; vertices[j].col = cp->side[j].color; } fill2(cp->nsides , &vertices[0] , width ); } close( iobuf[0] ); } p)->next ) { if( cp->nsides <= 0 ) continue; for(j=0;jnsides;j++) if( cp->side[j].z < min ) { min = cp->side[j].z; now = cp; B A A L Users' Manual Computer Aided Design and Graphics Laboratory School of Mechanical Engineering Purdue University INTRODUCTION: BAAL is a home-cooked package of C procedures to drive the Ramtek 9351. COMPILATION PROCEDURE: The library containing the BAAL object modules is "/lib/ramlib.a" and should be accessed when compiling as: % cc [-f] -O program.c /lib/ramlib.a % mv a.out program PROGRAMMING CONSIDERATIONS: 1. The dimensions of the screen are 14.0 inches in the x direction and 10.25 inches in the y direction. 2. The origin (0.,0.) is in the lower-left corner of the screen. 3. The procedure "ram_setup()" must be called before any other BAAL procedures. 4. As far as anyone can tell, there are no procedure name conflicts with the "grafic" library. Thus a program may do both Imlac and Ramtek graphics. BAAL PROCEDURES: backgrd(color) Purpose: To change background color for succeeding instructions. Arguments: color...may be one of the eight predefined named colors or an index of an entry in the color look-up table. Legal index values are in the range 0-255. The named colors are: "black","blue","red","green","cyan","magenta", "yellow", and "white". Notes: The named colors must be surrounded by double qutoes or a string which ends in \0. The backgrd instruction will have no immediate effect on the display. To actually change the background color displayed, an erase instruction must be executed. charout(character [, style]) Purpose: To write a single character to the Ramtek at the current beam location. Arguments: character ... the (ASCII) character to be sent style ... as in text, this controls addiive and backpaneled letters. see text Notes: Lower case letters will be written on the screen in upper case. color_table(color_space,start_loc,number,comp1,comp2) Purpose: To load the color look-up table. Arguments: color_space...color space in which comp1 and comp2 are defined. Legal color spaces include: "rgb" - red,green,blue "cmy" - cyan,magenta,yellow "hci" - hue,chroma,intensity "gray" or "grey" - gray scale start_loc.....entry in color table to be loaded first. (0<=start_loc<=255) number........number of entries in color table to load. (1<=number<=255) comp1,comp2...3 element, floating point vectors containing the components of the first and last colors respectively to be loaded into the table. The order of the components is the same as the order of the letters in the color space being used. All components must have a value between zero and one. Linear interpolation is performed between comp1 and comp2 to obtain the desired number of entries. Notes: The last two elements of comp1 and comp2 are ignored when "grey" or "gray" color space is specified. Eight predefined named colors reside in locations 248-255. If the user specifies colors to loaded in these locations, the predefined colors will be lost. (see "foregrd" and "backgrd") draw(x , y [,newcolor [,iwidth] ] ) Purpose: Draw a line from the current position to (x,y). Arguments: x,y ... floating point coordinates. newcolor ... either an integer vlt index or a quoted standard color. iwidth ... line width in pixels. Notes: Coordinate ranges: 0.0<=x<=14.0 , 0.0<=y<=10.25 . Color: 0<= newcolor <=255 or newcolor is one of the following strings: "white" , "blue" , "black" , "red" , "yellow" , "green" , "cyan" , or "magenta". Width: iwidth = 1 or 3 . If a newcolor is given, it becomes the current foreground color. If an iwidth is given, it becomes the current line width. erase() Purpose: Replaces every pixel in the currently defined window with the currently defined background color. Arguments: None. Notes: Everything in the current window(see "window") is lost when this instruction is executed. Plotting is done with respect to the current window, so generally the window should be reset to the full screen before plotting. fill( n , p ) Purpose: Fill a closed polygon by interpolating between the colors at each vertex. Arguments: n ... the number of vertices. p ... a pointer to a structure of the form: struct { float x , y; int color; } *p; Notes: "color" refers to a location in the VLT which should already be filled. "fill" is best used when the user is filling a polygon and is not sure what the number of sides is to be. If he does know, then probably "polygon" should be used. foregrd(color) Purpose: To change foreground color for succeeding instructions. Arguments: color...may be one of the eight predefined named colors or an index of an entry in the color look-up table. Legal index values are in the range 0-255. The named colors are: "black","blue","red","green","cyan","magenta", "yellow", and "white". Notes: The named colors must be surrounded by double quotes or a string which ends in \0. Any previous instructions executed which use the foreground color will remain unchanged. Only succeeding instructions will be effected. line(xararay , yarray , npoints , incr [,newcolor]) Purpose: Draws a line with npoints-1 segments. the x,y coordinate pairs are taken from xarray and yarray. there is a move to xarray[0],yarray[0] and a line drawn to successive x,y pairs. npoints-1 line segments are drawn using every incr th point from xarray and yarray. newcolor (if specified) changes the foreground color before the line drawing is done. Arguments: xarray , yarray ... floating point arrays. npoints ... integer number of points to be connected. incr ... integer increment used in stepping through xarray and yarray newcolor ... the new foreground color. Notes: npoints must be >= 2. incr must be >= 1 . The line width is one pixel. newcolor is specified as in "draw." 0.0 <= xarray[i] <= 14.00 0.0 <= yarray[i] <= 10.25 move(x , y [,newcolor [,iwidth] ]) Purpose: Changes the current beam position and possibly the current display parameters. Arguments: See "draw". Notes: See "draw". move_cursor( ix , iy ) Purpose: To move the Ramtek cursor. Arguments: ix,iy ... the integer location to which the cursor will be moved. Notes: The origin is lower left and the range is 0-511 for both ix and iy. off_light( i ) Purpose: Turn one of the Ramtek keyboard lights off. Argument: i ... the light # to turn off (left=7 / right=0). on_light( i ) Purpose: Turn one of the Ramtek keyboard lights on. Argument: i ... the light # to turn on (left=7 / right=0). polygon(x1,y1,col1 , x2,y2,col2 , ...) Purpose: Fill a closed polygon by interpolationg between the colors at each vertex. Arguments: xi ... floating point x coordinates. yi ... floating point y coordinates. coli ... integer indices into the VLT representing the color at that vertex. Notes: "polygon" should be used if one knows how many sides his polygon will have. If the number is not known, he should use "fill" instead. The VLT should already be filled prior to this call. ram_kb(flag) Purpose: Read the Ramtek keyboard. Arguments: flag ... if an argument is present, the program will go to sleep until the keyboard input is made (producing an interrupt.) If no argument is present ram_kb returns 0 (immediately). Notes: The optional argument obviates the necessity for the tight polling loops found in grafic programs. It also allows other users the use of the cpu until the keyboard is hit. ram_setup() Purpose: Setup the Ramtek and its interface. Arguments: None. Notes: This call MUST preceed all other Ramtek calls. read_cursor( xp , yp , status [, flag ] ) Purpose: Read the Ramtek cursor. Arguments: xp,yp ... pointers to integers. The x,y cursor location will be returned in *xp,*yp . status ... the status of the cursor switches. Additively, +2 for the visible switch +8 for the track switch +16 for the enter switch flag ... as in ram_kb, if flag is present the program goes to sleep until given an interrupt. The interrupt may come from the track or enter switches. Notes: xp and yp should point to integers. flag should normally be given. read_pix(array, nw [,ix , iy]) purpose: to read refresh memory data. the returned values are indices to the color table. arguments: array...the address of the integer array into which the values are to be read. nw......the (integer) number of values to be read. ix,iy...(optional) the starting pixel for the read. notes: ix and iy are integers designating the starting pixel for the read. the current COP is the default starting pixel. if the read runs into a window boundary it goes to the next row in the normal way (as a typewriter return). ix and iy assume a lower left origin. 0 <= ix,iy <= 511 symbol(x , y , ht , str , theta) Purpose: To plot a string on the Ramtek screen. Arguments: x,y ... the lower-left coordinates of the first character in the string (floating point). ht ... the height of the string in inches (fp). str ... a pointer to a character string. theta ... the angle (degrees) at which to plot the string (fp). Notes: The string must terminate in a '\0' . (strings passed in double quotes automatically do.) The string is drawn in the current foreground color. The string is drawn in the current line width. "symbol" only supports upper-case letters. Any lower-case letters passed are mapped to upper case. text(&string [,style [,x , y]]) Purpose: Write character strings on the screen. Arguments: string ... the address of an ASCII string, either as a quoted string or the address of a character array. style ... values 0-4 are accepted with the following results: 0 - foreground color character on background color panel. 1 - background color character on foreground color panel. 2 - additive foreground color character. 3 - additive background color character. x,y ... coordinates of the lower left corner of the first character. Notes: The default x,y pair is the current beam position. The beam is left at the lower right corner of the last character. No responsibility is maintained for beam updating if the string passes a window boundary or otherwise uses a carriage return and/or a line feed. window(xl , yb , xr , yt) Purpose: Declare a window on the Ramtek screen. Arguments: xl ... the left edge of the window (floating point). yb ... the bottom edge of the window (fp). xr ... the right edge of the window (fp). yt ... the top edge of the window (fp). Notes: Probably the best (and possible only) use for this routine is in the filling of a rectangle with one color. Rather than doing a time- consuming polygon fill, the user should set the window to the size of his rectangle, set the background color to the rectangle's color, and do an "erase." Afterwards, he should set the window back to full screen, or subsequent graphics instructions may be fubared. e right edge of the window (fp). yt ... the top edge of the window (fp). Notes: Probably the best (and possible only) use for this routine is in the filling of a rectanglùD>> ADCúE>úE>DC MñÿCùFÿÿ>ùFÿÿ> MñÿCVàÿCøGýÿ>øGýÿ>VàÿCZ×ÿA÷Güÿ>> A';W&G^DCDC&G^Uæÿ] MñÿC MñÿCUæÿ]`Îÿ`VàÿCVàÿC`Îÿ`fÁÿ[Z×ÿA';W1=š1M¯&G^&G^1M¯(]âÿ­Uæÿ]Uæÿ](]âÿ­iÈÿ¶`Îÿ``Îÿ`iÈÿ¶p¸ÿ­fÁÿ[1=š4E%¥4VÛ1M¯1M¯4VÛ+fåÿó(]âÿ­(]âÿ­+fåÿórËÿêiÈÿ¶iÈÿ¶rËÿêy»ÿÁp¸ÿ­4E%¥5Y3£5jÙ4VÛ4VÛ5jÙ,yôÿï+fåÿó+fåÿó,yôÿï…ÚÿèrËÿêrËÿê…Úÿè‹ÉÿÀy»ÿÁ5Y3£6tD 5„&Ù5jÙ5jÙ5„&Ù+’ì,yôÿï,yôÿï+’ì�íÿæ…Úÿè…Úÿè�íÿæ£Ýÿ½‹ÉÿÀ6tD 3˜Y›3¦<Ö5„&Ù5„&Ù3¦<Ö*²ë+’ì+’ì*²ë¼ä�íÿæ�íÿæ¼äÁøÿ¸£Ýÿ½3˜Y›.Æp–.ÑVÐ3¦<Ö3¦<Ö.ÑVÐ&Û<ë*²ë*²ë&Û<ëâ'ß¼ä¼äâ'ßæ²Áøÿ¸.Æp–&ã{…'ëe¶.ÑVÐ.ÑVÐ'ëe¶!óOÏ&Û<ë&Û<ë!óOÏø>Åâ'ßâ'ßø>Åü3 æ²&ã{… ‹�zÃ'ëe¶'ëe¶zÃjÛ!óOÏ!óOÏjÛ]Òø>Åø>Å]ÒU«ü3  ‹�K¥œMš×zÃzÃMš× P�ðjÛjÛ P�ðR†ç]Ò]ÒR†çþS�ºU«K¥œ ·Т ·ÈÞMš×Mš× ·ÈÞ·Àù P�ð P�ð·Àù¸ºïR†çR†ç¸ºïý¸¶ÁþS�º ·Т ÃÖ– ÃÍÛ ·ÈÞ ·ÈÞ ÃÍÛ ÄÅó·Àù·Àù ÄÅóľ踺︺ïľèýĹ³ý¸¶Â ÃÖ–ÎÛžÏÓé ÃÍÛ ÃÍÛÏÓé ÏÉù ÄÅó ÄÅó ÏÉùÏÀõľèľèÏÀõþÏ»¼ýĹ³ÎÛž ×Ý^ ÖÖ•ÏÓéÏÓé ÖÖ• ÖÌ£ ÏÉù ÏÉù ÖÌ£ÖÄœÏÀõÏÀõÖÄœþÖ¿pþÏ»¼ ×Ý^ÚÛÚÖ ÖÖ• ÖÖ•ÚÖÙÑ ÖÌ£ ÖÌ£ÙÑÙÍÖÄœÖÄœÙÍúÙÊþÖ¿p÷Güÿ>Z×ÿA÷YÙÿ?öGüÿ>öGüÿ>÷YÙÿ?ëUáÿ?õGýÿ>õGýÿ>ëUáÿ?ßQëÿ>ôFþÿ>ôFþÿ>ßQëÿ>ÙLóÿ;óFÿÿ>Z×ÿAfÁÿ[öfÁÿJ÷YÙÿ?÷YÙÿ?öfÁÿJäbËÿAëUáÿ?ëUáÿ?äbËÿAÓZÛÿ9ßQëÿ>ßQëÿ>ÓZÛÿ9ÈRìÿ%ÙLóÿ;fÁÿ[p¸ÿ­ôq¶ÿröfÁÿJöfÁÿJôq¶ÿrßm¿ÿFäbËÿAäbËÿAßm¿ÿFÌdÒÿÓZÛÿ9ÓZÛÿ9ÌdÒÿÀXëÿ4ÈRìÿ%p¸ÿ­y»ÿÁò{·ÿ}ôq¶ÿrôq¶ÿrò{·ÿ}ÝwÀÿ%ßm¿ÿFßm¿ÿFÝwÀÿ%ÊnÔÿ:ÌdÒÿÌdÒÿÊnÔÿ:½aðÿ‘ÀXëÿ4y»ÿÁ‹ÉÿÀò�Æÿxò{·ÿ}ò{·ÿ}ò�Æÿx܉Îÿ!ÝwÀÿ%ÝwÀÿ%܉Îÿ!É�ãÿ:ÊnÔÿ:ÊnÔÿ:É�ãÿ:¼tÿÿ”½aðÿ‘‹ÉÿÀ£Ýÿ½ó¥Úÿpò�Æÿxò�Æÿxó¥ÚÿpÝ¡ãÿ܉Îÿ!܉Îÿ!Ý¡ãÿÉ™÷ÿ9É�ãÿ:É�ãÿ:É™÷ÿ9»Ž—¼tÿÿ”£Ýÿ½Áøÿ¸óÂõÿló¥Úÿpó¥ÚÿpóÂõÿlÞ¿þÿÝ¡ãÿÝ¡ãÿÞ¿þÿ˸:É™÷ÿ9É™÷ÿ9˸:¾®(š»Ž—Áøÿ¸æ²òèqóÂõÿlóÂõÿlòèqßåÞ¿þÿÞ¿þÿßåÎà.E˸:˸:Îà.EÃ×E›¾®(šæ²ü3 óý0dòèqòèqóý0dáû5ßåßåáû5Ô÷CLÎà.EÎà.EÔ÷CLÉðW—Ã×E›ü3 U«ôSióý0dóý0dôSiçWáû5áû5çWÛaJÔ÷CLÔ÷CLÛaJÔp™ÉðW—U«þS�ºõSoôSiôSiõSoëR‚çWçWëR‚ãQ‰DÛaJÛaJãQ‰DÞO“�Ôp™þS�ºý¸¶Áõ¸µwõSoõSoõ¸µwí¸·ëR‚ëR‚í¸·ç¸¼GãQ‰DãQ‰D縼Gã·ÞÞO“�ý¸¶ÂýĹ³õĹgõ¸µwõ¸µwõĹgíÄ»í¸·í¸·íÄ»æÄÁ7縼G縼GæÄÁ7áÄÇ�ã·ÞýĹ³þÏ»¼öÏ»ZõĹgõĹgöÏ»ZìÏ¿íÄ»íÄ»ìÏ¿äÏÄ'æÄÁ7æÄÁ7äÏÄ'ßÏ˘áÄÇ�þÏ»¼þÖ¿p÷ÖÀ5öÏ»ZöÏ»Z÷ÖÀ5íÖÃìÏ¿ìÏ¿íÖÃäÖÉäÏÄ'äÏÄ'äÖÉßÖÎ[ßÏ˘þÖ¿púÙÊõÙÊ÷ÖÀ5÷ÖÀ5õÙÊðÙËíÖÃíÖÃðÙËìÙÎäÖÉäÖÉìÙÎêÙÓßÖÎ[óFÿÿ>ÙLóÿ;ÙFÿÿ9óE>óE>ÙFÿÿ9ß<9ôD>ôD>ß<9å3 9õC>õC>å3 9ì.);õC>ÙLóÿ;ÈRìÿ%ÇFÙFÿÿ9ÙFÿÿ9ÇFÍ8ß<9ß<9Í8Ø)4å3 9å3 9Ø)4å!A ì.);ÈRìÿ%ÀXëÿ4»IGÇFÇF»IGÁ7'CÍ8Í8Á7'CÎ(APØ)4Ø)4Î(APáQKå!A ÀXëÿ4½aðÿ‘·PÓ»IG»IG·PÓ»?0ñÁ7'CÁ7'C»?0ñÉ/JæÎ(APÎ(APÉ/Jæà$Z³áQK½aðÿ‘¼tÿÿ”¶dØ·PÓ·PÓ¶dØ»S>ö»?0ñ»?0ñ»S>öÉDXêÉ/JæÉ/JæÉDXêß:h¶à$Z³¼tÿÿ”»Ž—·/ݶdضdØ·/Ý»oNø»S>ö»S>ö»oNøÉahîÉDXêÉDXêÉahîßWx¹ß:h¶»Ž—¾®(š¹¢Dß·/Ý·/ݹ¢Dß¾”bù»oNø»oNø¾”bù̇{ðÉahîÉahî̇{ðàмßWx¹¾®(šÃ×E›¾Í_Û¹¢Dß¹¢Dß¾Í_ÛÁÃyù¾”bù¾”bùÁÃyùι�í̇{ð̇{ðι�íâ³›¼àмÃ×E›ÉðW—ÅènϾÍ_Û¾Í_ÛÅènÏÈàƒëÁÃyùÁÃyùÈàƒëÔØ•àι�íι�íÔØ•àåÔ µâ³›¼ÉðW—Ôp™Ñ�ÓÅènÏÅènÏÑ�ÓÔ ‘ïÈàƒëÈàƒëÔ ‘ïÜžåÔØ•àÔØ•àÜžåꦸåÔ µÔp™ÞO“�ÜLžÜÑ�ÓÑ�ÓÜLžÜßJ¨÷Ô ‘ïÔ ‘ïßJ¨÷äH±íÜžåÜžåäH±ííF·½ê¦¸ÞO“�ã·Þâ·ËÜÜLžÜÜLžÜâ·ËÜä¶ÓùßJ¨÷ßJ¨÷ä¶Óùé¶ÙîäH±íäH±íé¶Ùîï¶ݾíF·½ã·ÞáÄÇ�àÃÏØâ·ËÜâ·ËÜàÃÏØãÃØòä¶Óùä¶ÓùãÃØòèÃßçé¶Ùîé¶ÙîèÃßçïÃä®ï¶ݾáÄÇ�ßÏ˘ÞÏÓèàÃÏØàÃÏØÞÏÓèáÎÝùãÃØòãÃØòáÎÝùçÎæôèÃßçèÃßççÎæôîÎë¸ïÃä®ßÏ˘ßÖÎ[ßÖÖ”ÞÏÓèÞÏÓèßÖÖ”ã×ߢáÎÝùáÎÝùã×ߢè×è›çÎæôçÎæôè×è›î×ìnîÎë¸ßÖÎ[êÙÓèÚØßÖÖ”ßÖÖ”èÚØêÚÝã×ߢã×ߢêÚÝíÚáè×è›è×è›íÚáòÚäî×ìnõC>ì.);õ/'>÷C>÷C>õ/'>3 >÷C>÷C>3 >9>ùC>ùC>9>> AùD>ì.);å!A ÷!A3õ/'>õ/'>÷!A3 '8<3 >3 > '8<1(D9>9>1(D';W> Aå!A áQKúS÷!A3÷!A3úS"J1 '8< '8<"J1&.7\1(D1(D&.7\1=š';WáQKà$Z³û"^dúSúSû"^d'V"J1"J1'V*4BV&.7\&.7\*4BV4E%¥1=šà$Z³ß:h¶û7leû"^dû"^dû7le=c 'V'V=c +IOQ*4BV*4BV+IOQ5Y3£4E%¥ß:h¶ßWx¹úU|dû7leû7leúU|d[r=c =c [r+f_I+IOQ+IOQ+f_I6tD 5Y3£ßWx¹àмú}ŒeúU|dúU|dú}Œe‚„[r[r‚„)ŒqE+f_I+f_I)ŒqE3˜Y›6tD àŠ¼â³›¼û±žnú}Œeú}Œeû±žnµ—‚„‚„µ—$¼‡J)ŒqE)ŒqE$¼‡J.Æp–3˜Y›â³›¼åÔ µúÒ£qû±žnû±žnúÒ£qÕ�µ—µ—Õ�Û�@$¼‡J$¼‡JÛ�@&ã{….Æp–åÔ µê¦¸ú¨qúÒ£qúÒ£qú¨q¤Õ�Õ�¤šDÛ�@Û�@šD ‹�&ã{…ꦸíF·½øF¸nú¨qú¨qøF¸nGµ¤¤Gµ H®GšDšD H®GK¥œ ‹�íF·½ï¶ݾ÷¶ÞqøF¸nøF¸n÷¶Þq¶ÜGµGµ¶Ü¶×N H®G H®G¶×N ·ТK¥œï¶ݾïÃä®÷Ãä`÷¶Þq÷¶Þq÷Ãä`Ãâ¶Ü¶ÜÃâÃÜ?¶×N¶×NÃÜ? ÃÖ– ·ТïÃä®îÎë¸÷ÎëS÷Ãä`÷Ãä`÷ÎëSÎçÃâÃâÎç Îá/ÃÜ?ÃÜ? Îá/ÎÛž ÃÖ–îÎë¸î×ìnö×ì1÷ÎëS÷ÎëSö×ì1×é ÎçÎç×é ×ã Îá/ Îá/ ×ã ×Ý^ÎÛžî×ìnòÚä÷Úåö×ì1ö×ì1÷ÚåýÚã×é ×é ýÚãÚà ×ã ×ãÚàÚÛ ×Ý^To run the demos in this directory: *.ram are datafiles gray file grayscale shading of object ramtek file color shading of object graythru file grayscale shading with transparency seethru file color shading with transparency nö×ì1÷ÎëS÷ÎëSö×ì1×é ÎçÎç×é ×ã Îá/ Îá/ ×ã ×Ý^ÎÛžî×ìnòÚä÷Úåö×ì1ö×ì1÷ÚåýÚã×é ×é ýÚãÚà ×ã ×ãÚàÚÛ ×Ý^¸²vµ0v›·vŸ 9vµ0%²R%™Ø%›·%²RηhÎ�(ïΙØÎ·h&¹F& (Í&�(ï&®%¨÷çÌ÷ÃŽ"R÷Õ./÷çÌ÷Í£ ¸÷ÍŠ?÷ÍŽ"R÷Í£ ¸÷&¥ š÷&Œ!÷&Š?÷&¥ š÷½¡°÷½ˆ7÷½Œ!÷½¡°÷£žÌ÷£„ S÷£ˆ7÷£žÌ÷%ÏŽ%µ %„ S÷%ÏŽ(¸²(Ÿ 9(µ (Ÿ 9v›·v‚!=v†Àv›·%™Ø%€!_%‚!=%™ØÎ�(ï΄2u΀!_Î�(ï& (Í&‡2S&„2u&•./÷ÃŽ"R÷Ãu,ÙöÃ|8¶öÃŽ"R÷ÍŠ?÷ÍpÆöÍu,ÙöÍŠ?÷&Œ!÷&s¨ö&pÆö&Œ!÷½ˆ7÷½o¾ö½s¨ö½ˆ7÷£„ S÷£kÚö£o¾ö£„ S÷%µ %œœ%kÚö%µ (Ÿ 9(†À(œœ(†Àv‚!=vi+ÄvmGv‚!=%€!_%f+æ%i+Ä%€!_΄2uÎk;üÎf+æÎ„2u&‡2S&n;Ú&k;ü&|8¶öÃu,ÙöÃ[5`öÃbA=öÃu,ÙöÍpÆöÍW'LöÍ[5`öÍpÆö&s¨ö&Z'/ö&W'Lö&s¨ö½o¾ö½V!Eö½Z'/ö½o¾ö£kÚö£Raö£V!Eö£kÚö%œœ%ƒ#%Raö%œœ(†À(mG(ƒ#(mGvi+ÄvP4KvT&Ívi+Ä%f+æ%M4m%P4K%f+æÎk;üÎREƒÎM4mÎk;ü&n;Ú&TEa&REƒ&bA=öÃ[5`öÃB?çõÃIKÄõÃ[5`öÍW'LöÍ>0ÓõÍB?çõÍW'Lö&Z'/ö&@0¶õ&>0Óõ&Z'/ö½V!Eö½<*Ëõ½@0¶õ½V!Eö£Raö£9&èõ£<*Ëõ£Raö%ƒ#%j&ª%9&èõ%ƒ#(mG(T&Í(j&ª(T&ÍvP4Kv7>Òv;/TvP4K%M4m%4>ô%7>Ò%M4mÎREƒÎ9N Î4>ôÎREƒ&TEa&;Nè&9N &IKÄõÃB?çõÃ)InõÃ0TKõÃB?çõÍ>0ÓõÍ%:ZõÍ)InõÍ>0Óõ&@0¶õ&':<õ&%:Zõ&@0¶õ½<*Ëõ½#4Rõ½':<õ½<*Ëõ£9&èõ£ 0oõ£#4Rõ£9&èõ%j&ª%Q01% 0oõ%j&ª(T&Í(;/T(Q01(;/Tv7>ÒvGYv!9Ûv7>Ò%4>ô%G{%GY%4>ôÎ9N ÎX‘ÎG{Î9N &;Nè&"Xo&X‘&0TKõÃ)InõÃRõôÃ^ÒôÃ)InõÍ%:ZõÍ CáôÍRõôÍ%:Zõ&':<õ&CÃô& Cáô&':<õ½#4Rõ½ =Ùô½CÃô½#4Rõ£ 0oõ£9õô£ =Ùô£ 0oõ%Q01%79¸ÿ%9õô%Q01(;/T(!9Û(79¸ÿ(¹F«Û8þßÂB… (Í«Û8þßúEªÈáP3ìÂB…úEªÈEƒùVLáP3ìEƒ:ÅÿXTbÿMùVL:ÅÿÎ,J,ÿÚ[¼þETbÿ ,J,ÿÚJ^þè1jŒý[¼þEJ^þèjiŠüuQsü1jŒýjiŠüuƒ_ ûÑji’ú’Qsüƒ_ û2�TKú¸t]Òù‘ji’ú¿�TKú¸›CAùÊ�LÈø-t]Òù‘›CAùʧ1Eø­Ž;Ì÷¨�LÈø-§1Eø­®%¨÷q•./÷qŽ;Ì÷¨ (Í«ÂB…¼Dg š+¯«š+¯«¼Dg ¶GI“-�«“-�«¶GI°I+ �/r«�/r«°I+ ©K ‡2S«ÂB…áP3ìÛS×¼Dg ¼Dg ÛS×ÕV÷»¶GI¶GIÕV÷»ÎXÙµ°I+ °I+ ÎXÙµÈZºÍ©K áP3ìùVLóYøÿÛS×ÛS×óYøÿí[ÙÿÕV÷»ÕV÷»í[Ùÿæ]ºÿÎXÙµÎXÙµæ]ºÿà_›ÿÈZºÍùVLTbÿMXEÿ}óYøÿóYøÿXEÿ}ùZ&ÿ‘í[Ùÿí[ÙÿùZ&ÿ‘ó\ÿ”æ]ºÿæ]ºÿó\ÿ”í^èþ†à_›ÿTbÿ [¼þE^Ÿþ®XEÿ XEÿ ^Ÿþ®`�þÏùZ&ÿùZ&ÿ`�þÏbbþÑó\ÿó\ÿbbþÑûdCþ»í^èþ[¼þE1jŒý+lnýV^Ÿþ®^Ÿþ®+lnýV%oOýr`�þÏ`�þÏ%oOýrq1ýqbbþÑbbþÑq1ýqsý\ûdCþ»1jŒýQsüKvóû+lnýV+lnýVKvóûExÔû%oOýr%oOýrExÔû>z·ûq1ýqq1ýq>z·û8}˜ûsý\Qsüji’ú’dktú’KvóûKvóûdktú’]nVú’ExÔûExÔû]nVú’Wp8ú’>z·û>z·ûWp8ú’Qrú’8}˜ûji’ú¿t]Òù‘[gYù‘Qrú¿t]Òù‘�LÈø-hVOø-[gYù‘�LÈø-Ž;Ì÷¨uDS÷¨hVOø-Ž;Ì÷¨•./÷q|8¶öquDS÷¨‡2S«©K �U“n;Ú«©K ÈZºÍ¯cAÍ�U“ÈZºÍà_›ÿÇi"ÿ¯cAÍà_›ÿí^èþ†Ógoþ†Çi"ÿí^èþûdCþ»ânÊý»ÓgoþûdCþ»sý\ÿ}™ü\ânÊý»sý\8}˜û†ûÿ}™ü\8}˜ûQrú’8| ù’†ûQrú¿[gYù‘Bpàø‘8| ù¿[gYù‘hVOø-O_Ö÷-Bpàø‘hVOø-uDS÷¨[NÚö¨O_Ö÷-uDS÷¨|8¶öqbA=öq[NÚö¨n;Ú«�U“w_TEa«�U“¯cAÍ–mÉÿÍw_¯cAÍÇi"ÿ­s©þ–mÉÿÍÇi"ÿÓgoþ†ºqöý†­s©þÓgoþânÊý»ÉwQý»ºqöýânÊý»ÿ}™ü\æ† ü\ÉwQý»ÿ}™ü\†û�¦úæ† ü\†û8| ù’†'ù’�¦ú8| ù¿Bpàø‘(zgø‘†'ù¿Bpàø‘O_Ö÷-6i]÷-(zgø‘O_Ö÷-[NÚö¨BWaö¨6i]÷-[NÚö¨bA=öqIKÄõqBWaö¨TEa«w_qaüNGC«NGC«qaüjcÝHJ%«HJ%«jcÝdf¿BL«BL«df¿^h¡;Nè«w_–mÉÿÍ�o«ÿÝqaüqaü�o«ÿ݉r�ÿÚjcÝjc݉r�ÿÚƒuoÿÃdf¿df¿ƒuoÿÃ|wPÿ|^h¡–mÉÿÍ­s©þ§u‹þ�o«ÿÝ�o«ÿݧu‹þ¡xmþ‰r�ÿÚ‰r�ÿÚ¡xmþ›zOþ ƒuoÿÃuoÿÛzOþ ”|0þK|wPÿ|­s©þºqöý†´tÙýx§u‹þ§u‹þ´tÙýx®w»ý{¡xmþ¡xmþ®w»ý{¨y�ýŽ›zOþ ›zOþ ¨y�ýŽ¡z}ý§”|0þKºqöýÉwQý»Ãz3ýŸ´tÙý ´tÙý Ãz3ýŸ½}ý§®w»ý ®w»ý ½}ý§¶÷üɨy�ý¨y�ý¶÷üɰ�ØüÜ¡z}ý-ÉwQý»æ† ü\߉üKÃz3ýŸÃz3ýŸß‰üKÙ‹äûQ½}ý§½}ý§Ù‹äûQÓŽÆûk¶÷üɶ÷üÉÓŽÆûkÌ�§û‰°�ØüÜæ† ü\�¦úÿ’ˆú߉üK߉üKÿ’ˆúù•iúÙ‹äûQÙ‹äûQù•iúó—KúÓŽÆûkÓŽÆûkó—Kúí™,úÌ�§û‰�¦ú†'ù’ˆ ù’ÿ’ˆúÿ’ˆúˆ ù’Šêø’ù•iúù•iúŠêø’ �Ìø’ó—Kúó—Kú �Ìø’�®ø’í™,ú†'ù¿(zgø‘ƒí÷‘�®ø¿(zgø‘6i]÷-räö-ƒí÷‘6i]÷-BWaö¨)aèõ¨räö-BWaö¨IKÄõq0TKõq)aèõ¨;Nè«^h¡Wj4QÇ‹4QÇ‹WjOm]-T¤N-T¤NOm]Ip=ˆ'V…Î'V…ÎIp=ˆDq'¶"Xo«^h¡|wPÿ|ux-ÿaWjWjux-ÿan{ ÿ¢Om]Om]n{ ÿ¢g}ëþ™Ip=ˆIp=ˆg}ëþ™c~ÔþDq'¶|wPÿ|”|0þK�} þrux-ÿaux-ÿa�} þr…~çýŸn{ ÿ¢n{ ÿ¢…~çýŸ~Æý\g}ëþ™g}ëþ™~Æý\y®ýªc~Ôþ”|0þK¡z}ý§™zXýÙ�} þr�} þr™zXýÙ‘x/ý=…~çýŸ…~çýŸ‘x/ý=‰w ý.~Æý\~Æý\‰w ý.„uðüžy®ýª¡z}ý-°�Øüܨ‚´üÕ™zXý™zXý¨‚´üÕ¡ƒ�ü‘x/ý‘x/ý¡ƒ�üš„nü«‰w ýU‰w ýUš„nü«•„VüM„uðüt°�ØüÜÌ�§û‰Å’…ûÀ¨‚´üÕ¨‚´üÕÅ’…ûÀ¾”bû”¡ƒ�ü¡ƒ�ü¾”bû”·—Bû¹š„nü«š„nü«·—Bû¹³˜+ûj•„VüMÌ�§û‰í™,úæœ ú®Å’…ûÀÅ’…ûÀæœ ú®ÞŸèùr¾”bû”¾”bû”ÞŸèùrØ¡Éùb·—Bû¹·—Bû¹Ø¡ÉùbÓ£³ù+³˜+ûjí™,ú�®ø’þ’�øaæœ ú®æœ ú®þ’�øa÷”jøfÞŸèùrÞŸèùr÷”jøfñ—Jø�Ø¡ÉùbØ¡Éùbñ—Jø�ì™5øÑÓ£³ù+�®ø¿ƒí÷‘ö�t÷¸ì™5ø2ƒí÷‘räö-|jöÊö�t÷¸räö-)aèõ¨knõ­|jöÊ)aèõ¨0TKõq^Òôqknõ­¨‚´üÕÅ’…ûÀ¾”bû”3a(:k4zôÿ21xøÿ91xøÿ9zôÿ2ƒÝÿ.!‹Èÿ9!‹Èÿ9ƒÝÿ.ôŠÍÿ0™¡ÿ9™¡ÿ9ôŠÍÿ0ÚŽÀÿ3案ÿ:k4èrî|úÿzôÿ2zôÿ2î|úÿí�îÿƒÝÿ.ƒÝÿ.í�îÿå„çÿôŠÍÿ0ôŠÍÿ0å„çÿÔ‡àÿÚŽÀÿ3èrà}Šâ‚™î|úÿî|úÿâ‚™á†þÿ«í�îÿí�îÿá†þÿ«Û‰÷ÿ¯å„çÿå„çÿÛ‰÷ÿ¯Ñ‹òÿ§Ô‡àÿà}Šß�"Ÿà“Ùₙₙà“ÙÝ—óá†þÿ«á†þÿ«Ý—óØšêÛ‰÷ÿ¯Û‰÷ÿ¯ØšêÑœ½Ñ‹òÿ§ß�"Ÿßž.Ÿà¢$Úà“Ùà“Ùà¢$ÚÝ¥ôÝ—óÝ—óÝ¥ôبêØšêØšêØ¨êѪ¾Ñœ½ßž.Ÿà­: à°0Úà¢$Úà¢$Úà°0ÚÞ´'õÝ¥ôÝ¥ôÞ´'õØ·ëØ¨êبêØ·ëѹ¾Ñª¾à­: à¼F áÀ=Ûà°0Úà°0ÚáÀ=ÛÞÃ3õÞ´'õÞ´'õÞÃ3õÙÆ+ëØ·ëØ·ëÙÆ+ëÑÈ&¿Ñ¹¾à¼F àÌR¡áÐIÛáÀ=ÛáÀ=ÛáÐIÛÞÓ?öÞÃ3õÞÃ3õÞÓ?öÙÖ7ìÙÆ+ëÙÆ+ëÙÖ7ìÑ×2¿ÑÈ&¿àÌR¡âäd¥åéWÃáÐIÛáÐIÛåéWÃäìNëÞÓ?öÞÓ?öäìNëÝîGÚÙÖ7ìÙÖ7ìÝîGÚÒïBÃÑ×2¿âäd¥íôs{óû]}åéWÃåéWÃóû]}óþQ—äìNëäìNëóþQ—éJŽÝîGÚÝîGÚéJŽÕCŽÒïBÃíôs{ ûƒ7a=óû]}óû]}a=  JGóþQ—óþQ—  JGû:AéJŽéJŽû:AÝ-<ÕCŽ ûƒ7Fù˜Cga=a=Cg/7  JG  JG/7û:Aû:Aë"øÿÝ-<Fù˜Wø�DPhQCgCgPhQ82W/7/782W!T!Tî&ëÿJë"øÿWø�Dgÿ§—^l¼PhQPhQ^l¼C1È82W82WC1È*Æ!T!T*Æñ/ãÿ¬î&ëÿJgÿ§—u¸±l(yâ^l¼^l¼l(yâM5:öC1ÈC1ÈM5:ö$>ï*Æ*Æ$>ïôDèÿËñ/ãÿ¬u¸±ƒJÕ°wV”ãl(yâl(yâwV”ãV`TùM5:öM5:öV`Tù)g ñ$>ï$>ï)g ñökËôDèÿË案ÿ:ÚŽÀÿ3À’·ÿ4Ä£‚ÿ;Ä£‚ÿ;À’·ÿ4¯‘¹ÿ<¢Ÿ�ÿ=¢Ÿ�ÿ=¯‘¹ÿ<£‹ÊÿDƒ•­ÿ?ƒ•­ÿ?£‹ÊÿD–~ëÿGl…ØÿBÚŽÀÿ3Ô‡àÿŠØÿ À’·ÿ4À’·ÿ4ŠØÿ ¹ŠØÿ0¯‘¹ÿ<¯‘¹ÿ<¹ŠØÿ0³†âÿn£‹ÊÿD£‹ÊÿD³†âÿn­}øÿs–~ëÿGÔ‡àÿÑ‹òÿ§ÆŒïÿyŠØÿ ŠØÿ ÆŒïÿy¿Œðÿ ¹ŠØÿ0¹ŠØÿ0¿Œðÿ º‰÷ÿ~³†âÿn³†âÿnº‰÷ÿ~µ„£­}øÿsÑ‹òÿ§Ñœ½ÉœuÆŒïÿyÆŒïÿyÉœuÁ›¿Œðÿ ¿Œðÿ Á›º™ Dº‰÷ÿ~º‰÷ÿ~º™ D¶–™µ„£Ñœ½Ñª¾É« uÉœuÉœuÉ« uÁªÁ›Á›Áªº§Dº™ Dº™ Dº§Dµ¤š¶–™Ѫ¾Ñ¹¾É¹vÉ« uÉ« uɹvÀ¸ÁªÁªÀ¸º¶"Eº§Dº§Dº¶"Eµ³*šµ¤šѹ¾ÑÈ&¿ÉÈ%vɹvɹvÉÈ%vÀÇ(À¸À¸ÀÇ(¹Å.Eº¶"Eº¶"E¹Å.EµÂ6›µ³*šÑÈ&¿Ñ×2¿ÉØ1vÉÈ%vÉÈ%vÉØ1vÀ×4ÀÇ(ÀÇ(À×4¹Õ:E¹Å.E¹Å.E¹Õ:E´ÒB›µÂ6›Ñ×2¿ÒïBÃÆð>¢ÉØ1vÉØ1vÆð>¢¾ð@*À×4À×4¾ð@*¸îF`¹Õ:E¹Õ:E¸îF`²êS�´ÒB›ÒïBÃÕCŽÁ<‰Æð>¢Æð>¢Á<‰¶;,¾ð@*¾ð@*¶;,°E:¸îF`¸îF`°E:¨ü[B²êS�ÕCŽÝ-<¿#:Á<‰Á<‰¿#:«&%¶;,¶;,«&%œ7 °E:°E:œ7 ŽX¨ü[BÝ-<ë"øÿÃ#òÿ¿#:¿#:Ã#òÿœ!ÿÿ«&%«&%œ!ÿÿxœ7 œ7 x]H ŽXë"øÿî&ëÿJÃ'åÿ;Ã#òÿÃ#òÿÃ'åÿ;˜$õÿ(œ!ÿÿœ!ÿÿ˜$õÿ(oxxoPD]H î&ëÿJñ/ãÿ¬Ã1ÜÿuÃ'åÿ;Ã'åÿ;Ã1Üÿu“-íÿ8˜$õÿ(˜$õÿ(“-íÿ8g& oog& DDXPDñ/ãÿ¬ôDèÿËÁEáÿŠÃ1ÜÿuÃ1ÜÿuÁEáÿŠ�Bòÿ9“-íÿ8“-íÿ8�Bòÿ9`;$g& g& `;$:1P‚DDXôDèÿËökËÀkøÿ‹ÁEáÿŠÁEáÿŠÀkøÿ‹‹i 5�Bòÿ9�Bòÿ9‹i 5Ze1,`;$`;$Ze1,0]jŠ:1P‚l…ØÿB–~ëÿGŒo JapCapCŒo JŒd$NeY8DeY8DŒd$Nš\4K|D_D|D_Dš\4K·UAI£5xB–~ëÿG­}øÿs¦s wŒo JŒo J¦s w¥n†Œd$NŒd$N¥n†­j ‚š\4Kš\4K­j ‚Àg'€·UAI­}øÿsµ„£²Ħs w¦s w²IJzë¥n†¥n†²zë¸wÛ­j ‚­j ‚¸wÛÃu$ÂÀg'€µ„£¶–™´’ײIJĴ’×¶Ž&ó²zë²zë¶Ž&ó¼Š-è¸wÛ¸wÛ¼Š-èÈ2¹Ãu$¶–™µ¤š´ (×´’×´’×´ (×¶œ2ó¶Ž&ó¶Ž&ó¶œ2ó»™9鼊-輊-è»™9é×>ºÃˆ2¹µ¤šµ³*š´¯4Ø´ (×´ (×´¯4ض«>ô¶œ2ó¶œ2ó¶«>ô»¨Eê»™9é»™9黨EêæJºÃ—>ºµ³*šµÂ6›³¿@Ù´¯4Ø´¯4س¿@Ùµ»Jõ¶«>ô¶«>ôµ»Jõ»¸Q껨E껨E껸QêöV»Ã¦JºµÂ6›´ÒB›³ÏLÙ³¿@Ù³¿@Ù³ÏLÙµËVõµ»Jõµ»JõµËVõºÈ]뻸Q껸QêºÈ]ëÃÆb»Ã¶V»´ÒB›²êS�¯æ`©³ÏLÙ³ÏLÙ¯æ`©¯âiʵËVõµËVõ¯âiʶàpºÈ]ëºÈ]ë¶àpÂÂÞu°ÃÆb»²êS�¨ü[B õqF¯æ`©¯æ`© õqFŸñ}^¯âiʯâiÊŸñ}^¨ï„X¶àp¶àp¨ï„X¾ì‹VÂÞu°¨ü[BŽX�þ{ õqF õqF�þ{€÷’ Ÿñ}^Ÿñ}^€÷’ ‘ñ¡¨ï„X¨ï„X‘ñ¡³í®¾ì‹VŽX]H Ny!�þ{�þ{Ny!Ró¨!€÷’ €÷’ Ró¨!läÐ!‘ñ¡‘ñ¡läÐ!šÚè ³í®]H PD@yNy!Ny!@yDò¯Ró¨!Ró¨!Dò¯`áÜläÐ!läÐ!`áÜ“Õ÷ šÚè PDDDX1 Œ@y@y1 Œ4ùº Dò¯Dò¯4ùº Ræëœ`áÜ`áÜRæëœ‹Ù t“Õ÷ DDX:1P‚#"�É1 Œ1 Œ#"�É#Îè4ùº 4ùº #ÎèCþÞRæëœRæëœCþÞ„ñ!§‹Ù t:1P‚0]jŠR¬Õ#"�É#"�ÉR¬ÕEëø#Îè#ÎèEëø67 ëCþÞCþÞ67 ë}-@°„ñ!§£5xB·UAIÖPJFÓ1~@Ó1~@ÖPJFëQH>9q>9q>ëQH>øZ76#KS<#KS<øZ76k43a(:·UAIÀg'€Óc.zÖPJFÖPJFÓc.zÝc/>ëQH>ëQH>Ýc/>ãh%øZ76øZ76ãh%èrk4Àg'€Ãu$ÂÎt( Óc.zÓc.zÎt( Öt'.Ýc/>Ýc/>Öt'.Üw Xãh%ãh%Üw Xà}ŠèrÃu$ÂÈ2¹Ìˆ4nÎt( Ît( Ìˆ4nÔ‰1Öt'.Öt'.Ô‰1Û‹+MÜw XÜw XÛ‹+Mß�"Ÿà}ŠÈ2¹Ã—>ºÌ–@n̈4n̈4nÌ–@nÔ—=Ô‰1Ô‰1Ô—=Ûš7MÛ‹+MÛ‹+MÛš7Mßž.Ÿß�"Ÿ×>ºÃ¦JºÌ¦LnÌ–@nÌ–@n̦LnÔ§IÔ—=Ô—=Ô§IÛ©CMÛš7MÛš7MÛ©CMà­: ßž.ŸæJºÃ¶V»Ì¶Xo̦Ln̦Ln̶XoÕ·UÔ§IÔ§IÕ·UܹOMÛ©CMÛ©CMܹOMà¼F à­: öV»ÃÆb»ÌÆdo̶Xo̶XoÌÆdoÕÇaÕ·UÕ·UÕÇaÜÉ[NܹOMܹOMÜÉ[NàÌR¡à¼F ÃÆb»ÂÞu°ÏÝx„ÌÆdoÌÆdoÏÝx„ØÞwÕÇaÕÇaØÞwÞàq€ÜÉ[NÜÉ[NÞàq€âäd¥àÌR¡ÂÞu°¾ì‹VÔê“NÏÝx„ÏÝx„Ôê“Náê“ØÞwØÞwáê“çí‰wÞàq€Þàq€çí‰wíôs{âäd¥¾ì‹V³í®Øé¸Ôê“NÔê“NØé¸ñê¶áê“áê“ñê¶ð¥5çí‰wçí‰wð¥5 ûƒ7íôs{³í®šÚè Õ×îØé¸Øé¸Õ×î Ýáñê¶ñê¶ Ýá5éÃð¥5ð¥55éÃFù˜ ûƒ7šÚè “Õ÷ ÕÒý Õ×îÕ×îÕÒý Ùí Ýá ÝáÙíDèÌ25éÃ5éÃDèÌ2Wø�DFù˜“Õ÷ ‹Ù tÖÖ-ÕÒý ÕÒý ÖÖ- ÞÿÙíÙí ÞÿSíÚYDèÌ2DèÌ2SíÚYgÿ§—Wø�D‹Ù t„ñ!§Ùí)OÖÖ-ÖÖ-Ùí)O+õ Þÿ Þÿ+õaðfSíÚYSíÚYaðfu¸±gÿ§—„ñ!§}-@°Ü*HYÙí)OÙí)OÜ*HY507 +õ+õ507 o<faðfaðfo<fƒJÕ°u¸±÷D>> ADCøE>øE>DCMñÿC÷Fÿÿ>÷Fÿÿ>MñÿC VàÿCöGýÿ>öGýÿ> VàÿCZ×ÿAõGüÿ>> A6;W4G^DCDC4G^(Uæÿ]MñÿCMñÿC(Uæÿ]`Îÿ` VàÿC VàÿC`Îÿ`fÁÿ[Z×ÿA6;WC=šCM¯4G^4G^CM¯7]âÿ­(Uæÿ](Uæÿ]7]âÿ­#iÈÿ¶`Îÿ``Îÿ`#iÈÿ¶ p¸ÿ­fÁÿ[C=šHE%¥HVÛCM¯CM¯HVÛ<fåÿó7]âÿ­7]âÿ­<fåÿó'rËÿê#iÈÿ¶#iÈÿ¶'rËÿê y»ÿÁ p¸ÿ­HE%¥IY3£IjÙHVÛHVÛIjÙ=yôÿï<fåÿó<fåÿó=yôÿï'…Úÿè'rËÿê'rËÿê'…Úÿè ‹ÉÿÀ y»ÿÁIY3£JtD I„&ÙIjÙIjÙI„&Ù<’ì=yôÿï=yôÿï<’ì'�íÿæ'…Úÿè'…Úÿè'�íÿæ £Ýÿ½ ‹ÉÿÀJtD G˜Y›F¦<ÖI„&ÙI„&ÙF¦<Ö:²ë<’ì<’ì:²ë%¼ä'�íÿæ'�íÿæ%¼ä Áøÿ¸ £Ýÿ½G˜Y›?Æp–@ÑVÐF¦<ÖF¦<Ö@ÑVÐ5Û<ë:²ë:²ë5Û<ë"â'ß%¼ä%¼ä"â'ß æ² Áøÿ¸?Æp–5ã{…6ëe¶@ÑVÐ@ÑVÐ6ëe¶.óOÏ5Û<ë5Û<ë.óOÏø>Å"â'ß"â'ßø>Åü3  æ²5ã{…% ‹�'zÃ6ëe¶6ëe¶'zà jÛ.óOÏ.óOÏ jÛ]Òø>Åø>Å]ÒU«ü3 % ‹�K¥œMš×'zÃ'zÃMš×P�ð jÛ jÛP�ð R†ç]Ò]Ò R†çþS�ºU«K¥œ·Т·ÈÞMš×Mš×·ÈÞ ·ÀùP�ðP�ð ·Àù¸ºï R†ç R†ç¸ºïü¸¶ÁþS�º·ТÃÖ–ÃÍÛ·ÈÞ·ÈÞÃÍÛ ÄÅó ·Àù ·Àù ÄÅóľ踺︺ïľèýĹ³ü¸¶ÂÃÖ–ÎÛžÏÓéÃÍÛÃÍÛÏÓéÏÉù ÄÅó ÄÅóÏÉùÏÀõľèľèÏÀõþÏ»¼ýĹ³ÎÛž×Ý^ÖÖ•ÏÓéÏÓéÖÖ• ÖÌ£ÏÉùÏÉù ÖÌ£ÖÄœÏÀõÏÀõÖÄœþÖ¿pþÏ»¼×Ý^ÚÛÚÖÖÖ•ÖÖ•ÚÖÙÑ ÖÌ£ ÖÌ£ÙÑÙÍÖÄœÖÄœÙÍùÙÊþÖ¿põGüÿ>Z×ÿAõYÙÿ?óGüÿ>óGüÿ>õYÙÿ?äUáÿ?òGýÿ>òGýÿ>äUáÿ?ÔQëÿ>ðFþÿ>ðFþÿ>ÔQëÿ>ËLóÿ;ïFÿÿ>Z×ÿAfÁÿ[ófÁÿJõYÙÿ?õYÙÿ?ófÁÿJÚbËÿAäUáÿ?äUáÿ?ÚbËÿAÃZÛÿ9ÔQëÿ>ÔQëÿ>ÃZÛÿ9´Rìÿ%ËLóÿ;fÁÿ[ p¸ÿ­ðq¶ÿrófÁÿJófÁÿJðq¶ÿrÓm¿ÿFÚbËÿAÚbËÿAÓm¿ÿFºdÒÿÃZÛÿ9ÃZÛÿ9ºdÒÿ©Xëÿ4´Rìÿ% p¸ÿ­ y»ÿÁî{·ÿ}ðq¶ÿrðq¶ÿrî{·ÿ}ÑwÀÿ%Óm¿ÿFÓm¿ÿFÑwÀÿ%·nÔÿ:ºdÒÿºdÒÿ·nÔÿ:¥aðÿ‘©Xëÿ4 y»ÿÁ ‹ÉÿÀî�Æÿxî{·ÿ}î{·ÿ}î�ÆÿxЉÎÿ!ÑwÀÿ%ÑwÀÿ%ЉÎÿ!¶�ãÿ:·nÔÿ:·nÔÿ:¶�ãÿ:¤tÿÿ”¥aðÿ‘ ‹ÉÿÀ £Ýÿ½ï¥Úÿpî�Æÿxî�Æÿxï¥ÚÿpÑ¡ãÿЉÎÿ!ЉÎÿ!Ñ¡ãÿ¶™÷ÿ9¶�ãÿ:¶�ãÿ:¶™÷ÿ9£Ž—¤tÿÿ” £Ýÿ½ Áøÿ¸ïÂõÿlï¥Úÿpï¥ÚÿpïÂõÿlÒ¿þÿÑ¡ãÿÑ¡ãÿÒ¿þÿ¸¸:¶™÷ÿ9¶™÷ÿ9¸¸:¦®(š£Ž— Áøÿ¸ æ²îèqïÂõÿlïÂõÿlîèqÔåÒ¿þÿÒ¿þÿÔå½à.E¸¸:¸¸:½à.E­×E›¦®(š æ²ü3 ïý0dîèqîèqïý0d×û5ÔåÔå×û5Ä÷CL½à.E½à.EÄ÷CL¶ðW—­×E›ü3 U«ðSiïý0dïý0dðSiÞW×û5×û5ÞWÎaJÄ÷CLÄ÷CLÎaJÄp™¶ðW—U«þS�ºñSoðSiðSiñSoäR‚ÞWÞWäR‚ÙQ‰DÎaJÎaJÙQ‰DÒO“�Äp™þS�ºü¸¶Áò¸µwñSoñSoò¸µw縷äR‚äR‚縷߸¼GÙQ‰DÙQ‰D߸¼GÙ·ÞÒO“�ü¸¶ÂýĹ³òĹgò¸µwò¸µwòĹgçĻ縷縷çÄ»ÝÄÁ7߸¼G߸¼GÝÄÁ7×ÄÇ�Ù·ÞýĹ³þÏ»¼óÏ»ZòĹgòĹgóÏ»ZæÏ¿çÄ»çÄ»æÏ¿ÚÏÄ'ÝÄÁ7ÝÄÁ7ÚÏÄ'ÓÏ˘×ÄÇ�þÏ»¼þÖ¿pôÖÀ5óÏ»ZóÏ»ZôÖÀ5çÖÃæÏ¿æÏ¿çÖÃÛÖÉÚÏÄ'ÚÏÄ'ÛÖÉÔÖÎ[ÓÏ˘þÖ¿pùÙÊòÙÊôÖÀ5ôÖÀ5òÙÊëÙËçÖÃçÖÃëÙËåÙÎÛÖÉÛÖÉåÙÎâÙÓÔÖÎ[ïFÿÿ>ËLóÿ;ÌFÿÿ9ïE>ïE>ÌFÿÿ9Ó<9ðD>ðD>Ó<9Ü3 9ñC>ñC>Ü3 9å.);òC>ËLóÿ;´Rìÿ%³FÌFÿÿ9ÌFÿÿ9³F»8Ó<9Ó<9»8Ê)4Ü3 9Ü3 9Ê)4Ü!A å.);´Rìÿ%©Xëÿ4£IG³F³F£IGª7'C»8»8ª7'C¼(APÊ)4Ê)4¼(AP×QKÜ!A ©Xëÿ4¥aðÿ‘�PÓ£IG£IG�PÓ£?0ñª7'Cª7'C£?0ñ¶/Jæ¼(AP¼(AP¶/JæÕ$Z³×QK¥aðÿ‘¤tÿÿ”œdØ�PÓ�PÓœdØ¢S>ö£?0ñ£?0ñ¢S>öµDXê¶/Jæ¶/JæµDXêÔ:h¶Õ$Z³¤tÿÿ”£Ž—�/ÝœdØœdØ�/Ý£oNø¢S>ö¢S>ö£oNø¶ahîµDXêµDXê¶ahîÔWx¹Ô:h¶£Ž—¦®(š ¢Dß�/Ý�/Ý ¢Dߦ”bù£oNø£oNø¦”bù¹‡{ð¶ahî¶ah{ðÕмÔWx¹¦®(š­×E›¦Í_Û ¢Dß ¢DߦÍ_Û«Ãyù¦”bù¦”bù«Ãyù½¹�í¹‡{ð¹‡{ð½¹�íØ³›¼Õм­×E›¶ðW—°ènϦÍ_Û¦Í_Û°ènÏ´àƒë«Ãyù«Ãyù´àƒëÄØ•ཹ�í½¹�íÄØ•àÜÔ µØ³›¼¶ðW—Äp™À�Ó°ènϰènÏÀ�ÓÄ ‘ï´àƒë´àƒëÄ ‘ïОåÄØ•àÄØ•àОå⦸ÜÔ µÄp™ÒO“�ÏLžÜÀ�ÓÀ�ÓÏLžÜÓJ¨÷Ä ‘ïÄ ‘ïÓJ¨÷ÛH±íОåОåÛH±íçF·½â¦¸ÒO“�Ù·ÞطËÜÏLžÜÏLžÜØ·ËÜÚ¶ÓùÓJ¨÷ÓJ¨÷Ú¶Óùá¶ÙîÛH±íÛH±íá¶Ùîê¶ݾçF·½Ù·Þ×ÄÇ�ÕÃÏØØ·ËÜØ·ËÜÕÃÏØÙÃØòÚ¶ÓùÚ¶ÓùÙÃØòàÃßçá¶Ùîá¶ÙîàÃßçéÃä®ê¶ݾ×ÄÇ�ÓÏ˘ÒÏÓèÕÃÏØÕÃÏØÒÏÓè×ÎÝùÙÃØòÙÃØò×ÎÝùßÎæôàÃßçàÃßçßÎæôèÎë¸éÃä®ÓÏ˘ÔÖÎ[ÔÖÖ”ÒÏÓèÒÏÓèÔÖÖ”Ù×ߢ×ÎÝù×ÎÝùÙ×ߢà×è›ßÎæôßÎæôà×è›è×ìnèÎë¸ÔÖÎ[âÙÓàÚØÔÖÖ”ÔÖÖ”àÚØâÚÝÙ×ߢÙ×ߢâÚÝçÚáà×è›à×è›çÚáíÚäè×ìnòC>å.);ñ/'>ôC>ôC>ñ/'>3 >õC>õC>3 >9>÷C>÷C>9>> A÷D>å.);Ü!A ô!A3ñ/'>ñ/'>ô!A3'8<3 >3 >'8<*1(D9>9>*1(D6;W> AÜ!A ×QKøSô!A3ô!A3øS"J1'8<'8<"J15.7\*1(D*1(D5.7\C=š6;W×QKÕ$Z³ú"^døSøSú"^d'V"J1"J1'V:4BV5.7\5.7\:4BVHE%¥C=šÕ$Z³Ô:h¶ú7leú"^dú"^dú7le=c 'V'V=c ;IOQ:4BV:4BV;IOQIY3£HE%¥Ô:h¶ÔWx¹ùU|dú7leú7leùU|d[r=c =c [r;f_I;IOQ;IOQ;f_IJtD IY3£ÔWx¹Õмù}ŒeùU|dùU|dù}Œe‚„[r[r‚„8ŒqE;f_I;f_I8ŒqEG˜Y›JtD ÕŠ¼Ø³›¼ú±žnù}Œeù}Œeú±žnµ—‚„‚„µ—2¼‡J8ŒqE8ŒqE2¼‡J?Æp–G˜Y›س›¼ÜÔ µùÒ£qú±žnú±žnùÒ£qÕ�µ—µ—Õ�)Û�@2¼‡J2¼‡J)Û�@5ã{…?Æp–ÜÔ µâ¦¸ø¨qùÒ£qùÒ£qø¨q ¤Õ�Õ� ¤šD)Û�@)Û�@šD% ‹�5ã{…⦸çF·½öF¸nø¨qø¨qöF¸nGµ ¤ ¤GµH®GšDšDH®GK¥œ% ‹�çF·½ê¶ݾõ¶ÞqöF¸nöF¸nõ¶Þq¶ÜGµGµ¶Ü ¶×NH®GH®G ¶×N·ТK¥œê¶ݾéÃä®õÃä`õ¶Þqõ¶ÞqõÃä`Ãâ¶Ü¶ÜÃâ ÃÜ? ¶×N ¶×N ÃÜ?ÃÖ–·ТéÃä®èÎë¸ôÎëSõÃä`õÃä`ôÎëSÎçÃâÃâÎçÎá/ ÃÜ? ÃÜ?Îá/ÎÛžÃÖ–èÎë¸è×ìnó×ì1ôÎëSôÎëSó×ì1×é ÎçÎç×é ×ãÎá/Îá/ ×ã×Ý^ÎÛžè×ìníÚäõÚåó×ì1ó×ì1õÚåüÚã×é ×é üÚãÚà ×ã ×ãÚàÚÛ×Ý^N(Læ ð€&Ð 6÷ ß ð%‰w J&Æå.õ%õ%Î)ß $"Îß ð%õ% @ß ¶5îÿÎß $(5 îÿNÎeèý@&ß Ü$Ö À @æ>)ß $"Ö Îß ð% ß „%7Ì,· È,÷EÂ,Îþßß ®%Ú,NÎeèýß ú$5ôÿ À%_öæQ)ß $"Ö Îœ)ß $"÷ øÎZ(æN(æð& æŸ)ß ZÆeÎïß Ž÷ ´ Â% _€€t5r(Üý5t(Þý€t5¢(Øý5¤(Úý€À 5Ò(ÖýNÖý& & fÚýfØý& & fÞýfÜý& æAzfÖý& & fÚýfØýæj'æd'z& & fÞýfÜýæ\'æV'zfÖý& & fÚýfØýæJ'æD'z& & fÞýfÜýæ<'æ6'zfÖý& & fÚýfØý& & fÞýfÜýß ÌÆeF‚ Ž@ôÿtÎeß À sôÿ × Nôÿæ€)ß $"Ö  B-ôÿ_¸NÎeèýß ú$�WtÁ`1NÎeèýß ú$�WtÁ`1NÎeèýß ú$�WtÁ`1NÎeèýß ú$&÷ ^$µäýµæý–%fæýfäý& æzDzµäýµæý& & fæýfäý& æ4Dz6 6 & æðBz6 6 & æ@z÷ ,$€tÀ`° × €tÀ` €tÀ`&€tÀ`&€tÀ`&æŽ)ß $"Æe€tÀ`5ðÿõ%ÿðÿ€tÀ`5ðÿõ%ÿðÿ €tÀ`5 ðÿõ%ïðÿ3 ‚ _*& & & æ$B& & & æ`B& & & & & & & & ÷ rÆe 5 øÿõÿòÿÚ,ÄÜ(ô  €tap-òÿ €ta5òÿ5øÿõöÿ‚ -éÄÄ àDøÿV=öÿ =€ta&÷ Æ"6 6 æâ$æÜ$z�Wp ±¦,±¨,–%€ta&÷ ”"6 6 & æHCz�Wp ±ª,±¬,–%�Wp @�Wtap ®,‚ -Àæ†$æ€$æz$æt$æ¦,&÷ BÆe _¬@�èýß ž&w²!w ¢!Ħ(wm (÷%þßš(†Î£)ß $"Îß ð%w†!w v!Æå,÷ !À% & & & & µµ µ µÄÖ.BuøÿÀÿÿ5âÿ5öÿõôÿõàÿ _®ÁWp Amøÿ& & ffæ^$æX$z6 6 & æ@z÷ ˜!ÁWpa‰ÁWp Amøÿ& & ff& æHCz6 6 & æ@z÷ \!ÁWpa±ÁWpfaÎeÁWp Amøÿ^ÁWpfaÎeÁWpfaÎeÀÿ€çÁWpañ%ÿÁWpañÿÁWpañ ÁWpa1 ÁWpaq-öÿÁWpauöÿÁWpaq-ôÿÁWpauôÿÁWpaq-âÿÁWpauâÿÁWpaq-àÿÁWpauàÿƒ ƒ _Buôÿòÿ_² 5 ðÿ _´ À€ 5îÿ€À À 5 îÿÁWpfaAîÿWpa^"ÁWpfaÎeAîÿWpa^,_² AîÿWpafNíòÿÁWpaAAíòÿVp_² ÁWpaq-òÿjAîÿWpaq-òÿaAðÿWp fÎe -ÁWpa^ÁWpaf÷ XAðÿWp ±¢-±¤-–%AðÿWp @Aðÿ� p¦-AðÿWp ñÿÿ¨-µ ðÿAðÿWp fÎe -AîÿWpa^AîÿWpaf÷ ôAðÿWp ±¢-±¤-–%AðÿWp ñÿÿ¦-AðÿWp ñÿÿ¨-µ ðÿ_² AîÿWpaq-òÿ-ÀÀe5ìÿ€ÀeþÿÀ µàìÿAìÿWpafAîÿWpaNìAîÿWpfaÎeÁWpaA�çVp_² fòÿÁWpaNì÷ >µÚÿµÜÿ–%AîÿWpafÁWpaNì÷ vÚÿvÜÿzµÚÿµÜÿAîÿWpafÁWpaNâ÷ æfÜÿfÚÿz6 6 ÁWpaf÷ ƶ¶z÷ àAðÿWp ± -AîÿWpafÁWpaNì÷ ŽfÜÿfÚÿz6 6 ÁWpaf÷ l¶¶zAðÿWp ±¢-±¤-–%AðÿWp 1 ¦-AðÿWp µ ðÿñÿÿ¨-ƒ ƒ _Êõ ðÿ_® NðÿÎ & ß Â Ö _¦ ÁWp u¨-êÿÁWp fÎe -AêÿWp A -�ç� uÞÿ& & & & ff f f÷ ”ÎÿNíòÿÁWp f -fÞÿÎ æ”/ß fÆe× NÞÿÎ æÆ)ß $"Ö AêÿWp & & f¤-f¢-ÁWp f¤-f¢-zµÖÿµØÿ–%& & fØÿfÖÿfÞÿ÷ D¶¶zµÒÿµÔÿ–%ÁWp u¢-Îÿu¤-Ðÿ÷ ¾$÷€º$ÁWp w -°$wòÿ¬$@ÞÿÀ À 7¢$5 èÿG& & fÐÿfÎÿ& æ@z÷ þµæÿ& & & & ff f f÷ ˆff f f@èÿÀ &”/fæÿ÷ VÆe 5æÿ@èÿÀ pæÿ”/fÐÿfÎÿfÔÿfÒÿzµÎÿµÐÿµ èÿ@ÞÿÀ @-èÿ³@ÞÿÀe7~%÷ ÞCêÿ_œ ÁWp ñ%ÿÿ¨-_® ÁWp u¦-êÿ_Ú ÁWp u¨-èÿAêÿWp fÎe -AèÿWp ^, -_œ ÁWp fÎe -AêÿWp A -�ç� uÞÿ& & & & ff f f÷ ‚ÎÿNíòÿÁWp f -fÞÿÎ æ”/ß fÆeAêÿWp & & f¤-f¢-ÁWp f¤-f¢-zµÖÿµØÿ–%& & fØÿfÖÿfÞÿ÷ H¶¶zµÒÿµÔÿ–%ÁWp u¢-Îÿu¤-Ðÿ÷ Â"÷€¾"ÁWp w -´"wòÿ°"@ÞÿÀ À 7¦"5 èÿG& & fÐÿfÎÿ& æ@z÷ µæÿ& & & & ff f f÷ Œff f f@èÿÀ &”/fæÿ÷ ZÆe 5æÿ@èÿÀ pæÿ”/fÐÿfÎÿfÔÿfÒÿzµÎÿµÐÿµ èÿ@ÞÿÀ @-èÿ³@ÞÿÀe7‚#÷ â ÁWp C¨-à _¨ µ òÿu-öÿòÿ_Àw°w  DCÁ`À rÄ wŽÎ¦Ž ß Â Ö ¦&÷ Èÿ–%&ß Ö íw \DCÂÌ.;Wp D¨-5ÁWp C¨-/à /Wp ñ ¦-ìÁWp ñ ¦-ìWp fÎe -ÁWp ^, - 2Wp BÂe -„ òÁWp BÂe -ƒÄ ÏÄ 2òÀ0 wÊw ºõ õ%ï & & & & µµ µ µõ æèæâæÜæÖµµ µ µ& & & æ€@6 6 f fz6 6 f÷ À¶¶z6 6 f÷ ¦6 6 f fz¶¶z÷ ®„w w üõ ,Ä ÷ ‚Ã%ÄUß XÃ%Î€ß XNß XÎÿNí ß XB Žß X÷  Žfß êÖ w¦w –Æå.÷ "Ä%;À r Ä%ÎØ)ß $"Îß ð%CÃeBÂeÎþ5 ÌþÊòòò òÂe Ãeµ Ìþ5!Ìþê& & & & fÎeÎþ&÷ šôÆe ww Æåu Þÿu ÜÿÎR*fß êÖ À 5 ìÿ8ÎV*fß êÖ À õìÿ+ÎZ*fß êÖ À õìÿÎ^*fß êÖ À Îc*fß êÖ À õìÿÎh*ß $"Îß ð%õ õ%Î~*ß $"÷ à@@mÀ%Î¥*ß $"÷ Æõ ÎÁ*ß $"÷ ´ õ%ìÿÄ _.@Þÿ& & &&÷ †@Þÿ& & &&& & & æ€@÷ 8Îè*ß $"÷ dõ%C@Üÿ& & &&÷ @@Üÿ& & &&& & & æ€@÷ òÎ+ß $"÷ @Üÿ& & &&@Þÿ&&z6 6 fÎ ÷ æ¶¶zt@a°îÿ°ðÿ–%õeÞÿõeÜÿ„ Ä%ˆÎß XNß X@À ß Xu Þÿu Üÿ@Þÿ5àÿ5âÿ5äÿ5æÿ5èÿ5 êÿD@ìÿ  ‚À x *NÎeàÿß "ß X Ã% „ @@m!å ß ~w°Àt@a& & &âÿ&àÿÀt@a&ðÿ&îÿzÀt@a°àÿ°âÿ–%ƒ ÓNÎeàÿß ÉNÎeàÿß vÃNÎeàÿß x½w @ÆåD& & &&& æpBz6 6 & æ@z÷ ¸µøÿ& & &&& æpBz6 6 & æ@z÷ Œµôÿ& & & && æpBz6 6 & æ@z÷ `µöÿ× %D& & & && & &&& & &&æ&+÷ @ÆeNöÿfôÿføÿæ6+ß $"Æe@ôÿtAøÿWt@P@]öÿwXw HÆåD5 øÿ& & & æ€@6 6 &&z@øÿt@a°ìÿ°îÿ–%Äeµ øÿõ%øÿáNÎeìÿß "wüw ìÆåB& & ¦¦æˆæ‚æ|æv÷ & & ¦¦æpæjædæ^÷ öõ€@îÿ5 ðÿQ& & ¦¦æLæFæ@æ:÷ Ê& & & æA6 6 & & ¦¦& æÀAz¶¶z$& & ¦¦ææþæøæò÷ z5 îÿÂ& & ¦¦& æÀAz6 6 & æ€Ázµîÿµðÿ–%& & ¦¦æºæ´æ®æ¨÷ (& & ¦¦& æÀAzµòÿµôÿ–%=& & ¦¦& & & æ@÷ ðõ€@òÿ*& & ¦¦æbæ\æVæP÷ È& & & æ€A6 6 & & ¦¦& æÀAz¶¶zÁ5 òÿ5 ôÿ& & ¦¦ææ ææ÷ p5 öÿ5 øÿO& & ¦¦& & & æ@÷ L& & ¦¦& æÀAz6 6 & æÁz+& & ¦¦æ²æ¬æ¦æ ÷ õ€@öÿÊ& & & æÀA6 6 & & ¦¦& æÀAz¶¶zµöÿµøÿ–% & & ¦ ¦& & & æ@÷ ª3& & ¦¦t@a& & &ðÿ&îÿ& æÀz¶¶z6 6 & æ@z6 6 ¦ ¦z6 6 & æAzl& & ¦¦t@a& & &ðÿ&îÿ& æÀz¶¶z6 6 & & & æ@6 6 & & ¦¦t@a& & &ðÿ&îÿ& æÀz¶¶z¶¶z6 6 & & ¦ ¦& æAz6 6 & æ€Àz¶¶z¶¶z6 6 & æ@zt@a°îÿ°ðÿ–%„ Ä%_òNÎeîÿß "wú w ê @& & &&& æDz6 6 & æ@z÷ f„ÄEÿwÀ w ° æ Nß Ú5øÿ7TÎß XÎß XNøÿß X ß ~wˆ w x æ ý‹Àwr µ µ }¯ñ ôw N æ Îß XÎøß XÎß X ß XÎß XÎß XÎðß XÎÿß XÎß XÎðß XÎÿß X ß ~ÎF+ß ²ÎJ+ß Ž÷ :wä w Ô ÆåNß Ú5øÿÎß XÎß XNøÿß X ß ~w® w ž Î ß X ß ~w˜ w ˆ æ õ%ÿ‡_ÖÎP+fß êÖ À õøøÿdÎV+fß êÖ À õùøÿWÎZ+fß êÖ À õúøÿJÎ_+fß êÖ À õûøÿ=Îe+fß êÖ À õüøÿ0Îj+fß êÖ À õýøÿ#Îr+fß êÖ À õþøÿÎy+fß êÖ À õÿøÿ Næ+ß $"Ö ÷ " @øÿwœ õ uøÿöw € ÎæÀ+ß €&Ö 7&ÎÈ+ß $"Îß ð% 777÷ Îß X ß ~Îß XÎ€ß X ß XÎß X ß ~÷ Àýw w ÷%Ǹ ß ~À¬À · ¦pŠ/wô w ä ÷ t À 5 ÷ ˆ'À‚À æŠ/æzß Î%–%À Îâ+ß $"Îß ð%õ  À Š/æ÷+ß $"Ö „ Ä-:ó7 4wˆ w x Nfæ$ß ´&–%@-Îý+ß $"Îß ð%wX w H Îß XÎ@ß XæææàæÚæÔ6 6 ffz6 6 & æ@z÷ ¨ „ Ä%ÿÄÿß X& & & æHC6 6 ffz6 6 & æ@z÷ b ƒ Ã%ÿÃÿÎÿÎàß XæXæRæLæF6 6 ffz6 6 & æ@z÷  „ Ä%ÿÄÿß X& & & æHC6 6 ff z6 6 & æ@z÷ Ì ƒ Ã%ÿÃÿÎÿÎàß X÷ þw w DCÃe•Àåd ‚À x",÷ .÷ ˆæâæÜæÖæÐÀˆ°–%ÃeÌ‹àw¼w ¬ Â÷ ØÄ% úÄ% ÷Ä%+÷ ÀÄ%-‚ À w„Ä%9ÁWp CÀeÐÿ`÷ ’Ä%0ï éÀéw JÆå5 öÿ5 øÿ ÷ lÄ% úÄ% ÷Ä%+÷ TÄ%-ƒ ÷ FÄ%0 Ä%.[õ€@òÿ5 ôÿOÄ%9ôføÿföÿ& æ Bzµöÿµøÿ&ÎeÐÿ÷ NvöÿvøÿzµöÿµøÿÑÄ%92& & & & & æ Bvòÿvôÿzµòÿµôÿ6 6 &ÎeÐÿ÷ ø¶¶zvöÿvøÿzµöÿµøÿ÷ ŠÄ%0Ëà & & føÿföÿ÷ ä·@·>·<·:w2& & føÿföÿï7ä ÷Ú777þ7ü÷ Á Ó•-�Ó•0÷ ŒC~Áª Ó•. Ó•0Á …~÷ nC~‡7Š ÷€7¨7¦7¤7¢÷ ¶Á Ó•-÷ <Ó•.ÁXÁ ÷ ,C~Ó•e �Ó•- Ó•+ r Àe0�Áe0S�‡”À ó•0ÿÿ‡f…¦w6w2w.w *w ò÷ 8f…¦w www w È÷ ½}‚…‡÷°7 ª&æ& ÃÔÂÎÁÈÀÂ!ÀE€ÿÀU€÷ ÊÄ°Ä ŠÄÄå€÷ "Î ÷ °Ä ù÷ ÆŽ ÷ ¢Ä ù÷ 8„ üÄ83÷ ø&tôÿÀEðÿÀe0�€ÀEð!`3ð‡À83Àm&÷ €c `3† 83‡’ÃeÈ�¢9 È•0 83ƒ ŠöÈ•1Ž Àì÷ æ€c `3† 83‡0Š83‚ƒ„ ÷ ô€� À83‡ †÷ ŒÄ ù ‡÷ ˆ„ ù‡wÐ r &@ÁÀr&@�r(@ÁrP r€ € �à —vA `B A €@ ‡÷ &&f¦æ÷ ÷ ƒeB A @ ‚eA @ �e@ €e‡Ã B A @ ‡¡    ‡w >Æå~w<DÄeÀŸ2 · , %ß *$ôw7 7 ׯ-· · ÷†wø7 ú .÷twîƒÃeÁ(,BÚ üJ  Ó•-ׯÄd· ¼÷ z r f÷ ðÿ€Àe0�‡&Ä €  ‚ Ô•-÷ „\ À —vA W ‡Áå ƒ ~Áe0f—v÷ Öÿ”•‡•à •@à >Á< Ò‹ƒ D~8ÂT,ÂX,÷ Ó•0 ÷ $f v÷ öÿ€€LÀe0 9Àe�‡ÀæÂà÷ ¸û ÀØÂÒ÷ ü7Âwˆþ‚Âeƒà&æ Ä Ãm¦÷ ¤ß *$Ã~Ä Ž”ß *$à Î ß *$Ã~Ö „wBþ7 x ÀŸn· jÀå0 úÿ ‚· VWp `ìÀe0ƒf…ÀH÷ ,À>P�· 4÷ .÷ @…‡f…÷ …‡À Àå|37îÀ€ ‰\,÷|3ö÷î×-è‚÷à‡f…÷ Œ ÷21† À~ ‰21 ‡À À 7n Àßj · f …‡7X 7 V …‡f…w~‰b,J‡A …‡7 , f…AñåW,ÿÿfž÷ B@÷ 8ñ @&”6”1€…‡f…Añ ÷  @Þ± …‡@Àe71@‰h,‡À �1‡wRf…÷æâwm܇‰n,†w6ÀÎwmÈ…‡f…w¸‰n,†wwª …‡f…@wšw–‰t,†wê…‡f…@‰fA… w,üÿpÀw"jÀe"w"`Àew"V@lw"NAlÁeæw¬A &@Àtùÿ`Áe€Ø€ …‡@…&æ¦È B„ƒ‚F…‡f…ww‰Œ,†w<…‡f…@‰†w( …‡f…@wÒwΉ’,†w…‡7P ÀÿÿF…‡¦€ æÌæL& ¦z¦6 6 ‡·l÷ XÖ b·`¦¦€ 6 Ž öÌöLÎ5€ÿ¡ 6 öe€õŽ]& ¦z6 6 ·v�ÁE€WtùÿÁå˜f�6€ÀE€ÿÀU€vÖ €  € v�6€È ¶¶¶z �Æe× ÿÿ‡Æe× ‡Æe× ‡·” Î €Æe× ÿÿ„ ŽUŽUŽUÖt Ö n ö &À€6x€‡·n‡7h‡fÁ`Wp3Áe @7RÀE€�‡*@ƒÀ€@*@ƒÀ€@€@€@Ì?ÍÌ€@€@A AùAš™BüAÍÌyAš™ÙAš™¶AffAœAÍÌ€@@A AA¹Aš™ A A`A€A�AÐA¬AÍÌÌ?ÍÌ9Aš™Ì?ÍÌf@ffC®G @ÍÌ syntax: ramtek filename [width]  cannot open %s  %d - need to increase MAXSIDES in ramtek.c  nsides = %d %d %d %d %dhci out of memory!C®Gf@ff Read %d Pixels need to increase MAX in polygon.c and fill.c! ’þ *?­ªU@[Uª?·ª*@¼ª*?ðª*@¼ªª?;ªU@[Urgbcmyhcigreygrayillegal color space starting location not in color table color table size exceeded illegal number of color table entriescolor component out of range color component out of range rgb1 %f %f %f rgb2 %d %d %d redblackblackredbluegreencyanmagentayellowwhite %s is an illegal color  %d is an illegal color index /dev/rm Cannot open /dev/rm!  Ramtek write error %o Ramtek read error C®GC®G„®Œš"dN#oH#xŠ#f˜#e&#c4#s¦"l´"u¦#rüÿðÿýÿøÿ‰|3‰‰‰€5‰ß Ö –%ÆewvÓÿ‰‰or table color table size exceeded illegal number of color table entriescolor component out of range color component out of range rgb1 %f %f %f rgb2 %d %d %d redblackblackredbluegreencyanmagentayellowwhite %s is an illegal color  %d is an illegal color index /dev/rm Cannot open /dev/rm!  Ramtek write eN(@æ ð€&Ð 6÷ ß ð%‰w J&Æå.õ%õ%Î)ß $"Îß ð%õ% @ß ¶5îÿÎß $(5 îÿNÎeèý@&ß Ü$Ö À @æ2)ß $"Ö Îß ð% ß „%7À,· ¼,÷E¶,Îþßß ®%ÃŽ,NÎeèýß ú$5ôÿ À%_öæE)ß $"Ö Î�)ß $"÷ øÎZ(æN(æð& æ“)ß ZÆeÎïß Ž÷ ´ Â% _€€t5f(Üý5h(Þý€t5–(Øý5˜(Úý€À 5Æ(ÖýNÖý& & fÚýfØý& & fÞýfÜý& æAzfÖý& & fÚýfØýæ^'æX'z& & fÞýfÜýæP'æJ'zfÖý& & fÚýfØýæ>'æ8'z& & fÞýfÜýæ0'æ*'zfÖý& & fÚýfØý& & fÞýfÜýß ÌÆeF‚ Ž@ôÿtÎeß À sôÿ × Nôÿæt)ß $"Ö  B-ôÿ_¸NÎeèýß ú$�WtÁ`1NÎeèýß ú$�WtÁ`1NÎeèýß ú$�WtÁ`1NÎeèýß ú$&÷ ^$µäýµæý–%fæýfäý& æzDzµäýµæý& & fæýfäý& æ4Dz6 6 & æðBz6 6 & æ@z÷ ,$€tÀ`° × €tÀ` €tÀ`&€tÀ`&€tÀ`&æ‚)ß $"Æe€tÀ`5ðÿõ%ÿðÿ€tÀ`5ðÿõ%ÿðÿ €tÀ`5 ðÿõ%ïðÿ3 ‚ _*& & & æ$B& & & æ`B& & & & & & & & ÷ rÆe 5 øÿõÿòÿÃŽ,ÄÐ(ô  €tap-òÿ €ta5òÿ5øÿõöÿ‚ -éÄÄ àDøÿV=öÿ =€ta&÷ Æ"6 6 æÖ$æÐ$z�Wp ±š,±œ,–%€ta&÷ ”"6 6 & æHCz�Wp ±ž,± ,–%�Wp @�Wtap ¢,‚ -Àæz$æt$æn$æh$æš,&÷ BÆe _¬@�èýß ž&w²!w ¢!Äš(wm”(÷%þߎ(†Î˜)ß $"Îß ð%w†!w v!Æå,÷ !À% & & & & µµ µ µÄÊ.BuøÿÀÿÿ5âÿ5öÿõôÿõàÿ _®ÁWp Amøÿ& & ffæR$æL$z6 6 & æ@z÷ ˜!ÁWpa‰ÁWp Amøÿ& & ff& æHCz6 6 & æ@z÷ \!ÁWpa±ÁWpfaÎeÁWp Amøÿ^ÁWpfaÎeÁWpfaÎeÀÿ€çÁWpañ%ÿÁWpañÿÁWpañ ÁWpa1 ÁWpaq-öÿÁWpauöÿÁWpaq-ôÿÁWpauôÿÁWpaq-âÿÁWpauâÿÁWpaq-àÿÁWpauàÿƒ ƒ _Buôÿòÿ_² 5 ðÿ _´ À€ 5îÿ€À À 5 îÿÁWpfaAîÿWpa^"ÁWpfaÎeAîÿWpa^,_² AîÿWpafNíòÿÁWpaAAíòÿVp_² ÁWpaq-òÿjAîÿWpaq-òÿaAðÿWp fÎe”-ÁWpa^ÁWpaf÷ XAðÿWp ±–-±˜-–%AðÿWp @Aðÿ� pš-AðÿWp ñÿÿœ-µ ðÿAðÿWp fÎe”-AîÿWpa^AîÿWpaf÷ ôAðÿWp ±–-±˜-–%AðÿWp ñÿÿš-AðÿWp ñÿÿœ-µ ðÿ_² AîÿWpaq-òÿ-ÀÀe5ìÿ€ÀeþÿÀ µàìÿAìÿWpafAîÿWpaNìAîÿWpfaÎeÁWpaA�çVp_² fòÿÁWpaNì÷ >µÚÿµÜÿ–%AîÿWpafÁWpaNì÷ vÚÿvÜÿzµÚÿµÜÿAîÿWpafÁWpaNâ÷ æfÜÿfÚÿz6 6 ÁWpaf÷ ƶ¶z÷ àAðÿWp ±”-AîÿWpafÁWpaNì÷ ŽfÜÿfÚÿz6 6 ÁWpaf÷ l¶¶zAðÿWp ±–-±˜-–%AðÿWp 1 š-AðÿWp µ ðÿñÿÿœ-ƒ ƒ _Êõ ðÿ_® NðÿÎ & ß Â Ö _¦ ÁWp uœ-êÿÁWp fÎe”-AêÿWp A”-�ç� uÞÿ& & & & ff f f÷ ”ÎÿNíòÿÁWp f”-fÞÿÎ æˆ/ß fÆe× NÞÿÎ æº)ß $"Ö AêÿWp & & f˜-f–-ÁWp f˜-f–-zµÖÿµØÿ–%& & fØÿfÖÿfÞÿ÷ D¶¶zµÒÿµÔÿ–%ÁWp u–-Îÿu˜-Ðÿ÷ ²$÷€®$ÁWp w”-¤$wòÿ $@ÞÿÀ À 7–$5 èÿG& & fÐÿfÎÿ& æ@z÷ þµæÿ& & & & ff f f÷ ˆff f f@èÿÀ &ˆ/fæÿ÷ VÆe 5æÿ@èÿÀ pæÿˆ/fÐÿfÎÿfÔÿfÒÿzµÎÿµÐÿµ èÿ@ÞÿÀ @-èÿ³@ÞÿÀe7r%÷ ÞCêÿ_œ ÁWp ñ%ÿÿœ-_® ÁWp uš-êÿ_Ú ÁWp uœ-èÿAêÿWp fÎe”-AèÿWp ^,”-_œ ÁWp fÎe”-AêÿWp A”-�ç� uÞÿ& & & & ff f f÷ ‚ÎÿNíòÿÁWp f”-fÞÿÎ æˆ/ß fÆeAêÿWp & & f˜-f–-ÁWp f˜-f–-zµÖÿµØÿ–%& & fØÿfÖÿfÞÿ÷ H¶¶zµÒÿµÔÿ–%ÁWp u–-Îÿu˜-Ðÿ÷ ¶"÷€²"ÁWp w”-¨"wòÿ¤"@ÞÿÀ À 7š"5 èÿG& & fÐÿfÎÿ& æ@z÷ µæÿ& & & & ff f f÷ Œff f f@èÿÀ &ˆ/fæÿ÷ ZÆe 5æÿ@èÿÀ pæÿˆ/fÐÿfÎÿfÔÿfÒÿzµÎÿµÐÿµ èÿ@ÞÿÀ @-èÿ³@ÞÿÀe7v#÷ â ÁWp Cœ-à _¨ µ òÿu-öÿòÿ_Àw°w  DCÁ`À rÄ wŽÎ¦Ž ß Â Ö ¦&÷ Èÿ–%&ß Ö íw \DCÂÀ.;Wp Dœ-5ÁWp Cœ-/à /Wp ñ š-ìÁWp ñ š-ìWp fÎe”-ÁWp ^,”- 2Wp BÂe”-„ òÁWp BÂe”-ƒÄ ÏÄ 2òÀ$ wÊw ºõ õ%ï & & & & µµ µ µõ æÜæÖæÐæÊµµ µ µ& & & æ€@6 6 f fz6 6 f÷ À¶¶z6 6 f÷ ¦6 6 f fz¶¶z÷ ®„w w üõ ,Ä ÷ ‚Ã%ÄUß XÃ%Î€ß XNß XÎÿNí ß XB Žß X÷  Žfß êÖ w¦w –Æå.÷ "Ä%;À r Ä%ÎÌ)ß $"Îß ð%CÃeBÂeÎþ5 ÌþÊòòò òÂe Ãeµ Ìþ5!Ìþê& & & & fÎeÎþ&÷ šôÆe ww Æåu Þÿu ÜÿÎF*fß êÖ À 5 ìÿ8ÎJ*fß êÖ À õìÿ+ÎN*fß êÖ À õìÿÎR*fß êÖ À ÎW*fß êÖ À õìÿÎ\*ß $"Îß ð%õ õ%Îr*ß $"÷ à@@mÀ%Ι*ß $"÷ Æõ ε*ß $"÷ ´ õ%ìÿÄ _.@Þÿ& & &&÷ †@Þÿ& & &&& & & æ€@÷ 8ÎÜ*ß $"÷ dõ%C@Üÿ& & &&÷ @@Üÿ& & &&& & & æ€@÷ òÎû*ß $"÷ @Üÿ& & &&@Þÿ&&z6 6 fÎ ÷ æ¶¶zt@a°îÿ°ðÿ–%õeÞÿõeÜÿ„ Ä%ˆÎß XNß X@À ß Xu Þÿu Üÿ@Þÿ5àÿ5âÿ5äÿ5æÿ5èÿ5 êÿD@ìÿ  ‚À xþ)NÎeàÿß "ß X Ã% „ @@m!å ß ~w°Àt@a& & &âÿ&àÿÀt@a&ðÿ&îÿzÀt@a°àÿ°âÿ–%ƒ ÓNÎeàÿß ÉNÎeàÿß vÃNÎeàÿß x½w @ÆåD& & &&& æpBz6 6 & æ@z÷ ¸µøÿ& & &&& æpBz6 6 & æ@z÷ Œµôÿ& & & && æpBz6 6 & æ@z÷ `µöÿ× %D& & & && & &&& & &&æ+÷ @ÆeNöÿfôÿføÿæ*+ß $"Æe@ôÿtAøÿWt@P@]öÿwXw HÆåD5 øÿ& & & æ€@6 6 &&z@øÿt@a°ìÿ°îÿ–%Äeµ øÿõ%øÿáNÎeìÿß "wüw ìÆåB& & ¦¦æ|ævæpæj÷ & & ¦¦ædæ^æXæR÷ öõ€@îÿ5 ðÿQ& & ¦¦æ@æ:æ4æ.÷ Ê& & & æA6 6 & & ¦¦& æÀAz¶¶z$& & ¦¦æøæòæìææ÷ z5 îÿÂ& & ¦¦& æÀAz6 6 & æ€Ázµîÿµðÿ–%& & ¦¦æ®æ¨æ¢æœ÷ (& & ¦¦& æÀAzµòÿµôÿ–%=& & ¦¦& & & æ@÷ ðõ€@òÿ*& & ¦¦æVæPæJæD÷ È& & & æ€A6 6 & & ¦¦& æÀAz¶¶zÁ5 òÿ5 ôÿ& & ¦¦æææúæô÷ p5 öÿ5 øÿO& & ¦¦& & & æ@÷ L& & ¦¦& æÀAz6 6 & æÁz+& & ¦¦æ¦æ æšæ”÷ õ€@öÿÊ& & & æÀA6 6 & & ¦¦& æÀAz¶¶zµöÿµøÿ–% & & ¦ ¦& & & æ@÷ ª3& & ¦¦t@a& & &ðÿ&îÿ& æÀz¶¶z6 6 & æ@z6 6 ¦ ¦z6 6 & æAzl& & ¦¦t@a& & &ðÿ&îÿ& æÀz¶¶z6 6 & & & æ@6 6 & & ¦¦t@a& & &ðÿ&îÿ& æÀz¶¶z¶¶z6 6 & & ¦ ¦& æAz6 6 & æ€Àz¶¶z¶¶z6 6 & æ@zt@a°îÿ°ðÿ–%„ Ä%_òNÎeîÿß "wú w ê @& & &&& æDz6 6 & æ@z÷ f„ÄEÿwÀ w ° æ Nß Ú5øÿ7HÎß XÎß XNøÿß X ß ~wˆ w x æ ý‹Àwr µ µ }¯ñ ôw N æ Îß XÎøß XÎß X ß XÎß XÎß XÎðß XÎÿß XÎß XÎðß XÎÿß X ß ~Î:+ß ²Î>+ß Ž÷ :wä w Ô ÆåNß Ú5øÿÎß XÎß XNøÿß X ß ~w® w ž Î ß X ß ~w˜ w ˆ æ õ%ÿ‡_ÖÎD+fß êÖ À õøøÿdÎJ+fß êÖ À õùøÿWÎN+fß êÖ À õúøÿJÎS+fß êÖ À õûøÿ=ÎY+fß êÖ À õüøÿ0Î^+fß êÖ À õýøÿ#Îf+fß êÖ À õþøÿÎm+fß êÖ À õÿøÿ Næs+ß $"Ö ÷ " @øÿwœ õ uøÿöw € Îæ´+ß €&Ö 7μ+ß $"Îß ð% 7 77ö÷þÎß X ß ~Îß XÎ€ß X ß XÎß X ß ~÷ Àýw w ÷%Ǭ ß ~À À · šp~/wô w ä ÷ t À 5 ÷ |'ÀvÀ æ~/ænß Î%–%À ÎÖ+ß $"Îß ð%õ  À ~/æë+ß $"Ö „ Ä-.ó7 (wˆ w x Nfæß ´&–%@-Îñ+ß $"Îß ð%wX w H Îß XÎ@ß XæÚæÔæÎæÈ6 6 ffz6 6 & æ@z÷ ¨ „ Ä%ÿÄÿß X& & & æHC6 6 ffz6 6 & æ@z÷ b ƒ Ã%ÿÃÿÎÿÎàß XæLæFæ@æ:6 6 ffz6 6 & æ@z÷  „ Ä%ÿÄÿß X& & & æHC6 6 ff z6 6 & æ@z÷ Ì ƒ Ã%ÿÃÿÎÿÎàß X÷ þw w DCÃe•Àåd ‚À x,÷ .÷ ˆæÖæÐæÊæÄÀˆ°–%ÃeÌ‹àw¼w ¬ Â÷ ØÄ% úÄ% ÷Ä%+÷ ÀÄ%-‚ À w„Ä%9ÁWp CÀeÐÿ`÷ ’Ä%0ï éÀéw JÆå5 öÿ5 øÿ ÷ lÄ% úÄ% ÷Ä%+÷ TÄ%-ƒ ÷ FÄ%0 Ä%.[õ€@òÿ5 ôÿOÄ%9ôføÿföÿ& æ Bzµöÿµøÿ&ÎeÐÿ÷ NvöÿvøÿzµöÿµøÿÑÄ%92& & & & & æ Bvòÿvôÿzµòÿµôÿ6 6 &ÎeÐÿ÷ ø¶¶zvöÿvøÿzµöÿµøÿ÷ ŠÄ%0Ëà & & føÿföÿ÷ ä·4·2·0·.w2& & føÿföÿï7Ø ÷Î7ö7ô7ò7ð÷ Á Ó•-�Ó•0÷ ŒC~Áž Ó•. Ó•0Á …~÷ nC~‡7~ ÷t7œ7š7˜7–÷ ¶Á Ó•-÷ <Ó•.ÁLÁ ÷ ,C~Ó•e �Ó•- Ó•+ r Àe0�Áe0S�‡”À ó•0ÿÿ‡f…¦w*w&w"w w æ÷ 8f…¦wwüwøw ôw ¼÷ ½}‚…‡÷¤7 ž&æ& ÃÈÂÂÁ¼À¶!ÀE€ÿÀU€÷ ÊÄ¤Ä ŠÄÄå€÷ "Î ÷ °Ä ù÷ ÆŽ ÷ ¢Ä ù÷ 8„ üÄ,3÷ ø&tôÿÀEðÿÀe0�€ÀEð!T3ð‡À,3Àm÷ €c T3† ,3‡’ÃeÈ�¢9 È•0 ,3ƒ ŠöÈ•1Ž Àà÷ Ú€c T3† ,3‡0Š,3‚ƒ„ ÷ è€� À,3‡ †÷ ŒÄ ù ‡÷ ˆ„ ù‡wÄ r &@Á´r&@�r(@ÁrP r€ € �à —vA `B A €@ ‡÷ &&f¦æ÷ ÷ ƒeB A @ ‚eA @ �e@ €e‡Ã B A @ ‡¡    ‡w >Æå~w0DÄeÀŸ& ·  %ß *$ôw7 7 ׯ-· ú· ø÷†wì7 î .÷twâƒÃeÁ,BÚ üJ  Ó•-ׯ¸d· °÷ z r f÷ ðÿ€Àe0�‡&Ä €  ‚ Ô•-÷ „\ À —vA W ‡Áå ƒ ~Áe0f—v÷ Öÿ”•‡•à •@à >Á0 Ò‹ƒ D~8ÂH,ÂL,÷ Ó•0 ÷ $f v÷ öÿ€€LÀe0 9Àe�‡ÀÚÂÔ÷ ¸û ÀÌÂÆ÷ ü7¶wˆþ‚Âeƒà&æ Ä Ãmš÷ ˜ß *$Ã~Ä Ž”ß *$à Î ß *$Ã~Ö „wBþ7 l ÀŸb· ^Àå0 úÿ ‚· JWp `ìÀe0ƒf…À<÷ ,À2P�· (÷ "÷ @…‡f…÷ …‡À Àåp37âÀô€ ‰P,÷p3ê÷â×-Ü‚÷Ô‡f…÷ € ÷&1z Àr ‰&1 ‡À À 7b Àß^ · Z …‡7L 7 J …‡f…wr‰V,J‡A …‡7 f…AñåW,ÿÿfž÷ B@÷ 8ñ @&”6”1€…‡f…Añ ÷  @Þ± …‡@Àe7ô1@‰\,‡À �1‡wRf…÷ÚÖwmЇ‰b,†w6ÀÂwm¼…‡f…w¬‰b,†wwž …‡f…@wŽwЉh,†wê…‡f…@‰fA… w,üÿdÀw"^Àe"w"TÀew"J@lw"BAlÁeæw¬5 &@Àtùÿ`Áe€Ø€ …‡@…&æ¦È B„ƒ‚F…‡f…wøwô‰€,†w<…‡f…@‰†w( …‡f…@wÆw‰†,†w…‡7D ÀÿÿF…‡¦€ æÌæL& ¦z¦6 6 ‡·`÷ XÖ V·T¦¦€ 6 Ž öÌöLÎ5€ÿ¡ 6 öe€õŽ]& ¦z6 6 ·v�ÁE€WtùÿÁå˜f�6€ÀE€ÿÀU€vÖ €  € v�6€¼ ¶¶¶z �Æe× ÿÿ‡Æe× ‡Æe× ‡·ˆ Î €Æe× ÿÿx ŽUŽUŽUÖh Ö b ö &À€6x€‡·b‡7\‡fÁTWp3Áe @7FÀE€�‡€@€@€@A AùAš™BüAÍÌyAš™ÙAš™¶AffAœAÍÌ€@@A AA¹Aš™ A A`A€A�AÐA¬AÍÌÌ?ÍÌ9Aš™Ì?ÍÌf@ffC®G@š™ syntax: ramtek filename [width]  cannot open %s  %d - need to increase MAXSIDES in ramtek.c  nsides = %d %d %d %d %dgray out of memory!C®Gf@ff Read %d Pixels need to increase MAX in polygon.c and fill.c! ’þ *?­ªU@[Uª?·ª*@¼ª*?ðª*@¼ªª?;ªU@[Urgbcmyhcigreygrayillegal color space starting location not in color table color table size exceeded illegal number of color table entriescolor component out of range color component out of range rgb1 %f %f %f rgb2 %d %d %d redblackblackredbluegreencyanmagentayellowwhite %s is an illegal color  %d is an illegal color index /dev/rm Cannot open /dev/rm!  Ramtek write error %o Ramtek read error C®GC®G„®Œš"dN#oH#xŠ#f˜#e&#c4#s¦"l´"u¦#rüÿðÿýÿøÿ‰p3‰‰‰t5‰ß Ö –%Æew‚Óÿ‰‰or table color table size exceeded illegal number of color table entriescolor component out of range color component out of range rgb1 %f %f %f rgb2 %d %d %d redblackblackredbluegreencyanmagentayellowwhite %s is an illegal color  %d is an illegal color index /dev/rm Cannot open /dev/rm!  Ramtek write error %o ø"0à ð€&Ð 6÷ ß š ‰w ô Æåõ%õ%Î#ß ÎÎß š õ% @ß `5îÿÎß Î"5 îÿNÎeèý@&ß †Ö À @æ>#ß ÎÖ Îß š Ã(&NÎeèýß ¤5ôÿ À%XæQ#ß ÎÖ Îš#ß Î÷ ÔÎ#æ#ææúæ�#ß  ÆeÎúß J÷ ŽÎ#æø"æð& æ¢#ß  Æe5 øÿõÿòÿÃ(&Ä %_öô _ò -_ò€tap-òÿ €ta5òÿ5øÿõöÿ‚ æ@ôÿtÎeß . sôÿ × Nôÿæ~#ß ÎÖ  B-ôÿ€NÎeèýß ¤�WtÁ`1NÎeèýß ¤�WtÁ`1NÎeèýß ¤�WtÁ`1NÎeèýß ¤&÷  µäýµæý–%fæýfäý& æzDzµäýµæýfæýfäýfæýfäýzµäýµæý& & fæýfäý& æpDz6 6 & æ@z÷ d€tÀ`° × €tÀ` €tÀ`&€tÀ`&€tÀ`&æŒ#ß ÎÆe€tÀ`5ðÿõ%ÿðÿ€tÀ`5ðÿõ%ÿðÿ €tÀ`5 ðÿõ%ïðÿ3 ‚ _–ÄÄ _"Døÿ4=öÿ "�Wp@�Wtap4&�Wp@�Wtap6&�Wp@�Wtap 8&‚ -ÛNîÿæ4&&ß z–%_ @�èýß H!w¢w ’Æå.BDÀÿÿ5äÿ5øÿõöÿõâÿ kÁWpfaÎeÁWpfaÎeÀ€çÁWpañ%ÁWpañÁWpañ ÁWpa1 ÁWpaq-øÿÁWpauøÿÁWpaq-öÿÁWpauöÿÁWpaq-äÿÁWpauäÿÁWpaq-âÿÁWpauâÿƒ ƒ “uöÿôÿ_ô 5 òÿ _~À€ 5ðÿ€À À 5 ðÿÁWpfaAðÿWpa^"ÁWpfaÎeAðÿWpa^,_|AðÿWpafNíôÿÁWpaAAíôÿVp_|ÁWpaq-ôÿjAðÿWpaq-ôÿaAòÿWp fÎeÜ&ÁWpa^ÁWpaf÷ 8AòÿWp ±Þ&±à&–%AòÿWp @Aòÿ� pâ&AòÿWp ñÿÿä&µ òÿAòÿWp fÎeÜ&AðÿWpa^AðÿWpaf÷ ÔAòÿWp ±Þ&±à&–%AòÿWp ñÿÿâ&AòÿWp ñÿÿä&µ òÿ_|AðÿWpaq-ôÿ-ÀÀe5îÿ€ÀeþÿÀ µàîÿAîÿWpafAðÿWpaNìAðÿWpfaÎeÁWpaA�çVp_|fôÿÁWpaNì÷ µÜÿµÞÿ–%AðÿWpafÁWpaNì÷ övÜÿvÞÿzµÜÿµÞÿAðÿWpafÁWpaNâ÷ ÆfÞÿfÜÿz6 6 ÁWpaf÷ ¦¶¶z÷ ÀAòÿWp ±Ü&AðÿWpafÁWpaNì÷ nfÞÿfÜÿz6 6 ÁWpaf÷ L¶¶zAòÿWp ±Þ&±à&–%AòÿWp 1 â&AòÿWp µ òÿñÿÿä&ƒ ƒ _”õ òÿ_ð NòÿÎ & ß  Ö à _ð ÁWp ñ%ÿÿä&_ð NôÿÁWp fÜ&ß ê Ö ÁWp uâ&ìÿ_– ÁWp uä&ìÿÁWp fÎeÜ&AìÿWp AÜ&�ç� uàÿAìÿWp & & fà&fÞ&ÁWp fà&fÞ&zµØÿµÚÿ–%õ  & & fÚÿfØÿ÷ @AìÿWp & & fà&fÞ&÷ L€5æÿfàÿß ÖÖ _„ & & fÚÿfØÿfàÿ÷ ú¶¶zµÔÿµÖÿ–%ÁWp uÞ&Ðÿuà&ÒÿÎ ß @àÿÀ ß 5 êÿR& & fÒÿfÐÿ& æ@z÷ ʵèÿõ .÷ â&ÎeÀ÷ Š6 6 & æ€GzµÌÿµÎÿ–%f÷ hfÎÿfÌÿz÷ ‚€5`èÿõ èÿ5 èÿõ%ïèÿõïèÿNèÿß fÒÿfÐÿfÖÿfÔÿzµÐÿµÒÿµ êÿu-àÿêÿª÷ ¶ CìÿÁWp Cä&_ ÁWp uä&êÿAìÿWp fÎeÜ&AêÿWp ^,Ü&åÁWp fÎeÜ&AìÿWp AÜ&�ç� uàÿAìÿWp & & fà&fÞ&ÁWp fà&fÞ&zµØÿµÚÿ–%& & fÚÿfØÿ÷ tAìÿWp & & fà&fÞ&÷ €€5æÿfàÿß ÖÖ Ÿ& & fÚÿfØÿfàÿ÷ 0¶¶zµÔÿµÖÿ–%ÁWp uÞ&Ðÿuà&ÒÿÎ ß @àÿÀ ß 5 êÿ!& & fÒÿfÐÿ& æ@z÷ µèÿNèÿß fÒÿfÐÿfÖÿfÔÿzµÐÿµÒÿµ êÿu-àÿêÿÛ÷ N _ˆ µ ôÿu-øÿôÿ_Šww DCÁ`À rÄ wöÎ¦Ž ß  Ö ¦&÷ Èÿ–%&ß H Ö íw ÄDCÂ(;Wp Dä&5ÁWp Cä&/à /Wp ñ â&ìÁWp ñ â&ìWp fÎeÜ&ÁWp ^,Ü& 2Wp BÂeÜ&„ òÁWp BÂeÜ&ƒÄ ÏÄ 2òÀ*w2w "Îß Î€ß Nß Nß ÷ ( ww öÆåu Þÿu ÜÿÎð#fß ¦Ö À 5 ìÿ8Îô#fß ¦Ö À õìÿ+Îø#fß ¦Ö À õìÿÎü#fß ¦Ö À Î$fß ¦Ö À õìÿÎ$ß ÎÎß š õ õ%Î$ß Î÷ Î@@mÀ%ÎC$ß Î÷ ´õ Î_$ß Î÷ ¢ õ%ìÿÄ _ê @Þÿ& & &&÷ t@Þÿ& & &&& & & æ€@÷ &Ά$ß Î÷ Rõ%C@Üÿ& & &&÷ .@Üÿ& & &&& & & æ€@÷ àÎ¥$ß Î÷ @Üÿ& & &&@Þÿ&&z6 6 fÎ ÷ Ô¶¶zt@a°îÿ°ðÿ–%õeÞÿõeÜÿ„ Ä%ˆÎß Nß @À ß u Þÿu Üÿ@Þÿ5àÿ5âÿ5äÿ5æÿ5èÿ5 êÿD@ìÿ  ‚À x¨#NÎeàÿß Þß  Ã% „ @@m!å ß :wžÀt@a& & &âÿ&àÿÀt@a&ðÿ&îÿzÀt@a°àÿ°âÿ–%ƒ ÓNÎeàÿß ÖÉNÎeàÿß 2ÃNÎeàÿß 4½w .ÆåD& & &&& æpBz6 6 & æ@z÷ ¦µøÿ& & &&& æpBz6 6 & æ@z÷ zµôÿ& & & && æpBz6 6 & æ@z÷ Nµöÿ× %D& & & && & &&& & &&æÄ$÷ . ÆeNöÿfôÿføÿæÔ$ß ÎÆe@ôÿtAøÿWt@P@]öÿwFw 6ÆåD5 øÿ& & & æ€@6 6 &&z@øÿt@a°ìÿ°îÿ–%Äeµ øÿõ%øÿáNÎeìÿß Þwêw ÚÆåB& & ¦¦æjædæ^æX÷ & & ¦¦æRæLæFæ@÷ äõ€@îÿ5 ðÿQ& & ¦¦æ.æ(æ"æ÷ ¸& & & æA6 6 & & ¦¦& æÀAz¶¶z$& & ¦¦æææàæÚæÔ÷ h5 îÿÂ& & ¦¦& æÀAz6 6 & æ€Ázµîÿµðÿ–%& & ¦¦æœæ–æ�æŠ÷ & & ¦¦& æÀAzµòÿµôÿ–%=& & ¦¦& & & æ@÷ Þõ€@òÿ*& & ¦¦æDæ>æ8æ2÷ ¶& & & æ€A6 6 & & ¦¦& æÀAz¶¶zÁ5 òÿ5 ôÿ& & ¦¦æôæîæèæâ÷ ^5 öÿ5 øÿO& & ¦¦& & & æ@÷ :& & ¦¦& æÀAz6 6 & æÁz+& & ¦¦æ”æŽæˆæ‚÷ öõ€@öÿÊ& & & æÀA6 6 & & ¦¦& æÀAz¶¶zµöÿµøÿ–% & & ¦ ¦& & & æ@÷ ˜3& & ¦¦t@a& & &ðÿ&îÿ& æÀz¶¶z6 6 & æ@z6 6 ¦ ¦z6 6 & æAzl& & ¦¦t@a& & &ðÿ&îÿ& æÀz¶¶z6 6 & & & æ@6 6 & & ¦¦t@a& & &ðÿ&îÿ& æÀz¶¶z¶¶z6 6 & & ¦ ¦& æAz6 6 & æ€Àz¶¶z¶¶z6 6 & æ@zt@a°îÿ°ðÿ–%„ Ä%_®NÎeîÿß Þwè w Ø @& & &&& æDz6 6 & æ@z÷ T „ÄEÿw® w ž æ Nß –5øÿ7ŽÎß Îß Nøÿß  ß :wv w f æ ý‹Àw` µ µ }¯ñ ôw < æ Îß Îøß Îß  ß Îß Îß Îðß Îÿß Îß Îðß Îÿß  ß :Îä$ß nÎè$ß J÷ :wÒ w  ÆåNß –5øÿÎß Îß Nøÿß  ß :wœ w Œ Î ß  ß :w† w v æ õ%ÿ‡_’Îî$fß ¦Ö À õøøÿdÎô$fß ¦Ö À õùøÿWÎø$fß ¦Ö À õúøÿJÎý$fß ¦Ö À õûøÿ=Î%fß ¦Ö À õüøÿ0Î%fß ¦Ö À õýøÿ#Î%fß ¦Ö À õþøÿÎ%fß ¦Ö À õÿøÿ Næ%ß ÎÖ ÷  @øÿwŠ õ uøÿöw n Îæ^%ß *!Ö 7`Îf%ß ÎÎß š 7â7Ü7Ö÷ÖÎß  ß :Îß Î€ß  ß Îß  ß :÷ Àýw w ø ÷%ÇŒ ß :À€À · zp(wâ w Ò ÷ b À 5 ÷ \'ÀVÀ æ(æ´ß x –%À ΀%ß ÎÎß š õ  À (æ•%ß ÎÖ „ Ä-ó7 wv w f Nfæ^ß ^!–%@-Λ%ß ÎÎß š wF w 6 CBÎ ß ÀÀ ß  Žß „ Ä ú÷ 2ÿw w DCÃe•Àåd ‚À x°%÷ .÷ ˆætænæhæbÀˆ°–%ÃeÌ‹àw¼w ¬ Â÷ ØÄ% úÄ% ÷Ä%+÷ ÀÄ%-‚ À w„Ä%9ÁWp CÀeÐÿ`÷ ’Ä%0ï éÀéw JÆå5 öÿ5 øÿ ÷ lÄ% úÄ% ÷Ä%+÷ TÄ%-ƒ ÷ FÄ%0 Ä%.[õ€@òÿ5 ôÿOÄ%9ôføÿföÿ& æ Bzµöÿµøÿ&ÎeÐÿ÷ NvöÿvøÿzµöÿµøÿÑÄ%92& & & & & æ Bvòÿvôÿzµòÿµôÿ6 6 &ÎeÐÿ÷ ø¶¶zvöÿvøÿzµöÿµøÿ÷ ŠÄ%0Ëà & & føÿföÿ÷ ä·Ò ·Ð ·Î ·Ì w2& & føÿföÿï7 ÷¸7à7Þ7Ü7Ú÷ Á Ó•-�Ó•0÷ ŒC~Áˆ Ó•. Ó•0Á …~÷ nC~‡7h ÷^7†7„7‚7€÷ ¶Á Ó•-÷ <Ó•.Á6Á ÷ ,C~Ó•e �Ó•- Ó•+ r Àe0�Áe0S�‡”À ó•0ÿÿ‡f…¦www w w Ð÷ 8f…¦wêwæwâw Þw ¦÷ ½}‚…‡÷Ž7 ˆ&æ& ò¬Á¦À !ÀE€ÿÀU€÷ ÊÄŽÄ ŠÄÄå€÷ "Î ÷ °Ä ù÷ ÆŽ ÷ ¢Ä ù÷ 8„ üÄÀ+÷ ø&tôÿÀEðÿÀe0�€ÀEð!è+ð‡ÀÀ+Àm÷ þ€c è+† À+‡’ÃeÈ�¢9 È•0 À+ƒ ŠöÈ•1Ž ÀÊ÷ Ä€c è+† À+‡0ŠÀ+‚ƒ„ ÷ Ò€� ÀÀ+‡ †÷ ŒÄ ù ‡÷ ˆ„ ù‡w® r &@Ážr&@�r(@ÁrP r€ € �à —vA `B A €@ ‡÷ &&f¦æ÷ ÷ ƒeB A @ ‚eA @ �e@ €e‡Ã B A @ ‡¡    ‡w >Æå~wDÄeÀŸ ·  %ß Ôôw7 ö7 öׯì-· ä· â÷†wÖ7 Ø .÷tw̃ÃeÁ¶%BÚ üJ  Ó•-ׯ¢d· š÷ z r f÷ ðÿ€Àe0�‡&Ä €  ‚ Ô•-÷ „\ À —vA W ‡Áå ƒ ~Áe0f—v÷ Öÿ”•‡•à •@à >Á Ò‹ƒ D~8Ââ%Âæ%÷ ø Ó•0 ÷ $f v÷ öÿ€€LÀe0 9Àe�‡ÀÄ Â¾ ÷ ¸û À¶ ° ÷ ü7  wˆþ‚Âeƒà&æ Ä Ãm„ ÷ ‚ ß ÔÃ~Ä Ž”ß Ôà Î ß ÔÃ~Ö „wBþ7 V  ÀŸL · H Àå0 úÿ ‚· 4 Wp `ìÀe0ƒf…À& ÷ ,À P�·  ÷ ÷ @…‡f…÷ …‡Àð Àå,7ÒÀÞ € ‰ê%÷,Ô ÷Ì ×-Æ ‚÷¾ ‡f…÷ j ÷º)d À\ ‰º) ‡À À 7L ÀßH · D …‡76 7 4 …‡f…wb‰ð%J‡A …‡7 f…AñåW,ÿÿfž÷ B@÷ 8ñ @&”6”1€…‡f…Añ ÷  @Þ± …‡@Àe7ä1@‰ö%‡À �1‡wRf…÷ÊÆwmÀ‡‰ü%†w6À²wm¬…‡f…wœ‰ü%†wwŽ …‡f…@w~wz‰&†wê…‡f…@‰fA… w,üÿTÀw"NÀe"w"DÀew":@lw"2AlÁeæw¬% &@Àtùÿ`Áe€Ø€ …‡@…&æ¦È B„ƒ‚F…‡f…wèwä‰&†w<…‡f…@‰†w( …‡f…@w¶w²‰ &†w…‡7.ÀÿÿF…‡¦€ æÌæL& ¦z¦6 6 ‡·J ÷ XÖ @ ·> ¦¦€ 6 Ž öÌöLÎ5€ÿ¡ 6 öe€õŽ]& ¦z6 6 ð ·ì v�ÁE€WtùÿÁå˜f�6€ÀE€ÿÀU€vÖ €  € v�6€¦ ¶¶¶z �Æe× ÿÿ‡Æe× ‡Æe× ‡·r Î €Æe× ÿÿb ŽUŽUŽUÖR Ö L ö &À€6x€‡·R‡7L‡fÁDWp3Áe @76ÀE€�‡€@Ì?ÍÌ syntax: gray filename [width]  cannot open %s  %d - need to increase MAXSIDES in gray.c  nsides = %d %d %d %d %dgraygrayNºÆÒ*?­ªU@[Uª?·ª*@¼ª*?ðª*@¼ªª?;ªU@[Urgbcmyhcigreygrayillegal color space starting location not in color table color table size exceeded illegal number of color table entriescolor component out of range color component out of range rgb1 %f %f %f rgb2 %d %d %d redblackblackredbluegreencyanmagentayellowwhite %s is an illegal color  %d is an illegal color index /dev/rm Cannot open /dev/rm!  Ramtek write error %o Ramtek read error .X6Ddøoòx4fBeÐcÞsPl^uPrüÿðÿýÿøÿ‰,‰‰‰.‰ß Ö –%ÆewèÙÿ‰‰ation not in color table color table size exceeded illegal number of color table entriescolor component out of range color component out of range rgb1 %f %f %f rgb2 %d %d %d redblackblackredbluegreencyanmagentayellowwhite %s is an illegal color  %d is an illegal color index /dev/rm Cannot open /dev/rm!  Ramtek write error %o Ramtek read error .X6Ddøoòx4fBeÐcÞsPl^uPrüÿðÿýÿøÿ‰,ѹ8ʲ7‚É…èÿ~ÏŒËÿ6ÏŒËÿ6É…èÿ~È[˜ÿyÎb{ÿ4Îb{ÿ4È[˜ÿyÇ4GÿtÍ;+ÿ2Í;+ÿ2Ç4GÿtÆ÷þoÌÛþ0ʲ7‚¾­K¸¾€üÿ±É…èÿ~É…èÿ~¾€üÿ±½V¬ÿªÈ[˜ÿyÈ[˜ÿy½V¬ÿª½.\ÿ£Ç4GÿtÇ4Gÿt½.\ÿ£¼ ÿœÆ÷þo¾­K¸°«Tϰ~Ǿ€üÿ±¾€üÿ±°~ǰSµÿ¿½V¬ÿª½V¬ÿª°Sµÿ¿°,dÿ¸½.\ÿ£½.\ÿ£°,dÿ¸°ÿ°¼ ÿœ°«TÏ¢¬PÄ¢½°~ǰ~Ç¢½¢U°ÿµ°Sµÿ¿°Sµÿ¿¢U°ÿµ£-`ÿ®°,dÿ¸°,dÿ¸£-`ÿ®£ÿ§°ÿ°¢¬PÄ•°?™–ƒðÿ“¢½¢½–ƒðÿ“—Y ÿ�¢U°ÿµ¢U°ÿµ—Y ÿ�˜2Pÿˆ£-`ÿ®£-`ÿ®˜2Pÿˆ˜ ÿ‚£ÿ§•°?™�·%UŽŠÖÿR–ƒðÿ“–ƒðÿ“ŽŠÖÿR�`†ÿN—Y ÿ�—Y ÿ��`†ÿN�96ÿK˜2Pÿˆ˜2Pÿˆ�96ÿK‘æþH˜ ÿ‚�·%U‰¾Š‘¶ÿŽŠÖÿRŽŠÖÿRŠ‘¶ÿŒhfÿ�`†ÿN�`†ÿNŒhfÿ�Aÿ�96ÿK�96ÿK�AÿŽÆþ‘æþH‰¾‹ÅæÿM�™–ÿJŠ‘¶ÿŠ‘¶ÿ�™–ÿJŽpEÿHŒhfÿŒhfÿŽpEÿH�IõþE�Aÿ�Aÿ�IõþE�%¥þBŽÆþ‹ÅæÿM“ÌÉÿ’” yÿ��™–ÿJ�™–ÿJ” yÿ�•w)ÿˆŽpEÿHŽpEÿH•w)ÿˆ•PÙþƒ�IõþE�IõþE•PÙþƒ–,ˆþ~�%¥þB“ÌÉÿ’žÐµÿž¤eÿ»” yÿ�” yÿ�ž¤eÿ»Ÿ|ÿ´•w)ÿˆ•w)ÿˆŸ|ÿ´ŸUÄþ®•PÙþƒ•PÙþƒŸUÄþ® 1tþ¨–,ˆþ~žÐµÿ«ҬÿÖ«¦\ÿÏž¤eÿ»ž¤eÿ»«¦\ÿÏ«~ ÿÇŸ|ÿ´Ÿ|ÿ´«~ ÿÇ«W¼þÀŸUÄþ®ŸUÄþ®«W¼þÀ«3kþ¹ 1tþ¨«Ò¬ÿֹѰÿ̸¥`ÿÅ«¦\ÿÏ«¦\ÿϸ¥`ÿŸ}ÿ¾«~ ÿÇ«~ ÿǸ}ÿ¾¸VÀþ¸«W¼þÀ«W¼þÀ¸VÀþ¸·2pþ±«3kþ¹¹Ñ°ÿÌÅÎÁÿ¦Ä¢pÿ ¸¥`ÿŸ¥`ÿÅÄ¢pÿ Ãy ÿ›¸}ÿ¾¸}ÿ¾Ãy ÿ›ÃRÐþ•¸VÀþ¸¸VÀþ¸ÃRÐþ•Â.€þ�·2pþ±ÅÎÁÿ¦ÎÈÛÿhÌœŠÿdÄ¢pÿ Ä¢pÿ ÌœŠÿdËs:ÿaÃy ÿ›Ãy ÿ›Ës:ÿaËLêþ]ÃRÐþ•ÃRÐþ•ËLêþ]Ê(šþYÂ.€þ�ÎÈÛÿhÒÁúÿÑ”ªÿÌœŠÿdÌœŠÿdÑ”ªÿÏkZÿËs:ÿaËs:ÿaÏkZÿÎD ÿËLêþ]ËLêþ]ÎD ÿÍ ºþÊ(šþYÒÁúÿѹ8ÏŒËÿ6Ñ”ªÿÑ”ªÿÏŒËÿ6Îb{ÿ4ÏkZÿÏkZÿÎb{ÿ4Í;+ÿ2ÎD ÿÎD ÿÍ;+ÿ2ÌÛþ0Í ºþѹ8ÒË:ÕÔ2ÒÁûÿÒÁûÿÕÔ2ÒÛõÿšÎÈÛÿhÎÈÛÿhÒÛõÿšÈàÝÿÖÅÎÁÿ¦ÅÎÁÿ¦ÈàÝÿÖ¹ãÍÿå¹Ñ°ÿÌÒË:ÚÓPZàßkÕÔ2ÕÔ2àßkÝçøÿšÒÛõÿšÒÛõÿšÝçøÿšÑìßÿÁÈàÝÿÖÈàÝÿÖÑìßÿÁ¼ðËÿɹãÍÿåÚÓPZðÓe}öä{àßkàßköä{ñïæÿ€ÝçøÿšÝçøÿšñïæÿ€ß÷¿ÿ‚ÑìßÿÁÑìßÿÁß÷¿ÿ‚Âý¡ÿ�¼ðËÿÉðÓe}Ì…�ã#{öä{öä{ã#{ ÷Åÿvñïæÿ€ñïæÿ€ ÷Åÿvñvÿsß÷¿ÿ‚ß÷¿ÿ‚ñvÿsÍEÿpÂý¡ÿ�Ì…�2É•}/ã'‚ã#{ã#{/ã'‚û´ÿ„ ÷Åÿv ÷Åÿvû´ÿ„ù Rÿ„ñvÿsñvÿsù Rÿ„Óÿ…ÍEÿp2É•}>Ë£I;ç*‡/ã'‚/ã'‚;ç*‡$®ÿ«û´ÿ„û´ÿ„$®ÿ«EÿÉù Rÿ„ù Rÿ„EÿÉÖÿæÓÿ…>Ë£ICÔ¶ Añ6U;ç*‡;ç*‡Añ6U* ·ÿ�$®ÿ«$®ÿ«* ·ÿ�NÿÊEÿÉEÿÉNÿÊ×) ÿåÖÿæCÔ¶ FèÕDR=Añ6UAñ6UDR=-Ôÿ†* ·ÿ�* ·ÿ�-Ôÿ†0lÿ½NÿÊNÿÊ0lÿ½Ø;+ÿÝ×) ÿåFèÕI.D+˜ DR=DR=D+˜ +CP-Ôÿ†-Ôÿ†+CPU­ÿŽ0lÿ½0lÿ½U­ÿŽØ_mÿËØ;+ÿÝI.;+'i4>È2D+˜ D+˜ 4>È2SP +CP+CPSP öeæÿU­ÿŽU­ÿŽöeæÿÕn«ÿ%Ø_mÿË;+'i9g DÜZ4>È24>È2 DÜZöT…TSP SP öT…TÞb3OöeæÿöeæÿÞb3OËi IÕn«ÿ%9gÁEãbÂHÒa DÜZ DÜZÂHÒa¿KÂ`öT…TöT…T¿KÂ`»Mµ`Þb3OÞb3O»Mµ`´O­_Ëi I¹Ñ°ÿ̹ãÍÿå©åÅÿ÷«Ò¬ÿÖ«Ò¬ÿÖ©åÅÿ÷œäËÿèžÐµÿžеÿœäËÿè’ßáÿ§“ÌÉÿ’“ÌÉÿ’’ßáÿ§Š×h‹ÅæÿM¹ãÍÿå¼ðËÿÉ¥ó½ÿÇ©åÅÿ÷©åÅÿ÷¥ó½ÿÇ–òÀÿ¸œäËÿèœäËÿè–òÀÿ¸ŒíÛÿ�’ßáÿ§’ßáÿ§ŒíÛÿ�‚â “Š×h¼ðËÿÉÂý¡ÿ�¤�ÿ�¥ó½ÿÇ¥ó½ÿǤ�ÿ��ÿ—ÿ�–òÀÿ¸–òÀÿ¸�ÿ—ÿ�|÷¾ÿ~ŒíÛÿ�ŒíÛÿ�|÷¾ÿ~né‚â “Âý¡ÿ�ÍEÿp¦9ÿp¤�ÿ�¤�ÿ�¦9ÿp€ Sÿq�ÿ—ÿ��ÿ—ÿ�€ Sÿq_�ÿt|÷¾ÿ~|÷¾ÿ~_�ÿtGðæÿxnéÍEÿpÓÿ…¨ÿ‡¦9ÿp¦9ÿp¨ÿ‡z2ÿˆ€ Sÿq€ Sÿqz2ÿˆQyÿ†_�ÿt_�ÿtQyÿ†4ô×ÿ�GðæÿxÓÿ…Öÿæ§!ûþä¨ÿ‡¨ÿ‡§!ûþäv ÿÖz2ÿˆz2ÿˆv ÿÖJ nÿÆQyÿ†Qyÿ†J nÿÆ*ùÕÿž4ô×ÿ�Öÿæ×) ÿå¥+þþó§!ûþä§!ûþä¥+þþós%"ÿæv ÿÖv ÿÖs%"ÿæGsÿ¾J nÿÆJ nÿÆGsÿ¾&âÿx*ùÕÿž×) ÿåØ;+ÿݤ=ÿå¥+þþó¥+þþó¤=ÿår8=ÿÔs%"ÿæs%"ÿær8=ÿÔE*Žÿ«Gsÿ¾Gsÿ¾E*Žÿ«$m&âÿxØ;+ÿÝØ_mÿ˧`cÿ¼¤=ÿå¤=ÿå§`cÿ¼sZŠÿ›r8=ÿÔr8=ÿÔsZŠÿ›CNÙÿ‹E*Žÿ«E*Žÿ«CNÙÿ‹"<?Z$mØ_mÿËÕn«ÿ%­m­ÿ§`cÿ¼§`cÿ¼­m­ÿ{gÙÿsZŠÿ›sZŠÿ›{gÙÿK\CNÙÿ‹CNÙÿ‹K\-Oi"<?ZÕn«ÿ%Ëi I±gI­m­ÿ­m­ÿ±gI‹b6K{gÙÿ{gÙÿ‹b6KeZfNK\K\eZfNQR�W-OiËi I´O­_¬O«_±gI±gI¬O«_¥N°_‹b6K‹b6K¥N°_ŸLº`eZfNeZfNŸLº`›JÈ`QR�W‹ÅæÿMŠ×h†Ï)@‰¾‰¾†Ï)@ˆÈH �¶%U�¶%UˆÈH ‘Â`o•°?™•°?™‘Â`o¡¾q¥¢¬PÄŠ×h‚â “{ÖB‡†Ï)@†Ï)@{ÖB‡|Îf[ˆÈH ˆÈH |Îf[‡È~,‘Â`o‘Â`o‡È~,žÃ’¡¾q¥‚â “nédÙM�{ÖB‡{ÖB‡dÙM�ẽ}|Îf[|Îf[ẽ}vêz‡È~,‡È~,vêz–»È{žÃ’néGðæÿx=ÛG}dÙM�dÙM�=ÛG}DĦƒẽ}ẽ}DĦƒ]°ô‰vêzvêz]°ô‰†£%�–»È{Gðæÿx4ô×ÿ�*ÜD}=ÛG}=ÛG}*ÜD}3Á¸{DĦƒDĦƒ3Á¸{P§{]°ô‰]°ô‰P§{}–Uz†£%�4ô×ÿ�*ùÕÿžßMk*ÜD}*ÜD}ßMk'ÁÊE3Á¸{3Á¸{'ÁÊEF¥3P§{P§{F¥3x“r}–Uz*ùÕÿž&âÿxèa2ßMkßMkèa2Êá'ÁÊE'ÁÊEÊá@®JfF¥3F¥3@®Jfv›‹¬x“r&âÿx$mû‚èa2èa2û‚Ý8ÊáÊáÝ8<Ãjˆ@®Jf@®Jf<Ãjˆu°«Àv›‹¬$m"<?Z%¸û‚û‚%¸ 8fÝ8Ý8 8f?臘<Ãjˆ<Ãjˆ?臘tÞåÛu°«À"<?Z-Oi'>È]%¸%¸'>È]5&@| 8f 8f5&@|S «›?臘?臘S «›yÿæËtÞåÛ-OiQR�WRHËc'>È]'>È]RHËc_7#k5&@|5&@|_7#ku%trS «›S «›u%trŠžzyÿæËQR�W›JÈ`šGØaRHËcRHËcšGØa›Dèb_7#k_7#k›Dèb Aõcu%tru%tr Aõc§@ýcŠžz¢¬PÄ¡¾q¥²¼y–°«Tϰ«Tϲ¼y–Á¾sc¾­K¸¾­K¸Á¾scËÃ]<ʲ7‚ʲ7‚ËÃ]<ÒË:ѹ8¡¾q¥žÃ’·À¡"²¼y–²¼y–·À¡"ÇÁ�9Á¾scÁ¾scÇÁ�9ÒǃRËÃ]<ËÃ]<ÒǃRÚÓPZÒË:žÃ’–»È{¹·Ú{·À¡"·À¡"¹·Ú{Ó¹Ò|ÇÁ�9ÇÁ�9Ó¹Ò|å«ÒǃRÒǃRå«ðÓe}ÚÓPZ–»È{†£%�· 2޹·Ú{¹·Ú{· 2Žå§ŒÓ¹Ò|Ó¹Ò|å§Œ ·Û‡å«å« ·Û‡Ì…�ðÓe}†£%�}–Uzµ”^x· 2Ž· 2޵”^xïž;w姌姌ïž;w±óy ·Û‡ ·Û‡±óy2É•}Ì…�}–Uzx“r·�~µ”^xµ”^x·�~ö›Xïž;wïž;wö›X&± ±óy±óy&± >Ë£I2É•}x“rv›‹¬¹—š«·�~·�~¹—š«û¡v‚ö›Xö›Xû¡v‚+¸%Q&± &± +¸%QCÔ¶ >Ë£Iv›‹¬u°«Àº«¼Ϲ—š«¹—š«º«¼Ïýµ™°û¡v‚û¡v‚ýµ™°.ÌHm+¸%Q+¸%Q.ÌHmFèÕCÔ¶ u°«ÀtÞåÛ¶Ûïôº«¼Ïº«¼϶ÛïôûæÈÚýµ™°ýµ™°ûæÈÚ0úyš.ÌHm.ÌHm0úyšI.FèÕtÞåÛyÿæË®ÿäǶÛïô¶Ûïô®ÿäÇî ¸´ûæÈÚûæÈÚî ¸´#s¡0úyš0úyš#s¡;+'iI.yÿæËŠžz©–{®ÿäÇ®ÿäÇ©–{Ö&rxî ¸´î ¸´Ö&rxþ0As#s¡#s¡þ0As9g;+'iŠžz§@ýc¯?ÿc©–{©–{¯?ÿc·@ûcÖ&rxÖ&rx·@ûc½Bñcþ0Asþ0As½BñcÁEãb9g`!0Ü ð€&Ð 6÷ ß ü‰w VÆåõ%õ%΄!ß Îß üõ% @ß Œ5îÿÎß ö5 îÿNÎeèý@&ß ¨Ö À @æ¦!ß Ö Îß ü ß �7r$· n$÷Eh$Îþßß ºÃ�$NÎeèýß Æ5ôÿ À%Xæ¹!ß Ö Î"ß ÷ Îx!æx!ææúæ"ß Ž ÆeÎúß ò÷ Îl!æ`!æð& æ "ß Ž Æe5 øÿõÿòÿÃ�$ÄV#_ô _ -_€tap-òÿ €ta5òÿ5øÿõöÿ‚ æ@ôÿtÎeß – sôÿ × Nôÿææ!ß Ö  B-ôÿ€NÎeèýß Æ�WtÁ`1NÎeèýß Æ�WtÁ`1NÎeèýß Æ�WtÁ`1NÎeèýß Æ&÷ µäýµæý–%fæýfäý& æzDzµäýµæýfæýfäýfæýfäýzµäýµæý& & fæýfäý& æpDz6 6 & æ@z÷ Ú€tÀ`° × €tÀ` €tÀ`&€tÀ`&€tÀ`&æô!ß Æe€tÀ`5ðÿõ%ÿðÿ€tÀ`5ðÿõ%ÿðÿ €tÀ`5 ðÿõ%ïðÿ3 ‚ _²ÄÄ _>Døÿ4=öÿ "�Wp@�Wtapœ$�Wp@�Wtapž$�Wp@�Wtap  $‚ -ÛNîÿæœ$&ß Â–%_(@�èýß ’wèw ØÄv!wmp!÷%þßj!†Î "ß Îß üw¼w ¬Æå.BDÀÿÿ5äÿ5øÿõöÿõâÿ kÁWpfaÎeÁWpfaÎeÀ€çÁWpañ%ÁWpañÁWpañ ÁWpa1 ÁWpaq-øÿÁWpauøÿÁWpaq-öÿÁWpauöÿÁWpaq-äÿÁWpauäÿÁWpaq-âÿÁWpauâÿƒ ƒ “uöÿôÿ_6 5 òÿ _ÆÀ€ 5ðÿ€À À 5 ðÿÁWpfaAðÿWpa^"ÁWpfaÎeAðÿWpa^,_ÄAðÿWpafNíôÿÁWpaAAíôÿVp_ÄÁWpaq-ôÿjAðÿWpaq-ôÿaAòÿWp fÎeF%ÁWpa^ÁWpaf÷ ‚AòÿWp ±H%±J%–%AòÿWp @Aòÿ� pL%AòÿWp ñÿÿN%µ òÿAòÿWp fÎeF%AðÿWpa^AðÿWpaf÷ AòÿWp ±H%±J%–%AòÿWp ñÿÿL%AòÿWp ñÿÿN%µ òÿ_ÄAðÿWpaq-ôÿ-ÀÀe5îÿ€ÀeþÿÀ µàîÿAîÿWpafAðÿWpaNìAðÿWpfaÎeÁWpaA�çVp_ÄfôÿÁWpaNì÷ hµÜÿµÞÿ–%AðÿWpafÁWpaNì÷ @vÜÿvÞÿzµÜÿµÞÿAðÿWpafÁWpaNâ÷ fÞÿfÜÿz6 6 ÁWpaf÷ ð¶¶z÷ AòÿWp ±F%AðÿWpafÁWpaNì÷ ¸fÞÿfÜÿz6 6 ÁWpaf÷ –¶¶zAòÿWp ±H%±J%–%AòÿWp 1 L%AòÿWp µ òÿñÿÿN%ƒ ƒ _Üõ òÿ_2 NòÿÎ & ß F Ö à _2 ÁWp ñ%ÿÿN%_2 NôÿÁWp fF%ß , Ö ÁWp uL%ìÿ_Ø ÁWp uN%ìÿÁWp fÎeF%AìÿWp AF%�ç� uàÿAìÿWp & & fJ%fH%ÁWp fJ%fH%zµØÿµÚÿ–%& & fÚÿfØÿ÷ �AìÿWp & & fJ%fH%÷ œ€5æÿfàÿß X Ö _Æ & & fÚÿfØÿfàÿ÷ J¶¶zµÔÿµÖÿ–%ÁWp uH%ÐÿuJ%ÒÿÎ ß ~@àÿÀ ß ~5 êÿR& & fÒÿfÐÿ& æ@z÷ µèÿõ .÷ È&ÎeÀ÷ Ú6 6 & æ€GzµÌÿµÎÿ–%f÷ ¸fÎÿfÌÿz÷ Ò€5`èÿõ èÿ5 èÿõ%ïèÿõïèÿNèÿß ~fÒÿfÐÿfÖÿfÔÿzµÐÿµÒÿµ êÿu-àÿêÿª÷ Þ CìÿÁWp CN%_èÁWp uN%êÿAìÿWp fÎeF%AêÿWp ^,F%åÁWp fÎeF%AìÿWp AF%�ç� uàÿAìÿWp & & fJ%fH%ÁWp fJ%fH%zµØÿµÚÿ–%& & fÚÿfØÿ÷ ÄAìÿWp & & fJ%fH%÷ Ѐ5æÿfàÿß X Ö Ÿ& & fÚÿfØÿfàÿ÷ €¶¶zµÔÿµÖÿ–%ÁWp uH%ÐÿuJ%ÒÿÎ ß ~@àÿÀ ß ~5 êÿ!& & fÒÿfÐÿ& æ@z÷ PµèÿNèÿß ~fÒÿfÐÿfÖÿfÔÿzµÐÿµÒÿµ êÿu-àÿêÿÛ÷ v _Ê µ ôÿu-øÿôÿ_Òw8w (DCÁ`À rÄ wÎ¦Ž ß F Ö ¦&÷ Èÿ–%&ß Š Ö íw äDCÂr&;Wp DN%5ÁWp CN%/à /Wp ñ L%ìÁWp ñ L%ìWp fÎeF%ÁWp ^,F% 2Wp BÂeF%„ òÁWp BÂeF%ƒÄ ÏÄ 2òÀRwRw BÎß ~Î€ß ~Nß ~Nß ~÷ P w&w CBÎ ß ~ÀÀ ß ~ Žß ~„ Ä ú÷  wðw àÆåu Þÿu ÜÿÎh"fß NÖ À 5 ìÿ8Îl"fß NÖ À õìÿ+Îp"fß NÖ À õìÿÎt"fß NÖ À Îy"fß NÖ À õìÿÎ~"ß Îß üõ õ%Δ"ß ÷ ¸@@mÀ%λ"ß ÷ žõ Î×"ß ÷ Œ õ%ìÿÄ _b@Þÿ& & &&÷ Ž@Þÿ& & &&& & & æ€@÷ @Îþ"ß ÷ <õ%C@Üÿ& & &&÷ H@Üÿ& & &&& & & æ€@÷ úÎ#ß ÷ ö@Üÿ& & &&@Þÿ&&z6 6 fÎ ÷ î¶¶zt@a°îÿ°ðÿ–%õeÞÿõeÜÿ„ Ä%ˆÎß ~Nß ~@À ß ~u Þÿu Üÿ@Þÿ5àÿ5âÿ5äÿ5æÿ5èÿ5 êÿD@ìÿ  ‚À x "NÎeàÿß Vß ~ Ã% „ @@m!å ß ¤wˆÀt@a& & &âÿ&àÿÀt@a&ðÿ&îÿzÀt@a°àÿ°âÿ–%ƒ ÓNÎeàÿß NÉNÎeàÿß ªÃNÎeàÿß ¬½w ÆåD& & &&& æpBz6 6 & æ@z÷ Àµøÿ& & &&& æpBz6 6 & æ@z÷ ”µôÿ& & & && æpBz6 6 & æ@z÷ hµöÿ× %D& & & && & &&& & &&æ<#÷  ÆeNöÿfôÿføÿæL#ß Æe@ôÿtAøÿWt@P@]öÿw0w ÆåD5 øÿ& & & æ€@6 6 &&z@øÿt@a°ìÿ°îÿ–%Äeµ øÿõ%øÿáNÎeìÿß VwÔw ÄÆåB& & ¦¦æjædæ^æX÷ & & ¦¦æRæLæFæ@÷ þõ€@îÿ5 ðÿQ& & ¦¦æ.æ(æ"æ÷ Ò& & & æA6 6 & & ¦¦& æÀAz¶¶z$& & ¦¦æææàæÚæÔ÷ ‚5 îÿÂ& & ¦¦& æÀAz6 6 & æ€Ázµîÿµðÿ–%& & ¦¦æœæ–æ�æŠ÷ 0& & ¦¦& æÀAzµòÿµôÿ–%=& & ¦¦& & & æ@÷ øõ€@òÿ*& & ¦¦æDæ>æ8æ2÷ Ð& & & æ€A6 6 & & ¦¦& æÀAz¶¶zÁ5 òÿ5 ôÿ& & ¦¦æôæîæèæâ÷ x5 öÿ5 øÿO& & ¦¦& & & æ@÷ T& & ¦¦& æÀAz6 6 & æÁz+& & ¦¦æ”æŽæˆæ‚÷ õ€@öÿÊ& & & æÀA6 6 & & ¦¦& æÀAz¶¶zµöÿµøÿ–% & & ¦ ¦& & & æ@÷ ² 3& & ¦¦t@a& & &ðÿ&îÿ& æÀz¶¶z6 6 & æ@z6 6 ¦ ¦z6 6 & æAzl& & ¦¦t@a& & &ðÿ&îÿ& æÀz¶¶z6 6 & & & æ@6 6 & & ¦¦t@a& & &ðÿ&îÿ& æÀz¶¶z¶¶z6 6 & & ¦ ¦& æAz6 6 & æ€Àz¶¶z¶¶z6 6 & æ@zt@a°îÿ°ðÿ–%„ Ä%_&NÎeîÿß VwÒ w  @& & &&& æDz6 6 & æ@z÷ n „ÄEÿw˜ w ˆ Îæ\#ß PÖ 7€Îe#ß Îß ü æ€#ß PÖ 7`Ή#ß Îß ü 7à7Ú7Ô÷ÖÎß ~ ß ¤Îß ~Î€ß ~ ß ~Îß ~ ß ¤÷ þw w ð ÷%ÇŠ ß ¤À~À · xp‚&wÚ w Ê ÷ Z À 5 ÷ ZÀTÀ æ‚&æ²ß Ú–%õ  À ‚&æ¤#ß Ö „ Ä- ó7 w‚ w r Nfærß n–%wh w X æ Nß >5øÿ7ìÎß ~Îß ~Nøÿß ~ ß ¤w0 w æ ý‹Àw µ µ }¯ñ ôw öæ Îß ~Îøß ~Îß ~ ß ~Îß ~Îß ~Îðß ~Îÿß ~Îß ~Îðß ~Îÿß ~ ß ¤Îª#ß Î®#ß ò÷ :wŒw |ÆåNß >5øÿÎß ~Îß ~Nøÿß ~ ß ¤wVw FÎ ß ~ ß ¤w@w 0æ õ%ÿ‡_:δ#fß NÖ À õøøÿdκ#fß NÖ À õùøÿWξ#fß NÖ À õúøÿJÎÃ#fß NÖ À õûøÿ=ÎÉ#fß NÖ À õüøÿ0ÎÎ#fß NÖ À õýøÿ#ÎÖ#fß NÖ À õþøÿÎÝ#fß NÖ À õÿøÿ Næã#ß Ö ÷ Ê@øÿwDõ uøÿö7Ø ÷Î7ö7ô7ò7ð÷ Á Ó•-�Ó•0÷ ŒC~Áž Ó•. Ó•0Á …~÷ nC~‡7~ ÷t7œ7š7˜7–÷ ¶Á Ó•-÷ <Ó•.ÁLÁ ÷ ,C~Ó•e �Ó•- Ó•+ r Àe0�Áe0S�‡”À ó•0ÿÿ‡f…¦w*w&w"w w æ÷ 8f…¦wwüwøw ôw ¼÷ ½}‚…‡÷¤7 ž&æ& ÃÈÂÂÁ¼À¶!ÀE€ÿÀU€÷ ÊÄ¤Ä ŠÄÄå€÷ "Î ÷ °Ä ù÷ ÆŽ ÷ ¢Ä ù÷ 8„ üÄ$(÷ ø&tôÿÀEðÿÀe0�€ÀEð!L(ð‡À$(Àm÷ €c L(† $(‡’ÃeÈ�¢9 È•0 $(ƒ ŠöÈ•1Ž Àà ÷ Ú €c L(† $(‡0Š$(‚ƒ„ ÷ è €� À$(‡ †÷ ŒÄ ù ‡÷ ˆ„ ù‡wÄ  r &@Á´ r&@�r(@ÁrP r€ € �à —vA `B A €@ ‡÷ &&f¦æ÷ ÷ ƒeB A @ ‚eA @ �e@ €e‡Ã B A @ ‡¡    ‡w RÆå~w0 DÄeÀŸ& ·  %ß "ôw27 7 ׯ -· ú · ø ÷†wì 7 î  .÷twâ ƒÃeÁ$BÚ üJ  Ó•-ׯ¸ d· ° ÷ z r f÷ ðÿ€Àe0�‡&Ä €  ‚ Ô•-÷ „\ À —vA W ‡Áå ƒ ~Áe0f—v÷ Öÿ”•‡•à •@à >Á0  Ò‹ƒ D~8ÂJ$ÂN$÷  Ó•0 ÷ $f v÷ öÿ€€LÀe0 9Àe�‡ÀÚ ÂÔ ÷ ¸û ÀÌ ÂÆ ÷ ü7¶ wˆþ‚Âeƒà&æ Ä Ãmš ÷ ˜ ß "Ã~Ä Ž”ß "à Î ß "Ã~Ö „wBþ7 l  ÀŸb · ^ Àå0 úÿ ‚· J Wp `ìÀe0ƒf…À< ÷ ,À2 P�· ( ÷ " ÷ @…‡f…÷ …‡À Àåh(7ìÀô € ‰R$÷h(ê ÷â ×-Ü ‚÷Ô ‡f…@‰†wF …‡f…w¨‰X$J‡A …‡7 R f…AñåW,ÿÿfž÷ B@÷ 8ñ @&”6”1€…‡f…Añ ÷  @Þ± …‡@Àe7*1@‰^$‡À �1‡w˜f…w w‰d$†w~…‡f…@wðwì‰j$†w\…‡f…÷ÜØwmÒ‡‰p$†w<ÀÄwm¾…‡f…w®‰p$†ww  …‡f…@w�wŒ‰v$†wð…‡f…@‰fA… w,üÿfÀw"`Àe"w"VÀew"L@lw"DAlÁeæw¬7 &@Àtùÿ`Áe€Ø€ …‡@…&æ¦È B„ƒ‚F…‡w âÿæ B 5 øÿ‚ Ê¥ üÊ¥ ùÊ¥-µ øÿóÊ¥9 Wp @�”@`ÄeÐÿÊ¥0ñõ øÿ w–ÿ70ÀÿÿF…‡·’‡7Œ‡fÁ„Wp3Áe @7vÀE€�‡¦€ æÌæL& ¦z¦6 6 ‡· ÷ XÖ  · ¦¦€ 6 Ž öÌöLÎ5€ÿ¡ 6 öe€õŽ]& ¦z6 6  ·¾ v�ÁE€WtùÿÁå˜f�6€ÀE€ÿÀU€vÖ €  € v�6€x ¶¶¶z �Æe× ÿÿ‡Æe× ‡Æe× ‡·D Î €Æe× ÿÿ4 ŽUŽUŽUÖ$ Ö  ö &À€6x€‡*@ƒÀ€@*@ƒÀ€@€@€@Ì?ÍÌ syntax: gray filename [width]  cannot open %s  %d - need to increase MAXSIDES in gray.c  nsides = %d %d %d %d %dhcihci out of memory!Æ2>J*?­ªU@[Uª?·ª*@¼ª*?ðª*@¼ªª?;ªU@[Urgbcmyhcigreygrayillegal color space starting location not in color table color table size exceeded illegal number of color table entriescolor component out of range color component out of range rgb1 %f %f %f rgb2 %d %d %d /dev/drb Cannot open /dev/drb!  /dev/drc Cannot open /dev/drc!  %o redblackblackredbluegreencyanmagentayellowwhite %s is an illegal color  %d is an illegal color index ’dFo@x‚f�ec,sžl¬užrüÿðÿýÿøÿ‰h(‰‰‰‰‰l*‰ß Ö –%ÆewtÛÿe starting location not in color table color table size exceeded illegal number of color table entriescolor component out of range color component out of range rgb1 %f %f %f rgb2 %d %d %d /dev/drb Cannot open /dev/drb!  /dev/drc Cannot open /dev/drc!  %o redblackblackredbluegreencyanmagentayellowwhite %s is an ill"„_ram_kb"&_read_cu"¸fisitod"#_fill"z_on_ligh"_off_lig"2_foregrd" _draw"cret"þ"fltused"’ac0$(_in_buf"t_flush_b"š_move_cu"`_FDKB$0(_open"ü!_printf"h_stty"<"_gtty"Þ!_read""_scanbuf$2(_dummy$^)_ppt$h)fisdtoi"B#_sort"< _cop""fiststf"$_write_i"N_merge"€ _strcmp"Dfiscmpf"ì#_rgb_cvt"L_cmy_cvt"D_hci_cvt" _gray_cv"¢_FDB$*_FDC$*_BUFFER$ *_NWORDS$°+_XNOW$²+_YNOW$´+_COLORNO$¶+_IWIDTH$¸+_table_i"n_nargs"†"_write"Z"_ram_rea"ò_color_n"4pfloat"’pscien"ì_ecvt"d_fcvt"Ž_putchar"n!_flush"œ!_fout$,cerror" #_errno$º+fisdtol"¢#fisltod"P#fisnegf"F$y"<"_gtty"Þ!_read""_scanbuf$2(_dummy$^)_ppt$h)fisdtoi"B#_sort"< _cop""fiststf"$_write_i"N_merge"€ _strcmp"Dfiscmpf"ì#_rgb_cvt"L_cmy_cvt"D_hci_cvt" _gray_cv"¢_FDB$*_FDC$*_BUFFER$ *_NWORDS$°+_XNOW$²+_YNOW$´+_COLORNO$¶+_IWIread_font(font,index,nchars) struct {int ix,iy,pc;} font[]; struct {int st,np,wid;} index[]; int *nchars; { extern char fin; char filen[20],c; register char *f; register int i,jj; printf("font file name?"); for (f= &filen;(c=getchar())!='\n';f++) *f=c; *f= '\0'; fin=open(&filen,0); if (fin<0) {printf("open failure on %s",&filen); abort();} scanf("d",nchars); printf(" nchars=%d\n", *nchars); for (i=0;i<*nchars;i++) { scanf("d,d,d",&index[i].st,&index[i].np,&index[i].wid); printf("stnpwid %d,%d,%d\n",index[i].st,index[i].np,index[i].wid); } for (i=0;i<*nchars;i++) { for (jj=index[i].st;jjt,&var->u,&var->v); } ask(str) char str[]; { char yy,dum; do { printf("%s ",str); yy=getchar();} while (yy!='y' && yy!='n'); do { dum=getchar();} while (!(empty())); return (yy=='y'?1:0); } inwin(xl,xr,yb,yt) float *xl,*xr,*yb,*yt; { if (ask("restricted window? ")) { printf("input xl, xr, yb, yt "); scanf("%f,%f,%f,%f",xl,xr,yb,yt); *xl= (*xl>0.0 && *xl<14.0? *xl:0.0); *xr= (*xr>*xl && *xr<=14.0? *xr:14.0); *yb= (*yb>0.0 && *yb<10.24? *yb:0.0); *yt= (*yt>*yb && *yt<=10.24? *yt:10.24); window(*xl,*yb,*xr,*yt); } else { *xl= (*yb=0.0); *xr= 14.; *yt= 10.24; } } inbkg() { register char *bcol; char acol[20],c; if (ask("new background color?")) { bcol= &acol; printf("input background color name "); do { /* until some color entered */ for (bcol= &acol;(c=getchar())!='\n';bcol++) *bcol=c; *bcol='\0'; } while (bcol== &acol); backgrd(&acol); erase(); } window(0.0,0.0,14.0,10.24); } (*xl,*yb,*xr,*yt); } else { *xl= (*yb=0.0); *xr= 14.; *yt= 10.24; } } inbkg() { register char *bcol; char acol[20],c; if (ask("new background color?")) { bcol= &acol; printf("input background color name "); do { /* until some color entered */ for (bcol= &acol;(c=getchar())!='\n';bcol++) *bcol=c; *bcol='\0'; } while (bcol== &acol); backgrd(&acol); erase(); } window(0.0,0.0,14 37 0 13 8 13 23 8 36 19 8 55 14 8 69 13 8 82 11 8 93 24 9 117 13 8 130 13 6 143 16 10 159 12 8 171 7 7 178 13 10 191 11 9 202 18 8 220 15 8 235 21 9 256 18 8 274 19 8 293 9 8 302 13 8 315 7 10 322 11 12 333 13 8 346 10 8 356 11 8 367 16 6 383 7 4 390 17 8 407 26 8 433 15 8 448 16 8 464 25 8 489 8 7 497 30 8 527 25 8 552 3 8 0 3 3 3 13 2 5 13 2 8 3 2 6 3 2 5 6 2 3 6 2 2 3 2 0 3 2 3 8 3 4 10 2 5 8 2 3 8 2 0 3 3 0 13 2 6 13 2 8 11 2 8 9 2 7 8 2 8 7 2 8 5 2 6 3 2 0 3 2 2 5 3 2 7 2 5 7 2 6 6 2 5 5 2 2 5 2 2 9 3 2 11 2 5 11 2 6 10 2 5 9 2 2 9 2 2 5 3 0 5 3 0 11 2 2 13 2 6 13 2 8 11 2 8 10 2 6 10 2 5 11 2 3 11 2 2 10 2 2 6 2 3 5 2 5 5 2 6 6 2 8 6 2 8 5 2 6 3 2 2 3 2 0 5 2 0 3 3 0 13 2 6 13 2 8 11 2 8 5 2 6 3 2 0 3 2 2 5 3 2 11 2 5 11 2 6 10 2 6 6 2 5 5 2 2 5 2 0 3 3 0 13 2 8 13 2 8 11 2 2 11 2 2 9 2 5 9 2 5 7 2 2 7 2 2 5 2 8 5 2 8 3 2 0 3 2 0 3 3 0 13 2 8 13 2 8 11 2 2 11 2 2 9 2 5 9 2 5 7 2 2 7 2 2 3 2 0 3 2 0 5 3 0 11 2 2 13 2 6 13 2 8 11 2 8 10 2 6 10 2 5 11 2 3 11 2 2 10 2 2 6 2 3 5 2 5 5 2 6 5 2 6 6 2 5 6 2 5 7 2 9 7 2 9 6 2 8 6 2 8 4 2 7 3 2 2 3 2 0 5 2 0 3 3 0 13 2 2 13 2 2 9 2 6 9 2 6 13 2 8 13 2 8 3 2 6 3 2 6 7 2 2 7 2 2 3 2 0 3 2 0 3 3 0 5 2 2 5 2 2 11 2 0 11 2 0 13 2 6 13 2 6 11 2 4 11 2 4 5 2 6 5 2 6 3 2 0 3 2 0 5 3 0 6 2 2 6 2 3 5 2 5 5 2 6 6 2 6 11 2 4 11 2 4 13 2 10 13 2 10 11 2 8 11 2 8 5 2 6 3 2 2 3 2 0 5 2 0 3 3 0 13 2 2 13 2 2 10 2 5 13 2 8 13 2 3 8 2 8 3 2 5 3 2 2 6 2 2 3 2 0 3 2 0 3 3 0 13 2 2 13 2 2 5 2 7 5 2 7 3 2 0 3 2 0 3 3 0 13 2 2 13 2 5 10 2 8 13 2 10 13 2 10 3 2 8 3 2 8 10 2 5 7 2 2 10 2 2 3 2 0 3 2 0 3 3 0 13 2 2 13 2 7 6 2 7 13 2 9 13 2 9 3 2 7 3 2 2 10 2 2 3 2 0 3 2 0 5 3 0 11 2 2 13 2 6 13 2 8 11 2 8 5 2 6 3 2 2 3 2 0 5 2 2 6 3 2 10 2 3 11 2 5 11 2 6 10 2 6 6 2 5 5 2 3 5 2 2 6 2 0 3 3 0 13 2 6 13 2 8 11 2 8 9 2 6 7 2 2 7 2 2 3 2 0 3 2 2 9 3 2 11 2 5 11 2 6 10 2 5 9 2 2 9 2 0 5 3 0 11 2 2 13 2 6 13 2 8 11 2 8 5 2 7 4 2 9 2 2 8 1 2 6 3 2 2 3 2 0 5 2 2 6 3 2 10 2 3 11 2 5 11 2 6 10 2 6 6 2 5 5 2 3 5 2 2 6 2 0 3 3 0 13 2 6 13 2 8 11 2 8 9 2 6 7 2 8 3 2 6 3 2 4 7 2 2 7 2 2 3 2 0 3 2 2 9 3 2 11 2 5 11 2 6 10 2 5 9 2 2 9 2 0 3 3 0 5 2 5 5 2 6 6 2 5 7 2 2 7 2 0 9 2 0 11 2 2 13 2 8 13 2 8 11 2 3 11 2 2 10 2 3 9 2 6 9 2 8 7 2 8 5 2 6 3 2 0 3 2 0 11 3 0 13 2 8 13 2 8 11 2 5 11 2 5 3 2 3 3 2 3 11 2 0 11 2 0 5 3 0 13 2 2 13 2 2 6 2 3 5 2 5 5 2 6 6 2 6 13 2 8 13 2 8 5 2 6 3 2 2 3 2 0 5 2 0 13 3 3 13 2 5 8 2 7 13 2 10 13 2 5 3 2 0 13 2 0 13 3 2 13 2 4 9 2 6 13 2 8 9 2 10 13 2 12 13 2 8 3 2 6 7 2 4 3 2 0 13 2 0 3 3 3 8 2 0 13 2 2 13 2 4 10 2 6 13 2 8 13 2 5 8 2 8 3 2 6 3 2 4 6 2 2 3 2 0 3 2 0 13 3 2 13 2 4 10 2 6 13 2 8 13 2 5 8 2 5 3 2 3 3 2 3 8 2 0 13 2 0 3 3 0 5 2 6 11 2 0 11 2 0 13 2 8 13 2 8 11 2 2 5 2 8 5 2 8 3 2 0 3 2 0 5 3 0 11 2 2 13 2 4 13 2 6 11 2 6 5 2 4 3 2 2 3 2 0 5 2 2 6 3 2 10 2 3 11 2 4 10 2 4 6 2 3 5 2 2 6 2 2 3 3 2 11 2 0 11 2 2 13 2 4 13 2 4 3 2 2 3 2 0 3 3 0 5 2 6 9 2 6 10 2 5 11 2 3 11 2 2 10 2 0 10 2 0 11 2 2 13 2 6 13 2 8 11 2 8 8 2 3 5 2 8 5 2 8 3 2 0 3 2 0 5 3 0 6 2 2 6 2 3 5 2 5 5 2 6 6 2 5 7 2 3 7 2 3 9 2 5 9 2 6 10 2 5 11 2 3 11 2 2 10 2 0 10 2 0 11 2 2 13 2 6 13 2 8 11 2 8 9 2 7 8 2 8 7 2 8 5 2 6 3 2 2 3 2 0 5 2 0 7 3 0 13 2 2 13 2 2 9 2 5 9 2 5 13 2 7 13 2 7 9 2 8 9 2 8 7 2 7 7 2 7 3 2 5 3 2 5 7 2 0 7 2 0 3 3 0 5 2 5 5 2 6 6 2 5 7 2 0 7 2 0 13 2 8 13 2 8 11 2 2 11 2 2 9 2 6 9 2 8 7 2 8 5 2 6 3 2 0 3 2 0 5 3 0 11 2 2 13 2 6 13 2 8 11 2 8 10 2 6 10 2 5 11 2 3 11 2 2 10 2 2 8 2 3 9 2 6 9 2 8 7 2 8 5 2 6 3 2 2 3 2 0 5 2 2 6 3 3 7 2 5 7 2 6 6 2 5 5 2 3 5 2 2 6 2 0 11 3 0 13 2 7 13 2 7 11 2 2 3 2 0 3 2 5 11 2 0 11 2 0 5 3 0 7 2 1 8 2 0 9 2 0 11 2 2 13 2 6 13 2 8 11 2 8 9 2 7 8 2 8 7 2 8 5 2 5 3 2 2 3 2 0 5 2 2 6 3 3 7 2 5 7 2 6 6 2 5 5 2 3 5 2 2 6 2 2 10 3 3 11 2 5 11 2 6 10 2 5 9 2 3 9 2 2 10 2 2 6 3 0 6 3 2 6 2 3 5 2 5 5 2 6 6 2 6 8 2 5 7 2 2 7 2 0 9 2 0 11 2 2 13 2 6 13 2 8 11 2 8 5 2 5 3 2 2 3 2 0 5 2 0 6 2 2 10 3 3 11 2 5 11 2 6 10 2 5 9 2 3 9 2 2 10 2 0 3 3 8 3 3 0 3 3 5 2 5 3 2 2 3 2 0 5 2 2 6 3 3 7 2 5 7 2 6 6 2 5 5 2 3 5 2 2 6 2 2 10 3 3 11 2 5 11 2 6 10 2 5 9 2 3 9 2 cc -f ramfont.o rfsubs.o /lib/scanf.o /lib/ramlib.a /lib/ramlib.a mv a.out ramf beep 2 7 2 2 7 2 0 9 2 0 11 2 2 13 2 6 13 2 8 11 2 8 5 2 5 3 2 2 3 2 0 5 2 0 6 2 2 10 3 3 11 2 5 11 2 6 10 2 5 9 2 3 9 2 2 10 2 0 3 3 8 3 3 0 3 3 5 2 5 3 2 2 3 2 0 5 2 2 6 3 3 7 2 5 7 2 6 6 2 5 5 2 3 5 2 2 6 2 2 10 3 3 11 2 5 11 2 6 10 2 5 9 2 3 9 2 cc -n -c ramfont.c beep /lib/scanf.o /lib/ramlib.a /lib/ramlib.a mv a.out ramf beep 2 7 2 2 7 2 0 9 2 0 11 2 2 13 2 6 13 2 8 11 2 8 5 2 5 3 2 2 3 2 0 5 2 0 6 2 2 10 3 3 11 2 5 11 2 6 10 2 5 9 2 3 9 2 2 10 2 0 3 3 8 3 3 0 3 3 5 2 5 3 2 2 3 2 0 5 2 2 6 3 3 7 2 5 7 2 6 6 2 5 5 2 3 5 2 2 6 2 2 10 3 3 11 2 5 11 2 6 10 2 5 9 2 3 9 2 #include "ramtek.h" float nn[]{.25,.25,.25},k[]{0.,0.,0.},n[]{.75,.75,.75},w[]{1.,1.,1.}, r[]{0.,1.,1.},g[]{1.,0.,1.},b[]{0.,1.,1.}, m[]{1.,0.,1.},c[]{0.,1.,1.},l[]{1.,1.,0.}; main() { int i , npts , ix , iy , st; float x,y; struct {float x,y; int color;} p[10]; ram_setup(); backgrd("blue"); erase(); ram_move(0.,0.,"red",3); color_table("rgb",0,17,k,n); color_table("cmy",16,17,nn,r); color_table("cmy",32,17,r,g); color_table("cmy",48,17,g,b); color_table("cmy",64,17,b,r); color_table("cmy",80,17,r,nn); color_table("rgb",96,17,n,w); color_table("rgb",112,17,w,n); color_table("rgb",128,17,n,m); color_table("rgb",144,17,m,l); color_table("rgb",160,17,l,c); color_table("rgb",176,17,c,m); color_table("rgb",192,17,m,n); color_table("rgb",208,17,n,k); do { i=0; while (i==0) { i=ram_kb(); read_cursor(&ix,&iy,&st); } x= ix/XFACT; y= iy/YFACT; switch (i) { case 0220: if (npts>1) { if (npts==2) { p[npts].x=x; p[npts].y=y; p[npts++].color=(i-1)*16; } fill(npts,p); npts=0; } break; case 0227: on_light(1); while ((i<0200)||(i>0216)) i=ram_kb(); backgrd((i-0200)*16); off_light(1); erase(); break; case 0226: on_light(0); while ((i<0200)||(i>0215)) i=ram_kb(); foregrd((i-0200)*16); off_light(0); break; case 0222: npts=0; break; case 0223: draw(x,y); break; case 0224: ram_move(x,y); break; default: if ((i>=0200) && (i<0217)) { p[npts].x=x; p[npts].y=y; p[npts++].color=(i-0200)*16; } } } while( i!= 0233 ); } light(1); while ((i<0200)||(i>0216)) i=ram_kb(); backgrd((i-0200)*16); off_light(1); erase(); break; case 0226: on_light(0); while ((i<0200)||(i>0215)) i=ram_kb(); foregrd((i-0200)*16); off_light(0); break; case 0222: npts=0; break; case 0223: draw(x,y); break; case 0224: ram_move(x,y); break; default: if ((i>=0200) && (i<0217)) { p[npts].x=x; p[npt 3 0 4 8 4 4 8 8 5 8 0 3 3 0 13 2 6 12 2 0 3 2 0 3 3 6 12 2 6 6 2 0 3 2 0 3 3 0 13 2 6 13 2 6 3 2 0 3 2 ; backgrd((i-0200)*16); off_light(1); erase(); break; case 0226: on_light(0); while ((i<0200)||(i>0215)) i=ram_kb(); foregrd((i-0200)*16); off_light(0); break; case 0222: npts=0; break; case 0223: draw(x,y); break; case 0224: ram_move(x,y); break; default: if ((i>=0200) && (i<0217)) { p[npts].x=x; p[npt#include "ramtek.h" draw(x,y,newcolor,iwid) float x,y; { int n,ix,iy; extern int XNOW,YNOW,COLORNOW,IWIDTH; ix=x*XFACT; iy=511-y*YFACT; n=nargs(); if (n>8) { foregrd(newcolor); COLORNOW=newcolor; } if (n>9) IWIDTH=iwid; if (IWIDTH==3) { in_buf(07001); in_buf(36); in_buf(XNOW-1); in_buf(YNOW); in_buf(ix-1); in_buf(iy); in_buf(ix); in_buf(iy-1); in_buf(XNOW); in_buf(YNOW-1); in_buf(XNOW+1); in_buf(YNOW); in_buf(ix+1); in_buf(iy); in_buf(ix); in_buf(iy+1); in_buf(XNOW); in_buf(YNOW+1); in_buf(XNOW); in_buf(YNOW); flush_buf(0); } in_buf(07001); in_buf(4); in_buf(ix); in_buf(iy); flush_buf(); XNOW=ix; YNOW=iy; } newcolor); COLORNOW=newcolor; } if (n>9) IWIDTH=iwid; if (IWIDTH==3) { in_buf(07001); in_buf(36); in_buf(XNOW-1); in_buf(YNOW); in_buf(ix-1); in_buf(iy); in_buf(ix); in_buf(iy-1); in_buf(XNOW); in_buf(YNOW-1); in_buf(XNOW+1); in_buf(YNOW); in_buf(ix+1); in_buf(iy); in_buf(ix); in_buf(iy+1); #include "ramtek.h" line(x,y,np,inc,newcolor) float x[],y[]; { register int n,ix,iy; extern int COLORNOW,XNOW,YNOW; n=nargs(); if (n>4) { foregrd(newcolor); COLORNOW=newcolor; } in_buf(07003); in_buf(0100000); ix=x[0]*XFACT; iy=511-y[0]*YFACT; in_buf(ix); in_buf(iy); in_buf(4*np-4); for (n=inc;n 2 ) ram_move(ix , iy); in_buf(05401); in_buf(nw<<1); flush_buf(); ram_read(array , nw<<1); } ); COLORNOW=newcolor; } in_buf(07003); in_buf(0100000); ix=x[0]*XFACT; iy=511-y[0]*YFACT; in_buf(ix); in_buf(iy); in_buf(4*np-4); for (n=inc;n BUFSIZE-1 ) /* no more room */ flush_buf(DEBUG); /* send it and reset NWORDS to 0 */ BUFFER[NWORDS++] = word; } /* * send the entire buffer: * (eventually want to test whether it would be better to use FDRAM or FDRAM ) */ flush_buf(dump) int dump; /* 1 - print contents of buffer */ /* 0 (or no argument) - do not print contents of buffer */ { register int j; /* counter */ if( nargs() <= 0 ) dump=0; /* no args = no dump! */ if( NWORDS>0 ){ if( write(FDRAM,BUFFER,2*NWORDS)<0){ printf("Ramtek write error\7\n"); exit(1); } if( dump ) for(j=0; j0 ){ if( write(FDRAM,BUFFER,2*NWORDS)<0){ printf("Ramtek write error\7\n"); exit(1); } if( dump ) for(j=0; j 0){ /* wait */ if( (RMFLAGS[2]&WAITKB)==0 ){ RMFLAGS[2] =| WAITKB; stty( FDKB, RMFLAGS); } }else{ if( RMFLAGS[2]&WAITKB ){ RMFLAGS[2] =& ~WAITKB; stty( FDKB, RMFLAGS); } } read(FDKB , &input , 2); if( input&ND ) return(0); /* nothing hit */ return( input&0377 ); } kb() { int input; extern int FDKB; extern int RMFLAGS[3]; if( FDKB<=0 ) /* hasn't been opened yet */ if( (FDKB=open("/dev/rmkb",0)) < 0 ) { printf("Cannot open /dev/rmkb!\7"); exit(1); } if( nargs() > 0){ /* wait */ if( (RMFLAGS[2]&WAITKB)==0 ){ RMFLAGS[2] =| WAITKB; stty( FDKB, RMFLAGS); } }else{ if( RMFLAGS[2]&WAITKB ){ RMFLAGS[2] =& ~WAITKB; #include "ramtek.h" ram_move(x,y,newcolor,iwid) /*change current operating point and color */ float x,y; { int n; extern int COLORNOW,XNOW,YNOW,IWIDTH; XNOW=x*XFACT; YNOW=512-y*YFACT; n=nargs(); if (n>8) { foregrd(newcolor); COLORNOW=newcolor; } if (n>9) IWIDTH=iwid; in_buf(04002); /*set+operand flag */ in_buf(0100000); /* c o p change */ in_buf(XNOW); in_buf(YNOW); flush_buf(); } } }else{ if( RMFLAGS[2]&WAITKB ){ RMFLAGS[2] =& ~WAITKB; # #include "../ramtek.h" #define D2R 0.01745 char font[] { 022,024,004,000,040,044,024,022,022,024,014,003,001,010,030 , 041,043,034,024,022,022,024,000,040,024,022,022,024,020,022 , 002,042,022,022,004,040,022,044,000,022,022,024,002,020,042 , 024,022,022,002,024,042,022,024,020,022,022,004,044,022,000 , 022,040,022,022,044,004,070,040,000,022,022,004,022,044,022 , 020,022,022,044,033,013,004,013,011,000,011,031,040,031,033 , 022,022,004,040,022,044,000,022,024,020,022,002,042,022,022 , 004,044,000,040,022,022,024,020,022,040,003,043,000,024,040 , 002,042,024,020,024,020,011,031,020,020,024,033,013,024,000 , 040,070,002,042,070,004,044,002,042,033,031,042,003,013,014 , 004,003,070,000,044,070,040,041,031,030,040,002,044,006,070 , 001,041,000,024,040,001,041,070,003,043,070,034,010,011,031 , 070,022,024,023,033,013,020,010,001,003,014,024,033,031,020 , 013,024,020,010,030,014,034,032,012,010,030,014,034,012,032 , 030,010,014,012,042,032,034,030,034,014,012,032,030,010,027 , 024,070,022,012,011,012,022,015,017,070,027,025,010,026,070 , 036,020,070,002,042,070,044,004,002,011,031,042,043,004,005 , 016,036,045,070,020,027,026,016,015,025,026,070,047,000,070 , 021,031,032,022,021,040,015,016,027,036,035,002,001,010,020 , 042,027,024,020,011,016,027,020,031,036,027,021,025,023,003 , 043,023,001,045,023,005,041,021,025,023,003,043,031,021,022 , 032,031,020,003,043,031,021,022,032,031,000,047,037,017,006 , 001,010,030,041,046,037,070,022,030,010,020,027,016,005,006 , 017,037,046,044,002,000,040,006,017,037,046,045,034,014,034 , 043,041,030,010,001,007,003,043,033,030,037,002,001,010,030 , 041,043,034,004,007,047,001,003,014,034,043,041,030,010,001 , 006,017,037,046,006,007,047,046,020,001,003,014,005,006,017 , 037,046,045,034,014,034,043,041,030,010,001,046,044,033,013 , 004,006,017,037,046,041,030,010,001,025,024,034,035,025,070 , 031,021,022,032,031,025,024,034,035,025,070,031,021,022,032 , 031,020,042,004,046,004,044,070,001,041,002,044,006,006,006 , 017,037,046,045,034,024,023,070,022,012,011,021,022,031,021 , 012,013,024,034,031,041,045,036,016,005,001,010,040,000,003 , 043,003,006,017,037,046,040,000,007,037,046,045,034,004,034 , 043,041,030,000,041,030,010,001,006,017,037,046,000,007,037 , 046,041,030,000,047,007,004,034,004,000,040,047,007,004,034 , 004,000,023,043,041,030,010,001,006,017,037,046,045,007,000 , 004,044,040,047,030,010,020,027,017,037,002,001,010,030,041 , 047,007,000,003,025,047,070,025,040,040,000,007,000,007,023 , 047,040,000,007,040,047,025,047,037,017,006,001,010,030,041 , 046,037,000,007,037,046,045,034,004,037,017,006,001,010,030 , 041,046,037,070,022,040,000,000,007,037,046,045,034,004,024 , 040,002,001,010,030,041,043,034,014,005,006,017,037,046,020 , 027,007,047,007,002,001,010,030,041,047,007,006,020,046,047 , 007,000,024,040,047,000,047,070,007,040,007,023,020,023,047 , 007,047,000,040,070,014,044,040,000,007,047,007,040,007,047 , 040,000,006,027,046,000,040,000 }; int kct[] { 8,12, 6, 7, 7, 7, 8, 8, 7, 7,14,13, 6, 4, 6, 2, 2, 5, 5, 8, 5,14, 6, 3, 8, 8, 9, 5, 6, 6, 6, 6, 0, 8, 5,11,13,14,11, 2, 4, 4,11, 5, 6, 2, 5, 2, 11, 5, 9,13, 6,10,13, 5,17,13,11,12, 3, 5, 3,15, 15, 9,12, 8, 7, 7, 6,11, 6, 6, 6, 8, 3, 5, 4,11, 7,13, 9,13, 4, 7, 5, 5, 5, 5, 7, 4, 2, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int koc[] { 0, 8, 20, 26, 33, 40, 47, 55, 63, 70, 77, 91,104,110,114,120, 122,124,129,134,142,147,161,167,170,178,186,195,200,206,212,218, 224,224,232,237,248,261,275,286,288,292,296,307,312,318,320,325, 327,338,343,352,365,371,381,394,399,416,429,440,452,455,460,463, 478,493,502,514,522,529,536,542,553,559,565,571,579,582,587,591, 602,609,622,631,644,648,655,660,665,670,675,682,686,688,692,695, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; symbol(x1,y1,h,str,theta) float x1,y1,h,theta; char *str; { float th , si , co , x , y , fact , xa , ya , xt , yt; float xx , yy , xn , yn; double sin() , cos() , fabs(); int nc , ic , ii , ict , loc , iy; int nchar , ixn , iyn; register int i , i1 , itsub; if( (nc=count_char(str)) == 0) return; nchar = nc; th = theta*D2R; /* radians */ si = sin(th); co = cos(th); x=x1; y=y1; if( nc>=1 ) goto L50; fact=h/4.0; x=x-2.0*fact*(co-si); y=y-2.0*fact*(co+si); nc=1; if( nchar >= -1 ) goto L60; ic=2; goto L70; L50: fact=h/7.0; L60: ic=3; L70: xa=fact*co; ya=fact*si; xt=xa*6.0; yt=ya*6.0; for(i1=0; i1>3) & 07; if( xx==7.0 ) { ic=3; continue; } yy = iy & 07; xn = x + xa*xx - ya*yy; yn = y + ya*xx + xa*yy; plot(xn,yn,ic); ic=2; } x=+ xt; y=+ yt; ic=3; } } /* * count the # of chars in a string: */ count_char(str) char *str; { register char *rcp; rcp = str; while(*rcp != 0) rcp++; return(rcp-str); } */ itsub=+ ('A'-'a'); if( (ict=kct[itsub]) == 0) break; loc = koc[itsub]; for(i=0;i>3) & 07; if( xx==7.0 ) { ic=3; continue; } yy = iy & 07; xn = x + xa*xx - ya*yy; yn = y + ya*xx + xa*yy; plot(xn,yn,ic); ic=2; } x=+ xt; y=+ yt; ic=3; } } /* * count the # of chars in a string: */ co#include "/user/ramtek/ramtek.h" #define DEBUG 0 #define BLACK 00000 #define RED 07400 #define BLUE 00017 #define GREEN 00360 #define CYAN 00377 #define MAGENTA 07417 #define YELLOW 07760 #define WHITE 07777 #define BLACK_INDEX 248 #define RED_INDEX 249 #define BLUE_INDEX 250 #define GREEN_INDEX 251 #define CYAN_INDEX 252 #define MAGENTA_INDEX 253 #define YELLOW_INDEX 254 #define WHITE_INDEX 255 /* * * ****** foregrd ****** * * purpose: sets the foreground color for suceeding commands. * * calling sequence: foregrd(color) * * where color can be a nnamed color or an index * to the color look up table. named colors * include: * "black" "blue" "red" "green" "cyan" * "magenta" "yellow" "white" * */ foregrd(color) char *color; /* color name if color > 255 */ /* color index if 0<= color <= 255 */ { int index; /* entry in color look up table*/ int strcmp();/* string cmparison function */ /* 0 - no match */ /* 1 - match */ extern int COLORNOW; /* current color index setting */ /* check for legal index or name and if name */ /* convert to an index */ index = color_name(color); COLORNOW = index; in_buf(SET | OF); /* form command word */ in_buf(FOREGROUND); /* set operand flag word */ in_buf(index); /* set foreground color index */ flush_buf(DEBUG); /* flush buffer */ } /* * * determine if two strings are equal * */ strcmp(s,t) char *s, *t; /* strings to be compared */ { int i; /* index used in comparison */ for (; *s == *t; s++, t++) if (*s == '\0' )return(1); return(0); } /* * ***** table_init() ***** * * * purpose: load named colors into the color look table starting at * location BLACK_INDEX and set initial * background color to black and * foreground to red. * * */ table_init() { int word; /* variable used to form instructions */ in_buf(LAM); /* send opcode */ in_buf(BLACK_INDEX); /* set starting address where named entries are to be stored */ in_buf(020); /* set number of entries to be loaded */ in_buf(BLACK); /* send entries to ramtek */ in_buf(RED); in_buf(BLUE); in_buf(GREEN); in_buf(CYAN); in_buf(MAGENTA); in_buf(YELLOW); in_buf(WHITE); flush_buf(DEBUG); foregrd("red"); backgrd("black"); erase(); } /* * * ****** backgrd ****** * * purpose: sets background color for suceeding commands. * * calling sequence: backgrd(color) * * where color can be a named color or an index * to the color look up table. named colors * include: * "black" "blue" "red" "green" "cyan" * "magenta" "yellow" "white" * */ backgrd(color) char *color; /* color name if color > 255 */ /* color index if 0<= color <= 255 */ { int index; /* color index */ int word; /* used for forming instructions for the ramtek */ /* check for legal index or name and convert to index */ index = color_name(color); in_buf(SET | OF); /* send command word */ in_buf(BACKGROUND); /* send operand flag word */ in_buf(index); /* send new background color index */ flush_buf(DEBUG); /* flush buffer */ } /* * * ****** erase() ****** * * purpose: writes the current background color into refresh memory. * * calling sequence: erase() * */ erase() { in_buf(ERASE); flush_buf(DEBUG); } /* * * This routine checks for legal color index or name and if * name, it is converted to an index. * */ color_name(color) char *color; { int index; if(color > 255) /* determine if specified by name or index */ { if (strcmp(color,"black"))index = BLACK_INDEX; else if (strcmp(color,"red"))index = RED_INDEX; else if (strcmp(color,"blue")) index = BLUE_INDEX; else if (strcmp(color,"green")) index = GREEN_INDEX; else if (strcmp(color,"cyan")) index = CYAN_INDEX; else if (strcmp(color,"magenta"))index = MAGENTA_INDEX; else if (strcmp(color,"yellow")) index = YELLOW_INDEX; else if(strcmp(color,"white"))index = WHITE_INDEX; else { printf(" %s is an illegal color \7",color); exit(); } } else if (color >= 0)index = color; else { printf(" %d is an illegal color index \7",color); exit(); } return(index); } TA_INDEX; else if (strcmp(color,"yellow")) index = YELLOW_INDEX; else if(strcmp(color,"white"))index = WHITE_INDEX; else { printf(" %s is an illegal color \7",color); exit(); } } else if (color >= 0)index = color; else # /* * routines to write to and read from the ramtek cursor: */ #include "ramtek.h" move_cursor(x,y) { int v[3]; extern int FDKB; if( FDKB <= 0 ) if( (FDKB=open("/dev/rmkb",2)) < 0 ) { printf("Cannot open /dev/rmkb!\7"); exit(1); } v[0] = x; v[1] = 511-y; v[2] = SETCUR; stty(FDKB , v); } /* * read ramtek cursor: if 4 args, wait for ENTER . */ read_cursor(xp , yp , sp) int *xp , *yp , *sp; { int v[3]; extern int FDKB; extern int RMFLAGS[3]; if( FDKB <= 0 ) if( (FDKB=open("/dev/rmkb",2)) < 0 ) { printf("Cannot open /dev/rmkb!\7"); exit(1); } if( nargs() > 3 ){ if( (RMFLAGS[2] & WAITEN) == 0){ RMFLAGS[2] =| WAITEN; stty( FDKB, RMFLAGS); } }else{ if( RMFLAGS[2] & WAITEN ){ RMFLAGS[2] =& ~WAITEN; stty( FDKB, RMFLAGS); } } gtty(FDKB , v); *xp = v[0] &0777; *yp = 511 - (v[1]& 0777); *sp = (v[1]>>9) & 0177; } read_cursor(xp , yp , sp) int *xp , *yp , *sp; { int v[3]; extern int FDKB; extern int RMFLAGS[3]; if( FDKB <= 0 ) if( (FDKB=open("/#include "/user/ramtek/ramtek.h" #define DEBUG 0 #define RGB 0 #define CMY 1 #define HCI 2 #define GRAY 3 #define GREY 3 /* so don't have to fart with correct spelling (if there is one) */ #define NUM_LEVELS 16 #define PI 3.14159 /* * * ****** color_table ******* * * purpose: loads color look-up table. * * calling sequence: color_table(color_space,start_loc,number,comp1,comp2) * * where: * color_space is one of the following * "rgb" - red,green,blue color space * "cmy" - cyan,magenta,yellow color space * "hci" - hue,saturation,lightness color space "gray" or "grey" - gray scale (last 2 components of comp1,comp2 ignored) * * start_loc is the entry in the color table to be * loaded first. (0 TABLE_SIZE) { printf("starting location not in color table \7"); exit(); } if(start_loc + number > TABLE_SIZE) { printf("color table size exceeded \7"); exit(); } if (number <= 0) { printf("illegal number of color table entries\7"); exit(); } for (i=0;i <=2; i++) { if( space==GRAY && i>0 ) break; /* only test first */ if(*pt1 < 0.0 || *pt1 > 1.0 ) { printf("color component out of range \7"); exit(); } if(number > 1) { if(*pt2 < 0.0 || *pt2 > 1.0) { printf("color component out of range \7"); exit(); } delta[i] = ( *pt2 - *pt1 )/(number - 1); /* compute change per entry */ } pt1++; pt2++; } in_buf(LAM); /* send instruction, starting location and number to device */ in_buf(start_loc); in_buf(2*number); pt1 = comp1; pt2 = comp2; comp[0] = *pt1; comp[1] = *(pt1 + 1); comp[2] = *(pt1 + 2); for(i=start_loc;i<(start_loc+number);i++) { switch(space) { case RGB: in_buf(rgb_cvt(comp)); break; case CMY: in_buf(cmy_cvt(comp)); break; case HCI: in_buf(hci_cvt(comp)); break; case GRAY: in_buf( gray_cvt(comp) ); break; } for(j=0;j<=2;j++)comp[j] = comp[j] + delta[j]; } flush_buf(DEBUG); } /* * * convert red blue green values 0-1 into values between * 1-16 and form data word * */ rgb_cvt(comp) float *comp; { int red,blue,green; register float *pt; /* pointer to incoming color vector */ pt = comp; /* pt is now an array base */ red = *pt * (NUM_LEVELS - 1) + 0.5; green = *(pt + 1) * (NUM_LEVELS - 1) + 0.5; blue = *(pt + 2) * (NUM_LEVELS - 1) + 0.5; return( 0 | blue | (green<<4) | (red<<8)); } /* * * transform cyan magenta yellow into red blue green * */ cmy_cvt(comp) float *comp; { int i; /* counter */ float newcomp[3]; /* transformed color vector */ register float *p; /* incoming color vector base */ p = comp; /* set pointer to first element */ for(i = 0;i <= 2;i++) { newcomp[i] = 1. - *p; p++; } return(rgb_cvt(newcomp)); } /* * * transform hue chroma intensity into red blue green * */ hci_cvt(comp) float *comp; { float newcomp[3]; /* transformed hci */ register int i,j; /* counters */ register float *ptr; /* color vector pointer */ float ang; /* temporary variable */ float cos(); /* determine rgb corresponding to hue */ ptr = comp; if(*ptr < 0.1666667 || *ptr > 0.833333)newcomp[0] = 1.0; else if(*ptr < 0.333333) newcomp[0] = 2.0 -6.0 * *ptr; else if( *ptr < 0.666667) newcomp[0] = 0.0; else newcomp[0] = 6.0 * *ptr - 4.; if(*ptr < 0.166667) newcomp[1] = 6.0 * *ptr; else if(*ptr < 0.5) newcomp[1] = 1.0; else if(*ptr < 0.666667) newcomp[1] = 4.0 - 6.0 **ptr; else newcomp[1] = 0.0; if(*ptr < 0.33333) newcomp[2] = 0.0; else if(*ptr < 0.5) newcomp[2] = 6.0 * *ptr - 2.0; else if(*ptr < 0.833333) newcomp[2] = 1.0; else newcomp[2] = 6.0 - 6.0 * *ptr; /* adjust new components to smooth discontinuities */ for(i = 0; i <= 2; i++) { ang = (1.0 - newcomp[i]) * PI; newcomp[i] = (1.0 + cos(ang))/2.0; } /* adjust new components for chroma and intensity */ for (i = 0; i <= 2;i++) { if (*(ptr + 2) < 0.5 ) { newcomp[i] = (0.5 + *(ptr + 1) * ( newcomp[i] - 0.5)) * 2.0 * *(ptr + 2); } else { newcomp[i] = 0.5 + *(ptr + 1) * (newcomp[i] - 0.5) + (0.5 - *(ptr + 1) * ( newcomp[i] - 0.5)) * (-1.0 + 2.0 * *(ptr + 2)); } } return(rgb_cvt(newcomp)); } /* * grey scale: */ gray_cvt(comp) float *comp; { register int j; j = 255.*(*comp) + 0.5; /* simply convert to an integer */ j=& 0377; /* be sure is in the range 0-255 */ return(j); } i = 0; i <= 2;i++) { if (*(ptr + 2) < 0.5 ) { newcomp[i] = (0.5 + *(ptr + 1) * ( newcomp[i] - 0.5)) * 2.0 * *(ptr + 2); } else { newcomp[i] = 0.5 + *(ptr + 1) * (newcomp[i] - 0.5) + # #include "ramtek.h" #define WI 05000 /* write-image */ /* * perform a scan-line color fill of a polygon: * * calling sequence: * fill(n,p) * int n; * struct { * float x , y; * int color; * } p[]; * * * last point will be joined with the first point. * */ #define MAX 30 /* max expected edges */ struct { /* structure containing one scan-line of info */ int scanx; /* x position */ float color; int flag; /* 0=normal , >0=first of horizontal pair , <0=second of horizontal pair */ int next; /* array index of next point to the right (-1=end-of-list) */ } scanbuf[MAX] , dummy; struct vert { int x , y; int col; } ppt[MAX]; fill(nn , p) int nn; char *p; { struct { float fx , fy; int kolor; } *pts; register struct vert *pt; register int j , n; int maxy , miny , y , ib , jp1 , jp2; int i , k , l , jj , maxcol , mincol , n_pixels; float ratio , delta , dcolor , color; pt = &ppt[0]; n = nn; pts = p; /* * scan the data for maxy and miny and convert the LL user system to the UL ramtek system: */ maxy = maxcol = -1; miny=513; mincol = 2048; for(j=0;j 511 ) pt[j].y = 511; if( pt[j].y < 0 ) pt[j].y = 0; if( pt[j].y > maxy ) maxy = pt[j].y; if( pt[j].y < miny ) miny = pt[j].y; if( pt[j].col > maxcol ) maxcol = pt[j].col; if( pt[j].col < mincol ) mincol = pt[j].col; } /* * start the scan lines from the top to the bottom and from left to right: */ for(y=miny; y<=maxy; y++) { ib=0; /* scanbuf counter */ for(j=0;j 0 ) continue; /* scan line does not cross this vector */ if( pt[j].y==y && pt[jp1].y==y ) { /* horizontal! */ scanbuf[ib].scanx = pt[j].x; scanbuf[ib].color = pt[j].col; scanbuf[ib].flag = ib+1; scanbuf[ib].next = -1; scanbuf[++ib].scanx = pt[jp1].x; scanbuf[ib].color = pt[jp1].col; scanbuf[ib].flag = -1; scanbuf[ib].next = -1; ib++; continue; } if( pt[jp1].y==y ) { /* check for a singularity at pt[jp1] */ jp2 = j+2; if( j>=n-2 ) jp2=- n; if( (pt[j].y-pt[jp1].y) * (pt[jp2].y-pt[jp1].y) <= 0 ) continue; } /* otherwise, determine the intersection of the line (pt[j]-pt[jp1]) and the scan */ ratio = y - pt[j].y; ratio=/ (pt[jp1].y - pt[j].y); scanbuf[ib].scanx = pt[j].x + (pt[jp1].x-pt[j].x)*ratio; scanbuf[ib].color = pt[j].col + (pt[jp1].col-pt[j].col)*ratio; scanbuf[ib].flag = 0; scanbuf[ib++].next = -1; } /* j */ /* * now sort the scan line intersections: */ if( ib==0 ) continue; /* insurance */ j = sort( 0 , ib-1 ); /* j is the index of the first pt */ for(; j>=0; j=scanbuf[j].next) { if( scanbuf[j].next== -1 ) break; /* something out-of-wack! */ cop( scanbuf[j].scanx , y); /* start span */ if( (i=scanbuf[j].flag) == 0) { /* normal */ i = scanbuf[j].next; n_pixels = scanbuf[i].scanx - scanbuf[j].scanx + 1; delta = scanbuf[i].color - scanbuf[j].color; if( delta==0.0 ) { write_image(n_pixels , (jj=scanbuf[i].color) ); } else { dcolor = delta / n_pixels; color = scanbuf[j].color; in_buf(WI|DF); /* write image + data flag */ in_buf(n_pixels<<1); /* # bytes */ for(k=0; k=u ) return(l); /* same pt! */ return( merge( sort(l,mid) , sort(mid+1,u) ) ); } merge(ii,jj) { register int i , j; register char *last; i=ii; j=jj; last = &dummy; while( i>=0 && j>=0 ) { if( scanbuf[i].flag < 0 ) { /* ignore this pt */ i = scanbuf[i].next; continue; } if( scanbuf[j].flag<0 ) { j = scanbuf[j].next; continue; } if( scanbuf[i].scanx <= scanbuf[j].scanx ) { last->next = i; last = &scanbuf[i]; i = last->next; } else { last->next = j; last = &scanbuf[j]; j = last->next; } } /* * fill out remaining list: */ if( i >= 0 ) last->next = i; else last->next = j; return( dummy.next ); } cop(x,y) { in_buf(04000|OF); in_buf(START_POINT); in_buf(x); in_buf(y); flush_buf(); } i = scanbuf[i].next; continue; } if( scanbuf[j].flag<0 ) { j = scanbuf[j].next; continue; } if( scanbuf[i].scanx <= scanbuf[j].scanx ) { last->next = i; last = &scanbuf[i]; i = last->next; } else { last->next = j; last = &scanbuf[j];# #define MAX 30 /* assumed max # of points */ #include "ramtek.h" /* * fill a polygon: * * * polygon(x1,y1,color1 , x2,y2,color2 , ...); * (where xi,yi are floats and colori is an integer) * * * last point will be joined to the first point. */ polygon( arg1 ) { register int n; register struct { double xd , yd; int col; } *parg; struct vert { float x , y; int color; } p[MAX]; register struct vert *pt; int j; if( (n=nargs()) <= 8 ) return; n=/ 9; if( n > MAX ) { printf("\n need to increase MAX in polygon.c and fill.c!\7\n"); exit(1); } parg = &arg1; pt = &p[0]; for(j=0;jx = parg->xd; pt->y = parg->yd; pt->color = parg->col; pt++; parg++; } fill(n , &p[0]); } joined to the first point. */ polygon( arg1 ) { register int n; register struct { double xd , yd; int col; } *parg; struct vert { float x , y; int color; } p[MAX]; register struct vert *pt; int j; if( (n=nargs()) <= 8 ) return; n=/ 9; if( n > MAX ) { print# #include "../ramtek.h" #define SET 04000 window(xl,yb,xr,yt) float xl , yb , xr , yt; { register int x , y; in_buf(SET|OF); /* operand */ in_buf(WINDOW); x = XFACT*xl + 0.5; x=& 0777; /* limit to 0-511 */ in_buf(x); y = YFACT*yt + 0.5; y=& 0777; in_buf(511-y); x = XFACT*xr + 0.5; x=& 0777; in_buf(x); y = YFACT*yb + 0.5; y=& 0777; in_buf(511-y); flush_buf(); } nt color; } p[MAX]; register struct vert *pt; int j; if( (n=nargs()) <= 8 ) return; n=/ 9; if( n > MAX ) { print#include "ramtek.h" #define COLOR 1 /* use color #0 */ write_image(nn , col) { register int j , n , color; n=nn; color = col; in_buf(05000|DF); in_buf( n<<1 ); /* # bytes */ for(j=0;j MAX ) { print#include "ramtek.h" /* * turn one of the console lights on or off: * * (tricky! they are labelled from R-L but accessed L-R) * */ on_light(i) int i; /* i corresponds to number printed on the console */ { register int ri; ri=i; ri=& 07; /* range = 0-7 */ ri = 7 - ri; /* now i corresponds to LEFT-RIGHT order */ in_buf(014000); in_buf(0300|ri); flush_buf(); } off_light(i) int i; { register int ri; ri=i; ri=& 07; ri = 7 - ri; in_buf(014000); in_buf(0200|ri); flush_buf(); } print#include "ramtek.h" text(string,txtmod,x,y) char string[]; int txtmod; float x,y; { extern int XNOW,YNOW; int WT,i,j,n,ix,iy,buf[30]; char *c,*k; WT= 06013; /* WT|RP|OF|DF */ k= &buf[0]; k--; /* change to caps */ for (c= &string[0]; (*(++k) = *c) != '\0';c++) if ((*k>='a') && (*k<='z')) *k=+ 'A'-'a'; i= c- &string[0]; if ((n=nargs())>1) { /* AP or BK flags */ if ((txtmod>0) && (txtmod<4)) WT=| (txtmod<<4); } /* change style of output */ if (n>4) { ix= XFACT*x; iy= 502-YFACT*y; YNOW= iy+9; } else { ix= XNOW; iy= YNOW-9; } XNOW= ix+7*i; in_buf(WT); in_buf(START_POINT); in_buf(ix); in_buf(iy); n= (i+1)/2; in_buf(i); for (j=0;j1) { /* AP or BK flags */ if ((txtmod>0) && (txtmod<4)) WT=| (txtmod<<4); } /* change style of output */ if (n>4) { ix= XFACT*x; iy= 502-YFACT*y; YNOW= iecho $1 cp $1 ./c/$1 XNOW; iy= YNOW-9; } XNOW= ix+7*i; in_buf(WT); in_buf(START_POINT); in_buf(ix); in_buf(iy); n= (i+1)/2; in_buf(i); for (j=0;j1) { /* AP or BK flags */ if ((txtmod>0) && (txtmod<4)) WT=| (txtmod<<4); } /* change style of output */ if (n>4) { ix= XFACT*x; iy= 502-YFACT*y; YNOW= i#include "ramtek.h" draw(x,y,newcolor,iwid) float x,y; { int n,ix,iy; extern int XNOW,YNOW,COLORNOW,IWIDTH; ix=x*XFACT; iy=511-y*YFACT; n=nargs(); if (n>8) { foregrd(newcolor); COLORNOW=newcolor; } if (n>9) IWIDTH=iwid; if (IWIDTH==3) { in_buf(07001); in_buf(36); in_buf(XNOW-1); in_buf(YNOW); in_buf(ix-1); in_buf(iy); in_buf(ix); in_buf(iy-1); in_buf(XNOW); in_buf(YNOW-1); in_buf(XNOW+1); in_buf(YNOW); in_buf(ix+1); in_buf(iy); in_buf(ix); in_buf(iy+1); in_buf(XNOW); in_buf(YNOW+1); in_buf(XNOW); in_buf(YNOW); flush_buf(0); } in_buf(07001); in_buf(4); in_buf(ix); in_buf(iy); flush_buf(); XNOW=ix; YNOW=iy; } newcolor); COLORNOW=newcolor; } if (n>9) IWIDTH=iwid; if (IWIDTH==3) { in_buf(07001); in_buf(36); in_buf(XNOW-1); in_buf(YNOW); in_buf(ix-1); in_buf(iy); in_buf(ix); in_buf(iy-1); in_buf(XNOW); in_buf(YNOW-1); in_buf(XNOW+1); in_buf(YNOW); in_buf(ix+1); in_buf(iy); in_buf(ix); in_buf(iy+1); #include "/user/ramtek/ramtek.h" #define DEBUG 0 #define RGB 0 #define CMY 1 #define HCI 2 #define GRAY 3 #define GREY 3 /* so don't have to fart with correct spelling (if there is one) */ #define NUM_LEVELS 16 #define PI 3.14159 /* * * ****** color_table ******* * * purpose: loads color look-up table. * * calling sequence: color_table(color_space,start_loc,number,comp1,comp2) * * where: * color_space is one of the following * "rgb" - red,green,blue color space * "cmy" - cyan,magenta,yellow color space * "hci" - hue,saturation,lightness color space "gray" or "grey" - gray scale (last 2 components of comp1,comp2 ignored) * * start_loc is the entry in the color table to be * loaded first. (0 TABLE_SIZE) { printf("starting location not in color table \7"); exit(); } if(start_loc + number > TABLE_SIZE) { printf("color table size exceeded \7"); exit(); } if (number <= 0) { printf("illegal number of color table entries\7"); exit(); } for (i=0;i <=2; i++) { if( space==GRAY && i>0 ) break; /* only test first */ if(*pt1 < 0.0 || *pt1 > 1.0 ) { printf("color component out of range \7"); exit(); } if(number > 1) { if(*pt2 < 0.0 || *pt2 > 1.0) { printf("color component out of range \7"); exit(); } delta[i] = ( *pt2 - *pt1 )/(number - 1); /* compute change per entry */ } pt1++; pt2++; } in_buf(LAM); /* send instruction, starting location and number to device */ in_buf(start_loc); in_buf(2*number); pt1 = comp1; pt2 = comp2; comp[0] = *pt1; comp[1] = *(pt1 + 1); comp[2] = *(pt1 + 2); for(i=start_loc;i<(start_loc+number);i++) { switch(space) { case RGB: in_buf(rgb_cvt(comp)); break; case CMY: in_buf(cmy_cvt(comp)); break; case HCI: in_buf(hci_cvt(comp)); break; case GRAY: in_buf( gray_cvt(comp) ); break; } for(j=0;j<=2;j++)comp[j] = comp[j] + delta[j]; } flush_buf(DEBUG); } /* * * convert red blue green values 0-1 into values between * 1-16 and form data word * */ rgb_cvt(comp) float *comp; { int red,blue,green; register float *pt; /* pointer to incoming color vector */ pt = comp; /* pt is now an array base */ red = *pt * (NUM_LEVELS - 1) + 0.5; green = *(pt + 1) * (NUM_LEVELS - 1) + 0.5; blue = *(pt + 2) * (NUM_LEVELS - 1) + 0.5; printf("%d %d %d \n",red,green,blue); if(DEBUG) { pt = comp; printf("rgb1 %f %f %f \n",*pt,*(pt+1),*(pt+2)); printf("rgb2 %d %d %d\n",red,green,blue); } return( 0 | blue | (green<<4) | (red<<8)); } /* * * transform cyan magenta yellow into red blue green * */ cmy_cvt(comp) float *comp; { int i; /* counter */ float newcomp[3]; /* transformed color vector */ register float *p; /* incoming color vector base */ p = comp; /* set pointer to first element */ for(i = 0;i <= 2;i++) { newcomp[i] = 1. - *p; p++; } return(rgb_cvt(newcomp)); } /* * * transform hue chroma intensity into red blue green * */ hci_cvt(comp) float *comp; { float newcomp[3]; /* transformed hci */ register int i,j; /* counters */ register float *ptr; /* color vector pointer */ float ang; /* temporary variable */ double cos(); /* determine rgb corresponding to hue */ ptr = comp; if(*ptr < 0.1666667 || *ptr > 0.833333)newcomp[0] = 1.0; else if(*ptr < 0.333333) newcomp[0] = 2.0 -6.0 * *ptr; else if( *ptr < 0.666667) newcomp[0] = 0.0; else newcomp[0] = 6.0 * *ptr - 4.; if(*ptr < 0.166667) newcomp[1] = 6.0 * *ptr; else if(*ptr < 0.5) newcomp[1] = 1.0; else if(*ptr < 0.666667) newcomp[1] = 4.0 - 6.0 **ptr; else newcomp[1] = 0.0; if(*ptr < 0.33333) newcomp[2] = 0.0; else if(*ptr < 0.5) newcomp[2] = 6.0 * *ptr - 2.0; else if(*ptr < 0.833333) newcomp[2] = 1.0; else newcomp[2] = 6.0 - 6.0 * *ptr; /* adjust new components to smooth discontinuities */ /* for(i = 0; i <= 2; i++) { ang = (1.0 - newcomp[i]) * PI; newcomp[i] = (1.0 + cos(ang))/2.0; } */ /* adjust new components for chroma and intensity */ for (i = 0; i <= 2;i++) { if(*(ptr + 2) < 0.5 ) newcomp[i] = (0.5 + *(ptr + 1) * ( newcomp[i] - 0.5)) * 2.0 * *(ptr + 2); else newcomp[i] = 0.5 + *(ptr + 1) * (newcomp[i] - 0.5) + (0.5 - *(ptr + 1) * ( newcomp[i] - 0.5)) * (-1.0 + 2.0 * *(ptr + 2)); } return(rgb_cvt(newcomp)); } /* * grey scale: */ gray_cvt(comp) float *comp; { register int j; j = 255.*(*comp) + 0.5; /* simply convert to an integer */ j=& 0377; /* be sure is in the range 0-255 */ return(j); } <# #include "ramtek.h" #define WI 05000 /* write-image */ /* * perform a scan-line color fill of a polygon: * * calling sequence: * fill(n,p) * int n; * struct { * float x , y; * int color; * } p[]; * * * last point will be joined with the first point. * */ #define MAX 30 /* max expected edges */ struct { /* structure containing one scan-line of info */ int scanx; /* x position */ float color; int flag; /* 0=normal , >0=first of horizontal pair , <0=second of horizontal pair */ int next; /* array index of next point to the right (-1=end-of-list) */ } scanbuf[MAX] , dummy; struct vert { int x , y; int col; } ppt[MAX]; fill(nn , p) int nn; char *p; { struct { float fx , fy; int kolor; } *pts; register struct vert *pt; register int j , n; int maxy , miny , y , ib , jp1 , jp2; int i , k , l , jj , maxcol , mincol , n_pixels; float ratio , delta , dcolor , color; pt = &ppt[0]; n = nn; pts = p; /* * scan the data for maxy and miny and convert the LL user system to the UL ramtek system: */ maxy = maxcol = -1; miny=513; mincol = 2048; for(j=0;j 511 ) pt[j].y = 511; if( pt[j].y < 0 ) pt[j].y = 0; if( pt[j].y > maxy ) maxy = pt[j].y; if( pt[j].y < miny ) miny = pt[j].y; if( pt[j].col > maxcol ) maxcol = pt[j].col; if( pt[j].col < mincol ) mincol = pt[j].col; } /* * start the scan lines from the top to the bottom and from left to right: */ for(y=miny; y<=maxy; y++) { ib=0; /* scanbuf counter */ for(j=0;j 0 ) continue; /* scan line does not cross this vector */ if( pt[j].y==y && pt[jp1].y==y ) { /* horizontal! */ scanbuf[ib].scanx = pt[j].x; scanbuf[ib].color = pt[j].col; scanbuf[ib].flag = ib+1; scanbuf[ib].next = -1; scanbuf[++ib].scanx = pt[jp1].x; scanbuf[ib].color = pt[jp1].col; scanbuf[ib].flag = -1; scanbuf[ib].next = -1; ib++; continue; } if( pt[jp1].y==y ) { /* check for a singularity at pt[jp1] */ jp2 = j+2; if( j>=n-2 ) jp2=- n; if( (pt[j].y-pt[jp1].y) * (pt[jp2].y-pt[jp1].y) <= 0 ) continue; } /* otherwise, determine the intersection of the line (pt[j]-pt[jp1]) and the scan */ ratio = y - pt[j].y; ratio=/ (pt[jp1].y - pt[j].y); scanbuf[ib].scanx = pt[j].x + (pt[jp1].x-pt[j].x)*ratio; scanbuf[ib].color = pt[j].col + (pt[jp1].col-pt[j].col)*ratio; scanbuf[ib].flag = 0; scanbuf[ib++].next = -1; } /* j */ /* * now sort the scan line intersections: */ if( ib==0 ) continue; /* insurance */ j = sort( 0 , ib-1 ); /* j is the index of the first pt */ for(; j>=0; j=scanbuf[j].next) { if( scanbuf[j].next== -1 ) break; /* something out-of-wack! */ cop( scanbuf[j].scanx , y); /* start span */ if( (i=scanbuf[j].flag) == 0) { /* normal */ i = scanbuf[j].next; n_pixels = scanbuf[i].scanx - scanbuf[j].scanx + 1; delta = scanbuf[i].color - scanbuf[j].color; if( delta==0.0 ) { write_image(n_pixels , (jj=scanbuf[i].color) ); } else { dcolor = delta / n_pixels; color = scanbuf[j].color; in_buf(WI|DF); /* write image + data flag */ in_buf(n_pixels<<1); /* # bytes */ for(k=0; k=u ) return(l); /* same pt! */ return( merge( sort(l,mid) , sort(mid+1,u) ) ); } merge(ii,jj) { register int i , j; register char *last; i=ii; j=jj; last = &dummy; while( i>=0 && j>=0 ) { if( scanbuf[i].flag < 0 ) { /* ignore this pt */ i = scanbuf[i].next; continue; } if( scanbuf[j].flag<0 ) { j = scanbuf[j].next; continue; } if( scanbuf[i].scanx <= scanbuf[j].scanx ) { last->next = i; last = &scanbuf[i]; i = last->next; } else { last->next = j; last = &scanbuf[j]; j = last->next; } } /* * fill out remaining list: */ if( i >= 0 ) last->next = i; else last->next = j; return( dummy.next ); } cop(x,y) { in_buf(04000|OF); in_buf(START_POINT); in_buf(x); in_buf(y); flush_buf(); } i = scanbuf[i].next; continue; } if( scanbuf[j].flag<0 ) { j = scanbuf[j].next; continue; } if( scanbuf[i].scanx <= scanbuf[j].scanx ) { last->next = i; last = &scanbuf[i]; i = last->next; } else { last->next = j; last = &scanbuf[j];#include "ramtek.h" /* * turn one of the console lights on or off: * * (tricky! they are labelled from R-L but accessed L-R) * */ on_light(i) int i; /* i corresponds to number printed on the console */ { register int ri; ri=i; ri=& 07; /* range = 0-7 */ ri = 7 - ri; /* now i corresponds to LEFT-RIGHT order */ in_buf(014000); in_buf(0300|ri); flush_buf(); } off_light(i) int i; { register int ri; ri=i; ri=& 07; ri = 7 - ri; in_buf(014000); in_buf(0200|ri); flush_buf(); } buf[j];# #include "/user/ramtek/ramtek.h" #define WI 05000 /* write-image */ /* * perform a scan-line color fill of a polygon: * * calling sequence: * fill2(n,p,width) * int n; * struct { * int x , y , color#; * } p[]; * * * last point will be joined with the first point. * */ #define MAXSCAN 20 /* max expected intersections per scan line */ struct { /* structure containing one scan-line of info */ int scanx; /* x position */ float color; int flag; /* 0=normal , >0=first of horizontal pair , <0=second of horizontal pair */ int next; /* array index of next point to the right (-1=end-of-list) */ } scanbuf[MAXSCAN] , dummy; fill2(nn , p , width) int nn , width; char *p; { register struct { int x , y , col; /* form the argument list is in */ } *pt; register int j , n; int maxy , miny , y , ib , jp1 , jp2; int i , k , l , jj , maxcol , mincol , n_pixels; float ratio , delta , dcolor , color , rnd; n = nn; pt = p; /* * scan the data for maxy and miny and convert the LL user system to the UL ramtek system: */ maxy = maxcol = -1; miny=513; mincol = 2048; for(j=0;j 512 ) pt[j].y = 512; if( pt[j].y < 0 ) pt[j].y = 0; if( pt[j].y > maxy ) maxy = pt[j].y; if( pt[j].y < miny ) miny = pt[j].y; if( pt[j].col > maxcol ) maxcol = pt[j].col; if( pt[j].col < mincol ) mincol = pt[j].col; } /* * start the scan lines from the top to the bottom and from left to right: */ for(y=miny; y<=maxy; y++) { ib=0; /* scanbuf counter */ for(j=0;j 0 ) continue; /* scan line does not cross this vector */ if( pt[j].y==y && pt[jp1].y==y ) { /* horizontal! */ scanbuf[ib].scanx = pt[j].x; scanbuf[ib].color = pt[j].col; scanbuf[ib].flag = ib+1; scanbuf[ib].next = -1; scanbuf[++ib].scanx = pt[jp1].x; scanbuf[ib].color = pt[jp1].col; scanbuf[ib].flag = -1; scanbuf[ib].next = -1; ib++; continue; } if( pt[jp1].y==y ) { /* check for a singularity at pt[jp1] */ jp2 = j+2; if( j>=n-2 ) jp2=- n; if( (pt[j].y-pt[jp1].y) * (pt[jp2].y-pt[jp1].y) <= 0 ) continue; } /* otherwise, determine the intersection of the line (pt[j]-pt[jp1]) and the scan */ ratio = y - pt[j].y; ratio=/ (pt[jp1].y - pt[j].y); scanbuf[ib].scanx = pt[j].x + (pt[jp1].x-pt[j].x)*ratio; scanbuf[ib].color = pt[j].col + (pt[jp1].col-pt[j].col)*ratio; scanbuf[ib].flag = 0; scanbuf[ib++].next = -1; } /* j */ /* * now sort the scan line intersections: */ if( ib==0 ) continue; /* insurance */ j = sort( 0 , ib-1 ); /* j is the index of the first pt */ for(; j>=0; j=scanbuf[j].next) { if( scanbuf[j].next== -1 ) break; /* something out-of-wack! */ cop( scanbuf[j].scanx , y); /* start span */ if( (i=scanbuf[j].flag) == 0) { /* normal */ i = scanbuf[j].next; n_pixels = scanbuf[i].scanx - scanbuf[j].scanx + 1; delta = scanbuf[i].color - scanbuf[j].color; if( width==0 && delta==0.0 ) write_image(n_pixels , (jj=scanbuf[i].color) ); else { dcolor = delta / n_pixels; color = scanbuf[j].color; in_buf(WI|DF); /* write image + data flag */ in_buf(n_pixels<<1); /* # bytes */ for(k=0; k239 ) l=239; } in_buf(l); color=+ dcolor; } flush_buf(); } j = i; continue; } /* must be a horizontal line */ k = scanbuf[j].next; if( scanbuf[i].scanx <= scanbuf[k].scanx ) { /* ie, not overlapping horizontal lines */ n_pixels = scanbuf[i].scanx - scanbuf[j].scanx + 1; delta = scanbuf[i].color - scanbuf[j].color; if( delta==0.0 ) { write_image(n_pixels , (jj=scanbuf[i].color) ); } else { dcolor = delta / n_pixels; color = scanbuf[j].color; in_buf(WI|DF); /* write image + data flag */ in_buf(n_pixels<<1); /* # bytes */ for(k=0; k=u ) return(l); /* same pt! */ return( merge( sort(l,mid) , sort(mid+1,u) ) ); } merge(ii,jj) { register int i , j; register char *last; i=ii; j=jj; last = &dummy; while( i>=0 && j>=0 ) { if( scanbuf[i].flag < 0 ) { /* ignore this pt */ i = scanbuf[i].next; continue; } if( scanbuf[j].flag<0 ) { j = scanbuf[j].next; continue; } if( scanbuf[i].scanx <= scanbuf[j].scanx ) { last->next = i; last = &scanbuf[i]; i = last->next; } else { last->next = j; last = &scanbuf[j]; j = last->next; } } /* * fill out remaining list: */ if( i >= 0 ) last->next = i; else last->next = j; return( dummy.next ); } cop(x,y) { in_buf(04000|OF); in_buf(START_POINT); in_buf(x); in_buf(y); flush_buf(); } i = scanbuf[i].next; continue; } if( scanbuf[j].flag<0 ) { j = scanbuf[j].next; continue; } if( scanbuf[i].scanx <= scanbuf[j].scanx ) { last->next = i; last = &scanbuf[i]; i = last->next; } else# #include "/user/ramtek/ramtek.h" #define DEBUG 0 #define MAXSIDES 20 /* max # sides */ #define NSQ 12 float one[] { 0.667 , 1.0 , 0.0 }; float two[] { 0.667 , 1.0 , 1.0 }; float backg[] {0.0 , 1.0 , 0.40}; float xsq[] { 1. , 1. , 2. , 5. , 7.8 , 9. , 7.9 , 3.9 , 6.8 , 5.7 , 2.0 , 4.9}; float ysq[] { 1. , 3. , 5. , 2. , 5.8 , 5. , 2.5 , 3.5 , 4.0 , 4.5 , 6.5 , 5.4}; int csq[] { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}; struct { char *next; int nsides; struct { int x , y , z , color; } side[]; } head; struct { float xx , yy; int col; } vertices[MAXSIDES]; char *memend; main(argc , argv) int argc; char *argv[]; { register char *cp , *last; register int j; char *now , *sbrk() , *alloc() , *before; int nsides , min , i , width; char iobuf[518]; float cosine , pow() , power , atof() , xx , yy; int c , cc; float i100 , j100; if( argc>3 || argc<2 ) { printf("\n syntax: ramtek filename [width]\n\7"); exit(1); } if( argc==3 ) { width = atoi(argv[2]); srand(1); } else width = 0; if( fopen(argv[1],iobuf) < 0 ) { printf("\n cannot open %s\n\7",argv[1]); exit(1); } memend = sbrk(0); memend++; memend=& 0177776; brk(0157776); last = &head; while( (nsides=getw(iobuf)) > 0) { if( nsides>MAXSIDES ) { printf("\n %d - need to increase MAXSIDES in ramtek.c\n\7",nsides); goto contin; } last = last->next = alloc(4+8*nsides); last->nsides = nsides; last->next=0; if( DEBUG ) printf("\n nsides = %d",nsides); for(j=0;jside[j].x = getw(iobuf); last->side[j].y = getw(iobuf); last->side[j].z = getw(iobuf); cosine = getw(iobuf); cosine=/ 250.; last->side[j].color = 180.*cosine + 30. + 0.5; if( DEBUG ) printf("\n\t%d %d %d %d",last->side[j].x,last->side[j].y,last->side[j].z,last->side[j].color); if( (i=last->side[j].x) <0 || i> 511) goto bad; if( (i=last->side[j].y) <0 || i>511) goto bad; if( (i=last->side[j].color) <0 || i>239 ) goto bad; continue; bad: last->nsides=0; } } /* * start the display: */ contin: printf("\7\7"); ram_setup(); color_table("hci",0,240,one,two); backgrd(239); erase(); for(j=0; jnext ) { if( cp->nsides <= 0 ) continue; for(j=0;jnsides;j++) if( cp->side[j].z < min ) { min = cp->side[j].z; now = cp; before = last; } } if( (cp=now) == 0 ) break; /* done */ before->next = cp->next; /* so will skip this one next time */ for(j=0;jnsides;j++) { vertices[j].xx = cp->side[j].x/XFACT; vertices[j].yy = cp->side[j].y/YFACT; vertices[j].col = cp->side[j].color; } fill(cp->nsides , &vertices[0] , 0.550); } close( iobuf[0] ); } char *alloc(nbytes) { register char *m; m=memend; memend=+ nbytes; if( memend > 0157776 ) { printf("\n out of memory!\7"); exit(1); } return(m); } ast; } } if( (cp=now) == 0 ) break; /* done */ before->next = cp->next; /* so will skip this one next time */ for(j=0;jnsides;j++) { vertices[j].xx = cp->side[j].x/XFACT; vertices[j].yy = cp->side[j].y/YFACT; vertices[j].col = cp->side[j].color; } fill(cp->nsides , &vertices[0] , 0.550); } close( iobuf[0] ); } char *alloc(nbytes) { register char *m; m=memend; memend=+ nbytes; if( meme# #include "/user/ramtek/ramtek.h" #define DEBUG 0 #define MAXSIDES 20 /* max # sides */ #define NSQ 12 float one[] { 0.0 , 0.0 , 0.0 }; float two[] { 1.0 , 0.0 , 0.0 }; float xsq[] { 1. , 1. , 2. , 5. , 7.8 , 9. , 7.9 , 3.9 , 6.8 , 5.7 , 2.0 , 4.9}; float ysq[] { 1. , 3. , 5. , 2. , 5.8 , 5. , 2.5 , 3.5 , 4.0 , 4.5 , 6.5 , 5.4}; int csq[] { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}; struct { char *next; int nsides; struct { int x , y , z , color; } side[]; } head; struct { float xx , yy; int col; } vertices[MAXSIDES]; char *memend; main(argc , argv) int argc; char *argv[]; { register char *cp , *last; register int j; char *now , *sbrk() , *alloc() , *before; int nsides , min , i , width; char iobuf[518]; float cosine , pow() , power , atof() , xx , yy; int c , cc; float i100 , j100; if( argc>3 || argc<2 ) { printf("\n syntax: ramtek filename [width]\n\7"); exit(1); } if( argc==3 ) { width = atoi(argv[2]); srand(1); } else width = 0; if( fopen(argv[1],iobuf) < 0 ) { printf("\n cannot open %s\n\7",argv[1]); exit(1); } memend = sbrk(0); memend++; memend=& 0177776; brk(0157776); last = &head; while( (nsides=getw(iobuf)) > 0) { if( nsides>MAXSIDES ) { printf("\n %d - need to increase MAXSIDES in ramtek.c\n\7",nsides); goto contin; } last = last->next = alloc(4+8*nsides); last->nsides = nsides; last->next=0; if( DEBUG ) printf("\n nsides = %d",nsides); for(j=0;jside[j].x = getw(iobuf); last->side[j].y = getw(iobuf); last->side[j].z = getw(iobuf); cosine = getw(iobuf); cosine=/ 250.; last->side[j].color = 180.*cosine + 30. + 0.5; if( DEBUG ) printf("\n\t%d %d %d %d",last->side[j].x,last->side[j].y,last->side[j].z,last->side[j].color); if( (i=last->side[j].x) <0 || i> 511) goto bad; if( (i=last->side[j].y) <0 || i>511) goto bad; if( (i=last->side[j].color) <0 || i>239 ) goto bad; continue; bad: last->nsides=0; } } /* * start the display: */ contin: printf("\7\7"); ram_setup(); color_table("gray",0,240,one,two); backgrd(239); erase(); for(j=0; jnext ) { if( cp->nsides <= 0 ) continue; for(j=0;jnsides;j++) if( cp->side[j].z < min ) { min = cp->side[j].z; now = cp; before = last; } } if( (cp=now) == 0 ) break; /* done */ before->next = cp->next; /* so will skip this one next time */ for(j=0;jnsides;j++) { vertices[j].xx = cp->side[j].x/XFACT; vertices[j].yy = cp->side[j].y/YFACT; vertices[j].col = cp->side[j].color; } fill(cp->nsides , &vertices[0] , 0.50); } close( iobuf[0] ); } char *alloc(nbytes) { register char *m; m=memend; memend=+ nbytes; if( memend > 0157776 ) { printf("\n out of memory!\7"); exit(1); } return(m); } last; } } if( (cp=now) == 0 ) break; /* done */ before->next = cp->next; /* so will skip this one next time */ for(j=0;jnsides;j++) { vertices[j].xx = cp->side[j].x/XFACT; vertices[j].yy = cp->side[j].y/YFACT; vertices[j].col = cp->side[j].color; } fill(cp->nsides , &vertices[0] , 0.50); } close( iobuf[0] ); } char *alloc(nbytes) { register char *m; m=memend; memend=+ nbytes; if( memend > 0157776 ) { printf("\n out of me# #define DEBUG 0 #include "/user/ramtek/ramtek.h" #define WI 05000 /* write-image */ /* * perform a scan-line color fill of a polygon: * * calling sequence: * fill(n,p[,t]) * int n; * struct { * float x , y; * int color; * } p[]; * double t; * * * last point will be joined with the first point. * * if given, t is transparency factor (0.0=perfectly opaque / 1.0=perfectly transparent) * if not given, t=0.0 * */ #define MAX 30 /* max expected edges */ struct { /* structure containing one scan-line of info */ int scanx; /* x position */ float color; int flag; /* 0=normal , >0=first of horizontal pair , <0=second of horizontal pair */ int next; /* array index of next point to the right (-1=end-of-list) */ } scanbuf[MAX] , dummy; struct vert { int x , y; int col; } ppt[MAX]; fill(nn , p , t) int nn; char *p; double t; { struct { float fx , fy; int kolor; } *pts; register struct vert *pt; register int j , n; int maxy , miny , y , ib , jp1 , jp2; int i , k , l , jj , maxcol , mincol , n_pixels; float ratio , delta , dcolor , color; extern int BUFFER[] , NWORDS; /* * default "t" if not given: */ if( nargs() != 6 ) t = 0.0; pt = &ppt[0]; n = nn; pts = p; /* * scan the data for maxy and miny and convert the LL user system to the UL ramtek system: */ maxy = maxcol = -1; miny=513; mincol = 2048; for(j=0;j 511 ) pt[j].y = 511; if( pt[j].y < 0 ) pt[j].y = 0; if( pt[j].y > maxy ) maxy = pt[j].y; if( pt[j].y < miny ) miny = pt[j].y; if( pt[j].col > maxcol ) maxcol = pt[j].col; if( pt[j].col < mincol ) mincol = pt[j].col; } /* * start the scan lines from the top to the bottom and from left to right: */ for(y=miny; y<=maxy; y++) { ib=0; /* scanbuf counter */ for(j=0;j 0 ) continue; /* scan line does not cross this vector */ if( pt[j].y==y && pt[jp1].y==y ) { /* horizontal! */ scanbuf[ib].scanx = pt[j].x; scanbuf[ib].color = pt[j].col; scanbuf[ib].flag = ib+1; scanbuf[ib].next = -1; scanbuf[++ib].scanx = pt[jp1].x; scanbuf[ib].color = pt[jp1].col; scanbuf[ib].flag = -1; scanbuf[ib].next = -1; ib++; continue; } if( pt[jp1].y==y ) { /* check for a singularity at pt[jp1] */ jp2 = j+2; if( j>=n-2 ) jp2=- n; if( (pt[j].y-pt[jp1].y) * (pt[jp2].y-pt[jp1].y) <= 0 ) continue; } /* otherwise, determine the intersection of the line (pt[j]-pt[jp1]) and the scan */ ratio = y - pt[j].y; ratio=/ (pt[jp1].y - pt[j].y); scanbuf[ib].scanx = pt[j].x + (pt[jp1].x-pt[j].x)*ratio; scanbuf[ib].color = pt[j].col + (pt[jp1].col-pt[j].col)*ratio; scanbuf[ib].flag = 0; scanbuf[ib++].next = -1; } /* j */ /* * now sort the scan line intersections: */ if( ib==0 ) continue; /* insurance */ j = sort( 0 , ib-1 ); /* j is the index of the first pt */ for(; j>=0; j=scanbuf[j].next) { if( scanbuf[j].next== -1 ) break; /* something out-of-wack! */ if( (i=scanbuf[j].flag) == 0) { /* normal */ i = scanbuf[j].next; n_pixels = scanbuf[i].scanx - scanbuf[j].scanx + 1; if( t != 0.0 ) { read_pix(&BUFFER[5] , n_pixels-1 , scanbuf[j].scanx , 511 - y); if( DEBUG ) printf("\n Read %d Pixels",n_pixels-1); } delta = scanbuf[i].color - scanbuf[j].color; dcolor = delta / n_pixels; color = scanbuf[j].color; BUFFER[0] = WI|DF|OF; BUFFER[1] = START_POINT; BUFFER[2] = scanbuf[j].scanx; BUFFER[3] = y; BUFFER[4] = (n_pixels-1)<<1; for(k=0; k=u ) return(l); /* same pt! */ return( merge( sort(l,mid) , sort(mid+1,u) ) ); } merge(ii,jj) { register int i , j; register char *last; i=ii; j=jj; last = &dummy; while( i>=0 && j>=0 ) { if( scanbuf[i].flag < 0 ) { /* ignore this pt */ i = scanbuf[i].next; continue; } if( scanbuf[j].flag<0 ) { j = scanbuf[j].next; continue; } if( scanbuf[i].scanx <= scanbuf[j].scanx ) { last->next = i; last = &scanbuf[i]; i = last->next; } else { last->next = j; last = &scanbuf[j]; j = last->next; } } /* * fill out remaining list: */ if( i >= 0 ) last->next = i; else last->next = j; return( dummy.next ); } /* * combine 2 colors: * (cf is foreground, cb is background) * (t=0 means all cf / t=1 means all cb) */ #define BLACK 0 #define WHITE 239 add(cf , cb , t) float t; { register int i; if( cf==BLACK || cb==WHITE ) t = 0.00; if( cb==BLACK ) t = 0.90; return( (i=(1.-t)*cf + t*cb) ); } last->next; } else { wcoloriwidixöÿiyôÿfmulzfsubzfaddzfdivzrio.oD~ram_setD~in_bufºword~flush_bàjdump~ram_rea8npram_coloR~foregrdRindexøÿcolor~strcmpŒiøÿst~table_i¸wordøÿ~backgrd2indexøÿcolorwordöÿ~eraseh~color_n~indexøÿcolorram_moveœ~ram_movœnøÿxy newcoloriwidfmulzfsubzfaddzfdivzfltpr.ob _ndigitÚ.ac0/fcvtš!movedig&!ecvt”!eflagØ.scaledø!normŒ"mul10ø"div10ª"right,#bufÜ.buftop/doneZ"left"#savedr1/printf.o8#formp/loopL#rjust/ndigit/gnum %width/ndfnd/swtab´*decimal®#octalb$hex\$floatž$scien¬$charac:$stringH$longorunº#unsignedÈ#remoteº$longê#prbufÄ$prstrÌ$putchr.o>%flx%close.o®%open.oÄ%read.oâ%write.o&exit.o&&nargs.o0&jsrsd+tsti+cmpi+addi+jmpi +bri+csv.oœ&fis.o¶&fsubzreturn"1cerror.oö'savr5$Ö._exit"&&_main"_k#(_n#(_w#(_r#((_g#4(_b#@(_m#L(_c#X(_l#d(csv"œ&_setup"Z_seg"_plot"¶_ram_set"D_backgrd"2_erase"h_ram_mov"œ_color_t"\_keyset"Ü_mouse"ú_move"R_move_cu"(_fill"T _foregrd"R_draw"´cret"¨&fltused"b ac0$+_functr"Ðfisitod"¶&_FACTR$B+_parm"_map"6_funct"´fisdtoi"Þ&_FACT$F+_GFD$J+_GDEV#Ì(_nargs"0&_close"®%_open"Ä%_dr11"Æ_write"&_strng"6_read"â%_in_buf"º_flush_b"à_read_cu"À_ram_rea"8_scanbuf$L+_dummy$x,_ppt$‚,_sort"_cop"úfiststf"¸'_write_i"&_merge"X_strcmp"Œ_printf"8#fiscmpf"ˆ'_rgb_cvt"$_cmy_cvt"_hci_cvt"x_gray_cv"z_COLORNO$6-_IWIDTH$8-_XNOW$:-_YNOW$<-_FDB$>-_FDC$@-_BUFFER$B-_NWORDS$Ò._table_i"¸_color_n"~pfloat"b pscien"¼ _ecvt"4!_fcvt"^!_putchar">%_flush"l%_fout$/cerror"ö'fisdtol">'fisltod"ì&fisnegf"â'_errno$Ô.ng"6_read"â%_in_buf"º_flush_b"à_read_cu"À_ram_rea"8_scanbuf$L+_dummy$x,_ppt$‚,_sort"_cop"úfiststf"¸'_write_i"&_merge"X_strcmp"Œ_printf"8#fiscmpf"ˆ'_rgb_cvt"$_cmy_cvt"_hci_cvt"OI PNELA PNDHIBES I 1NTOI P C0 11 IS VS ZP2=ZP 09 1 S VI ZS2= Z 8 10 IS VS =YY2 07 1 S VI XS2= X 6 10 IS VS =LL2 05 1 S VI P2=ZP1 Z 4 10 IS V2 =ZZ1 03 1 S VI Y21= Y 2 10 IS V2 =XX1 01 1 S VI L21= L 0 10 IS V1 ZPS=ZP 99 S VI Z1S= Z 8 9 IS V1 =YYS 97 S VI X1S= X 6 9 IS V1 =LLS 95 S VI .NELA PHE TNDHIBE þé=M-1 PERCPT 65 GO TO 10 PERCPT 66 60 NINT=NINT+1 PERCPT 67 XI(NINT)=X2 PERCPT 68 YI(NINT)=Y2 PERCPT 69 ZI(NINT)=Z2 PERCPT 70 INT(NINT)=IPL PERCPT 71 GO TO 50 PERCPT 72 END PERCPT 73 SUBROUTINE PERSP PERSP 1 C THIS SUBROUTINE PLACES THE ROTATED COORDINATES IN PERSP 2 C PERSPECTIVE AND COMPUTES THE PICTURE PLANE MAXIMUM AND PERSP 3 C MINIMUM PERSP 4S I 1NTOI PATTHO STSINPOP WA S C4 9 IS V. NELA PHE TOF C 93 S VI NTRO FINR OONS I 1NTOI PE,ANPLE THD INEH BIS2 T INPO C 92 S VI 30 6TOO GN)MIIZ-SP2.ZGT2.(ZIF 91 S VI E.ANPLE THF ONTRO FINR OONS I 2 C0 9 IS VT INPOF ICKHE CE,ANPLE THF ONTRO FINR OONS I 1NTOI P C9 8 IS V0 7TOO GN)MIIZ-SP1.ZLT1.(ZIF 88 S VI E.ANPLE THD INEH BIS1 T INPOF ICKHE C C7 8 IS V) .3102F',2=ZPD AN1 ZP' T(MAOR F 5 6þí COMMON /PRW1/ X(1000),Y(1000),Z(1000),IXYZ(1000) CPRW1 1 1,NPT,MXPT,NFPT,NLPT CPRW1 2 2,PL(1000),NPL,MXPL,NFPL,NLPL CPRW1 3 3,LA(1000),LB(1000),NLN,MXLN,NFLN,NLLN CPRW1 4 4,IERR CPRW1 5 COMMON /PRW2/ XO,YO,ZO,XL,YL,ZL,S,D,SD,F CPRW2 1 1,XPMAX,XPMIN,YPMAX,YPMIN,MAXS CPRW2 2 2,TX,TY,TZ,OX,OY,OZ,RX,RY,RZ CPRW2 3 INTEGER PL PERSP 7 N=NFPT-1 PERSP 8 10 N=N+1 PERS6 8 IS V2 ZP1,ZP) 656,E(ITWR) .1EQT.OU(IIF 85 S VI CC)/DD2-*YBB2-*XAA(-2=ZP 84 S VI CC)/DD1-*YBB1-*XAA(-1=ZP 83 S VI E.ANPLE TH C 82 S VI TOOND TEECOJPRE IN LHE TOFS TENADIORCOZ E THE UTMPCO C 81 S VI NELA PHE TNGDIUNROUR SEDIP PELLLRAPAE THD INEH BORN INELI C 80 S VI 30 6TOO GX)MALZ.PGEN.MINZ(LIF 79 S VI 30 6TOO GN)MILY.PLEX.MANY(LIF 78 S VI 30 6TOO GX)MALY.PGEN.MINY(LIF 77þñP 9 IF(N.GT.NLPT) RETURN PERSP 10 IF(IXYZ(N).LE.0) GO TO 10 PERSP 11 W=1.-Z(N)/D PERSP 12 X(N)=X(N)/W PERSP 13 Y(N)=Y(N)/W PERSP 14 Z(N)=Z(N)/W PERSP 15 C PERSP 16 C COMPUTE MAXIMUM AND MINIMUM PERSP 17 C FIRST POINT PERSP 18 IF(MAXS.EQ.0) GO TO 20 PERSP 19 XPMAX=AMAX1(XPMAX,X(N)) PERSP 20 XPMIN=AMIN1(XPMIN,X(N)) PERSP 21 YPMAX=AMAX1(YP S VI 30 6TOO GN)MILX.PLEX.MANX(LIF 76 S VI 30 6TOO GX)MALX.PGEN.MINX(LIF 75 S VI NELIN DEID H AOFY ITILIBSSPOE THR FOK ECCH C 74 S VI DSPEPIL LEALAR PNGBIRISCUMRCCIO TWE THG INARMPCO C 73 S VI 2),ZZ11(INAMN=MINZ L 2 7 IS V) Y21,(YN1MI=AINYMLN 71 S VI 2),YY11(AXAMX=MANY L 0 7 IS V) X21,(XN1MI=AINXMLN 69 S VI 2),XX11(AXAMX=MANX L 8 6 IS VM MUNIMID ANM MUXIMAE IN LTEPUOM C þõMAX,Y(N)) PERSP 22 YPMIN=AMIN1(YPMIN,Y(N)) PERSP 23 GO TO 10 PERSP 24 20 XPMAX=X(N) PERSP 25 XPMIN=X(N) PERSP 26 YPMAX=Y(N) PERSP 27 YPMIN=Y(N) PERSP 28 MAXS=1 PERSP 29 GO TO 10 PERSP 30 END PERSP 31 SUBROUTINE PLTOLN PLTOLN 1 C THIS SUBROUTINE ADDS ALL THE LINES FORMING PLANE PLTOLN 2 C BOUNDARIES TO LINE TABLES. IT AVOIDS ADDING REDUNDANT PLTO C7 6 IS V0 63O TGO 1 66 S VI N)MIIZ.SLT2.**2)-ZZ1+(*2)*Y21-(Y2+**2)-XX1((IF 65 S VI W.IE VNTOI PORT ORSHY ER VISE IN LIFK ECCH C 64 S VI 3)0.F1,3I23,0.F1,3I2',E=IN L('ATRMFO 62 63 S VI Z22,,YX22,,LZ11,,YX11, L2),6(6TERI W1)Q..EUTIOF( I 2 6 IS V) L2Z(2= Z 1 6 IS V) L2Y(2= Y 0 6 IS V) L2X(2= X 9 5 IS V) L1Z(1= Z 8 5 IS V) L1Y(1= Y 7 5 IS V) L1X(1= X 6 5 þùLN 3 C LINES. PLTOLN 4 COMMON /PRW1/ X(1000),Y(1000),Z(1000),IXYZ(1000) CPRW1 1 1,NPT,MXPT,NFPT,NLPT CPRW1 2 2,PL(1000),NPL,MXPL,NFPL,NLPL CPRW1 3 3,LA(1000),LB(1000),NLN,MXLN,NFLN,NLLN CPRW1 4 4,IERR CPRW1 5 COMMON /PRW3/ VERT(100),NV,MXV CPRW3 1 INTEGER PL,VERT PLTOLN 7 N=NFPL-1 PLTOLN 8 10 J=0 PLTOLN 9 20 J=J+4 PLTOLN 10 N=N+1 PLTOLN 11 IS V) (LLB2= L 5 5 IS V0 63O TGO) .0EQ1.(LIF 54 S VI L)A(=LL1 53 S VI NELIA K ACNP U C2 5 IS V0 64O TGO) LNNLT..G(LIF 50 51 S VI LNNFL= 40 50 S VI ERNTOU CNELIE IZALTINI I C9 4 IS V0 64O TGO) INZMSI.-LTC.(CIF 48 S VI CKBAN OISE ANPLF ICKHE CD,LISOX VEON COFT AR P C7 4 IS V0 4TOO G2)E..NND(IIF 46 S VI ALRMNOR TEOUR FOD REDEORS CETIER VTHWID LISO C 45 S VI þý IF(N.GT.NLPL) RETURN PLTOLN 12 CALL UNPACK (PL(N),VERT(J-3),VERT(J-2),VERT(J-1),VERT(J), PLTOLN 13 1NVERT,IND) PLTOLN 14 IF(NVERT.GT.J) GO TO 20 PLTOLN 15 C WHOLE PLANE IS UNPACKED ADD LINES PLTOLN 16 IFST=VERT(1) PLTOLN 17 L=VERT(NVERT) PLTOLN 18 DO 70 I=1,NVERT PLTOLN 19 J=VERT(I) PLTOLN 20 C SEE IF POINT J ANY WHERE ELSE IN LIST PLTOLN 21 DO 60 K=1,NVERT PLTOLN 22 EXNVCOA F ORTPAS INELA PIFK ECCH C 44 S VI 40 6TOO GN)MIIZ.SLT).CCS(ABF( I 3 4 IS V) .3106F/,3,0.F1,4I5/,',N=MILZ PAXZMPL' 1 42 S VI N'MILY PAXYMPLN MILX PAXXMPLD DCCB BAAL IP' T(MAOR F 5 31 4 IS VN MILZ,PAXZMPLN,MILY,PAXYMPL1, 0 4 IS VN MILX,PAXXMPLD,,DCCB,,BAAL,IP) 356,E(ITWR) .1EQT.OU(IIF 39 S VI 40 6TOO G1)Q..EN)MIIZ,SDDC,,CBBA,,ANVT,ER(VEQPL(IIF 38 S VI W.IE VGEEDN AORL ALSMY ER V C7 3 IS Vþ IF(VERT(K).NE.J) GO TO 60 PLTOLN 23 IF(K.EQ.I) GO TO 60 PLTOLN 24 IF(K.EQ.NVERT) GO TO 50 PLTOLN 25 IF(L.EQ.VERT(K+1)) GO TO 70 PLTOLN 26 GO TO 60 PLTOLN 27 50 IF(L.EQ.IFST) GO TO 70 PLTOLN 28 60 CONTINUE PLTOLN 29 C ADD LINE L-J PLTOLN 30 CALL ADDLN(L,J) PLTOLN 31 IF(IERR.EQ.1) RETURN PLTOLN 32 70 L=J PLTOLN 33 GO TO 10 PLTOLN 34 END PLTOLN 35 SUS INELA PIFK ECCHD ANS NTTANSCON IOATQU ENELA PTEPUOM C C6 3 IS V) NVT,ER,VINZMPL 1 35 S VI X,MALZ,PINYMPLX,MALY,PINXMPLX,MALX(PINXMMAL AL C 0 34 3 IS VS TENADIORCOM MUNIMI C 33 S VI ND AUMIMAX MTEPUOM CEDCKPAUNN EE BAS HNELA PALOT T C2 3 IS V0 2TOO G 1 3 IS V1 L+IPL=IP 30 S VI 30O TGO) NVT..G(IIF 29 S VI +4=I I 8 2 IS VE ANPLA S IRYNT E C7 2 IS V0 64O TGO) .2GTD.INF( I þBROUTINE POLCLP POLCLP 1 C THIS SUBROUTINE PERFORMS POLYGON CLIPPING POLCLP 2 COMMON /PRW1/ X(1000),Y(1000),Z(1000),IXYZ(1000) CPRW1 1 1,NPT,MXPT,NFPT,NLPT CPRW1 2 2,PL(1000),NPL,MXPL,NFPL,NLPL CPRW1 3 3,LA(1000),LB(1000),NLN,MXLN,NFLN,NLLN CPRW1 4 4,IERR CPRW1 5 COMMON /PRW2/ XO,YO,ZO,XL,YL,ZL,S,D,SD,F CPRW2 1 1,XPMAX,XPMIN,YPMAX,YPMIN,MAXS CPRW2 2 2,TX,TY,TZ,OX,OY,OZ,RX,RY,RZ CPR 6 2 IS VE ANPLA S IRYNT EHE TIFK ECCH C 25 S VI D)INV,,N3)I+T(ER1V 4 2 IS V, 2)I+T(ER,V1)I+T(ER,VI)T(ER,VL)IPL((PCKPAUNL AL C 0 23 2 IS V1 I= 22 S VI RNTURE) PLNLT..GPL(IIF 10 21 S VI NEDOF ICKHE C C0 2 IS VL FP=NPL I 9 1 IS VY TRENY RAARL PSTIR FERIDNSCO C 18 S VI 0100.0 *N)MIYPX-MAYPN,MIXPX-MAXP1(INAMN=MIIZ S 7 1 IS VE IN LND ANELA POFE IZ SUMIMIN MONT MILIP UET S C6 1 þ W2 3 COMMON /PRW3/ VERT(100),NV,MXV CPRW3 1 INTEGER PL,OUT,VERT POLCLP 6 NN=NLPL POLCLP 7 NLPL=NFPL-1 POLCLP 8 N=NFPL-1 POLCLP 9 10 N=N+1 POLCLP 10 IF (N.GT.NN) RETURN POLCLP 11 L=1 POLCLP 12 20 CALL UNPACK(PL(N),VERT(L),VERT(L+1),VERT(L+2),VERT(L+3), POLCLP 13 1NV,IND) POLCLP 14 IF(NV.LE.L+3) GO TO 30 POLCLP 15 N=N+1 POLCLP 16 L=L+4 POLC IS V) IS VIN6H (UGEB DLLCA) .1EQT.OU(IIF 15 S VI INZMLNN,MINY,LAXYMLNN,MINX,LAXXMLNL EA R 4 1 IS V) 00(1NT IONSIENIM D 3 1 IS VT ER,VPLR GETEIN 1 7 RWCP UTIO/ W7PR /ONMMCO 1 6 RWCP INZMPLX,MALZ,PINYMPLX,MALY,PINXMPLX,MALX/PW6PRN/MOOM C 1 W5PR CD ,DCCB,,BAA/ W5PRN/MOOM C 1 W4PR C2 ZP2,,ZY22,,XL21,ZP1,,ZY11,,XL1/ W4PRN/MOOM C 1 W3PR CV MXV,,N0)10T(ER V3/RW/PN MOOM C 3 W2PR CZ ,RRYX,,Rüý LP 17 GO TO 20 POLCLP 18 C SELECT CLIPPING PLANE POLCLP 19 30 I=0 POLCLP 20 40 I=I+1 POLCLP 21 IF(I.GT.6) GO TO 200 POLCLP 22 C TURN OFF OUTPUT FLAG POLCLP 23 OUT=0 POLCLP 24 C TURN ON FIRST VERTEX FLAG POLCLP 25 IF=1 POLCLP 26 J=1 POLCLP 27 45 IF(VERT(J)) 160,50,50 POLCLP 28 C EXISTING VERTEX OR NEW INTERSECTION POLCLP 29 50 K=VERT(J) POLCLP 30 XOZY,,OOXZ,,TTYX,,T 2 2 2 RWCP XSMAN,MIYPX,MAYPN,MIXPX,MAXP1, 1 W2PR CF D,,S,D,SZLL,,YXLO,,ZYOO, X2/RW/PN MOOM C 5 W1PR CR ER,I 4 4 1 RWCP LNNLN,FL,NLNMXN,NL),0010B(,L0)00(1LA3, 3 W1PR CL LP,NPLNFL,XP,MPL,N0)00(1PL2, 2 W1PR CT LP,NPTNFT,XP,MPT,N 1 1 1 RWCP 0)00(1YZIX),0010Z(),0010Y(),0010X(/ W1PR /ONMMCO 5 S VI N.NLN=LL N C4 IS VD TEXI EENWH L.LP NTOL FP NOMFRS NELA PTOE IVATEL R C3 øýV=X(K) POLCLP 31 YV=Y(K) POLCLP 32 ZV=Z(K) POLCLP 33 C CHECK IF FIRST POINT POLCLP 34 GO TO (60,170),IF POLCLP 35 C POLCLP 36 C FIRST POINT POLCLP 37 C POLCLP 38 60 IF=2 POLCLP 39 FX=XV POLCLP 40 FY=YV POLCLP 41 FZ=ZV POLCLP 42 70 SX=XV POLCLP 43 SY=YV POLCLP 44 SZ=ZV POLCLP 45 C CHECK IF POINT J ON VISIBLE SIDE OF PLANE 1 POLCLP 4 IS VD REDESION CENWHY LLIARTPAR OLEIBIS VRE ALNNLO TLNNF C 2 S VI ESIN LOFS NELIH ICWHS NEMIERET DNETIOUBRSUS HI T C1 IS VS VIE INUTROUB S 3 2 RTTA SD EN 22 T ARST RNTURE 21 T ARST UEINNTCO 20 20 T ARST =0I)A( L 9 1 RTTA SN XL=M I20O D 8 1 RTTA SE NUTION C 0 17 1 RTTA S0 )=(IYZIX 16 T ARST PTMX1,I=0 1DO 15 T ARST YSRAARE IN LND ANTOI PROZE C 14 T ARST 0/ôý6 GO TO (80,90,100,110,120,130),I POLCLP 47 C FRONT POLCLP 48 80 IF(ZV.GT.0.) GO TO 150 POLCLP 49 GO TO 140 POLCLP 50 C REAR POLCLP 51 90 IF(F.EQ.0.) GO TO 140 POLCLP 52 IF(ZV.LT.F) GO TO 150 POLCLP 53 GO TO 140 POLCLP 54 C TOP POLCLP 55 100 IF(YV.GT.S-SD *ZV) GO TO 150 POLCLP 56 GO TO 140 POLCLP 57 C BOTTOM POLCLP 58 110 IF(YV.LT.-S+SD*ZV) GO TO 150 POLCLP 59 T/OU ITADA 13 T ARST 0/10V/MXA AT D 2 1 RTTA S/ /0XSMAA AT D 1 1 RTTA S/ /0RRIEA AT D 0 1 RTTA S/ ,1,1/1PLNFN,FL,NPTNFA AT D 9 RTTA S/ 00100,0,00,1,000100,N/XL,MLN,NPLMXL,NPT,XP,MPT NTADA 8 T ARST RTVEL, PEREGNT I 1 W7PR CT OU I7/RW/PN MOOM C 1 W3PR CV MXV,,N0)10T(ER V3/RW/PN MOOM C 3 W2PR CZ ,RRYX,,ROZY,,OOXZ,,TTYX,,T 2 2 2 RWCP XSMAN,MIYPX,MAYPN,MIXPX,MAXP1, 1 W2PR CF ðý GO TO 140 POLCLP 60 C LEFT POLCLP 61 120 IF(XV.LT.-S+SD*ZV) GO TO 150 POLCLP 62 GO TO 140 POLCLP 63 C RIGHT POLCLP 64 130 IF(XV.GT.S-SD*ZV) GO TO 150 POLCLP 65 C IN VISIBLE AREA POLCLP 66 140 OUT=1 POLCLP 67 GO TO 160 POLCLP 68 C OUT OF VISIBLE AREA POLCLP 69 150 VERT(J)=-K POLCLP 70 IXYZ(K)=IXYZ(K)-1 POLCLP 71 C POLCLP 72 C END OF VERTICE LOOP POLCLP 73 C D,,S,D,SZLL,,YXLO,,ZYOO, X2/RW/PN MOOM C 5 W1PR CR ER,I 4 4 1 RWCP LNNLN,FL,NLNMXN,NL),0010B(,L0)00(1LA3, 3 W1PR CL LP,NPLNFL,XP,MPL,N0)00(1PL2, 2 W1PR CT LP,NPTNFT,XP,MPT,N 1 1 1 RWCP 0)00(1YZIX),0010Z(),0010Y(),0010X(/ W1PR /ONMMCO 3 T ARST M.RAOGPRE IN LENDDHIE TH C 2 T ARST OR FNSIOATIZALTINI ILL AESDLAN HNETIOUBRSUS HI T C1 RTTA ST ARSTE INUTROUB S 6 5 N UTOL SD EN 55 TNLUSO RNTUìý POLCLP 74 160 J=J+1 POLCLP 75 IF(J.LE.NV) GO TO 45 POLCLP 76 C HAS ANY OUTPUT BEEN PRODUCED POLCLP 77 IF(OUT.EQ.0) GO TO 10 POLCLP 78 C YES, CHECK IF LINE CROSSES PLANE POLCLP 79 IF(ICROSS(FX,FY,FZ,SX,SY,SZ,XI,YI,ZI,I).EQ.0) GO TO 40 POLCLP 80 C YES, ADD POINT TO POINT TABLE POLCLP 81 CALL ADDPT(XI,YI,ZI,M) POLCLP 82 IF(IERR.NE.0) RETURN POLCLP 83 NV=NV+1 POLCLP 84 VERT(NV)=RE 54 TNLUSO E.LSFA=.TNOL S10 1 3 5 N UTOL S0 1TOO G 2 5 N UTOL SC )/-DY1B*1-*X-A=(II Z 1 5 N UTOL S0 11O TGO) INZMSIT..LC)S(ABF( I 0 5 N UTOL S1 =YII Y 9 4 N UTOL S1 =XII X00 1 8 4 N UTOL S. ZONE IZERETAMAR PREFOREHE T 0 = YTAEL D = XTAEL D C7 4 N UTOL S0 1TOO G 6 4 N UTOL S1 +Z*W1)-YII(YI=ZI 45 TNLUSO X1I=XI 44 TNLUSO W)C*B+/(D))-Z1W-1*(YC*1+*X-A=(II Y 3 4 N UTOL SV )/Z12-(ZW= 42 èý!M POLCLP 85 IXYZ(M)=IXYZ(M)+1 POLCLP 86 GO TO 40 POLCLP 87 C POLCLP 88 C NOT FIRST POINT POLCLP 89 C POLCLP 90 C CHECK IF LINE S-XV,YV,ZV CROSSES PLANE POLCLP 91 170 IF(ICROSS(SX,SY,SZ,XV,YV,ZV,XI,YI,ZI,I).EQ.0) GO TO 70 POLCLP 92 C YES INSERT POINT POLCLP 93 OUT=1 POLCLP 94 M=NV POLCLP 95 180 VERT(M+1)=VERT(M) POLCLP 96 IF(M.EQ.J) GO TO 190 POLCLP 97 M=M-1 POLCLP TNLUSO 00 1TOO GN)MIIZ.SLT).(VBS(AIF 41 TNLUSO Y12-=Y V90 0 4 N UTOL S. YONE IZERETAMAR PREFOREHE T 0 = XTAEL D C9 3 N UTOL SN URET R 8 3 N UTOL S. UETR=.TNOL S80 7 3 N UTOL S0 2TOO G2).ZGTI.ZIF( I70 6 3 N UTOL S0 2TOO G 5 3 N UTOL S0 8TOO G2).ZGTI.ZIF( I 4 3 N UTOL S0 7TOO G1).ZGTI.ZIF( I 3 3 N UTOL S0 8TOO GN)MIIZ.SLT).Z2I-ZIS(ABF( I 2 3 N UTOL S0 8TOO GN)MIIZ.SLT).Z1I-ZIS(ABF( I60 1 3 N UTOLäý% 98 GO TO 180 POLCLP 99 190 CALL ADDPT(XI,YI,ZI,M) POLCLP 100 IF(IERR.NE.0) RETURN POLCLP 101 VERT(J)=M POLCLP 102 IXYZ(M)=IXYZ(M)+1 POLCLP 103 J=J+1 POLCLP 104 NV=NV+1 POLCLP 105 GO TO 70 POLCLP 106 C POLCLP 107 C WRITE OUT DATA POLCLP 108 C POLCLP 109 200 IF(OUT.EQ.0) GO TO 10 POLCLP 110 C FIND NUMBER OF VERTICES LEFT POLCLP 111 M=0 POLCLP 112 DO 23 SS TENADIORCOZ E THK ECCH C 30 TNLUSO 20O TGO) Y2T..GII(YIF0 5 29 TNLUSO 20O TGO 28 TNLUSO 60O TGO) Y2T..GII(YIF 27 TNLUSO 50O TGO) Y1T..GII(YIF 26 TNLUSO 60O TGO) INZMSIT..L2)-YII(YBS(AIF 25 TNLUSO 60O TGO) INZMSIT..L1)-YII(YBS(AIF0 4 24 TNLUSO ESATINRDOO C YHE TCKHE C C3 2 N UTOL S0 2TOO G2).XGTI.XIF( I30 2 2 N UTOL SN URET R 1 2 N UTOL S. SEAL.FN=LTSO0 2 20 TNLUSO 40O TGO) X2T.àý)0 I=1,NV POLCLP 113 IF(VERT(I)) 230,220,220 POLCLP 114 220 M=M+1 POLCLP 115 230 CONTINUE POLCLP 116 J=1 POLCLP 117 DO 295 I=1,NV POLCLP 118 IF(VERT(I)) 295, 240,240 POLCLP 119 240 GO TO (250,260,270,280),J POLCLP 120 250 I1=VERT(I) POLCLP 121 GO TO 290 POLCLP 122 260 I2=VERT(I) POLCLP 123 GO TO 290 POLCLP 124 270 I3=VERT(I) POLCLP 125 GO TO 290 POLCLP 126 280 NLPL=NLP.GII(XIF 19 TNLUSO 30O TGO) X1T..GII(XIF 18 TNLUSO 40O TGO) INZMSIT..L2)-XII(XBS(AIF 17 TNLUSO 40O TGO) INZMSIT..L1)-XII(XBS(AIF0 1 16 TNLUSO S.TENADIORCOX E THK ECCH C 15 TNLUSO S.ITIM LNELIE THN HIIT WRE ATSINPOG INRCIE PHE TIFK ECCH C 14 TNLUSO Z1W+T*I=ZI 13 TNLUSO Y1U+T*I=YI 12 TNLUSO X1I-XIT= 11 TNLUSO W)C*U+B*A+/(D))-Z1W-1*(XC*)+Y1U-1*(XB*=(II X 0 1 N UTOL SV )/Z12-(ZW= 9Üý-L+1 POLCLP 127 CALL PACK (PL(NLPL),I1,I2,I3,VERT(I),M,IND) POLCLP 128 J=0 POLCLP 129 290 J=J+1 POLCLP 130 295 CONTINUE POLCLP 131 GO TO (10,300,310,320),J POLCLP 132 300 I2=0 POLCLP 133 310 I3=0 POLCLP 134 320 I4=0 POLCLP 135 NLPL=NLPL+1 POLCLP 136 CALL PACK(PL(NLPL),I1,I2,I3,I4,M,IND) POLCLP 137 GO TO 10 POLCLP 138 END POLCLP 139 SUBROUTINE RDVIEW RDVIEW 1 C TNLUSO /V1)-YY2=( U 8 N UTOL S0 9TOO GN)MIIZ.SLT).(VBS(AIF 7 TNLUSO X12-=X V 6 N UTOL SN LTSOL CAGILO 5 TNLUSO S.ITIM LNELIE THN HIIT WRSCUOCT INPOG INRCIE P C4 N UTOL SE THF IE.RU.TO TAGFLN LTSOE THS ET SND A DC,, BA,E ANPL C 3 TNLUSO HE TESRCIE P-2 1NELIE THE ERWHT INPOE THS TEPUOM CNETIOUBRSUS HI T C2 N UTOL S) INZMSID,C,B,1, 1 N UTOL SA N,LTSOI,ZII,YII,XI2,,ZY22,,XZ11,,YX1N(UTOL SNETIOUBRSU Øý1THIS SUBROUTINE READS THE DATA FOR EACH VIEW RDVIEW 2 C CONSISTING OF THE VIEWING VECTOR,(XO,YO,ZO-XL,YL,ZL), RDVIEW 3 C THE DISPLAY SIZE,(S), THE VIEWING ANGLE(ANG), AND RDVIEW 4 C THE DEPTH OF FIELD,(F). IT ALSO READS THE OBJECT RDVIEW 5 C TRANSLATION (TX,TY,TZ), ORIGIN FOR ROTATION,(OX,OY,OZ), RDVIEW 6 C AND ROTATION ANGLES, (RX,RY,RZ). RDVIEW 7 COMMON /PRW1/ X(1000),Y(1000),Z(1000),IXYZ(1000) CPRW1 1 1,NPT,MXPT,NF41 T RO ND E 0 4 OT R0 1TOO G 9 3 OT RZ +OZI3*C3I+*Y32+CXI1*C3)=(N Z 8 3 OT RY +OZI3*C2I+*Y22+CXI1*C2)=(N Y 7 3 OT RX +OZI3*C1I+*Y12+CXI1*C1)=(N X 6 3 OT RZ -ON)Z(I= Z 5 3 OT RY -ON)Y(I= Y 4 3 OT RX -ON)X(I= X 3 3 OT RN GIRI OEW NTOT INPOE OV M C2 3 OT R0 1TOO G0)E..LN)Z(XY(IIF 31 T RO RNTURE) PTNLT..G(NIF 30 T RO +1=N N 0 19 2 OT R1 T-FP=NÔý5PT,NLPT CPRW1 2 2,PL(1000),NPL,MXPL,NFPL,NLPL CPRW1 3 3,LA(1000),LB(1000),NLN,MXLN,NFLN,NLLN CPRW1 4 4,IERR CPRW1 5 COMMON /PRW2/ XO,YO,ZO,XL,YL,ZL,S,D,SD,F CPRW2 1 1,XPMAX,XPMIN,YPMAX,YPMIN,MAXS CPRW2 2 2,TX,TY,TZ,OX,OY,OZ,RX,RY,RZ CPRW2 3 DATA PI/3.14159265/ RDVIEW 10 READ(5,10) XO,YO,ZO,XL,YL,ZL,S,ANG,F RDVIEW 11 WRITE(6,10) XO,YO,ZO,XL,YL,ZL,S,ANG,F RDVIEW 12 10 FORMA N 8 2 OT RT OS*CSACO3=C3 27 T RO NTSIA*OS=C32 C 6 2 OT RA IN-S1=C3 25 T RO NTSIB*OS-CSTCOA*IN*SNBSI3=C2 24 T RO SBCOT*OS+CNTSIA*IN*SNBSI2=C2 23 T RO SACOB*IN=S21 C 2 2 OT RT IN*SNBSIT+OS*CNASIB*OS=C13 C 1 2 OT RT OS*CNBSIT-IN*SNASIB*OS=C12 C 0 2 OT RA OS*CSBCO1=C1 19 T RO B)S(COB=OS C 8 1 OT R) (BIN=SNBSI 17 T RO A)S(COA=OS C 6 1 Ðý9T(9F8.2) RDVIEW 13 IF(EOF,5)20,30 RDVIEW 14 20 IERR=1 RDVIEW 15 RETURN RDVIEW 16 30 READ(5,10)TX,TY,TZ,OX,OY,OZ,RX,RY,RZ RDVIEW 17 WRITE(6,10) TX,TY,TZ,OX,OY,OZ,RX,RY,RZ RDVIEW 18 IF(EOF,5)40,60 RDVIEW 19 40 WRITE(6,50) RDVIEW 20 50 FORMAT(43H NO OBJECT TRANSLATION OR MANIPULATION CARD ) RDVIEW 21 GO TO 20 RDVIEW 22 C THE DEPTH OF FIELD IS REALLY IN THE NEGATIVE Z RDVIEW 23 C DIR OT R) (AIN=SNASI 15 T RO T)S(COT=OS C 4 1 OT R) (TIN=SNTSI 13 T RO ADGRDEZ*=R B 2 1 OT RD RAEG*DRYA= 11 T RO ADGRDEX*=R T 0 1 OT R. 80/1PID=RAEG D 9 OT R/ 659215143.I/ PTADA 8 T RO PLR GETEIN 3 2 RWCP RZY,,RRXZ,,OOYX,,OTZY,,TTX2, 2 W2PR CS AX,MINPM,YAXPM,YINPM,XAXPM,X 1 1 2 RWCP ,FSDD,S,L,,ZYLL,,XZOO,,YXO/ W2PR /ONMMCO 5 1 RWCP RRIE4, Ìý=ECTION SO NEGATE F. RDVIEW 24 60 F=-F RDVIEW 25 C FIGURE THE DEFAULT VALUES FOR S,D, AND ANG RDVIEW 26 D=SQRT((XO-XL)**2+(YO-YL)**2+(ZO-ZL)**2) RDVIEW 27 IF(S.EQ.0.) GO TO 70 RDVIEW 28 S=S/2. RDVIEW 29 IF(ANG.LE.0.) GO TO 65 RDVIEW 30 C S AND ANG BOTH GIVEN COMPUTE D RDVIEW 31 ANG=ANG*PI /360. RDVIEW 32 D=S*COS(ANG)/SIN(ANG) RDVIEW 33 65 SD=S/D RDVIEW 34 RETURN RDVIEW 4 W1PR CN LL,NLNNFN,XL,MLN,N0)00(1LB),0010A(,L 3 3 1 RWCP PLNLL,FP,NPLMXL,NP),0010L(,P 2 2 1 RWCP PTNLT,FP,NPTMXT,NP1, 1 W1PR C) 0010Z(XY,I0)00(1,Z0)00(1,Y0)00(1 X1/RW/PN MOOM C 5 OT R. ZUTBO ALYALIN FND AY,N HE TSTIR F XUTBO AEDRMFOER P C4 OT RS IONTITAROE THD ANS EEGRDEN IENIV GRE AESGLANE TH C 3 T RO Z. RND,ARYX, RESGLANH UGROTHZ ,OOYX, ONTOI PGHOUHR T C2 OT RG INSSPAS XE AUTBO ATSECBJ OESATOT RÈýÄý35 C S EQUALS 0 RDVIEW 36 70 IF(ANG.LE.0.) GO TO 80 RDVIEW 37 C ANG IS NOT EQUAL TO 0 COMPUTE S RDVIEW 38 ANG=ANG*PI/360. RDVIEW 39 S=D*SIN(ANG)/COS(ANG) RDVIEW 40 GO TO 65 RDVIEW 41 C S AND ANG=0 OR ARE TOO LARGE. USE 45 DEGREES RDVIEW 42 C 1/2 ANGLE DEFAULT RDVIEW 43 80 S=D RDVIEW 44 GO TO 65 RDVIEW 45 END RDVIEW 46 SUBROUTINE ROT ROT 1 C THIS SUBROUTINE