Screen 0 not modified     
 0 \\                    *** Multitasker ***             bp 12oct86
 1                                                                 
 2 Dieses File enth„lt die Worte fr das Multitasking.             
 3                                                                 
 4 Mit  TASK  werden Tasks eingerichtet. Jede Task hat ihren eige- 
 5  nen Daten- und Returnstack, deren Gr”že beim Einrichten der    
 6  Task angegeben werden muž.                                     
 7                                                                 
 8 Mit  MULTITASK  wird der Tasker eingeschaltet, mit  SINGLETASK  
 9  abgeschaltet. Mit  TASKS  kann man die Tasks im System und     
10  ihren Zustand anzeigen.                                        
11                                                                 
12 N„heres zur Funktionsweise des Taskers findet man im Handbuch,  
13  ebenso wie ein ausfhrliches Glossar !                         
14                                                                 
15                                                                 
Screen 1 not modified     
 0 \ Multitasker Loadscreen                               22nov86bp
 1                                                                 
 2 Onlyforth                                                       
 3                                                                 
 4 \needs Code        2 loadfrom assemble.scr                      
 5 \needs multitask   1 +load                                      
 6                                                                 
 7 02 05 +thru    \ Tasker                                         
 8    06 +load    \ Spooler                                        
 9                                                                 
10                                                                 
11                                                                 
12                                                                 
13                                                                 
14                                                                 
15                                                                 
Screen 2 not modified     
 0 \ stop singletask multitask                            14sep86we
 1                                                                 
 2 Code stop                                                       
 3   .l FP IP suba   .w IP SP -) move                              
 4   .l FP RP suba   .w RP SP -) move                              
 5      UP R#) D6 move   D6 reg) A0 lea                            
 6   .l FP SP suba   .w SP 8 A0 D) move                            
 7      2 A0 D) D6 move  D6 reg) jmp  end-code                     
 8                                                                 
 9 Label taskpause                                                 
10     UP R#) D6 move   D6 reg) A0 lea   $4E43 # A0 ) move         
11     Forth ' stop @ Assembler bra  end-code                      
12                                                                 
13 : singletask   [ ' pause @ ] Literal  ['] pause ! ;             
14                                                                 
15 : multitask    taskpause  ['] pause ! ;                         
Screen 3 not modified     
 0 \ pass activate                                       bp 12oct86
 1                                                                 
 2 | : (pass   ( n0 ... nm-1 Taskaddr m -- )                       
 3    rdrop  swap            \ delete IP of ACTIVATE or PASS       
 4    $4E43 over !           \ awake Task                          
 5    r> -rot                \ get the IP;  Stack: IP m Taskaddr   
 6    &10 + >r               \ push s0 of Task                     
 7    r@ 2+ @ swap           \ Stack-Top:  IP r0 m                 
 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  ;                            
12                                                                 
13 : activate   ( Taddr -- )               0 (pass ;  restrict     
14                                                                 
15 : pass       ( n0 ... nm-1 Taskaddr m )   (pass ;  restrict     
Screen 4 not modified     
 0 \ sleep wake taskerror                                bp 12oct86
 1                                                                 
 2 : sleep   ( Taddr -- )    $3C3C swap ! ; \ # D6 move opcode     
 3 : wake    ( Taddr -- )    $4E43 swap ! ; \ Trap 3 opcode        
 4                                                                 
 5 | : taskerror   ( string -- )                                   
 6      standardi/o  singletask  bell                              
 7      at?  &24 0 at  ." Task error : "  rot count type   at      
 8      multitask stop ;                                           
 9                                                                 
10                                                                 
11                                                                 
12                                                                 
13                                                                 
14                                                                 
15                                                                 
Screen 5 not modified     
 0 \ Task                                                 14sep86we
 1                                                                 
 2 : Task   ( rlen slen -- )                                       
 3    2 arguments                                                  
 4    0 Constant  here >r               \ Task-dp                  
 5    even dup  r@ +  r@ 2- !  allot  even  \ 68000 align          
 6    up@ here 100 cmove               \ init user area            
 7    here   $3C3C , up@ 2+ @ ,        \ JMP opcode to sleep task  
 8    $4EF3 , $6800 ,                                              
 9    dup  up@ 2+ !                    \ link task                 
10    dup  6 -   dup , ,               \ ssave and s0              
11    2dup + ,                         \ here + rlen = r0          
12    r@ ,                             \ dp                        
13    under  + here - allot  0 ,                                   
14    ['] taskerror  swap  [ ' errorhandler >body c@ ] Literal + ! 
15    r> 2- 2- , ;                                                 
Screen 6 not modified     
 0 \ rendezvous 's tasks                                  22nov86bp
 1                                                                 
 2 : rendezvous   ( semaphoraddr -- )                              
 3    dup unlock  pause  lock ;                                    
 4                                                                 
 5 | : statesmart       state @ IF  [compile] Literal  THEN ;      
 6                                                                 
 7 : 's   ( Taddr -- adr )     \ adr is adress of the foll. uservar
 8    ' >body c@ +  statesmart ;  immediate                        
 9                                                                 
10 : tasks   ( -- )                                                
11    cr  ." Main "    up@ dup 2+ @                                
12    BEGIN  2dup -  WHILE cr dup  [ ' r0 >body c@ ] Literal  +  @ 
13                         2+ @ >name .name                        
14                         dup @  $3C3C = IF  ." sleeping"  THEN   
15            2+  @  REPEAT  2drop ;                               
Screen 7 not modified     
 0 \ Printerspool                                         21oct86we
 1                                                                 
 2 $100 $200 Task spooler                                          
 3                                                                 
 4 : spool'  ( -- )   \ reads word                                 
 5    '  isfile@  offset @  base @   spooler  depth 1-  6 min  pass
 6    base !  offset !  isfile !  execute                          
 7    true abort" SPOOL' ready for next job!" stop ;               
 8                                                                 
 9 \\ syntax:                                                      
10 spool' listing                                                  
11 spool' printall                                                 
12 from to spool' pthru                                            
13 from to spool' document                                         
14                                                                 
15                                                                 
