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