TASKMANAGER param1
Makro, které je nutno umístit na začátek vlastního programu. Zajistí přístupnost sady podprogramů pro řízení multitaskingu. Parametr "param1" udává maximální počet rutin pro souběžné zpracování (rozmezí 1 až 16).
JSR INITTM
(Init TaskManager)
Podprogram, který inicializuje evidenci rutin. Nemá žádné parametry. Vlastní vnitřní rutina TaskManageru běží ve VBI (VVBLKD - viz. dvojice adres $224,$225 a rutina SETVBV) a zajišťuje běh dalších rutin v tomtéž přerušení. Z tohoto důvodu není možné v dalších částech programu používat nastavování VBI přerušení (došlo by k vyřazení funkcí TaskManageru). TaskManager nepoužívá žádné buňky v nulté stránce, takže je možné je libovolně využívat.
JSR STOPTM
(Stop TaskManager)
Podprogram, který zastaví běh TaskManageru a tím i všech rutin, které pod ním byly spuštěny.
JSR RUNTASK
(Run Task)
Spuštění rutiny pro souběžné zpracování.
Parametry:
A (akumulátor) ..číslo, pod kterým má být tato rutina evidována. Pokud bude použito vícekrát stejné číslo rutiny, běžet bude vždy jen poslední z nich. (Lze zadávat hodnoty z rozmezí 0 až "číslo dané u makra"-1.)
X (x-registr) ..dolní byte adresy počátku rutiny.
Y (y-registr) ..horní byte adresy počátku rutiny.
JSR KILLTASK
(Kill Task)
Vypnutí libovolné rutiny běžící pod TaskManagerem.
Parametry:
A (akumulátor) ..číslo, pod kterým byla příslušná rutina spouštěna pomocí procedury RUNTASK.
JSR SLPTASK
(Sleep Task)
Podprogram, který MUSÍ být použit uvnitř rutin běžících pod TaskManagerem. Mezi jednotlivými voláními tohoto podprogramu nesmí být činnost přesahující cca 20tisíc strojových cyklů. (Tento limit platí pro součet "strojocyklových" náročností všech rutin současně běžících pod TM.)
Dalším omezením je nutnost nemít před odskokem do tohoto podprogramu uložena žádná data v systémovém zásobníku (stacku). Protože se do tohoto zásobníku ukládají i návratové adresy při použití instrukce JSR, nemůže být volání JSR SLPTASK obsaženo uvnitř nějakého podprogramu.
Parametry:
A (akumulátor) ..číslo udávající dobu (počet padesátin sekundy), na kterou se rutina "vzdává" procesoru (a tedy i svého provádění).
Poznámka:
Obsahy registrů A, X i Y jsou po návratu z SLPTASK zachovány ve stejném stavu jako před voláním.
Příklady:
Lze provést:
LOOP JSR podpr1 JSR podpr2 LDA #1 JSR SLPTASK JMP LOOP Nesmí být použito: LOOP JSR PP1 JMP LOOP PP1 LDA #1 JSR SLPTASK RTS Ani toto nelze: LOOP LDA adr1 PHA LDA #1 JSR SLPTASK PLA STA adr2 JMP LOOP
JMP ENDTASK
Rutina (pozor, volá se pomocí JMP a ne JSR!), kterou je možné použít uvnitř rutiny běžící pod TM. Provede regulerní ukončení dané multitaskingové rutiny.
JSR GETTASKID
Podprogram, který lze použít uvnitř rutiny běžící pod TM. Po návratu se v registru A (akumulátoru) objeví identifikační číslo, pod kterým je tato rutina evidována v TaskManageru (pod kterým byla spuštěna).
Následující příklad ukazuje souběžné spouštění 3 rutin. Každou z nich lze samostatně rozběhnout klávesami 1,2,3 a samostatně zastavit klávesami 4,5,6:
;MULTI2.MAC
;Vyrobil Radek Sterba
;RASTER 1996
.OPT NO LIST
*= $5000
;
.INCLUDE #D:TASKMNG.LIB
;
TASKMANAGER 4
;
START
JSR INITTM
LDY #0
TYA
NA1 STA (88),Y
INY
CPY #120
BNE NA1
;
LOOP
LDA #255
STA 764
LO2
LDA 764
CMP #255
BEQ LO2
CMP #31 ;KOD PRO KL.1
BNE LO3
LDA #0
LDX #RUT1
JSR RUNTASK
JMP LOOP
LO3
CMP #30 ;KOD PRO KL.2
BNE LO4
LDA #1
LDX #RUT2
JSR RUNTASK
JMP LOOP
LO4
CMP #26 ;KOD PRO KL.3
BNE LO5
LDA #2
LDX #RUT3
JSR RUNTASK
JMP LOOP
LO5
CMP #24 ;KOD PRO KL.4
BNE LO6
LDA #0
JSR KILLTASK
JMP LOOP
LO6
CMP #29 ;KOD PRO KL.5
BNE LO7
LDA #1
JSR KILLTASK
JMP LOOP
LO7
CMP #27 ;KOD PRO KL.6
BNE LO8
LDA #2
JSR KILLTASK
JMP LOOP
LO8
JMP LOOP
;
RUT1
LDY #0
R1A LDA TX1,Y
STA (88),Y
INY
CPY #8
BNE R1A
LDY #10
LDX #0
R1B TXA
STA (88),Y
LDA #10
JSR SLPTASK
INX
JMP R1B
TX1 .SBYTE "Rutina 1"
;
RUT2
LDY #40
LDX #0
R2A LDA TX2,X
STA (88),Y
INY
INX
CPX #8
BNE R2A
LDY #50
LDX #0
R2B TXA
STA (88),Y
LDA #25
JSR SLPTASK
INX
JMP R2B
TX2 .SBYTE "Rutina 2"
;
RUT3
LDY #80
LDX #0
R3A LDA TX3,X
STA (88),Y
INY
INX
CPX #8
BNE R3A
LDY #90
LDX #0
R3B TXA
STA (88),Y
LDA #2
JSR SLPTASK
DEX
CPX#0
BNE R3B
JMP ENDTASK
TX3 .SBYTE "Rutina 3"
;
*=$2E0
.WORD START