Moontalk server and client (provided by many parties)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
- require util.4th
-
- 1024 constant MAX_EVENTS
-
- 0
- cell +field event.id
- cell +field event.data
- constant /EVENT
-
- 0 variable! current-event
- 0 variable! last-event
-
- MAX_EVENTS /EVENT * constant EVENTS_SIZE
- create events EVENTS_SIZE allot
-
- : (translate) ( index-u -- event-addr )
- ]] /EVENT * events + [[ ; IMMEDIATE
- : (wrap) ( index-u -- index-u )
- ]] MAX_EVENTS mod [[ ; IMMEDIATE
- : (read) ( addr -- data-u id-u )
- ]] dup event.data @ swap event.id @ [[ ; IMMEDIATE
- : (write) ( data-u id-u addr -- )
- ]] tuck event.id ! event.data ! [[ ; IMMEDIATE
- : events.has-item? ( -- flag )
- current-event @ last-event @ <> ;
- : events.enqueue ( data-u id-u -- )
- last-event @ dup 1+ dup >r current-event @ = abort" Queue is full."
- (translate) (write) r> (wrap) last-event ! ;
- : events.dequeue ( -- data-u id-u )
- events.has-item? invert abort" No events in queue."
- current-event @ dup (translate) (read)
- rot 1+ (wrap) current-event ! ;
- : events.clear ( -- )
- 0 current-event !
- 0 last-event !
- events EVENTS_SIZE erase ;
-
- events.clear
|