📄 port.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 + -