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 | }=time) |