URL
https://opencores.org/ocsvn/forwardcom/forwardcom/trunk
Subversion Repositories forwardcom
[/] [forwardcom/] [libraries/] [raise_event.as] - Rev 108
Compare with Previous | Blame | View Log
/********************************* raise_event ******************************** Author: Agner Fog* date created: 2018-03-23* Last modified: 2021-04-25* Version: 1.11* Project: ForwardCom library libc.li* Description: raise_event: find event handlers and call them* C declaration: int64_t raise_event(int64_t id_and_key, int64_t parameter1, const char * parameter2, ...)** Copyright 2018 GNU General Public License http://www.gnu.org/licenses*****************************************************************************/extern __event_table: ip // address of event tableextern __event_table_num: constant // size of event tableextern __ip_base: ip // reference pointcode section execute align = 4_raise_event function publicpush (r16, 22) // save registers r16 - r22int64 r16 = address([__event_table]) // address of event tableint32 r17 = __event_table_num // size of event tableint64 r18 = address([__ip_base]) // reference pointint64 r19 = r0 // save ID and keyint64 r20 = r1 // save function parametersint64 r21 = r2int64 r22 = r3// loop through event table// (note: this table is sorted. we may use binary search if the table is big)while (int32 r17 > 0) {int64 r0 = [r16+8] // read key and id from table entryif (int64 r0 == r19) {// matching record foundint64 r1 = r20 // function parameters are in r1, r2, r3int64 r2 = r21int64 r3 = r22int32 call_relative(r18, [r16]) // call relative function pointer from table, with r18 as reference pointif (int64 r0 == 0) {break} // disable further events with same ID if return value is 0}int64 r16 += 16 // next record in event tableint64 r17-- // decrement loop counter}pop (r16, 22) // restore registers r22 - r16return_raise_event endcode end
