⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hdtest.c

📁 这是个重量级的东西
💻 C
字号:
/*
	hdtest.c copyright by robin @2004.6.29
*/

#include "..\hd\hd.h"
#include "..\driver\ide.h"
#include "..\txlib\txlib.h"

extern char strHelp[];
int DumpMemoryA(void * buffer,DWORD dwLeng);

#include "txstdio.h"
#include "memory.h"
#include "string.h"

void HDTestUsage();
int HDTest(int argc,char ** argv);

// hd /[r|w|s],/[a:diskaddress],/[c:sector count],/[help],/[d:data]
#ifdef WIN_DEBUG
// 用于windows调试
#include "stdio.h"

int GetCommand(char * strCommand,char ** argv)
{
	int argcnt = 0;
	char * com = strCommand;
	while(IS_WHITE_SPACE(*com))
		com++;
	
	for( ; *com != 0 ; )
	{
		argv[argcnt++] = com;
		// 找到下一个分段点
		while(!IS_WHITE_SPACE(*com) && *com != 0)
			com++;

		if(*com == 0) break;
		
		*com = 0;
		com++;
		while(IS_WHITE_SPACE(*com))	
			com++;
	}

	return argcnt;
}

char * upcase(char * str)
{
	char * s = str;
	for( ; *s  ; s++)
	{
		if(*s >= 'a' && *s <= 'z')
			*s -= 0x20;
	}
	return str;
}
// 10进制需要考虑符号问题
int atoi10(const char * num)
{
	int retval;
	int base;
	int sign = 0;
	const char * snum;
	
	// 去掉前导空白
	while(IS_WHITE_SPACE(*num))
		num++;

	// 判断符号
	switch(*num)
	{
	case '-':
		sign = 1;
		num++;
		break;
	case '+':
		num++;
		break;
	}

	snum = num;
	while((!IS_WHITE_SPACE(*snum)) && *snum )
	{
		if(*snum < '0' || *snum > '9')
			return 0;
		snum++;
	}
	snum--;
	retval = 0;
	base = 1;
	for( ; snum >= num ; snum--)
	{
		retval += (*snum - '0') * base;
		base *= 10;
	}

	return sign?(-retval):retval;
}
unsigned int atoi16(const char * num)
{
	unsigned int retval;
	unsigned int base;
	const char * snum;
	
	// 去掉前导空白
	while(IS_WHITE_SPACE(*num))
		num++;

	if(!(num[0] == '0' && ( num[1] == 'x' || num[1] == 'X')))
		return 0;
	num += 2;
	snum = num ;
	while((!IS_WHITE_SPACE(*snum)) && *snum )
	{
		if((*snum >= '0' && *snum <= '9') ||
			(*snum >= 'a' && *snum <= 'f') ||
			(*snum >= 'A' && *snum <= 'F') )
		{
			snum++;
		}
		else
			return 0;
	}

	snum--;	
	retval = 0;	
	base = 1;

	for( ; snum >= num ; snum--)
	{
		if(*snum >= '0' && *snum <= '9')
			retval += (unsigned int)(*snum - '0') * base;
		else if(*snum >= 'a' && *snum <= 'f') 
			retval += (unsigned int)(*snum - 'a' + 10) * base;
		else if(*snum >= 'A' && *snum <= 'F') 
			retval += (unsigned int)(*snum - 'A' + 10) * base;
		base *= 16;
	}
	return retval; 
}
int IsHex(char * strNumber)
{
	char * num = strNumber;


	if(!(num[0] == '0' && (num[1] == 'x' || num[1] == 'X')))
		return 0;
	num += 2;
	for( ; *num != 0 ; num++)
	{
		if(!((*num >= '0' && *num <= '9') || 
			(*num >= 'a' && *num <= 'f') ||
			(*num >= 'A' && *num <= 'F')))
			return 0;
	}

	return 1;
}

