#include <sys/unix.h>
#include <sys/config.h>
#include <sys/extern.h>
#include <libraries/dos.h>

extern struct u_data udata;

#ifndef TSTDEV
#define TSTDEV
char *tstdev=0;
#endif


 /*
 |  Filesystem testing - output a panic message
 |  I assume after a panic, things are meant to stop
*/
int panic( msg )
char *msg;
{
	printf("PANIC:%s\n",msg);
}


 /*
 |  Turn interrupts off
*/
int di() {return;}


 /*
 |  Turn interrupts on
*/
int ei() {return;}


 /*
 |  Fake device driver functions for messages
*/
int tty_open( minor )
int 	minor;
{
	return(0);
}

int tty_close( minor )
int	minor;
{
	return(0);
}

int tty_write( minor, rawflag )
int16	minor;
int16	rawflag;
{
	int	tmp = (int)udata.u_count;
	while( udata.u_count-- )
		printf("%c",*udata.u_base++);
	return(tmp);
}

int tty_read( minor, rawflag )
int16	minor;
int16	rawflag;
{
	int	tmp = (int)udata.u_count;
	while( udata.u_count-- )
		scanf("%c",udata.u_base++);
	return(tmp);
}


 /*
 |  Device driver functions for fake disc
*/

int fdd_open( minor )
int	minor;
{
	int	tot=0,
		infile;

	if( !tstdev )
		tstdev=(char*)malloc( 901120 );
	if( !tstdev )
	{
		printf("device malloc failed\n");
		exit();
	}
	bzero( tstdev, 901120 );

	if( (infile=Open("testdev",MODE_OLDFILE)) >0 )
	{
		while( tot < 901120 )
			if( (tot+=Read(infile,tstdev+tot,901120)) ==0 )
				break;
		Close( infile );
	}
	return(0);
}

int fdd_close( minor )
int	minor;
{
	int	tot=0,
		outfile;

	if( (outfile=Open("testdev",MODE_NEWFILE)) >0 )
	{
		while( tot < 901120 )
			if( (tot+=Write(outfile,tstdev+tot,901120)) ==0 )
				break;
		Close( outfile );
	}
	free( tstdev );
	tstdev=(char*)0;
	return(0);
}

int fdd_write( minor, rawflag )
int16	minor;
int16	rawflag;
{
	/* Write 512 bytes from a buffer to a block on a device */
	memcpy( tstdev+(512*udata.u_buf->bf_blk), udata.u_buf->bf_data, 512 );
	return(512);  /* This may be the wrong return value */
}

int fdd_read( minor, rawflag )
int16	minor;
int16	rawflag;
{
	/* Read 512 bytes from a block on a device to a buffer */
	memcpy( udata.u_buf->bf_data, tstdev+(512*udata.u_buf->bf_blk), 512 );
	return(512);  /* Again, this may be the wrong return value */
}



 /*
 |  Misc functions, some from extras.c
*/

int bzero( ptr, len )
char *ptr;
int len;
{
	while(len--)
		*ptr++=0;
}

int bcopy( src, dst, len )
char *src, *dst;
int len;
{
	while(len--)
		*dst++=*src++;
}

mem_read(){return;}
mem_write(){return;}

null_write(){return;}

tty_ioctl(){return;}

