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