int IsDigital(char * strNumber)
{
	char * num = strNumber;


	for( ; *num != 0 ; num++)
	{
		if(*num < '0' || *num > '9')
			return 0;
	}

	return 1;
}

void main()
{
	int argc;
	char * argv[32];
}

#else

	#include "txstdio.h"


	#define printf kprintf

#endif // WIN_DEBUG

void HDTestUsage()
{
	printf("Usage: hd /[r|w|s],/[a:diskaddress],/[c:sector count],/[o:offset],/[d:data],/[help]\n");
	printf("    address : only use digital.\n");
	printf("    help    : show how to use hdtest.\n");
	printf("    offset  : the offset from diskaddress ,in byte.\n");
	printf("    data    : the data write into disk.\n");
	printf("    sector count : only use digital.\n");
}
// hd /[r|w|s],/[a:diskaddress],/[c:sector count],/[help],/[d:data]

int HDTest(int argc,char ** argv)
{
	int i = 0;

	DWORD dwAddress		= 0;
	DWORD dwLeng		= 1;
	DWORD dwOffset		= 0;
	DWORD dwReadFlag	= 0;
	DWORD dwWriteFlag	= 0;
	DWORD dwStateFlag	= 0;
	DWORD dwHelpFlag	= 0;

	DAP dap;
	char buf[512];
	// 取参数
	for( i = 1 ; i < argc ; i++)
	{
		if(argv[i][0] == '-' || argv[i][0] == '/')
		{
			if(argv[i][1] == 'a' || argv[i][1] == 'A')
			{
				if(IsDigital(&(argv[i][3])) == 0){
					printf("disk address invalid,please check it out!");
					return 0;
				}
				dwAddress = atoi10(&(argv[i][3]));
			}
			else if(argv[i][1] == 'c' || argv[i][1] == 'C')
			{
				if(IsDigital(&(argv[i][3])) == 0){
					printf("sector count invalid,please check it out!");
					return 0;
				}
				//dwLeng = atoi10(&(argv[i][3]));
				// 目前只支持读一个扇区
				dwLeng = 1;
			}
			else if(argv[i][1] == 'o' || argv[i][1] == 'O')
			{
				if(IsDigital(&(argv[i][3])) == 0){
					printf("offset invalid,please check it out!");
					return 0;
				}
				dwOffset = atoi10(&(argv[i][3]));
			}
			else if(argv[i][1] == 'h' || argv[i][1] == 'H')
			{
				upcase(argv[i]);
				if(strcmp(&(argv[i][1]),strHelp) == 0) dwHelpFlag = 1;
				else {
					printf("some hd parameter invalid,check it out!");
					return 0;
				}
			}
			else if(argv[i][1] == 'r' || argv[i][1] == 'R')
				dwReadFlag = 1;
			else if(argv[i][1] == 'w' || argv[i][1] == 'W')
				dwWriteFlag = 1;
			else if(argv[i][1] == 't' || argv[i][1] == 'T')
				dwStateFlag = 1;
		}
		else{
			printf("some hd parameter invalid,check it out!");
			return 0;
		}
	}

	if( argc == 1 ) {
		HDTestUsage();
		return 1;
	}

	if(dwReadFlag == 1 && dwWriteFlag == 1)
	{
		printf("Can not R/W HardDisk at the same time\n");
		return 0;
	}

	if(dwStateFlag){
		return 1;
	}
		
	dap.dwDiskAddr	= dwAddress;
	dap.dwSecCnt	= dwLeng;
	dap.pBuffer		= buf;
	
	if(dwReadFlag)
	{
		//printf("read hd command!\n");
		HDRead(0,&dap);
		if(dwOffset > 256) dwOffset = 256;
	
		DumpMemoryA(buf + dwOffset,256);
	}
	
	if(dwWriteFlag)
	{
		//printf("write hd command!\n");
		HDWrite(0,&dap);
	}

	
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -