†Æ¾�Á! † "À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ÿàÉ‹þÉ Û‡÷^?‡Àmegapp.a¤x Ò:´Ê æmegsrc.a¤x z_´¾7M¼libm.a¤‘xXw´Eg0�eÿmdb.cª«x ¤�½#include #include main(argc,argv) int argc; char *argv[]; { register int cur,n; int i1 , i2; int tmp[2] , cmd; int exit(); if( (Mioptr=fopen(MEGDEV,"r+w")) == NULL ) { printf("\n Cannot open /dev/meg ! \n\7"); exit(1); } if ((Mpioptr=fopen(MEGPDEV,"r+w")) == NULL ) { printf("\n Cannot open /dev/megper ! \n\7"); exit(1); } cur = 0; putw(0177761,Mioptr); putw(05,Mioptr); putw(0,Mioptr); Mflush(); signal(SIGQUIT,exit); signal(SIGINT,0); for(;;){ signal(SIGINT,0); printf("\n? "); read_line(&cmd , &i1 , &i2); n = 1; switch(cmd) { case '\n': cur++; break; case '=': /* replace current word */ putw(cur,Mioptr); putw(i1,Mioptr); putw(i2,Mioptr); Mflush(); continue; case '-': if(i1) cur -= i1; else cur--; break; case 'q': exit(0); case '/': cur = tmp[1]; break; case '+': cur += i1; break; case 0: if(i1) cur = i1; break; case 'p': if(i1) n = i1; break; case 'z': if(i1 == 0) i1 = 050; while( i1>0){ n = (i1>50)? 50:i1; i1 -= n; putw(cur,Mioptr); cur += n; for(;n>0;n--){ putw(0, Mioptr); putw(0, Mioptr); } Mflush(); } continue; default: ; } for(;n>0;n--){ tmp[0] = cur; read(fileno(Mioptr),tmp,4); printf("\n%6o\t%6o %6o", cur++, tmp[0], tmp[1]); } cur--; } printf("\n"); exit(0); msetup(); /* dummy call to insure loading of globals */ } /* * read and parse a line: */ read_line(cp , i1p , i2p) int *cp; int *i1p , *i2p; { char line[30] , *rcp1; register char *rcp , c; rcp = &line[0]; while( (*rcp++ = getchar()) != '\n'); *rcp++ = '\n'; *rcp = '\n'; if( (*cp= line[0])<'0' || line[0]>'7' ) /* he did give a non-octal command */ rcp1 = &line[1]; else{ rcp1 = &line[0];/* otherwise gave a memory location */ *cp = 0; } *i1p = atoo( &rcp1 ); *i2p = atoo( &rcp1 ); } /* * read an octal number: */ atoo( cpp ) char **cpp; { register char *rcp , c; register int num; rcp = *cpp; num = 0; while(*rcp++ == ' ') ; rcp--; while( (c= *rcp++)>='0' && c<='7' ) { num=* 8; num=+ (c-'0'); } *cpp = rcp; /* points to char after the terminator */ return(num); } /* * draw sierpinski curves on the megatek */ #define n 5 /* order of the curve */ #define h0 2048 /* resolution */ #define X 1 #define Y 0 int pos0[2],pos[2]; main() { register int h , i , j; float fh; float m[4][4]; float offset; msetup(); mseg(1); ident(m); offset = -h0/2; mtrans(m,offset,offset,0.); mscale(m,2.0,2.0,2.0); mxform(1,m); h = h0/4; pos0[X]=2*h; pos0[Y] = 3*h; offset = -h0/2; for(i=1;i<=n;i++){ pos0[X] -= h; h = h/2; pos0[Y] += h; pos[X] = pos0[X]; pos[Y] = pos0[Y]; mplot(pos[X],pos[Y],3); curve(i,X,Y,h,h); line(X,Y,h,-h); curve(i,Y,X,-h,h); line(X,Y,-h,-h); curve(i,X,Y,-h,-h); line(X,Y,-h,h); curve(i,Y,X,h,-h); line(X,Y,h,h); } mxform(1,m); sleep(3); for(j=0;j<110;j++){ mrotate(m,0.,0.,5.); mscale(m,0.96,0.96,0.96); mxform(1,m); } mblank(1); } line(d1,d2,h1,h2) { pos[d1] += h1; pos[d2] += h2; mplot(pos[X],pos[Y],2); } curve(j,d1,d2,h1,h2) register int j , h1 , h2; { if(j>0){ curve(j-1,d1,d2,h1,h2); line(d1,d2,h1,-h2); curve(j-1,d2,d1,-h2,h1); /* rotate -pi/2 */ line(d1,d2,2*h1,0); curve(j-1,d2,d1,h2,-h1); /* rotate +pi/2 */ line(d1,d2,h1,h2); curve(j-1,d1,d2,h1,h2); } } b52.edit´Šx¤‘J®K³ÿ-³ÿ+³ÿ$³ÿ$³ÿ+³ÿ-³ÿóÿ+³ÿçÿ$³ÿÝÿ³ÿÖÿ³ÿÔÿ³ÿÖÿóÿ³ÿÝÿçÿ³ÿçÿÝÿ³ÿóÿÖÿ³ÿÔÿ³ÿÖÿ³ÿÝÿ³ÿ$çÿ³ÿ+óÿeÿ;eÿ8eÿ0#eÿ#0eÿ8eÿ;eÿïÿ8eÿÞÿ0eÿÑÿ#eÿÉÿeÿÆÿeÿÉÿïÿeÿÑÿÞÿeÿÞÿÑÿeÿïÿÉÿeÿÆÿeÿÉÿeÿ#Ñÿeÿ0Þÿeÿ8ïÿÿ=ÿ:ÿ1$ÿ$1ÿ:ÿ=ÿîÿ:ÿÝÿ1ÿÐÿ$ÿÇÿÿÄÿÿÇÿîÿÿÐÿÝÿÿÝÿÐÿÿîÿÇÿÿÄÿÿÇÿÿ$Ðÿÿ1Ýÿÿ:îÿÉþ=Éþ:Éþ1$Éþ$1Éþ:Éþ=Éþîÿ:ÉþÝÿ1ÉþÐÿ$ÉþÇÿÉþÄÿÉþÇÿîÿÉþÐÿÝÿÉþÝÿÐÿÉþîÿÇÿÉþÄÿÉþÇÿÉþ$ÐÿÉþ1ÝÿÉþ:îÿ{þ={þ:{þ1${þ$1{þ:{þ={þîÿ:{þÝÿ1{þÐÿ${þÇÿ{þÄÿ{þÇÿîÿ{þÐÿÝÿ{þÝÿÐÿ{þîÿÇÿ{þÄÿ{þÇÿ{þ$Ðÿ{þ1Ýÿ{þ:îÿ-þ=-þ:-þ1$-þ$1-þ:-þ=-þîÿ:-þÝÿ1-þÐÿ$-þÇÿ-þÄÿ-þÇÿîÿ-þÐÿÝÿ-þÝÿÐÿ-þîÿÇÿ-þÄÿ-þÇÿ-þ$Ðÿ-þ1Ýÿ-þ:îÿßý=ßý:ßý1$ßý$1ßý:ßý=ßýîÿ:ßýÝÿ1ßýÐÿ$ßýÇÿßýÄÿßýÇÿîÿßýÐÿÝÿßýÝÿÐÿßýîÿÇÿßýÄÿßýÇÿßý$Ðÿßý1Ýÿßý:îÿ‘ý=‘ý:‘ý1$‘ý$1‘ý:‘ý=‘ýîÿ:‘ýÝÿ1‘ýÐÿ$‘ýÇÿ‘ýÄÿ‘ýÇÿîÿ‘ýÐÿÝÿ‘ýÝÿÐÿ‘ýîÿÇÿ‘ýÄÿ‘ýÇÿ‘ý$Ðÿ‘ý1Ýÿ‘ý:îÿCý=Cý:Cý1$Cý$1Cý:Cý=Cýîÿ:CýÝÿ1CýÐÿ$CýÇÿCýÄÿCýÇÿîÿCýÐÿÝÿCýÝÿÐÿCýîÿÇÿCýÄÿCýÇÿCý$ÐÿCý1ÝÿCý:îÿõü=õü:õü1$õü$1õü:õü=õüîÿ:õüÝÿ1õüÐÿ$õüÇÿõüÄÿõüÇÿîÿõüÐÿÝÿõüÝÿÐÿõüîÿÇÿõüÄÿõüÇÿõü$Ðÿõü1Ýÿõü:îÿ§ü=§ü:§ü1$§ü$1§ü:§ü=§üîÿ:§üÝÿ1§üÐÿ$§üÇÿ§üÄÿ§üÇÿîÿ§üÐÿÝÿ§üÝÿÐÿ§üîÿÇÿ§üÄÿ§üÇÿ§ü$Ðÿ§ü1Ýÿ§ü:îÿYü<Yü9Yü1#Yü#1Yü9Yü<Yüîÿ9YüÞÿ1YüÐÿ#YüÈÿYüÅÿYüÈÿîÿYüÐÿÞÿYüÞÿÐÿYüîÿÈÿYüÅÿYüÈÿYü#ÐÿYü1ÞÿYü9îÿ ü9 ü7 ü." ü". ü7 ü9 üïÿ7 üßÿ. üÓÿ" üÊÿ üÈÿ üÊÿïÿ üÓÿßÿ üßÿÓÿ üïÿÊÿ üÈÿ üÊÿ ü"Óÿ ü.ßÿ ü7ïÿ½û4½û1½û*½û*½û1½û4½ûñÿ1½ûâÿ*½û×ÿ½ûÐÿ½ûÍÿ½ûÐÿñÿ½û×ÿâÿ½ûâÿ×ÿ½ûñÿÐÿ½ûÍÿ½ûÐÿ½û×ÿ½û*âÿ½û1ñÿoû.oû,oû%oû%oû,oû.oûóÿ,oûæÿ%oûÜÿoûÕÿoûÓÿoûÕÿóÿoûÜÿæÿoûæÿÜÿoûóÿÕÿoûÓÿoûÕÿoûÜÿoû%æÿoû,óÿ!û)!û' !û"!û"!û '!û)!ûôÿ'!ûéÿ"!ûßÿ!ûÚÿ !ûØÿ!ûÚÿôÿ!ûßÿéÿ!ûéÿßÿ!ûôÿÚÿ!ûØÿ!û Úÿ!ûßÿ!û"éÿ!û'ôÿÓú%Óú# ÓúÓúÓú #Óú%Óúöÿ#ÓúëÿÓúãÿÓúÞÿ ÓúÜÿÓúÞÿöÿÓúãÿëÿÓúëÿãÿÓúöÿÞÿÓúÜÿÓú ÞÿÓúãÿÓúëÿÓú#öÿ…ú …ú …ú…ú…ú …ú …ú÷ÿ…úîÿ…úçÿ…úâÿ …úáÿ…úâÿ÷ÿ…úçÿîÿ…úîÿçÿ…ú÷ÿâÿ…úáÿ…ú âÿ…úçÿ…úîÿ…ú÷ÿ7ú7ú7ú7ú7ú7ú7úùÿ7úñÿ7úëÿ7úçÿ7úæÿ7úçÿùÿ7úëÿñÿ7úñÿëÿ7úùÿçÿ7úæÿ7úçÿ7úëÿ7úñÿ7úùÿéù¤þ×ÿÕÿoý×ÿõÿWþqÿÐÿ7ýqÿñÿpýlÿñÿAþTÿÏÿ‚ýTÿðÿ/þ;ÿÎÿpý;ÿîÿ)þ3ÿÎÿý3ÿîÿ üdü®ÿ�ûdüÏÿ¤þ*Õÿoý*õÿWþ�Ðÿ7ý�ñÿpý•ñÿAþ­Ïÿ‚ý­ðÿ/þÆÎÿpýÆîÿ)þÎÎÿýÎîÿ ü�®ÿ�û�Ïÿ{ýTÿäÿŠþTÿòÿ¬ýTÿ{ý­äÿŠþ­òÿ¬ý­Õý«þÆÿ:ý«þÖÿTþ«þõÿµý«þÕýVÆÿ:ýVÖÿTþVõÿµýVý©ý»ÿ—ü©ýÈÿ‰ý©ýâÿêü©ýëÿýX»ÿ—üXÈÿ‰ýXâÿêüXëÿ            ! ! ""!##"$$#%%$&&%''&((')))(*++*,,+--,..-//.00/1102213324 435!546"657#768$879%98:&:9;';:<(<;=)=*=<>*?+?>@,@?A-A@B.BAC/CBD0DCE1EDF2FEG3GFH4HGI5IHJ6JIK7KJL8LKM9MLN:NMO;ONP<POQ=Q>QPR>S?SRT@TSUAUTVBVUWCWVXDXWYEYXZFZY[G[Z\H\[]I]\^J^]_K_^`L`_aMa`bNbacOcbdPdceQeRedfRgSgfhThgiUihjVjikWkjlXlkmYmlnZnmo[onp\poq]qpr^rqs_srt`tsuautvbvuwcwvxdxwyeyfyxzf{g{z|h|{}i}|~j~}k~€l€�m�€‚n‚�ƒoƒ‚„p„ƒ…q…„†r†…‡s‡†ˆtˆ‡‰u‰ˆŠvЉ‹w‹ŠŒxŒ‹�y�z�ŒŽz�{�Ž�|��‘}‘�’~’‘““’”€”“•�•”–‚–•—ƒ—–˜„˜—™…™˜š†š™›‡›šœˆœ›�‰�œžŠž�Ÿ‹Ÿž Œ Ÿ¡�¡Ž¡ ¢Ž£�£¢¤�¤£¥‘¥¤¦’¦¥§“§¦¨”¨§©•©¨ª–ª©«—«ª¬˜¬«­™­¬®š®­¯›¯®°œ°¯±�±°²ž²±³Ÿ³²´ ´³µ¡µ¢µ´¶¢·£·¶¸¤¸·¹¥¹¸º¦º¹»§»º¼¨¼»½©½¼¾ª¾½¿«¿¾À¬À¿Á­ÁÀ®ÂÁïÃÂİÄÃűÅÄÆ²ÆÅÇ³ÇÆÈ´ÈÇɵɶÉÈʶ˷ËÊ̸ÌË͹ÍÌκÎÍÏ»ÏÎмÐÏѽÑÐÒ¾ÒÑÓ¿ÓÒÔÀÔÓÕÁÕÔÖÂÖÕ×Ã×ÖØÄØ×ÙÅÙØÚÆÚÙÛÇÛÚÜÈÜÛÝÉÝÊÝÜÞÊßËßÞàÌàßáÍáàâÎâáãÏãâäÐäãåÑåäæÒæåçÓçæèÔèçéÕéèêÖêéë×ëêìØìëíÙíìîÚîíïÛïîðÜðïñÝñÞñðòÞóßóòôàôóõáõôöâöõ÷ã÷öøäø÷ùåùøúæúùûçûúüèüûýéýüþêþýÿëÿþìÿíîïðñòòóô õ  ö   ÷   ø   ù  ú ûüýþÿ      ! ! ""!##"$$#%%$&&%''&(('))(**)++*,,+---,.//.00/1102213324 435!546"657#768$879%98:&:9;';:<(<;=)=<>*>=?+?>@,@?A-A.A@B.C/CBD0DCE1EDF2FEG3GFH4HGI5IHJ6JIK7KJL8LKM9MLN:NMO;ONP<POQ=QPR>RQS?SRT@TSUAUBUTVBWCWVXDXWYEYXZFZY[G[Z\H\[]I]\^J^]_K_^`L`_aMa`bNbacOcbdPdceQedfRfegSgfhThgiUiVihjVkWkjlXlkmYmlnZnmo[onp\poq]qpr^rqs_srt`tsuautvbvuwcwvxdxwyeyxzfzy{g{z|h|{}i}j}|~j~k~~~l~m~n~o~p~q~r~s~t~u~v~w~x~y~z~{~|~}€�‚€‚���ƒ‚ƒ�„�…ƒ…„†„‡…‡†ˆ†‰‡‰ˆŠˆ‹‰‹Š�ŒŽŒ���ŽŽŽ���ޑޒ�’‘“‘”’”“•“–”–•—•˜–˜—™„š„›™›šœ‘�‘žœž� Ÿ¡Ÿ¢ ¢¡¤£¥£¦¤¦¥¨§©§ª¨ª©¬«­«®¬®­f16.edit´�x¤‘ªx4˜ÿÿÿ˜ÿùÿ˜ÿóÿ˜ÿíÿ˜ÿäÿ˜ÿâÿ˜ÿãÿ˜ÿêÿøÿ˜ÿôÿôÿ˜ÿûÿòÿ˜ÿòÿ˜ÿ óÿ˜ÿõÿ˜ÿýÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ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ïÿÇþ4ùÿÇþ7Çþ. Çþ#ÇþÇþÇþ Çþ¡þ¡þöÿ¡þéÿ¡þáÿ¡þÖÿ ¡þÉÿ¡þÉÿøÿ¡þÏÿîÿ¡þÓÿãÿ¡þÙÿÙÿ¡þáÿÐÿ¡þåÿ·ÿ¡þóÿ¨ÿ¡þ¨ÿ¡þ·ÿ¡þ Ðÿ¡þ(Ùÿ¡þ.ãÿ¡þ2îÿ¡þ8øÿ¡þ8¡þ+ ¡þ ¡þ¡þ¡þŸþýÿEŸþïÿCŸþáÿ>ŸþÔÿ7ŸþÍÿ*ŸþØÿŸþ)Ÿþ4*Ÿþ-7Ÿþ >ŸþCŸþE+þýÿN+þíÿK+þÞÿE+þÑÿ<+þÇÿ/+þÓÿ+þØÿ +þÉÿ+þÉÿøÿ+þÊÿìÿ+þÏÿàÿ+þÖÿÖÿ+þÞÿÌÿ+þéÿÂÿ+þöÿºÿ+þ ºÿ+þÂÿ+þ#Ìÿ+þ+Öÿ+þ2àÿ+þ7ìÿ+þ8øÿ+þ8+þ) +þ.+þ:/+þ0<+þ#E+þK+þN÷ýýÿL÷ýíÿJ÷ýÞÿE÷ýÑÿ;÷ýÇÿ/÷ýÅÿ÷ýËÿ÷ýÉÿ÷ýÉÿøÿ÷ýÊÿìÿ÷ýÏÿàÿ÷ý×ÿ×ÿ÷ýßÿÍÿ÷ýêÿÅÿ÷ý÷ÿ¿ÿ÷ý ¿ÿ÷ýÅÿ÷ý"Íÿ÷ý*×ÿ÷ý2àÿ÷ý7ìÿ÷ý8øÿ÷ý8÷ý6÷ý<÷ý:/÷ý0;÷ý#E÷ýJ÷ýLuýýÿIuýîÿGuýàÿBuýÔÿ8uýÌÿ+uýÇÿuýÅÿuýÉÿuýÇÿøÿuýÇÿëÿuýÐÿáÿuýÚÿÚÿuýãÿÒÿuýíÿÍÿuýøÿÉÿuý ÉÿuýÍÿuýÒÿuý'Úÿuý1áÿuý:ëÿuý:øÿuý8uý<uý:uý5+uý-8uý!BuýGuýIóüýÿEóüïÿDóüáÿ?óüÖÿ5óüÐÿ(óüÌÿóüÉÿóüÉÿóüÉÿøÿóüÉÿëÿóüÏÿáÿóüÙÿÙÿóüâÿÒÿóüíÿÌÿóüøÿÉÿóü ÉÿóüÌÿóüÒÿóü(Ùÿóü2áÿóü8ëÿóü8øÿóü8óü8óü5óü1(óü+5óü ?óüDóüE<üþÿ><üñÿ=<üäÿ8<üÚÿ0<üÓÿ%<üÏÿ<üÍÿ<üÉÿ<üÉÿøÿ<üÊÿìÿ<üÒÿãÿ<üÚÿÚÿ<üãÿÒÿ<üíÿÍÿ<üøÿÉÿ<ü Éÿ<üÍÿ<üÒÿ<ü'Úÿ<ü/ãÿ<ü7ìÿ<ü8øÿ<ü8<ü4<ü2<ü.%<ü'0<ü8<ü=»ûþÿ1»ûôÿ/»ûëÿ,»ûâÿ&»ûÛÿ»ûÕÿ»ûÒÿ »ûÐÿ»ûÑÿùÿ»ûÓÿïÿ»ûØÿæÿ»ûÞÿÞÿ»ûæÿØÿ»ûïÿÓÿ»ûùÿÐÿ»ûÐÿ»ûÓÿ»ûØÿ»û#Þÿ»û)æÿ»û.ïÿ»û0ùÿ»û1»û/ »û,»û&»û&»û,»û /¢ûÿÿ,¢ûõÿ+¢ûíÿ(¢ûåÿ"¢ûßÿ¢ûÙÿ¢ûÖÿ ¢ûÕÿ¢ûÕÿúÿ¢û×ÿñÿ¢ûÜÿéÿ¢ûáÿáÿ¢ûéÿÛÿ¢ûñÿ×ÿ¢ûúÿÕÿ¢ûÕÿ¢û×ÿ¢ûÛÿ¢û áÿ¢û%éÿ¢û*ñÿ¢û,úÿ¢û,¢û+ ¢û(¢û"¢û"¢û(¢û +�ûÿÿ,�ûöÿ+�ûíÿ'�ûåÿ"�ûßÿ�ûÚÿ�ûÖÿ �ûÕÿ�ûÕÿúÿ�ûØÿñÿ�ûÜÿéÿ�ûáÿáÿ�ûéÿÛÿ�ûñÿ×ÿ�ûúÿÕÿ�ûÕÿ�û×ÿ�ûÛÿ�û áÿ�û%éÿ�û)ñÿ�û,úÿ�û,�û+ �û'�û"�û"�û'�û +gûðþÉÿ�ûÉÿ:þ«ÿ�û«ÿËý�ÿ’ü�ÿïüŠþ’üŠþðþ8�û8:þV�ûVËýq’üqïüw’üweýmÿýmÿ0ýmÿ%ýmÿ"eý”ý”0ý”%ý”"         ! ! " "!# #"$ $ $#% % %$& &%''&(('))(**)++*,,+--,..-//.00/1101222332443554665776887998::9;;:<<;==<>> >!>=?"?>@#@$@?A%A&A'A@B(BAC)CBD*DCE*EDF+FEG,GFH-HGI.IHJ/JIK/KJL0LKM1ML2MN2NNO2ONO3OOP4POQ5QPR6RQS7SRT8TSU9UTV:VUW;WVX<XWY=YXZ>ZY[?[@[Z\A\[]B]\^C^]_D_^`E`_aFa`bGbacHcbdIdceJedfKfefLffgMgfNghNiOihjPjQjikRkjlRlSlkmTmlRURmSUTVXXYYZZ_]`^a_b_c`n`ncoaobonpcpoqcqdqprerfrqsfsgshsrthtsuiutvjvuwkwvxlxwymyxzRzy{S{T{z|U|{}V}|~V~}W~€X€�Y�€‚Z‚�ƒZƒ‚„[„ƒ…\…„†]†…‡^‡†ˆ_ˆ‡‰_‰ˆŠ`ŠaЉ‹b‹ŠŒcŒ‹�n�ŒŽoŽ��p�Ž�q��‘r‘t‘�’‘“t“’”u”“•v•”–w–•—x—–˜y˜z˜—™{™˜š|š™›}›šœ~œ›��œž€ž�Ÿ�Ÿž ‚ Ÿ¡‚¡ ¢ƒ¢¡£„£¢¤…¤£¥†¥¤¦‡¦¥§ˆ§¦¨‰¨§©Š©‹©¨ªŒª©«�«ª¬Ž¬«­�­¬®�®­¯‘¯’¯®°¯±’±°²“²±³”³²´•´–´³µ—µ´¶˜¶µ·™·¶¸š¸·¹›¹¸ºœº¹»�»º¼ž¼»½Ÿ½¼¾ ¾½¿ ¿¾À¡À¿Á¢ÁÀ£ÂÁäÃÂÄ¥ÄÃŦÅÄÆ§ÆÅÇ¨ÇÆÈ©ÈÇɪɫÉÈʬÊÉË­ËÊÌ®ÌËͯͰÍÌΰÎÍϱÏÎвÐÏѳÑÐÒ´ÒÑÓµÓÒÔµÔÓÕ¶ÕÔÖ·ÖÕ׸×ÖØ¹Ø×ÙºÙØÚ»ÚÙÛ¼ÛÚܽÜÛݾݿÝÜÞÀÞÝßÁßÞàÂàßáÃáàâÄâáãÅãâäÆäãåÇåäæÈæåçÈçæèÉèçéÊéèêËêéëÌëÎëêìëíÎíìîÏîíïÐïîðÑðïñÒñðòÓòñóÔóòôÕôóõÖõôö×öõ÷Ø÷öøÙø÷ùÚùÛùøúÜúùûÜûúüÝüÞüûýßýüþàþýÿáÿþâÿãäåæçèéêììì ì ì   í   î   ï  ð ñòóôõö÷øùúûüýþÿ  !! ""!##"$$#%%$   %& ' '&( (') )(* *)+ +*,,,+--,..-//.00/110221332443554665776887998::9;;:<<;== =<>!>=?"?>@#@?A$A@B%BA&&&BC&D&DCE'EDF(FEG)GFH*HGI+IHJ,JIK-KJL.LKM/MLN0NMO1ONP2POQ3QPR4R5RQS6SRT7TSU8UTV9VUW:WVX;XWY<YXZ=ZY[>[Z\?\[]@]\^A^]_B_^CCC_`C`D`E`F`G`H`I`J`K`L`M`N`O`P`Q`R`S`T`U`V`W`X`Y`Z`[`\`]`^`_bacadbdcecfdfegehfhgjikiljlkmknlnmompnporqsqtrtsvuwuxvxw>=?"?>@#@?A$A@B%BA&&&BC&D&DCE'EDF(FEG)GFH*HGI+IHJ,JIK-KJL.LKM/MLN0NMO1ONP2POQ3QPR4R5RQS6SRT7TSU8UTV9VUW:WVX;XWY<YXZ=ZY[>[Z\?\[]@]\^A^]_B_^CCC_`C`D`E`F`eÿmsetup.c´v x ¤�í# /* * setup global variables and open megatek */ #include char *Maddr; /* 7000's current address */ char *Mhaddr; /* 7000's main header address */ FILE *Mioptr; /* 7000's file pointer */ FILE *Mpioptr; /* 7000's peripherals file ptr */ char Mbuffer[MBUFSIZE]; /* buffer */ int Mfree; /* index into first free block */ int Mseg; /* the current segment number */ int Mrot; /* rotation for strings */ int Mscale; /* scale factor for characters */ int Mintsty; /* current intensity */ int Mpackflag; /* whether to increase Maddr when flushing buffer */ int Meventvalue; /* the last value seen by mevent */ struct seg_struct Msegs[MAXSEG+1]; struct save_struct Msave[MAXSEG+1]; struct block_struct Mblock[NBLOCKS]; int Mrts[2*BLOCKSIZE+1]; msetup() { register int j , *ip; register char *addr; int v[3]; if( Mioptr != NULL) /* already did setup */ return(0); if ( (Mioptr = fopen(MEGDEV,"r+w")) == NULL ) Gerror("Cannot open %s\n",SYSTEM,MEGDEV); setbuf(Mioptr , Mbuffer); if( (Mpioptr = fopen(MEGPDEV,"r+w")) == NULL ) Gerror("Cannot open %s\n",SYSTEM,MEGPDEV); /*fill the rts block structure */ ip = &Mrts[1]; for(j=0; j MAXSEG) Gerror("%s -- Illegal seg \"%d\"\n",FATAL,routine,seg); if ( (b=Msegs[ai].start) == 0) Gerror("%s -- Seg %d not defined\n",FATAL,routine,ai); if ( b < 0 ) Gerror("%s -- Invalid operation on sub %d\n",FATAL,routine,ai); return(b); } Mputw(x) { register int b; register struct seg_struct *segptr; segptr = &Msegs[Mseg]; if ( segptr->nleft-- <= 3 ){ b = segptr->end; b = Mblock[b].next = Mgetfree(); if ( b<=0) Gerror("Out of free blocks !",SYSTEM); segptr->nleft = PACKCOUNT; Maddr = Mblock[b].addr; Mpackflag = 0; /* jump to the next block */ Mput32( JMP, Maddr); mflush(); segptr->end = b; putw( Maddr , Mioptr); }else if (Mioptr->_cnt == MBUFSIZE ) putw( Maddr, Mioptr); putw( x , Mioptr); Mpackflag++; } mflush() { register FILE *iop; register char *base; register int n; iop = Mioptr; if( (base = iop->_base) != NULL && (n = iop->_ptr - base) > 0){ if ( Mpackflag ) { Maddr += (PACKCOUNT - Msegs[Mseg].nleft)/2; if(Msegs[Mseg].start == Msegs[Mseg].end) Maddr -= HDRSIZE; } Mpackflag = 0; /* don't change Maddr */ iop->_ptr = base; iop->_cnt = MBUFSIZE; /* bytes */ if( write(fileno(iop),base,n) != n) Gerror("mflush --bad write count ",SYSTEM); } } tmseg.c´Å x ¤� # /* * open a megatek segment: * * seg header: * +0 nop or an rts (for blank) * +1 dash pattern * +2 blink pattern * +3 color * +4-11 8 matrix elements * +12 matrix transformation control * +13 set absolute z * +14 blink enable/disable * +15 intensity * +16-? display (terminated with a RTS) * * */ #include mseg(i) { register int b , ai; register struct seg_struct *segptr; char *addr; if((ai=abs(i)) > MAXSEG) Gerror("mseg -- seg no. out of range \"%d\"",FATAL,ai); if( Mioptr == NULL) Gerror("Setup not called yet!",FATAL); if(ai == 0){ Mioptr == NULL; msetup(); return(0); } /* close last segment */ if(Mseg){ segptr = &Msegs[Mseg]; segptr->curx = ML.xcur; segptr->cury = ML.ycur; segptr->curz = ML.zcur; } /* be sure not jumping to this seg from the main header: */ mflush(); putw(Mhaddr+ai, Mioptr); Mput32( NOP, 0); mflush(); segptr = &Msegs[ai]; /* delete old seg */ if( (b=segptr->end)!=0 ) { Mblock[b].next = Mfree; /* link back into free list */ Mfree = segptr->start; segptr->start = segptr->end = Msave[ai].start = Msave[ai].end = 0; Mseg = 0; } if( i<0 ) return; /* only wanted to destroy it */ /* init a new seg: */ b = segptr->start = segptr->end = Mgetfree(); addr = Mblock[b].addr; /* start of seg */ Mblock[b].next = -1; /* this block not linked */ putw(addr, Mioptr); /* start send to this addr */ Mput32( NOP , 0); Mput32( 0160010 , 052525 ); /* default dash pattern */ Mput32( 0160011 , 1); /* default blink pattern */ Mput32( 0160252 , 0167); /* set color */ Mident(); /* fill 8 matrix elements with identity */ Mput32( 0160013 , 0040000); /* set matrix transform control on */ Mput32( 0177000 , 010000 ); /* set z origin */ Mput32( 0 , 0 ); /* no blinking */ Mput32( NOP | 037 , 0); /* set intensity */ Mput32( RTS, 0); /* first word in display list is a return */ mflush(); putw(Mhaddr+ai, Mioptr); /* replace nop in big header with a jsr */ Mput32( JSR, addr); mflush(); Mseg = ai; Maddr = addr + HDRSIZE; segptr->nleft = PACKCOUNT - 2*HDRSIZE + 1; Mintsty = 017; ML.xcur = ML.ycur = ML.zcur = 0; /* start at (0,0,0) */ Mputw( 0154000 );Mputw( 044000 ); /* set clipping to full screen */ Mputw( 0153777 );Mputw( 0143777 ); } mplot.c±M´x ¤�y# /* * enter a 2D coord to the megatek (use current z!): */ #include mplot(x,y,pen) register int x,y; { register struct Glocal *MLp; int flags; if(Mseg == 0) Gerror("mplot -- No seg or sub open",FATAL); MLp = &ML; flags = 0; if( MLp->relabs==ABSOLUTE ){ x -= MLp->xcur; y -= MLp->ycur; } MLp->xcur += x; MLp->ycur += y; x &= 07777; y &= 07777; if( pen < 0 ){ pen = (-pen); MLp->xcur = 0; MLp->ycur = 0; } switch(pen) { case 0: break; case 2: dosolid: flags = 0100000; /* no break */ case 3: Mputw( 0140000 | x); Mputw( 0050000 | y | flags); break; case 4: Mputw( 060000 | x); Mputw( (Mintsty<<12) | y ); Mputw( 040000 ); Mputw( Mintsty<<12 ); break; case 5: Mputw( 0140000 | x); Mputw( 0110000 | y ); break; default: Gerror("Invalid pen code \"%d\"",WARNING,pen); goto dosolid; } } 7mblink.c±ôµx ¤�þ# /* * blink or unblink a seg: */ #include mblink(i) { register int b; register char *addr; b = Mseg_ok(i, "mblink"); addr = Mblock[b].addr + 14; mflush(); putw( addr , Mioptr); Mput32( ((i>0)? 010000: 00000) , 0 ); mflush(); } mblank.c±îµx ¤�"# /* * blank or unblank a seg: */ #include mblank(i) { register int b; register char *addr; b = Mseg_ok(i,"mblank"); addr = Mblock[b].addr; mflush(); /* put a NOP or RTS in this seg's header block */ putw(addr,Mioptr); Mput32( ((i>0)? RTS: NOP) , 0); mflush(); } mdim.c±¶x ¤�A# /* * set the initial intensity for a seg: */ #include mdim(i,ints) { register int b , flag; register char *addr; b = Mseg_ok(i,"mdim"); addr = Mblock[b].addr + 15; ints=& 017; /* max intensity is 15 */ Mintsty = ints; mflush(); putw(addr,Mioptr); Mput32( NOP | 020 | ints , 0 ); mflush(); } ammove.c±7¶x ¤�D# /* * move a seg to x,y */ #include mmove(seg , x , y) { register int b; register char *addr; int tmp[2]; b = Mseg_ok(seg, "mmove"); addr = Mblock[b].addr + 6; mflush(); putw( addr , Mioptr); Mput32( 0160002 , x); mflush(); addr += 3; putw( addr , Mioptr); Mput32( 0160005 , y); mflush(); } Mgetfree.c±N´x ¤�Y# /* * return with the index of the next free Mblock: */ #include Mgetfree() { register int f; if( (f=Mfree) < 0 ) Gerror(" out of free blocks!",SYSTEM); Mfree = Mblock[f].next; Mblock[f].next = -1; Mrts[0] = Mblock[f].addr; /* fill the block with rts's */ write(fileno(Mioptr), Mrts, 4*BLOCKSIZE + 2); return(f); } }Mmsend.c±O´x ¤�y# /* * send a transformation matrix: * matrix is of the form: * * * __ __ * [x y 0 1]' = [x y z 1] * | m1 m4 ? 0 | * | m2 m5 ? 0 | * | m7 m8 ? 0 | * | m3 m6 ? 1 | * -- -- * * tricky: elements m3 and m6 are sent as 16-bit signed integers. * all others are sent by multiplying them by 2048 and converting * to a signed integer!(obviously) * */ #include /* m1 m2 m3 m4 m5 m6 m7 m8 */ int Morder[] {0 , 4 , 12 , 1 , 5 , 13 , 8 , 9}; Mmsend(m) float *m; /* a 4x4 floating matrix */ { register float *rm; register int i , j; float f; int *ip; ip = &f; rm=m; for(j=0;j<8;j++) { putw( 0160000 | j , Mioptr); f = rm[ Morder[j] ]; if( j!=2 && j!=5 ) /* ie, not m3 or m6 */ *ip=+ 02600; /* "f=* 2048." */ putw( (i=f+0.5) , Mioptr); } } iMident.c±O´x ¤�c# /* * set the given 4x4 matrix to identity: */ float Midentity[] { 1.,0.,0.,0. , 0.,1.,0.,0. , 0.,0.,1.,0. , 0.,0.,0.,1.}; ident(m) float *m; { register int *f1 , *f2; register int j; f1 = &Midentity[0]; f2 = m; j=32; while(j--) *f2++ = *f1++; } /* * send an identity matrix to the megatek: */ Mident() { Mmsend( &Midentity[0] ); } +mintsty.c±P´x ¤�ë# /* * set subsequent megatek intensities (0-15): */ #include mintsty(i) register int i; { if (Mseg == 0) Gerror(" mintsty -- no seg open ", FATAL); i &= 017; Mintsty = i; Mputw( NOP | 020 | i ); Mputw( 0 ); } 7mset.c±P´x ¤�Ÿ# /* * mset - set display parameters for the megatek */ #include mset (string, value) char *string; register int value; { register int b; register char *addr; int op , option , n; option = Gsearch(string); switch (option) { case SETSCL: if (value < 0 || value > 7) { Gerror ("mset - scale factor out of range \"%d\"", WARNING, value); break; } Mscale = value; break; case SETROT: if(value < 0 || value > 3) { Gerror ("mset - text rotation out of range \"%d\"", WARNING,value); break; } Mrot = value; break; case SETBLINK: op = 0160011; value &= 017; n = 2; goto sendit; case SETDASH: op = 0160010; n = 1; sendit: if ( Mseg < 0 ){ Gerror("mset -- no open seg ",WARNING); return; } b = Msegs[Mseg].start; addr = Mblock[b].addr + n; mflush(); putw( addr , Mioptr ); Mput32( op , value ); mflush(); break; case SETERR: Glevel = value; break; case SETABS: ML.relabs = ABSOLUTE; break; case SETREL: ML.relabs = RELATIVE; break; default: Gerror ("mset -- illegal option ignored \"%s\"\n", WARNING, string); break; } } Smxform.c±Q´x ¤� # /* * change the transformation matrix in the header of seg #seg */ #include mxform( seg, m) float *m; { register char *addr; register int b; b = Mseg_ok(seg); addr = Mblock[b].addr + 4; mflush(); putw( addr, Mioptr); Mmsend(m); mflush(); } 3mappend.c±éµx ¤�›# /* * re-open a seg */ #include mappend(i) { register int b , ai; register struct seg_struct *segptr; if(Mseg){ /* close last seg */ segptr = & Msegs[Mseg]; segptr->curx = ML.xcur; segptr->cury = ML.ycur; segptr->curz = ML.zcur; } mflush(); /* make sure buffer is empty */ if( (ai=abs(i)) == 0 || ai>MAXSEG) Gerror("mappend -- seg or sub number out of ramge",FATAL); if( i<0 ) /* append to a sub */ ai = MAXSEG+1 -ai; Mseg = ai; Mseg = ai = abs(i); segptr = &Msegs[ai]; b = segptr->end; Maddr = Mblock[b].addr + (PACKCOUNT - segptr->nleft + 1)/2; ML.xcur = segptr->curx; ML.ycur = segptr->cury; ML.zcur = segptr->curz; } mcursor.c±ýµx ¤�W# /* * attach this seg to the joystick * (does a mmove(i,x,y) before displaying sub ) */ #include mcursor(i) { register int b; register char *addr; b = Mseg_ok(i, "mcursor"); addr = Mblock[b].addr + 14; mflush(); putw( addr , Mioptr); if( i>0 ){ Mput32( JSR , JOYTRACK ); }else{ Mput32( 0 , 0 ); } mflush(); } smdir.c±Š´x ¤�T# /* * read joystick directions and return -3,-2,-1,0,1,2,3: */ #include int Mcnvrt[] { -3 , -2 , -1 , 0 , 0 , 1 , 2 , 3}; mdir(dx , dy) int *dx , *dy; { register int i; int tmp[2]; mflush(); tmp[0] = JOYSTICK; Mread( &tmp[0] , 4); i = tmp[1]; /* joystick byte */ *dx = Mcnvrt[(i>>3)&07]; *dy = Mcnvrt[i&07]; } mevent.c±¶x ¤�Í# /* * wait for any peripheral to be struck and return its word: */ #include mevent() { register int v0, Mpfd; int v[3]; mflush(); /* empty the buffer */ Mpfd = fileno(Mpioptr); v[2] = 0; v[0] = WAIT; stty(Mpfd , v); gtty(Mpfd , v); v0 = v[0]; v[0] = v[2] = 0; stty(Mpfd , v); Meventvalue = 0377 & v0; if( v0 & KEYFLAG) return( 1 ); if( v0 & JOYFLAG ) return( 4 ); if( v0 & TABLETFLAG ) return( 8 ); return( 0 ); } smgetsub.c±S´x ¤�1# /* * insert a "jsr sub#i" into the display list of the current seg. * * DANGER: this can blow up if sub#i is later deleted!! * */ #include mgetsub(i) { register char *addr; register int b , ai; if((ai=abs(i)) == 0 || ai > MAXSEG) Gerror("mgetsub -- sub no. out of range \"%d\"",FATAL,ai); if ( (b=(-Msegs[ai].start)) <= 0) Gerror("mgetsub -- \"%d\" is not a sub",FATAL,ai); if( Mseg <= 0 ) Gerror("mgetsub -- No open segment",FATAL); addr = Mblock[b].addr; Mputw( JSR ); Mputw( addr ); /* to first display command */ } tmgetxy.c±¶x ¤�Ô# /* * read the megatek joystick and return those coordinates: * (Tricky: read local tracker instead of x and y registers!) */ #include mgetxy(xp , yp , button) int *xp , *yp , *button; { register int j; int tmp[2]; mflush(); /* make sure buffer is empty */ tmp[0] = JOYTRACK; /* hide megatek address in array */ Mread( &tmp[0] , 4); for(j=0; j<=1; j++) { tmp[j]=& 07777; /* strip blank vector codes */ if( tmp[j]&04000 ) /* sign extend if necessary */ tmp[j]=| 0170000; } *xp = tmp[0]; *yp = tmp[1]; /* now pick up the button */ tmp[0] = JOYSTICK; /* hide megatek address in array */ Mread( &tmp[0] , 4); if( tmp[1]&0100 ) *button = 1; else *button = 0; Meventvalue = 0; } mkeybrd.c±T´x ¤�f# /* * read the megatek keyboard: */ #include mkeybrd(iflag) { register int v0, Mfd; int v[3]; Mfd = fileno(Mpioptr); mflush(); /* make sure buffer is empty */ if(v0=Meventvalue) return(v0); else for(;;) { gtty(Mfd , v); if( (v0=v[0]) == 0 ) return(0); if( v0&KEYFLAG ) return(v0&0377); } Meventvalue = 0; } mmark.c±1¶x ¤�¤# /* * Msave the current state of the current seg: */ #include mmark() { register struct seg_struct *segptr; register struct save_struct *saveptr; register int seg; seg = Mseg; if( seg <=0 ) Gerror(" mark -- seg not open",FATAL); mflush(); saveptr = &Msave[seg]; segptr = &Msegs[seg]; saveptr->header[0] = Mblock[ segptr->start ].addr; /* read the current file header from the Megatek */ Mread( &Msave[ seg ].header[0] , 4 * HDRSIZE); saveptr->nleft = segptr->nleft; saveptr->start = segptr->start; saveptr->end = segptr->end; saveptr->relflag = ML.relabs; saveptr->curx = ML.xcur; saveptr->cury = ML.ycur; saveptr->curz = ML.zcur; } mplot3.c±U´x ¤�Ö# /* * enter a 3D coordinate to the megatek * (coords are in integer and in the range -+2048) */ #include mplot3(x,y,z,pen) register int x,y,z; { int setnewz; if( Mseg <= 0 ) Gerror("mplot3 -- no open seg or sub",FATAL); if ( pen == 5 ){ /* kludge a point plot */ mplot3( x-1 , y-1 , z-1 , 3 ); mplot3( x , y , z , 2 ); return(0); } /* set new z */ setnewz = 0; if( ML.relabs==RELATIVE ){ if ( z != 0 ) setnewz++; }else /* absolute vectors */ if ( z != ML.zcur ) { setnewz++; z -= ML.zcur; } if(setnewz){ ML.zcur += z; Mputw( 0177100 ); Mputw( 0010000 | z); } if( pen < 0 ){ pen = (-pen); ML.zcur = 0; } /* and do a 2-D plot */ mplot( x , y , pen ); } mreset.c±U´x ¤�;# /* * return a seg to its previously marked state: */ #include mreset() { int j , k , seg; register int *addr; register struct seg_struct *segptr; register struct save_struct *saveptr; seg = Mseg; if( seg<=0 ) Gerror("reset - seg not open",FATAL); segptr = &Msegs[seg]; saveptr = &Msave[seg]; j = saveptr->end; if( j<=0 ) Gerror(" reset without a mark",FATAL); /* link leftover blocks back into the free list: */ if( Mblock[j].next>0 ) { Mblock[ segptr->end ].next = Mfree; Mfree = Mblock[j].next; } Mblock[j].next = -1; segptr->end = j; segptr->nleft = saveptr->nleft; ML.xcur = saveptr->curx; ML.ycur = saveptr->cury; ML.zcur = saveptr->curz; ML.relabs = saveptr->relflag; Maddr = addr = Mblock[j].addr + (PACKCOUNT - segptr->nleft + 1)/2; mflush(); putw( addr , Mioptr); k = (segptr->nleft)/2; for(j=0;jstart ].addr; /* seg header */ putw(addr, Mioptr); addr = &(saveptr->header[0]); for(j=0; j<2*HDRSIZE; j++) putw( *addr++ , Mioptr); mflush(); } pmstrget.c±V´x ¤�…# /* * obtain a string from the Megatek keyboard: * * The given prompt is placed at the coordinates given. * Reading continues until see a CR. * Only "max" characters allowed to be read into "array". * */ #define DEL 0177 #define BKSP 010 #define CR 015 #define KBWAIT 01 /* keyboard event occurred */ mstrget(x , y , prompt , max , array) char *prompt , *array; { register char *cp , c; cp = array; *cp = '\0'; mmark(); c = DEL; do { switch( c ) { case DEL: cp = array; *cp = '\0'; break; case BKSP: if( cp == array ) break; *--cp = '\0'; break; default: if( cp < &array[max-1] ) { *cp++ = c; *cp = '\0'; }else{ mreset(); return(0); } } mreset(); mplot(x,y,3); mstring(prompt); mstring(array); mflush(); while( (KBWAIT & mevent()) == 0) /* wait */; } while( (c=mkeybrd()) != CR); mreset(); } rmstring.c±V´x ¤�â# /* * draw a string at current location */ #define BUFLEN 200 #include mstring(format,args) char *format; { register char *rcp; register int word , count; char string[BUFLEN]; int setstring; if(Mseg==0) Gerror("mstring -- no open seg or sub",FATAL); Gsprintf(string,format,&args); setstring = 0170000 |(Mscale<<4) | (Mrot<<7); rcp = string; Mputw(setstring); ML.xcur += (12*(1+Mscale)*strlen(string)); count = 2; do{ if(Msegs[Mseg].nleft == 5){ Mputw(0); Mputw(0); Mputw(setstring); count = 2; } count++; word = (*rcp++)<<8; if(*rcp){ count++; word |= *rcp++; } Mputw( word ); } while(*rcp); count &= 03; if(count==0) Mputw( 0 ); if(count != 03) Mputw( 0 ); } mvport.c±˾x ¤�•# /* * set the screen window on the megatek: * (coords are -+ 2048) */ #include mvport(xl,yb,xr,yt) { if( Mseg == 0 ) Gerror("mvport -- no open seg or sub",FATAL); xl=& 07777; yb=& 07777; xr=& 07777; yt=& 07777; Mputw( 0150000 | xl ); Mputw( 040000 | yb ); Mputw( 0150000 | xr ); Mputw( 0140000 | yt ); ML.lvp.xl = xl; ML.lvp.yb = yb; ML.lvp.xr = xr; ML.lvp.yt = yt; } *msub.c±W´x ¤�# /* * open a megatek sub: */ #include msub(i) { register int b , ai; register struct sub_struct *subptr; char *addr; if((ai=abs(i)) == 0 || ai > MAXSEG) Gerror("msub -- sub no. out of range \"%d\"",FATAL,ai); /* close last subment */ if(Mseg){ subptr = &Msegs[Mseg]; subptr->curx = ML.xcur; subptr->cury = ML.ycur; subptr->curz = ML.zcur; } ai = MAXSEG+1 - ai; subptr = &Msegs[ai]; /* delete old sub */ if( (b=subptr->end)!=0 ) { Mblock[b].next = Mfree; /* link back into free list */ Mfree = abs(subptr->start); subptr->start = subptr->end = Msave[ai].start = Msave[ai].end = 0; Mseg = 0; } if( i<0 ) return; /* only wanted to destroy it */ /* init a new sub: */ subptr->end = b = Mgetfree(); subptr->start = (-b); Mblock[b].next = -1; /* this block not linked */ Mseg = ai; Maddr = Mblock[b].addr; subptr->nleft = PACKCOUNT; ML.xcur = ML.ycur = ML.zcur = 0; /* start at (0,0,0) */ ML.lvp.xl = ML.lvp.yb = -2048; /* initial viewport */ ML.lvp.xr = ML.lvp.yt = 2047; } mrotate.c±X´x ¤�# /* * apply a rotation to matrix m * order: ax,ay,az in degrees */ #define DTOR 0.017453 mrotate(m,ax,ay,az) float ax,ay,az, m[4][4]; { float m1[4][4]; Mrotm(m1,ax,ay,az); mmult(m,m1,m); } /* * make m a rotation matrix for concatenation with */ Mrotm(m,ax,ay,az) float ax,ay,az, m[4][4]; { float sx,cx,sy,cy,sz,cz,sin(),cos(); ax *= DTOR; ay *= DTOR; az *= DTOR; if (ax == 0.0 ) { sx=0.0; cx=1.0; } else { sx=sin(ax); cx=cos(ax); } if (ay == 0.0 ) { sy=0.0; cy=1.0; } else { sy=sin(ay); cy=cos(ay); } if (az == 0.0 ) { sz=0.0; cz=1.0; } else { sz=sin(az); cz=cos(az); } m[0][0]= cy*cz; m[0][1]= cy*sz; m[0][2]= -sy; m[0][3]= 0.; m[1][0]= -cx*sz + sx*sy*cz; m[1][1]= cx*cz + sx*sy*sz; m[1][2]= sx*cy; m[1][3]= 0.; m[2][0]= cx*sy*cz +sx*sz; m[2][1]= cx*sy*sz -sx*cz; m[2][2]= cx*cy; m[2][3]= 0.; m[3][0]= 0.; m[3][1]= 0.; m[3][2]= 0.; m[3][3]= 1.; } imtrans.c±X´x ¤�4/* * apply a translation to matrix m */ mtrans(m,sx,sy,sz) float sx,sy,sz, m[4][4]; { float m1[4][4]; Mtransm(m1,sx,sy,sz); mmult(m,m1,m); } /* * create a translation matrix for concatenation */ Mtransm(m,tx,ty,tz) float tx,ty,tz, m[4][4]; { ident(m); m[3][0]= tx; m[3][1]= ty; m[3][2]= tz; } mscale.c±Y´x ¤�&# /* * apply a scaling to m */ mscale(m,sx,sy,sz) float sx,sy,sz, m[4][4]; { float m1[4][4]; Mscalem(m1,sx,sy,sz); mmult(m,m1,m); } /* * set up a scaling matrix for concatenation */ Mscalem(m,sx,sy,sz) float sx,sy,sz, m[4][4]; { ident(m); m[0][0]= sx; m[1][1]= sy; m[2][2]= sz; } mcopy.c±Y´x ¤�Á# #include "megatek.h" /* * copy matrix 1 to matrix 2: */ mcopy(m1,m2) float *m1 , *m2; { register int *rm1 , *rm2 , n; rm1 = m1; rm2 = m2; n = 32; while( n-- ) *rm2++ = *rm1++; } smnumget.c±Z´x ¤�B# /* * mnumget - input a decimal or octal no. from the megatek */ #include #define MAXNUM 30 /* max. no. of input digits */ double mnumget (x, y, prompt, maxdig, flag) int x,y; /* x, y loc. for the input */ int maxdig; /* max. no. of input digits */ int *flag; /* return code: =0 no errors =1 invalid input syntax =2 no input received */ char *prompt; /* prompt string */ { char buffer[MAXNUM]; /* input buffer */ double input; /* input number */ double atof1(); /* convert char to no. */ /* get the character input */ if (maxdig > MAXNUM || maxdig <= 0) { Gerror ("mnumget - max. no. of input digits invalid - %d assumed", WARNING, MAXNUM); maxdig = MAXNUM; } mstrget (x, y, prompt, maxdig, buffer); input = atof1(buffer, flag); return (input); } mdata.c±Z´x ¤�6# /* * mdata - initialize structures for the Megatek graphics package */ #include struct Gworld MW = { 0.0,0.0,0.0, 0.0,0.0,0.0, 1.0, {-6.,-6.,-6.,6.,6.,6.}, }; struct Glocal ML = { 0, 0, 0, {-2048,-2048,2047,2047}, {-2048,-2048,2047,2047}, {-6.,-6.,6.,6.}, "megatek", ABSOLUTE, }; mend.c±[´x ¤�i# /* * close the megatek */ #include mend() { mflush(); fclose(Mioptr); Mioptr = 0; } doitª¡¬x í�?cc -c -O $1.c ar rv /lib/libm.a $1.o rm $1.o echo Done with $1 mtialize structures for the Megatek graphics package */ #include struct Gworld MW = { 0.0,0.0,0.0, 0.0,0.0,0.0, 1.0, eÿmappend.o´¾ x ¤� ²*Dw üÿ÷ øÿÁòÿWp BÂeòäÿòàÿòÜÿ ÷ ÒÿNß Ã% Îæ²ß Ö õ À!Àà÷ ÿNß ÷’ÿÁWp BÂe„Ád�ì� À rWt@l7dÿ·^ÿ·Zÿ· VÿwNÿmappend -- seg or sub number out of ramge‰ÙÙø   (hÙ(Ùøˆ™   ©_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mappend"~_mappencsv _i_b_ai_segptr_Mseg L4*_Msegs _ML _mflush _abs L10000@L5NL6²_Gerror L7\_Mblock _Maddr cret mblank.o±é·x ¤�Ô\üw üÿÎ\fß Ö t÷ ÞÿÎÚÿæß Ö ÎÎÿõ æ@þæþß Ö Î´ÿ& ß Ö ÷ ¨ÿw¤ÿmblank‰Øèù   ùI_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mblank"~_mblankcsv _i_b_addrL4\_Mseg_ok _Mblock _mflush _Mioptr _putw L10000>L10001Bcret mblink.o±A¸x ¤�Ø^üw üÿÎ^fß Ö tÃe÷ ÚÿÎÖÿæß Ö ÎÊÿõ æ& ß Ö Î²ÿ& ß Ö ÷ ¦ÿw¢ÿmblink‰Øèù   ùI_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mblink"~_mblinkcsv _i_b_addrL4^_Mseg_ok _Mblock _mflush _Mioptr _putw L10000BL10001Dcret mcursor.o±Џx ¤�üpüw üÿÎpfß Ö tÃe÷ ÚÿÎÖÿæß Ö õ  ÎÄÿæ€üß Ö Î¶ÿæE άÿ& ß Ö Î ÿ& ß Ö ÷ ”ÿw�ÿmcursor‰Øèù     ùI_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mcursor"~_mcursocsv _i_b_addrL4p_Mseg_ok _Mblock _mflush _Mioptr _putw L5PL20001bcret mdim.o±š¹x ¤�ìdw üÿÎdfß Ö tÂeõEðÿwÒÿ÷ ÎÿÎÊÿ¦ß Ö Î¾ÿfÎUþß Ö Î¬ÿ& ß Ö ÷  ÿwœÿmdim‰ø)9H9H9H)Y_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mdim"~_mdimcsv _i_ints_b_flag_addrL4d_Mseg_ok _Mblock _Mintsty _mflush _Mioptr _putw cret mdir.o±»¹x ¤�°TØw üÿÆå÷ ôÿõBöÿÎfÎeöÿÀàÿœ&ß –%DøÿtýÿÀEøÿÀ =TÀEøÿÀ =Tw¬ÿýÿþÿÿÿ™éù_GL _GW _Gfunc _Groutin _Glevel _Goutptr _Mcnvrt#T_mdir"~_mdircsv _dx_dy_i_tmpöÿ_mflush _Mioptr _read cret mnumget.o±D»x ¤� 8\w üÿÆå&õ% õ Îææ ß –%õ NÎeÜÿf fffß ÆeN fÎeÜÿß Ö æ¦ÿæ ÿæšÿæ”ÿµÔÿµÖÿµØÿµÚÿfÚÿfØÿfÖÿfÔÿ·pÿ·nÿ·lÿ·jÿw`ÿmnumget - max. no. of input digits invalid - %d assumed‰8HXiiiiiiiiy_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mnumget"~_mnumgecsv _x_y_prompt_maxdig _flag _bufferÜÿ_inputÔÿL10000L4.L5 _Gerror _mstrget _atof1 ac0 cret fltused faddzfsubzfmulzfdivzmstrget.o±k¼x ¤�¼– hw üÿD Š÷ òÿÕÀ�Á–7~ þyD Š÷ ÒÿÎffß –%Nß N ß ÷ ¬ÿ÷ ¨ÿÀ5û÷ žÿ�À% Ô÷ ’ÿwŽÿD- Ù$Š×@ @m À !†Ô�Í÷ nÿ ìr$|yùIXhhy™©IÉI_mstrget"L10001–L10002šL10rL9$L11|~_mstrgecsv _x_y_prompt_max _array _cp_c_mmark L6L10003L20000(L7*_mreset _mplot _mstring _mflush L14T_mevent _mkeybrd L3ncret L12Žmevent.o±ö¹x ¤�,Šw üÿÆå÷ ôÿÀðÿœ5 øÿõ€ôÿNÎeôÿæß Ö NÎeôÿæß Ö Dôÿ 5øÿ5ôÿNÎeôÿæß Ö ÀEÿ7 ÿÄ5€ ÀÀÀw†ÿÄ5@öÄ5 ö ö‰ÉÙèøè Y_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mevent"~_meventcsv _v0_Mpfd_vôÿ_mflush _Mpioptr _stty _gtty _Meventv L4zL3vL20001lL20003rcret mgetsub.o±ºx ¤�üv^Dw üÿNß Â% Žæævß –%�Wp A CŽææ›ß –%÷ ¶ÿÎæ¸ß Ö Àt΀üß ß wŠÿmgetsub -- sub no. out of range "%d"mgetsub -- "%d" is not a submgetsub -- No open segment‰Ø(Yˆ˜˜©_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mgetsub"~_mgetsucsv _i_addr_b_ai_abs L10000L4&L5v_Gerror _Msegs L6FL7›_Mseg L8ZL9¸_Mblock _Mputw cret mgetxy.o±5ºx ¤�l¤w üÿÆå÷ ôÿõEöÿÎfÎeöÿÀàÿœ&ß –% À @aðEðöÿÀ @að5öÿÀ @aðUðöÿ„ Ä%é}öÿ}øÿõBöÿÎfÎeöÿÀ„ÿœ&ß –%õ5@øÿý= 7 `ÿw\ÿ‰éùùYi_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mgetxy"~_mgetxycsv _xp_yp_button_j_tmpöÿ_mflush _Mioptr _read L20001.L6TL8˜L9œ_Meventv cret mhvport.o ¤ x ¤�hšw üÿΚfß Ö ÀtÄe õEðõEðõEð õEð ÷ Âÿξÿ&ß Ö Î²ÿfÎUÐß Ö Î ÿfÎU@ß Ö ÎŽÿf ÎUÐß Ö Î|ÿf ÎUÀß Ö ÷ jÿwfÿmhvport‰(9IXIXIXIXIX9i_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mhvport"~_mhvporcsv _seg_xl_yb_xr _yt _addr_bL4š_Mseg_ok _Mblock _Mflush _Mioptr _putw cret mintsty.o±‡ºx ¤�€8Ìw üÿD÷ ôÿÎæ8ß Ö ÄEðÿ7ÜÿÎUþß  ß wÈÿ mintsty -- no seg open ‰©Øéøø _GL _GW _Gfunc _Groutin _Glevel _Goutptr _mintsty"~_mintstcsv _i_Mseg L4L58_Gerror _Mintsty _Mputw cret mkeybrd.o±¼ºx ¤�˜Füw üÿÆåÀôÿœ÷ ìÿÄèÿNÎeôÿæß Ö Dôÿ Ä5€ñÀEÿwºÿ‰Ùéù(I_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mkeybrd"~_mkeybrcsv _iflag_v0_Mfd_vôÿ_Mpioptr _mflush _Meventv L5L3B_gtty L76cret mmark.o±ïºx ¤�pŠ w üÿÂøÿÎæŠß Ö ÷ äÿ�WpNCÃe�Wp DÄet3Î@�WpNÁefÀ¬ÿœ&ß –%3 3ó¶ÿ óˆÿó„ÿó€ÿ wvÿ mark -- seg not open‰Éø (8IXiiiiy_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mmark"~_mmarkcsv _segptr_saveptr_seg_Mseg L4L5Š_Gerror _mflush _Msave _Msegs _Mblock _Mioptr _read _ML cret mmove.o±!»x ¤�8Šw üÿÆåΊfß Ö tÃe÷ ÖÿÎÒÿæß Ö ÎÆÿæàß Ö Î¸ÿfß Ö ÷ ªÿÃe΢ÿæß Ö Î–ÿæàß Ö Îˆÿfß Ö ÷ zÿwvÿmmove‰)9H9H9H)9H9H9H)Y_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mmove"~_mmovecsv _seg_x_y_b_addr_tmpöÿL4Š_Mseg_ok _Mblock _mflush _Mioptr _putw cret mplot3.o±Ž»x ¤� ÂPw üÿDCBæ ÷ êÿÎæÂß Ö õ% ΦΠæÎ &Î ß ÆeΦæ&ß Æe 15 øÿ÷%Âÿ µ øÿÂ-Žÿµ øÿÂí„ÿõ øÿ ·`zÿÎ@þß ŽÎUß õ @ 5 7 TÿN æ&ß –%w>ÿmplot3 -- no open seg or sub‰éIIIIˆˆI¨¹_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mplot3"~_mplot3csv _x_y_z_pen _setnewzøÿ_Mseg L4&L5Â_Gerror L6\L3¾_ML L7rL9€L11œ_Mputw L12°_mplot cret mplot.o±i»x ¤�àÞ>˜w üÿDCæ ÷ îÿÎæêß Ö Â5 øÿò („âƒì aò`ÄEðÃEðõ @ 5 2 @ "‚À xÞÎU`ß Àˆÿt ÀPß Î@ß Àpÿt ÎUÀß ÎÎU�Nææß –%õ€øÿÎUÀß À@]øÿÀUPß w"ÿÚ¨ºÀj–mplot -- No seg or sub openInvalid pen code "%d"ùYˆ˜ÈÙÈÈÙȈÈÈ_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mplot"L10001ÞL3ÚL16¨L12ºL13ÀL14jL15–~_mplotcsv _x_y_pen_MLp_flagsøÿ_Mseg L4"L5ê_Gerror _ML L66L7Z_Mputw _Mintsty L20001ÔL20000ÖL17cret mreset.o±°»x ¤�Ä\,¤w üÿÆåõôÿôÿÎæ\ß Ö AôÿWp CÃeAôÿWpNBÂeµøÿÎæqß Ö @øÿtð Àtð–ÿ@øÿt7†ÿ@øÿtðÿÿsøÿ³·fÿ·bÿ· ^ÿ· |ÿÁdÁì� À rAøÿWt@l72ÿ÷ .ÿÎ*ÿ&ß Ö ÁÀ r5öÿ5 øÿÎ ÿæ@þß Ö Îüþ& ß Ö µ øÿu-öÿøÿí÷ äþÀtÎÖþ&ß Ö „Äe5 øÿÎÀþ&ß Ö µ øÿõ% øÿô÷ ¨þw¤þreset - seg not open reset without a mark‰ù(8H(x™xx™x©©©©x¹ÉÙèÙèÙèÉxÙèÙèÉ)_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mreset"~_mresetcsv _jøÿ_köÿ_segôÿ_addr_segptr_saveptr_Mseg L4L5\_Gerror _Msegs _Msave L6PL7q_Mblock L8z_Mfree _ML _Maddr _mflush _Mioptr _putw L9L20001òL20003<cret mseg.o´> x ¤�ت8w üÿæ Nß Ã% Îææªß –%÷ ÖÿÎæÌß Ö Ã ÷ ¾ÿ À÷ °ÿ _¦÷ ¦ÿÁ ÿWp BÂeò’ÿòŽÿòŠÿ ÷ €ÿÎ|ÿæxÿÎ`ß Ö Îlÿæþß Ö Î^ÿ& ß Ö ÷ RÿÁWp BÂe„tð6ÿ·0ÿÁWpNÁefÁWpN1 A^rJ7 ÿõ _¦÷ üþ2 t5øÿtðÿÿÎØþføÿß Ö ÎÊþæþß Ö Î¼þ& ß Ö Î°þæàß Ö Î¢þæUUß Ö Î”þæ àß Ö Î†þæß Ö Îxþæªàß Ö Îjþæwß Ö ÷ \þÎXþæ àß Ö ÎJþæ@ß Ö Î<þæþß Ö Î.þæß Ö Î þ& ß Ö Îþ& ß Ö Îþæþß Ö Îúý& ß Ö Îîýæ@þß Ö Îàý& ß Ö ÷ ÔýÎÐýæÌýÎ`ß Ö ÎÀýæ€üß Ö Î²ýføÿß Ö ÷ ¤ý÷ ý@øÿÀe7”ýòE÷ˆý 7†ý7€ý7zýÎØß ÎHß Îÿ×ß ÎÿÇß wVýmseg -- seg no. out of range "%d"Setup not called yet!‰è))‰©©ÈÙÙÙé)ù))éÈ)8)HHH©Y88)))))))))i))))))))))é)ù))é©y‰ÙÙÙ˜˜˜˜©_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mseg"~_msegcsv _i_b_ai_segptr_addrøÿ_abs L4&L5ª_Gerror _Mioptr L6:L7ÌL8VL10000HL10001L_msetup L3¦_Mseg L9|_Msegs _ML _mflush _Mhaddr _putw L10ö_Mfree _Mblock _Msave _Mgetfre _Mident _Maddr _Mintsty _Mputw cret mset.o±'¼x ¤�˜œ@w üÿDÆåNß 5öÿÀå l‚À xÄ Ä%ææß –%ææBö7¬ÿÄ õÄ%ò7œÿÎæiß Ö wˆÿõ àøÿÄEðÿõôÿõàøÿõôÿ÷ fÿåÁ`ÿWp CÀtBmôÿ÷ FÿÎBÿ¦ß Ö Î6ÿføÿß Ö Î(ÿ&ß Ö ÷ ÿÇ7ÿÄ7 8ÿÁ÷0ÿ½Nææ~š(úVxŠæúúìòmset - scale factor out of range "%d"mset - text rotation out of range "%d"mset -- no open seg mset -- illegal option ignored "%s" ˜è)9èi‰‰˜¨¹ÉØÉØÉعIéé_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mset"L10003L6(L20úL9VL12xL14ŠL17æL18ìL19ò~_msetcsv _string_value_b_addr_opøÿ_optionöÿ_nôÿ_Gsearch L100002L7PL8L20001<_Gerror L3tL10001DL11B_Mscale _Mrot L20004fL16icret L13–_Mseg _Msegs _Mblock _mflush _Mioptr _putw _ML L21~mstring.o±‰¼x ¤�ŒÚŒw üÿÆåÊ÷ ôÿÎæÚß Ö NÎeffÎe2ÿß –%ÀÊÿtÁÂÿWt@PÀUð50ÿDÄe2ÿß æ¤ÿŽ fÎe2ÿ÷ ˜ÿÖ VpWp w`ŠÿÂÁ‚ÿWp ñ%  ß  ß N0ÿß Â‚ •×tÌ‹‚ ÕÎß Ì‹ßÂEüÿ  ß Â% ß w&ÿmstring -- no open seg or sub‰ 8HYixY‰™ ¸xxxxxx _GL _GW _Gfunc _Groutin _Glevel _Goutptr _mstring"~_mstrincsv _format_args_rcp_word_count_string2ÿ_setstri0ÿ_Mseg L4L5Ú_Gerror _Gsprint _Mscale _Mrot _Mputw _strlen _ML L8z_Msegs L9¢L10²L11ÊL3Öcret mvport.o±żx ¤�4|ðw üÿ÷ øÿÎæ|ß Ö õEðõEðõEðõEð NÎUÐß NÎU@ß NÎUÐß N ÎUÀß w ÿwœÿw˜ÿw ”ÿw„ÿmvport -- no open seg or sub‰Ù))))9_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mvport"~_mvportcsv _xl_yb_xr_yt _Mseg L4L5|_Gerror _Mputw _ML cret mxform.o±ü¼x ¤�x<ðw üÿNß ÀtÄe÷ àÿÎÜÿ&ß Ö Nß ÷ ÈÿwÄÿ‰Øèù (ù9_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mxform"~_mxformcsv _seg_m_addr_b_Mseg_ok _Mblock _mflush _Mioptr _putw _Mmsend cret Mident.o p x ¤�¤0@´w üÿÄC € À ûwàÿw ÜÿÎß wÐÿ€@€@€@€@9ˆ¹9ˆè¹_Midenti#0_ident"~_identcsv _m_f1_f2_j_Midenti L4L20001cret _Mident" ~_Mident _Mmsend Mmsend.o @ x ¤�ˆ„Pw üÿÆå@Àeöÿ5ôÿD Îäÿ¦ÎUàß Ö €À „ta5öÿ5øÿÂ%Â%ýe€ôÿΪÿ& & føÿföÿ& æ@z÷ ’ÿƒæß Ö ‚ Â%Ìw|ÿ   ™(Y(i_GL _GW _Gfunc _Groutin _Glevel _Goutptr _Morder#„_Mmsend"~_Mmsendcsv _m_rm_i_j_föÿ_ipôÿL20001_Mioptr _putw L7Rfaddzfisdtoi cret fltused fsubzfmulzfdivzac0 mcopy.o�±¡x ¤� Ìw üÿDC € À ûwàÿ‰ _GL _GW _Gfunc _Groutin _Glevel _Goutptr _mcopy"~_mcopycsv _m1_m2_rm1_rm2_nL4L20001cret mtrans.o£Áux ¤�`žw üÿÆå@fffffffff f fffÎeºÿ÷ ÆeNfÎeºÿfß –%w¢ÿw žÿNß @p0p2@p4p6@p8p:wbÿ)˜©)©_mtrans"~_mtranscsv _m_sx_sy_sz_m1ºÿ_Mtransm"^_mmult cret ~_Mtrans^_m_tx_ty_tz_ident fltused faddzfsubzfmulzfdivzac0 mrotate.o£-vx ¤�” 4ìw üÿÆå@fffffffff f fffÎeºÿ÷ ÆeNfÎeºÿfß –%w¢ÿw žÿÆåæÐæÊæÄæ¾vvzµµ5 5 æªæ¤æžæ˜vvzµµ5 5 æ„æ~æxærvvzµµ5 5 & & & & f f ff÷ ôþ 5 öÿ5 øÿõ€@òÿ5 ôÿ2f f ff÷ ÊþÆeæÈþæÂþæ¼þæ¶þµöÿµøÿ–%f f ff÷ ˜þÆeæ–þæ�þæŠþæ„þµòÿµôÿ–%& & & & ffff÷ ^þ 5 îÿ5 ðÿõ€@êÿ5 ìÿ2ffff÷ 4þÆeæ2þæ,þæ&þæ þµîÿµðÿ–%ffff÷ þÆeæþæúýæôýæîýµêÿµìÿ–%& & & & ffff÷ Èý 5 æÿ5 èÿõ€@âÿ5 äÿ2ffff÷ žýÆeæœýæ–ýæ�ýæŠýµæÿµèÿ–%ffff÷ lýÆeæjýædýæ^ýæXýµâÿµäÿ–%& & fìÿfêÿfäÿfâÿz@ˆ°–%& & fìÿfêÿfèÿfæÿz@°°–%& & fðÿfîÿ÷ øü@°° –%@0 0 & & fôÿfòÿ÷ Îüfèÿfæÿz6 6 & & føÿföÿfðÿfîÿz6 6 fäÿfâÿz¶¶z@°°–%& & fôÿfòÿfäÿfâÿz6 6 & & føÿföÿfðÿfîÿz6 6 fèÿfæÿz¶¶z@°°–%& & føÿföÿfìÿfêÿz@°°–%@0 0 & & fôÿfòÿfðÿfîÿz6 6 fäÿfâÿz6 6 & & føÿföÿfèÿfæÿz¶¶z@° °"–%& & fôÿfòÿfðÿfîÿz6 6 fèÿfæÿz6 6 & & føÿföÿfäÿfâÿz¶¶z@°$°&–%& & fôÿfòÿfìÿfêÿz@°(°*–%@0 ,0 .@0 00 2@0 40 6@0 80 :@ð€@<0 >wÌúŽ=™ùŽ=™ùŽ=™ù)˜©)©Ùééééùéééé©Ùééééùéééé©ÙééééùééééII©_mrotate"~_mrotatcsv _m_ax_ay_az_m1ºÿ_Mrotm"^_mmult cret L100004L10001<L10002D~_Mrotm^_m_ax_ay_az_sxöÿ_cxòÿ_syîÿ_cyêÿ_szæÿ_czâÿfmulzfiscmpf L7"L8†_sin ac0 _cos L9¸L10L11NL12²fisnegf faddzfsubzfltused fdivzmscale.o£ñux ¤�\œw üÿÆå@fffffffff f fffÎeºÿ÷ ÆeNfÎeºÿfß –%w¢ÿw žÿNß @Hp@pp@p(p*wdÿ)˜©)©_mscale"~_mscalecsv _m_sx_sy_sz_m1ºÿ_Mscalem"^_mmult cret ~_Mscale^_m_sx_sy_sz_ident fltused faddzfsubzfmulzfdivzac0 msetup.o´¸ x ¤�H ÌÒüw üÿÆå÷ ôÿ _ÎÔæÌß Ö 7Úÿ ÎèææØß –%Îæ¾ÿß Ö Îûæðß Ö 7¦ÿ Îææÿß –%à Ó@þ „ Ä%2ù÷xÿ÷ °Îpÿælÿß Ö Îbÿæþß Ö ÎTÿæ$ß Ö ÎFÿæ€þß Ö Î8ÿæß Ö Î*ÿæÐß Ö Îÿæpß Ö Îÿæþß Ö Îÿ& ß Ö ÷eòþÄÎêþæþß Ö ÎÜþ& ß Ö Wp 1 „ Ä% ê÷dÀþθþæþß Ö Îªþæ@ß Ö ÷ ØÂ˜þÂe" t°Âe2t� p„ Ä%�î÷ÿÿ¦Îdþæß Ö ÎVþ& ß Ö ÎJþæß Ö ÷ xÎ8þæñÿß Ö Î*þæß Ö Îþ& ß Ö ÷ L÷ þ7 þ7 þ÷üý7 øý÷ôýòý÷ìýwèýw äýNß Ä% Nfææß ÆeWp C fææ2ß Æeà fææLß ÆeÀwxýw týÁpýWp CÃeÀó À%2ÄtÀe&÷ DýÎæoß Ö ódt7ý7 ýÎýæüß Ö Îýæýß Ö ÷ 63Àðüð%ÊÎäüæàüß Ö ÎÖüfß Ö · ÈüwÄüw Àüļü?Àà;÷ ªü!Á¤üWp ÁefÀd€çÀ r7`ˆüÁ„üWp ÁefÁvüWp ^,÷åfü7 büÌôÊŽæ�&ß –%€ Îæ„ß Ö w4ü/dev/mgr+wCannot open %s /dev/mg/dev/mgperr+wCannot open %s /dev/mgper%s -- Illegal seg "%d" %s -- Seg %d not defined %s -- Invalid operation on sub %d Out of free blocks !mflush --bad write count ‰‰‰X¨‰h™XXy‰yè‰è‰è‰è‰è‰è‰è‰è‰èy‰è‰è()‰è‰èyHHI‰è‰è‰è‰è‰è‰è¹ÉÙé‰Y( 9‰¨X(XX9‰É(H‰XHi‰è‰i艉iè‰è9‰‰É(iÉ(É(i8X9_GL _GW _Gfunc _Groutin _Glevel _Goutptr _Maddr _Mhaddr _Mioptr _Mpioptr _Mbuffer Ê_Mfree _Mseg _Mrot _Mscale _Mintsty _Mpackfl _Meventv _Msegs Œ_Msave  _Mblock @_Mrts Ê_msetup"~_msetupcsv _j_ip_addr_vôÿL4L3L6ÔL5Ì_fopen L7:L9èL8Ø_Gerror _setbuf L11ûL10ðL12nL14L13ÿL20001t_mflush"<_putw L20003L20005n_Mpackfl _ML cret _Mseg_ok"~_Mseg_o_seg_routine_ai_b_abs L10000.L27FL28L29hL302L31‚L32L_Mputw"ˆ~_Mputwˆ_x_b_segptrL36 _Mgetfre L37ÐL38oL20009L39&~_mflush<_iop_base_nL43ÈL45š_write L48„Mgetfree.o£avx ¤�ÔZäw üÿÄøÿÎæZß Ö t7Üÿtðÿÿt7ÄÿÎÊæÀ¸ÿœ&ß –%w¦ÿ out of free blocks!‰©Øè©èèùø )_GL _GW _Gfunc _Groutin _Glevel _Goutptr _Mgetfre"~_Mgetfrcsv _f_Mfree L4L5Z_Gerror _Mblock _Mrts _Mioptr _write cret mmult.o£žyx ¶�´„œ&f¦æ&f…@AÀe@Áe@wbÂÄÃ& & && ff zzÁå Ë~Áe<ÀeÀåÁ*›~BÄ ’F…„ƒ‚�€‡–%a(âÆeß_mmult"~mmultmnlabcbend„fmulzfaddzfltused ac0 msub.o±©¼x ¤�Ô"tw üÿæ Nß Ã% Îææß –%÷ ÔÿÁÎÿWp BÂeòÀÿò¼ÿò¸ÿ À!ÀàÁWp BÂe„tðŽÿŽß 7‚ÿÁWpNÁefÁWpN1 A^rJ7 \ÿõ ,÷ Rÿ2 tðÿÿ÷6ÿt7*ÿòd 7"ÿ7ÿ7ÿÀø7ÿ7ÿÀÿ7ÿ7ÿwúþmsub -- sub no. out of range "%d"‰è(99XiiiX‰˜è‰¨¨¨9ɘ9˜Ùiiiiiiié_GL _GW _Gfunc _Groutin _Glevel _Goutptr _msub"~_msubcsv _i_b_ai_subptr_addrøÿ_abs L10000L4(L5_Gerror _Mseg L6N_Msegs _ML L7¤_Mfree _Mblock _Msave L3_Mgetfre _Maddr cret mdata.o±{¹x í�Hfl€@ÀÁÀÁÀÁÀAÀAÀAøøÿÿøøÿÿÀÁÀÁÀAÀA^megatek_GL _GW _Gfunc _Groutin _Glevel _Goutptr _MW#_ML#4L1^mend.o±عx ¤�Üœw üÿ÷ øÿÎôÿß 7 ìÿwèÿ‰™©¸©É_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mend"~_mendcsv _mflush _Mioptr _fclose cret mgvport.o±Qºx ¤�ä~Øw üÿõEðõEðõEðõEð ÷ àÿÎÜÿæß Ö ÎÎÿfÎUÐß Ö Î¼ÿfÎU@ß Ö ÎªÿfÎUÐß Ö Î˜ÿf ÎUÀß Ö ÷ †ÿw‚ÿ‰éùùùùùé_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mgvport"~_mgvporcsv _xl_yb_xr_yt _b_mflush _Mioptr _putw cret mgvport.o±Qºx ¤�ä~Øw üÿõEðõEðõEðõEð ÷ àÿÎÜÿæß Ö ÎÎÿfÎUÐß Ö Î¼ÿfÎU@ß Ö ÎªÿfÎUÐß Ö Î˜ÿf ÎUÀß Ö ÷ †ÿw‰¨‰¨‰¨‰¨‰¨‰¨‰¨‰¨‰¨‰¨‰¨‰¨‰¨‰¨‰¨‰¨‰¨y‰™¨‰¨‰¨y9)9iiiiiiiI_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mseg"~_msegcsv _i_b_ai_segptr_addrøÿ_abs L10000L4(L5¬_Gerror _Mseg L6N_Msegs _ML _Mflush _Mioptr _Mhaddr _putw L7È_Mfree _Mblock _Msave L3¨_Mgetfre _Mident _Maddr _Mintsty cret mset.o¨×Qx ¤�˜œ@w üÿDÆåNß 5öÿÀå l‚À xÄ Ä%ææß –%ææBö7¬ÿÄ õÄ%ò7œÿÎæiß Ö wˆÿõ àøÿÄEðÿõôÿõàøÿõôÿ÷ fÿåÁ`ÿWp CÀtBmôÿ÷ FÿÎBÿ¦ß Ö Î6ÿføÿß Ö Î(ÿ&ß Ö ÷ ÿÇ7ÿÄ7 8ÿÁ÷0ÿ½Nææ~š(úVxŠæúúìòmset - scale factor out of range "%d"mset - text rotation out of range "%d"mset -- no open seg mset -- illegal option ignored "%s" ˜è)9èi‰‰˜¨¹ÉØÉØÉعIéé_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mset"L10003L6(L20úL9VL12xL14ŠL17æL18ìL19ò~_msetcsv _string_value_b_addr_opøÿ_optionöÿ_nôÿ_Gsearch L100002L7PL8L20001<_Gerror L3tL10001DL11B_Mscale _Mrot L20004fL16icret L13–_Mseg _Msegs _Mblock _Mflush _Mioptr _putw _ML L21~mstring.o¬æ9x ¤�ŒÚŒw üÿÆåÊ÷ ôÿÎæÚß Ö NÎeffÎe2ÿß –%ÀÊÿtÁÂÿWt@PÀUð50ÿDÄe2ÿß æ¤ÿŽ fÎe2ÿ÷ ˜ÿÖ VpWp w`ŠÿÂÁ‚ÿWp ñ%  ß  ß N0ÿß Â‚ •×tÌ‹‚ ÕÎß Ì‹ßÂEüÿ  ß Â% ß w&ÿmstring -- no open seg or sub‰ 8HYixY‰™ ¸xxxxxx _GL _GW _Gfunc _Groutin _Glevel _Goutptr _mstring"~_mstrincsv _format_args_rcp_word_count_string2ÿ_setstri0ÿ_Mseg L4L5Ú_Gerror _Gsprint _Mscale _Mrot _Mputw _strlen _ML L8z_Msegs L9¢L10²L11ÊL3Öcret mvport.o¨ûZx ¤� hÀw üÿõEðõEðõEðõEð NÎUÐß NÎU@ß NÎUÐß N ÎUÀß w´ÿw°ÿw¬ÿw ¨ÿw˜ÿ‰ØØØØééééù_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mvport"~_mvportcsv _xl_yb_xr_yt _Mputw _ML cret mxform.o Bx ¤�x<ðw üÿNß ÀtÄe÷ àÿÎÜÿ&ß Ö Nß ÷ ÈÿwÄÿ‰Øèù (ù9_GL _GW _Gfunc _Groutin _Glevel _Goutptr _mxform"~_mxformcsv _seg_m_addr_b_Mseg_ok _Mblock _Mflush _Mioptr _putw _Mmsend cret Mident.o p x ¤�¤0@´w üÿÄC € À ûwàÿw ÜÿÎß wÐÿ€@€@€@€@9ˆ¹9ˆè¹_Midenti#0_ident"~_identcsv _m_f1_f2_j_Midenti L4L20001cret _Mident" ~_Mident _Mmsend Mmsend.o @ x ¤�ˆ„Pw üÿÆå@Àeöÿ5ôÿD Îäÿ¦ÎUàß Ö €À „ta5öÿ5øÿÂ%Â%ýe€ôÿΪÿ& & føÿföÿ& æ@z÷ ’ÿƒæß Ö ‚ Â%Ìw|ÿ   ™(Y(i_GL _GW _Gfunc _Groutin _Glevel _Goutptr _Morder#„_Mmsend"~_Mmsendcsv _m_rm_i_j_föÿ_ipôÿL20001_Mioptr _putw L7Rfaddzfisdtoi cret fltused fsubzfmulzfdivzac0 mcopy.o�±¡x ¤� Ìw üÿDC € À ûwàÿ‰ _GL _GW _Gfunc _Groutin _Glevel _Goutptr _mcopy"~_mcopycsv _m1_m2_rm1_rm2_nL4L20001cret mtrans.o£Áux ¤�`žw üÿÆå@fffffffff f fffÎeºÿ÷ ÆeNfÎeºÿfß –%w¢ÿw žÿNß @p0p2@p4p6@p8p:wbÿ)˜©)©_mtrans"~_mtranscsv _m_sx_sy_sz_m1ºÿ_Mtransm"^_mmult cret ~_Mtrans^_m_tx_ty_tz_ident fltused faddzfsubzfmulzfdivzac0 mrotate.o£-vx ¤�” 4ìw üÿÆå@fffffffff f fffÎeºÿ÷ ÆeNfÎeºÿfß –%w¢ÿw žÿÆåæÐæÊæÄæ¾vvzµµ5 5 æªæ¤æžæ˜vvzµµ5 5 æ„æ~æxærvvzµµ5 5 & & & & f f ff÷ ôþ 5 öÿ5 øÿõ€@òÿ5 ôÿ2f f ff÷ ÊþÆeæÈþæÂþæ¼þæ¶þµöÿµøÿ–%f f ff÷ ˜þÆeæ–þæ�þæŠþæ„þµòÿµôÿ–%& & & & ffff÷ ^þ 5 îÿ5 ðÿõ€@êÿ5 ìÿ2ffff÷ 4þÆeæ2þæ,þæ&þæ þµîÿµðÿ–%ffff÷ þÆeæþæúýæôýæîýµêÿµìÿ–%& & & & ffff÷ Èý 5 æÿ5 èÿõ€@âÿ5 äÿ2ffff÷ žýÆeæœýæ–ýæ�ýæŠýµæÿµèÿ–%ffff÷ lýÆeæjýædýæ^ýæXýµâÿµäÿ–%& & fìÿfêÿfäÿfâÿz@ˆ°–%& & fìÿfêÿfèÿfæÿz@°°–%& & fðÿfîÿ÷ øü@°° –%@0 0 & & fôÿfòÿ÷ Îüfèÿfæÿz6 6 & & føÿföÿfðÿfîÿz6 6 fäÿfâÿz¶¶z@°°–%& & fôÿfòÿfäÿfâÿz6 6 & & føÿföÿfðÿfîÿz6 6 fèÿfæÿz¶¶z@°°–%& & føÿföÿfìÿfêÿz@°°–%@0 0 & & fôÿfòÿfðÿfîÿz6 6 fäÿfâÿz6 6 & & føÿföÿfèÿfæÿz¶¶z@° °"–%& & fôÿfòÿfðÿfîÿz6 6 fèÿfæÿz6 6 & & føÿföÿfäÿfâÿz¶¶z@°$°&–%& & fôÿfòÿfìÿfêÿz@°(°*–%@0 ,0 .@0 00 2@0 40 6@0 80 :@ð€@<0 >wÌúŽ=™ùŽ=™ùŽ=™ù)˜©)©Ùééééùéééé©Ùééééùéééé©ÙééééùééééII©_mrotate"~_mrotatcsv _m_ax_ay_az_m1ºÿ_Mrotm"^_mmult cret L100004L10001<L10002D~_Mrotm^_m_ax_ay_az_sxöÿ_cxòÿ_syîÿ_cyêÿ_szæÿ_czâÿfmulzfiscmpf L7"L8†_sin ac0 _cos L9¸L10L11NL12²fisnegf faddzfsubzfltused fdivzmscale.o£ñux ¤�\œw üÿÆå@fffffffff f fffÎeºÿ÷ ÆeNfÎeºÿfß –%w¢ÿw žÿNß @Hp@pp@p(p*wdÿ)˜©)©_mscale"~_mscalecsv _m_sx_sy_sz_m1ºÿ_Mscalem"^_mmult cret ~_Mscale^_m_sx_sy_sz_ident fltused faddzfsubzfmulzfdivzac0 msetup.oªQ­x ¤�„ èÚðw üÿÆåÎðæèß Ö 7æÿ Îææôß –%ÎæÊÿß Ö Îæ ß Ö 7²ÿ Î+ææß –%à Ó@þ „ Ä%2ù÷„ÿ÷ ØÎ|ÿæxÿß Ö Înÿæþß Ö Î`ÿæ$ß Ö ÎRÿæ€þß Ö ÎDÿæß Ö Î6ÿæÐß Ö Î(ÿæpß Ö Îÿæþß Ö Î ÿ& ß Ö ÷eþþÄÎöþæþß Ö Îèþ& ß Ö Wp 1 „ Ä% ê÷dÌþÎÄþæþß Ö Î¶þæ@ß Ö ÷ ¤þÂe" t°Âe2t� p„ Ä%�î÷ÿÿ²Îpþæß Ö Îbþ& ß Ö ÎVþæß Ö ÷  ÎDþæñÿß Ö Î6þæß Ö Î(þ& ß Ö ÷ t÷þ7 þ7 þ÷þ7 þ÷þý÷úýøý÷òý÷6þ7 þÀø7ðý7êýÀÿ7èý7âýwÌýw ÈýNß Ä% Nfææ>ß ÆeWp C N&ææVß Æeà N&ææpß ÆeÀw\ýw XýÁTýWp CÃeÀó À%2ÄtÀe&÷ (ýÎæ“ß Ö ódt7ý7 þüÎúüæüß Ö Îìüæèüß Ö ÷ 63ÀÔüð%ÊÎÈüæÄüß Ö Îºüfß Ö · ¬üw¨üw ¤üÄ ü?Àà;÷ Žü!ÁˆüWp ÁefÀd€çÀ r7`lüÁhüWp ÁefÁZüWp ^,÷åJü7 FüÌôÊŽæ�&ß –%€ Îæ¨ß Ö wü/dev/mgr+wCannot open %s /dev/mg/dev/mgperr+wCannot open %s /dev/mgperMegatekIllegal seg "%d" -- %s Seg %d not defined -- %s Invalid operation on sub %d -- %s Out of free blocks !Mflush --bad write count ™‰H¨‰X™Hhy‰y؉؉؉؉؉؉؉؉Øy‰Ø‰Ø()‰Ø‰ØyHHI‰Ø‰Ø‰Ø‰Ø‰Ø‰Ø¹ÉÙé I‰YX YYYYYY)™˜H(HH)™É(HyHHi ‰Ø‰i؉‰iØ‰Ø )™‰ É(iÉ(É(i (H)_GL _GW _Gfunc _Groutin _Glevel _Goutptr _Maddr _Mhaddr _Mioptr _Mpioptr _Mbuffer Ê_Mfree _Mseg _Mrot _Mscale _Mintsty _Mpackfl _Meventv _Msegs Œ_Msave  _Mblock @_ML *_Mrts Ê_msetup"~_msetupcsv _j_ip_addr_vôÿL5ðL4è_fopen L6.L8L7ô_Gerror _setbuf L10L9 L11bL13+L12L20001h_Mflush"X_putw L20003L20005b_Mpackfl L236cret _Mseg_ok"4~_Mseg_o4_seg_routine_ai_b_abs L10000JL27bL28>L29„L30VL31žL32p_Mputw"¤~_Mputw¤_x_b_segptrL36(_Mgetfre L37ìL38“L200094L39B~_MflushX_iop_base_nL43äL45¶_write L48¨Mgetfree.o£avx ¤�ÔZäw üÿÄøÿÎæZß Ö t7Üÿtðÿÿt7ÄÿÎÊæÀ¸ÿœ&ß –%w¦ÿ out of free blocks!‰©Øè©èèùø )_GL _GW _Gfunc _Groutin _Glevel _Goutptr _Mgetfre"~_Mgetfrcsv _f_Mfree L4L5Z_Gerror _Mblock _Mrts _Mioptr _write cret mmult.o£žyx ¶�´„œ&f¦æ&f…@AÀe@Áe@wbÂÄÃ& & && ff zzÁå Ë~Áe<ÀeÀåÁ*›~BÄ ’F…„ƒ‚�€‡–%a(âÆeß_mmult"~mmultmnlabcbend„fmulzfaddzfltused ac0 msub.o¥^–x ¤�Äþ"tw üÿæ Nß Ã% Îææþß –%÷ ÔÿÁÎÿWp BÂeòÀÿò¼ÿò¸ÿ ÁWp BÂe„tð–ÿŽß 7ŠÿÁWpTÁefÁWpT1 A^rJ7 dÿõ ,÷ Zÿ2 tðÿÿ÷>ÿt72ÿòd 7*ÿ7$ÿ7ÿÀø7ÿ7ÿÀÿ7ÿ7ÿwÿmsub -- sub no. out of range "%d"‰è(99XiiiX‰˜è‰¨¨¨9ɘ9˜Ùiiiiiiié_GL _GW _Gfunc _Groutin _Glevel _Goutptr _msub"~_msubcsv _i_b_ai_subptr_addrøÿ_abs L10000L4(L5þ_Gerror _Mseg L6N_Msegs _ML L7œ_Mfree _Mblock _Msave L3ú_Mgetfre _Maddr cret 9ɘ9˜Ùiiiiiiié_GL _GW _Gfunc _Groutin _Glevel _Goutptr _msub"~_msubcsv _i_b_ai_subptr_addrøÿ_abs L10000L4(L5þ_Gerror _Mseg L6N_Msegs _ML L7œ_M0@´w üÿÄC € À ûwàÿw ÜÿÎß wÐÿ€@€@€@€@9ˆ¹9ˆè¹_Midenti#0_ident"~_identcsv _m_f1_f2_j_Midenti L4L20001cret _Mident" ~_Mident _Mmsend Mmsend.o @ x ¤�ˆ„Pw üÿÆå@Àeöÿ5ôÿD Îäÿ¦ÎUàß Ö €À „ta5öÿ5øÿÂ%Â%ýe€ôÿΪÿ& & føÿföÿ& æ@z÷ ’ÿƒæß Ö ‚ Â%Ìw|ÿ   ™(Y(i_GL _GW _Gfunc _Groutin _Glevel _Goutptr _Morder#„_Mmsend"~_Mmsendcsv _m_rm_i_j_föÿ_ipôÿL20001_Mioptr _putw L7Rfaddzfisdtoi cret fltused fsubzfmulzfdivzac0 mcopy.o�±¡x ¤� Ìw üÿDC € À ûwàÿ‰ _GL _GW _Gfunc _Groutin _Glevel _Goutptr _mcopy"~_mcopycsv _m1_m2_rm1_rm2_nL4L20001cret mtrans.o£Áux ¤�`žw üÿÆå@fffffffff f fffÎeºÿ÷ ÆeNfÎeºÿfß –%w¢ÿw žÿNß @p0p2@p4p6@p8p:wbÿ)˜©)©_mtrans"~_mtranscsv _m_sx_sy_sz_m1ºÿ_Mtransm"^_mmult cret ~_Mtrans^_m_tx_ty_tz_ident fltused faddzfsubzfmulzfdivzac0 mrotate.o£-vx ¤�” 4ìw üÿÆå@fffffffff f fffÎeºÿ÷ ÆeNfÎeºÿfß –%w¢ÿw žÿÆåæÐæÊæÄæ¾vvzµµ5 5 æªæ¤æžæ˜vvzµµ5 5 æ„æ~æxærvvzµµ5 5 & & & & f f ff÷ ôþ 5 öÿ5 øÿõ€@òÿ5 ôÿ2f f ff÷ ÊþÆeæÈþæÂþæ¼þæ¶þµöÿµøÿ–%f f ff÷ ˜þÆeæ–þæ�þæŠþæ„þµòÿµôÿ–%& & & & ffff÷ ^þ 5 îÿ5 ðÿõ€@êÿ5 ìÿ2ffff÷ 4þÆeæ2þæ,þæ&þæ þµîÿµðÿ–%ffff÷ þÆeæþæúýæôýæîýµêÿµìÿ–%& & & & ffff÷ Èý 5 æÿ5 èÿõ€@âÿ5 äÿ2ffff÷ žýÆeæœýæ–ýæ�ýæŠýµæÿµèÿ–%ffff÷ lýÆeæjýædýæ^ýæXýµâÿµäÿ–%& & fìÿfêÿfäÿfâÿz@ˆ°–%& & fìÿfêÿfèÿfæÿz@°°–%& & fðÿfîÿ÷ øü@°° –%@0 0 & & fôÿfòÿ÷ Îüfèÿfæÿz6 6 & & føÿföÿfðÿfîÿz6 6 fäÿfâÿz¶¶z@°°–%& & fôÿfòÿfäÿfâÿz6 6 & & føÿföÿfðÿfîÿz6 6 fèÿfæÿz¶¶z@°°–%& & føÿföÿfìÿfêÿz@°°–%@0 0 & & fôÿfòÿfðÿfîÿz6 6 fäÿfâÿz6 6 & & føÿföÿfèÿfæÿz¶¶z@° °"–%& & fôÿfòÿfðÿfîÿz6 6 fèÿfæÿz6 6 & & føÿföÿfäÿfâÿz¶¶z@°$°&–%& & fôÿfòÿfìÿfêÿz@°(°*–%@0 ,0 .@0 00 2@0 40 6@0 80 :@ð€@<0 >wÌúŽ=™ùŽ=™ùŽ=™ù)˜©)©Ùééééùéééé©Ùééééùéééé©ÙééééùééééII©_mrotate"~_mrotatcsv _m_ax_ay_az_m1ºÿ_Mrotm"^_mmult cret L100004L10001<L10002D~_Mrotm^_m_ax_ay_az_sxöÿ_cxòÿ_syîÿ_cyêÿ_szæÿ_czâÿfmulzfiscmpf L7"L8†_sin ac0 _cos L9¸L10L11NL12²fisnegf faddzfsubzfltused fdivzmscale.o£ñux ¤�\œw üÿÆå@fffffffff f fffÎeºÿ÷ ÆeNfÎeºÿfß –%w¢ÿw žÿNß @Hp@pp@p(p*wdÿ)˜©)©_mscale"~_mscalecsv _m_sx_sy_sz_m1ºÿ_Mscalem"^_mmult cret ~_Mscale^_m_sx_sy_sz_ident fltused faddzfsubzfmulzfdivzac0 msetup.oªQ­x ¤�„ èÚðw üÿÆåÎðæèß Ö 7æÿ Îææôß –%ÎæÊÿß Ö Îæ ß Ö 7²ÿ Î+ææß –%à Ó@þ „ Ä%2ù÷„ÿ÷ ØÎ|ÿæxÿß Ö Înÿæþß Ö Î`ÿæ$ß Ö ÎRÿæ€þß Ö ÎDÿæß Ö Î6ÿæÐß Ö Î(ÿæpß Ö Îÿæþß Ö Î ÿ& ß Ö ÷eþþÄÎöþæþß Ö Îèþ& ß Ö Wp 1 „ Ä% ê÷dÌþÎÄþæþß Ö Î¶þæ@ß Ö ÷ ¤þÂe" t°Âe2t� p„ Ä%�î÷ÿÿ²Îpþæß Ö Îbþ& ß Ö ÎVþæß Ö ÷  ÎDþæñÿß Ö Î6þæß Ö Î(þ& ß Ö ÷ t÷þ7 þ7 þ÷þ7 þ÷þý÷úýøý÷òý÷6þ7 þÀø7ðý7êýÀÿ7èý7âýwÌýw ÈýNß Ä% Nfææ>ß ÆeWp C N&ææVß Æeà N&ææpß ÆeÀw\ýw XýÁTýWp CÃeÀó À%2ÄtÀe&÷ (ýÎæ“ß Ö ódt7ý7 þüÎúüæüß Ö Îìüæèüß Ö ÷ 63ÀÔüð%ÊÎÈüæÄüß Ö Îºüfß Ö · ¬üw¨üw ¤üÄ ü?Àà;÷ Žü!ÁˆüWp ÁefÀd€çÀ r7`lüÁhüWp ÁefÁZüWp ^,÷åJü7 FüÌôÊŽæ�&ß –%€ Îæ¨ß Ö wü/dev/mgr+wCannot open %s /dev/mg/dev/mgperr+wCannot open %s /dev/mgperMegatekIllegal seg "%d" -- %s Seg %d not defined -- %s Invalid operation on sub %d -- %s Out of free blocks !Mflush --bad write count ™‰H¨‰X™Hhy‰y؉؉؉؉؉؉؉؉Øy‰Ø‰Ø()‰Ø‰ØyHHI‰Ø‰Ø‰Ø‰Ø‰Ø‰Ø¹ÉÙé I‰YX YYYYYY)™˜H(HH)™É(HyHHi ‰Ø‰i؉‰iØ‰Ø )™‰ É(iÉ(É(i (H)_GL _GW _Gfunc _Groutin _Glevel _Goutptr _Maddr _Mhaddr _Mioptr _Mpioptr _Mbuffer Ê_Mfree _Mseg _Mrot _Mscale _Mintsty _Mpackfl _Meventv _Msegs Œ_Msave  _Mblock @_ML *_Mrts Ê_msetup"~_msetupcsv _j_ip_addr_vôÿL5ðL4è_fopen L6.L8L7ô_Gerror _setbuf L10L9 L11bL13+L12L20001h_Mflush"X_putw L20003L20005b_Mpackfl L236cret _Mseg_ok"4~_Mseg_o4_seg_routine_ai_b_abs L10000JL27bL28>L29„L30VL31žL32p_Mputw"¤~_Mputw¤_x_b_segptrL36(_Mgetfre L37ìL38“L200094L39B~_MflushX_iop_base_nL43äL45¶_write L48¨Mgetfree.o£avx ¤�ÔZäw üÿÄøÿÎæZß Ö t7Üÿtðÿÿt7ÄÿÎÊæÀ¸ÿœ&ß –%w¦ÿ out of free blocks!‰©Øè©èèùø )_GL _GW _Gfunc _Groutin _Glevel _Goutptr _Mgetfre"~_Mgetfrcsv _f_Mfree L4L5Z_Gerror _Mblock _Mrts _Mioptr _write cret mmult.o£žyx ¶�´„œ&f¦æ&f…@AÀe@Áe@wbÂÄÃ& & && ff zzÁå Ë~Áe<ÀeÀåÁ*›~BÄ ’F…„ƒ‚�€‡–%a(âÆeß_mmult"~mmultmnlabcbend„fmulzfaddzfltused ac0 msub.o¥^–x ¤�Äþ"tw üÿæ Nß Ã% Îææþß –%÷ ÔÿÁÎÿWp BÂeòÀÿò¼ÿò¸ÿ ÁWp BÂe„tð–ÿŽß 7ŠÿÁWpTÁefÁWpT1 A^rJ7 dÿõ ,÷ Zÿ2 tðÿÿ÷>ÿt72ÿòd 7*ÿ7$ÿ7ÿÀø7ÿ7ÿÀÿ7ÿ7ÿwÿmsub -- sub no. out of range "%d"‰è(99XiiiX‰˜è‰¨¨¨9ɘ9˜Ùiiiiiiié_GL _GW _Gfunc _Groutin _Glevel _Goutptr _msub"~_msubcsv _i_b_ai_subptr_addrøÿ_abs L10000L4(L5þ_Gerror _Mseg L6N_Msegs _ML L7œ_Mfree _Mblock _Msave L3ú_Mgetfre _Maddr cret 9ɘ9˜Ùiiiiiiié_GL _GW _Gfunc _Groutin _Glevel _Goutptr _msub"~_msubcsv _i_b_ai_subptr_addrøÿ_abs L10000L4(L5þ_Gerror _Mseg L6N_Msegs _ML L7œ_M6 6 æŠæ„z6 6 fðÿfîÿz6 6 æ^æXz¶¶zµòÿµôÿµöÿµøÿføÿföÿfôÿfòÿ·P·N·L·JwÔü¦€ æÌæL& ¦z¦6 6 ‡·÷ XÖ þ·ü¦¦€ 6 Ž öÌöLÎ5€ÿ¡ 6 öe€õŽ]& ¦z6 6 ®·ªv�ÁE€WtùÿÁå˜f�6€ÀE€ÿÀU€vÖ €  € v�6€d¶¶¶z �Æe× ÿÿ‡Æe× ‡Æe× ‡·0Î €Æe× ÿÿ ŽUŽUŽUÖÖ  ö &À€6x€‡†TflBNo seg open -- mplotInvalid pen code "%d"mseg -- seg no. out of range "%d"€@€@€@€@   /dev/mgr+wCannot open %s /dev/mg/dev/mgperr+wCannot open %s /dev/mgperMegatekIllegal seg "%d" -- %s Seg %d not defined -- %s Out of free blocks !Mflush --bad write count out of free blocks!  %s error îdÔoàx®f¼excŠs®l®LöuÔrúDØOäX U(null)arwd~P=P=(& ‰‰‰‰œ?‰‰É@ÚOLX2–ËxØÖIàäXÇ]DøLÎçÇIfNGbÜDK§rMegatekIllegal seg "%d" -- %s Seg %d not defined -- %s Out of free blocks !Mflush --bad write count out of free blocks!  %s error îdÔoàx®f¼excŠs®l®LöuÔrúDØOäX U(null)arwd~P=P=‚¦0 ð€&Ð 6÷ ß 8‰w _Ä÷ LÎß šNÎeºÿß ‚õ€Å¶ÿ5 ¸ÿ& & & & & & f¸ÿf¶ÿ& & f¸ÿf¶ÿfÎeºÿ÷ hÆe& & & æA& & & æA& & & æAfÎeºÿ÷  ÆeÄÀ 7ŽWpw‚õ€Å¶ÿ5 ¸ÿÃÃ%v7álÀ r7a\÷Z\÷RTÎæLæJß Î–%&& ææß Æe && æß ÌÆe &æ& æß Æe  && æß ÌÆe  && ææß Æe && æß ÌÆe &æ& æß Æe&& æß ÌÆeƒ ‡NÎeºÿæß FÖ wpÆåD_ w X@AÁ 1`6@ AÁ 1`6Îæ@æ>ß Î–%w0æw DC B ZÄ VŽæff&Î ß Æe€ æffß ÌÆe΀ &ff&Î ß Æe ÀÀ &ffß ÌÆeÀ ¦ff&Î ß ÆeŽæffß ÌÆeŽæff&Î ß Æewh¥w VDCÆå÷ ˆÎæŽß  Ö Âlò („âƒì aò`ÄEðÃEð5 øÿ@ #‚À x‚Ànt 5öÿÎU`ß ü ÎN]öÿß ü Î@ß ü Nöÿ ÎUÀß ü ÎÎU�Nææ£ß  –%õU€øÿÎUÀß ü À@]øÿÀUPß ü wšw Šæ Nß PÃ% Îææºß  –%÷ ¤ÁžWp BÂe˜ò’òŽòŠ ÷ ÄÎ4æ2Î`ß ˜ Ö Î$æþß ˜ Ö Î& ß ˜ Ö ÷ –ÁWp BÂe˜„tðò,!·ìÁWpTÁej'fÁWpT1 l'Al'^rJ7 õ _B÷ ®2 t5*!øÿtðÿÿ,!Î�føÿß ˜ Ö Î‚æþß ˜ Ö Ît& ß ˜ Ö Îhæàß ˜ Ö ÎZæUUß ˜ Ö ÎLæ àß ˜ Ö Î>æß ˜ Ö Î0æªàß ˜ Ö Î"æwß ˜ Ö ÷ ’Îæ àß ˜ Ö Îæ@ß ˜ Ö ÎôæØß ˜ Ö ÎææHß ˜ Ö ÎØæÿ×ß ˜ Ö ÎÊæÿÇß ˜ Ö Î¼æþß ˜ Ö Î®æß ˜ Ö Î & ß ˜ Ö Î”& ß ˜ Ö Îˆæþß ˜ Ö Îz& ß ˜ Ö Înæ@þß ˜ Ö Î`& ß ˜ Ö ÷ àÎPæNÎ`ß ˜ Ö Î@æ€üß ˜ Ö Î2føÿß ˜ Ö ÷ °÷f@øÿÀe7.,ò;÷z 7N7H7BÀø7B7<Àÿ7:74wîw ÞNß ¦ Àt*!Äe÷ Jκ&ß ˜ Ö Nß ²÷ 2w²w ¢ÄÜC € À ûw’w ‚ÎÜß ²w‚w rÆå@Àeöÿ5ôÿD ÎV¦ÎUàß ˜ Ö €À ta5öÿ5øÿÂ%Â%ýe€ôÿÎ& & føÿföÿ& æ@z÷ Jƒæß ˜ Ö ‚ Â%Ìwþw îÆå@fffffffff f fffÎeºÿ÷ ÆeNfÎeºÿfß x –%w w �Nß ‚@Hp@pp@p(p*wbw RÆå@fffffffff f fffÎeºÿ÷ ÆeNfÎeºÿfß x –%ww ôNß ‚@p0p2@p4p6@p8p:wÄw ´ÆåÎ4æ,ß ü Ö 7š ÎHææ8ß  –%ÎB2æ~ß è Ö Î[æPß ü Ö 7‚) Îoææ_ß  –%Ã3 Ó@þ „ Ä%2ù÷:÷ ÀÎ0æ.ß ˜ Ö Î"æþß ˜ Ö Îæ$ß ˜ Ö Îæ€þß ˜ Ö Îøæß ˜ Ö ÎêæÐß ˜ Ö ÎÜæpß ˜ Ö ÎÎæþß ˜ Ö ÎÀ& ß ˜ Ö ÷e´ÄΪæþß ˜ Ö Îœ& ß ˜ Ö Wp ñÿÿ˜„ Ä% é÷_òÎvæþß ˜ Ö Îhæ@ß ˜ Ö ÷ æÂXÂe" t°*!Âe2t� p,!„ Ä%�î÷ÿÿjÎ"æß ˜ Ö Î& ß ˜ Ö Îæß ˜ Ö ÷ †Îöæñÿß ˜ Ö Îèæß ˜ Ö ÎÚ& ß ˜ Ö ÷ Z÷Ì7 7 ¨(÷¤(7 ¢(÷†÷¬¶÷l¨÷z 7 Àø7ê7äÀÿ7â7ÜwŽw ~Nß PÄ% Nfææ‚ß  ÆeWp C˜ N&ææšß  ÆeÀw8w (ÁfWp CÃe˜Àó À%2ÄtÀe,!&÷ îÎæ´ß  Ö ó_t7*!è&7 ¶'ÎÆæüß ˜ Ö Î¸æÎ&ß ˜ Ö ÷ 63À ð%ÈΔæª&ß ˜ Ö Î†fß ˜ Ö · d'w„w tÄl.Àà*÷ F'ÁšWp ÁeœfÀ_€çÀ r7`R&7 'ÌôÈŽæ�&ß ø–%€ ÎæÉß  Ö ww ÄÎæäß  Ö t7,!ætðÿÿ,!t7*!¸&ÎÊæ3À¾œ&ß ø–%w¼&f¦æ&f…@AÀe@Áe@wF+ÂÄÃ& & && ff zzÁå Ë~Áe<ÀeÀåÁ+›~BÄ ’F…„ƒ‚�€‡–%a(âÆeßw ( ÷  ffß Ø–%wòw DÄ%ÎÊß P!ÎtæèÎe&æüß –%ÎtfÎefß –%Ît& æ ß –%Ä%뫧 ö÷ vÎß 8÷ ² wœ w Œ DC ó ;‘‹ Î&ß Ö ó tøÿ;�‹ Îtøÿ&ß Ö wN ßw < Dô ôµß ªôÅ tôÕ 4 w ã7´) ÷ª)7Ò)7Ð)7Î)7Ì)÷ Á Ó•-�Ó•0÷ ŒC~Áz) Ó•. Ó•0Á …~÷ nC~‡7Z) ÷P)7x)7v)7t)7r)÷ ¶Á Ó•-÷ <Ó•.Á()Á ÷ ,C~Ó•e �Ó•- Ó•+ r Àe0�Áe0S�‡”À ó•0ÿÿ‡f…¦w)w)wþ(w ú(w Â(÷ 8f…¦wÜ(wØ(wÔ(w Ð(w ˜(÷ ½}‚…‡÷€(7 z(&æ& ä(ž(Á˜(À’(!ÀE€ÿÀU€÷ ÊÄ€(Ä ŠÄÄå€÷ "Î ÷ °Ä ù÷ ÆŽ ÷ ¢Ä ù÷ 8„ üÄæ7÷ ø&tôÿÀEðÿÀe0�€ÀEð!8ð‡Àæ7Àmö'÷ ð'€c 8† æ7‡’ÃeÈ�¢9 È•0 æ7ƒ ŠöÈ•1Ž À¼'÷ ¶'€c 8† æ7‡0Šæ7‚ƒ„ ÷ Ä'€� Àæ7‡ †÷ ŒÄ ù ‡÷ ˆ„ ù‡w ' r &@Á�'r&@�r(@ÁrP r€ € �à —vA `B A €@ ‡÷ &&f¦æ÷ ÷ ƒeB A @ ‚eA @ �e@ €e‡Ã B A @ ‡¡    ‡w " ÆåŒuöÿDƒAöÿB”— %“�ùuöÿÆ €f& æà&÷ üÆe wæ ƒ5 ôÿ5 ðÿõ îÿW¯öÿ-µ öÿµ ôÿW¯öÿ0õ0îÿ÷Šuøÿ5 òÿ .÷xuðÿÁ B�w6 ùJ@Ÿöÿµ öÿ o x d uõ öÿ  ÂÀ �    € Ó•- f&@ðÿEwÀ Ó•0÷ „…S r@A r‚ À � �à€ fÄ ÷ Ôÿ€Àe0 9Àe'�‡õ îÿÀEÿ,�*õ îÿAðÿƒÂLƒŒÒ‹ƒ D~@ðÿBòÿ÷ vû@ðÿ€ õ òÿÀÂ÷ ¸û5öÿw:þ‚ƒàAøÿÁà õ ôÿ fîÿffæ¦÷ <Æe w þ5 òÿ @Ÿöÿµ öÿÀå0 úÿ ‚µ òÿWp `ìÀe0ƒw æDCB Yõ +Ì¥-õ%0 ò •ÀEÿ:�Š Ž•&ÎEÿß Ö Ã ò z� Š Žf ß Ö µ Òà ò •ÀEÿ:�Š Ž•&ÎEÿß Ö ëõ ò z� Š Žf ß Ö õ ìw2¦w D_ðôµ€ôÕôÅôµu�öÿõøÿNøÿfÎeöÿ�&ß ø–%4 ?'Ä%lÀ� ß rÀ ôÕÖôÜ3ÌÜ3ÐÎß pôôÕÄôÕ µøÿÂàµøÿ ÌŽæ�&ß ø–%ôÿS�̵ øÿôÕ Àÿÿ@wDÆå�w .D&�ÀEùÿÀ%ÀàÌôŽæ�&ß ø–%€ ôÕ Àÿÿ wèÙw Ö ÄdÄ-¨ ƒß pÄe÷wÆòw ´D.Ãÿÿôµƒôµ@ß ö�ß ¸À Ãÿÿôµß ªôµ 4 ôÅÿ4 Àw^Ñw LD_ÊÄ  _Æ@ð¥+ À@Ÿ;Îfß ÌÖ ;à ÎÎfß lÖ  ÷% Îfß ÌÖ Î& æ ¦ß ìÆeà Î fß lÖ   $ÁT7Ò þy  4 ´�à ôÕ€ ý¥rôÕôÕwjŒw XDζ&ß ÎÖ õ  à Îß ¸Î&ß lÖ Àw*åw ÄdôµƒÄ-â‚ Äeôwþíf…÷ þ@‰f……‡€ ‡�Ñ ÉE€À:PPPP‡w ´÷ ¢ À8ÀU7” À8ÀU7Š ÷8ˆ ÷8€ AÁe vÿÿBÄl 7 n Ì5ÌË5û€À aÀ ‡€À a!RƒÄEÄ ç‡Ã-4 Ä%8 w:· & ÷% Ø�ÁeÀ rt 7  ß ŠÀþÀ À`Àe€À á‚ÀîÀ ß ŠÃ%ÿÿ×ÿÖÀÒÀeÀ ÀÀU?ÀÀÀÀ À`Àeþÿ 7®À8ÀU?¢™€À a7” †÷ŒŽ?†À‚ÀU Àe¦w zDÃå÷bÀÀE wlw \DÆåô5þÿß ªþÿá@€ r5ôÿNß p!Àw*5øÿõöÿA� vÿÿBB-ôÿ ƒµôÿ }øÿöÿõeöÿõeøÿ@ôÿõ ôÿÀ ñ!Ûƒ€À À`!Ö‚�Á Á`á@€ rÀ À`ȲÉw ²ÆåNÎeôÿfß šÖ À  w Àûf…@w`‰†wh …‡f…@‰†wR …‡f…w4w0‰ †w2…‡w 8õ õ õ%ÿÿ õ  N ffß Ô–%õ% @tAWt÷ÿÁE€ÿ@PN Îe&fß Ô–%À ÀÿÿwÖÎfÎEþÓf…wœw˜‰†w”…‡f…÷ˆ„wm~‡‰†wtÀpwmj…‡f…wZ‰†wRwL …‡f…@w<w8‰†w( …‡f…@ww‰"†w…‡7¾ÀÿÿF…‡@…&æ¦È B„ƒ‚F…‡¦€ æÌæL& ¦z¦6 6 ‡·¸÷ XÖ ®·¬¦¦€ 6 Ž öÌöLÎ5€ÿ¡ 6 öe€õŽ]& ¦z6 6 ^·Zv�ÁE€WtùÿÁå˜f�6€ÀE€ÿÀU€vÖ €  € v�6€¶¶¶z �Æe× ÿÿ‡Æe× ‡Æe× ‡·àÎ €Æe× ÿÿÐŽUŽUŽUÖÀÖ ºö &À€6x€‡–dv|$RNo seg open -- mplotInvalid pen code "%d"mseg -- seg no. out of range "%d"€@€@€@€@   /dev/mgr+wCannot open %s /dev/mg/dev/mgperr+wCannot open %s /dev/mgperMegatekIllegal seg "%d" -- %s Seg %d not defined -- %s Out of free blocks !Mflush --bad write count out of free blocks!  %s error êdÐoÜxªf¸etc†sªlªLòuÐröDÔOàXU(null)arw` zÞ5Þ5 ‰‰‰‰*8‰‰crt0.ostartsierp.o~_main_h_i_mºÿ_offset¶ÿ~_lineÌ_d1_d2_h1_h2 ~_curve_j_d1_d2_h1_h2faddzfsubzfmulzfdivzmplot.oÎ~_mplotÎ_x_y_pen_MLp_flagsøÿ_intsöÿmseg.oš~_msegš_i_b_ai_segptr_addrøÿmxform.oF~_mxformF_seg_m_addr_bMident.o‚~_ident‚_m_f1_f2_j~_Mident¢Mmsend.o²~_Mmsend²_m_rm_i_j_föÿ_ipôÿfaddzfsubzfmulzfdivzscaleit.6~_scalei6_m_sx_sy_sz_m1ºÿfaddzfsubzfmulzfdivzscalem.o”~_scalem”_m_sx_sy_szfaddzfsubzfmulzfdivztransit.Ò~_transiÒ_m_sx_sy_sz_m1ºÿfaddzfsubzfmulzfdivztransm.o0~_transm0_m_tx_ty_tzfaddzfsubzfmulzfdivzmsetup.op~_msetupp_j_ip_addr_vôÿ~_Mseg_o¦ _seg_routine_ai_b~_Mputwü _x_b_segptr~_Mflush° _iop_base_nMgetfree ~_Mgetfr _fmmult.ox ~mmultx mnlabcbendà7fmulzfaddzfopen.oü ~_fopenü _file_modeGerror.o ~_Gerror _errmsg_errtype_args_errputw.o˜ ~_putw˜ _i_iopsetbuf.oè ~_setbufè _iop_buffltpr.o,_ndigitä7ac08fcvtdmovedigðecvt^eflagâ7scaledÂnormVmul10Âdiv10trightöbufæ7buftop8done$leftìsavedr18doprnt.owidthøÿformpöÿrjustôÿndfndòÿndigitðÿzfillîÿloopgnum swtab prbufÚdecimalêoctalÐhexÜfloatªscien¸charactstring†longorunªunsignedòremoteÐlongöloctÔlhexàlunsignecomputenulstrLprstrÜstrout.o>~__strou>_string_count_adjust_file_fillch flsbuf.o~__flsbu_c_iop_base_n_rnøÿ_c1öÿ~_fflushö_iop_base_n~__cleanN_iop~_fclosep_iop_rendopen.Ø~__endopØ_file_mode_iop_rw_f_createÌ~_createÌ_file_rw_ffindiop. ~__findi _iopdata.o8cuexit.o8abort.oFiotabs.oPmalloc.op_allocs8_allocp8_alloct 8_allocx"8~mallocpnbytespqnwtemp$8~freeªapp~reallocÈpnbytesqsøÿtöÿnwonwôÿisatty.or~_isattyr_f_ttybôÿgtty.ošclose.o¸creat.oÎlseek.oì~lseekìfp ro0o1open.olsbrk.oŠndseek.oÔwrite.oøcerror.ocsv.o(fis.oBfsubzreturn(8savr5$Þ7_exit"8_main"_GL$(_GW$*_Gfunc$,_Groutin$._Glevel#ú_Goutptr$0_pos0$2_pos$6csv"(_msetup"p_mseg"š_ident"‚_transit"Ò_scaleit"6_mplot"Î_curve"_line"Ì_mxform"Fcret"4fltused",ac0$:_Mseg$j_Gerror" _ML$l_Mintsty$–_Mputw"ü _abs"P_Msegs$˜_Mflush"° _Mioptr$$!_Mhaddr$&!_putw"˜ _Mfree$(!_Mblock$*!_Msave$j'_Mgetfre" _Mident"¢_Maddr$>2_Mseg_ok"¦ _Mmsend"²_Midenti#Ü_Morder#fisdtoi"j_scalem"”_mmult"x _transm"0_Mpioptr$@2_Mbuffer$B2_Mrot$ 3_Mscale$3_Mpackfl$3_Mrts$3_fopen"ü _setbuf"è _write"ø__findio" __endope"Ø__iob#d__doprnt"_fflush"ö_abort"F__flsbuf"_free"ªpfloat",pscien"†_ecvt"þ_fcvt"(__strout">_isatty"r__sobuf$Ü3_malloc"p__cleanu"N__lastbu#_fclose"p_close"¸_open"l_errno$Ü5_lseek"ì_creat"Î__sibuf$Þ5_fabs"Z_sbrk"Š_realloc"È_gtty"šcerror"_seek"Ô_end$*8_brk"´fisitod"Bfisdtol"Êfisltod"xfiscmpf"fiststf"Dfisnegf"ns$3_fopen"ü _setbuf"è _write"ø__findio" __endope"Ø__iob#d__doprnt"_fflush"ö_abort"F__flsbuf"_free"ªpfloat",#include /* * draw sierpinski curves on the megatek */ #define n 5 /* order of the curve */ #define h0 2048 /* resolution */ #define X 1 #define Y 0 int pos0[2],pos[2]; main() { register int h , i; float m[4][4]; float offset; msetup(); mseg(1); ident(m); offset = -h0/2; transit(m,offset,offset,0.); scaleit(m,2.0,2.0,2.0); h = h0/4; pos0[X]=2*h; pos0[Y] = 3*h; offset = -h0/2; for(i=1;i<=n;i++){ pos0[X] -= h; h = h/2; pos0[Y] += h; pos[X] = pos0[X]; pos[Y] = pos0[Y]; mplot(pos[X],pos[Y],3); curve(i,X,Y,h,h); line(X,Y,h,-h); curve(i,Y,X,-h,h); line(X,Y,-h,-h); curve(i,X,Y,-h,-h); line(X,Y,-h,h); curve(i,Y,X,h,-h); line(X,Y,h,h); } mxform(1,m); /* sleep(3); for(;;){ rotit(m,0.,0.,30.); scaleit(m,0.95,0.95,0.95); mxform(1,m); } */ } line(d1,d2,h1,h2) { pos[d1] += h1; pos[d2] += h2; mplot(pos[X],pos[Y],2); } curve(j,d1,d2,h1,h2) register int j , h1 , h2; { if(j>0){ curve(j-1,d1,d2,h1,h2); line(d1,d2,h1,-h2); curve(j-1,d2,d1,-h2,h1); /* rotate -pi/2 */ line(d1,d2,2*h1,0); curve(j-1,d2,d1,h2,-h1); /* rotate +pi/2 */ line(d1,d2,h1,h2); curve(j-1,d1,d2,h1,h2); } } -h,h); curve(i,Y,X,h,-h); line(X,Y,h,h); } mxform(1,m); /* sleep(3); for(;;){ rotit(m,0.,0.,30.); scaleit(m,0.95,0.95,0.95); mxform(1,m); } */ } line(d1,d2,h1,h2) { pos[d1] += h1; pos[d2] += h2; mplot(pos[X],pos[Y],2); } curve(j,d1,d2,h1,h2) register int j , h1 , h2; { if(j>0){ curve(j-1,d1,d2,h1,h2); line(d1,d2,h1,-h2); curve(j-1,d2,d1,-h2,h1); /¶”w üÿ_¬÷ ôÿÎß NÎeºÿß õ€Å¶ÿ5 ¸ÿ& & & & & & f¸ÿf¶ÿ& & f¸ÿf¶ÿfÎeºÿ÷ ®ÿÆe& & & æA& & & æA& & & æAfÎeºÿ÷ ‚ÿÆeÄÀ 7tÿWpwhÿõ€Å¶ÿ5 ¸ÿÃÃ%v7áRÿÀ r7aBÿ÷@ÿ>ÿ÷8ÿ6ÿÎæ.ÿæ,ÿß –%&& ææß îÆe && æß ´Æe &æ& æß îÆe  && æß ´Æe  && ææß îÆe && æß ´Æe &æ& æß îÆe&& æß ´Æeƒ ‡NÎeºÿæß Ö wTþÆåD_w Hþ@AÁ 1`@ AÁ 1`Îæ"þæ þß –%wþæw þDC B ZÄ VŽæff&Î ß îÆe€ æffß ´Æe΀ &ff&Î ß îÆe ÀÀ &ffß ´ÆeÀ ¦ff&Î ß îÆeŽæffß ´ÆeŽæff&Î ß îÆewLý¥©(8IYiiiiiyiyyyˆÈé©xxyyˆé©é_GL _GW _Gfunc _Groutin _Glevel _Goutptr _pos0 _pos _main"~_maincsv L1¬L2_h_i_mºÿ_offset¶ÿ_msetup _mseg _ident _transit _scaleit L4¦L5˜_mplot _curve"î_line"´L6”_mxform L3¨cret ~_line´_d1_d2_h1_h2 L7ìL8ºL9è~_curveî_j_d1_d2_h1_h2L10´L11L13°L12°fltused faddzfsubzfmulzfdivzac0 _h_i_mºÿ_offset¶ÿ_msetup _mseg _ident _transit _scaleit L4¦L5˜_mplot _curve"î_line"´L6”_mxform L3¨cret ~_line´_d1_d2_h1_h2 L7ìL8ºL9è~_curveî_j_d1_d2_h1_h2L10´L11L13°L12°fltused faddzfsubzfmulzfdivf¼ö¸ ð€&Ð 6÷ ß ‰w ðd÷ „Îß FÎæ0øæ0øß z–%Îæ0øæÐß z–%ÎæÐæÐß z–%ÎæÐæ0øß z–%Îæ0øæ0øß z–%Îß FÎß èÎ& & ß z–%Î& æèß z–%Îæèæèß z–%Îæè& ß z–%Î& & ß z–%w2›w ÷ ôÎffß ÜÖ Nß 4÷ ÁWp BÂe.„Κænß J Ö Áa�ìÀ rWt@l¼7tŽt&¼æbærß J Æe·’"·Ž"· Š"wžw ŽDCÆå÷ žÎæˆß Ð Ö Âü#ò („âƒì aò`ÄEðÃEð5 øÿ@ #‚À x|ÀR"t 5öÿÎU`ß 2ÎN]öÿß 2Î@ß 2Nöÿ ÎUÀß 2ÎÎU�Nææ�ß Ð –%õU€øÿÎUÀß 2À@]øÿÀUPß 2wÒw Âæ Nß 4Ã% Îææ´ß Ð –%÷ ºÁ´Wp BÂe.òv!òr!òn! ÷ LÎŒ!æŠ!Î`ß | Ö Î|!æþß | Ö În!& ß | Ö ÷ ÁWp BÂe.„tðJ!¾·D!ÁWpTÁe.$fÁWpT1 0$A0$^rJ7 õ _î÷ 82 t5¼øÿtðÿÿ¾Îè føÿß | Ö ÎÚ æþß | Ö ÎÌ & ß | Ö ÎÀ æàß | Ö Î² æUUß | Ö Î¤ æ àß | Ö Î– æß | Ö Îˆ æªàß | Ö Îz æwß | Ö ÷ VÎh æ àß | Ö ÎZ æ@ß | Ö ÎL æØß | Ö Î> æHß | Ö Î0 æÿ×ß | Ö Î" æÿÇß | Ö Î æþß | Ö Î æß | Ö Îø& ß | Ö Îì& ß | Ö Îàæþß | Ö ÎÒ& ß | Ö ÎÆæ@þß | Ö Î¸& ß | Ö ÷ hΨæ¦Î`ß | Ö Î˜æ€üß | Ö ÎŠføÿß | Ö ÷ 8÷|@øÿÀe7þò=÷^ 727,7&Àø7&7 Àÿ77w&w ÄÖC € À ûww öÎÖß "wöw æÆå@Àeöÿ5ôÿD Îê¦ÎUàß | Ö €À ta5öÿ5øÿÂ%Â%ýe€ôÿΰ& & føÿföÿ& æ@z÷ ¾ƒæß | Ö ‚ Â%Ìwrw bÆåÎ.æ&ß ® Ö 7h ÎBææ2ß Ð –%Î4/æLß Ì Ö ÎUæJß ® Ö 7>) ÎiææYß Ð –%Ã0 Ó@þ „ Ä%2ù÷÷ ¾Îþæüß | Ö Îðæþß | Ö Îâæ$ß | Ö ÎÔæ€þß | Ö ÎÆæß | Ö Î¸æÐß | Ö Îªæpß | Ö Îœæþß | Ö ÎŽ& ß | Ö ÷e‚ÄÎxæþß | Ö Îj& ß | Ö Wp ñÿÿ.„ Ä% é÷aRÎDæþß | Ö Î6æ@ß | Ö ÷ äÂ&Âe" t°¼Âe2t� p¾„ Ä%�î÷ÿÿÆÎðæß | Ö Îâ& ß | Ö ÎÖæß | Ö ÷ „ÎÄæñÿß | Ö Î¶æß | Ö Î¨& ß | Ö ÷ X÷š7 –7 b(÷^(7 \(÷J÷zz÷ü#l÷tf7 dÀø7D7>Àÿ7<76w<w ,Nß 4Ä% Nfææ|ß Ð ÆeWp C. N&ææ”ß Ð ÆeÀwæw ÖÁòWp CÃe.Àó À 2ÄtÀe¾&÷ ðÎæ®ß Ð Ö óat7¼07 r'Ζæüß | Ö Îˆæß | Ö ÷ 63Àpð%ÈÎdæòß | Ö ÎVfß | Ö · 'w4w $Ä</ÂàÂ%*÷ 'Á&Wp Áe2fÀa€çÀ r7`˜7 Ú&ÌôÈŽæ�&ß Ü–%€ ÎæÃß Ð Ö wÄw ´ÄÐÎæÞß Ð Ö t7¾´tðÿÿ¾t7¼r&ÎÊæ0ÀŒœ&ß Ü–%wjw Z ÷ 8 ffß ¼–%wJòw 8DÄ%Îß 4!Înæ0Îe&æöß æ –%ÎnfÎefß æ –%În& æß æ –%Ä%Îüß Ú÷ ¾Îß ÷ ä wÎ w ¾ ÎffÎefß æ –%÷µ Àÿÿ wž êw Œ DC ó ;‘‹ Î&ß èÖ ó tøÿ;�‹ Îtøÿ&ß èÖ wN ßw < Dô ôµß ŽôÅ tôÕ 4 w ã7¾) ÷´)7Ü)7Ú)7Ø)7Ö)÷ Á Ó•-�Ó•0÷ ŒC~Á„) Ó•. Ó•0Á …~÷ nC~‡7d) ÷Z)7‚)7€)7~)7|)÷ ¶Á Ó•-÷ <Ó•.Á2)Á ÷ ,C~Ó•e �Ó•- Ó•+ r Àe0�Áe0S�‡”À ó•0ÿÿ‡f…¦w)w )w)w )w Ì(÷ 8f…¦wæ(wâ(wÞ(w Ú(w ¢(÷ ½}‚…‡÷Š(7 „(&æ& î(¨(Á¢(Àœ(!ÀE€ÿÀU€÷ ÊÄŠ(Ä ŠÄÄå€÷ "Î ÷ °Ä ù÷ ÆŽ ÷ ¢Ä ù÷ 8„ üÄÔ4÷ ø&tôÿÀEðÿÀe0�€ÀEð!ü4ð‡ÀÔ4Àm(÷ ú'€c ü4† Ô4‡’ÃeÈ�¢9 È•0 Ô4ƒ ŠöÈ•1Ž ÀÆ'÷ À'€c ü4† Ô4‡0ŠÔ4‚ƒ„ ÷ Î'€� ÀÔ4‡ †÷ ŒÄ ù ‡÷ ˆ„ ù‡wª' r &@Áš'r&@�r(@ÁrP r€ € �à —vA `B A €@ ‡÷ &&f¦æ÷ ÷ ƒeB A @ ‚eA @ �e@ €e‡Ã B A @ ‡¡    ‡w " ÆåŒuöÿDƒAöÿB”— %“�ùuöÿÆ €f& æà&÷ üÆe wæ ƒ5 ôÿ5 ðÿõ îÿW¯öÿ-µ öÿµ ôÿW¯öÿ0õ0îÿ÷Šuøÿ5 òÿ .÷xuðÿÁB�w6 ùJ@Ÿöÿµ öÿ o x d uõ öÿ  ÂÀ �    € Ó•- f&@ðÿEwÀ Ó•0÷ „…S r@A r‚ À � �à€ fÄ ÷ Ôÿ€Àe0 9Àe'�‡õ îÿÀEÿ,�*õ îÿAðÿƒÂFƒŒÒ‹ƒ D~@ðÿBòÿ÷ vû@ðÿ€ õ òÿÀÂ÷ ¸û5öÿw:þ‚ƒàAøÿÁà õ ôÿ fîÿffæ¦÷ <Æe w þ5 òÿ @Ÿöÿµ öÿÀå0 úÿ ‚µ òÿWp `ìÀe0ƒw æDCB Yõ +Ì¥-õ%0 ò •ÀEÿ:�Š Ž•&ÎEÿß èÖ Ã ò z� Š Žf ß èÖ µ Òà ò •ÀEÿ:�Š Ž•&ÎEÿß èÖ ëõ ò z� Š Žf ß èÖ õ ìw2¦w D_Ôôµ€ôÕôÅôµu�öÿõøÿNøÿfÎeöÿ�&ß Ü–%4 ?'Ä%fÀ�# ß VÀ ôÕÖôÌ0ÌÌ0ÐÎß TôôÕÄôÕ µøÿÂàµøÿ ÌŽæ�&ß Ü–%ôÿS�̵ øÿôÕ Àÿÿ@wDÆå�w .D&�ÀEùÿÀ%ÀàÌôŽæ�&ß Ü–%€ ôÕ Àÿÿ wèÙw Ö Ä^Ä-¾ ƒß TÄe÷wÆòw ´D.Ãÿÿôµƒôµ@ß Ú�ß œÀ Ãÿÿôµß Žôµ 4 ôÅÿ4 Àw^Ñw LD_®Ä  _ª@ð¥+ À@Ÿ;Îfß °Ö ;à ÎÎfß PÖ  ÷%¬Îfß °Ö Î& æ ¦ß ÐÆeà Î fß PÖ   $ÁN7è þy  4 ´�à ôÕ€ ý¥rôÕôÕwjŒw XDζ&ß ²Ö õ  à Îß œÎ&ß PÖ Àw*åw Ä^ôµƒÄ-ø‚ Äeôwþíf…÷ þ@‰f……‡€ ‡�Ñ ÉE€À/PPPP‡w ´÷ ¬ À 5ÀU7ž À5ÀU7” ÷ 5’ ÷5Š AÁe vÿÿBÄv 7 x Ì5ÌË5û€À aÀ ‡€À a!RƒÄEÄ ç‡Ã-> Ä%5 w:· 0 ÷%* Ø�ÁeÀ rt 7  ß nÀ À À`Àe€À á‚ÀøÀ ß nÃ%ÿÿ×ÿàÀÜÀeÀ ÀÀU?ÊÀÊÀ À`Àeþÿ 7¸À5ÀU?¬™€À a7ž †÷–˜?�ÀŒÀU Àe¦w zDÃå÷lÀÀE wlw \DÆåô5þÿß Žþÿá@€ r5ôÿNß T!Àw*5øÿõöÿA� vÿÿBB-ôÿ ƒµôÿ }øÿöÿõeöÿõeøÿ@ôÿõ ôÿÀ ñ!Ûƒ€À À`!Ö‚�Á Á`á@€ rÀ À`ȼÉw ²ÆåNÎeôÿfß ~Ö À  w Àûf…@wv‰†wh …‡f…@‰†wR …‡f…wJwF‰†w2…‡w 8õ õ õ%ÿÿ õ  N ffß ¸–%õ% @tAWt÷ÿÁE€ÿ@PN Îe&fß ¸–%À ÀÿÿwÖÎfÎEþÓf…w²w®‰ †w”…‡f…÷žšwm”‡‰†wtÀ†wm€…‡f…wp‰†wRwb …‡f…@wRwN‰†w( …‡f…@w4w0‰†w…‡7ÊÀÿÿF…‡@…&æ¦È B„ƒ‚F…‡¦€ æÌæL& ¦z¦6 6 ‡·Â÷ XÖ ¸·¶¦¦€ 6 Ž öÌöLÎ5€ÿ¡ 6 öe€õŽ]& ¦z6 6 h·dv�ÁE€WtùÿÁå˜f�6€ÀE€ÿÀU€vÖ €  € v�6€¶¶¶z �Æe× ÿÿ‡Æe× ‡Æe× ‡·êÎ €Æe× ÿÿÚŽUŽUŽUÖÊÖ Äö &À€6x€‡mappend%o %o %o %o B"(ÐþNo seg open -- mplotInvalid pen code "%d"mseg -- seg no. out of range "%d"€@€@€@€@   /dev/mgr+wCannot open %s /dev/mg/dev/mgperr+wCannot open %s /dev/mgperMegatekIllegal seg "%d" -- %s Seg %d not defined -- %s Out of free blocks !Mflush --bad write count out of free blocks!  %s error Îd´oÀxŽfœeXcjsŽlŽLÖu´rÚD¸OÄXìU(null)arwþDî^Î2Î2þ ‰‰‰‰5‰‰crt0.ostartt.o~_main_i_jmappend.è~_mappenè_i_b_ai_segptrmplot.oz~_mplotz_x_y_pen_MLp_flagsøÿ_intsöÿmseg.oF~_msegF_i_b_ai_segptr_addrøÿMident.oò~_identò_m_f1_f2_j~_MidentMmsend.o"~_Mmsend"_m_rm_i_j_föÿ_ipôÿfaddzfsubzfmulzfdivzmsetup.o¦~_msetup¦_j_ip_addr_vôÿ~_Mseg_oÜ_seg_routine_ai_b~_Mputw2_x_b_segptr~_Mflushä_iop_base_nMgetfreeT ~_MgetfrT _ffopen.o® ~_fopen® _file_modeGerror.oÐ ~_GerrorÐ _errmsg_errtype_args_errprintf.oJ ~_printfJ _fmt_argsputw.o| ~_putw| _i_iopsetbuf.oÌ ~_setbufÌ _iop_buffltpr.o _ndigitÒ4ac0þ4fcvtH movedigÔ ecvtB eflagÐ4scaled¦ norm: mul10¦ div10X rightÚ bufÔ4buftopü4done leftÐ savedr15doprnt.oæ widthøÿformpöÿrjustôÿndfndòÿndigitðÿzfillîÿloopø gnumîswtabprbuf¾decimalÎoctal´hexÀfloatŽscienœcharacXstringjlongorunŽunsignedÖremote´longÚloct¸lhexÄlunsigneìcomputeônulstrFprstrÀstrout.o"~__strou"_string_count_adjust_file_fillch flsbuf.oè~__flsbuè_c_iop_base_n_rnøÿ_c1öÿ~_fflushÚ_iop_base_n~__clean2_iop~_fcloseT_iop_rendopen.¼~__endop¼_file_mode_iop_rw_f_create°~_create°_file_rw_ffindiop.ð~__findið_iopdata.ocuexit.oabort.o*iotabs.o4malloc.oT_allocs5_allocp 5_alloct5_allocx5~mallocTnbytespqnwtemp5~freeŽapp~realloc¬pnbytesqsøÿtöÿnwonwôÿisatty.oV~_isattyV_f_ttybôÿgtty.o~close.oœcreat.o²lseek.oÐ~lseekÐfp ro0o1open.oPsbrk.onndseek.o¸write.oÜcerror.oþcsv.o fis.o&fsubzreturn5savr5$Î4_exit"_main"csv" _msetup"¦_mseg"F_mplot"z_mappend"ècret"_GL$"_GW$$_Gfunc$&_Groutin$(_Glevel#ô_Goutptr$*_Mflush"ä_Mseg_ok"Ü_abs"4_Mseg$,_Msegs$._Maddr$º_printf"J _Mblock$¼_ML$ü#_Gerror"Ð _Mintsty$&$_Mputw"2_Mioptr$($_Mhaddr$*$_putw"| _Mfree$,$_Msave$.$_Mgetfre"T _Mident"_Midenti#Ö_ident"ò_Mmsend""_Morder#fisdtoi"Nfltused" ac0$/_Mpioptr$2/_Mbuffer$4/_Mrot$ü/_Mscale$þ/_Mpackfl$0_Mrts$0_fopen"® _setbuf"Ì _write"Ü__findio"ð__endope"¼__iob#^__doprnt"æ _fflush"Ú_abort"*__flsbuf"è_free"Žpfloat" pscien"j _ecvt"â _fcvt" __strout""_isatty"V__sobuf$Ì0_malloc"T__cleanu"2__lastbu#þ_fclose"T_close"œ_open"P_errno$Ì2_lseek"Ð_creat"²__sibuf$Î2_fabs">_sbrk"n_realloc"¬_gtty"~cerror"þ_seek"¸_end$5_brk"˜fisitod"&fisdtol"®fisltod"\fiscmpf"øfiststf"(fisnegf"Rs$0_fopen"® _setbuf"Ì _write"Ü__findio"ð__endope"¼__iob#^__doprnt"æ _fflush"Ú_abort"*__flsbuf"è_free"Žpfloat" pscien"j _ecvt"â _fcvt" __strout""_isatty"V__sobuf$Ì0_malloc"T__cleanu"2__lastbu#þ_fclose"T_closemain() { register int i,j; msetup(); mseg(1); mplot(-2000,-2000,3); mplot(2000,-2000,2); mplot(2000,2000,2); mplot(-2000,2000,2); mplot(-2000,-2000,2); mseg(2); mappend(1); mplot(0,0,3); mplot(1000,0,2); mplot(1000,1000,2); mplot(0,1000,2); mplot(0,0,2); } "Ü__findio"ð__endope"¼__iob#^__doprnt"æ _fflush"Ú_abort"*__flsbuf"è_free"Žpfloat" pscien"j _ecvt"â _fcvt" __strout""_isatty"V__sobuf$Ì0_malloc"T__cleanu"2__lastbu#þ_fclose"T_close mseg( iseg ) Purpose: Initialize or destroy a megatek segment. Argument: iseg ... the segment number. Notes: If iseg is positive, the seg is initialized and opened. If iseg is negative, the seg is destroyed. side effects. e definition of the pattern. vectors. ; cx=cos(ax); } if (ay == 0.0 ) { sy=0.0; cy=1.0; } else { sy=sin(ay); cy=cos(ay); } if (az == 0.0 ) { sz=0.0; cz=1.0; } else { sz=sin(az); cz=cos(az); } m[0][0]= cy*cz; m[0][1]= cy*sz; m[0][2]= -sy; m[0][3]= 0.; m[1][0]= -c mstring(iscl , str [, rot] ) Purpose: Plot a string at the current beam position. Arguments: iscl ... the Megatek scale factor. str ... the string. rot ... (optional) - the quadrant rotation at which the characters will be plotted. Notes: The scale factor is in the range 0-7. The quadrant rotation is in the range 0-3. Default quadrant rotation is 0 (parallel to the X axis). str should be typed "char *str". The string must end in a null character (if using the double quotes in C, this is automatically taken care of). ring at the current beam position. Arguments: iscl ... the Megatek scale factor. str ... the string. rot ... (optional) - the quadrant rotation at which the characters will be plotted. Notes: The scale factor is in the range 0-7. The quadrant rotation is in the range 0-3. Default quadrant rotation is 0 (parallel to the X axis). str should be typed "char *str". The string must end in a null character (if using the double quote new_matrix(iseg , m) Purpose: Replace a segment's header transformation with a new one. Arguments: iseg ... the segment number. m ... a 4x4 floating point matrix. ional) - the quadrant rotation at which the characters will be plotted. Notes: The scale factor is in the range 0-7. The quadrant rotation is in the range 0-3. Default quadrant rotation is 0 (parallel to the X axis). str should be typed "char *str". The string must end in a null character (if using the double quote®K³ÿ-³ÿ+³ÿ$³ÿ$³ÿ+³ÿ-³ÿóÿ+³ÿçÿ$³ÿÝÿ³ÿÖÿ³ÿÔÿ³ÿÖÿóÿ³ÿÝÿçÿ³ÿçÿÝÿ³ÿóÿÖÿ³ÿÔÿ³ÿÖÿ³ÿÝÿ³ÿ$çÿ³ÿ+óÿeÿ;eÿ8eÿ0#eÿ#0eÿ8eÿ;eÿïÿ8eÿÞÿ0eÿÑÿ#eÿÉÿeÿÆÿeÿÉÿïÿeÿÑÿÞÿeÿÞÿÑÿeÿïÿÉÿeÿÆÿeÿÉÿeÿ#Ñÿeÿ0Þÿeÿ8ïÿÿ=ÿ:ÿ1$ÿ$1ÿ:ÿ=ÿîÿ:ÿÝÿ1ÿÐÿ$ÿÇÿÿÄÿÿÇÿîÿÿÐÿÝÿÿÝÿÐÿÿîÿÇÿÿÄÿÿÇÿÿ$Ðÿÿ1Ýÿÿ:îÿÉþ=Éþ:Éþ1$Éþ$1Éþ:Éþ=Éþîÿ:ÉþÝÿ1ÉþÐÿ$ÉþÇÿÉþÄÿÉþÇÿîÿÉþÐÿÝÿÉþÝÿÐÿÉþîÿÇÿÉþÄÿÉþÇÿÉþ$ÐÿÉþ1ÝÿÉþ:îÿ{þ={þ:{þ1${þ$1{þ:{þ={þîÿ:{þÝÿ1{þÐÿ${þÇÿ{þÄÿ{þÇÿîÿ{þÐÿÝÿ{þÝÿÐÿ{þîÿÇÿ{þÄÿ{þÇÿ{þ$Ðÿ{þ1Ýÿ{þ:îÿ-þ=-þ:-þ1$-þ$1-þ:-þ=-þîÿ:-þÝÿ1-þÐÿ$-þÇÿ-þÄÿ-þÇÿîÿ-þÐÿÝÿ-þÝÿÐÿ-þîÿÇÿ-þÄÿ-þÇÿ-þ$Ðÿ-þ1Ýÿ-þ:îÿßý=ßý:ßý1$ßý$1ßý:ßý=ßýîÿ:ßýÝÿ1ßýÐÿ$ßýÇÿßýÄÿßýÇÿîÿßýÐÿÝÿßýÝÿÐÿßýîÿÇÿßýÄÿßýÇÿßý$Ðÿßý1Ýÿßý:îÿ‘ý=‘ý:‘ý1$‘ý$1‘ý:‘ý=‘ýîÿ:‘ýÝÿ1‘ýÐÿ$‘ýÇÿ‘ýÄÿ‘ýÇÿîÿ‘ýÐÿÝÿ‘ýÝÿÐÿ‘ýîÿÇÿ‘ýÄÿ‘ýÇÿ‘ý$Ðÿ‘ý1Ýÿ‘ý:îÿCý=Cý:Cý1$Cý$1Cý:Cý=Cýîÿ:CýÝÿ1CýÐÿ$CýÇÿCýÄÿCýÇÿîÿCýÐÿÝÿCýÝÿÐÿCýîÿÇÿCýÄÿCýÇÿCý$ÐÿCý1ÝÿCý:îÿõü=õü:õü1$õü$1õü:õü=õüîÿ:õüÝÿ1õüÐÿ$õüÇÿõüÄÿõüÇÿîÿõüÐÿÝÿõüÝÿÐÿõüîÿÇÿõüÄÿõüÇÿõü$Ðÿõü1Ýÿõü:îÿ§ü=§ü:§ü1$§ü$1§ü:§ü=§üîÿ:§üÝÿ1§üÐÿ$§üÇÿ§üÄÿ§üÇÿîÿ§üÐÿÝÿ§üÝÿÐÿ§üîÿÇÿ§üÄÿ§üÇÿ§ü$Ðÿ§ü1Ýÿ§ü:îÿYü<Yü9Yü1#Yü#1Yü9Yü<Yüîÿ9YüÞÿ1YüÐÿ#YüÈÿYüÅÿYüÈÿîÿYüÐÿÞÿYüÞÿÐÿYüîÿÈÿYüÅÿYüÈÿYü#ÐÿYü1ÞÿYü9îÿ ü9 ü7 ü." ü". ü7 ü9 üïÿ7 üßÿ. üÓÿ" üÊÿ üÈÿ üÊÿïÿ üÓÿßÿ üßÿÓÿ üïÿÊÿ üÈÿ üÊÿ ü"Óÿ ü.ßÿ ü7ïÿ½û4½û1½û*½û*½û1½û4½ûñÿ1½ûâÿ*½û×ÿ½ûÐÿ½ûÍÿ½ûÐÿñÿ½û×ÿâÿ½ûâÿ×ÿ½ûñÿÐÿ½ûÍÿ½ûÐÿ½û×ÿ½û*âÿ½û1ñÿoû.oû,oû%oû%oû,oû.oûóÿ,oûæÿ%oûÜÿoûÕÿoûÓÿoûÕÿóÿoûÜÿæÿoûæÿÜÿoûóÿÕÿoûÓÿoûÕÿoûÜÿoû%æÿoû,óÿ!û)!û' !û"!û"!û '!û)!ûôÿ'!ûéÿ"!ûßÿ!ûÚÿ !ûØÿ!ûÚÿôÿ!ûßÿéÿ!ûéÿßÿ!ûôÿÚÿ!ûØÿ!û Úÿ!ûßÿ!û"éÿ!û'ôÿÓú%Óú# ÓúÓúÓú #Óú%Óúöÿ#ÓúëÿÓúãÿÓúÞÿ ÓúÜÿÓúÞÿöÿÓúãÿëÿÓúëÿãÿÓúöÿÞÿÓúÜÿÓú ÞÿÓúãÿÓúëÿÓú#öÿ…ú …ú …ú…ú…ú …ú …ú÷ÿ…úîÿ…úçÿ…úâÿ …úáÿ…úâÿ÷ÿ…úçÿîÿ…úîÿçÿ…ú÷ÿâÿ…úáÿ…ú âÿ…úçÿ…úîÿ…ú÷ÿ7ú7ú7ú7ú7ú7ú7úùÿ7úñÿ7úëÿ7úçÿ7úæÿ7úçÿùÿ7úëÿñÿ7úñÿëÿ7úùÿçÿ7úæÿ7úçÿ7úëÿ7úñÿ7úùÿéù¤þ×ÿÕÿoý×ÿõÿWþqÿÐÿ7ýqÿñÿpýlÿñÿAþTÿÏÿ‚ýTÿðÿ/þ;ÿÎÿpý;ÿîÿ)þ3ÿÎÿý3ÿîÿ üdü®ÿ�ûdüÏÿ¤þ*Õÿoý*õÿWþ�Ðÿ7ý�ñÿpý•ñÿAþ­Ïÿ‚ý­ðÿ/þÆÎÿpýÆîÿ)þÎÎÿýÎîÿ ü�®ÿ�û�Ïÿ{ýTÿäÿŠþTÿòÿ¬ýTÿ{ý­äÿŠþ­òÿ¬ý­Õý«þÆÿ:ý«þÖÿTþ«þõÿµý«þÕýVÆÿ:ýVÖÿTþVõÿµýVý©ý»ÿ—ü©ýÈÿ‰ý©ýâÿêü©ýëÿýX»ÿ—üXÈÿ‰ýXâÿêüXëÿ            ! ! ""!##"$$#%%$&&%''&((')))(*++*,,+--,..-//.00/1102213324 435!546"657#768$879%98:&:9;';:<(<;=)=*=<>*?+?>@,@?A-A@B.BAC/CBD0DCE1EDF2FEG3GFH4HGI5IHJ6JIK7KJL8LKM9MLN:NMO;ONP<POQ=Q>QPR>S?SRT@TSUAUTVBVUWCWVXDXWYEYXZFZY[G[Z\H\[]I]\^J^]_K_^`L`_aMa`bNbacOcbdPdceQeRedfRgSgfhThgiUihjVjikWkjlXlkmYmlnZnmo[onp\poq]qpr^rqs_srt`tsuautvbvuwcwvxdxwyeyfyxzf{g{z|h|{}i}|~j~}k~€l€�m�€‚n‚�ƒoƒ‚„p„ƒ…q…„†r†…‡s‡†ˆtˆ‡‰u‰ˆŠvЉ‹w‹ŠŒxŒ‹�y�z�ŒŽz�{�Ž�|��‘}‘�’~’‘““’”€”“•�•”–‚–•—ƒ—–˜„˜—™…™˜š†š™›‡›šœˆœ›�‰�œžŠž�Ÿ‹Ÿž Œ Ÿ¡�¡Ž¡ ¢Ž£�£¢¤�¤£¥‘¥¤¦’¦¥§“§¦¨”¨§©•©¨ª–ª©«—«ª¬˜¬«­™­¬®š®­¯›¯®°œ°¯±�±°²ž²±³Ÿ³²´ ´³µ¡µ¢µ´¶¢·£·¶¸¤¸·¹¥¹¸º¦º¹»§»º¼¨¼»½©½¼¾ª¾½¿«¿¾À¬À¿Á­ÁÀ®ÂÁïÃÂİÄÃűÅÄÆ²ÆÅÇ³ÇÆÈ´ÈÇɵɶÉÈʶ˷ËÊ̸ÌË͹ÍÌκÎÍÏ»ÏÎмÐÏѽÑÐÒ¾ÒÑÓ¿ÓÒÔÀÔÓÕÁÕÔÖÂÖÕ×Ã×ÖØÄØ×ÙÅÙØÚÆÚÙÛÇÛÚÜÈÜÛÝÉÝÊÝÜÞÊßËßÞàÌàßáÍáàâÎâáãÏãâäÐäãåÑåäæÒæåçÓçæèÔèçéÕéèêÖêéë×ëêìØìëíÙíìîÚîíïÛïîðÜðïñÝñÞñðòÞóßóòôàôóõáõôöâöõ÷ã÷öøäø÷ùåùøúæúùûçûúüèüûýéýüþêþýÿëÿþìÿíîïðñòòóô õ  ö   ÷   ø   ù  ú ûüýþÿ      ! ! ""!##"$$#%%$&&%''&(('))(**)++*,,+---,.//.00/1102213324 435!546"657#768$879%98:&:9;';:<(<;=)=<>*>=?+?>@,@?A-A.A@B.C/CBD0DCE1EDF2FEG3GFH4HGI5IHJ6JIK7KJL8LKM9MLN:NMO;ONP<POQ=QPR>RQS?SRT@TSUAUBUTVBWCWVXDXWYEYXZFZY[G[Z\H\[]I]\^J^]_K_^`L`_aMa`bNbacOcbdPdceQedfRfegSgfhThgiUiVihjVkWkjlXlkmYmlnZnmo[onp\poq]qpr^rqs_srt`tsuautvbvuwcwvxdxwyeyxzfzy{g{z|h|{}i}j}|~j~k~~~l~m~n~o~p~q~r~s~t~u~v~w~x~y~z~{~|~}€�‚€‚���ƒ‚ƒ�„�…ƒ…„†„‡…‡†ˆ†‰‡‰ˆŠˆ‹‰‹Š�ŒŽŒ���ŽŽŽ���ޑޒ�’‘“‘”’”“•“–”–•—•˜–˜—™„š„›™›šœ‘�‘žœž� Ÿ¡Ÿ¢ ¢¡¤£¥£¦¤¦¥¨§©§ª¨ª©¬«­«®¬®­hThgiUiVihjVkWkjlXlkmYmlnZnmo[onp\poq]qpr^rqs_srt`tsuautvbvuwcwvxdxwyeyxzfzy{g{z|h|{}i}j}|~x4˜ÿÿÿ˜ÿùÿ˜ÿóÿ˜ÿíÿ˜ÿäÿ˜ÿâÿ˜ÿãÿ˜ÿêÿøÿ˜ÿôÿôÿ˜ÿûÿòÿ˜ÿòÿ˜ÿ óÿ˜ÿõÿ˜ÿýÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ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ïÿÇþ4ùÿÇþ7Çþ. Çþ#ÇþÇþÇþ Çþ¡þ¡þöÿ¡þéÿ¡þáÿ¡þÖÿ ¡þÉÿ¡þÉÿøÿ¡þÏÿîÿ¡þÓÿãÿ¡þÙÿÙÿ¡þáÿÐÿ¡þåÿ·ÿ¡þóÿ¨ÿ¡þ¨ÿ¡þ·ÿ¡þ Ðÿ¡þ(Ùÿ¡þ.ãÿ¡þ2îÿ¡þ8øÿ¡þ8¡þ+ ¡þ ¡þ¡þ¡þŸþýÿEŸþïÿCŸþáÿ>ŸþÔÿ7ŸþÍÿ*ŸþØÿŸþ)Ÿþ4*Ÿþ-7Ÿþ >ŸþCŸþE+þýÿN+þíÿK+þÞÿE+þÑÿ<+þÇÿ/+þÓÿ+þØÿ +þÉÿ+þÉÿøÿ+þÊÿìÿ+þÏÿàÿ+þÖÿÖÿ+þÞÿÌÿ+þéÿÂÿ+þöÿºÿ+þ ºÿ+þÂÿ+þ#Ìÿ+þ+Öÿ+þ2àÿ+þ7ìÿ+þ8øÿ+þ8+þ) +þ.+þ:/+þ0<+þ#E+þK+þN÷ýýÿL÷ýíÿJ÷ýÞÿE÷ýÑÿ;÷ýÇÿ/÷ýÅÿ÷ýËÿ÷ýÉÿ÷ýÉÿøÿ÷ýÊÿìÿ÷ýÏÿàÿ÷ý×ÿ×ÿ÷ýßÿÍÿ÷ýêÿÅÿ÷ý÷ÿ¿ÿ÷ý ¿ÿ÷ýÅÿ÷ý"Íÿ÷ý*×ÿ÷ý2àÿ÷ý7ìÿ÷ý8øÿ÷ý8÷ý6÷ý<÷ý:/÷ý0;÷ý#E÷ýJ÷ýLuýýÿIuýîÿGuýàÿBuýÔÿ8uýÌÿ+uýÇÿuýÅÿuýÉÿuýÇÿøÿuýÇÿëÿuýÐÿáÿuýÚÿÚÿuýãÿÒÿuýíÿÍÿuýøÿÉÿuý ÉÿuýÍÿuýÒÿuý'Úÿuý1áÿuý:ëÿuý:øÿuý8uý<uý:uý5+uý-8uý!BuýGuýIóüýÿEóüïÿDóüáÿ?óüÖÿ5óüÐÿ(óüÌÿóüÉÿóüÉÿóüÉÿøÿóüÉÿëÿóüÏÿáÿóüÙÿÙÿóüâÿÒÿóüíÿÌÿóüøÿÉÿóü ÉÿóüÌÿóüÒÿóü(Ùÿóü2áÿóü8ëÿóü8øÿóü8óü8óü5óü1(óü+5óü ?óüDóüE<üþÿ><üñÿ=<üäÿ8<üÚÿ0<üÓÿ%<üÏÿ<üÍÿ<üÉÿ<üÉÿøÿ<üÊÿìÿ<üÒÿãÿ<üÚÿÚÿ<üãÿÒÿ<üíÿÍÿ<üøÿÉÿ<ü Éÿ<üÍÿ<üÒÿ<ü'Úÿ<ü/ãÿ<ü7ìÿ<ü8øÿ<ü8<ü4<ü2<ü.%<ü'0<ü8<ü=»ûþÿ1»ûôÿ/»ûëÿ,»ûâÿ&»ûÛÿ»ûÕÿ»ûÒÿ »ûÐÿ»ûÑÿùÿ»ûÓÿïÿ»ûØÿæÿ»ûÞÿÞÿ»ûæÿØÿ»ûïÿÓÿ»ûùÿÐÿ»ûÐÿ»ûÓÿ»ûØÿ»û#Þÿ»û)æÿ»û.ïÿ»û0ùÿ»û1»û/ »û,»û&»û&»û,»û /¢ûÿÿ,¢ûõÿ+¢ûíÿ(¢ûåÿ"¢ûßÿ¢ûÙÿ¢ûÖÿ ¢ûÕÿ¢ûÕÿúÿ¢û×ÿñÿ¢ûÜÿéÿ¢ûáÿáÿ¢ûéÿÛÿ¢ûñÿ×ÿ¢ûúÿÕÿ¢ûÕÿ¢û×ÿ¢ûÛÿ¢û áÿ¢û%éÿ¢û*ñÿ¢û,úÿ¢û,¢û+ ¢û(¢û"¢û"¢û(¢û +�ûÿÿ,�ûöÿ+�ûíÿ'�ûåÿ"�ûßÿ�ûÚÿ�ûÖÿ �ûÕÿ�ûÕÿúÿ�ûØÿñÿ�ûÜÿéÿ�ûáÿáÿ�ûéÿÛÿ�ûñÿ×ÿ�ûúÿÕÿ�ûÕÿ�û×ÿ�ûÛÿ�û áÿ�û%éÿ�û)ñÿ�û,úÿ�û,�û+ �û'�û"�û"�û'�û +gûðþÉÿ�ûÉÿ:þ«ÿ�û«ÿËý�ÿ’ü�ÿïüŠþ’üŠþðþ8�û8:þV�ûVËýq’üqïüw’üweýmÿýmÿ0ýmÿ%ýmÿ"eý”ý”0ý”%ý”"         ! ! " "!# #"$ $ $#% % %$& &%''&(('))(**)++*,,+--,..-//.00/1101222332443554665776887998::9;;:<<;==<>> >!>=?"?>@#@$@?A%A&A'A@B(BAC)CBD*DCE*EDF+FEG,GFH-HGI.IHJ/JIK/KJL0LKM1ML2MN2NNO2ONO3OOP4POQ5QPR6RQS7SRT8TSU9UTV:VUW;WVX<XWY=YXZ>ZY[?[@[Z\A\[]B]\^C^]_D_^`E`_aFa`bGbacHcbdIdceJedfKfefLffgMgfNghNiOihjPjQjikRkjlRlSlkmTmlRURmSUTVXXYYZZ_]`^a_b_c`n`ncoaobonpcpoqcqdqprerfrqsfsgshsrthtsuiutvjvuwkwvxlxwymyxzRzy{S{T{z|U|{}V}|~V~}W~€X€�Y�€‚Z‚�ƒZƒ‚„[„ƒ…\…„†]†…‡^‡†ˆ_ˆ‡‰_‰ˆŠ`ŠaЉ‹b‹ŠŒcŒ‹�n�ŒŽoŽ��p�Ž�q��‘r‘t‘�’‘“t“’”u”“•v•”–w–•—x—–˜y˜z˜—™{™˜š|š™›}›šœ~œ›��œž€ž�Ÿ�Ÿž ‚ Ÿ¡‚¡ ¢ƒ¢¡£„£¢¤…¤£¥†¥¤¦‡¦¥§ˆ§¦¨‰¨§©Š©‹©¨ªŒª©«�«ª¬Ž¬«­�­¬®�®­¯‘¯’¯®°¯±’±°²“²±³”³²´•´–´³µ—µ´¶˜¶µ·™·¶¸š¸·¹›¹¸ºœº¹»�»º¼ž¼»½Ÿ½¼¾ ¾½¿ ¿¾À¡À¿Á¢ÁÀ£ÂÁäÃÂÄ¥ÄÃŦÅÄÆ§ÆÅÇ¨ÇÆÈ©ÈÇɪɫÉÈʬÊÉË­ËÊÌ®ÌËͯͰÍÌΰÎÍϱÏÎвÐÏѳÑÐÒ´ÒÑÓµÓÒÔµÔÓÕ¶ÕÔÖ·ÖÕ׸×ÖØ¹Ø×ÙºÙØÚ»ÚÙÛ¼ÛÚܽÜÛݾݿÝÜÞÀÞÝßÁßÞàÂàßáÃáàâÄâáãÅãâäÆäãåÇåäæÈæåçÈçæèÉèçéÊéèêËêéëÌëÎëêìëíÎíìîÏîíïÐïîðÑðïñÒñðòÓòñóÔóòôÕôóõÖõôö×öõ÷Ø÷öøÙø÷ùÚùÛùøúÜúùûÜûúüÝüÞüûýßýüþàþýÿáÿþâÿãäåæçèéêììì ì ì   í   î   ï  ð ñòóôõö÷øùúûüýþÿ  !! ""!##"$$#%%$   %& ' '&( (') )(* *)+ +*,,,+--,..-//.00/110221332443554665776887998::9;;:<<;== =<>!>=?"?>@#@?A$A@B%BA&&&BC&D&DCE'EDF(FEG)GFH*HGI+IHJ,JIK-KJL.LKM/MLN0NMO1ONP2POQ3QPR4R5RQS6SRT7TSU8UTV9VUW:WVX;XWY<YXZ=ZY[>[Z\?\[]@]\^A^]_B_^CCC_`C`D`E`F`G`H`I`J`K`L`M`N`O`P`Q`R`S`T`U`V`W`X`Y`Z`[`\`]`^`_bacadbdcecfdfegehfhgjikiljlkmknlnmompnporqsqtrtsvuwuxvxw>=?"?>@#@?A$A@B%BA&&&BC&D&DCE'EDF(FEG)GFH*H# #include "megatek.h" /* * wait for any peripheral to be struck and return its word: */ wait_event() { register int v0; int v[3]; #include "externs.h" v[2] = 0; v[0] = WAIT; stty(FDMEGP , v); gtty(FDMEGP , v); v0 = v[0]; v[0] = v[2] = 0; stty(FDMEGP , v); return(v0); } 0177000); /* move to 0,0,0 */ min_buf(0010000); min_buf(0140000); min_buf(0040000); mrts(); /* first word in DL is a return! */ mflush_buf(); block[b].nleft = BLOCKSIZE - HDRSIZE - 1; min_buf(haddr+ai); # #include "megatek.h" /* * copy matrix 1 to matrix 2: */ mcopy(m1,m2) float *m1 , *m2; { register int *rm1 , *rm2 , n; rm1 = m1; rm2 = m2; n = 32; while( n-- ) *rm2++ = *rm1++; } EGP , v); gtty(FDMEGP , v); v0 = v[0]; v[0] = v[2] = 0; stty(FDMEGP , v); return(v0); } 0177000); /* move to 0,0,0 */ min_buf(0010000); min_buf(0140000); min_buf(0040000); mrts(); /* first word in DL is a return! */ mflush_buf(); block[b].nleft = BLOCKSIZE - HDRSIZE - 1; min_buf(haddr+ai); # #include "megatek.h" /* * enter a transformation matrix in the current segment: */ mlocal(m) float *m; { enter_matrix(m); m_add(); } m2; n = 32; while( n-- ) *rm2++ = *rm1++; } EGP , v); gtty(FDMEGP , v); v0 = v[0]; v[0] = v[2] = 0; stty(FDMEGP , v); return(v0); } 0177000); /* move to 0,0,0 */ min_buf(0010000); min_buf(0140000); min_buf(0040000); mrts(); /* first word in DL is a return! */ mflush_buf(); block[b].nleft = BLOCKSIZE - HDRSIZE - 1; min_buf(haddr+ai); vmult(a , b , c) Purpose: Perform fast floating point vector-matrix multiplication. Arguments: a , c ... 4-element floating point arrays. b ... a 4x4 floating point matrix. Notes: The operation performed is [a] * [b] -> [c] . [a] and [c] may be the same array with no side effects. The quadrant rotation is in the range 0-3. Default quadrant rotation is 0 (parallel to the X axis). str should be typed "char *str". The string must end in a null character (if using the double quote new_window( iseg , xl , yb , xr , yt) Purpose: Reset a segment's window odefinition in the header. Arguments: iseg ... the segment number to change. xl, yb, xr, yt ... the lower-left and upper-right coordinates. Notes: All coordinates are in integer and in the range -2048 to 2047. quadrant rotation is in the range 0-3. Default quadrant rotation is 0 (parallel to the X axis). str should be typed "char *str". The string must end in a null character (if using the double quote mbutton( [arg] ) Purpose: Read the state of the joystick button. Argument: arg ... (optional) - If given, "mbutton" will sleep until the button is pushed. Notes: If "arg" is not given, "mbutton" will return immediately. Values returned are either 0 (button up) or 1 (button down). adrant rotation is in the range 0-3. Default quadrant rotation is 0 (parallel to the X axis). str should be typed "char *str". The string must end in a null character (if using the double quote mcopy( m1 , m2 ) Purpose: Copy one matrix into another. Arguments: m1 , m2 ... each a 4x4 floating matrix. mbutton" will sleep until the button is pushed. Notes: If "arg" is not given, "mbutton" will return immediately. Values returned are either 0 (button up) or 1 (button down). adrant rotation is in the range 0-3. Default quadrant rotation is 0 (parallel to the X axis). str should be typed "char *str". The string must end in a null character (if using the double quote mcrtget( x , y , iseg , prompt , max , array ) Purpose: Allow the user to enter a character string from the Megatek screen. Arguments: x , y ... the screen coordinates to place the prompt string and the user string. iseg ... the segment used to display this junk. prompt ... a string to be displayed as the prompt. If no prompt is desired, then one should specify mcrtget(...,"",...); "prompt" is of type char *. max ... the maximum number of characters to allow the victim to input. This is generally determined by the size of "array." array ... the address of a character array which will receive the string. This is of type char *. Notes: The entering of the string is terminated by a Carriage Return. Control-h is the backspace. The DEL key is the line delete. The returned string will have a null ('\0') replacing the Carriage Return. ,"",...); "prompt" is of type char *. max ... the maximum number of characters to allow the victim t mdir( xp , yp ) Purpose: Read the directions of the joystick. Arguments: xp , yp ... addresses of integer variables. Notes: Numbers in the range [-3,3] are returned. Calling sequence is: mdir(&ix,&iy); g is terminated by a Carriage Return. Control-h is the backspace. The DEL key is the line delete. The returned string will have a null ('\0') replacing the Carriage Return. ,"",...); "prompt" is of type char *. max ... the maximum number of characters to allow the victim t mdirections( xp , yp ) Purpose: Read the directions of the joystick. Arguments: xp , yp ... address of integer variables. Notes: Numbers returned are -16, -5, -1, 0, 1, 5, or 16. Calling sequence is: mdirections(&ix,&iy); a Carriage Return. Control-h is the backspace. The DEL key is the line delete. The returned string will have a null ('\0') replacing the Carriage Return. ,"",...); "prompt" is of type char *. max ... the maximum number of characters to allow the victim t meg_kb( [arg] ) Purpose: Read the state of the Megatek keyboard. Argument: arg ... (optional) - If given, "meg_kb" will sleep until a key is struck. Notes: If "arg" is not given, "meg_kb" will return immediately. Values returned are 8-bit Ascii. If "arg" is not given and no key has been struck, "meg_kb" returns 0. g will have a null ('\0') replacing the Carriage Return. ,"",...); "prompt" is of type char *. max ... the maximum number of characters to allow the victim t mlocal( m ) Purpose: Enter a transformation into the display list of the current segment. Argument: m ... a 4x4 floating matrix. Note: This will now supercede the matrix specified in the segment header by "new_matrix" for all subsequent vectors in the open segment. and no key has been struck, "meg_kb" returns 0. g will have a null ('\0') replacing the Carriage Return. ,"",...); "prompt" is of type char *. max ... the maximum number of characters to allow the victim t mmark() Purpose: Save the current state of the open segment. Arguments: None. Note: The current header and the current location of the end of the segment are saved. The header information includes initial intensity, transformation matrix, pseudo- origin, and window. Each segment can have only one mark; a second call to "mmark" will wipe out the first set of marked information. This is the converse of "mreset." ... the maximum number of characters to allow the victim t mreset() it was at the last call to "mmark." Arguments: None. Notes: Any display list that was entered after the last call to "mmark" will be demolished. Purpose: Reset the state of the open segment to what intensity, transformation matrix, pseudo- origin, and window. Each segment can have only one mark; a second call to "mmark" will wipe out the first set of marked information. This is the converse of "mreset." ... the maximum number of characters to allow the victim t# /* * opr - write to the CAD Lab's Lineprinter. * * %opr filename * % blah-blah...|opr * * will do some checking then spin itself off. * * Computer Aided Design and Graphics Lab * Purdue University * */ #define SI 0 /* standard input is to be used */ #define FILE 1 /* no, read from a file instead */ #define CNTL_S 023 #define BLANK 040 #define FORM 014 #define TAB 011 #define RIGHT 77 /* right-most column */ #define WAITSLEEP 1 /* how long to sleep between seeing if the line-printer is on line */ #define NTRIES 30 /* # times to try to see if the lp is on line */ #define LOCK "/tmp/lp_lock" /* if this file exists, then someone else printing */ #define LOCKSLEEP 15 /* # seconds to sleep waiting in line for the printer */ int fd 0; int fdout , in_flag; int old[3]; /* these are for gtty/stty */ int raw[3] {0 , 0 , 040}; char line[] {"/dev/tty1"}; char filebuf[518] , over_line[RIGHT] , statbuf[36]; char *ctime(); int column , overprint , tty , tvec[2]; struct { char name[8]; char tty; char dummy[7]; } utmp; /* character conversion tables: */ char chr[] { '{' , '}' , '|' , 0}; char sub1[] { '(' , ')' , '!' }; char sub2[] { '-' , '-' , ';' }; main(argc,argv) int argc; char *argv[]; { register char ch , *rcp; register int nfill; char c , *last_col , *name; int done() , pid , fdlock , fdtmp; extern int timezone , daylight; tty = ttyn(0); /* find what tty he is on */ timezone = 5*60*60; /* EST time */ daylight = 0; /* no DST */ time(tvec); /* get current time */ name = "????????"; /* to be used if cannot find login name */ if( argc>1 ) { in_flag=FILE; if( fopen(argv[1],filebuf) < 0 ) { printf("\n cannot open %s\7\n",argv[1]); exit(1); } } else in_flag=SI; /* now, fork it off */ if( (pid=fork()) != 0 ) { /* i'm the parent */ printf("\n %d\n",pid); exit(0); } if( (fdtmp=open("/etc/utmp",0)) > 0 ) while( read(fdtmp,&utmp,sizeof utmp) == sizeof utmp ) { if( tty != utmp.tty ) continue; name = &utmp.name; /* points to login name */ break; } close(fdtmp); for(;;) { while( stat(LOCK,statbuf) >= 0 ) { /* if >= 0, then someone else using printer */ sleep(LOCKSLEEP); } if( (fdlock=creat(LOCK,0666)) < 0 ) continue; write(fdlock," ",2); break; } if( (fdout=open(line,2)) < 0) { printf("\n cannot open %s\7\n",line); exit(1); } gtty(fdout,old); signal(2,&done); stty(fdout,raw); /* * wait for start signal from the line-printer: */ for(;;) { nfill = NTRIES; if( nfill-- == 0 ) { printf("\n Line Printer Not on Line!!\n\7"); done(); } if( empty(fdout) ) { /* line printer not talking */ sleep(WAITSLEEP); continue; /* try again */ } read(fdout,&c,1); if( c == ' ' ) /* looking for a blank */ break; } write1(FORM); crlfs(5); banner8(name); crlfs(5); writestr( ctime(tvec) ); if( in_flag==FILE ) { crlfs(5); writestr( argv[1] ); } if( (fdtmp=open("/etc/botd",0)) > 0 ) { crlfs(10); for(;;) { if( read(fdtmp,&c,1) <= 0 ) break; if( c == 012 ) write1(015); write1(c); } close(fdtmp); } write1(FORM); column = overprint = 0; blanks(); for(;;) { if( (ch=reader()) == 0 ) /* end-of-file */ break; if( ch == TAB ) { nfill = 4 - (column&03); while( nfill-- ) write1(' '); continue; } if( (ch&0177) == '\n' ) { if( overprint ) { write1(015); column = 0; rcp = &over_line[RIGHT]; while( *--rcp == ' ' ); /* find out where blanks end */ last_col = rcp; for(rcp= &over_line[0]; rcp<= last_col; rcp++) write1( *rcp ); /* print out overprint line */ overprint = 0; blanks(); } crlfs(1); continue; } write1(ch); } write1(FORM); printf("\n Print Completed"); done(); } reader() { register char c; if( in_flag==SI ) return( getchar() ); if( (c=getc(filebuf)) == -1 ) return(0); return(c); } /* * reset the line to cooked mode and exit: */ done() { stty(fdout,old); unlink( LOCK ); printf("\7"); exit(); } /* * check if lp is busy, write a character and increment the column count: */ write1(ch) { register char rch , rchr; register int j; char c; if( ch!=015 && ch!=012 && column>RIGHT ) return; if( 'a'<=ch && ch<='z' ) /* convert lower case to upper case */ ch=+ 'A'-'a'; if( empty(fdout) == 0 ) { /* the line-printer has a message */ read(fdout,&c,1); if( (c&0177) == CNTL_S ) /* ... and it says cool it! */ read(fdout,&c,1); /* wait and clear the input queue */ } /* character conversion: */ rch = ch; for(j=0; (rchr=chr[j]) != 0; j++) { if( rch == rchr ) { ch = sub1[j]; over_line[column] = sub2[j]; overprint++; break; } } write(fdout,&ch,1); if( ch != 012 ) column++; if( ch == 015 ) column = 0; } /* * fill the overprint buffer with blanks: */ blanks() { register char *rcp; for(rcp= &over_line[0]; rcp < &over_line[RIGHT]; rcp++) *rcp = ' '; } writestr(s) char *s; { register char *rcp , c; rcp = s; while( (c= *rcp++) ) write1(c); } /* * write several combinations: */ crlfs(n) { register int rn; if( (rn=n) <= 0 ) return; while( rn-- ) writestr("\015\012"); } /* * print out an eight-character banner heading: */ #define DEPTH 6 #define WIDTH 6 #define START ' ' #define END '_' #define ERR 'X' int tbl[] { 0, 0, 0, /* */ 020202, 04000, 0100000, /* ! */ 044440, 0, 0, /* " */ 045764, 0111375, 020000, /* # */ 075307, 0106665, 0160000, /* $ */ 03455, 05516, 0, /* % */ 030443, 012211, 0150000, /* & */ 020200, 0, 0, /* ' */ 010202, 04040, 040000, /* ( */ 020101, 02020, 0100000, /* ) */ 0443, 06110, 0, /* * */ 0101, 017420, 040000, /* + */ 0, 06020, 0100000, /* , */ 0, 017400, 0, /* - */ 0, 060, 0140000, /* . */ 02041, 04102, 0, /* / */ 030444, 0111110, 0140000, /* 0 */ 010301, 02021, 0170000, /* 1 */ 034420, 0102143, 0170000, /* 2 */ 0176021, 0103007, 0170000, /* 3 */ 010305, 037020, 040000, /* 4 */ 0177017, 0101407, 0160000, /* 5 */ 036417, 0120605, 0160000, /* 6 */ 0176020, 0102041, 0, /* 7 */ 075027, 0120605, 0160000, /* 8 */ 075030, 057413, 0140000, /* 9 */ 030300, 06060, 0, /* : */ 030300, 06020, 0100000, /* ; */ 0142, 010040, 060000, /* < */ 07, 0140174, 0, /* = */ 0601, 01021, 0100000, /* > */ 034023, 0104000, 0100000, /* ? */ 075031, 0124631, 0150000, /* @ */ 030450, 077606, 010000, /* A */ 0175037, 0120607, 0160000, /* B */ 075030, 020205, 0160000, /* C */ 0175030, 060607, 0160000, /* D */ 0177017, 0120203, 0170000, /* E */ 0177017, 0120202, 0, /* F */ 075030, 023605, 0160000, /* G */ 0103037, 0160606, 010000, /* H */ 010101, 02020, 040000, /* I */ 02020, 040605, 0160000, /* J */ 0103057, 022212, 010000, /* K */ 0101010, 020203, 0170000, /* L */ 0103473, 060606, 010000, /* M */ 0103432, 062616, 010000, /* N */ 075030, 060605, 0160000, /* O */ 0175030, 077202, 0, /* P */ 075030, 062611, 0150000, /* Q */ 0175030, 077212, 010000, /* R */ 075007, 0100605, 0160000, /* S */ 076101, 02020, 040000, /* T */ 0103030, 060605, 0160000, /* U */ 0103030, 060510, 0140000, /* V */ 0103030, 066716, 010000, /* W */ 0102443, 06112, 010000, /* X */ 042241, 02020, 040000, /* Y */ 0176041, 04103, 0170000, /* Z */ 034202, 04040, 0160000, /* [ */ 0100402, 02010, 010000, /* \ */ 070101, 02021, 0140000, /* ] */ 010240, 0, 0, /* ^ */ 0, 03, 0170000, /* _ */ }; char banner_line[100]; banner8( name8 ) char *name8; { register int i , j; register char *rcp; for(j=0; j END) x =& 0137; if (START <= x && x <= END) x =- START; else x = ERR - START; offset = shift / 16 + x * ((DEPTH * WIDTH + 15) / 16); shift =% 16; return(tbl[offset] >> (15 - shift) & 01); } ar *p, c; int n; p = buf; for (n = 0; n<8; n++) { c = s[n] & 0177; for (w = 0; w < WIDTH; w++) { *p++ = bit(c, row, w)? c : ' '; } *p++ = ' '; *p++ = ' '; } *p++ = 0; } bit(c, d, w) char c; int d, w; { register int shift, offset; register char x; shift = d * WIDTH + w; x = c; if (x > END) x =& 0137; if (START <= x && x <= END) x =- S rotm(matr , angx , angy , angz) Purpose: to create a transformation matrix of rotations. Arguments: matr ... the 4 x 4 transformation matrix. angx ... the rotation about the x axis (radians). angy ... the rotation about the y axis (radians). angz ... the rotation about the z axis (radians). Notes: The order of the rotation is angx - angy - angz. The previous contents of matr are lost. This is the converse of "mreset." ... the maximum number of characters to allow the victim t rotit(matr , angx , angy , angz) Purpose: To apply a rotational transformation to matr. Arguments: matr ... the 4 x 4 transformation matrix. angx ... the rotation about the x axis (radians). angy ... the rotation about the y axis (radians). angz ... the rotation about the z axis (radians). Notes: The order of rotation is angx - angy - angz. The effect of rotit is identical to the sequence: rotm(matrtem , angx , angy , angz) mmult(matr , matrtem , matr) allow the victim t transm(matr , delx , dely , delz) Purpose: to create a transformation matrix of translations. Arguments: matr ... the 4 x 4 transformation matrix. delx ... the translation along the x axis. dely ... the translation along the y axis. delz ... the translation along the z axis. Notes: The previous contents of matr are lost. - angy - angz. The effect of rotit is identical to the sequence: rotm(matrtem , angx , angy , angz) mmult(matr , matrtem , matr) allow the victim t scalem(matr , sclx , scly , sclz) Purpose: To create a scaling transformation matrix. Arguments: matr ... the 4 x 4 transformation matrix. sclx ... the scaling along the x axis. scly ... the scaling along the y axis. sclz ... the scaling along the z axis. Notes: The previous contents of matr are lost. lost. - angy - angz. The effect of rotit is identical to the sequence: rotm(matrtem , angx , angy , angz) mmult(matr , matrtem , matr) allow the victim t transit(matr , delx , dely , delz) Purpose: To apply a translational transformation to matr. Arguments: matr ... the 4 x 4 transformation matrix. delx ... the translation along the x axis. dely ... the translation along the y axis. delz ... the translation along the z axis. Notes: The effect of transit is identical to the sequence: transm(matrtem , delx , dely , delz) mmult(matr , matrtem , matr) em , angx , angy , angz) mmult(matr , matrtem , matr) allow the victim t scaleit(matr , sclx , scly , sclz) Purpose: To apply a scaling transformation to matr. Arguments: matr ... the 4 x 4 transformation matrix. sclx ... the scaling along the x axis. scly ... the scaling along the y axis. sclz ... the scaling along the z axis. Notes: The effect of scaleit is identical to the sequence: scalem(matrtem , sclx , scly , sclz) mmult(matr , matrtem , matr) matrtem , matr) em , angx , angy , angz) mmult(matr , matrtem , matr) allow the victim t float xx , yy , xn , yn; int ixn , iyn; 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; ixn = 200.*xn; iyn = 200.*yn; mplot3(ixn , iyn , 0 , 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); } 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; ixn = 200.*xn; iyn = 200.*yn; mplot3(ixn , iyn , 0 , ic); ic=2; } x=+ xt; y=+ yt; ic=3; } } /*# /* * set the screen window on the megatek: * (coords are -+ 2048) */ mwindow(xl,yb,xr,yt) { #include "externs.h" min_buf( maddr ); mclip(xl,yb,xr,yt); m_add(); } == 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; ixn = 200.*xn; iyn = 200.*yn; mplot3(ixn , iyn , 0 , ic); ic=2; } x=+ xt; y=+ yt; ic=3; } } /*# #include "megatek.h" /* * change the transformation matrix in the header of seg #iseg: */ new_matrix(iseg , m) float *m; { register char *addr; register int b; #include "externs.h" if( iseg<=0 || iseg>NSEGS ) { printf("\n new_matrix - seg # out of range!\n\7"); return; } if( (b=segs[iseg].s_index) <= 0 ) { printf("\n new_matrix - seg %d not open yet!\n\7",iseg); return; } addr = block[b].addr; /* address of seg header */ min_buf( addr+5 ); enter_matrix(m); mflush_buf(); } } /*# #include "megatek.h" /* * change the clipping coordinates in the header of seg #iseg: */ new_window(iseg , xl , yb , xr , yt) { register char *addr; register int b; #include "externs.h" if( iseg<=0 || iseg>NSEGS ) { printf("\n new_window - seg # out of range!\n\7"); return; } if( (b=segs[iseg].s_index) <= 0 ) { printf("\n new_window - seg %d not open yet!\n\7",iseg); return; } addr = block[b].addr; /* address of seg header */ min_buf( addr+14 ); mclip(xl , yb , xr , yt); mflush_buf(); } e "megatek.h" /* * change the clipping coordinates in the header of seg #iseg: */ new_window(iseg , xl , yb , xr , yt) { register char *addr; register int b; #include "externs.h" if( iseg<=0 || iseg>NSEGS ) { printf("\n new_window - seg # out of range!\n\7"); return; } if( (b=segs[iseg].s_index) <= 0 ) { printf("\n new_window - seg %d not open yet!\n\7",iseg); return; } addr = block[b].addr; /* address of seg header */ min_buf( addr+14 ); mclip(xl , yb , xr , yt); mflush_# #include "megatek.h" /* * return a block to the free list: */ return_free(f) { #include "externs.h" if( f<0 || f>NBLOCKS-1 ) return; block[f].next = m_free; m_free = f; } externs.h" if( iseg<=0 || iseg>NSEGS ) { printf("\n new_window - seg # out of range!\n\7"); return; } if( (b=segs[iseg].s_index) <= 0 ) { printf("\n new_window - seg %d not open yet!\n\7",iseg); return; } addr = block[b].addr; /* address of seg header */ min_buf( addr+14 ); mclip(xl , yb , xr , yt); mflush_/*********************************************************************** /* /* vmult(a,b,c) - perform floating matrix-vector multiply /* /* adapted from a similar routine written by D. Anderson /* /* made for FLOAT (4 bytes per fp number) matrices only! /* /* [a] * [b] -> [c] /* ( [c] may be [a] if n=l ) /* /* [a] is 1xn /* [b] is nxl /* [c] is 1xl /* /* /* Mike Bailey - May 1979 /* /* /*********************************************************************** .globl _vmult .text _vmult: ~~vmult: / save regs: mov r0,-(sp) mov r1,-(sp) mov r2,-(sp) mov r3,-(sp) mov r4,-(sp) mov r5,-(sp) mov sp,r5 / matrix sizes: n = 4 l = 4 / offsets from r5 after storing user regs: a = 16 b = 20 c = 22 mov a(r5),r0 mov b(r5),r1 add $n*4,r0 /end of [a] matrix + 1 add $n*l*4,r1 /end of [b] matrix + 1 mov r1,bend 1: mov $l,r4 2: mov $n,r3 /# pairs to multiply clr -(sp) clr -(sp) / set stack to 0.0 3: mov -(r0),-(sp) mov -(r0),-(sp) / push [a] element on the stack beq 7f /skip a lot of stuff if == 0.0 mov -(r1),-(sp) mov -(r1),-(sp) / push [b] element on the stack beq 8f / skip a lot if == 0.0 fmul sp / multiply the 2 elements fadd sp / add to sum already on stack (leave on stack) 4: sub $4*l-4,r1 / point [b] to one row less sob r3,3b / multiply n pairs / done multiplying one element of c: add $4*n*l-4,r1 / update [b] pointer add $4*n,r0 / update [a] pointer sob r4,2b / do until can move up one row of [a] / done multiplying - extract [c] from stack: mov c(r5),r2 mov $2*l,r4 /counter 5: mov (sp)+,(r2)+ sob r4,5b / restore registers and return: mov r5,sp mov (sp)+,r5 mov (sp)+,r4 mov (sp)+,r3 mov (sp)+,r2 mov (sp)+,r1 mov (sp)+,r0 rts pc 7: cmp (sp)+,(sp)+ cmp -(r1),-(r1) br 4b 8: add $8.,sp br 4b .globl fltused fadd = 075000^rts fmul = 075020^rts .comm ac0,8. .globl .bss bend: .=.+2 inter add $4*n,r0 / update [a] pointer sob r4,2b / do until can move up one row of [a] / done multiplying - extract [c] from stack: mov# #include "megatek.h" /* * wait for any peripheral to be struck and return its word: */ wait_event() { register int v0; int v[3]; #include "externs.h" v[2] = 0; v[0] = WAIT; stty(FDMEGP , v); gtty(FDMEGP , v); v0 = v[0]; v[0] = v[2] = 0; stty(FDMEGP , v); return(v0); } fadd = 075000^rts fmul = 075020^rts .comm ac0,8. .globl .bss bend: .=.+2 inter add $4*n,r0 / update [a] pointer sob r4,2b / do until can move up one row of [a] / done multiplying - extract [c] from stack: movlag.proj++; continue; case VIEW4: mseg(-LCURS3D); mseg(-RCURS3D); mblank(OBJECT); mseg(TMP); mplot2( (LEFT+RIGHT)/2 , BOTTOM , 3); mplot2( (LEFT+RIGHT)/2 , TOP , 2); mplot2( LEFT , (TOP+BOTTOM)/2 , 3); mplot2( RIGHT , (TOP+BOTTOM)/2 , 2); menu1[VIEW4].ints = 0; menu1[VIEW1].ints = menu1[VIEW2].ints = 15; chg_view( VIEW4 ); mblank(-CURS3D); new_window(CURS3D , (LEFT+RIGHT)/2 , (TOP+BOTTOM)/2 , RIGHT , TOP); update_curs(); plot_menu(&menu1); flag.proj++; continue; case ADD: add(); plot_menu( &menu1 ); continue; case PARAMETERS: if( (p=get_pltch()) == 0 ) continue; parameters(p); plot_menu( &menu1 ); continue; case COMPACT: compact(); continue; case FILL: draw_traces(); menu1[FILL].ints = 0; menu1[UNFILL].ints = 15; plot_menu( &menu1 ); continue; case UNFILL: mappend( TRACES ); mreset(); menu1[FILL].ints = 15; menu1[UNFILL].ints = 0; plot_menu( &menu1 ); continue; case WAIT: mseg( MESG ); mplot2(MESGX , MESGY , 3); mstring(MESGSCL , "Waiting . . ."); burp(); waitez(); /* wait for last job spun off */ menu1[WAIT].ints = 0; plot_menu( &menu1 ); mesg("You're Back!"); continue; } /* didn't find a menu item - test if specifying a point: */ mmouse(&ix , &iy); if( (p=hit_pt(ix,iy)) == 0 ) /* found nothing */ continue; point = p; markit( point ); /* mark every point found */ update_curs(); /* move 3D cursor */ continue; transform: make_xform(); switch( flag.view ) { case VIEW1: p = &xform[0][0]; new_matrix(OBJECT , p); break; case VIEW2: mmult(xform , &quarters[STLEFT][0] , m1); mmult(xform , &quarters[STRIGHT][0] , m2); new_matrix( STLEFT , m1 ); new_matrix( STRIGHT , m2 ); p = &m2[0][0]; break; case VIEW4: mmult(xform , &quarters[UPPERRIGHT][0] , m1); p = &m1[0][0]; new_matrix(UPPERRIGHT , p); break; } new_matrix(CTLPTS , p); new_matrix(MARKER , p); update_curs(); flag.proj++; continue; } } /* * separate menu to take care of adding things to the object: */ add() { register int j; plot_menu( &menu4 ); for(EVER) { switch( (j=loop(&menu4)) ) { case EXIT: return; case ADDPT: x_3d = point->x; y_3d = point->y; z_3d = point->z; add_pt(); continue; case ADDLINE: add_line(); continue; case ADDCRV: continue; case ADDARC: add_arc(); continue; case ADDPLTCH: continue; } } } /* * add an arc to the data structure: */ add_arc() { register char *p; if( num_m < 3 ) { mesg("Need 3 Marks"); return; } p = alloc(sizeof arc); num_a++; get_last( &arc )->nexta = p; p->c = ( p->a2= (p->a1= mark.mark) ->mark) ->mark; p->nexta = 0; mappend(OBJECT); draw_arc(p); flag.write++; } /* * add a line to the data structure: */ add_line() { register char *p; if( num_m < 2 ) { mesg("Need 2 Marks"); return; } p = alloc(sizeof line); num_l++; get_last( &line )->nextl = p; p->l2 = (p->l1= mark.mark) ->mark; p->nextl = 0; mappend(OBJECT); draw_line(p); flag.write++; } /* * add a point to the data structure - make it the current point (ie, variable "point"): * ( make its coords the same as the 3D cursor's ) */ add_pt() { register char *p; p = point = alloc(sizeof vert); num_v++; p->x = x_3d; p->y = y_3d; p->z = z_3d; p->mark = 0; project(p); /* fill p->sx, p->sy */ get_last( &vert )->nextv = p; /* link in */ p->nextv = 0; flag.write++; } /* * allocate free space / remove free space: */ char *alloc(asize) int asize; { register int size; register char *p , *pp; char *sbrk(); size=asize; size++; size=& ~1; /* be sure size is even */ for(p= &free; p->next!=0; p=p->next) { if( p->next->nbytes==size ) { /* perfect fit! */ pp=p->next; p->next = p->next->next; /* un-link this block */ return(pp); } if( p->next->nbytes > size+2 ) { /* too big so will use part of it */ pp = p->next+size; /* take front part of free block */ pp->next = p->next->next; pp->nbytes = p->next->nbytes; p->next = pp; pp=- size; /* old "p->next" */ return(pp); } } /* nothing fit - try sbrk */ if( (p=sbrk(size)) == -1 ) { printf("\n Out of Room!\7\n"); exit(1); } return(p); } unalloc(ap , asize) char *ap; int asize; { register char *p , *pp; pp=ap; pp->nbytes = asize; for(p= &free; p->next!=0; p=p->next) if( p->next > pp ) break; /* new block should be linked after p: */ pp->next = p->next; p->next = pp; /* try to consolidate blocks after and before: */ if( pp->next != 0 ) { /* ie, new block isn't last in the list */ if( pp+pp->nbytes==pp->next ) { pp->nbytes=+ pp->next->nbytes; pp->next = pp->next->next; } } if( p != &free ) { /* ie, new block is not first in the list */ if( p+p->nbytes==pp ) { p->nbytes=+ pp->nbytes; p->next = pp->next; } } } /* * print a beep at the decwriter: */ burp() { static int fdtty8; /* file descriptor for decwriter */ if( fdtty8 == 0 ) { /* must open first! */ if( (fdtty8=open("/dev/tty8",1)) < 0 ) { printf("\n cannot open /dev/tty8!\n\7"); exit(1); } } write( fdtty8 , "\7" , 1 ); } /* * plot a string centered about a given point: */ center_string(as , ix , iy , is) char *as; int ix , iy , is; { register char *s; register int n , scl; scl = is; /* scale factor should be 0-7 */ scl=& 07; s = as; n = count_char( s ); scl++; mplot2(ix-n*6*scl , iy-9*scl , 3); mstring(--scl , s); } /* * change the view without re-drawing the object: */ chg_view( v ) { register int j , view; view = v; mblank(OBJECT); switch( view ) { case VIEW1: flag.view=VIEW1; for(j=LOWERLEFT; j<=STRIGHT; j++) mseg(-j); new_matrix(CTLPTS , xform); new_matrix(MARKER , xform); new_matrix(OBJECT , xform); new_window(OBJECT , LEFT , BOTTOM , RIGHT , TOP); new_window(CTLPTS , LEFT , BOTTOM , RIGHT , TOP); new_window(MARKER , LEFT , BOTTOM , RIGHT , TOP); mblank(-OBJECT); return; case VIEW2: flag.view=VIEW2; for(j=LOWERLEFT; j<=LOWERRIGHT; j++) mseg(-j); mmult(xform , &quarters[STLEFT][0] , m1); mmult(xform , &quarters[STRIGHT][0] , m2); new_matrix(CTLPTS , m2); new_window( CTLPTS , (LEFT+RIGHT)/2 , BOTTOM , RIGHT , TOP); new_window( MARKER , (LEFT+RIGHT)/2 , BOTTOM , RIGHT , TOP); new_matrix(MARKER , m2); mseg(STLEFT); new_matrix(STLEFT , m1); new_window( STLEFT , LEFT , BOTTOM , (LEFT+RIGHT)/2 , TOP); mgetsub(OBJECT); mseg(STRIGHT); new_matrix(STRIGHT , m2); new_window( STRIGHT , (LEFT+RIGHT)/2 , BOTTOM , RIGHT , TOP); mgetsub(OBJECT); return; case VIEW4: flag.view = VIEW4; for(j=STLEFT; j<=STRIGHT; j++) mseg(-j); mmult(xform , &quarters[UPPERRIGHT][0] , m1); new_matrix(CTLPTS , m1); new_matrix(MARKER , m1); new_window( CTLPTS , (LEFT+RIGHT)/2 , (BOTTOM+TOP)/2 , RIGHT , TOP); new_window( MARKER , (LEFT+RIGHT)/2 , (BOTTOM+TOP)/2 , RIGHT , TOP); for(j=LOWERLEFT; j<=LOWERRIGHT; j++) { mseg(j); new_matrix(j , (j==UPPERRIGHT) ? &m1[0][0] : &quarters[j][0]); if( j==UPPERRIGHT ) new_window( j , (LEFT+RIGHT)/2 , (BOTTOM+TOP)/2 , RIGHT , TOP); mgetsub(OBJECT); } return; } } /* * compact the data structure, removing redundant pts, lines, curves, and arcs: */ compact() { register char *p1 , *p2 , *p; char *last; int j , changed; changed = 0; /* !=0 means something changed */ for(p1=vert.nextv; p1!=0; p1=p1->nextv) { last = p1; for(p2=p1->nextv; p2!=0; p2= (last=p2)->nextv) { if( abs(p2->x - p1->x) > TOL ) continue; if( abs(p2->y - p1->y) > TOL ) continue; if( abs(p2->z - p1->z) > TOL ) continue; /* remove point given by p2: */ for(p=line.nextl; p!=0; p=p->nextl) { if( p->l1==p2 ) p->l1=p1; if( p->l2==p2 ) p->l2=p1; } for(p=crv.nextc; p!=0; p=p->nextc) { if( p->c1==p2 ) p->c1=p1; if( p->c2==p2 ) p->c2=p1; if( p->c3==p2 ) p->c3=p1; if( p->c4==p2 ) p->c4=p1; } for(p=arc.nexta; p!=0; p=p->nexta) { if( p->a1==p2 ) p->a1=p1; if( p->a2==p2 ) p->a2=p1; if( p->c==p2 ) p->c=p1; } last->nextv = p2->nextv; /* link around point being removed */ num_v--; if( p2->mark ) un_markit( p2 ); unalloc(p2 , sizeof vert); p2 = last; /* fool the "for" */ changed++; burp(); } } /* remove duplicate lines: */ for(p1=line.nextl; p1!=0; p1=p1->nextl) { last = p1; for(p2=p1->nextl; p2!=0; p2= (last=p2)->nextl) { if( (p1->l1==p2->l1 && p1->l2==p2->l2) || (p1->l1==p2->l2 && p1->l2==p2->l1) ) { for(p=pltch.nextpl; p!=0; p=p->nextpl) { for(j=0; jnsides; j++) { if( p->side[j].what==LINE && p->side[j].which==p2 ) p->side[j].which=p1; } } last->nextl = p2->nextl; num_l--; unalloc(p2 , sizeof line); p2=last; changed++; burp(); } } } /* remove duplicate curves */ for(p1=crv.nextc; p1!=0; p1=p1->nextc) { last = p1; for(p2=p1->nextc; p2!=0; p2= (last=p2)->nextc) { if( p1->whatc!=p2->whatc ) continue; /* curves aren't even the same type */ if( (p1->c1==p2->c1 && p1->c2==p2->c2 && p1->c3==p2->c3 && p1->c4==p2->c4) || (p1->c1==p2->c4 && p1->c2==p2->c3 && p1->c3==p2->c2 && p1->c4==p2->c1) ) { for(p=pltch.nextpl; p!=0; p=p->nextpl) { for(j=0; jnsides; j++) { if( p->side[j].what==CURVE && p->side[j].which==p2 ) p->side[j].which = p1; } } last->nextc = p2->nextc; num_c--; unalloc(p2 , sizeof crv); p2=last; changed++; burp(); } } } /* remove duplicate arcs: */ for(p1=arc.nexta; p1!=0; p1=p1->nexta) { last = p1; for(p2=p1->nexta; p2!=0; p2= (last=p2)->nexta) { if( p1->c != p2->c ) continue; if( (p1->a1==p2->a1 && p1->a2==p2->a2) || (p1->a1==p2->a2 && p1->a2==p2->a1) ) { for(p=pltch.nextpl; p!=0; p=p->nextpl) { for(j=0; jnsides; j++) { if( p->side[j].what==ARC && p->side[j].which==p2 ) p->side[j].which=p1; } } last->nexta = p2->nexta; num_a--; unalloc(p2 , sizeof arc); p2=last; changed++; burp(); } } } /* Done! */ if( changed ) { mesg("Done!"); draw_all(); } else mesg("Nothing Changed!"); } /* * count the elements in a particular linked list: * (this is possible only because the "next" pointer is always the first word!) */ count(start) char *start; { register char *p; register int j; j=0; for(p=start->next; p!=0; p=p->next) j++; return(j); } /* * count the chars in a string: */ count_char(as) char *as; { register char *s1 , *s2; s1 = s2 = as; while( *s2 ) s2++; return(s2-s1); } /* * integer cross-product: */ cross_product(v1 , v2 , v3) int *v1 , *v2 , *v3; { register int *a , *b , *c; a=v1; b=v2; c=v3; c->fx = a->fy*b->fz - b->fy*a->fz; c->fy = b->fx*a->fz - a->fx*b->fz; c->fz = a->fx*b->fy - b->fx*a->fy; } /* * separate menu for deleting things: */ delete() { register int j; register char *p; plot_menu( &menu3 ); for(EVER) { switch( (j=loop(&menu3)) ) { case EXIT: return; case DELPT: p = point->nextv; del_pt( point ); if( (point=p) == 0 ) point = vert.nextv; if( point==0 ) { /* out of points */ printf("\n Out of points!\n\7\7"); exit(1); /* for now */ } update_curs(); /* draw 3D cursor at new location */ draw_all(); /* draw the object with the point gone */ continue; case DELBOUNDARY: del_bound(); continue; case DELPLTCH: del_pltch(); continue; } } } /* * change sines and cosines to reflect a change in angle: */ delta_ang(axis) { float c , cd , sd; cd = cdtheta; sd = sdtheta; if( axis < 0 ) { sd = -sd; axis = -axis; } switch( axis ) { case X: c = cosx*cd - sinx*sd; sinx = sinx*cd + cosx*sd; cosx = c; break; case Y: c = cosy*cd - siny*sd; siny = siny*cd + cosy*sd; cosy = c; break; case Z: c = cosz*cd - sinz*sd; sinz = sinz*cd + cosz*sd; cosz = c; break; } } /* * delete the given boundary curve and any platches that use it: */ del_bound() { register char *p , *p1 , *p2; int what , j; char *last; if( num_m < 2 ) { mesg("Need 2 Marks"); return; } p2 = (p1= mark.mark)->mark; what=LINE; last= &line; for(p=line.nextl; p!=0; p= (last=p)->nextl ) if( (p->l1==p1 && p->l2==p2) || (p->l1==p2 && p->l2==p1) ) goto foundit; what = CURVE; last= &crv; for(p=crv.nextc; p!=0; p= (last=p)->nextc ) if( (p->c1==p1 && p->c4==p2) || (p->c1==p2 && p->c4==p1) ) goto foundit; what = ARC; last= &arc; for(p=arc.nexta; p!=0; p= (last=p)->nexta ) if( (p->a1==p1 && p->a2==p2) || (p->a1==p2 && p->a2==p1) ) goto foundit; mesg("No Boundary Curve Found"); return; foundit: last->next = p->next; /* link around it */ switch( what ) { case LINE: num_l--; unalloc(p , sizeof line); break; case CURVE: num_c--; unalloc(p , sizeof crv); break; case ARC: num_a--; unalloc(p , sizeof arc); break; } last= &pltch; for(p1=pltch.nextpl; p1!=0; p1= (last=p1)->nextpl) { for(j=0; jnsides; j++) { if( p1->side[j].which==p ) { last->nextpl = p1->nextpl; unalloc(p1 , sizeof pltch); p1 = last; num_pl--; break; } } } draw_all(); } /* * delete the given platch: */ del_pltch() { register char *p , *pl , *last; if( (p=get_pltch()) == 0) { mesg("No Platch Found"); return; } last= &pltch; for(pl=pltch.nextpl; pl!=p; pl= (last=pl)->nextpl); last->nextpl = p->nextpl; num_pl--; unalloc(p , sizeof pltch); draw_all(); return; } /* * delete the given point and thus all structures associated with it: */ del_pt( pt ) struct vert *pt; { register struct vert *pnt; register char *p , *last; int j; char *pp; pnt = pt; zero_flags(); if( pnt->mark ) { /* eliminate marked state if it's marked */ for(p= &mark; p->mark!= pnt; p=p->mark); p->mark = pnt->mark; draw_marks(); } for( p= (last= &pltch)->nextpl; p!=0; p= (last=p)->nextpl ) { for(j=0; jnsides; j++) { pp = p->side[j].which; switch( p->side[j].what ) { case LINE: if( pp->l1==pnt || pp->l2==pnt ) p->flagpl++; break; case CURVE: if(pp->c1==pnt || pp->c2==pnt || pp->c3==pnt || pp->c4==pnt) p->flagpl++; break; case ARC: if( pp->a1==pnt || pp->a2==pnt || pp->c==pnt ) p->flagpl++; break; } if( p->flagpl ) break; } if( p->flagpl ) { last->nextpl = p->nextpl; /* link around this structure */ unalloc(p , sizeof pltch); p = last; /* fool the "for" */ num_pl--; } } for( p= (last= &line)->nextl; p!=0; p= (last=p)->nextl ) if( p->l1==pnt || p->l2==pnt ) { last->nextl = p->nextl; unalloc(p , sizeof line); p=last; num_l--; } for( p= (last= &crv)->nextc; p!=0; p= (last=p)->nextc ) if( p->c1==pnt || p->c2==pnt || p->c3==pnt || p->c4==pnt ) { last->nextc = p->nextc; unalloc(p , sizeof crv); p=last; num_c--; } for( p= (last= &arc)->nexta; p!=0; p= (last=p)->nexta ) if( p->a1==pnt || p->a2==pnt || p->c==pnt ) { last->nexta = p->nexta; unalloc(p , sizeof arc); p=last; num_a--; } for( p= (last= &vert)->nextv; p!=0; p= (last=p)->nextv ) { if( p!= pnt ) continue; last->nextv = p->nextv; unalloc(p , sizeof vert); num_v--; break; } flag.write++; /* indicate a change has been made */ } /* * store the data in the outfile: */ done( filename ) char *filename; { register char *p; register int i , j; char *fp; if( nargs() <= 0 ) filename = outfile; /* just in case */ close( iobuf[0] ); /* want to re-use iobuf */ if( fcreat(filename , iobuf) < 0 ) { printf("\n cannot create %s \7\n", filename); return; } putw(num_v , iobuf); putw(num_pl , iobuf); putw(num_l , iobuf); putw(num_c , iobuf); putw(num_a , iobuf); for(p=vert.nextv; p!=0; p=p->nextv) { putw(p->x , iobuf); putw(p->y , iobuf); putw(p->z , iobuf); } for(p=pltch.nextpl; p!=0; p=p->nextpl) { putw(p->nsides , iobuf); putw(p->color , iobuf); fp = &p->transparency; putw(fp->high , iobuf); putw(fp->low , iobuf); for(j=0; jnsides; j++) { putw( (i=p->side[j].what) , iobuf ); switch( i ) { case LINE: putw( i_th(&line,p->side[j].which) , iobuf ); break; case CURVE: putw( i_th(&crv,p->side[j].which) , iobuf ); break; case ARC: putw( i_th(&arc,p->side[j].which) , iobuf ); break; } } } for(p=line.nextl; p!=0; p=p->nextl) { putw( i_th(&vert,p->l1) , iobuf); putw( i_th(&vert,p->l2) , iobuf); } for(p=crv.nextc; p!=0; p=p->nextc) { putw( p->whatc , iobuf ); putw( i_th(&vert,p->c1) , iobuf); putw( i_th(&vert,p->c2) , iobuf); putw( i_th(&vert,p->c3) , iobuf); putw( i_th(&vert,p->c4) , iobuf); } for(p=arc.nexta; p!=0; p=p->nexta) { putw( i_th(&vert,p->a1) , iobuf ); putw( i_th(&vert,p->a2) , iobuf ); putw( i_th(&vert,p->c) , iobuf ); } fflush( iobuf ); mesg("Done!"); } /* * draw the 3D cursor: */ draw3d() { register int half; half = LABEL>>1; /* half the given length */ mseg( CURS3D ); switch( flag.view ) { case VIEW1: new_window(CURS3D , LEFT , BOTTOM , RIGHT , TOP); break; case VIEW2: mblank(CURS3D); break; case VIEW4: new_window(CURS3D , (LEFT+RIGHT)/2 , (TOP+BOTTOM)/2 , RIGHT , TOP ); break; } mplot3(-LNGTH3D,0,0,3); mplot3(LNGTH3D,0,0,2); mrplot3(AFTER,0,0,3); mrplot3(LABEL,LABEL,0,2); mrplot3(-LABEL,0,0,3); mrplot3(LABEL,-LABEL,0,2); mplot3(0,-LNGTH3D,0,3); mplot3(0,LNGTH3D,0,2); mrplot3(0,AFTER,0,3); mrplot3(0,half,0,2); mrplot3(half,half,0,2); mrplot3(-LABEL,0,0,3); mrplot3(half,-half,0,2); mplot3(0,0,-LNGTH3D,3); mplot3(0,0,LNGTH3D,2); mrplot3(0,0,AFTER,3); mrplot3(0,0,LABEL,2); mrplot3(0,LABEL,-LABEL,2); mrplot3(0,0,LABEL,2); } /* * draw the entire display: */ draw_all() { register char *p; register int j; switch( flag.view ) { case VIEW2: mmult(xform , &quarters[STLEFT][0] , m1); mmult(xform , &quarters[STRIGHT][0] , m2); break; case VIEW4: mmult(xform , &quarters[UPPERRIGHT][0] , m1); /* transform for upper right corner */ break; } zero_flags(); /* set all flags to 0 so don't draw a line twice */ mseg( -CTLPTS); /* turn off ctl pts */ mseg( MESG ); mplot2(MESGX , MESGY , 3); mstring(MESGSCL , "Drawing . . ."); burp(); mseg( OBJECT ); new_matrix(OBJECT , xform); mblank(OBJECT); if( flag.view==VIEW1 ) new_window( OBJECT , LEFT , BOTTOM , RIGHT , TOP); for(p=pltch.nextpl; p!=0; p=p->nextpl) if( p->flagpl==0 ) { p->flagpl++; draw_pl( p ); } for(p= line.nextl; p!=0; p=p->nextl) if( p->flag==0 ) { p->flag++; draw_line(p); } for(p=crv.nextc; p!=0; p=p->nextc) if( p->flag==0 ) { p->flag++; draw_crv(p); } for(p=arc.nexta; p!=0; p=p->nexta) if( p->flag==0 ) { p->flag++; draw_arc(p); } mgetsub( TRACES ); mintsty(15); /* intensity for moving */ mmark(); /* mark for moving */ /* draw the control points: */ mseg(CTLPTS); switch( flag.view ) { case VIEW1: new_matrix(CTLPTS , xform); new_window(CTLPTS , LEFT , BOTTOM , RIGHT , TOP); break; case VIEW2: new_matrix(CTLPTS , m2); new_window(CTLPTS , (LEFT+RIGHT)/2 , BOTTOM , RIGHT , TOP); break; case VIEW4: new_matrix(CTLPTS , m1); new_window(CTLPTS , (LEFT+RIGHT)/2 , (TOP+BOTTOM)/2 , RIGHT , TOP); break; } for(p=crv.nextc; p!=0; p=p->nextc) { switch( p->whatc ){ case BZ: case OH: point_plot(p->c2 , p->c3); break; } } mseg( -MESG ); if( flag.view==VIEW1 ) { mblank(-OBJECT); return; } /* do stereopairs: */ if( flag.view == VIEW2 ) { mseg(STLEFT); new_matrix(STLEFT , m1); new_window(STLEFT , LEFT , BOTTOM , (LEFT+RIGHT)/2 , TOP); mgetsub(OBJECT); mseg(STRIGHT); new_matrix(STRIGHT , m2); new_window(STRIGHT , (LEFT+RIGHT)/2 , BOTTOM , RIGHT , TOP); mgetsub(OBJECT); return; } /* initialize the 4 corners */ for(j=LOWERLEFT; j<=LOWERRIGHT; j++) { mseg(j); new_matrix(j , (j==UPPERRIGHT) ? &m1[0][0] : &quarters[j][0]); if( j==UPPERRIGHT ) new_window(j , (LEFT+RIGHT)/2 , (BOTTOM+TOP)/2 , RIGHT , TOP); mgetsub(OBJECT); } } /* * draw the given arc: */ float cda { 0.996 } , sda { 0.087 }; /* these are for 5 degrees */ draw_arc(aap) char *aap; { register char *ap; char *vp; register int j , x; int y , z , a[3] , b[3] , c[3]; float cosa , sina , newc; ap = aap; for(j=0; j<3; j++) { c[j] = ap->c->coord[j]; /* center */ a[j] = ap->a1->coord[j] - c[j]; /* relative to center */ b[j] = ap->a2->coord[j] - c[j]; } cosa = 1.0; sina = 0.0; /* start at 0 degrees */ vp = ap->a1; mplot3(vp->x , vp->y , vp->z , 3); for(j=0; j<18; j++) { newc = cosa*cda - sina*sda; sina = sina*cda + cosa*sda; cosa = newc; x = cosa*a[0] + sina*b[0] + c[0]; y = cosa*a[1] + sina*b[1] + c[1]; z = cosa*a[2] + sina*b[2] + c[2]; mplot3(x,y,z , 2); } } /* * draw the given curve: */ #define NSTEPS 10 /* # line segments in each curve */ draw_crv(acp) char *acp; { register char *cp , *vp; register int j; int i; float t , tt[4] , xyz[4] , dt; int c1 , c2 , c3 , c4; cp = acp; switch( cp->whatc ) { case BZ: for(j=0; j<3; j++) { c1 = cp->c1->coord[j]; c2 = cp->c2->coord[j]; c3 = cp->c3->coord[j]; c4 = cp->c4->coord[j]; m3[0][j] = -c1 + 3*c2 - 3*c3 + c4; m3[1][j] = 3*(c1-c2-c2+c3); m3[2][j] = 3*(c2-c1); m3[3][j] = c1; m3[j][3] = 0.0; } m3[3][3] = 1.0; break; case OH: for(j=0; j<3; j++) { m3[0][j] = cp->c2->coord[j]; m3[1][j] = cp->c1->coord[j]; m3[2][j] = cp->c4->coord[j]; m3[3][j] = cp->c3->coord[j]; m3[j][3] = 0.0; } m3[3][3] = 0.; mmult(ohmat , m3 , m3); break; } /* multiply by the [t**3 t**2 t 1] vector: */ t = 0.0; dt = 1.0/NSTEPS; tt[3] = 1.0; vp = cp->c1; /* vp points to the first point */ mplot3( vp->x , vp->y , vp->z , 3); for(i=0; il1; pv2=lp->l2; mplot3( pv1->x , pv1->y , pv1->z , 3); mplot3( pv2->x , pv2->y , pv2->z , 2); } /* * draw the little cubes at all marked points: */ char mstr[] {"00"}; draw_marks() { register char *p; register int i , j; mseg(MARKER); switch( flag.view ) { case VIEW1: new_matrix(MARKER , xform); break; case VIEW2: mmult(xform , &quarters[STRIGHT][0] , m1); new_matrix(MARKER , m1); break; case VIEW4: mmult(xform , &quarters[UPPERRIGHT][0] , m1); new_matrix(MARKER , m1); break; } i = j = 0; num_m = 0; for(p=mark.mark; p!= -1; p=p->mark) { mplot3(p->x , p->y , p->z , 3); mgetsub( SMALLCUBE ); mstr[0] = '0' + i; mstr[1] = '0' + j; if( ++j == 9 ) { i++; j=0; } if( mstr[0]=='0' ) mstr[0] = ' '; mstring(1 , mstr); num_m++; } } /* * only draw the lines, curves, and arcs that are affected by a given point: */ draw_only(apv) char *apv; { register char *pv , *p; pv=apv; zero_flags(); for(p=line.nextl; p!=0; p=p->nextl) if( p->l1==pv || p->l2==pv ) if( p->flag==0 ) { p->flag++; draw_line(p); } for(p=crv.nextc; p!=0; p=p->nextc) if( p->c1==pv || p->c2==pv || p->c3==pv || p->c4==pv ) if( p->flag==0 ) { p->flag++; draw_crv(p); } for(p=arc.nexta; p!=0; p=p->nexta) if( p->a1==pv || p->a2==pv || p->c==pv ) if( p->flag==0 ) { p->flag++; draw_arc(p); } } /* * draw the given platch: */ draw_pl(app) struct pltch *app; { register struct pltch *pp; register int j; register char *bp; pp = app; for(j=0; jnsides; j++) { bp = pp->side[j].which; /* points to boundary line/curve/arc */ if( bp->flag ) continue; bp->flag++; switch( pp->side[j].what ) { case LINE: draw_line(bp); break; case CURVE: draw_crv(bp); break; case ARC: draw_arc(bp); break; } } } /* * get the address of the i th element of a list: */ char *get_i_th(start , ii) char *start; int ii; { register char *p; register int i; i=ii; p=start; while(i--) p=p->next; return(p); } /* * return a pointer to the last element of a list: * (only works because all structs have the "next" pointer in the first word) */ char *get_last(start) char *start; { register char *p; for(p=start; p->next!=0; p=p->next); return(p); } /* * locate the platch indicated by the 4 marks: */ char *get_pltch() { register char *p , *w , *pp; char *p1 , *p2 , *p3 , *p4; int j; draw_marks(); if( num_m < 4 ) { mesg("Need 4 Marks"); return(0); } if( num_pl<=0 ) { mesg("No Platches in Data Structure"); return(0); } p4 = (p3 = (p2 = (p1=mark.mark)->mark )->mark )->mark; for(p=pltch.nextpl; p!=0; p=p->nextpl) { for(j=0; jnsides; j++) { w = p->side[j].which; switch( p->side[j].what ) { case LINE: if( (pp=w->l1)!=p1 && pp!=p2 && pp!=p3 && pp!=p4 ) goto contin; if( (pp=w->l2)!=p1 && pp!=p2 && pp!=p3 && pp!=p4 ) goto contin; break; case CURVE: if( (pp=w->c1)!=p1 && pp!=p2 && pp!=p3 && pp!=p4 ) goto contin; if( (pp=w->c4)!=p1 && pp!=p2 && pp!=p3 && pp!=p4 ) goto contin; break; case ARC: if( (pp=w->a1)!=p1 && pp!=p2 && pp!=p3 && pp!=p4 ) goto contin; if( (pp=w->a2)!=p1 && pp!=p2 && pp!=p3 && pp!=p4 ) goto contin; break; } } /* if got this far, must have found the platch in question: */ return(p); contin:; } return(0); /* did not find any! */ } /* * highlight a single platch: */ hilite_pltch(pp , iflag) char *pp; { register char *p; p=pp; if( iflag ) { mseg(-HILITE); switch( flag.view ) { case VIEW1: mdim(OBJECT , 15); break; case VIEW2: mdim(STRIGHT , 15); break; case VIEW4: mdim(UPPERLEFT , 15); break; } return; } mseg(HILITE); switch( flag.view ) { case VIEW1: mdim(OBJECT , DIM); new_matrix(HILITE , xform); break; case VIEW2: mdim(STRIGHT , DIM); mmult(xform , &quarters[STRIGHT][0] , m1); new_matrix(HILITE , m1); break; case VIEW4: mdim(UPPERLEFT , DIM); mmult(xform , &quarters[UPPERRIGHT][0] , m1); new_matrix(HILITE , m1); break; } zero_flags(); draw_pl( p ); } /* * see if a given coordinate is specifying a command in a given menu: */ hit_menu(amp , hx , hy) struct menu *amp; int hx , hy; { register struct menu *mp; register int j; j=0; for(mp=amp; mp->menu_s!=0; mp++) { if( mp->ints==0 ) { j++; continue; /* this option turned off */ } if( hit_string(mp->menu_s , mp->mx , mp->my , mp->scale , hx , hy) ) return(j); j++; } return(-1); } /* * test to see if 2D cursor is over a point: * (return a pointer to it if it is, else return 0) */ char *hit_pt(ix , iy) { register struct vert *p; register int x , y; x=ix; y=iy; if( flag.proj ) proj_all(); /* may need to project the points to 2D first */ for(p=vert.nextv; p!=0; p=p->nextv) { if( abs(x - p->sx) > BOX ) continue; if( abs(y - p->sy) > BOX ) continue; return(p); } return(0); } /* * see if a given position lies within a given string: */ hit_string(as , ix , iy , scal , hx , hy) char *as; int ix , iy , scal , hx , hy; { register char *s; register int d , scl; scl = scal; scl=& 07; s=as; d = 9*(++scl); if( abs(hy-iy) > d ) return(0); d = 6*scl * count_char(s); return( ( abs(hx-ix) <= d ) ); } /* * initialize the program data: */ init() { register int twice , j; register char *now; register float *fp; float scl; float c , s; /* used for stereopairs */ float t , dt , t2 , t3; char *sbrk(); vert.nextv = pltch.nextpl = line.nextl = crv.nextc = arc.nexta = free.nextf = 0; /* set free list to be entire rest of memory: */ now=sbrk(0); now++; now=& ~1; /* word boundary */ brk(0157776); /* break to end */ free.nextf = now; now->nextf = 0; now->nbytes = 0157776 - now; flag.xyz = X; flag.view = VIEW1; num_m = 0; mark.mark = -1; /* nothing in mark list */ meg_setup(); dev_init(); /* init joystick & kb */ /* init the Overhauser and Bezier matrices (bug in cc40!): */ fp = &ohmat[0][0]; *fp++= -.5; *fp++= 1.5; *fp++= -1.5; *fp++= .5; *fp++= 1.; *fp++= -2.5; *fp++= 2.; *fp++= -.5; *fp++= -.5; *fp++=0.; *fp++= .5; *fp++=0.; *fp++= 0.; *fp++= 1.; *fp++= 0.; *fp= 0.; fp = &bzmat[0][0]; *fp++= -1.; *fp++= 3.; *fp++= -3.; *fp++= 1.; *fp++= 3.; *fp++= -6.; *fp++= 3.; *fp++= 0.; *fp++= -3.; *fp++= 3.; *fp++= 0.; *fp++= 0.; *fp++= 1.; *fp++= 0.; *fp++= 0.; *fp= 0.; /* init the mark seg */ mseg(MARKER); /* create the 2D cursor */ twice = BOX<<1; /* = length of one side */ mseg(CURSOR); mwindow(-2048+BOX , -2048+BOX , 2047-BOX , 2047-BOX); mcursor(CURSOR); mdash(CURSOR , DASH); mrplot2(-BOX,-BOX,3); mrplot2(twice , 0 , 2); mrplot2(0 , twice , 2); mrplot2(-twice , 0 , 2); mrplot2(0 , -twice , 2); /* draw the background */ mseg(BACKG); mplot2(-2048,-2048,3); mplot2(2047,-2048,2); mplot2(2047,2047,2); mplot2(-2048,2047,2); mplot2(-2048,-2048,2); mplot2(LEFT,BOTTOM,3); mplot2(RIGHT,BOTTOM,2); mplot2(RIGHT,-2048,3); mplot2(RIGHT,TOP,2); mmark(); ident( &xform[0][0] ); /* set global matrix to identity */ ident( &curs_xform[0][0] ); /* set the cursor transformation to identity */ /* generate the little cube to be used for marks: */ mseg( SMALLCUBE ); mblank( SMALLCUBE ); twice = CUBE<<1; /* length of one side */ mrplot3(-CUBE , -CUBE , -CUBE , 3); mrplot3(twice , 0 , 0 , 2); mrplot3(0 , twice , 0 , 2); mrplot3(-twice , 0 , 0 , 2); mrplot3(0 , -twice , 0 , 2); mrplot3(0 , 0 , twice , 2); mrplot3(twice , 0 , 0 , 2); mrplot3(0 , twice , 0 , 2); mrplot3(-twice , 0 , 0 , 2); mrplot3(0 , -twice , 0 , 2); mrplot3(0 , twice , 0 , 3); mrplot3(0 , 0 , -twice , 2); mrplot3(twice , 0 , 0 , 3); mrplot3(0 , 0 , twice , 2); mrplot3(0 , -twice , 0 , 3); mrplot3(0 , 0 , -twice , 2); mseg( TRACES ); mblank(TRACES); mmark(); flag.view = VIEW1; /* setup transformations for quarters of 4 views: */ scl = 0.5; for(j=LOWERLEFT; j<=STRIGHT; j++) ident( &quarters[j][0] ); quarters[UPPERLEFT][5] = quarters[UPPERLEFT][10] = quarters[LOWERRIGHT][0] = quarters[LOWERRIGHT][10] = 0.0; quarters[UPPERLEFT][6] = quarters[LOWERRIGHT][2] = 1.0; quarters[UPPERLEFT][9] = quarters[LOWERRIGHT][8] = -1.0; ident(m1); m1[0][0] = m1[1][1] = scl; /* matrix to scale down pictures */ m1[3][0] = 0.75*LEFT + 0.25*RIGHT; m1[3][1] = 0.75*BOTTOM + 0.25*TOP; mmult( &quarters[LOWERLEFT][0] , m1 , &quarters[LOWERLEFT][0] ); m1[3][1] = 0.25*BOTTOM + 0.75*TOP; mmult( &quarters[UPPERLEFT][0] , m1 , &quarters[UPPERLEFT][0] ); m1[3][0] = 0.25*LEFT + 0.75*RIGHT; mmult( &quarters[UPPERRIGHT][0] , m1 , &quarters[UPPERRIGHT][0] ); m1[3][1] = 0.75*BOTTOM + 0.25*TOP; mmult( &quarters[LOWERRIGHT][0] , m1 , &quarters[LOWERRIGHT][0] ); c = COS5; s = SIN5; /* use 5 degrees */ m1[3][0] = 0.75*LEFT + 0.25*RIGHT; m1[3][1] = 0.0; ident( m2 ); m2[0][0] = m2[2][2] = c; m2[0][2] = -( m2[2][0] = s ); mmult( m2 , m1 , m1 ); mmult( &quarters[STLEFT][0] , m1 , &quarters[STLEFT][0] ); ident(m1); m1[0][0] = m1[1][1] = scl; /* matrix to scale down pictures */ m1[3][0] = 0.25*LEFT + 0.75*RIGHT; m2[2][0] = -( m2[0][2] = s ); mmult(m2 , m1 , m1); mmult( &quarters[STRIGHT][0] , m1 , &quarters[STRIGHT][0] ); /* setup b0 , b1 , db0dt , db1dt arrays: */ t=0.0; dt = 1./NFILL; for(j=0; j<=NFILL; j++) { t3 = t*(t2=t*t); b0[j] = 1. - (b1[j]= 3.*t2 - 2.*t3); db0dt[j] = -( db1dt[j]= 6.*t*(1.-t) ); t=+ dt; } } /* * determine if the given bounding curve is a line: * can happen one of 2 ways: * (1) really is a line * (2) is a curve with colinear pts */ is_line(what , which) char *which; { register struct vert *vp , *vp1 , **p; int j , xydone , xzdone , infxy , infxz; float xy , xz , n , d , fabs(); if( what==LINE ) return(1); /* that was easy */ if( what==ARC ) return(0); /* ditto */ /* see if 4 pts of curve are colinear: */ p = &which->c1; vp1 = *p++; /* points to pt #1 */ infxy = infxz = xydone = xzdone = 0; /* clear flags */ for(j=1; j<=3; j++) { vp = *p++; /* points to current point */ if( vp==vp1 ) continue; /* possible to have 2 pts the same */ n = vp->x - vp1->x; d = vp->y - vp1->y; if( fabs(d) == 0.0 ) { /* since were using integers, d would be exactly 0.0 */ if( xydone ) { if( infxy==0 ) return(0); } else { xydone++; infxy++; } } else { if( xydone==0 ) { xy = n/d; xydone++; } else { if( fabs(xy - (n/d)) > LINETOL ) return(0); } } d = vp->z - vp1->z; if( fabs(d) == 0.0 ) { /* since were using integers, d would be exactly 0.0 */ if( xzdone ) { if( infxz==0 ) return(0); } else { xzdone++; infxz++; } } else { if( xzdone==0 ) { xz = n/d; xzdone++; } else { if( fabs(xz - (n/d)) > LINETOL ) return(0); } } } return(1); /* if got to here, they all are colinear (I think) */ } /* * i_th : returns the ordinal number of the address in the * given list. The first element (the one pointed to by * start) is element 0. */ i_th(start , iaddr) char *start , *iaddr; { register char *p , *addr; register int j; addr = iaddr; j=0; for(p=start; p!=0; p=p->next) { if( p==addr ) return(j); j++; } return(-1); /* failure */ } /* * exchange two memory locations: */ ixchg(mem1 , mem2) int *mem1 , *mem2; { register int tmp; tmp = *mem2; *mem2 = *mem1; *mem1 = tmp; } /* * loop till have found a menu hit. * return that hit #. * a non-zero flag means return on any button strike. */ loop(amp , iflag) struct menu *amp; { register struct menu *mp; register int i; int ix , iy; mp=amp; if( nargs()==1 ) iflag = 0; for(EVER) { mdim(CURSOR , 12); while( (i=mbutton()) == 0 ); /* wait for a button strike */ mmouse(&ix , &iy); if( (i=hit_menu(mp,ix,iy)) >= 0) { mdim(CURSOR , 15); return(i); } if( iflag ) { mdim(CURSOR , 15); return( -1 ); } } } /* * fill the matrix "xform" to reflect the current transformation: */ make_xform() { register float *fp; fp = &xform[0][0]; *fp++ = cosy*cosz*sclxyz; *fp++ = cosy*sinz*sclxyz; *fp++ = -siny*sclxyz; *fp++ = 0.0; *fp++ = (sinx*siny*cosz - cosx*sinz) * sclxyz; *fp++ = (sinx*siny*sinz + cosx*cosz) * sclxyz; *fp++ = sinx*cosy*sclxyz; *fp++ = 0.0; *fp++ = (cosx*siny*cosz + sinx*sinz) * sclxyz; *fp++ = (cosx*siny*sinz - sinx*cosz) * sclxyz; *fp++ = cosx*cosy*sclxyz; *fp++ = 0.0; *fp++ = *fp++ = *fp++ = 0.0; *fp = 1.0; fp = &m1[3][0]; ident( m1 ); *fp++ = tranx; *fp++ = trany; *fp = tranz; mmult(m1 , xform , xform); } /* * mark the given point: */ markit(pp) char *pp; { register char *p , *last; if( (p=pp)->mark ) { mesg("Already Marked!"); return; } for(last= &mark; last->mark!= -1; last=last->mark); last->mark = p; p->mark = -1; draw_marks(); } /* * remove all marks: */ all_un_mark() { register char *p; for(p=vert.nextv; p!=0; p=p->nextv) p->mark = 0; mark.mark = -1; draw_marks(); } /* * remove the given point from the mark list: */ un_markit(pp) char *pp; { register char *p , *mp; if( (p=pp)->mark == 0 ) { mesg("Not Marked"); return; } for(mp= &mark; mp->mark!=p; mp=mp->mark); /* mp now points to structure before the one destroying: */ mp->mark = p->mark; p->mark = 0; draw_marks(); } /* * display a message for one second: */ mesg(str) char *str; { mseg( MESG ); mplot2(MESGX , MESGY , 3); burp(); mstring(MESGSCL , str); sleep(2); mseg( -MESG ); } /* * move a pt: */ move() { register int j; int x , y , z; /* save the given point's original values */ x = point->x; y = point->y; z = point->z; plot_menu( &menu2 ); for(EVER) { switch( (j=loop(&menu2)) ) { case EXIT: point->x = x_3d; point->y = y_3d; point->z = z_3d; project( point ); /* change it to 2D */ draw_all(); draw_marks(); flag.write++; /* set written flag */ mseg( -MOVER ); return; case ABORT: point->x = x; point->y = y; point->z = z; project( point ); mappend(OBJECT); mreset(); update_curs(); mseg( -MOVER ); return; case XM: flag.xyz = X; move_pt(); break; case YM: flag.xyz = Y; move_pt(); break; case ZM: flag.xyz = Z; move_pt(); break; case XYM: flag.xyz = XY; move_pt(); break; case XZM: flag.xyz = XZ; move_pt(); break; case YZM: flag.xyz = YZ; move_pt(); break; } } } /* * do the dirty work in moving a point: */ move_pt() { register int dx , dy; int idx , idy; mblank(CURSOR); mappend( OBJECT ); mmark(); mdim(OBJECT , DIM); while( mbutton() ) { mdirections(&idx , &idy); /* read joystick byte and get js directions */ dx = idx; dy = idy; switch( flag.xyz ) { case X: point->x = (x_3d=+ dx); break; case Y: point->y = (y_3d=+ dy); break; case Z: point->z = (z_3d=+ dx-dy); break; case XY: point->x = (x_3d=+ dx); point->y = (y_3d=+ dy); break; case XZ: point->x = (x_3d=+ dx); point->z = (z_3d=+ dy); break; case YZ: point->y = (y_3d=+ dy); point->z = (z_3d=+ dx); break; } mreset(); mintsty(15); draw_only(point); /* translate the 3D cursor: */ update_curs(); } /* make 2D cursor re-appear */ mblank(-CURSOR); } /* * change the color of a platch: */ new_color( p ) struct pltch *p; { plot_menu( &menu6 ); mseg(MESG); mplot2(MESGX , MESGY , 3); mstring(MESGSCL , "Old color was: "); mstring(MESGSCL , menu6[p->color].menu_s ); burp(); return( loop(&menu6) ); } /* * change the parameters of a platch: */ parameters(pp) struct pltch *pp; { register struct pltch *p; register int j; p=pp; hilite_pltch(p , 0); plot_menu( &menu5 ); for(;;) { switch( (j=loop(&menu5)) ) { case EXIT: hilite_pltch(p , 1); return; case COLOR: p->color = new_color(p); mseg(-MESG); plot_menu(&menu5); continue; case TRANSPARENCY: continue; } } } /* * draw a line: */ plot_line(x1,y1,z1 , x2,y2,z2) { mplot3(x1,y1,z1,3); mplot3(x2,y2,z2,2); } /* * draw the given menu: */ plot_menu(amp) struct menu *amp; { register struct menu *mp; register int i; mseg(MENU); for(mp=amp; mp->menu_s!=0; mp++) { if( (i=mp->ints)==0 ) continue; mintsty(i); center_string(mp->menu_s , mp->mx , mp->my , mp->scale); } burp(); } /* * plot points at the given vertices: */ point_plot( arg1 ) int *arg1; { register int n; register int *p , *vp; if( (n=nargs()) <= 0 ) return; p = &arg1; while( n-- ) { vp = *p; mplot3(vp->x , vp->y , vp->z , 5); p++; } } /* * list the current state of the data structure: */ print() { register char *p; register int i , j; printf("\n\7\7"); printf("\n\n\t%d points:",num_v); for(p=vert.nextv; p!=0; p=p->nextv) printf("\n%o\t%d\t%d\t%d", p , p->x , p->y , p->z); printf("\n\n\t%d platches:", num_pl); for(p=pltch.nextpl; p!=0; p=p->nextpl) { i = p->nsides; printf("\n%o\t",p); for(j=0; jside[j].what ) { case LINE: printf("L"); break; case CURVE: printf("C"); break; case ARC: printf("A"); break; } printf("\t%o\t", p->side[j].which); } } printf("\n\n\t%d lines:", num_l); for(p=line.nextl; p!=0; p=p->nextl) printf("\n%o\t%o\t%o", p , p->l1 , p->l2); printf("\n\n\t%d curves:",num_c); for(p=crv.nextc; p!=0; p=p->nextc) { printf("\n%o\t", p); switch( p->whatc ) { case OH: printf("OH"); break; case BZ: printf("BZ"); break; } printf("\t%o\t%o\t%o\t%o", p->c1 , p->c2 , p->c3 , p->c4); } printf("\n\n\t%d arcs:",num_a); for(p=arc.nexta; p!=0; p=p->nexta) printf("\n%o\t%o\t%o\t%o", p , p->a1 , p->a2 , p->c); printf("\n\n\tFree List:"); for(p=free.nextf; p!=0; p=p->nextf) printf("\n%o\t%d", p , p->nbytes); printf("\n\7\7\7"); mesg("Done"); } /* * convert a 3D point into a 2D point depending on xform[][] : */ project( pp ) struct vert *pp; { register struct vert *p; register float *fp , *mp; float xyz[4]; make_xform(); switch( flag.view ) { case VIEW1: mp = &xform[0][0]; break; case VIEW2: mmult(xform , &quarters[STRIGHT][0] , m1); mp = &m1[0][0]; break; case VIEW4: mmult(xform , &quarters[UPPERRIGHT][0] , m1); mp = &m1[0][0]; break; } p = pp; fp = &xyz[0]; *fp++ = p->x; *fp++ = p->y; *fp++ = p->z; *fp = 1.0; vmult(xyz , mp , xyz); fp = &xyz[0]; p->sx = *fp++; p->sy = *fp; } /* * convert all 3D points to 2D: */ proj_all() { register struct vert *p; for(p=vert.nextv; p!=0; p=p->nextv) project( p ); flag.proj = 0; } /* * change the global scale factor: */ scl_xform( s ) float s; { sclxyz=* s; } /* * fork off a shading job: */ char shprt[] { "Job 0000 Sent" }; char tmpname[] { "/tmp/eda" }; shader() { int di , dj; register int i , j , k; char c; char *p; float xyz[4] , sqrt() , cosang; int buf[18] , level; /* find a unique filename */ for(c='a'; c<='z'; c++) { tmpname[7] = c; if( stat(tmpname , buf) < 0 ) /* an unused name found */ break; if( c=='z' ) { /* no unused names found */ mesg("Cannot Make a Temporary File"); return; } } close( iobuf[0] ); /* want to re-use the iobuf */ if( fcreat(tmpname , iobuf) < 0 ) { printf("\"\n Cannot create %s\7\7",tmpname); mesg("Cannot Create Temp File"); return; } /* fill the platches: */ mseg( MESG ); mplot2(MESGX , MESGY , 3); mstring(MESGSCL , "Writing Data File . . ."); burp(); for(p=pltch.nextpl; p!=0; p=p->nextpl) { di = dj = 1; /* normal increment for i and j */ fill_traces(p , 1); /* get points and surface normals */ /* short-circuit if straight edges: */ if( is_line(p->side[0].what,p->side[0].which) && is_line(p->side[2].what,p->side[2].which) ) di = NFILL; if( is_line(p->side[1].what,p->side[1].which) && is_line(p->side[3].what,p->side[3].which) ) dj = NFILL; for(i=0; i<=NFILL; i=+ di) { for(j=0; j<=NFILL; j=+ dj) { xyz[3] = 1.0; for(k=0; k<3; k++) xyz[k] = fillin[i][j].val[k]; vmult(xyz , xform , xyz); fillin[i][j].xfs = xyz[0]; fillin[i][j].yfs = xyz[1]; fillin[i][j].zfs = xyz[2]; xyz[0] = fillin[i][j].nx; xyz[1] = fillin[i][j].ny; xyz[2] = fillin[i][j].nz; xyz[3] = 0.0; vmult(xyz , xform , xyz); /* dot this with (0,0,1) */ cosang = xyz[2]/sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1] + xyz[2]*xyz[2]); level = 29.*cosang*cosang + 0.5; /* shade # (0-29) */ fillin[i][j].nx = 32*p->color + level + 1; /* hide color in here */ } } /* send them: */ for(i=0; i=4; j--) { shprt[j] = '0' + pid%10; pid=/ 10; } mesg( shprt ); mesg( shprt ); } } /* * send the x, y, z, and color for the given point: */ shsend( pp ) char *pp; { register char *p; register int x , y; x = (p=pp)->xfs; y = p->yfs; x=>> 3; x=+ 256; /* change (-2048,2047) to (0,511) */ y=>> 3; y=+ 256; putw(x , iobuf); putw(y , iobuf); putw(p->zfs , iobuf); putw(p->nx , iobuf); /* color */ } /* * update the values of tranx, trany, and tranz: */ tran_xform(axis) { register int l; l = TRAN; ident( m1 ); if( axis < 0 ) { l = -TRAN; axis = -axis; } switch( axis ) { case X: tranx=+ l; break; case Y: trany=+ l; break; case Z: tranz=+ l; break; } } /* * re-draw the 3D cursor somewhere else: */ update_curs() { register struct vert *p; register float *fp; register int j; p=point; fp = &curs_xform[3][0]; ident( curs_xform ); *fp++ = x_3d = p->x; *fp++ = y_3d = p->y; *fp = z_3d = p->z; mmult(curs_xform , xform , m1); switch( flag.view ) { case VIEW1: new_matrix(CURS3D , m1); break; case VIEW2: mmult(m1 , &quarters[STLEFT][0] , m2); new_matrix(LCURS3D , m2); mmult(m1 , &quarters[STRIGHT][0] , m2); new_matrix(RCURS3D , m2); break; case VIEW4: mmult(m1 , &quarters[UPPERRIGHT][0] , m1); new_matrix(CURS3D , m1); break; } } /* * wait for the last job spun off: */ waitez() { register int id; int status; do { id = wait( &status ); } while( id>0 && id!=pid ); } /* * set flags to zero: */ zero_flags() { register char *p; for(p=vert.nextv; p!=0; p=p->nextv) p->flag=0; for(p=pltch.nextpl; p!=0; p=p->nextpl) p->flag=0; for(p=line.nextl; p!=0; p=p->nextl) p->flag=0; for(p=crv.nextc; p!=0; p=p->nextc) p->flag=0; for(p=arc.nexta; p!=0; p=p->nexta) p->flag=0; } x(CURS3D , m1); break; } } /* * wait for the last job spun off: */ waitez() { register int id; int status; do { id = wait( &status ); } while( id>0 && id!=pid ); } /* * set flags to zero: */ zero_flags() { register char *p; for(p=vert.nextv; p!=0; p=p->nextv) p->flag=0; for(p=pltch.nextp); p++; } } /* * list the current state of the data structure: */ print() { register char *p; register int i , j; printf("\n\7\7"); printf("\n\n\t%d points:",num_v); for(p=vert.nextv; p!=0; p=p->nextv) printf("\n%o\t%d\t%d\t%d", p , p->x , p->y , p->z); printf("\n\n\t%d platches:", num_pl); for(p=pltch.nextpl; p!=0; p=p->nextpl) { i = p->nsides; printf("\n%o\t",p); for(j=0; jside[j].what ) { case LINE: printf("L"); break; case CURVE: printf("C"); break; case ARC: printf("A"); break; } printf("\t%o\t", p->side[j].which); } } printf("\n\n\t%d lines:", num_l); for(p=line.nextl; p!=0; p=p->nextl) printf("\n%o\t%o\t%o", p , p->l1 , p->l2); printf("\n\n\t%d curves:",num_c); for(p=crv.nextc; p!=0; p=p->nextc) { printf("\n%o\t", p); switch( p->whatc ) { case OH: printf("OH"); break; case BZ: printf("BZ"); break; } printf("\t%o\t%o\t%o\t%o", p->c1 , p->c2 , p->c3 , p->c4); } printf("\n\n\t%d arcs:",num_a); for(p=arc.nexta; p!=0; p=p->nexta) printf("\n%o\t%o\t%o\t%o", p , p->a1 , p->a2 , p->c); printf("\n\n\tFree List:"); for(p=free.nextf; p!=0; p=p->nextf) printf("\n%o\t%d", p , p->nbytes); printf("\n\7\7\7"); mesg("Done"); } /* * convert a 3D point into a 2D point depending on xform[][] : */ project( pp ) struct vert *pp; { register struct vert *p; register float *fp , *mp; float xyz[4]; make_xform(); switch( flag.view ) { case VIEW1: mp = &xform[0][0]; break; case VIEW2: mmult(xform , &quarters[STRIGHT][0] , m1); mp = &m1[0][0]; break; case VIEW4: mmult(xform , &quarters[UPPERRIGHT][0] , m1); mp = &m1[0][0]; break; } p = pp; fp = &xyz[0]; *fp++ = p->x; *fp++ = p->y; *fp++ = p->z; *fp = 1.0; vmult(xyz , mp , xyz); fp = &xyz[0]; p->sx = *fp++; p->sy = *fp; } /* * convert all 3D points to 2D: */ proj_all() { register struct vert *p; for(p=vert.nextv; p!=0; p=p->nextv) project( p ); flag.proj = 0; } /* * change the global scale factor: */ scl_xform( s ) float s; { sclxyz=* s; } /* * fork off a shading job: */ char shprt[] { "Job 0000 Sent" }; char tmpname[] { "/tmp/eda" }; shader() { int di , dj; register int i , j , k; char c; char *p; float xyz[4] , sqrt() , cosang; int buf[18]; /* find a unique filename */ for(c='a'; c<='z'; c++) { tmpname[7] = c; if( stat(tmpname , buf) < 0 ) /* an unused name found */ break; if( c=='z' ) { /* no unused names found */ mesg("Cannot Make a Temporary File"); return; } } close( iobuf[0] ); /* want to re-use the iobuf */ if( fcreat(tmpname , iobuf) < 0 ) { printf("\"\n Cannot create %s\7\7",tmpname); mesg("Cannot Create Temp File"); return; } /* fill the platches: */ mseg( MESG ); mplot2(MESGX , MESGY , 3); mstring(MESGSCL , "Writing Data File . . ."); burp(); for(p=pltch.nextpl; p!=0; p=p->nextpl) { di = dj = 1; /* normal increment for i and j */ fill_traces(p , 1); /* get points and surface normals */ /* short-circuit if straight edges: */ if( is_line(p->side[0].what,p->side[0].which) && is_line(p->side[2].what,p->side[2].which) ) di = NFILL; if( is_line(p->side[1].what,p->side[1].which) && is_line(p->side[3].what,p->side[3].which) ) dj = NFILL; for(i=0; i<=NFILL; i=+ di) { for(j=0; j<=NFILL; j=+ dj) { xyz[3] = 1.0; for(k=0; k<3; k++) xyz[k] = fillin[i][j].val[k]; vmult(xyz , xform , xyz); fillin[i][j].xfs = xyz[0]; fillin[i][j].yfs = xyz[1]; fillin[i][j].zfs = xyz[2]; xyz[0] = fillin[i][j].nx; xyz[1] = fillin[i][j].ny; xyz[2] = fillin[i][j].nz; xyz[3] = 0.0; vmult(xyz , xform , xyz); /* dot this with (0,0,1) */ cosang = xyz[2]/sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1] + xyz[2]*xyz[2]); fillin[i][j].nx = 240*cosang*cosang; /* hide color in here */ } } /* send them: */ for(i=0; i=4; j--) { shprt[j] = '0' + pid%10; pid=/ 10; } mesg( shprt ); mesg( shprt ); } } /* * send the x, y, z, and color for the given point: */ shsend( pp ) char *pp; { register char *p; register int x , y; x = (p=pp)->xfs; y = p->yfs; x=>> 3; x=+ 256; /* change (-2048,2047) to (0,511) */ y=>> 3; y=+ 256; putw(x , iobuf); putw(y , iobuf); putw(p->zfs , iobuf); putw(p->nx , iobuf); } /* * update the values of tranx, trany, and tranz: */ tran_xform(axis) { register int l; l = TRAN; ident( m1 ); if( axis < 0 ) { l = -TRAN; axis = -axis; } switch( axis ) { case X: tranx=+ l; break; case Y: trany=+ l; break; case Z: tranz=+ l; break; } } /* * re-draw the 3D cursor somewhere else: */ update_curs() { register struct vert *p; register float *fp; register int j; p=point; fp = &curs_xform[3][0]; ident( curs_xform ); *fp++ = x_3d = p->x; *fp++ = y_3d = p->y; *fp = z_3d = p->z; mmult(curs_xform , xform , m1); switch( flag.view ) { case VIEW1: new_matrix(CURS3D , m1); break; case VIEW2: mmult(m1 , &quarters[STLEFT][0] , m2); new_matrix(LCURS3D , m2); mmult(m1 , &quarters[STRIGHT][0] , m2); new_matrix(RCURS3D , m2); break; case VIEW4: mmult(m1 , &quarters[UPPERRIGHT][0] , m1); new_matrix(CURS3D , m1); break; } } /* * wait for the last job spun off: */ waitez() { register int id; int status; do { id = wait( &status ); } while( id>0 && id!=pid ); } /* * set flags to zero: */ zero_flags() { register char *p; for(p=vert.nextv; p!=0; p=p->nextv) p->flag=0; for(p=pltch.nextpl; p!=0; p=p->nextpl) p->flag=0; for(p=line.nextl; p!=0; p=p->nextl) p->flag=0; for(p=crv.nextc; p!=0; p=p->nextc) p->flag=0; for(p=arc.nexta; p!=0; p=p->nexta) p->flag=0; } x(CURS3D , m1); break; } } /* * wait for the last job spun off: */ waitez() { register int id; int status; do { id = wait( &status ); } while( id>0 && id!=pid ); } /* * set flags to zero: */ zero_flags() { register char *p; for(p=vert.nextv; p!=0; p=p->nextv) p->flag=0; for(p=pltch.nextpl; p!=0; p=p->nextpl) p->flag=0; for(p=line.nextl; p!=0; p=p->nextl) p->flag=0; for(p=crv.nextc; p!=0; p=p->nextc) p->flag=0; Í.Ê«èŠA« ŠªèŠ‚A«Ê«èŠ•«}פ¬Ž®O*A«“«èŠ ¬ Ž®E©@8™©B´¼0¬’,ò« €¼ò« 0 ;©èŠ �w¬²Â¬7 ®”é*9©àL}sÀ+ ¬ «¾_®:ª”CÔàV Ì,E©€pì©ò« € à ò«VA«äšôp,Ý©(‚šE©€p ì© ò« €ôò«ƒò¬ šž,¬A« Ý©(‚ šE©€põªò« €h   *ÏýÊ Ã%ÿÁÂÿ—pÿÿ÷þÿJ ÷¥D Â%ÿÿÃ%€ÁÂÿÿ—pÿ÷þÿ ÷¥ Â%ÿÿÃ%€ÁÂþÿ—pÿ÷þÿö ÷¥ ð Â%ÿÿÃ%ÁÂÿ—pþÿ÷þÿÌ ÷¥ Æ Â%ÿÿÃ%Áªª—p÷þÿ¢ ÷¥ œ Â%ÿÿÃ%TUÁ—pªª÷þÿx ÷¥ r Â%ÿÿÃ%TUÁÂUU—p÷þÿN ÷¥H Â%Ã%ªªÁ—pUU÷þÿ$ ÷¥ Â%Ã%ªªÁªª—p@÷þÿú ÷¥ ô Â%ªêÃ%€ÁÂ@—pªª÷þÿÐ ÷¥ Ê Â%ªêÃ%€Á€—p€÷þÿ¦ ÷¥  Â%@Ã%ÁÂÇq—pÇq÷þÿ| ÷¥v Â%‘2JÐòüRE AS FOLLOWS: /FORMAT FORMAT DISK PACK PRIOR TO OPERATION. OUTPUT DEV MUST BE RK OR RP. /BOOT:DEV BOOTSTRAP FROM SPECIFIED DEVICE. DEV MAY BE "DF" (RF11), "DK" (RK11), "DC" (RC11), "DT" (DECTAPE), "MT" (MAGTAPE), OR "DP" (RP03 DISK). /DATE:01-JAN-70 USED IN WRITING MAGTAPE LABEL (OPTIONAL). /FIND ON INPUT FROM MAGTAPE, PERFORM A SEARCH FOR THE SÞÑò 13.ÿ¨ýKLB#14. °ýKLB#15. ¸ýKLB#16.zÿKT.‡fÿKWL.`õKWP.8ðLATST.HÿLP.þMM.úþ?MM. þ_MM.þMM.þŸMM. þ¿MM.üþßMM.ÿ@ôMP#1.ÿBôMP#2.ôDôMP#3.FôMP#4. HôMP#5.‹JôMP#6.LôMP#7. NôMP#8. PôMP#9.‹RôMP#10.TôMP#11.VôMP#12.XôMP#13.ZôMP#14.\ôMP#15.^ôMP#16.À÷MROM.û€ÿMX#1.ˆÿMX#2.�ÿMX#3.˜ÿMX#4.ÿ ÿMX#5. ¨ÿMX#6.@õOST45.hÿPC. €õPR6P#1. ˆõPR6P#2. �õPR6P#3. ˜õPR6P#4.û õPR6P#5.¨õPR6P#6.±°õPR6P#7.û¸õPR6P#8.þÀõPR6R#1.þÈõPR6R#2.-ÐõPR6R#3.ûØõPR6R#4.àõPR6R#5.èõPR6R#6.ðõPR6R#7.øõPR6R#8. ÿRC. 0ÿRF.ÿRK.ÈýRP.àþ"Ñò« A«Ý©(‚ E©€p¬,ì©ò« € ò« ¬A«J©èŠ"¬ð.¬A« J©èŠ �wò«ðA«è4¬7 ¼*“«èŠ �w9©àL ½’À+¬ «¾_gD¬Ò.A«J©èŠ ¬ A«ŠªèŠ•«}A«*Z®jn,Ý©‚®E©@8 ™© ò« €jò«ëhv¬Â}*vA« “«èŠ ¬ò«ÂA«h.z’f\f\æ\ÀÓý¯Å%ÁÄÿq÷þÿb÷¥\Ä%Å%þÿÁÄqÿ÷þÿ8÷¥2Ä%Å%þÿÁÄÿq÷þÿ÷¥Ä%Å%øÁÄqÿ÷þÿä÷¥ÞÄ%Å%øÁÄÿqÿ÷þÿº÷¥´Ä%ÿ?Å%ÁÄÿq÷þÿ�÷¥ŠÄ%Å%ÿÁÄqÿ÷þÿf÷¥`Ä%Å%ÿÁÄÿqÿÿ÷þÿ<÷¥6Ä%ÿÿÅ%€ÁÄÿÿqÿ÷þÿ÷¥ Ä%ÿÿÅ%€ÁÄþÿqÿ÷þÿè÷¥ âÄ%ÿÿÅ%ÁÄÿqþÿ÷þÿ¾÷¥ ¸Ä%ÿÿÅ%ÁĪªq÷þÿ”÷¥ ŽÄ% ÔýÁ Ã%±HÁÂ8Ž—p8Ž÷þÿR ÷¥L Â%’2Ã%@,Á€—pÿ÷þÿ( ÷¥ " Â%ÀÃ%€ÁÂÿ—p€÷þÿþ ÷¥ ø Â%ÀÃ%€Áœߗpˆ÷þÿÔ ÷¥Î Â%+Ã%<¶Áˆ—pœß÷þÿª ÷¥¤ Â%+Ã%<¶Áˆԗp÷þÿ€ ÷¥z Â%Ã%Á—pˆÔ÷þÿV ÷¥P Â%Ã%ÁÂÿÿ—p÷þÿ, ÷¥& Â%Ã%Á—pÿÿ÷þÿ ÷¥ü Â%Ã%ÁÃÿÿ×p÷þÿØ ÷¥Ò Ã%ÿÿÃ%ÿÿÁÃÿÿ×p÷þÿ® ÷¥¨ Ã%Ã%ÁÃÿ×p€÷þÿ„ ÷¥ ~ Ã%€CÕòèPECIFIED FILE. ON OUTPUT TO MAGTAPE, SKIP TO END OF DATA. /HELP TYPE THIS DOCUMENT. /NOLABEL ON DISK TO DECTAPE DUMPS, PREVENTS THE LABEL RECORD FROM BEING WRITTEN. /NUMBER:N N IS THE NUMBER OF 1K TRACKS TO DUMP OR RESTORE. /PLATTERS:N FOR RF11 OR RC11 ONLY, N IS THE NUMBER OF DISK PLATTERS TO DUMP OR RESTORE. /RWIND REWIND THE MAGTAPE BEFORE USE. /SKIrÕÀ ¡.ŠªèŠò« ’�w �w &�w $ Àæ\æ\&&\² �w¾ó.St¤`¯”}sÀ+@½’À+@9©àL@º.;©èŠ@E©@8@J©èŠ@™©@{ªèŠ@‚.ŠªèŠ@ñª@Q@,«0z@A«@O«N@õ.•«}@ «¾_@Ϋ(d@ò«@ò« €@Œ.(úSt¤`h�w(Fç'@œ(¯”‹÷æ(7 St¤`7 k.O«Nñª@QΫ(d9©àL}sÀ+" «¾_N ÖÜ0ˆZ.×ýÓ Ã%ÿÿÁ—pÿÿ÷þÿB÷¥<Â%ÿÿÃ%ÿÿÁ—p÷þÿ÷¥Â%Ã%Á—p÷þÿî÷¥èÂ%Ã%Á—p€÷þÿÄ÷¥¾Â%Ã%Á€—p÷þÿš÷¥”Â%Ã%ÁÂÿ—p÷þÿp÷¥jÂ%Ã%þÿÁ—pÿ÷þÿF÷¥@Â%Ã%þÿÁÂÿ—p÷þÿ÷¥Â%Ã%øÁ—pÿ÷þÿò ÷¥ì Â%Ã%øÁÂÿ—pÿ÷þÿÈ ÷¥ Â%ÿ?Ã%ÁÂÿ—p÷þÿž ÷¥˜ Â%Ã%ÿÁ—pÿ÷þÿt ÷¥n Â%]Øý¦ÿÿÅ%TUÁÄqªª÷þÿj÷¥ dÄ%ÿÿÅ%TUÁÄUUq÷þÿ@÷¥:Ä%Å%ªªÁÄqUU÷þÿ÷¥Ä%Å%ªªÁĪªq@÷þÿì÷¥ æÄ%ªêÅ%€ÁÄ@qªª÷þÿÂ÷¥ ¼Ä%ªêÅ%€ÁÄ€q€÷þÿ˜÷¥’Ä%@Å%ÁÄÇqqÇq÷þÿn÷¥hÄ%‘2Å%±HÁÄ8Žq8Ž÷þÿD÷¥>Ä%’2Å%@,ÁÄ€qÿ÷þÿ÷¥ Ä%ÀÅ%€ÁÄÿq€÷þÿð÷¥ êÄ%ÀÅ%€ÁÄœßqˆ÷þÿÆ÷¥ÀÄ%+Å%<¶ÁĈqœß÷þÿœ÷¥–Ä1Ùý¸Ã%€ÁÃÿÿ×pÿ÷þÿZ ÷¥T Ã%€Ã%€ÁÃÿ×pÿ÷þÿ0 ÷¥* Ã%Ã%ÁÃ×p÷þÿ ÷¥ Ã%Ã%ÁÄq÷þÿÜ÷¥ÖÄ%Å%ÁÄq÷þÿ²÷¥¬Ä%Å%ÁÄq÷þÿˆ÷¥‚Ä%Å%ÁÄÿÿq÷þÿ^÷¥XÄ%ÿÿÅ%ÿÿÁÄqÿÿ÷þÿ4÷¥.Ä%ÿÿÅ%ÿÿÁÄq÷þÿ ÷¥Ä%Å%ÁÄq÷þÿà÷¥ÚÄ%Å%ÁÄq€÷þÿ¶÷¥°Ä%Å%ÁÄ€q÷þÿŒ÷¥†Ä%åÙÖÜE©@8 ™© ò« €0ò«ˆ‘0èðÞ*;©èŠ �wè ;©èŠ �wðé<è7 ðŠ.9©àL}sÀ+ è «¾_;©èŠð �wÕNè7 êòŽ*9©àL½’À+ è «¾_êòE©@8’`hð7 è,™©ò« €h •«} 9©àL}sÀ+ðrèð7 V. «¾_;©èŠè �w 9©àL½’À+ðˆ„âòŽ, «¾_•«}â ò E©@8™©ò« €±’˜Ìâ.Ûòà€åˆå�å˜å å¨å°å¸åÀåÈåÐåØåàåèåðåøåææææ æ(æ0æ8æ@æHæPæXæ`æhæpæxæ€æˆæ�æ˜æ æ¨æ°æ¸æÀæÈæÐæØæàæèæðæøæçççç ç(ç0ç8ç@çHçPçXç`çhçpçxç€çˆç�ç˜ç ç¨ç°ç¸çÀçÈçÐçØçàçèçðçøçèèèè è(è0è8è@èHèPèXèhèpèxè€èˆè�è˜è è¨è°è¸èÀèÈèÐèØèàèèèðèøèéééé é(é0é8é@éHéPéXé`éhépéxé€éˆé�é˜é é¨é°é¸éÀéÈéÐéØéàéèéðéøéêêêê ê(ê0ê8ê@êHêPêXê`êhêpêxê€êˆê�ê˜ê ê¨ê°ê¸êÀêÈêÐêØêàêèêðêøêëëëë ë(ë0ë8ë@ëHëPëXë`ëhëpëxë€ëˆë�ë˜ë ë¨ë°ë¸ëÀëÈëÐëØëàëèëðëøëìììì ì(ì0ì8ì@ìHìPìXì`ìhìpìxì€ìˆì�ì˜ì ì¨ì°ì¸ìÀìÈìÐìØìàìèìðìøìíííí í(í0íÒÜýÊ Ã%ÿÁÂÿ—pÿÿ÷þÿJ ÷¥D Â%ÿÿÃ%€ÁÂÿÿ—pÿ÷þÿ ÷¥ Â%ÿÿÃ%€ÁÂþÿ—pÿ÷þÿö ÷¥ ð Â%ÿÿÃ%ÁÂÿ—pþÿ÷þÿÌ ÷¥ Æ Â%ÿÿÃ%Áªª—p÷þÿ¢ ÷¥ œ Â%ÿÿÃ%TUÁ—pªª÷þÿx ÷¥ r Â%ÿÿÃ%TUÁÂUU—p÷þÿN ÷¥H Â%Ã%ªªÁ—pUU÷þÿ$ ÷¥ Â%Ã%ªªÁªª—p@÷þÿú ÷¥ ô Â%ªêÃ%€ÁÂ@—pªª÷þÿÐ ÷¥ Ê Â%ªêÃ%€Á€—p€÷þÿ¦ ÷¥  Â%@Ã%ÁÂÇq—pÇq÷þÿ| ÷¥v Â%‘2JÝý�%+Å%<¶ÁĈÔq÷þÿr÷¥lÄ%Å%ÁÄqˆÔ÷þÿH÷¥BÄ%Å%ÁÄÿÿq÷þÿ÷¥Ä%Å%ÁÄqÿÿ÷þÿô÷¥îÄ%Å%ÁÅÿÿWq÷þÿÊ÷¥ÄÅ%ÿÿÅ%ÿÿÁÅÿÿWq÷þÿ ÷¥šÅ%Å%ÁÅÿWq€÷þÿv÷¥ pÅ%€Å%€ÁÅÿÿWqÿ÷þÿL÷¥FÅ%€Å%€ÁÅÿWqÿ÷þÿ"÷¥Å%Å%ÁÅWq÷þÿø÷¥òÅ%Å%Â@Ã2Ä4ÁÀªª7pÌ÷þÿÂ÷¥ ¼À%ªêÁ%€ÁÀªª?p¤÷þÿ�ݘò«Ì A«J©èŠ �wΫ(d ¤¬7 N*¬9©àL}sÀ+ «¾_{ªèŠ �wÕ ¸Ä7 .Ϋ(dÄ 9©àL ½’À+ «¾_•«}A«8.Ðf\f\æ\æ\æyŠªèŠ•«}�w@ ö\žó.3gÀS¯”j8Àv@}sÀ+@½’À+@.9©àL@E©@8@™©@Û©èŠ@Ý©‚@È.{ªèŠ@ñª@Q@,«0z@A«@O«N@.“«èŠ@•«}@ «¾_@Ê«èŠ@Ϋ(d@».ò«@ò« €@ó«ßòÀDISK ERROR--REQUEST KILLED. DISK ERROR ON UNIT --REQUEST KILLED. THE REEL LABEL INDICATES THAT THE REST OF THE TAPE WAS NOT DUMPED. TYPE K TO KILL REQUEST AT THIS POINT, ANYTHING ELSE TO PROCEED IN FACE OF DANGER: LABEL INDICATES THAT THE TAPE IS OUT OF SEQUENCE. TYPE P TO PROCEED, M TO MOUNT ANOTHER REEL, OR K TO KILL REQUEST: MOUNT TAPE ON DT, TYPE RETURN TO CONTINUE WHEN READY.TOO FEW DECTAPE UNITS WERE SPECIFIED. REQUEST KILLED. PREMATURE END-OF-FILE, REQUEST KILLED\zÌ8í@íHíPíXí`íhípíxí€íˆí�í˜í í¨í°í¸íÀíÈíÐíØíàíèíðíøíîîîî î(î0î8î@îHîPîXî`îhîpîxî€îˆî�î˜î î¨î°î¸îÀîÈîÐîØîàîèîðîøî0ð@ðHðPðXð`ðhðpðxð€ðˆð�ð˜ð ð¨ð°ð¸ðÀðÈðÐðØðàðèðððøðññññ ñ(ñ0ñ8ñôôôô ô(ô0ô8ô`ôhôpô€ôˆô�ô˜ô ô¨ô°ô¸ôÀôÈôÐôØôàôèôðôøôõõ õ0õpõÀýÈýþþþþ þ(þ0þ8þ@þPþXþ`þhþxþ€þˆþ�þ˜þ þ¨þ°þ¸þ@ÿPÿXÿw,öÙ€yáýÁ Ã%±HÁÂ8Ž—p8Ž÷þÿR ÷¥L Â%’2Ã%@,Á€—pÿ÷þÿ( ÷¥ " Â%ÀÃ%€ÁÂÿ—p€÷þÿþ ÷¥ ø Â%ÀÃ%€Áœߗpˆ÷þÿÔ ÷¥Î Â%+Ã%<¶Áˆ—pœß÷þÿª ÷¥¤ Â%+Ã%<¶Áˆԗp÷þÿ€ ÷¥z Â%Ã%Á—pˆÔ÷þÿV ÷¥P Â%Ã%ÁÂÿÿ—p÷þÿ, ÷¥& Â%Ã%Á—pÿÿ÷þÿ ÷¥ü Â%Ã%ÁÃÿÿ×p÷þÿØ ÷¥Ò Ã%ÿÿÃ%ÿÿÁÃÿÿ×p÷þÿ® ÷¥¨ Ã%Ã%ÁÃÿ×p€÷þÿ„ ÷¥ ~ Ã%€Cá@8@(â3gÀSh�w(F¯”÷æ"7 3gÀSØ.O«Nñª@QA«Ý©‚ØE©@8™©R"¢.Ô*ò« €"ò« ¢ Ϋ(d.9©àL± *7 àà7 n,j8Àv  «¾_Û©èŠà9©àL}sÀ+àvBÒN¢Z‚. «¾_Òó«@8 N ¢ZA«“«èŠ/T&bDÄ, �w&ò«b A«“«èŠ �wDcbà7 ÌŒ,9©àL½’À+ à «¾_ãý¦ÿÿÅ%TUÁÄqªª÷þÿj÷¥ dÄ%ÿÿÅ%TUÁÄUUq÷þÿ@÷¥:Ä%Å%ªªÁÄqUU÷þÿ÷¥Ä%Å%ªªÁĪªq@÷þÿì÷¥ æÄ%ªêÅ%€ÁÄ@qªª÷þÿÂ÷¥ ¼Ä%ªêÅ%€ÁÄ€q€÷þÿ˜÷¥’Ä%@Å%ÁÄÇqqÇq÷þÿn÷¥hÄ%‘2Å%±HÁÄ8Žq8Ž÷þÿD÷¥>Ä%’2Å%@,ÁÄ€qÿ÷þÿ÷¥ Ä%ÀÅ%€ÁÄÿq€÷þÿð÷¥ êÄ%ÀÅ%€ÁÄœßqˆ÷þÿÆ÷¥ÀÄ%+Å%<¶ÁĈqœß÷þÿœ÷¥–Ä1äò¬ . TAPE FULL, TYPE M TO MOUNT ANOTHER REEL AND CONTINUE, ANYTHING ELSE TO ABORT REQUEST: SELECT ERROR ON MT: MAGTAPE WRITE PROTECT ERROR. FATAL MAGTAPE ERROR. SPECIFIED DEVICE DOES NOT EXIST. REACHED END-OF-DATA ON SKIP, OPERATION KILLED. END-OF-FILE DURING READ, TYPEMAGTAPE FILE NAME DOES NOT MATCH SPECIFIED NAME. CAN'T FIND SPECIFIED FILE ON TAPE. NO OUTPUT FILE NAME SPECIFIED. MAGTAPE RECORD TOO LONG FOR BUFFER. VERIFICATION ERROR--COPY IS BAD. /VERIFY IS NOT Ëå 0æ<à0èà0êF`ßàÆ07 âÆäßçÿ ÿß ÿßÿß ÿ�ß‹ÿú€Ç€ÀÿÁÿßÿß ÿß‹ÿý€¾TE PROGRAM #2%:DATE: %RESTART: %INV DATE% ÃÎ÷ x‡Ð¥ ýà‹È¥ =÷ €Â ð— 6¦Áz÷ÿÿ6w˜ÎeÎeÎeÎeÎeÎeÎeÎeÎeÎe÷Îe÷ 0Â=øŽ — c ÂåF Îeè û·Dwÿw ô¦wöþ ”Ãå0 �×  ƒ`  Â`óÀ ‡ ߈ßàÀeðe0úÎŽÁ¤`É ý PW )üƒ‡|‚ˆ�˜ ª²ºÂÊÒÚâêx‚Œ– ª´¾ÈÒÜæð0P�˜ÖÞæôú–nh~ t æ .:åÌA«Ê«èŠ8v‚7 àÀ,Ϋ(d‚ 9©àL j8Àv «¾_Û©èŠà²Œà7 Ò®Êè.9©àL}sÀ+ à «¾_Òó«@8®ÊÀ ¸ÌnJ*¸ÌA« Ê«èŠò«n{ªèв&¾D , �w&ò«¾ {ªèŠ �wD9©àLþ*Àà7 f\f\æ\ѽ’À+à  «¾_•«}qó.N~šE¯”üpØx@òyke@9©àL@ø.;©èŠ@E©@8@E©€p@Ý©‚@ñª@Q@®.õª@,«ø÷¥ ’À%ªêÁ%€ÁÀªªp2÷þÿn÷¥ hÀ%ªêÁ%€ÁÀªªp÷þÿF÷¥ @À%ªêÁ%€ÁÀªªp÷þÿ÷¥ À%ªêÁ%€ÁÀªª#p÷þÿö÷¥ ðÀ%ªêÁ%€ÁÀªª4p÷þÿÌ÷¥ ÆÀ%ªêÁ%€ÁÀªªÄ%’2Å%@,ÁÄ€qÿ÷þÿ÷¥ Ä%ÀÅ%€ÁÄÿq€÷þÿð÷¥ êÄ%ÀÅ%€ÁÄœßqˆ÷þÿÆ÷¥ÀÄ%+Å%<¶ÁĈqœß÷þÿœ÷¥–Ä1ñýÜÁ%ÁÀÿÿp÷þÿ:÷¥4À%Á%ÁÀpÿÿ÷þÿ÷¥ À%Á%ÁÁÿÿWp÷þÿæ÷¥àÁ%ÿÿÁ%ÿÿÁÁÿÿWp÷þÿ¼÷¥¶Á%Á%ÁÁÿWp€÷þÿ’÷¥ ŒÁ%€Á%€ÁÁÿÿWpÿ÷þÿh÷¥bÁ%€Á%€ÁÁÿWpÿ÷þÿ>÷¥8Á%Á%ÁÁWp÷þÿ÷¥Á%Á%Á—p÷þÿê÷¥äÂ%Ã%Á—p÷þÿÀ÷¥ºÂ%Ã%Á—p÷þÿ–÷¥�Â%Ã%ÁÂÿÿ—p÷þÿl÷¥fÂ%ÿÿ¼ñ ò« lΫ(dîÝ"âð7 ¤,Ϋ(dð 9©àL òyke «¾_Ϋ(d•ü c*Ϋ(d Ϋ(dΫ(d9©àLô$¼´7 2Ó*üpØx ¼ ´ «¾_Ϋ(d29©àLf ,7 V \�.òyke ‡K@Q «¾_Ϋ(dVΫ(d\n(D^`´¼7 ø.Ϋ(d^ Ϋ(d`9©àLüpØx´¼Cd„˜žÄ* «¾_„O«ïf •«} ˜žE©€poróýÜÁ%ÁÀÿÿp÷þÿ:÷¥4À%Á%ÁÀpÿÿ÷þÿ÷¥ À%Á%ÁÁÿÿWp÷þÿæ÷¥àÁ%ÿÿÁ%ÿÿÁÁÿÿWp÷þÿ¼÷¥¶Á%Á%ÁÁÿWp€÷þÿ’÷¥ ŒÁ%€Á%€ÁÁÿÿWpÿ÷þÿh÷¥bÁ%€Á%€ÁÁÿWpÿ÷þÿ>÷¥8Á%Á%ÁÁWp÷þÿ÷¥Á%Á%Á—p÷þÿê÷¥äÂ%Ã%Á—p÷þÿÀ÷¥ºÂ%Ã%Á—p÷þÿ–÷¥�Â%Ã%ÁÂÿÿ—p÷þÿl÷¥fÂ%ÿÿ¼ôýÊ Ã%ÿÁÂÿ—pÿÿ÷þÿJ ÷¥D Â%ÿÿÃ%€ÁÂÿÿ—pÿ÷þÿ ÷¥ Â%ÿÿÃ%€ÁÂþÿ—pÿ÷þÿö ÷¥ ð Â%ÿÿÃ%ÁÂÿ—pþÿ÷þÿÌ ÷¥ Æ Â%ÿÿÃ%Áªª—p÷þÿ¢ ÷¥ œ Â%ÿÿÃ%TUÁ—pªª÷þÿx ÷¥ r Â%ÿÿÃ%TUÁÂUU—p÷þÿN ÷¥H Â%Ã%ªªÁ—pUU÷þÿ$ ÷¥ Â%Ã%ªªÁªª—p@÷þÿú ÷¥ ô Â%ªêÃ%€ÁÂ@—pªª÷þÿÐ ÷¥ Ê Â%ªêÃ%€Á€—p€÷þÿ¦ ÷¥  Â%@Ã%ÁÂÇq—pÇq÷þÿ| ÷¥v Â%‘2Jó\&&\æÿÿ¬a¬"¢€¬À ¢À\æ\æ†.ˆ�w �w �w}•«$õ~¾Š„#.õªò« €~ ;©èŠ ¾Š„O«ïf®.‚æ\À ÀÀÀæû,•«} ‡K@Q ‡K@Q ‡K@Q "‡K@Q &¨\ÿÿæ\æ\&&\Kó.„!"¯”df@Lqˆ,@sèN@Ã.}sÀ+@˜w@O’èN@½’À+@™ s@Ž.쨀p@9©àL@;©èŠ@;©PŒ@E©@8@n.E©€p@J©èŠ@v©€p@™©@Ý©@b.Ý©‚@Ý©(‚@:ª@{ªèŠ@´ª@k.Ôª€p@ñª@Q@÷ª@8@÷ª€p@,«0z@·.A«@O«÷ 0æ<à0èà0êF`ßàÆ07 âÆäßçÿ ÿß ÿßÿß ÿ�ß‹ÿú€Ç€ÀÿÁÿßÿß ÿß‹ÿý€¾TE PROGRAM #2%:DATE: %RESTART: %INV DATE% ÃÎ÷ x‡Ð¥ ýà‹È¥ =÷ €Â ð— 6¦Áz÷ÿÿ6w˜ÎeÎeÎeÎeÎeÎeÎeÎeÎeÎe÷Îe÷ 0Â=øŽ — c ÂåF Îeè û·Dwÿw ô¦wöþ ”Ãå0 �×  ƒ`  Â`óÀ ‡ ߈ßàÀeðe0úÎŽÁ¤`É ý PW )üƒ‡|‚ˆ�˜ ª²ºÂÊÒÚâêx‚Œ– ª´¾ÈÒÜæð0P�˜ÖÞæôú–nh~ t æ .:øýÓ Ã%ÿÿÁ—pÿÿ÷þÿB÷¥<Â%ÿÿÃ%ÿÿÁ—p÷þÿ÷¥Â%Ã%Á—p÷þÿî÷¥èÂ%Ã%Á—p€÷þÿÄ÷¥¾Â%Ã%Á€—p÷þÿš÷¥”Â%Ã%ÁÂÿ—p÷þÿp÷¥jÂ%Ã%þÿÁ—pÿ÷þÿF÷¥@Â%Ã%þÿÁÂÿ—p÷þÿ÷¥Â%Ã%øÁ—pÿ÷þÿò ÷¥ì Â%Ã%øÁÂÿ—pÿ÷þÿÈ ÷¥ Â%ÿ?Ã%ÁÂÿ—p÷þÿž ÷¥˜ Â%Ã%ÿÁ—pÿ÷þÿt ÷¥n Â%]3\æ\æ!À$À\æ`.|ò«` €ò« † ò«z,`†zPT‚èŠ;©¾_ «z À+½’àL9©�w .a‚7 z>2„èŠ;© �w ´èŠ;©¾_ «({„´2ÐzÀ+}sàL9©¾_ «‚ À+½’àL9©,?7 z7 ‚§�w „èŠ;©¾_ «‚ À+}sàL9©.�„7 ‚ M(ò«  €ò« ™©@8E©�*%( �üV|zèŠJ©A«úþùN@•«}@ «®_@ «¾_@Ë.º«€p@»«PŒ@Ϋ(d@Ϋ@y@ò«@.ò« €@(`„!"hç@($df@œ( �w(F¯”÷æ"7 „!"ž.O«Nñª@QA«Ý©‚E©@8™©  ,s,ò« € •«} Ϋ(d,9©àLLqˆ,Á.$7 ª¶B¡.$ «¾_ ª ¶E©€p´ªò« €B¹@ª¶8.•«}A« J©èŠ ç@ª¶E©€p­PZšûýÊ Ã%ÿÁÂÿ—pÿÿ÷þÿJ ÷¥D Â%ÿÿÃ%€ÁÂÿÿ—pÿ÷þÿ ÷¥ Â%ÿÿÃ%€ÁÂþÿ—pÿ÷þÿö ÷¥ ð Â%ÿÿÃ%ÁÂÿ—pþÿ÷þÿÌ ÷¥ Æ Â%ÿÿÃ%Áªª—p÷þÿ¢ ÷¥ œ Â%ÿÿÃ%TUÁ—pªª÷þÿx ÷¥ r Â%ÿÿÃ%TUÁÂUU—p÷þÿN ÷¥H Â%Ã%ªªÁ—pUU÷þÿ$ ÷¥ Â%Ã%ªªÁªª—p@÷þÿú ÷¥ ô Â%ªêÃ%€ÁÂ@—pªª÷þÿÐ ÷¥ Ê Â%ªêÃ%€Á€—p€÷þÿ¦ ÷¥  Â%@Ã%ÁÂÇq—pÇq÷þÿ| ÷¥v Â%‘2JüýÜÁ%ÁÀÿÿp÷þÿ:÷¥4À%Á%ÁÀpÿÿ÷þÿ÷¥ À%Á%ÁÁÿÿWp÷þÿæ÷¥àÁ%ÿÿÁ%ÿÿÁÁÿÿWp÷þÿ¼÷¥¶Á%Á%ÁÁÿWp€÷þÿ’÷¥ ŒÁ%€Á%€ÁÁÿÿWpÿ÷þÿh÷¥bÁ%€Á%€ÁÁÿWpÿ÷þÿ>÷¥8Á%Á%ÁÁWp÷þÿ÷¥Á%Á%Á—p÷þÿê÷¥äÂ%Ã%Á—p÷þÿÀ÷¥ºÂ%Ã%Á—p÷þÿ–÷¥�Â%Ã%ÁÂÿÿ—p÷þÿl÷¥fÂ%ÿÿ¼ ò« ¾_ «´.|zú7 ´è$À+½’àL9©�w z èŠ;© ¾_ «´.˜z7 ´ÖÊÀ+}sàL9©ò ò« Ð €ò«™©,ZòÐÆ‘@8E©�®¾_ «„ À+½’àL9©*'�®7 „´ù�w ‚èŠ;© �w zèŠ;©´.‹‚z´¦��w èŠ;©Œ ¬ èŠ;©Lò«,ÇŒ¬L˜Dœ €ò«Ý©€pE© n ¢Lò«.aœn¢LˆüŒ €ò«õª€p þýž,™©ò« €Z ò« šA«Ý©(‚c`¶°¶,+.¶º«€p° ¶ º«€pv©€p»«PŒ,pÂ&¼ ¹,Â&Ôª€p ¼ 쨀p»«PŒ ç@ ~Î&È‹,Î&Ôª€p È 쨀p»«PŒ ç@ýŒÚ&Ô],Ú&Ôª€p Ô 쨀p»«PŒ ç@Ýš7 ï*{ªèŠ 9©àL sèN ç@ «¾_2¬02¯,;©èŠ df@œ0 ;©èŠ 2;©èŠ@º40 b*ø÷¥ ’À%ªêÁ%€ÁÀªªp2÷þÿn÷¥ hÀ%ªêÁ%€ÁÀªªp÷þÿF÷¥ @À%ªêÁ%€ÁÀªªp÷þÿ÷¥ À%ªêÁ%€ÁÀªª#p÷þÿö÷¥ ðÀ%ªêÁ%€ÁÀªª4p÷þÿÌ÷¥ ÆÀ%ªêÁ%€ÁÀªª.;©èŠ2 6 ÷ª€pøE©€p™©Õ(0î¼þØ.ò« €0ý¯Å%ÁÄÿq÷þÿb÷¥\Ä%Å%þÿÁÄqÿ÷þÿ8÷¥2Ä%Å%þÿÁÄÿq÷þÿ÷¥Ä%Å%øÁÄqÿ÷þÿä÷¥ÞÄ%Å%øÁÄÿqÿ÷þÿº÷¥´Ä%ÿ?Å%ÁÄÿq÷þÿ�÷¥ŠÄ%Å%ÿÁÄqÿ÷þÿf÷¥`Ä%Å%ÿÁÄÿqÿÿ÷þÿ<÷¥6Ä%ÿÿÅ%€ÁÄÿÿqÿ÷þÿ÷¥ Ä%ÿÿÅ%€ÁÄþÿqÿ÷þÿè÷¥ âÄ%ÿÿÅ%ÁÄÿqþÿ÷þÿ¾÷¥ ¸Ä%ÿÿÅ%ÁĪªq÷þÿ”÷¥ ŽÄ%  0æ<à0èà0êF`ßàÆ07 âÆäßçÿ ÿß ÿßÿß ÿ�ß‹ÿú€Ç€ÀÿÁÿßÿß ÿß‹ÿý€¾TE PROGRAM #2%:DATE: %RESTART: %INV DATE% ÃÎ÷ x‡Ð¥ ýà‹È¥ =÷ €Â ð— 6¦Áz÷ÿÿ6w˜ÎeÎeÎeÎeÎeÎeÎeÎeÎeÎe÷Îe÷ 0Â=øŽ — c ÂåF Îeè û·Dwÿw ô¦wöþ ”Ãå0 �×  ƒ`  Â`óÀ ‡ ߈ßàÀeðe0úÎŽÁ¤`É ý PW )üƒ‡|‚ˆ�˜ ª²ºÂÊÒÚâêx‚Œ– ª´¾ÈÒÜæð0P�˜ÖÞæôú–nh~ t æ .:;©@QñªNO«,ºŒŽ ™¤y7 "æ÷”¯F(�wÂh ™¤y¼(@ €ò«@ò«@¾_ «.Z@}•«@芓«@NO«@A«@0z,«.‹@õª@@Qñª@´ª@Ý©@™©.½@èŠJ©@€pE©@@8E©@PŒ;©@èŠ;©.Ã@àL9©@À+½’@À+}s”¯ ™¤y.ód~  Ö\&&ÿÿ~À\n&óh^pæzEhÀ^À\æ\H.è` ò«rèŠJ©·æ\þò« î ¼þE©€p´ª„8@¼þ�.ò« €@ò«  ¼þE©€p™©uHPø²à™,ò« €Pò« ø ò«²àXd",E©@8™©ò« € d ò«"ò«éf’@Âò«*’;©èŠ@  ò«Âòªv‚ àØ.E©€pÝ©ò« € ‚ ò« આ’"�*E©@8™©ò« € ’ ò«"B”œÖB”*ò« €œò« ý¸Ã%€ÁÃÿÿ×pÿ÷þÿZ ÷¥T Ã%€Ã%€ÁÃÿ×pÿ÷þÿ0 ÷¥* Ã%Ã%ÁÃ×p÷þÿ ÷¥ Ã%Ã%ÁÄq÷þÿÜ÷¥ÖÄ%Å%ÁÄq÷þÿ²÷¥¬Ä%Å%ÁÄq÷þÿˆ÷¥‚Ä%Å%ÁÄÿÿq÷þÿ^÷¥XÄ%ÿÿÅ%ÿÿÁÄqÿÿ÷þÿ4÷¥.Ä%ÿÿÅ%ÿÿÁÄq÷þÿ ÷¥Ä%Å%ÁÄq÷þÿà÷¥ÚÄ%Å%ÁÄq€÷þÿ¶÷¥°Ä%Å%ÁÄ€q÷þÿŒ÷¥†Ä%åý¦ÿÿÅ%TUÁÄqªª÷þÿj÷¥ dÄ%ÿÿÅ%TUÁÄUUq÷þÿ@÷¥:Ä%Å%ªªÁÄqUU÷þÿ÷¥Ä%Å%ªªÁĪªq@÷þÿì÷¥ æÄ%ªêÅ%€ÁÄ@qªª÷þÿÂ÷¥ ¼Ä%ªêÅ%€ÁÄ€q€÷þÿ˜÷¥’Ä%@Å%ÁÄÇqqÇq÷þÿn÷¥hÄ%‘2Å%±HÁÄ8Žq8Ž÷þÿD÷¥>Ä%’2Å%@,ÁÄ€qÿ÷þÿ÷¥ Ä%ÀÅ%€ÁÄÿq€÷þÿð÷¥ êÄ%ÀÅ%€ÁÄœßqˆ÷þÿÆ÷¥ÀÄ%+Å%<¶ÁĈqœß÷þÿœ÷¥–Ä1æ\æ\æ`r".¿A«Äò«B r èŠ;©®_ «*PÄBrÀ+½’àL9© @yΫ ð4S« ¾_ «J,7  7 JúÔÀvj8àL9©D�w ‚ èŠ;©ôò«.:D‚ôê—&�w ‚èŠ;© î îä@8ó«*œ&‚îîäÜ¿D®_ «À+}s àL9© Ò@yΫð4S«,ºD7 ÒÆ¾_ «JÀvj8àL9©®_ «À+½’àL9©.[7 J7 ¬" ²@yΫð4S«¾_þ Ö {ªèŠB9©àLV¤B7 47 5,½’À+B  «¾_9©àL}sÀ+4 «¾_êºBÉ*;©èŠ �w ;©èŠ B �w_Æ47 FX,9©àL½’À+ 4 «¾_ò«F9©àL�Ø47 (d,}sÀ+4  «¾_;©PŒ ç@ �w(‘è ,¹*;©PŒ ç@ �w, ;©PŒ ç@æò04* �w0;©PŒ ç@ �w4 ;©PŒü8<E, ç@ �w8;©PŒ ç@ �w<3 ýÁ Ã%±HÁÂ8Ž—p8Ž÷þÿR ÷¥L Â%’2Ã%@,Á€—pÿ÷þÿ( ÷¥ " Â%ÀÃ%€ÁÂÿ—p€÷þÿþ ÷¥ ø Â%ÀÃ%€Áœߗpˆ÷þÿÔ ÷¥Î Â%+Ã%<¶Áˆ—pœß÷þÿª ÷¥¤ Â%+Ã%<¶Áˆԗp÷þÿ€ ÷¥z Â%Ã%Á—pˆÔ÷þÿV ÷¥P Â%Ã%ÁÂÿÿ—p÷þÿ, ÷¥& Â%Ã%Á—pÿÿ÷þÿ ÷¥ü Â%Ã%ÁÃÿÿ×p÷þÿØ ÷¥Ò Ã%ÿÿÃ%ÿÿÁÃÿÿ×p÷þÿ® ÷¥¨ Ã%Ã%ÁÃÿ×p€÷þÿ„ ÷¥ ~ Ã%€C ý¯Å%ÁÄÿq÷þÿb÷¥\Ä%Å%þÿÁÄqÿ÷þÿ8÷¥2Ä%Å%þÿÁÄÿq÷þÿ÷¥Ä%Å%øÁÄqÿ÷þÿä÷¥ÞÄ%Å%øÁÄÿqÿ÷þÿº÷¥´Ä%ÿ?Å%ÁÄÿq÷þÿ�÷¥ŠÄ%Å%ÿÁÄqÿ÷þÿf÷¥`Ä%Å%ÿÁÄÿqÿÿ÷þÿ<÷¥6Ä%ÿÿÅ%€ÁÄÿÿqÿ÷þÿ÷¥ Ä%ÿÿÅ%€ÁÄþÿqÿ÷þÿè÷¥ âÄ%ÿÿÅ%ÁÄÿqþÿ÷þÿ¾÷¥ ¸Ä%ÿÿÅ%ÁĪªq÷þÿ”÷¥ ŽÄ%  «r Àvj8àL9©,Þ²7 rš+D�w J èŠ;© šò«&�w *DJš&Ž)JèŠ;©””Š @8ó« l®_ «,ôJ””Šl|ÝÀ+}sàL9©x@yΫ ð4S« ¾_ «r,7 x7 rfQÀvj8àL9©®_ «À+½’ àL9©X@yΫ.î7 XN {ð4S«¾_ «B Àvj8àL9©D�w *Û7 BD>ÕrèŠ;©@ ò« &�w rèŠ;©,fr@&r0ý::0@8üý  @D<*;©PŒ ç@ �w@ {ªèŠ �wD47 C,9©àL½’À+ 4 «¾_ò«{ªèŠ>&BB7 B£*B9©àL½’À+ B «¾_;©èŠB•87 \. df@œ9©àLO’èN ç@ «¾_Ϋ(dÊJ^4DB B.^9©àL™ s 4DB ç@ ã\7 , ç@  «¾_ ;©èŠ �w;©èмlD*D �w;©èŠ  �w;©èŠ_xý¦ÿÿÅ%TUÁÄqªª÷þÿj÷¥ dÄ%ÿÿÅ%TUÁÄUUq÷þÿ@÷¥:Ä%Å%ªªÁÄqUU÷þÿ÷¥Ä%Å%ªªÁĪªq@÷þÿì÷¥ æÄ%ªêÅ%€ÁÄ@qªª÷þÿÂ÷¥ ¼Ä%ªêÅ%€ÁÄ€q€÷þÿ˜÷¥’Ä%@Å%ÁÄÇqqÇq÷þÿn÷¥hÄ%‘2Å%±HÁÄ8Žq8Ž÷þÿD÷¥>Ä%’2Å%@,ÁÄ€qÿ÷þÿ÷¥ Ä%ÀÅ%€ÁÄÿq€÷þÿð÷¥ êÄ%ÀÅ%€ÁÄœßqˆ÷þÿÆ÷¥ÀÄ%+Å%<¶ÁĈqœß÷þÿœ÷¥–Ä1ý¸Ã%€ÁÃÿÿ×pÿ÷þÿZ ÷¥T Ã%€Ã%€ÁÃÿ×pÿ÷þÿ0 ÷¥* Ã%Ã%ÁÃ×p÷þÿ ÷¥ Ã%Ã%ÁÄq÷þÿÜ÷¥ÖÄ%Å%ÁÄq÷þÿ²÷¥¬Ä%Å%ÁÄq÷þÿˆ÷¥‚Ä%Å%ÁÄÿÿq÷þÿ^÷¥XÄ%ÿÿÅ%ÿÿÁÄqÿÿ÷þÿ4÷¥.Ä%ÿÿÅ%ÿÿÁÄq÷þÿ ÷¥Ä%Å%ÁÄq÷þÿà÷¥ÚÄ%Å%ÁÄq€÷þÿ¶÷¥°Ä%Å%ÁÄ€q÷þÿŒ÷¥†Ä%åó«<®_ «À+}sàL9©.š::0<7  d@yΫð4S«¾_ «B Àvj8àL9©,67 Bµò« €ò« ™©@8E©4*‘4ø:<0„èŠ;© Œ ò«‚&�w .Ð<0„Œ‚&è=èŠ;©~ �w PŒ;©z�w *ð~zÜ+PŒ;©}•« ò« Ø €ò«**Ø*Î1:ò«r‚ èŠ;© JrèŠ;©,4:r‚Jr¾BJèŠ;©h ~øý^* ç@ �w{ªèŠ �w;©PŒ¢„ <, ç@ �w ;©PŒ ç@ �w³Ž$*;©PŒ ç@ �w ;©PŒ ç@ø˜* �w;©PŒ ç@ �w ;©PŒE¢ "Ê, ç@ �w;©PŒ ç@ �w"_¬&FÇ*{ªèŠ �w& F ÷ª@8:ª»«PŒ.º(DB7 1, �w({ªèŠ �wD 9©àL½’À+BÐ Ìà â4, «¾_Ϋ(d ýÊ Ã%ÿÁÂÿ—pÿÿ÷þÿJ ÷¥D Â%ÿÿÃ%€ÁÂÿÿ—pÿ÷þÿ ÷¥ Â%ÿÿÃ%€ÁÂþÿ—pÿ÷þÿö ÷¥ ð Â%ÿÿÃ%ÁÂÿ—pþÿ÷þÿÌ ÷¥ Æ Â%ÿÿÃ%Áªª—p÷þÿ¢ ÷¥ œ Â%ÿÿÃ%TUÁ—pªª÷þÿx ÷¥ r Â%ÿÿÃ%TUÁÂUU—p÷þÿN ÷¥H Â%Ã%ªªÁ—pUU÷þÿ$ ÷¥ Â%Ã%ªªÁªª—p@÷þÿú ÷¥ ô Â%ªêÃ%€ÁÂ@—pªª÷þÿÐ ÷¥ Ê Â%ªêÃ%€Á€—p€÷þÿ¦ ÷¥  Â%@Ã%ÁÂÇq—pÇq÷þÿ| ÷¥v Â%‘2Jý�%+Å%<¶ÁĈÔq÷þÿr÷¥lÄ%Å%ÁÄqˆÔ÷þÿH÷¥BÄ%Å%ÁÄÿÿq÷þÿ÷¥Ä%Å%ÁÄqÿÿ÷þÿô÷¥îÄ%Å%ÁÅÿÿWq÷þÿÊ÷¥ÄÅ%ÿÿÅ%ÿÿÁÅÿÿWq÷þÿ ÷¥šÅ%Å%ÁÅÿWq€÷þÿv÷¥ pÅ%€Å%€ÁÅÿÿWqÿ÷þÿL÷¥FÅ%€Å%€ÁÅÿWqÿ÷þÿ"÷¥Å%Å%ÁÅWq÷þÿø÷¥òÅ%Å%Â@Ã2Ä4ÁÀªª7pÌ÷þÿÂ÷¥ ¼À%ªêÁ%€ÁÀªª?p¤÷þÿ� PŒ;©Zz*äBJh~Zz®;PŒ;©ðò« ¬ €ò«™©€pE©,ªð¬ Ttðò« œ €ò«´ª€pE©.üTtðœ�ÃTt‚ D�w èŠ;©~0�w , Tt‚D~0‚TPŒ;©z,�w PŒ;© Úò«z,vz,Úzt‰ €ò«´ª@8E©4l®_ « À+}s,˜4l7 ^íàL9©b@yΫð4S«¾_ « rÀvj8,~b7 rLéàL9©Îò« J €ò«ôýà Ϋ(dâ9©àLdf@ä7 @J, ç@ «¾_ ò« ;©èŠ@1ô¸Â\.ò«¸Â  E©€pÝ©ò« €­¸(É.ò«¸ ò« € ò«({ªèŠ]BB7 ,Í.B9©àL½’À+ B «¾_;©PŒ �w,0(N0RHŒ,N;©PŒ �w0 R Ϋ(dH9©àLq 8DBNR7 F¨.™ s D BNR «¾_FpPh j¥ø÷¥ ’À%ªêÁ%€ÁÀªªp2÷þÿn÷¥ hÀ%ªêÁ%€ÁÀªªp÷þÿF÷¥ @À%ªêÁ%€ÁÀªªp÷þÿ÷¥ À%ªêÁ%€ÁÀªª#p÷þÿö÷¥ ðÀ%ªêÁ%€ÁÀªª4p÷þÿÌ÷¥ ÆÀ%ªêÁ%€ÁÀªªp4lr芓«A« hPŒ»«€p÷ª.24lrh,/^ZPŒ»«:ª@8÷ª L JèŠ{ª.r^ZLJ;BèŠ{ª02èŠ;©@QñªNO«*üB02}Z¤y7 "æ÷‹”¯F(�wh}Z¤yŒ(@@8ó«.Ú@ €ò«@ò«@@yΫ@PŒ»«@¾_ «.M@®_ «@}•«@芓«@ð4S«@NO«.9@A«@0z,«@€p÷ª@@8÷ª@@Qñª.ü@´ª@èŠ{ªðý,÷ª@8Ϋ@yh Ϋ(dj9©àL˜w2$bLB7 7 -.LB «®_9©àL}sÀ+ «¾_Î~D*;©èŠ �w ;©èŠ D �waŠ( ,ÿ*;©PŒ �w( �w  ;©PŒ �w,Ž”0* �w;©PŒ �w0 �w ;©PŒœž48­, �w4 �w;©PŒ �w8 �wý¨<@¥*;©PŒ �w< �w ;©PŒ �w@R²"D&F\. �w";©èŠ �wD �wý”˜÷¥ ’À%ªêÁ%€ÁÀªªp2÷þÿn÷¥ hÀ%ªêÁ%€ÁÀªªp÷þÿF÷¥ @À%ªêÁ%€ÁÀªªp÷þÿ÷¥ À%ªêÁ%€ÁÀªª#p÷þÿö÷¥ ðÀ%ªêÁ%€ÁÀªª4p÷þÿÌ÷¥ ÆÀ%ªêÁ%€ÁÀªªDJPV\bhntz€wĆŒ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôI@:ª@™©@èŠJ©.@€pE©@@8E©@PŒ;©@èŠ;©@àL9©.Ç@À+½’@À+}s@Àvj8”¯}Z¤y.óED�w &�wœ\æ\æ\æ\Dæ\&ö,ê}•«èŠJ©A« ˜ò«&�w .Xæ\f\f ˜&Ø&¬èŠ;©: ò« &�w èŠ;©,¤:&Ê`Ôò«Ê €ò« ™© @8E©ô.�ÔÊôº }•«®_ «À+½’ àL9© °@yΫð4S«.F7 °¤ìý& F÷ª@8¾(D¹.:ª»«PŒ �w( {ªèŠ �wD9©àL.ÌB7 7 /,½’À+B  «¾_9©àL}sÀ+ «¾_âB(Œ.;©èŠB �w ;©PŒ ç@ �w(mî ,±*;©PŒ ç@ �w, ;©PŒ ç@æø04w* �w0;©PŒ ç@ �w4 ;©PŒ8<<, ç@ �w8;©PŒ ç@ �w<3  @D4*;©PŒ ç@ �w@ {ªèŠ �wDý�%+Å%<¶ÁĈÔq÷þÿr÷¥lÄ%Å%ÁÄqˆÔ÷þÿH÷¥BÄ%Å%ÁÄÿÿq÷þÿ÷¥Ä%Å%ÁÄqÿÿ÷þÿô÷¥îÄ%Å%ÁÅÿÿWq÷þÿÊ÷¥ÄÅ%ÿÿÅ%ÿÿÁÅÿÿWq÷þÿ ÷¥šÅ%Å%ÁÅÿWq€÷þÿv÷¥ pÅ%€Å%€ÁÅÿÿWqÿ÷þÿL÷¥FÅ%€Å%€ÁÅÿWqÿ÷þÿ"÷¥Å%Å%ÁÅWq÷þÿø÷¥òÅ%Å%Â@Ã2Ä4ÁÀªª7pÌ÷þÿÂ÷¥ ¼À%ªêÁ%€ÁÀªª?p¤÷þÿ�ø÷¥ ’À%ªêÁ%€ÁÀªªp2÷þÿn÷¥ hÀ%ªêÁ%€ÁÀªªp÷þÿF÷¥ @À%ªêÁ%€ÁÀªªp÷þÿ÷¥ À%ªêÁ%€ÁÀªª#p÷þÿö÷¥ ðÀ%ªêÁ%€ÁÀªª4p÷þÿÌ÷¥ ÆÀ%ªêÁ%€ÁÀªªÏÞò« : €ò«™©@8E©.ŠÞ:èý!7 Ε,9©àL½’À+  «¾_ò«ÎΫ(d2,@4D ¬.@9©àL™ s 4D ç@ 1>7 7 ÷* ç@  «¾_ 9©àL}sÀ+ «¾_$RD0*;©èŠ �w ;©èŠ D �wa^v*;©èŠ ç@ �w {ªèŠ �wj b*;©PŒ ç@ �w  ;©PŒ ç@ tB* �w;©PŒ ç@ �w ;©PŒ]~ , ç@ �wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$ý”˜÷¥ ’À%ªêÁ%€ÁÀªªp2÷þÿn÷¥ hÀ%ªêÁ%€ÁÀªªp÷þÿF÷¥ @À%ªêÁ%€ÁÀªªp÷þÿ÷¥ À%ªêÁ%€ÁÀªª#p÷þÿö÷¥ ðÀ%ªêÁ%€ÁÀªª4p÷þÿÌ÷¥ ÆÀ%ªêÁ%€ÁÀªªÄ%’2Å%@,ÁÄ€qÿ÷þÿ÷¥ Ä%ÀÅ%€ÁÄÿq€÷þÿð÷¥ êÄ%ÀÅ%€ÁÄœßqˆ÷þÿÆ÷¥ÀÄ%+Å%<¶ÁĈqœß÷þÿœ÷¥–Ä1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ�w ,�w ‘€@jÀ\æXÀ0À,D.^�w �w @Q‡K @Q‡K }•«,áÀÀÀÀ!À\f"*¬T@Q‡K PŒ;©¾_ «ÀS3gàL9©*$T7  I(dΫ(dΫ (dΫ"ò«.n  "öúò«ö €ò« @8ö¨@8ö¨ì©,úöè€pE©H€pì¨ ` 0¥ª€pE©*1H`0ÚuH0@8ö¨´ª €pE© B€pì¨`.üH0àý)&À0À@€@ÿÿæ\A0@ULÀe&&\�ó.½’À+¯”;©›@;©P›@E©@8@º.E©€p@J©èŠ@J©PŒ@c©À]@–©¯@:.–©°@™©@Ý©‚@ì©@+ªÀ]@£.7ª€%@7ª@8@7ª€p@:ª@{ªèŠ@Q.ŠªèŠ@ñª@Q@õª@÷ª@8@÷ª€p@a.,«0z@-«ù}@A«@C«›@C«P›@_.O«N@O« f@O«i@S«2@S«ï4@€.•«}@Ê«èŠ@Ê«PŒ@Ì«@`@ò«@Ó.ò« €@j¬e;@(ò+ýåýö÷ öü€÷5„ù‡Ö âü÷›n÷’ j ˆ÷òù7 èùÆÄwøþ¦ÎåCÄÄ Ä ÄmÜûÌ‹�ˆ³ŠØÌ €ˆ³ŠØ sŠ˜sЍ³Š˜ó̸˜ÔE@ÁÄÁ Ä ýw@¸ûó‹Ø óŠÈ w@–û ˆÂ! ˆó•È3ŠØÖ ^÷ :üÎe÷%,üÎe÷5ü–%÷ü ˆÀøû7øûÐ 7ôûÐ 7ðûÐ 7ìû÷àû÷ ÀMûÁÃÁ þÀ úÀ"@ @ Àm7@ @ Àm@ @ 7À‡›’¦ÎåŽ6ŠÎ Îe0‡€”  %À• ˆÀ• ˆôÂ; ÂY Âm Š Â� ¼ ˆ(÷5@ò÷)÷àpø€”  % ˆòÀ• ˆÀ• øÂ÷ BÂÚ ˆÂã æÜ´ ˆƒÜÔÂë ˆƒ÷5€¢÷ˆ/,ý�%+Å%<¶ÁĈÔq÷þÿr÷¥lÄ%Å%ÁÄqˆÔ÷þÿH÷¥BÄ%Å%ÁÄÿÿq÷þÿ÷¥Ä%Å%ÁÄqÿÿ÷þÿô÷¥îÄ%Å%ÁÅÿÿWq÷þÿÊ÷¥ÄÅ%ÿÿÅ%ÿÿÁÅÿÿWq÷þÿ ÷¥šÅ%Å%ÁÅÿWq€÷þÿv÷¥ pÅ%€Å%€ÁÅÿÿWqÿ÷þÿL÷¥FÅ%€Å%€ÁÅÿWqÿ÷þÿ"÷¥Å%Å%ÁÅWq÷þÿø÷¥òÅ%Å%Â@Ã2Ä4ÁÀªª7pÌ÷þÿÂ÷¥ ¼À%ªêÁ%€ÁÀªª?p¤÷þÿ�B`Ê[(‚Ý©A«™©@8E© X ‚Ý©A«.ÃX¸»TPŒ»«€pº«`*®_ «ÀS3g*T`*7 ž">àL9©¦(dΫ¤ (dΫ¢@yΫ*T¦ ¤ ¢Œ@8÷ª$¸ò« ˆ ò«„ €ò«.$¸ˆ„|†@8*«õª€pE© N €pº«`**�N`*n™©@8E©j‚Ý© A«¸ò«,Wj ¸^|bò«^ €ò« @8ö¨@8ö¨¥ª,ÖbÜý-½’À+h�w(F/Àv(® ¯”o÷æ"7 ½’À+2¬ s,O«Nñª@Q{ªèŠ Àv¬ A«Ý©‚^Î(Þñ*ÎE©@8ì© ò« € (ò«Þä(Î<¬,A«Ý©‚ Î E©@8™©ò« €<ž8rÖ[,ò«rA« Ý©‚Ö÷ª@8E©@8HR(Þ?*™©ò« €R ò« (S«2Þé.VfÔ(//' SEGMENT BLOCKS.'/ü&S«2f-«ù}7ª€%ò«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ýÜ?�4úÿ‹.úý€Àÿÿ¡BŒBŒBŒ÷    ÷ ÂÂEøÿÂe0€� ˆ‡_ _ _ _ _ _ _ _ _ _  _  _  _  _  _ _ _ $_ $_ $_ $_ $_ $_ $_ $_ $_ $ _ $ _ $ _ $ _ $ _ $_ $%%PA611 MULTI-READER PUNCH EXERCISER%SET SR TO VECTOR OF READER 0%SET SR TO READERS TO TEST%SET SR TO CODE LEVEL-UP=8 DOWN=6%SET SR TO PUNCHES TO TEST%%MORE THAN 16 READERS ON SYSTEM%%MORE THAN 16 PUNCHES ON SYSTEM%%NON-EXISTENT READER SELECTED‡^Pl€pE©*< ´ª €pE©<€pº«*ÿ*<<Bo`*@8ö¨´ª €pE© 6€pì¨`.Ž`*6`2[(‚Ý©A«™©@8E© X ‚Ý©A«.]X N¾_ «"À+}sàL9©(dΫ@QñªNO«.z7 Øxüp7 (æ÷”¯F(�w(@Q‡KhØxüpx(@ €ò«@ò«.F@@yΫ@(dΫ@PŒ»«@€pº«@¾_ «.²@®_ «@}•«@NO«@A«@0zØý1Ô®.|/' PSEGX NSEGX NSEGP POLY'' NSEGA 3.¢ YENDL XL DXL'' ZL0"È DZL')ÖààþÿY,ÖO«ià;©›à ÀvþÿÝ©‚`âÖZÏ,Ö÷ª@8E©@8 õª ò« €ZS«2ÑðÞ^àþÿÐ,ÞS«2^ -«ù};©›à Àvþÿàbà¹.S«ï4;©›à Àvb S«ï4;©›àÐÆà*, ÀvÆS«ï4;©› à Àv*S«ï4vàŽQ*;©›à 3÷–ÿN÷À@÷D<÷ 8‰4“*”4 ÷27 27 ,· ‡Àe÷ ôp ,5M*¸4w · wd w  ú÷ 7!ü ÷ èÔ*Ü4‰4÷ àÎÀe×÷-Ö¤÷-Ö¤÷-Ì*5Оî÷¾ ÿ÷Àÿ÷´ÿ‰4 ‰Ô54÷M¦*$5¨¤wXÿÁhÂfÃdÄb…ÁbÂ`Ãl*H5^Ä\…ÁPÂTÃRÄP…ÁLÂ0ÃÖ*l5FÄD…Á:Â<Ã:Ä8…Á4 Ã|*�5.Ä,…ö ÝõÍo@öšó@”€öÎ*´5¬¨ƒ“ÀöF£Ø5ÿÿ¤ Ø5% DROPPED OFFENDING ROMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,«.í@@8*«@@8÷ª@õª@@Qñª@´ª.@¥ª@ì©@(‚Ý©@‚Ý©@™©.T@€pE©@@8E©@PŒ;©@àL9©@@8ö¨.à@€pì¨@À+}s@ÀS3g”¯Øxüp.ó&\&&êì$¬ Àv}•«~€@ìÀ\æ\æ2\¬ æÄ.qD�w èŠJ© F Àv ›C«@�w *SDF @¸PŒJ©| Àv P›C«<�w PŒJ©(r| <¬u´ Àv P›C« 8�w PŒJ©ì Àv *U´ 8ì  dP›C«4�wÔý5ÀvŽ S«ï4 S«27ª@8±*àðà(;©P›à Àvð S«ï4 ;©P›àÚ6¸à€�, Àv¸S«ï4;©P› à Àv€S«ï4ÚBàHà‘(;©P›à ÀvH S«ï4 ;©P›àN}, ÀvS«ï4S«2 7ª€p7ª€%ò«ì$\j(5I6,5F10.4)ÜଠÚÞh.j–©¯Üà Àv¬ ÚS«2Þú.xˆÜ(//' INTL DINÐ&S«2ˆ-«ù}7ª€%ò«Ü‚.žTL NSEL YENDR XR'' ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8 %|*ò5KWAD0fÿ@ÀÀf6f6ù*6f6í*:6e*^6÷5”ÿw8Å‚ÿw ÿÀ|ÿÐ’6=*‚6Ð�vÿ÷ ÍU@‰? bÿœ6ò5ÅXÿ÷ ˆó6*¦6‰ò57 vÁFÿ÷BÿpÀ>ÿÐæ6Ð8ÿ÷(\Ù*Ê6÷50ÿ÷eN÷JLÿED‰? >÷ <.*î6ÿE2þ6ò5· "×-<çæúþŽ w �*7,ÝJ7 ‰ 7ò5‰ò5.7ÿÿ% RUN TIæ*67ME IS APPROXIMATELY . MUNITES %“Z7g PŒJ© $ Àv P›C«(ê4$ ’Í0�w PŒJ© \ Àv P›C«,�w *›0\ ,†PŒJ©”Àv P›C«(�w PŒJ©(¤”(zbÌÀv P›C« &�w èŠJ©jÀv * Ì&jnN›C«"�w PŒJ©  Àv P›C«(¶" `y�w PŒJ© ØÀv P›C«�w *yØT©PŒJ©Àv P›C«�w PŒJ©(oH�HÀv P›C« �w PŒJ©€Àv *ÅH€<Ðý9 Dß.ÄXR ZR DZR')Öààþÿô,ÖO«i à";©›$à &Àvþÿ(Ý©‚ êÖXÇ,Ö÷ª@8E©@8 õª ò« €XS«2ÒøÞ\àØè,ÞS«2\ -«ù};©P›à ÀvØã à N*S«ï4;©P›à Àv  S«ï4S«2„àjv*7ª€p;©›à Àvj S«ï4S«2Y&àÌà#.7ª@8;©P›à ÀvÌ S«ï4;©P›à‡4”à\ Í, Àv”S«ï4;©P› à Àv\ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþP›C«�w PŒJ© ¸Àv P›C«(è¸.‹ �w PŒJ© ðÀv P›C«�w *½ ð"cèŠJ©ŽÀv ›C«�w èŠJ©(7Ž'*Àv ›C« �w èŠJ©ÆÀv *ã*Æ l›C«�w èŠJ© bÀv ›C«(bü�w èŠJ©þÿÀv ›C«˜ò«,[þÿ˜îšò €ò«ì©@8E© Æ ‚Ý©A«,BòÆÞÛÞ@`Ì«•')D.TEORABÐÌý=S«ï4@à$ à°(;©P›à Àv$  S«ï4 ;©P›à�Lì �, Àvì S«ï4S«2 7ª€p7ª€%ò« *Zn(2F10.4,I6,5F10.4)ÜଠâÞ#.n–©¯Üà Àv¬  â"S«2$ÞÂ.|Œ²(//' INTR DINé&S«2Œ-«ù}7ª€%ò«²¦&¢TR NSER I')Öààþÿ<,ÖO«ià;©›à Àvþÿ Ý©‚DÀâ /,:ªâ÷ª€p E©€p õªò« € mÎÞà9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ KB JO, KSOCBLT ENGMSEE RE FREMOO N('Úª.ò«€%7ªù}-« ¬ 2S«Þ2S«,¶¬Þ˜¦x¬ Àv Ü °–© }•«Ž €ò«,²x¬ ÜŽˆ¯™©@8E© @8÷ª Ö‚Ý©þÿÀv *’Öþÿ|F›C« fO« Ö }•«.¬ Àv (­Ö.¬ lòàܯ–©芊ª jÀv à›;©,làÜjà\ŒèŠŠªF Àv à ›;©PŒÊ«ÌÀv ,‹F àÌNæàP›;© €p÷ª âPŒÊ«ÈýÄý*S«2ÞS«2  -«ù};©P›à"à´ à| Û, Àv´ S«ï4;©P› à Àv| S«ï4ÐìàF ¿*S«27ª€p ;©› à ÀvF S«ï4múà.S«27ª@8 S«2 àS«27ª@87ª€%¾" (2F10.4,2I6)Üଠ¸ *ò«–©¯Üà Àv¬ ¸ &ÖàÖà?.•«}ÖO«i à Ö÷ª@8;©›à56þÿâàè( ÀvþÿÊ«èŠâ ÷ª€p ;©P›àDBðâàè( Àvðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