home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / desklib / examples / DeskLib / Examples / OtherSrc / c / NZPollWord < prev    next >
Text File  |  1994-04-10  |  2KB  |  83 lines

  1. /*  A quick test of Wimp_PollWords under RISC OS 3, by Jason Williams
  2.  *
  3.  *  This sets up a bit of code in the RMA which after 5 seconds will set a
  4.  *  word of memory (also in the RMA) to a non-zero value. This should hopefully
  5.  *  result in our program getting an event 13 (non-zero pollword), at which
  6.  *  point, we'll beep and exit.
  7.  *  (i.e. if you run this and you don't get a beep after ~5 seconds, panic!)
  8.  *
  9.  *  BTW, please excuse this messy code, but as I said, it's a quick test!
  10.  *
  11.  *  Oh, and a warning - this allocates 16 bytes in the RMA, but never frees
  12.  *  it, so if you run it over 4000 times in a row, you may notice your RMA
  13.  *  growing! ;-)
  14.  */
  15.  
  16.  
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include "string.h"
  20.  
  21. #include "DeskLib:WimpSWIs.h"
  22. #include "DeskLib:SWI.h"
  23. #include "DeskLib:Sound.h" 
  24.  
  25.  
  26. /*  Code pinched from OtherSrc.TaskSlice.c:
  27.  *    STR R12, [R12]:MOV PC, R14
  28.  *  (Called after 5 seconds to tell our task to quit via a Wimp PollWord)
  29.  */
  30. int callaftercode[4] = {0xe58cc000, 0xe1a0f00e};
  31.  
  32. #define XOS_Module            0x0002001e
  33. #define XOS_CallAfter         0x0002003b
  34. #define XOS_RemoveTickerEvent 0x0002003d
  35.  
  36.  
  37. int main()
  38. {
  39.   unsigned int    version = 300;
  40.   task_handle     taskhandle;
  41.   int             *memory, *callafterflag;
  42.   event_pollmask  mask;
  43.   event_pollblock event;
  44.   int             quit = FALSE;
  45.  
  46.   Wimp_Initialise(&version, "Test", &taskhandle, NULL);
  47.  
  48.   SWI(4,3, XOS_Module, 6, NULL, NULL, 16, /* TO */ NULL, NULL, &memory);
  49.  
  50.   callafterflag = memory + 2;                      /* int pointer arithmetic */
  51.  
  52.   memcpy(memory, callaftercode, 8);            /* Copy our code into the RMA */
  53.   *callafterflag = 0;
  54.   SWI(3, 0, XOS_CallAfter, 500, memory, callafterflag);
  55.  
  56.   mask.value = 1; /* Mask out NULLs. */
  57.  
  58.   mask.data.nonzeropollword = FALSE;    /* Allow the event to get to us */
  59.   mask.data.r3ispollwordptr = TRUE;     /* Inform WIMP that r3 is valid */
  60.  
  61.   quit = FALSE;
  62.   while (!quit)
  63.   {
  64.     Wimp_Poll3(mask, &event, callafterflag);
  65.  
  66.     switch(event.type)
  67.     {
  68.       case event_NONZEROPOLLWORD:
  69.         Sound_SysBeep();
  70.         quit = TRUE;
  71.         break;
  72.  
  73.       case event_USERMESSAGE:
  74.       case event_USERMESSAGERECORDED:
  75.         if (event.data.message.header.action == 0)   /* quit from taskwindow */
  76.           quit = TRUE;
  77.         break;
  78.     }
  79.   }
  80.  
  81.   exit(0);
  82. }
  83.