Subversion Repositories Kolibri OS

Rev

Rev 8042 | Details | Compare with Previous | Last modification | View Log | RSS feed

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