Scr#1
\ MULTITASKING ROUTINES 1

CODE SWITCH RPTR LDHL H PUSH
 D PUSH H CLR SP ADDP EXDE UPTR
 LDHL H DEC D M LD H DEC E M LD
H DEC BEGIN H DEC M D LD H DEC M
 E LD EXDE M A LD A OR Z UNTIL
H INC M E LD H INC  M D LD H INC
 UPTR STHL  EXDE LDSP   D POP
H POP RPTR  STHL JPIX ;C

27028 CONSTANT UPTR

VARIABLE TASK-LINK
VARIABLE FIRST-TASK

HEX
: TASK: CREATE HERE 243 + ,
  ( EERSTE ADRES IP)
  TASK-LINK @ ,
  HERE TASK-LINK !
  ( LINK NAAR VORIGE TAAK)
  HERE FIRST-TASK @ !
  ( MAAK CIRKEL ROND)
  1 C, 0 ,
  ( NOG NIET STARTEN&RUIMTE SP)
  UPTR @ HERE 3C CMOVE
  HERE 23C + HERE 0E + ! HERE
  13C + HERE 10 + ! 23C ALLOT
  ( USER-VARIABELEN+STACK)
  SMUDGE ] CURRENT @ CONTEXT !
  !CSP -->

Scr#2
\ MULTITASKING ROUTINES 2
  DOES> DUP 15 + @ 4 -
  ( STACKPOINTER)
  2DUP SWAP 5 + !
  2DUP SWAP @ SWAP !
  ( IP OP STACK)
  OVER 17 + @ SWAP 2+ !
  ( RP OP STACK)
  0 SWAP 4 + C! ( RUNNABLE) ;

: TERMINATE 2 UPTR @ 3 - C!
  SWITCH ;
: SLEEP     3 UPTR @ 3 - C!
  SWITCH ;
: STOP 4 SWAP 7 + C! ;
: START 0 SWAP 7 + C! ;

: ;TASK COMPILE TERMINATE
  ?CSP SMUDGE [COMPILE] [ ;
  IMMEDIATE


 TASK: MTSK                CR ."
 Multi-tasking operating system"
 BEGIN CR &> EMIT QUERY
 INTERPRET STATE @ 0= IF ." Ok"
 THEN 0 UNTIL ;TASK

' MTSK 5 + FIRST-TASK !
' MTSK 7 + TASK-LINK !
TASK-LINK @ FIRST-TASK @ !
-->

Scr#3
\ MULTI-TASKING ROUTINES 3

CODE (START) ' SWITCH H LDP#
 (WAIT) STHL FIRST-TASK @ 5 +
 H LDP# UPTR STHL H DEC M D LD
 H DEC M E LD EXDE LDSP D POP
 H POP RPTR STHL JPIX ;C
: STARTUP MTSK (START) ;

  DECIMAL
: TLIST UPTR @ DUP 27039 = CR IF
  ." Multitasking not active"
  ELSE DUP 10 - >NAME ID. 6 EMIT
  ." Active" BEGIN 5 - @ 3 +
  DUP UPTR @ - WHILE CR DUP
 10 - >NAME ID. 6 EMIT DUP 3 -
 C@ DUP 0 = IF ." Runnable" THEN
  DUP 1 = IF ." New"      THEN
  DUP 2 = IF ." Terminated" THEN
  DUP 3 = IF ." Sleeping" THEN
      4 = IF ." Stopped" THEN
   REPEAT THEN DROP  ;

