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