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

📄 dwntos.cpp

📁 摩托罗拉格式的S-RECORD执行文件的分析源码
💻 CPP
字号:
// DwnToS.cpp : Defines the entry point for the application.
//

//#include "stdafx.h"

//#include "afx.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
typedef unsigned long DWORD;
typedef unsigned int WORD;
typedef unsigned char BYTE;
int Explain(const char * szSFile,long lSize,BYTE * pBuf);
DWORD AToHex8(char * p)
{
	DWORD r=0;
	char ch;
	for(int i=0;i<8;i++)
	{
		ch=*p++;
		if(ch>='0' && ch<= '9')
		{
			r=(r<<4)+ch-'0';
		}
		else if(ch>='A' && ch<= 'F')
		{
			r=(r<<4)+ch-('A'-10);
		}
		else 
			return 0;
	}
	return r;
}

DWORD AToHex6(char * p)
{
	DWORD r=0;
	char ch;
	for(int i=0;i<6;i++)
	{
		ch=*p++;
		if(ch>='0' && ch<= '9')
		{
			r=(r<<4)+ch-'0';
		}
		else if(ch>='A' && ch<= 'F')
		{
			r=(r<<4)+ch-('A'-10);
		}
		else 
			return 0;
	}
	return r;
}

WORD AToHex4(char * p)
{
	WORD r=0;
	char ch;
	for(int i=0;i<4;i++)
	{
		ch=*p++;
		if(ch>='0' && ch<= '9')
		{
			r=(r<<4)+ch-'0';
		}
		else if(ch>='A' && ch<= 'F')
		{
			r=(r<<4)+ch-('A'-10);
		}
		else 
			return 0;
	}
	return r;
}

BYTE AToHex2(char * p)
{
	BYTE r=0;
	char ch;
	for(int i=0;i<2;i++)
	{
		ch=*p++;
		if(ch>='0' && ch<= '9')
		{
			r=(r<<4)+ch-'0';
		}
		else if(ch>='A' && ch<= 'F')
		{
			r=(r<<4)+ch-('A'-10);
		}
		else 
			return 0;
	}
	return r;
}
//int APIENTRY WinMain(HINSTANCE hInstance,
//                     HINSTANCE hPrevInstance,
//                     LPSTR     lpCmdLine,
//                     int       nCmdShow)
main()
{
 	// TODO: Place code here.
	char filename[80];
	long size;
	char ch;
	printf("Input Rom Size(1:128K;2:256K;5:512K;A:1024K):");
	scanf("%c",&ch);
	switch(ch)
	{
	case '1':
		size=0x20000;
		break;
	case '2':
		size=0x40000;
		break;
	case '3':
		size=0x80000;
		break;
	case 'a':
	case 'A':
		size=0x100000L;
		break;
	default:
		size=0x40000;
	}
	BYTE *buf=(BYTE *)new BYTE[size];

	printf("Input source file name:");
	scanf("%s",filename);

	if(Explain(filename,size,buf))
	{
		printf("file err\n");
		exit(1);
	}

	FILE *cf;
//	char sz[100];
	cf=fopen("code.s","w");
	fprintf(cf,"\tSECTION code\n\tXDEF _code_start,_code_end\n_code_start:\n");
	for(int i=0;i<size;i+=8)
	{
		fprintf(cf,"\tDC.B 0x%2.2X,0x%2.2X,0x%2.2X,0x%2.2X,0x%2.2X,0x%2.2X,0x%2.2X,0x%2.2X\n",
			buf[i],buf[i+1],buf[i+2],buf[i+3],buf[i+4],buf[i+5],buf[i+6],buf[i+7]);
	}
	fprintf(cf,"_code_end:\n");
	
	fclose(cf);

	return 0;
}


int Explain(const char * szSFile,long lSize,BYTE * pBuf)
{
	FILE *cF;
	cF=fopen(szSFile,"r");
	if(cF==NULL)
		return 1;

	char szLine[100];
	char ch;
//	DWORD dwFilePtr;
	DWORD dwDataLen=0;

	bool boolEnd=false;

	long i;

	for(i=0;i<lSize;i++)
		pBuf[i]=(char)0xff;

	while(1)
	{
		i=0;
//		dwFilePtr=seek();
		while(1)
		{
			int r=fread(&ch,1,1,cF);
			if(r!=1)
			{
				boolEnd=true;
				szLine[i]=0;
				break;
			}
			else
			if(ch=='\n')
			{
				if(szLine[1]=='7'||szLine[1]=='8'||szLine[1]=='9')
					boolEnd=true;
				if(i>0 && szLine[i-1]=='\r')
					szLine[i-1]=0;
				else
					szLine[i]=0;
				break;
			}
			else
				szLine[i++]=ch;
				
		}
		if(!boolEnd)
		{
			DWORD dwStartPtr;
			BYTE bNum;
			BYTE  *p;
			int k;

			
			char type=szLine[1]-'0';
			switch(type)
			{
			case 0:
				break;
			case 1:
				dwStartPtr=AToHex4(&szLine[4]);
				bNum=AToHex2(&szLine[2])-3;
				if(dwStartPtr+bNum>dwDataLen)
					dwDataLen=dwStartPtr+bNum;
				if(dwDataLen>(DWORD)lSize)
					return -1;
				p=&pBuf[dwStartPtr];
				for(k=0;k<bNum;k++)
					*p++=AToHex2(&szLine[8+(k<<1)]);
				break;
			case 2:
				dwStartPtr=AToHex6(&szLine[4]);
				bNum=AToHex2(&szLine[2])-4;
				if(dwStartPtr+bNum>dwDataLen)
					dwDataLen=dwStartPtr+bNum;
				if(dwDataLen>(DWORD)lSize)
					return -1;
				p=&pBuf[dwStartPtr];
				for(k=0;k<bNum;k++)
					*p++=AToHex2(&szLine[10+(k<<1)]);
				break;
			case 3:
				dwStartPtr=AToHex8(&szLine[4]);
				bNum=AToHex2(&szLine[2])-5;
				if(dwStartPtr+bNum>dwDataLen)
					dwDataLen=dwStartPtr+bNum;
				if(dwDataLen>(DWORD)lSize)
					return -1;
				p=&pBuf[dwStartPtr];
				for(k=0;k<bNum;k++)
					*p++=(char)AToHex2(&szLine[12+(k<<1)]);

				break;
			default:
				;
			}
		}
		else
		{
			fclose(cF);
			return 0;
			
		}
	}

	return -1;
}

⌨️ 快捷键说明

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