/*
 * ShowResident.c
 * Un programma PD di Romano Tenca
 * Compilare con Lattice C 5.x
 *  lc -v
 * Linkare con
 *  blink c.o ShowResident.o to ShowResident lib lib:lc.lib
*/

#include "exec/types.h"
#include "libraries/dosextens.h"
#include "stdio.h"
#include "string.h"

struct miaDosResident /*la mia struttura DosResident*/
{
BPTR NextEntry;
BPTR UseCount;
BPTR SegPtr;
unsigned char Name[31]; /*prevedo 30 char massimi*/
};

typedef struct miaDosResident DOSRES; /*per comodita'*/

extern struct DosLibrary *DOSBase;

void main()
{
struct RootNode *rootnode;
struct DosInfo *dosinfo;
DOSRES *dosresident;
DOSRES copiares;
APTR nxtseg;
APTR segptr;
ULONG lenseg;

rootnode=(struct RootNode *)DOSBase->dl_Root;
dosinfo=(struct DosInfo *)BADDR(rootnode->rn_Info);
dosresident=(DOSRES *)BADDR(dosinfo->di_NetHand);

printf("Elenco programmi residenti e relativi hunk\n              start   -     end      len      next   use\n");

for(;dosresident!=NULL;	dosresident=(DOSRES *)BADDR(copiares.NextEntry))
	{
	copiares=*dosresident;
	if(copiares.Name[0] >30)copiares.Name[0] =30; 
	printf("%-14.*s$%6lx - $%06lx   %6ld   $%06lx   %2ld\n",
			copiares.Name[0],
			&copiares.Name[1],
			((ULONG)dosresident)-4,
			((ULONG)dosresident)+ *(((long *)dosresident)-1),
			*(((long *)dosresident)-1),
			BADDR(copiares.NextEntry),
			copiares.UseCount );

	for(nxtseg=BADDR(copiares.SegPtr); nxtseg!=NULL; nxtseg=BADDR(*nxtseg))
		{
		segptr = nxtseg - 1;
		lenseg = (ULONG)*segptr;
		printf("              $%06lx - $%06lx   %6ld   $%06lx\n",
				segptr,
				(ULONG)segptr+lenseg,
				lenseg,
				BADDR(*(segptr+1)) );
		}
	}
}
