/* TIMERS PaulCodeman */
/**
void Timers::revise(void) -> This function revising all timers.
void Timers::getTime(void) -> This function updating current time for timers.
dword set(dword,dword,byte); -> This function seting timer for function Timers::revise.
dword clear(dword); -> This function clearning anything timer.
---------
The functions setTimeout,setInterval,clearInterval,clearTimeout implementing functional JavaScript.
*/
#define offsetSizeTimers 4*3+1
#define defaultMaxTimers 1000
:struct Timers
{
dword alloc;
dword count;
dword size;
void revise(void);
void getTime(void);
dword set(dword,dword,byte);
dword clear(dword);
};
void Timers::getTime(void)
{
EAX = 26;
EBX = 9;
$int 0x40
}
void Timers::revise(void)
{
dword position = 0;
dword i = 0;
IF (!alloc) RETURN;
getTime();
i = count;
position = alloc;
WHILE(i)
{
IF (DSDWORD[position])
{
IF
(DSDWORD
[position
+4]<=time)
{
$call DSDWORD[position];
IF
(DSBYTE
[position
+12]) DSDWORD
[position
+4] = time+DSDWORD
[position
+8];
ELSE
{
DSDWORD[position] = 0;
count--;
}
}
i--;
}
position+=offsetSizeTimers;
}
}
dword Timers::set(dword function, newTime, byte repeat)
{
dword position = 0;
dword i = 0;
IF (!alloc)
{
size = defaultMaxTimers*offsetSizeTimers;
}
i = count;
position = alloc;
WHILE(i)
{
IF (!DSDWORD[position]) BREAK;
position+=offsetSizeTimers;
i--;
}
count++;
getTime();
DSDWORD[position] = function;
DSDWORD
[position
+4] = time+newTime
;
DSBYTE[position+8] = newTime;
DSBYTE[position+12] = repeat;
RETURN position;
}
dword Timers::clear(dword id)
{
IF (!alloc) || (!id) || (!DSDWORD[id]) RETURN 0;
count--;
DSDWORD[id] = 0;
RETURN id;
}
// Analogs JS Functions
:Timers Time = {0};
inline dword setTimeout
(dword
function, time)
{
RETURN Time.
set(function, time, 0);
}
inline dword setInterval
(dword
function, time)
{
RETURN Time.
set(function, time, 1);
}
inline dword clearTimeout(dword id)
{
RETURN Time.clear(id);
}
inline dword clearInterval(dword id)
{
RETURN Time.clear(id);
}