( toolkit2 )

: FM/MOD ( d1 n1 -- n2 n3 )
   DUP 0< IF -1 >R ABS ELSE 0 >R THEN -ROT
   DUP 0< IF -1 >R DNEGATE ELSE 0 >R THEN ROT 
   DUP 2OVER ROT
   UM/MOD
   R> R@ XOR IF NEGATE OVER 
                 IF 1- NIP DUP>R ABS UM* 2SWAP D- D>S R>
                 ELSE >R NIP NIP NIP R> THEN
             ELSE >R NIP NIP NIP R> THEN
   SWAP R> IF NEGATE THEN SWAP 
;

: BUILD-TASK ( tid -- )
   TLS @ SWAP NEXTTASK @ >R
   USER-OFFS @ DUP ALLOCATE THROW
   DUP ROT ERASE
   2DUP SWAP ! TLS ! 
   TO TASK  SET-STOP 
   \ insert the task into linked list
   TASK OVER 12 + ! \ prev
   R> NEXTTASK !    \  next
   \ allocate stacks
   >R R0 TASK S0 OVER
   R> TLS !
   CELL+ W@ DUP ALLOCATE THROW + CELL- SWAP !
   CELL+ 2+ W@ DUP ALLOCATE THROW + CELL- SWAP !
;

api: MemPtrHeapID
api: MemHeapCompact
api: MemHeapFreeBytes

: FreeBytes  ( -- u1 u2 )
   0 >abs 0x7FFE -
   MemPtrHeapID DUP
   MemHeapCompact DROP
   RVAR RVAR MemHeapFreeBytes DROP
   R> R>
;

: printID ( type -- )
   dup 24 rshift emit
   dup 16 rshift 0xff and emit
   dup 8 rshift 0xff and emit
   0xff and emit space
;
