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

📄 port.c

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

#include "..\typedef\type.h"
#include "..\txlib\txlib.h"

//#define WIN_DEBUG

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

#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];
	char com[] = "port /i /a:0x03d5 /l:1";
	argc = GetCommand(com,argv);
	Port(argc,argv);

}

#else

	#include "txstdio.h"


	#define printf kprintf

#endif // WIN_DEBUG

#include "string.h"

void PortUsage();
// port /[i|o],/[a:address],/[l:leng]
int Port(int argc,char ** argv)
{
	int i = 0;

	DWORD	dwInFlag;
	DWORD	dwOutFlag;
	DWORD	dwAddress;
	DWORD	dwHelpFlag;
	int		nLeng;

	DWORD	dwData;

	for( i = 1 ; i < argc ; i++)
	{
		if(argv[i][0] == '-' || argv[i][0] == '/')
		{
			if(argv[i][1] == 'a' || argv[i][1] == 'A')
			{
				if(IsHex(&(argv[i][3])) == 0){
					printf("port address invalid,please check it out!");
					return 0;
				}
				dwAddress = atoi16(&(argv[i][3]));
			}
			else if(argv[i][1] == 'l' || argv[i][1] == 'L')
			{
				if(IsDigital(&(argv[i][3])) == 0){
					printf("digital invalid,please check it out!");
					return 0;
				}
				nLeng = atoi10(&(argv[i][3]));
			}
			else if(argv[i][1] == 'd' || argv[i][1] == 'D')
			{
				if(IsHex(&(argv[i][3])) == 0){
					printf("digital invalid,please check it out!");
					return 0;
				}
				dwData = atoi16(&(argv[i][3]));
			}
			else if(argv[i][1] == 'h' || argv[i][1] == 'H')
			{
				upcase(argv[i]);
				if(strcmp(&(argv[i][1]),"HELP") == 0) dwHelpFlag = 1;
				else {
					printf("some port parameter invalid, check it out!");
					return 0;
				}
			}
			else if(argv[i][1] == 'i' || argv[i][1] == 'I')
			{
				dwInFlag = 1;
			}
			else if(argv[i][1] == 'o' || argv[i][1] == 'O')
			{
				dwOutFlag = 1;
			}
		}
		else{
			printf("some port parameter invalid, check it out!");
			return 0;
		}
	}

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

	if(dwInFlag == 1 && dwOutFlag == 1)
	{
		printf("can not input and output at the same time!\n");
		return 0;
	}

	if(dwAddress >0xfffa)
	{
		printf("port out of range!\n");
		return 0;
	}
	if( nLeng == 1)
	{
		if(dwInFlag == 1)
		{
			__asm{
				xor eax,eax
				mov dx,word ptr dwAddress;
				in al,dx
				mov dword ptr dwData,eax
			}
		}
		if(dwOutFlag == 1)
		{
			__asm{
				mov dx,word ptr dwAddress;
				mov al,byte ptr dwData
				out dx,al
			}
		}
	}
	else if(nLeng == 2)
	{
		if(dwInFlag == 1)
		{
			__asm{
				xor eax,eax
				mov dx,word ptr dwAddress;
				in ax,dx
				mov dword ptr dwData,eax
			}
		}
		if(dwOutFlag == 1)
		{
			__asm{
				mov dx,word ptr dwAddress;
				mov ax,word ptr dwData
				out dx,ax
			}
		}
	}
	else if(nLeng == 4)
	{
		if(dwInFlag == 1)
		{
			__asm{
				xor eax,eax
				mov dx,word ptr dwAddress;
				in eax,dx
				mov dword ptr dwData,eax
			}
		}
		if(dwOutFlag == 1)
		{
			__asm{
				mov dx,word ptr dwAddress;
				mov eax,dword ptr dwData
				out dx,eax
			}
		}
	}
	else
	{
		printf("too many port to operate!\n");
		return 0;
	}

	// 输出数据
	if( nLeng == 1)
	{
		printf("port data : 0x%02x\n",dwData & 0xff);
	}
	else if(nLeng == 2)
	{
		printf("port data : 0x%04x\n",dwData & 0xffff);
	}
	else if(nLeng == 4)
	{
		printf("port data : 0x%08x\n",dwData );
	}
	return 0;
}

void PortUsage()
{

	printf("Usage: port /[i|o],/[a:address],/[l:leng],[/d:data],[/help]\n");
	printf("    address : only use hex , no large then 0xfffe exampl: 0xcdcd.\n");
	printf("    leng    : only use digital. \n");
	printf("    data    : the data output to port,use hex.\n");
	printf("    help    : show how to use port.\n");

}

⌨️ 快捷键说明

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