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

📄 fzq.cpp

📁 自己写的C51仿真器代码
💻 CPP
字号:
/*  file :fzq8.c (1994.12.13) fzq128.sch fz 1M X 8bits
fzq128.c  (2002.9.23)  */
/* modify by david lin 11/24/2002 */
#include <ctype.h>
#include <stdio.h>
#include <dos.h>
#include "fzq.h"
const long MAX_LEN = 0x7ffff;
int file2ram(const char * ,const long & ,const long &);
int ram2file(const char * ,const long & ,const long &);
int ramcmp(const char * ,const long & ,const long &);
int ramconnect(void);
int main(int argc,char **argv)
{
 //	FILE *fp = NULL;
	RAM sram;
	char *expect;
	int c, d, error = 0;
	long begin = 0, len = MAX_LEN, end = MAX_LEN, i;
	char flag,tmp;

	/*if(!ramconnect())
	{
		return -2;
	}*/
	
	// 解读命令行参数
	switch(argc)
	{
		case 0 :
		case 1 :
			puts("\nRequired parameter missing.\nType fzq4m /? to get help");
			break;
		case 2 :
			if(*argv[1] == '?' || (*(argv[1]+1) == '?' && *argv[1] == '\/'))
			{
				puts("\nThis program download the data to the 4Mbit Rom-simulator.");
				puts("fzq4m.exe filename  [switch] [[begin] {len[K|M]}]\n");
				puts("\tswitch\t/w : write (default)\n\t\t/v : write and verify\n\t\t/c : compare RAM wit file\n\t\t/r : read from RAM");
				puts("\tbegin : the offset of RAM (default is 0)");
				puts("\tlen : the len from offset (defautl is 512K)");
				puts("\t\t both Decimalization or 0xHEX is recognize\n\t\t k : *1024 \n\t\t M : *1048576");
				return -1;
			}
			flag = 'w';

			break;
		case 5 :
			expect = argv[3];
			if(*expect < '0' || *expect > '9')
			{
				printf("\nInvalid switch %s",argv[2]);
				
				return -1;
			}
			sscanf(expect,"%ld%c",&begin,&tmp);

			if(tmp == 'k' || tmp == 'K')
			{
				begin *= 1024;
			}
			else if(tmp == 'M' || tmp == 'm')
			{
				begin *= 1048576l;
			}
			if(tmp == 'x' || tmp == 'X')
			{
				sscanf(expect,"%ld%c%lx",&i, &tmp, &begin);
			}
			if(begin > MAX_LEN)
			{
				printf("\nBound error %s",expect);
				
				return -1;
			}
			expect = argv[4];
			if(*expect < '0' || *expect > '9')
			{
				printf("\nInvalid switch %s",argv[2]);

				return -1;
			}
			sscanf(expect,"%ld%c",&len,&tmp);
			if(tmp == 'k' || tmp == 'K')
			{
				len *= 1024;
			}
			else if(tmp == 'M' || tmp == 'm')
			{
				len *= 1048576l;
			}
			if(tmp == 'x' || tmp == 'X')
			{
				sscanf(expect,"%ld%c%lx",&i, &tmp, &len);
			}
			
			end = begin + len - 1 ;
			
			if(end > MAX_LEN || end <= begin)
			{
				printf("\nBound error %s",expect);

				return -1;
			}
			
			// read the switch 
			flag = *argv[2];
			if(flag == '\/')
			{
				flag = *(argv[2]+1);
			}
			if(flag != 'c' && flag != 'C' && flag != 'w' && flag != 'W' && flag != 'v' && flag != 'V' && flag != 'r' && flag != 'R')
			{
				printf("\nInvalid switch %s",argv[2]);

				return -1;
			}
			break;

		case 4 :
			expect = argv[3];
			if(*expect < '0' || *expect > '9')
			{
				printf("\nInvalid switch %s",argv[2]);

				return -1;
			}
			sscanf(expect,"%ld%c",&len,&tmp);
			if(tmp == 'k' || tmp == 'K')
			{
				len *= 1024;
			}
			else if(tmp == 'M' || tmp == 'm')
			{
				len *= 1048576l;
			}
			if(tmp == 'x' || tmp == 'X')
			{
				sscanf(expect,"%ld%c%lx",&i, &tmp, &len);
			}
			
			end = begin + len - 1;
			
			if(end > MAX_LEN)
			{
				printf("\nBound error %s",expect);

				return -1;
			}
			begin = 0;
		case 3 :
			flag = *argv[2];
			if(flag == '\/')
			{
				flag = *(argv[2]+1);
			}
			if(flag != 'c' && flag != 'C' && flag != 'w' && flag != 'W' && flag != 'v' && flag != 'V' && flag != 'r' && flag != 'R')
			{
				printf("\nInvalid switch %s",argv[2]);

				return -1;
			}
			break;
		default :

			printf("\nToo many parameters. \nType fzq4m /? to get help",expect);

			return -1;

			break;

	}

	expect = argv[1];
	switch(flag)
	{
		case 'w':
		case 'W':
			file2ram(expect, begin, end);
			break;
		case 'r':
		case 'R':
			ram2file(expect, begin, end);
			break;
		case 'c':
		case 'C':
			ramcmp(expect, begin, end);
			break;
		case 'v':
		case 'V':
			file2ram(expect, begin, end);
			ramcmp(expect, begin, end);
		default :
			break;
	}
	fz();
	return 0;
}

