1 |
108 |
Agner |
/********************************* raise_event *******************************
|
2 |
|
|
* Author: Agner Fog
|
3 |
|
|
* date created: 2018-03-23
|
4 |
|
|
* Last modified: 2021-04-25
|
5 |
|
|
* Version: 1.11
|
6 |
|
|
* Project: ForwardCom library libc.li
|
7 |
|
|
* Description: raise_event: find event handlers and call them
|
8 |
|
|
* C declaration: int64_t raise_event(int64_t id_and_key, int64_t parameter1, const char * parameter2, ...)
|
9 |
|
|
*
|
10 |
|
|
* Copyright 2018 GNU General Public License http://www.gnu.org/licenses
|
11 |
|
|
*****************************************************************************/
|
12 |
|
|
|
13 |
|
|
extern __event_table: ip // address of event table
|
14 |
|
|
extern __event_table_num: constant // size of event table
|
15 |
|
|
extern __ip_base: ip // reference point
|
16 |
|
|
|
17 |
|
|
code section execute align = 4
|
18 |
|
|
|
19 |
|
|
_raise_event function public
|
20 |
|
|
push (r16, 22) // save registers r16 - r22
|
21 |
|
|
int64 r16 = address([__event_table]) // address of event table
|
22 |
|
|
int32 r17 = __event_table_num // size of event table
|
23 |
|
|
int64 r18 = address([__ip_base]) // reference point
|
24 |
|
|
int64 r19 = r0 // save ID and key
|
25 |
|
|
int64 r20 = r1 // save function parameters
|
26 |
|
|
int64 r21 = r2
|
27 |
|
|
int64 r22 = r3
|
28 |
|
|
|
29 |
|
|
// loop through event table
|
30 |
|
|
// (note: this table is sorted. we may use binary search if the table is big)
|
31 |
|
|
while (int32 r17 > 0) {
|
32 |
|
|
int64 r0 = [r16+8] // read key and id from table entry
|
33 |
|
|
if (int64 r0 == r19) {
|
34 |
|
|
// matching record found
|
35 |
|
|
int64 r1 = r20 // function parameters are in r1, r2, r3
|
36 |
|
|
int64 r2 = r21
|
37 |
|
|
int64 r3 = r22
|
38 |
|
|
int32 call_relative(r18, [r16]) // call relative function pointer from table, with r18 as reference point
|
39 |
|
|
if (int64 r0 == 0) {break} // disable further events with same ID if return value is 0
|
40 |
|
|
}
|
41 |
|
|
int64 r16 += 16 // next record in event table
|
42 |
|
|
int64 r17-- // decrement loop counter
|
43 |
|
|
}
|
44 |
|
|
pop (r16, 22) // restore registers r22 - r16
|
45 |
|
|
return
|
46 |
|
|
|
47 |
|
|
_raise_event end
|
48 |
|
|
|
49 |
|
|
code end
|