Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
7997 pavelyakov 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
}