SDL_systimer.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_systimer.c,v 1.1 2002/04/22 21:38:03 wmay Exp $";
  21. #endif
  22. /*
  23.  * TOS/MiNT timer driver
  24.  * based on vbl vector
  25.  *
  26.  * Patrice Mandin
  27.  */
  28. #include <stdio.h>
  29. #include <sys/time.h>
  30. #include <signal.h>
  31. #include <unistd.h>
  32. #include <string.h>
  33. #include <errno.h>
  34. #include <mint/osbind.h>
  35. #include <sysvars.h>
  36. #include "SDL_error.h"
  37. #include "SDL_timer.h"
  38. #include "SDL_timer_c.h"
  39. #include "SDL_thread.h"
  40. #include "SDL_vbltimer_s.h"
  41. /* The first ticks value of the application */
  42. static Uint32 start;
  43. static SDL_bool supervisor;
  44. void SDL_StartTicks(void)
  45. {
  46. void *oldpile;
  47. /* Set first ticks value */
  48. oldpile=(void *)Super(0);
  49. start=*((volatile long *)_hz_200);
  50. Super(oldpile);
  51. start *= 5; /* One _hz_200 tic is 5ms */
  52. }
  53. Uint32 SDL_GetTicks (void)
  54. {
  55. Uint32 now;
  56. void *oldpile;
  57. /* Check if we are in supervisor mode 
  58.    (this is the case when called from SDL_ThreadedTimerCheck,
  59.    which is called from RunTimer, running in the vbl vector)
  60. */
  61. if (!supervisor) {
  62. oldpile=(void *)Super(0);
  63. }
  64. now=*((volatile long *)_hz_200);
  65. if (!supervisor) {
  66. Super(oldpile);
  67. }
  68. return((now*5)-start);
  69. }
  70. void SDL_Delay (Uint32 ms)
  71. {
  72. Uint32 now;
  73. now = SDL_GetTicks();
  74. while ((SDL_GetTicks()-now)<ms){
  75. }
  76. }
  77. /* Data to handle a single periodic alarm */
  78. static SDL_bool timer_installed=SDL_FALSE;
  79. static void RunTimer(void)
  80. {
  81. supervisor=SDL_TRUE;
  82. SDL_ThreadedTimerCheck();
  83. supervisor=SDL_FALSE;
  84. }
  85. /* This is only called if the event thread is not running */
  86. int SDL_SYS_TimerInit(void)
  87. {
  88. void *oldpile;
  89. supervisor=SDL_FALSE;
  90. /* Install RunTimer in vbl vector */
  91. oldpile=(void *)Super(0);
  92. timer_installed = !SDL_AtariVblInstall(RunTimer);
  93. Super(oldpile);
  94. if (!timer_installed) {
  95. return(-1);
  96. }
  97. return(SDL_SetTimerThreaded(0));
  98. }
  99. void SDL_SYS_TimerQuit(void)
  100. {
  101. void *oldpile;
  102. if (timer_installed) {
  103. /* Uninstall RunTimer vbl vector */
  104. oldpile=(void *)Super(0);
  105. SDL_AtariVblUninstall(RunTimer);
  106. Super(oldpile);
  107. timer_installed = SDL_FALSE;
  108. }
  109. }
  110. int SDL_SYS_StartTimer(void)
  111. {
  112. SDL_SetError("Internal logic error: MiNT uses vbl timer");
  113. return(-1);
  114. }
  115. void SDL_SYS_StopTimer(void)
  116. {
  117. return;
  118. }