Copyright Bill Muench All rights reserved.
Permission is granted for non-commercial use, provided this notice is included.
Contact Bill Muench concerning commercial use.

CR .( eForth multitasker extensions, tests and tools )
CR ( Copyright Bill Muench All rights reserved. )

( Bill Muench \ OntoLogic )
(             \ Santa Cruz  CA  95065 )

MARKER E4.TASK
BASE @ !CSP
DECIMAL

( multitask information exchange extension ================== )
( changed from original by Michael B. Montvelishsky )

: CHAN ( "name" -- ) ( -- a )
  VARIABLE [ 1 CELLS ] LITERAL ALLOT ;

: C> ( a -- n ) ( get data from a channel )
  >R ( save channel )
  BEGIN R@ R@ @ XOR ( channel empty ? )
  WHILE PAUSE ( yes, wait )
  REPEAT R@ CELL+ @  0 R> ! ( get data, flag empty )
;

: >C ( n a -- ) ( put data to a channel )
  >R ( save channel )
  BEGIN R@ @ ( channel full ? )
  WHILE PAUSE ( yes, do not overwrite )
  REPEAT R@ R> 2! ( put data, flag full )
;

( =========================================================== )

: BUFF ( n "name" -- ) ( -- a ) ( ONLY powers of 2 )
  CREATE 0 , ( in and out index )
  DUP 1 - , ALLOT ( mask and circular buffer )
;

: B> ( a -- n ) ( get data from the buffer )
  >R ( save buffer )
  R@ CHAR+ C@ ( out index )
  BEGIN DUP R@ C@ = ( buffer empty ? )
  WHILE PAUSE ( yes, wait )
  REPEAT DUP R@ CELL+ CELL+ + @ ( get data )
  SWAP CELL+ R@ CELL+ C@ AND
  R> CHAR+ C! ( update out index )
;

: >B ( n a -- ) ( put data to the buffer )
  >R ( save buffer )
  R@ C@ ( in index )
  DUP CELL+ R@ CELL+ C@ AND ( next in index )
  BEGIN DUP R@ CHAR+ C@ = ( buffer full ? )
  WHILE PAUSE ( yes, wait )
  REPEAT R@ C! ( update in index )
  R> CELL+ CELL+ + ! ( put data )
;

( examples ================================================== )

HEX

0BB CONSTANT FILLER

DECIMAL

VARIABLE JJ ( shared resource semaphore )
  0 JJ ! ( force release )

( =========================================================== )

0  16 CELLS  DUP HAT J1

J1 2@ SWAP OVER - FILLER FILL ( debug tracer )

J1 BUILD

VARIABLE V1

: J1GO ( -- )
  0 V1 !
  J1 ACTIVATE
  BEGIN
    JJ GET
    1 V1 +!
    JJ RELEASE
  AGAIN ;

( =========================================================== )

0  16 CELLS  DUP HAT J2

J2 2@ SWAP OVER - FILLER FILL ( debug tracer )

J2 BUILD

VARIABLE V2

: J2GO ( -- )
  0 V2 !
  J2 ACTIVATE
  BEGIN  PAUSE  1 V2 +!
  AGAIN ;

( =========================================================== )

0  16 CELLS  DUP HAT J3

J3 2@ SWAP OVER - FILLER FILL ( debug tracer )

J3 BUILD

VARIABLE V3

: J3GO ( -- )
  0 V3 !
  J3 ACTIVATE  1 2 3 4
  BEGIN  PAUSE  1 V3 +!
  AGAIN ;

: P ( -- ) V1 ?  V2 ?  V3 ? ;

( tools ===================================================== )

: .T ( tid -- )
  >R
\  R@ STATUS 'S DUP @ ( save STATUS )
\  R@ SLEEP
  R> 2@ SWAP OVER - DUMP
\  SWAP ! ( restore status )
;

: TASKS ( -- )
  BASE @ DECIMAL  STATUS DUP
  BEGIN
    CR CELL+ @ DUP >R ( STATUS )
    DUP CELL- CELL- 2@ ( tos tid )
    DUP CELL- CELL- NAMED? .ID SPACE
    R> @ WAKE XOR IF ." PASS" ELSE ." WAKE" THEN
    CELL+ @ SWAP - 1 CELLS / ."  depth=" 0 .R
    2DUP = NUF? OR
  UNTIL 2DROP BASE ! ;

( =========================================================== )

?CSP BASE !

FROM CON