int file2ram(const char *expect, const long &begin, const long &end)
{
	long i;
	FILE *fp;
	if(begin > end || end > MAX_LEN)
	{
		return -2;
	}

	fp=fopen(expect,"rb");
	if(!fp)
	{
		printf("File %s can not find.\nType fzq4m /? to get help",expect);
		return -1;
	}

	ropen("w");
	printf("\nDown loading file %s ...\n",expect);

	if(begin > 0)
	{
		rseek(begin);
	}

	for(i = begin; i <= end && rputc(fgetc(fp)) != EOF; i++ )
	{
	}

	fclose(fp);


	if(reof())
	{
		printf("file more than 512k bytes,some bytes are discarded.\n");
	}

	i = i - begin;
	printf("Write ok, %ld%c byte write.\n",i > 10240 ? (i/1024) : i , i > 10240 ? 'k' : 0 );
	return 0;
}

int ram2file(const char *expect, const long &begin, const long &end)
{
	long i ;
	char c = 0;
	int d;
	FILE *fp;
	if(begin > end || end > MAX_LEN)
	{
		return -2;
	}
	if((fp = fopen(expect,"rb")) == NULL)
	{
		if((fp = fopen(expect,"wb")) == NULL)
		{
			printf("\nFile %s create error.\n",expect);
			return -1;
		}
	}
	else
	{
		fclose(fp);
		while(c != 'y' && c != 'Y' && c != 'n' && c != 'N')
		{
			printf("Overwrite %s (Yes/No)?",expect);
			c = getchar();
		}
		if(c == 'n' || c == 'N')
		{
			return -3;
		}
		if((fp = fopen(expect,"wb")) == NULL)
		{
			printf("\nFile %s create error.\n",expect);
			return -1;
		}
	}
	ropen("r");
	printf("\nReading Ram ...\n",expect);

	if(begin > 0)
	{
		rseek(begin);
	}

	for(i = begin; i <= end; i++ )
	{
		if((d = rgetc()) != EOF)
		{
			fputc(d, fp);
		}
		else
		{
			break;
		}
	}

	fclose(fp);

	i = i - begin;
	printf("Data save to %s, %ld%c byte read.\n",expect, i > 10240 ? (i/1024) : i , i > 10240 ? 'k' : 0 );
	return 0;
}

int ramcmp(const char *expect, const long &begin, const long &end)

{
	long i, error = 0;
	FILE *fp;
	int c,d;
	if(begin > end || end > MAX_LEN)
	{
		return -2;
	}

	fp=fopen(expect,"rb");
	if(!fp)
	{
		printf("File %s open error.\nType FZQ /? to get help.\n",expect);
		return -1;
	}

	ropen("r");
	printf("\nVerifying file %s ...\n",expect);

	if(begin > 0)
	{
		rseek(begin);
	}

	for(i = begin; i <= end; i++ )
	{
		c = fgetc(fp);
		d = rgetc();
		if(c == EOF || d == EOF)
		{
			break ;
		}
		else 
		{
			if(c != d)
			{
				error++ ;
				printf("%8lx : %d : %d\n", i, c, d);
			}
		}
			
	}
	
	fclose(fp);
	
	if(error == 0)
	{
		printf("Verify successful. total %ld byte\n", i - begin);
	}
	else
	{
		printf("Verify fail. total %ld different find.\n", error);
	}

	return 0;
}

int ramconnect()
{   unsigned char a,b;
	// 校验 RAM connect
	ropen("r");
	rseek(0x7ff00);
	a = rgetc();
	b = rgetc();
	ropen("w");
	rseek(0x7ff00);
	rputc(a^'a');
	rputc(b^'z');
	ropen("r");
	rseek(0x7ff00);
	if(rgetc() != (a^'a') || rgetc() != (b^'z'))
	{
		puts("\nRom simulateror does not connect!");
		return 0;
	}
	ropen("w");
	rseek(0x7ff00);
	rputc(a);
	rputc(b);
	return 1;
}

⌨️ 快捷键说明

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