home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_2.iso / files / 813b.lha / IdleLed_v2.0 / IDLE_LED.C < prev    next >
C/C++ Source or Header  |  1993-10-28  |  3KB  |  127 lines

  1.  
  2. /*
  3.  
  4. Program:    Idle Led
  5. Version:    2.0a    26/10/93
  6. Author:        Lindsay Meek (meek@fizzy.csu.murdoch.edu.au)
  7.  
  8. Description:    Whenever the CPU is busy, the power led goes on else it is off.
  9.  
  10.         This is the second version that operates by attaching itself
  11.         to the vertical blanking interrupt. A low priority (-127)
  12.         task is active which increments a counter and turns off the
  13.         light. When this task does not run, the vblank irq detects
  14.         the non-incrementing counter and turns the light on.
  15.  
  16.         This version is more system friendly than 1.0
  17.  
  18.         The CPU must be busy for more than 1 vbi for the
  19.         light to activate
  20. */
  21.  
  22. #include <exec/nodes.h>
  23. #include <exec/tasks.h>
  24. #include <exec/interrupts.h>
  25. #include <hardware/cia.h>
  26. #include <hardware/custom.h>
  27. #include <hardware/intbits.h>
  28. #include <libraries/dos.h>
  29.  
  30. struct Task *FindTask(char *);
  31.  
  32. extern void IdleIrq(void);
  33.  
  34. /* various counters used to detect the idle state in the vblank */
  35. ULONG idle_vbi_cnt_limit[3];
  36.  
  37. /* Run this as a process. It aborts when it detects a CTRL_C signal */
  38. main(int argc,char **argv)
  39. {
  40.     struct Task *met;
  41.     struct Interrupt mei;
  42.     BYTE oldpri;
  43.  
  44.     mei.is_Node.ln_Type = NT_INTERRUPT;
  45.     mei.is_Node.ln_Pri  = -127;
  46.     mei.is_Node.ln_Name = "Idle-Led-Off";
  47.     mei.is_Data = (APTR)idle_vbi_cnt_limit;
  48.     mei.is_Code = IdleIrq;
  49.  
  50.     /* reset counter,last state */
  51.  
  52.     AddIntServer(INTB_VERTB, &mei);        /* Install IRQ server */
  53.  
  54.     met=FindTask(NULL);        /* Fetch this tcb */
  55.     oldpri=met->tc_Node.ln_Pri;    /* Save old priority */
  56.     met->tc_Node.ln_Pri=40;        /* Raise priority for calibration */
  57.  
  58.     idle_vbi_cnt_limit[0]=0;
  59.     idle_vbi_cnt_limit[1]=0;
  60.     idle_vbi_cnt_limit[2]=0;
  61.  
  62.     /* wait for next vbi */
  63.     while(idle_vbi_cnt_limit[0]==0) ;
  64.  
  65.     /* count # of increments in one frame (for calibration) */
  66.     idle_vbi_cnt_limit[0]=0;
  67.     idle_vbi_cnt_limit[2]=0;
  68.     while(idle_vbi_cnt_limit[0] == 0) 
  69.         idle_vbi_cnt_limit[2]++;
  70.  
  71.     /* > 50 % load is busy */
  72.     idle_vbi_cnt_limit[2] /= 2;
  73.  
  74.     met->tc_Node.ln_Pri=-127;    /* Make priority VERY low for idle */
  75.  
  76.     /* Busy loop for eating idle cpu cycles */
  77.     while((met->tc_SigRecvd & SIGBREAKF_CTRL_C)==0)    /* Abort on CTRL_C */
  78.     {
  79.         /* Increment idle counter */
  80.         idle_vbi_cnt_limit[1]++;
  81.     }
  82.  
  83.     RemIntServer(INTB_VERTB,&mei);            /* Remove IRQ server */
  84.  
  85.     met->tc_Node.ln_Pri=oldpri;            /* Change priority back */
  86.  
  87.     /* Turn on power light */
  88.     ciaa.ciapra &= -1-CIAF_LED;
  89.  
  90.     return 0;
  91. }
  92.  
  93. #asm
  94.  
  95. ;
  96. ;Assembly section for vertical blanking interrupt server
  97. ;
  98. ;You may have to put this into a seperate .asm file and compile to get it working
  99. ;with your C compiler
  100. ;
  101.  
  102.     include    "hardware/cia.i"
  103.  
  104. _ciaa    =    $bfe001        ;i defined it here so i could use the small model!
  105.  
  106.     public    _IdleIrq
  107.  
  108. _IdleIrq:
  109.  
  110.     addq.l    #1,(a1)+
  111.  
  112.     move.l    (a1),d0        ;idle_cnt
  113.     clr.l    (a1)+        ;=0
  114.     cmp.l    (a1),d0        ;>=idle_limit
  115.     bge.s    _IdleIrq1    ;yes - then its idle
  116.     bclr.b    #CIAB_LED,_ciaa+ciapra    ;turn on power light (cpu is busy)
  117.     moveq    #0,d0        ;permit other servers to execute
  118.     rts            
  119.  
  120. _IdleIrq1:
  121.  
  122.     bset.b    #CIAB_LED,_ciaa+ciapra    ;turn off power light (cpu is idle)
  123.     moveq    #0,d0        ;permit other servers to execute
  124.     rts
  125.  
  126. #endasm
  127.