\ Copyright 2021 Bradley D. Nelson 
\ 
\ Licensed under the Apache License, Version 2.0 (the "License"); 
\ you may not use this file except in compliance with the License. 
\ You may obtain a copy of the License at 
\ 
\     http://www.apache.org/licenses/LICENSE-2.0 
\ 
\ Unless required by applicable law or agreed to in writing, software 
\ distributed under the License is distributed on an "AS IS" BASIS, 
\ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
\ See the License for the specific language governing permissions and 
\ limitations under the License. 
 
( Cooperative Tasks ) 
 
vocabulary tasks   tasks definitions 
 
variable task-list 
 
forth definitions tasks also internals 
 
: pause 
  rp@ sp@ task-list @ cell+ ! 
  task-list @ @ task-list ! 
  task-list @ cell+ @ sp! rp! 
; 
 
: task ( xt dsz rsz "name" ) 
   create here >r 0 , 0 , ( link, sp ) 
   swap here cell+ r@ cell+ ! cells allot 
   here r@ cell+ @ ! cells allot 
   dup 0= if drop else 
     here r@ cell+ @ @ ! ( set rp to point here ) 
     , postpone pause ['] branch , here 3 cells - , 
   then rdrop ; 
 
: start-task ( t -- ) 
   task-list @ if 
     task-list @ @ over ! 
     task-list @ ! 
   else 
     dup task-list ! 
     dup ! 
   then 
; 
 
DEFINED? ms-ticks [IF] 
  : ms ( n -- ) ms-ticks >r begin pause ms-ticks r@ - over >= until rdrop drop ; 
[THEN] 
 
tasks definitions 
0 0 0 task main-task   main-task start-task 
forth definitions 
 

Legal: site web personnel sans commerce / personal site without seling