home *** CD-ROM | disk | FTP | other *** search
- \ MULTASK.SEQ Multi tasking code for Forth.
-
- POSTFIX
-
- ONLY FORTH ALSO DEFINITIONS
-
- comment:
-
- The MultiTasker is loaded as an application on top of the
- regular Forth System. There is support for it in the nucleus
- in the form of USER variables and PAUSEs inserted inside of
- KEY EMIT and BLOCK. The Forth multitasking scheme is
- co-operative instead of interruptive. All IO operations cause
- a PAUSE to occur, and the multitasking loop looks around at
- all of the current task for something to do.
-
- comment;
-
- CODE (PAUSE) ( -- )
- IP PUSH RP PUSH UP #) BX MOV SP 0 [BX] MOV
- BX INC BX INC BX INC BX INC
- 0 [BX] BX ADD BX INC BX INC BX JMP C;
-
- CODE RESTART ( -- )
- -4 # AX MOV BX POP AX BX ADD BX UP #) MOV
- AX POP POPF
- 0 [BX] SP MOV
- RP POP IP POP NEXT C;
-
- HEX E9 CONSTANT INT#
-
- : LOCAL ( base addr -- addr' ) UP @ - + ;
- : @LINK ( -- addr ) LINK DUP @ + 2+ ;
- : !LINK ( addr -- ) LINK 2+ - LINK ! ;
- : SLEEP ( addr -- ) E990 SWAP ENTRY LOCAL ! ;
- : WAKE ( addr -- ) E9CD SWAP ENTRY LOCAL ! ;
- : STOP ( -- ) UP @ SLEEP PAUSE ;
- : SINGLE ( -- ) ['] PAUSE >BODY ['] PAUSE ! ;
-
- CODE MULTI ( -- )
- ' (PAUSE) @ # BX MOV BX ' PAUSE #) MOV
- ' RESTART @ # BX MOV
- DS AX MOV AX PUSH AX AX SUB AX DS MOV
- CS AX MOV AX INT# 4 * 2+ #) MOV BX INT# 4 * #) MOV
- AX POP AX DS MOV NEXT C;
-
- UP @ WAKE ENTRY !LINK DECIMAL
-
- : TASK: ( size -- )
- CREATE TOS HERE #USER @ CMOVE ( Copy the USER Area )
- @LINK UP @ -ROT HERE UP ! !LINK ( I point where he did)
- DUP HERE + DUP RP0 ! 100 - SP0 ! SWAP UP !
- HERE ENTRY LOCAL !LINK ( He points to me)
- HERE #USER @ + HERE DP LOCAL !
- HERE SLEEP ALLOT ;
-
- : SET-TASK ( ip task -- )
- DUP SP0 LOCAL @ ( Top of Stack )
- 2- ROT OVER ! ( Initial IP )
- 2- OVER RP0 LOCAL @ OVER ! ( Initial RP )
- SWAP TOS LOCAL ! ;
-
- : ACTIVATE ( task -- )
- R> OVER SET-TASK WAKE ;
-
- : BACKGROUND: ( -- )
- 400 TASK: HERE @LINK 2- ( get address of new task )
- SET-TASK !CSP ] ;
-
- comment:
-
- background: spooler 1 capacity show stop ;
-
- : spool-this spooler activate 3 15 [ shadow ] show stop ;
-
- variable counts
- background: counter begin pause 1 counts +! again ;
-
- MULTI COUNTER WAKE or COUNTER SLEEP SINGLE
-
- comment;
-
- ONLY FORTH ALSO DEFINITIONS
-