Radek Štěrba, RASTER

TaskManager

Výpis všech maker a podprogramů knihovny TASKMNG.LIB

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