VolksForth/sources/Apple1/tasker.fb.src
2020-07-15 11:24:43 +02:00

171 lines
11 KiB
Plaintext

Screen 0 not modified
0 \ Multitasking Extension to volksFORTH cas 26jan06
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 1 not modified
0 \ Tasker Loadscreen
1
2 \NEEDS CODE abort( Assembler needed )
3 hex
4 1 5 +thru \ load Tasker
5 7 load \ Task-Demo
6 decimal
7
8
9
10
11
12
13
14
15
Screen 2 not modified
0 \ MULTITASKER BP 13.9.84 )
1
2 CODE STOP
3 SP 2DEC IP LDA SP X) STA IP 1+ LDA SP )Y STA
4 SP 2DEC RP LDA SP X) STA RP 1+ LDA SP )Y STA
5 6 # LDY SP LDA UP )Y STA INY SP 1+ LDA UP )Y STA
6 1 # LDY TYA CLC UP ADC W STA
7 TXA UP 1+ ADC W 1+ STA W 1- JMP END-CODE
8
9 | CREATE TASKPAUSE ASSEMBLER
10 2C # LDA UP X) STA ' STOP @ JMP END-CODE
11
12 : SINGLETASK [ ' PAUSE @ ] LITERAL ['] PAUSE ! ;
13
14 : MULTITASK TASKPAUSE ['] PAUSE ! ;
15
Screen 3 not modified
0 \ PASS ACTIVATE KS 8 MAY 84 )
1
2 : PASS ( N0 .. NR-1 TADR R -- )
3 BEGIN [ ROT ( TRICK ! ) ]
4 SWAP 02C OVER C! \ AWAKE TASK
5 R> -ROT \ IP R ADDR
6 8 + >R \ S0 OF TASK
7 R@ 2+ @ SWAP \ IP R0 R
8 2+ 2* \ BYTES ON TASKSTACK
9 \ INCL. R0 & IP
10 R@ @ OVER - \ NEW SP
11 DUP R> 2- ! \ INTO SSAVE
12 SWAP BOUNDS ?DO I ! 2 +LOOP ; RESTRICT
13
14
15
Screen 4 not modified
0 \
1
2 : ACTIVATE ( TADR --)
3 0 [ -ROT ( TRICK ! ) ] REPEAT ; -2 ALLOT RESTRICT
4
5 : SLEEP ( TADR --) 4C SWAP C! ; \ JMP-OPCODE
6
7 : WAKE ( TADR --) 2C SWAP C! ; \ BIT-OPCODE
8
9 | : TASKERROR ( STRING -)
10 STANDARDI/O SINGLETASK ." TASK ERROR : " COUNT TYPE
11 MULTITASK STOP ;
12
13
14
15
Screen 5 not modified
0 \ BUILDING A TASK BP 13.9.84 )
1
2 : TASK ( RLEN SLEN -- )
3 ALLOT \ STACK
4 HERE 00FF AND 0FE =
5 IF 1 ALLOT THEN \ 6502-ALIGN
6 UP@ HERE 100 CMOVE \ INIT USER AREA
7 HERE 04C C, \ JMP OPCODE TO SLEEP TASK
8 UP@ 1+ @ ,
9 DUP UP@ 1+ ! \ LINK TASK
10 3 ALLOT \ ALLOT JSR WAKE
11 DUP 6 - DUP , , \ SSAVE AND S0
12 2DUP + , \ HERE + RLEN = R0
13 UNDER + HERE - 2+ ALLOT ['] TASKERROR OVER
14 [ ' ERRORHANDLER >BODY C@ ] LITERAL + ! CONSTANT ;
15
Screen 6 not modified
0 \ MORE TASKS KS/BP 26APR85RE)
1
2 : RENDEZVOUS ( SEMAPHORADR -) DUP UNLOCK PAUSE LOCK ;
3
4 | : STATESMART STATE @ IF [COMPILE] LITERAL THEN ;
5
6 : 'S ( TADR - ADR.OF.TASKUSERVAR)
7 ' >BODY C@ + STATESMART ; IMMEDIATE
8
9 \ SYNTAX: 2 DEMOTASK 'S BASE ! \ MAKES DEMOTASK WORKING BINARY
10
11 : TASKS ( -) ." MAIN " CR UP@ DUP 1+ @
12 BEGIN 2DUP - WHILE
13 DUP [ ' R0 >BODY C@ ] LITERAL + @ 6 + NAME> >NAME .NAME
14 DUP C@ 04C = IF ." SLEEPING" THEN CR 1+ @ REPEAT 2DROP ;
15
Screen 7 not modified
0 \ TASKDEMO 27APR85RE)
1 : TASKMARK ;
2
3 VARIABLE COUNTER COUNTER OFF
4
5 100 100 TASK BACKGROUND
6
7 : >COUNT ( N -) BACKGROUND 1 PASS COUNTER !
8 BEGIN COUNTER @ DUP 1- COUNTER ! ?DUP
9 WHILE PAUSE 0 <# #S #> type REPEAT stop ;
10
11 : WAIT BACKGROUND SLEEP ;
12
13 : GO BACKGROUND WAKE ;
14
15
Screen 8 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 9 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15