home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 638a.lha / Perfmeter_v1.2 / source.LZH / source / perfmeter.c
C/C++ Source or Header  |  1991-09-22  |  17KB  |  655 lines

  1. ;/*    PerfMeter by Digital Design, Inc.
  2.  
  3. lc -v -y -ba perfmeter.c
  4. blink lib:cback.o+perfmeter.o to perfmeter lib lib:lc.lib+lib:amiga.lib
  5. quit
  6.  
  7.     Author:        Juha 'Comm' Tuominen / Digital Design
  8.     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  9.     Released:    15-Jul-91    v1.10
  10.     Revised:    07-Sep-91    v1.11
  11.     Revised:    08-Sep-91    v1.12
  12.     Revised:    18-Sep-91    v1.2    (needs KS2.0 now)
  13.     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  14.     Compiler:    SAS/C v5.10->
  15.     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  16. */
  17.  
  18. #include <exec/types.h>
  19. #include <exec/memory.h>
  20. #include <exec/execbase.h>
  21. #include <exec/tasks.h>
  22. #include <libraries/dos.h>
  23. #include <devices/timer.h>
  24. #include <intuition/intuitionbase.h>
  25. #include <libraries/diskfont.h>
  26. #include <graphics/rastport.h>
  27. #include <graphics/gfx.h>
  28. #include <graphics/gfxmacros.h>
  29. #include <graphics/text.h>
  30. #include <proto/all.h>
  31. #include <string.h>
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34.  
  35. #define STACK_SIZE 1000L    /* Arska's stack size */
  36.  
  37. #define NAME         "Perfmeter"
  38. #define VERSION        1
  39. #define REVISION    2
  40. #define DATE        "16.9.91"
  41. #define VERS        "Perfmeter 1.2"
  42. #define VSTRING        "PerfMeter 1.2 (18.9.91)\n\0"
  43. #define VERSTAG        "\0$VER: Perfmeter 1.2 (18.9.91)\0"
  44.  
  45. #define FONTSIZE 8
  46. #define FONTNAME "hires-5a.font"
  47.  
  48. #define WINDOWWIDTH        172
  49. #define WINDOWHEIGTH    130
  50.  
  51. long _stack=16384;
  52. char *_procname=VSTRING;
  53. long _priority=5;
  54. long _BackGroundIO=FALSE;
  55.  
  56. void MemCleanup() {}
  57.  
  58. UBYTE    versiontag[]=VERSTAG;    /* for version command */
  59.  
  60. BOOL    task_added=FALSE;
  61. BOOL    zipped=FALSE;
  62. BOOL    oldzipped=FALSE;
  63. BOOL    timeropen=FALSE;
  64. BOOL    timeropen2=FALSE;
  65. BOOL    keepgoing=TRUE;
  66. BOOL    time_requested=FALSE;
  67. BOOL    time_requested2=FALSE;
  68. ULONG    maxchip, maxfast, freechip=0, freefast=0,maxpub,freepub;
  69. ULONG    cputime=NULL,cputemp=NULL,prevcpu=68;
  70. ULONG    count=0;
  71. ULONG    chipscale=0, fastscale=0, publicscale=0;
  72. ULONG    jakaja=0,cputemp2=0;
  73. ULONG    tag1;
  74. char    processor[10]="68000";
  75. char    *taskname="Arska Väijy";
  76. APTR    stack=NULL;
  77. WORD    cordinates[]={0,0,80,29};    /* zipped window cordinates and size */
  78. int        cpuload=0,mode=0,oldmode=1;
  79. int        buffer[7][151];
  80. int        load=0;
  81. int        switchcount=0;
  82. int        upsecs=0,upmins=0,uphours=0,updays=0;
  83.  
  84. extern    struct ExecBase    *SysBase;
  85. struct    IntuitionBase *IntuitionBase=NULL;
  86. struct    Library *DiskfontBase=NULL;
  87. struct    Window *window=NULL;
  88. struct    IntuiText abouttext[];
  89. struct    IntuiText proceed;
  90. struct    GfxBase *GfxBase=NULL;
  91. struct    MsgPort *timerport=NULL;
  92. struct    timerequest *timermsg=NULL;
  93. struct    MsgPort *timerport2=NULL;
  94. struct    timerequest *timermsg2=NULL;
  95. struct    Task *task=NULL;
  96. struct    TextFont *textfont;
  97.  
  98. struct    NewWindow mywindow =
  99. {    420,
  100.     14,
  101.     WINDOWWIDTH,
  102.     WINDOWHEIGTH,
  103.     0,1,
  104.     CLOSEWINDOW | MENUPICK | NEWSIZE,
  105.     SMART_REFRESH | WINDOWDRAG | WINDOWCLOSE | WINDOWDEPTH,
  106.     NULL,
  107.     NULL,
  108.     "(Idle)",
  109.     NULL,
  110.     NULL,
  111.     70,
  112.     38,
  113.     NULL,
  114.     NULL,
  115.     WBENCHSCREEN
  116.  
  117. };
  118.  
  119. struct TagItem tagitems[2]={
  120.     {WA_Zoom,&cordinates},
  121.     {0,}
  122. };
  123.  
  124.  
  125. struct TextAttr TOPAZ80 = {(STRPTR)"topaz.font",TOPAZ_EIGHTY,0,0};
  126.  
  127. struct IntuiText abouttext[9] =
  128. {
  129.     {2,1,JAM1,8, 4,(struct TextAttr *)&TOPAZ80,(UBYTE *)VERS,(struct IntuiText *)&abouttext[1]},
  130.     {2,1,JAM1,8,14,(struct TextAttr *)&TOPAZ80,(UBYTE *)"by Juha Tuominen",(struct IntuiText *)&abouttext[2]},
  131.     {2,1,JAM1,8,22,(struct TextAttr *)&TOPAZ80,(UBYTE *)"Copyright © 1991",(struct IntuiText *)&abouttext[3]},
  132.     {2,1,JAM1,8,30,(struct TextAttr *)&TOPAZ80,(UBYTE *)"Digital Design, Inc.",(struct IntuiText *)&abouttext[4]},
  133.     {2,1,JAM1,8,38,(struct TextAttr *)&TOPAZ80,(UBYTE *)" ",(struct IntuiText *)&abouttext[5]},
  134.     {2,1,JAM1,8,46,(struct TextAttr *)&TOPAZ80,(UBYTE *)"Average 68040 load: 0   %",(struct IntuiText *)&abouttext[6]},
  135.     {2,1,JAM1,8,54,(struct TextAttr *)&TOPAZ80,(UBYTE *)" ",(struct IntuiText *)&abouttext[7]},
  136.     {2,1,JAM1,8,62,(struct TextAttr *)&TOPAZ80,(UBYTE *)"Arska Väijy has found",(struct IntuiText *)&abouttext[8]},
  137.     {2,1,JAM1,8,70,(struct TextAttr *)&TOPAZ80,(UBYTE *)"0 perfect numbers.",(struct IntuiText *)NULL}
  138. };
  139.  
  140. struct IntuiText proceed=
  141. {
  142.     2,1,JAM1,5,3,(struct TextAttr *)&TOPAZ80,(UBYTE *)"Continue",(struct IntuiText *)NULL
  143. };
  144.  
  145. /* This menu isn't visually beatufull but do just fine for this program */
  146.  
  147. struct IntuiText IText1={2,1,JAM2,0,0,&TOPAZ80,"Quit",NULL};
  148. struct MenuItem MenuItem9={NULL,0,64,58,8,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,(APTR)&IText1,NULL,NULL,NULL,MENUNULL};
  149. struct IntuiText IText2={2,1,JAM2,0,0,&TOPAZ80,"Switch",NULL};
  150. struct MenuItem MenuItem8={&MenuItem9,0,56,58,8,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,(APTR)&IText2,NULL,NULL,NULL,MENUNULL};
  151. struct IntuiText IText3={2,1,JAM2,0,0,&TOPAZ80,"Public",NULL};
  152. struct MenuItem MenuItem7={&MenuItem8,0,48,58,8,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,(APTR)&IText3,NULL,NULL,NULL,MENUNULL};
  153. struct IntuiText IText4={2,1,JAM2,0,0,&TOPAZ80,"Fast",NULL};
  154. struct MenuItem MenuItem6={&MenuItem7,0,40,58,8,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,(APTR)&IText4,NULL,NULL,NULL,MENUNULL};
  155. struct IntuiText IText5={2,1,JAM2,0,0,&TOPAZ80,"Chip",NULL};
  156. struct MenuItem MenuItem5={&MenuItem6,0,32,58,8,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,(APTR)&IText5,NULL,NULL,NULL,MENUNULL};
  157. struct IntuiText IText6={2,1,JAM2,0,0,&TOPAZ80,"Load",NULL};
  158. struct MenuItem MenuItem4={&MenuItem5,0,24,58,8,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,(APTR)&IText6,NULL,NULL,NULL,MENUNULL};
  159. struct IntuiText IText7={2,1,JAM2,0,0,&TOPAZ80,"CPU",NULL};
  160. struct MenuItem MenuItem3={&MenuItem4,0,16,58,8,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,(APTR)&IText7,NULL,NULL,NULL,MENUNULL};
  161. struct IntuiText IText8={2,1,JAM2,0,0,&TOPAZ80,"Idle",NULL};
  162. struct MenuItem MenuItem2={&MenuItem3,0,8,58,8,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,(APTR)&IText8,NULL,NULL,NULL,MENUNULL};
  163. struct IntuiText IText9={2,1,JAM2,0,0,&TOPAZ80,"About",NULL};
  164. struct MenuItem MenuItem1={&MenuItem2,0,0,58,8,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,(APTR)&IText9,NULL,NULL,NULL,MENUNULL};
  165.  
  166. struct Menu Menu1={NULL,0,0,62,0,    MENUENABLED,"Project",&MenuItem1};
  167.  
  168.  
  169.  
  170. void cleanexit(int error);
  171. void openthings(void);
  172. void addtimerequest(long secs, long micros);
  173. void changefont(void);
  174. void addtimerequest2(long secs, long micros);
  175. void uptime(void);
  176. ULONG maxmemsize(long memtype);
  177. void updatewindow(void);
  178. void oddstuff(void);
  179. void idletask(void);
  180. void __saveds switchroutine(void);
  181.  
  182. void CXBRK(void) 
  183.     cleanexit(0);
  184. }
  185.  
  186. void cleanexit(int error)
  187. {
  188.     if(task_added) RemTask(task);
  189.     if(task) FreeMem(task,sizeof(struct Task));
  190.     if(stack) FreeMem(stack,STACK_SIZE);
  191.     if(timeropen2)
  192.     {    if(time_requested2)
  193.         {
  194.             AbortIO((struct IORequest *)timermsg2);
  195.             WaitIO((struct IORequest *)timermsg2);
  196.         }
  197.         CloseDevice((struct IORequest *)timermsg2);
  198.     }
  199.     if(timermsg2) DeleteExtIO((struct IORequest *)timermsg2);
  200.     if(timerport2) DeletePort(timerport2);
  201.  
  202.     if(timeropen)
  203.     {    if(time_requested)
  204.         {
  205.             AbortIO((struct IORequest *)timermsg);
  206.             WaitIO((struct IORequest *)timermsg);
  207.         }
  208.         CloseDevice((struct IORequest *)timermsg);
  209.     }
  210.     if(timermsg) DeleteExtIO((struct IORequest *)timermsg);
  211.     if(timerport) DeletePort(timerport);
  212.     if(window->MenuStrip) ClearMenuStrip(window);
  213.     if(window) CloseWindow(window);
  214.     if(DiskfontBase) CloseLibrary(DiskfontBase);
  215.     if(GfxBase) CloseLibrary(GfxBase);
  216.     if(IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  217.     XCEXIT(error);
  218. }
  219.  
  220.  
  221. void openthings(void)
  222. {
  223.     int i,j;
  224.  
  225.     if (SysBase->LibNode.lib_Version<37)
  226.         cleanexit(99);
  227.     if (!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",37L)))
  228.         cleanexit(30);
  229.     if (!(IntuitionBase=(struct IntuitionBase*)OpenLibrary("intuition.library",37L)))
  230.         cleanexit(30);
  231.     if (!(DiskfontBase=(struct Library*)OpenLibrary("diskfont.library", 37L)))
  232.         cleanexit(30);
  233.     if(!(timerport=CreatePort(0,0)))
  234.         cleanexit(22);
  235.     if(!(timermsg=(struct timerequest *) CreateExtIO(timerport, sizeof(struct timerequest))))
  236.         cleanexit(22);
  237.     if(OpenDevice("timer.device", UNIT_VBLANK, ((struct IORequest *) timermsg), 0))
  238.         cleanexit(22);
  239.  
  240.     timeropen=TRUE;
  241.  
  242.     if(!(timerport2=CreatePort(0,0)))
  243.         cleanexit(22);
  244.     if(!(timermsg2=(struct timerequest *) CreateExtIO(timerport2, sizeof(struct timerequest))))
  245.         cleanexit(22);
  246.     if(OpenDevice("timer.device", UNIT_VBLANK, ((struct IORequest *) timermsg2), 0))
  247.         cleanexit(22);
  248.  
  249.     timeropen2=TRUE;
  250.  
  251.     if(!(window=OpenWindowTagList(&mywindow,(struct TagItem *)&tagitems)))
  252.         cleanexit(27);
  253.     SetMenuStrip(window,&Menu1);
  254.  
  255.     if(!(stack=AllocMem(STACK_SIZE, MEMF_CLEAR)))
  256.         cleanexit(10);
  257.     if(!(task=(struct Task*)AllocMem(sizeof(struct Task),MEMF_CLEAR|MEMF_PUBLIC)))
  258.         cleanexit(10);
  259.  
  260.     maxchip=maxmemsize(MEMF_CHIP);
  261.     maxfast=maxmemsize(MEMF_FAST);
  262.     maxpub=maxchip+maxfast;
  263.  
  264.     if(SysBase->AttnFlags & AFF_68010)    strcpy(processor,"68010");
  265.     if(SysBase->AttnFlags & AFF_68020)    strcpy(processor,"68020");
  266.     if(SysBase->AttnFlags & AFF_68030)    strcpy(processor,"68030");
  267.     if(SysBase->AttnFlags & AFF_68040)    strcpy(processor,"68040");
  268.  
  269.     /*    Because we run this part only once we just have to assume that user 
  270.         does not add memory cartiges or change the main processor while
  271.         this program is running :)
  272.     */
  273.  
  274.     chipscale=maxchip/100;
  275.     fastscale=maxfast/100;
  276.     publicscale=maxpub/100;
  277.  
  278.     /* init buffer */
  279.     for(i=0;i<6;i++)
  280.     {
  281.         for(j=0;j<150;j++)
  282.             buffer[i][j]=0;
  283.     }
  284. }
  285.  
  286.  
  287. void changefont(void)
  288. {
  289.     struct    TextAttr    textattr;
  290.     struct    TextFont    *textfont;
  291.  
  292.     textattr.ta_Name=FONTNAME;;
  293.     textattr.ta_YSize=FONTSIZE;
  294.     textattr.ta_Style=FS_NORMAL;
  295.     textattr.ta_Flags=FPF_ROMFONT | FPF_DISKFONT;
  296.  
  297.     if(textfont=(struct TextFont *)OpenDiskFont(&textattr))
  298.     {    SetFont(window->RPort,textfont);
  299.         if(!window->RPort->TxHeight==8)
  300.         {    cleanexit(10);
  301.         }
  302.     }
  303.     else
  304.     {    cleanexit(10);
  305.     }
  306. }
  307.  
  308. void addtimerequest(long secs, long micros)
  309. {
  310.     time_requested=TRUE;
  311.     timermsg->tr_node.io_Command=TR_ADDREQUEST;
  312.     timermsg->tr_time.tv_secs=secs;
  313.     timermsg->tr_time.tv_micro=micros;
  314.     SendIO((struct IORequest *)timermsg);
  315. }
  316.  
  317. void addtimerequest2(long secs, long micros)
  318. {
  319.     time_requested2=TRUE;
  320.     timermsg2->tr_node.io_Command=TR_ADDREQUEST;
  321.     timermsg2->tr_time.tv_secs=secs;
  322.     timermsg2->tr_time.tv_micro=micros;
  323.     SendIO((struct IORequest *)timermsg2);
  324. }
  325.  
  326. void uptime(void)
  327. {    char temp[30];
  328.  
  329.     if(++upsecs>60)
  330.     {    upsecs=0;
  331.         if(++upmins>60)
  332.         {    upmins=0;
  333.             if(++uphours>24)
  334.             {    uphours=0;
  335.                 updays++;
  336.             }
  337.         }
  338.     }
  339.     if(!zipped)
  340.     {    SetDrMd(window->RPort,JAM2);
  341.         SetBPen(window->RPort,0);
  342.         SetAPen(window->RPort,1);
  343.         Move(window->RPort,25,123);
  344.         sprintf(temp,"Uptime: %02d days  %02d:%02d:%02d",updays,uphours,upmins,upsecs);
  345.         Text(window->RPort,temp,25);
  346.     }
  347. }
  348.  
  349. ULONG maxmemsize(long memtype)
  350. {
  351.     ULONG blocksize=0;
  352.     struct MemHeader *MemHeader;
  353.  
  354.     Forbid();
  355.         for(MemHeader=(struct MemHeader *)SysBase->MemList.lh_Head;MemHeader->mh_Node.ln_Succ;MemHeader=(struct MemHeader *)MemHeader->mh_Node.ln_Succ)
  356.         {
  357.             if(MemHeader->mh_Attributes&memtype)
  358.                 blocksize+=((ULONG)MemHeader->mh_Upper-(ULONG)MemHeader->mh_Lower);
  359.         }
  360.     Permit();
  361.  
  362.     return(blocksize);
  363.  
  364.     /* MaxMemSize() by Louis A. Mamakos. */
  365. }
  366.  
  367.  
  368. void updatewindow(void)
  369. {
  370.     int i,j;
  371.     ULONG    curchip, curfast, curpub;
  372.     struct RastPort *rp=window->RPort;
  373.  
  374.     if(mode!=oldmode || oldzipped!=zipped)    /* User has decided to look some other item or window zip gadget is pressed*/
  375.     {    if(!zipped)    /* No use to refresh the window if it's zipped */
  376.         {    RefreshWindowFrame(window);
  377.             SetAPen(rp,0);
  378.             RectFill(rp,10,15,160,110);
  379.  
  380.             /* 3D border */
  381.             SetAPen(rp,1);
  382.             Move(rp,10,111);
  383.             Draw(rp,10,16);
  384.             Draw(rp,161,16);
  385.             SetAPen(rp,2);
  386.             Draw(rp,161,111);
  387.             Draw(rp,11,111);
  388.  
  389.             /* Scaling lines */
  390.             SetAPen(rp,3);
  391.             Move(rp,11,38);
  392.             Draw(rp,160,38);
  393.             Move(rp,11,64);
  394.             Draw(rp,160,64);
  395.             Move(rp,11,90);
  396.             Draw(rp,160,90);
  397.  
  398.             /* Draw existing GFX from buffer */
  399.             Move(rp,10,110-buffer[mode][0]);
  400.             SetAPen(rp,1);
  401.             for(j=1;j<=150;j++)
  402.                 Draw(rp,j+10,110-buffer[mode][j]);
  403.         }
  404.         oldmode=mode;
  405.         oldzipped=zipped;
  406.     }
  407.  
  408.     /* let's scroll a bit, OK? */
  409.     for(i=0;i<7;i++)
  410.     {
  411.         for(j=0;j<150;j++)
  412.             buffer[i][j]=buffer[i][j+1];
  413.     }
  414.     curchip=AvailMem(MEMF_CHIP);
  415.     curfast=AvailMem(MEMF_FAST);
  416.     curpub=AvailMem(MEMF_PUBLIC);
  417.  
  418.     buffer[0][150]=(UBYTE)(100*cputemp/60);
  419.     buffer[1][150]=load;
  420.     buffer[2][150]=(UBYTE)(curchip/chipscale);
  421.     if(fastscale)
  422.         buffer[3][150]=(UBYTE)(curfast/fastscale);
  423.     buffer[4][150]=(UBYTE)(curpub/publicscale);
  424.     buffer[5][150]=switchcount;
  425.     buffer[6][150]=(UBYTE)(83-(100*cputemp/60));
  426.     if(buffer[6][150]<0) buffer[6][150]=0;
  427.  
  428.  
  429.     for(i=0;i<7;i++)
  430.     {    if(buffer[i][150]>93)
  431.         {    buffer[i][150]=93;
  432.         }
  433.     }
  434.  
  435.     if(!zipped)
  436.     {    ScrollRaster(rp,1,0,11,17,160,110);
  437.         SetDrMd(rp,JAM1);
  438.         SetAPen(rp,3);
  439.         WritePixel(rp,160,38);
  440.         WritePixel(rp,160,64);
  441.         WritePixel(rp,160,90);
  442.         SetAPen(rp,1);
  443.         Move(rp,159,110-buffer[mode][149]);
  444.         Draw(rp,160,110-buffer[mode][150]);
  445.     }
  446. }
  447.  
  448.  
  449.  
  450.  
  451. void idletask(void)    /*    This is Arska Väijy */
  452. {
  453.     ULONG suurinluku=1,taydellinenluku,luku;
  454.  
  455.     Disable();
  456.         task->tc_Switch=switchroutine;
  457.         task->tc_Flags|=TF_SWITCH;
  458.     Enable();
  459.  
  460.     while(1)
  461.     {    taydellinenluku=0;
  462.         for(luku=suurinluku;luku>1;luku--)
  463.         {
  464.             if(!(suurinluku%luku))
  465.                 taydellinenluku+=luku;
  466.         }
  467.         if(taydellinenluku==suurinluku)
  468.             count++;
  469.         suurinluku++;
  470.     }
  471.  
  472.     /* As you know, there may not be busy looped parts in multitasking
  473.        programs :) */
  474. }
  475.  
  476. void __saveds switchroutine(void)
  477. {
  478.     /*    Thanks to Juhani Vehviläinen for sweatting with me because of
  479.         this idle counting routine */
  480.  
  481.     cputime+=SysBase->Quantum-SysBase->Elapsed;
  482.     switchcount++;
  483. }
  484.  
  485.  
  486. void _main(char *arguments)
  487. {
  488.     ULONG    timersignal, 
  489.             timersignal2,
  490.             idcmpsignal, 
  491.             signals, 
  492.             class;
  493.     UWORD    code, 
  494.             qualifier;
  495.     struct    IntuiMessage *msg=NULL;
  496.     char    temp1[80],temp2[80];
  497.     struct    Node *mynode;
  498.     ULONG    sum1=0;
  499.     int        pos1=0,pos=0,last[61],length=0,i,j=0,argumentcount=0;
  500.     
  501.  
  502.     /* handle arguments */
  503.     for(i=0;i<strlen(arguments);i++)
  504.     {    if(arguments[i]==32 || arguments[i]==13 || arguments[i]==10)
  505.         {    if(!strncmp(temp1,"-x",2))
  506.                 mywindow.LeftEdge=atoi(temp1+2);
  507.             if(!strncmp(temp1,"-y",2))
  508.                 mywindow.TopEdge=atoi(temp1+2);
  509.             argumentcount++;
  510.             j=0;
  511.         }
  512.         else
  513.         {    temp1[j++]=arguments[i];
  514.             temp1[j]=0;
  515.         }
  516.     }
  517.  
  518.     openthings();
  519.     changefont();
  520.  
  521.     for(i=0;i<60;i++)
  522.         last[i]=0;
  523.  
  524.     timersignal = 1L << timerport->mp_SigBit;
  525.     timersignal2= 1L << timerport2->mp_SigBit;
  526.     idcmpsignal = 1L << window->UserPort->mp_SigBit;
  527.  
  528.     addtimerequest(1,0);
  529.     addtimerequest2(0,10);
  530.  
  531.     task->tc_Node.ln_Type=NT_TASK;
  532.     task->tc_Node.ln_Name=taskname;
  533.     task->tc_Node.ln_Pri=-128;
  534.     task->tc_SPLower=(APTR)stack;
  535.     task->tc_SPUpper=(APTR)(STACK_SIZE+(ULONG)stack);
  536.     task->tc_SPReg=task->tc_SPUpper;
  537.  
  538.     AddTask(task,idletask,0L);
  539.     task_added=TRUE;
  540.  
  541.     while(keepgoing)
  542.     {    signals = Wait(timersignal | timersignal2 | idcmpsignal);
  543.  
  544.         if(signals & idcmpsignal)
  545.         {
  546.             while(msg=(struct IntuiMessage *)GetMsg(window->UserPort))
  547.             {
  548.                 class=msg->Class;
  549.                 code=msg->Code;
  550.                 qualifier=msg->Qualifier;
  551.                 ReplyMsg((struct Message *) msg);
  552.  
  553.                 switch(class)
  554.                 {
  555.                     case CLOSEWINDOW:
  556.                         keepgoing=FALSE;
  557.                         break;
  558.                     case NEWSIZE:
  559.                         if(window->Width==WINDOWWIDTH && window->Height==WINDOWHEIGTH)
  560.                             zipped=FALSE;
  561.                         else
  562.                         {    zipped=TRUE;
  563.                             SetAPen(window->RPort,0);
  564.                             RectFill(window->RPort,10,15,75,26);
  565.                             Move(window->RPort,10,21);
  566.                             SetAPen(window->RPort,1);
  567.                             Text(window->RPort,"..zZzZz..",9);
  568.                         }
  569.                         break;
  570.                     case MENUPICK:
  571.                         switch(ITEMNUM(code))
  572.                         {
  573.                             case 0:
  574.                                 cputime=100-cpuload;
  575.                                 if(cputime<1 || cputime>100)
  576.                                     cputime=20;
  577.                                 sprintf(temp1,"Average %s load: %d %% ",processor,cputime);
  578.                                 cputime=0;
  579.                                 abouttext[5].IText=(UBYTE *)temp1;
  580.                                 sprintf(temp2,"%d perfect numbers.",count);
  581.                                 abouttext[8].IText=(UBYTE *)temp2;
  582.                                 AutoRequest(NULL,&abouttext[0],NULL,&proceed,NULL,NULL,272,128);
  583.                                 break;
  584.                             case 1:
  585.                                 mode=0;
  586.                                 window->Title="(Idle)";
  587.                                 break;
  588.                             case 2:
  589.                                 mode=6;
  590.                                 window->Title="(CPU)";    
  591.                                 break;
  592.                             case 3:
  593.                                 mode=1;
  594.                                 window->Title="(Load)";
  595.                                 break;
  596.                             case 4:
  597.                                 mode=2;
  598.                                 window->Title="(Chip)";
  599.                                 break;
  600.                             case 5:
  601.                                 mode=3;
  602.                                 window->Title="(Fast)";
  603.                                 break;
  604.                             case 6:
  605.                                 mode=4;
  606.                                 window->Title="(Public)";
  607.                                 break;
  608.                             case 7:
  609.                                 mode=5;
  610.                                 window->Title="(Switch)";
  611.                                 break;
  612.                             case 8:
  613.                                 cleanexit(0);
  614.                         }
  615.                         break;
  616.                 }
  617.             }
  618.         }
  619.  
  620.         if(signals & timersignal)
  621.         {
  622.             GetMsg(timerport);
  623.             addtimerequest(1,0);
  624.             uptime();
  625.             if(100*cputime/60<100)
  626.                 cputemp=cputime;
  627.             cputemp2+=100*cputime/60;
  628.             cputime=0;
  629.             cpuload=cputemp2/++jakaja;
  630.             length = 0;
  631.             Disable();
  632.                 for(mynode=(SysBase->TaskReady).lh_Head;mynode=mynode->ln_Succ;length++)
  633.                     ;
  634.             Enable();
  635.             sum1+=(length-last[pos1]);
  636.             last[pos]=length;
  637.             if(++pos1==60)    pos1=0;
  638.             if(++pos==60)    pos=0;
  639.             load=(sum1*100+50)/480;
  640.             if(load>100)
  641.  
  642.                 load=100;
  643.             updatewindow();
  644.             switchcount=0;
  645.         }
  646.         if(signals & timersignal2)
  647.         {
  648.             GetMsg(timerport2);
  649.             addtimerequest2(0,8);
  650.         }
  651.     }
  652.     cleanexit(0);
  653. }
  654.