Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /* TIMERS PaulCodeman */
  2.  
  3. #define offsetSizeTimers 4*3+1
  4. #define defaultMaxTimers 1000
  5. :struct Timers
  6. {
  7.         dword time;
  8.     dword alloc;
  9.     dword count;
  10.     dword size;
  11.     void watch(void);
  12.     void getTime();
  13.     dword set(dword,dword,byte);
  14.     dword clear(dword);
  15. };
  16. void Timers::getTime(void)
  17. {
  18.         EAX = 26;
  19.         EBX = 9;
  20.         $int 0x40
  21.         time = EAX;
  22. }
  23. void Timers::watch(void)
  24. {
  25.         dword position = 0;
  26.         dword i = 0;
  27.         IF (!alloc) RETURN;
  28.         getTime();
  29.         i = count;
  30.         position = alloc;
  31.         WHILE(i)
  32.         {
  33.                 IF (DSDWORD[position])
  34.                 {
  35.                         IF (DSDWORD[position+4]<=time)
  36.                         {
  37.                                 $call DSDWORD[position];
  38.                                 IF (DSBYTE[position+12]) DSDWORD[position+4] = time+DSDWORD[position+8];
  39.                                 ELSE
  40.                                 {
  41.                                         DSDWORD[position] = 0;
  42.                                         count--;
  43.                                 }
  44.                         }
  45.                         i--;
  46.                 }
  47.                 position+=offsetSizeTimers;
  48.         }
  49. }
  50. dword Timers::set(dword function, newTime, byte repeat)
  51. {
  52.         dword position = 0;
  53.         dword i = 0;
  54.         IF (!alloc)
  55.         {
  56.                 size = defaultMaxTimers*offsetSizeTimers;
  57.                 alloc = malloc(size);
  58.         }
  59.         i = count;
  60.         position = alloc;
  61.         WHILE(i)
  62.         {
  63.                 IF (!DSDWORD[position]) BREAK;
  64.                 position+=offsetSizeTimers;
  65.                 i--;
  66.         }
  67.         count++;
  68.         getTime();
  69.         DSDWORD[position] = function;
  70.         DSDWORD[position+4] = time+newTime;
  71.         DSBYTE[position+8] = newTime;
  72.         DSBYTE[position+12] = repeat;
  73.         RETURN position;
  74. }
  75. dword Timers::clear(dword id)
  76. {
  77.         IF (!alloc) || (!DSDWORD[id]) RETURN 0;
  78.         count--;
  79.         DSDWORD[id] = 0;
  80.         RETURN id;
  81. }
  82.  
  83. // Analogs JS Functions
  84. :Timers Time = {0};
  85. inline dword setTimeout(dword function, time)
  86. {
  87.         RETURN Time.set(function, time, 0);
  88. }
  89. inline dword setInterval(dword function, time)
  90. {
  91.         RETURN Time.set(function, time, 1);
  92. }
  93. inline dword clearTimeout(dword id)
  94. {
  95.         RETURN Time.clear(id);
  96. }
  97. inline dword clearInterval(dword id)
  98. {
  99.         RETURN Time.clear(id);
  100. }
  101.