int infile;
long track[36];

long lseek();

char dir[16384];
long fileread(tr,se,where)
int tr,se;
char *where;
{
long offset;
char buffer[256];
char *p;
long len=0;
int i;

	while()
	{
		offset=track[tr]+se*0x100L;
		lseek(infile,offset,0);
		read(infile,buffer,256);
		p=buffer;
		tr=*p++;
		se=*p++;
		if(tr)
		{
			for(i=0;i<254;i++) *where++=*p++;
			len+=254;
		}
		else
		{
			se--;
			for(i=0;i<se;i++) *where++=*p++;
			len+=se;
			return len;
		}
	}
}

main(argc,argv)
int argc;
char *argv[];
{
int i,j;
long v;
long len;
char *p;
char name[20];
char fname[64];

	v=0;i=1;
	while(i<18) {track[i++]=v;v+=0x1500L;}
	while(i<25) {track[i++]=v;v+=0x1300L;}
	while(i<31) {track[i++]=v;v+=0x1200L;}
	while(i<36) {track[i++]=v;v+=0x1100L;}

	if(argc!=2)
	{
		puts("Use: CDIR <imagefile>\n");
		return;
	}

	strcpy(fname,argv[1]);
	infile=fopen(fname,"r");
	if(!infile)
	{
		strcat(fname,".d64");
		infile=fopen(fname,"r");
		if(!infile)
		{
		printf("Cannot open \"%s\"\n",argv[1]);
		return;
		}
	}

	len=fileread(18,0,dir);
	fclose(infile);
/*
	printf("length=%lx\n",len);
	i=fopen("e:\\out","w");
	if(!i) return;
	write(i,dir,(int)len);
	fclose(i);
*/
	i=0;
	p=dir+0xfe;
	while()
	{
		for(j=0;j<16;j++) name[j]=p[j+3]&0x7f;
		name[j]=0;
		if(p[0])
			printf("%2d:%3d %s %2x\n",i,p[28]+p[29]*256,name,p[0]);
		i++;
		p+=32;
		if((i&7)==0) p-=2;
		if(p-dir>=len) break;
	}
}
