oracular (3) install_int_ex.3alleg4.gz

Provided by: allegro4-doc_4.4.3.1-5_all bug

NAME

       install_int_ex - Adds or modifies a timer. Allegro game programming library.

SYNOPSIS

       #include <allegro.h>

       int install_int_ex(void (*proc)(), int speed);

DESCRIPTION

       Adds  a function to the list of user timer handlers or, if it is already installed, retroactively adjusts
       its speed (i.e makes as though the speed change occurred precisely at the last tick). The speed is  given
       in  hardware clock ticks, of which there are 1193181 a second. You can convert from other time formats to
       hardware clock ticks with the macros:

          SECS_TO_TIMER(secs)  - give the number of seconds between
                                 each tick
          MSEC_TO_TIMER(msec)  - give the number of milliseconds
                                 between ticks
          BPS_TO_TIMER(bps)    - give the number of ticks each second
          BPM_TO_TIMER(bpm)    - give the number of ticks per minute

       There can only be sixteen timers in use at a time, and some other parts of Allegro  (the  GUI  code,  the
       mouse  pointer display routines, rest(), the FLI player, and the MIDI player) need to install handlers of
       their own, so you should avoid using too many at the same time. If you call this routine  without  having
       first installed the timer module, install_timer() will be called automatically.

       Your  function  will  be called by the Allegro interrupt handler and not directly by the processor, so it
       can be a normal C function and does not need a special wrapper. You should be  aware,  however,  that  it
       will  be called in an interrupt context, which imposes a lot of restrictions on what you can do in it. It
       should not use large amounts of stack, it must not make any calls to the operating system, use C  library
       functions,  or contain any floating point code, and it must execute very quickly. Don't try to do lots of
       complicated code in a timer handler: as a general rule you should just set  some  flags  and  respond  to
       these later in your main control loop.

       In  a DOS protected mode environment like DJGPP, memory is virtualised and can be swapped to disk. Due to
       the non-reentrancy of DOS, if a disk swap occurs inside an  interrupt  handler  the  system  will  die  a
       painful  death,  so  you  need  to make sure you lock all the memory (both code and data) that is touched
       inside timer routines. Allegro will lock everything it uses, but you are  responsible  for  locking  your
       handler    functions.    The    macros   LOCK_VARIABLE   (variable),   END_OF_FUNCTION   (function_name),
       END_OF_STATIC_FUNCTION (function_name), and LOCK_FUNCTION (function_name) can be used  to  simplify  this
       task. For example, if you want an interrupt handler that increments a counter variable, you should write:

          volatile int counter;

          void my_timer_handler()
          {
             counter++;
          }

          END_OF_FUNCTION(my_timer_handler)

       and in your initialisation code you should lock the memory:

          LOCK_VARIABLE(counter);
          LOCK_FUNCTION(my_timer_handler);

       Obviously  this  can  get  awkward  if  you use complicated data structures and call other functions from
       within your handler, so you should try to keep your interrupt routines as simple as possible.

RETURN VALUE

       Returns zero on success, or a negative number if there is no room to add a new user timer.

SEE ALSO

       install_timer(3alleg4),   remove_int(3alleg4),    install_int(3alleg4),    install_param_int_ex(3alleg4),
       excamera(3alleg4), exsprite(3alleg4), extimer(3alleg4), exunicod(3alleg4), exupdate(3alleg4)