Screen 0 not modified 0 \\ Multitasker 11Nov86 1 2 Dieses File enthaelt den Multitasker des volksFORTHs. 3 Er ist ein Round-Robin-Multitasker, d.h. jede Task behaelt 4 die Kontrolle ueber den Prozessor solange, bis sie sie 5 ausdruecklich abgibt. 6 Hintergrundtasks im volksFORTH koennen durch Semaphore geordnet 7 auf den Massenspeicher und auf den Drucker zugreifen. 8 9 In Verbindung mit dem Printer-Interface ist es moeglich 10 Files im Hintergrund auszudrucken. (SPOOL) 11 12 13 14 15 Screen 1 not modified 0 \ Multitasker Loadscreen 27Jun86 20Nov87 1 2 Onlyforth 3 4 \needs multitask 1 +load 5 6 02 05 +thru \ Tasker 7 8 9 10 11 12 13 14 15 Screen 2 not modified 0 \ stop singletask multitask 28Aug86 20Nov87 1 2 Code stop UP lhld 0 ( nop ) M mvi 3 Label taskpause 4 IP push RP lhld H push UP lhld 6 D lxi D dad xchg 5 H L mov SP dad xchg E M mov H inx D M mov 6 UP lhld H inx pchl 7 end-code 8 9 : singletask [ ' pause @ ] Literal ['] pause ! ; 10 11 : multitask [ taskpause ] Literal ['] pause ! ; 12 13 14 15 Screen 3 not modified 0 \ pass activate 28Aug86 1 2 : pass ( n0 ... nr-1 Taddr r -- ) 3 BEGIN [ rot ( Trick !! ) ] 4 swap $F7 over c! \ awake Task ( rst 6 ) 5 r> -rot \ Stack: IP r addr 6 8 + >r \ s0 of Task 7 r@ 2+ @ swap \ Stack: IP r0 r 8 2+ 2* \ bytes on Taskstack incl. r0 & IP 9 r@ @ over - \ new SP 10 dup r> 2- ! \ into Ssave 11 swap bounds ?DO I ! 2 +LOOP ; restrict 12 13 : activate ( Taddr -- ) 14 0 [ -rot ( Trick !! ) ] REPEAT ; restrict 15 Screen 4 not modified 0 \ sleep wake taskerror 28Aug86 20Nov87 1 2 : sleep ( Taddr -- ) $00 ( nop ) swap c! ; 3 : wake ( Taddr -- ) $F7 ( rst 6 ) swap c! ; 4 5 | : taskerror ( string -- ) 6 standardi/o singletask ." Task error : " count type 7 multitask stop ; 8 9 10 11 12 13 14 15 Screen 5 not modified 0 \ Task 20Nov87 1 2 : Task ( rlen slen -- ) 3 0 Constant here 2- >r \ addr of task constant 4 here -rot \ here for Task dp 5 even allot even \ allot dictionary area 6 here r@ ! \ set task constant addr 7 up@ here $100 cmove \ init user area 8 here dup $C300 , \ nop-jmp opcode to sleep task 9 up@ 2+ dup @ , ! \ link task 10 r> , \ spare used for pointer to header 11 dup 6 - dup , , \ ssave and s0 12 2dup + , \ here + rlen = r0 13 rot , \ dp 14 under + dp ! 0 , \ allot rstack 15 ['] taskerror [ ' errorhandler >body c@ ] Literal rot + ! ; Screen 6 not modified 0 \ rendezvous 's tasks 27Jun86 20Nov87 1 2 : rendezvous ( semaphoraddr -- ) dup unlock pause lock ; 3 4 | : statesmart state @ IF [compile] Literal THEN ; 5 6 : 's ( Taddr -- adr.of.tasks.userarea ) 7 ' >body c@ + statesmart ; immediate 8 9 : tasks ( -- ) ." Main " cr up@ dup 2+ @ 10 BEGIN 2dup - WHILE dup 4+ @ body> >name .name 11 dup c@ 0= ( nop ) IF ." sleeping" THEN cr 12 2+ @ REPEAT 2drop ; 13 14 15