/*	TASK  Befehl  fuer AMIGA  */
/*	------------------------  */

/*	von Peter Mackenthun	  */
	
#include <exec/execbase.h>

extern struct ExecBase *SysBase;	/* Basis der Systemvariablen */

char *state[8]={			/* Task-States */
	"nonvalid",
	"added   ",
	"running ",
	"ready   ",
	"waiting ",
	"except  ",
	"removed ",
	"error   "};

main()
{
struct Task *task,*run,*tasklist[100];
int count=0,i;

Disable();			/*  Keine weiteren Taskswitches zulassen */

run=(struct Task *)SysBase->ThisTask;			/* Dieser Task  */

task=(struct Task *)SysBase->TaskReady.lh_Head;		/* Laufende Tasks */
while(task->tc_Node.ln_Succ!=0L)		/* Weiter Task ? */
	{
	tasklist[count++]=(struct Task *)task;	/* Taskadresse speichern, und
							Zaehler hochzaehlen */
	task=(struct Task *)task->tc_Node.ln_Succ;  /* Naechster Task */
	}

task=(struct Task *)SysBase->TaskWait.lh_Head;		/* Wartende Tasks */
while(task->tc_Node.ln_Succ!=0L)
	{
	tasklist[count++]=(struct Task *)task;
	task=(struct Task *)task->tc_Node.ln_Succ;
	}

Enable();		/* Taskswitches wieder erlauben */

printf("Adress Pri  Stack  Signals State    Code Name\n");     /* Titelzeile */
zeile(run);	
for(i=0;i<count;i++) zeile(tasklist[i]);    /* Taskliste ausgeben */
}

zeile(task)
struct Task *task;
{
char proc[4];

proc[0]=task->tc_ExceptCode==0?'-':'E';	/* Prueft ob Sprungadressen gesetzt sind */
proc[1]=task->tc_TrapCode==0?'-':'T';
proc[2]=task->tc_Switch==0?'-':'S';
proc[3]=task->tc_Launch==0?'-':'L';

printf("%-6lx %3ld %6ld %08lx %s %c%c%c%c %s\n",task,task->tc_Node.ln_Pri,
	task->tc_SPUpper-2-task->tc_SPLower,task->tc_SigWait,
	state[(int)task->tc_State&7],proc[0],proc[1],
	proc[2],proc[3],task->tc_Node.ln_Name);		/* Werte ausgeben */
}
