Moontalk server and client (provided by many parties)
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

39 linhas
1.0KB

  1. require util.4th
  2. 1024 constant MAX_EVENTS
  3. 0
  4. cell +field event.id
  5. cell +field event.data
  6. constant /EVENT
  7. 0 variable! current-event
  8. 0 variable! last-event
  9. MAX_EVENTS /EVENT * constant EVENTS_SIZE
  10. create events EVENTS_SIZE allot
  11. : (translate) ( index-u -- event-addr )
  12. ]] /EVENT * events + [[ ; IMMEDIATE
  13. : (wrap) ( index-u -- index-u )
  14. ]] MAX_EVENTS mod [[ ; IMMEDIATE
  15. : (read) ( addr -- data-u id-u )
  16. ]] dup event.data @ swap event.id @ [[ ; IMMEDIATE
  17. : (write) ( data-u id-u addr -- )
  18. ]] tuck event.id ! event.data ! [[ ; IMMEDIATE
  19. : events.has-item? ( -- flag )
  20. current-event @ last-event @ <> ;
  21. : events.enqueue ( data-u id-u -- )
  22. last-event @ dup 1+ dup >r current-event @ = abort" Queue is full."
  23. (translate) (write) r> (wrap) last-event ! ;
  24. : events.dequeue ( -- data-u id-u )
  25. events.has-item? invert abort" No events in queue."
  26. current-event @ dup (translate) (read)
  27. rot 1+ (wrap) current-event ! ;
  28. : events.clear ( -- )
  29. 0 current-event !
  30. 0 last-event !
  31. events EVENTS_SIZE erase ;
  32. events.clear