; *** Includes laden (Pfad individuell setzen!) ***

    INCDIR  maxon:include/
    INCLUDE exec/exec_lib.i
    INCLUDE exec/execbase.i
    INCLUDE exec/tasks.i

    ;--- Nur bei Start von WBench nötig: ----
    INCLUDE startup.asm

*************************************
*                RemTD              *
*-----------------------------------*
* Funktion: Schaltet Laufwerke ab   *
* (friert sie ein). Bei nochmaligem *
* Aufruf werden diese wieder        *
* aktiviert.                        *
* Eingabe : -------------           *
* Ausgabe : -------------           *
* Aufruf  :                         *
*  CLI/Shell: RemTD ohne Argumente  *
*  Workbench: Piktogramm            *
*************************************

Main
    lea     TaskName(pc),a5
    lea     TDBasis(pc),a4
    move.l  $4.w,a6
    jsr     _LVODisable(a6)   ;System einfrieren

.loop
    move.l  a5,a1
    jsr     _LVOFindTask(a6)  ;TD suchen
    tst.l   d0                ;gefunden?
    beq.s   .notd             ;Nein -> ab!

    move.l  d0,a1           ;Ja -> Basis nach a1
    cmp.b   #8,TC_STATE(a1) ;Task schon gefroren?
    beq.s   .makeactive     ;Ja -> aktivieren
                            ;Nein -> einfrieren
    moveq   #0,d7           ;Flag, TD in TaskWait-Liste
    move.b  #8,TC_STATE(A1) ;TS_FROZEN nach Statusflag

.remtd
    move.l  a1,(a4)+       ;in eigene Liste eintragen
    jsr     _LVORemove(a6) ;Basis aus System entfernen

    bra.s   .loop     ;Weiter, bis Ende...

    ;--- Task aktivieren ---

.makeactive
    moveq   #1,d7     ;Flag, TD in TaskReady-Liste
    move.b  #TS_READY,TC_STATE(a1) ;Ready als Status
    bra.s   .remtd    ;und Liste entfernen

.notd
    lea     TDBasis(pc),a4    ;Eigene Liste nach a4
    lea     TaskWait(a6),a3   ;TaskWait-Liste aus Exec
    tst     d7                ;Flag testen
    beq.s   .loopinit         ;False -> Liste übernehmen
    lea     TaskReady(a6),a3  ;sonst TaskReady-Liste

.loopinit
    tst.l   (a4)      ;Einträge vorhanden?
    beq.s   .norm     ;nein-> normal weiter

.loopins    move.l  (a4)+,a1 ;node holen
    move.l  a3,a0            ;Liste nach a0
    jsr     _LVOEnqueue(a6)  ;Node in Liste einfügen
    tst.l   (a4)             ;weitere Node vorhanden?
    beq.s   .norm            ;Nein -> normal weiter
    bra.s   .loopins         ;sonst Schleifenanfang

.norm
    jsr     _LVOEnable(a6)    ;System wecken
    suba.l  a1,a1             ;Eigenen Task suchen
    jsr     _LVOFindTask(a6)
    move.l  d0,a1             ;-> nach a1
    tst.l   d0                ;nicht gefunden
    beq.s   .weg              ;dann Ende

    moveq   #0,d0     ;Rescheduling durchführen
    move.b  LN_PRI(a1),d0      ;damit modifizierte Liste
    jsr     _LVOSetTaskPri(a6) ;anerkannt wird...

.weg
    moveq   #0,d0     ;Return-Flag setzen
    rts               ;und weg...

;*** Namen und Strukturen ***

TaskName
    dc.b    "trackdisk.device",0
    even

    ;--- genügend Platz für TD-Basen lassen ---
TDBasis
    dc.l    0,0,0,0,0,0 ;man weiß nie!

VersionsString:
    dc.b    "$VER: RemTD V0.5 (24.12.93)"
    even
