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