MODULE TaskLister;

(*$R-*)
(* Diese Compileroption muß gesetzt werden da sonst ein Fehler auftritt *)

FROM InOut 	IMPORT WriteLn,WriteString,WriteInt,ReadInt,WriteHex;
FROM Exec  	IMPORT execBase,TaskPtr,Disable,Enable,UByte,SetTaskPri;
FROM SYSTEM 	IMPORT CAST,ADR,INLINE,BYTE,REG,ADDRESS;

TYPE TaskArray = ARRAY [0..100] OF TaskPtr;
     StringPtr = POINTER TO ARRAY [0..80] OF CHAR;

VAR Task	 : TaskArray;
    i,j,k,l,merk : INTEGER;
    Byte	 : UByte;
    Ausgabe 	 : StringPtr;
    
(*$E-*) (* Muß gesetzt werden *)
PROCEDURE SechzehnAcht ( A{0} : INTEGER; i{8} : ADDRESS );
(* Aus einer 16 Bit-Zahl eine 8 Bit-Zahl machen *) 

BEGIN
  INLINE ( 4224, 20085, 0) 
END SechzehnAcht; 

(*$E-*) (* Muß gesetzt werden *)
PROCEDURE AchtSechzehn ( I{8} : ADDRESS ) : INTEGER;
(* Aus einer 8 Bit-Zahl eine 16 Bit-Zahl machen *)

BEGIN
  INLINE ( 17024, 4112, 18560, 20085, 0); 
  RETURN REG(0)
END AchtSechzehn; 

BEGIN
 j := 0; l := 0;
 Disable(); (* Keine Interrupts & kein Task-Switching *)
    Task[0] := CAST (TaskPtr,execBase^.taskReady.head);
    WHILE Task[j]^.node.succ # NIL DO
      Task[j+1] := CAST(TaskPtr,Task[j]^.node.succ);
      INC (j)
    END;

    Task[j] := CAST(TaskPtr,execBase^.taskWait.head);
    WHILE Task[j]^.node.succ # NIL DO
      Task[j+1] := CAST(TaskPtr,Task[j]^.node.succ);
      INC (j); INC (l)
    END;
  Enable(); (* Ab hier wieder Interrupts & Task-Switching *)

 WriteString  ("Nr.  Pri    Adresse      Sig. Wait       Name");
 WriteLn; WriteLn; WriteString ("Raedy Tasks"); WriteLn;
 FOR k := 0 TO j-1 DO
    IF k = j - l  THEN
    WriteLn; WriteString ("Wait Tasks"); WriteLn
    END;
    WriteInt (k+1,-6);
    merk := AchtSechzehn(ADR(Task[k]^.node.pri));
    (* Aus speichertechnischen Gründen notwending *)
    WriteInt (merk,-8);
    WriteHex (CAST(LONGINT,Task[k]),7); WriteString ("	");
    WriteHex (CAST(LONGINT,Task[k]^.sigWait),8); WriteString ("	 ");
    Ausgabe := Task[k]^.node.name;  
    WriteString(Ausgabe^); WriteLn;
 END;  WriteLn;
 
 REPEAT
   WriteString
      ("Welcher Task soll in seiner Priorität verändert werden ? ");
   ReadInt(i); WriteLn
 UNTIL (i>=0) AND (i<=j);  
 REPEAT
   WriteString ("Welche Priorität soll der Task haben ? ");
   ReadInt(k); WriteLn
 UNTIL (k> -127 ) AND (k<127);  
 IF i # 0 THEN
   SechzehnAcht(k,ADR(Byte)); 
   (* Die eingelesene 16 Bit-Zahl auf 8 Bit verkürzen *)
   Byte := SetTaskPri (Task[i-1], Byte) (* Setzen der neuen Priorität *)
 END  
END TaskLister.
