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

📄 romload.c

📁 ESS3890+SL原代码(1*16内存)
💻 C
字号:
/* Copyright 2002-2003, ESS Technology, Inc.				*//* SCCSID @(#)romload.c	4.5.1.2 02/23/05 *//*  * romload.c -  *	1) This tool creates a rom loader batch file with the *	   correct bases for the extra segments' data. *	2) corrects Stack size info in "stat" file. *	3) "dumps" extra segments if DUMPX is "1". *	4) checks: stack usage, code usage in dram,  *	   extra segments' code & data dram usage. */#undef MP3_LOGO_IN_SHARE#include <stdio.h>  #include <stdlib.h>     #include "common.h"#include "memmap.h"#include "display.h"#include "fractint.h"#ifdef JPEG_DEC#include "./jpglib/jpg_dram.h"#endif#define DEBUG 0#define DUMPX 0	/* "dumps" extra segments *//* Local defines */#define	BYTE		unsigned char  	/* 8 bits */#define	WORD		unsigned int  	/* 16 bits */#define	DWORD		unsigned long  	/* 32 bits */#define	LINE_LENGTH	80#ifdef VCDLC#define STACK_WARN	900		/* warn at this level */#else#define STACK_WARN	1500		/* warn at this level */#endif#ifdef BIG_MEM#define DRAM_END	0x200000	/* Bytes */#else#define DRAM_END	0x80000		/* Bytes */#endif#define RDSA_SEGMENT	0#define DEMUX_SEGMENT	1typedef struct {    char name[13];    int text_size;    int bss_size;    int bss_addr;    } SEGMENT_INFO;SEGMENT_INFO main_segments[2];#define XTRA_SEG1	0x1#define XTRA_SEG2	0x2#define XTRA_SEG3	0x4#define XTRA_SEG4	0x8#define XTRA_SEG_TOTAL	4char *xtra_segments[XTRA_SEG_TOTAL] = {    "xtra_s1.rom",    "xtra_s2.rom",    "xtra_s3.rom",    "xtra_s4.rom"};int xdata_limits[XTRA_SEG_TOTAL] = {     /* size in bytes */    4*JPEG_globals_size,    4*GMBY_globals_size,    4*WMA_globals_size,    4*MP3_globals_size};int xtext_limits[XTRA_SEG_TOTAL] = {    /* size in bytes */    4*JPEG_code_size,    4*GMBY_CODE_size,    4*WMA_CODE_size,    4*MP3_CODE_size};unsigned int cur_xsegments;/* Local prototypes */void get_segment_info(FILE *, int);void check_xtra_segments(FILE *);void dump_xtra_segments(void);char *get_next_line (FILE *);void mk_rombat(char *);void fix_stat_file(void);/* Program begin */main (int argc, char *argv []){     char outfile[13];    /* optional user specified output filename */    if (argc > 1) {	strcpy(outfile, argv[1]);    } else {	strcpy(outfile, "rom.bat");    }            mk_rombat(outfile);    fix_stat_file();    #if DUMPX    dump_xtra_segments();#endif /* DUMPX */    exit(0);}     void mk_rombat(char *out){    FILE  *fp;         /* make the rom loader batch file */    fp = fopen(out, "w");    if (fp == NULL) {	fprintf(stderr, "Can't open file: %s\n", out);	exit(1);    }    fprintf(fp, "vcs -b demux.rom ");#ifdef VCDLC    fprintf(fp, "-b rdsa.rom ");#endif#ifdef XSEG1_ON_FLY    fprintf(fp, "-s %x -b xtra_s1.rom ", JPEG_globals_start<<2);#endif /* XSEG1_ON_FLY */#ifdef XSEG2_ON_FLY    fprintf(fp, "-s %x -b xtra_s2.rom ", GMBY_globals_start<<2);#endif /* XSEG2_ON_FLY */#ifdef XSEG3_ON_FLY    fprintf(fp, "-s %x -b xtra_s3.rom ", WMA_globals_start<<2);#endif /* XSEG3_ON_FLY */#ifdef XSEG4_ON_FLY    fprintf(fp, "-s %x -b xtra_s4.rom ", MP3_globals_start<<2);#endif /* XSEG4_ON_FLY */    fprintf(fp, "bank30.rom\r\n");    fclose(fp);}/* CAUTION: for "stat" file format as of 7/17/02 */void fix_stat_file(void){    FILE  *fp;         char  *line_ptr, str2match[16], filename[10];    char dummy1[10], dummy2[10], dummy3[10];     char  tmp_addr_str[15]; char tmp_size_str[15];     char  str_temp[180];    char in[] = "stat";    int i, bss_addr, bss_size, found_demux=0, stack_size;    int str_len, mm;    int text_size, code_end=0;        /* check "stat" file */    fp = fopen(in, "r");    if (fp == NULL)    {	fprintf(stderr, "Can't open file: %s\n", in);	exit(2);    }    #ifdef VCDLC    strcpy (main_segments[RDSA_SEGMENT].name, "rdsa.rom");    get_segment_info(fp, RDSA_SEGMENT);#else    /* initialize */    main_segments[RDSA_SEGMENT].bss_addr = 0;    main_segments[RDSA_SEGMENT].bss_size = 0;#endif /* VCDLC */    strcpy (main_segments[DEMUX_SEGMENT].name, "demux.rom");    get_segment_info(fp, DEMUX_SEGMENT);    check_xtra_segments(fp);    fclose(fp);        /* calculate stack size */    for (i=0; i<2; i++){	/* demux/rdsa data end */	main_segments[i].bss_addr += main_segments[i].bss_size;    }    bss_addr = max2(main_segments[RDSA_SEGMENT].bss_addr, 		    main_segments[DEMUX_SEGMENT].bss_addr);    stack_size = VCD20STACK - bss_addr;        /* calculate code usage in dram */#ifdef VCDLC#ifdef DEMUX_ON_FLY    code_end = (4*DEMUX_ROM_start) + 	main_segments[DEMUX_SEGMENT].text_size; /* Byte addr */#endif#else    code_end = (4*CODE_start) + 	main_segments[DEMUX_SEGMENT].text_size; /* Byte addr */#endif /* VCDLC */        fp = fopen(in, "r+");    if (fp == NULL){	fprintf(stderr, "Can't open file: %s\n", in);	exit(4);    }    fseek(fp, 0, SEEK_SET);    strcpy (str2match, "Stack size");     /*We cannot use fgets() to get the location because it       get the wrong location for PC and UNIX */    fread(str_temp, 1, 180, fp);    line_ptr = str_temp;    /* Find stack info location */    for(i=0; i<180; i++)        if(!strncmp(&line_ptr[i], str2match, 10) ) break;        if (i == 180) i = 0;     str_len = 0;    if (i) { 	for( mm = i; mm< 180; mm++) {	    if(!strncmp(&line_ptr[mm], "bytes .", 7) ){		str_len = mm - i + 6;		if(str_len >= 80) str_len = 79;		break;	    }	}    }    #if DEBUG    printf("Stack line: %s\n", line_ptr);#endif    /* change the Stack size  in STAT file */    {        char w_p[80];  int len;	        if(i) fseek(fp, i, SEEK_SET);        else fseek(fp, 0, SEEK_END);	        for(mm = 0; mm<80; mm++) w_p[mm] = ' ';        sprintf(w_p, "Stack size: 0x%x(%d) bytes .\n",                stack_size, stack_size);        len = strlen(w_p);        if(len < str_len){	    w_p[len -1] = ' '; w_p[len] = ' ';	    w_p[str_len - 1] = '\n'; w_p[str_len] = 0;        }	        fprintf(fp, "%s", "\n");        fprintf(fp, "%s", w_p);	        fseek(fp, 0, SEEK_END);        fprintf(fp, "%s", "\n");        fprintf(fp, "Correct Stack Size: 0x%x(%d) bytes . \n",                stack_size, stack_size);		/* output stack info */	if (stack_size < STACK_WARN) {	    printf("*************************************************\n");	    printf("* Warning: Stack is getting low..check usage!!  *\n");	    printf("*************************************************\n");	}        printf("Stack size(Bytes): %d\n", stack_size);#if DEBUG        printf("%s\n", w_p);#endif    }        /* output code usage info */#ifdef VCDLC#ifdef DEMUX_ON_FLY    if (code_end > (DEMUX_ROM_end<<2)) {	printf("*********************************************\n");	printf("* ERROR: DEMUX_ROM SPACE HAS BEEN EXCEEDED!!*\n");	printf("*********************************************\n");	printf("Code space remaining(Bytes): %d\n", (DEMUX_ROM_end<<2)-code_end);    }#endif /* DEMUX_ON_FLY */#else    if (code_end > DRAM_END) {	printf("******************************************\n");	printf("* ERROR: CODE SPACE HAS BEEN EXCEEDED!!  *\n");	printf("******************************************\n");    }    printf("Code space remaining(Bytes): %d\n", DRAM_END-code_end);#endif /* VCDLC */    fclose(fp);}void get_segment_info(FILE *fp, int segment){    char  *line_ptr, str2match[16];    char dummy1[10], dummy2[10], dummy3[10];     char  tmp_addr_str[15]; char tmp_size_str[15];     int str_len;    SEGMENT_INFO *seginfo_ptr;            fseek(fp, 0, SEEK_SET);    seginfo_ptr = &main_segments[segment];        strcpy (str2match, seginfo_ptr->name);    do {	/* Find segment section */                               	line_ptr = get_next_line (fp);	if (line_ptr == NULL) {	    fprintf(stderr,"%s section not found.\n", str2match);	    exit(3);	}    } while (!strstr (line_ptr, str2match));	 #if DEBUG    printf("%s line: %s\n", str2match, line_ptr);#endif        /* The following should be segment info (next 4 lines) */    strcpy (str2match, "text"); /* segment's text */    do {	/* Find "text" line */                               	line_ptr = get_next_line (fp);	if (line_ptr == NULL) {	    fprintf(stderr,"%s section not found.\n", str2match);	    exit(3);	}    } while (!strstr (line_ptr, str2match));#if DEBUG    printf("text line: %s\n", line_ptr);#endif    /* get segment's text size..for dram's code space usage */    sscanf(line_ptr, "%s%s%s%s%s%s%s%s%s%s%s",            dummy1, dummy2, tmp_addr_str, dummy3, tmp_size_str, 	   dummy2, dummy2, dummy2, dummy2, dummy2, dummy2);	sscanf( &tmp_size_str[2], "%x", &seginfo_ptr->text_size);#if DEBUG    printf("str1: %s\n", dummy1);    printf("str3: %s\n", dummy3);    printf("text_addr_str: %s\n", tmp_addr_str);    printf("text_size_str: %s\n", tmp_size_str);    printf("text size: 0x%x\n", seginfo_ptr->text_size);#endif    strcpy (str2match, "bss"); /* segment's bss */    do {	/* Find  segment info section */	line_ptr = get_next_line (fp);	if (line_ptr == NULL) {	    fprintf(stderr,"%s section not found.\n", str2match);	    exit(3);	}    } while (!strstr (line_ptr, str2match));#if DEBUG    printf("bss line: %s\n", line_ptr);#endif    /* get segment's bss info..for stack info */    sscanf(line_ptr, "%s%s%s%s%s",            dummy1, dummy2, tmp_addr_str, dummy3, tmp_size_str);	sscanf( &tmp_addr_str[2], "%x", &seginfo_ptr->bss_addr);	sscanf( &tmp_size_str[2], "%x", &seginfo_ptr->bss_size);#if DEBUG    printf("str1: %s\n", dummy1);    printf("str2: %s\n", dummy2);    printf("str3: %s\n", dummy3);    printf("bss_addr_str: %s\n", tmp_addr_str);    printf("bss_size_str: %s\n", tmp_size_str);    printf("bss addr: 0x%x\n", seginfo_ptr->bss_addr);    printf("bss size: 0x%x\n", seginfo_ptr->bss_size);#endif}void check_xtra_segments(FILE *fp){         char  *line_ptr, str2match[16];    char dummy1[10], dummy2[10], dummy3[10];     char  tmp_addr_str[15], tmp_size_str[15];     int i, bss_size, str_len, data_size, text_size;    cur_xsegments = 0;#ifdef XSEG1_ON_FLY        cur_xsegments |= XTRA_SEG1;#endif#ifdef XSEG2_ON_FLY    cur_xsegments |= XTRA_SEG2;#endif#ifdef XSEG3_ON_FLY    cur_xsegments |= XTRA_SEG3;#endif#ifdef XSEG4_ON_FLY    cur_xsegments |= XTRA_SEG4;#endif        if (!cur_xsegments) return;        for (i=0; i<XTRA_SEG_TOTAL; i++) {	if (cur_xsegments & 0x1) {	    fseek(fp, 0, SEEK_SET);	    strcpy (str2match, xtra_segments[i]);	    do {	/* Find "xtra_s#.rom" line */		line_ptr = get_next_line (fp);		if (line_ptr == NULL) {		    fprintf(stderr,"%s section not found.\n", str2match);		    exit(4);		}	    } while (!strstr (line_ptr, str2match));#if DEBUG	    printf("xtra_s%d line: %s\n", i+1, line_ptr);#endif	    strcpy (str2match, "text"); /* xtra_s# text */	    do {	/* Find "text" line */		line_ptr = get_next_line (fp);		if (line_ptr == NULL) {		    fprintf(stderr,"%s section not found.\n", str2match);		    exit(4);		}	    } while (!strstr (line_ptr, str2match));#if DEBUG	    printf("text%d line: %s\n", i+1, line_ptr);#endif	    sscanf(line_ptr, "%s%s%s%s%s%s%s%s%s%s%s", 		   dummy1, dummy2, tmp_addr_str, dummy3, tmp_size_str, 		   dummy2, dummy2, dummy2, dummy2, dummy2, dummy2);	    sscanf( &tmp_size_str[2], "%x", &text_size);#if DEBUG	    printf("str1: %s\n", dummy1);	    printf("str3: %s\n", dummy3);	    printf("text_addr_str: %s\n", tmp_addr_str);	    printf("text_size_str: %s\n", tmp_size_str);	    printf("text size: 0x%x\n", text_size);#endif	    strcpy (str2match, "data"); /* xtra_s# data */	    do {	/* Find "data" line */		line_ptr = get_next_line (fp);		if (line_ptr == NULL) {		    fprintf(stderr,"%s section not found.\n", str2match);		    exit(4);		}	    } while (!strstr (line_ptr, str2match));#if DEBUG	    printf("data%d line: %s\n", i+1, line_ptr);#endif	    /* get xtra_s# data info.. */	    sscanf(line_ptr, "%s%s%s%s%s%s%s%s%s%s%s", 		   dummy1, dummy2, tmp_addr_str, dummy3, tmp_size_str, 		   dummy2, dummy2, dummy2, dummy2, dummy2, dummy2);	    sscanf( &tmp_size_str[2], "%x", &data_size);#if DEBUG	    printf("str1: %s\n", dummy1);	    printf("str3: %s\n", dummy3);	    printf("data_addr_str: %s\n", tmp_addr_str);	    printf("data_size_str: %s\n", tmp_size_str);	    printf("data%d size: 0x%x\n", i+1, data_size);#endif	    strcpy (str2match, "bss"); /* xtra_s# bss */	    do {	/* Find "bss" line */		line_ptr = get_next_line (fp);		if (line_ptr == NULL) {		    fprintf(stderr,"%s section not found.\n", str2match);		    exit(4);		}	    } while (!strstr (line_ptr, str2match));#if DEBUG	    printf("bss line: %s\n", line_ptr);#endif	    /* get xtra_s# bss info.. */	    sscanf(line_ptr, "%s%s%s%s%s", 		   dummy1, dummy2, dummy2, dummy3, tmp_size_str);	    sscanf( &tmp_size_str[2], "%x", &bss_size);	    data_size += bss_size;#if DEBUG	    printf("str1: %s\n", dummy1);	    printf("str3: %s\n", dummy3);	    printf("bss_size_str: %s\n", tmp_size_str);	    printf("bss size: 0x%x\n", bss_size);	    printf("xdata%d size: 0x%x\n", i+1, data_size);#endif	    /* ALERT if usage exceeds alloted space */	    if (text_size > xtext_limits[i]) {		printf("*************************************************\n");		printf("* FATAL: xtra_s%d text size(%dDW)\n*\texceeds limit(%dDW)\n",		       i+1, text_size/4, xtext_limits[i]/4);		printf("*************************************************\n");	    }	    if (data_size > xdata_limits[i]) {		printf("*************************************************\n");		printf("* FATAL: xtra_s%d data size(%dDW)\n*\texceeds limit(%dDW)\n",		       i+1, data_size/4, xdata_limits[i]/4);		printf("*************************************************\n");	    }	}	cur_xsegments >>= 1;    }}void dump_xtra_segments(void){    char dumpxbuf[LINE_LENGTH]; #ifdef XSEG1_ON_FLY    sprintf(dumpxbuf, "dump3 -f -l -%x xtra_s1.rom > xtra_s1.dmp\n", 	    ((JPEG_code_start<<2)+0x40000)&0xfffff);    printf("%s\n", dumpxbuf);#if !DEBUG    system(dumpxbuf);#endif#endif /* XSEG1_ON_FLY */#ifdef XSEG2_ON_FLY    sprintf(dumpxbuf, "dump3 -f -l -%x xtra_s2.rom > xtra_s2.dmp\n", 	    ((GMBY_CODE_start<<2)+0x40000)&0xfffff);    printf("%s\n", dumpxbuf);#if !DEBUG    system(dumpxbuf);#endif#endif /* XSEG2_ON_FLY */#ifdef XSEG3_ON_FLY    sprintf(dumpxbuf, "dump3 -f -l -%x xtra_s3.rom > xtra_s3.dmp\n", 	    ((WMA_CODE_start<<2)+0x40000)&0xfffff);    printf("%s\n", dumpxbuf);#if !DEBUG    system(dumpxbuf);#endif#endif /* XSEG3_ON_FLY */#ifdef XSEG4_ON_FLY    sprintf(dumpxbuf, "dump3 -f -l -%x xtra_s4.rom > xtra_s4.dmp\n", 	    ((MP3_CODE_start<<2)+0x40000)&0xfffff);    printf("%s\n", dumpxbuf);#if !DEBUG    system(dumpxbuf);#endif#endif /* XSEG4_ON_FLY */}char *get_next_line (FILE *fp){      static char  line[LINE_LENGTH+1];    char  *data;    line[LINE_LENGTH] = 0;   	while (fgets (line, LINE_LENGTH, fp) != NULL)	{	   for (data = line; *data == ' ' || *data == '\n' ||	        *data == '\t'; data++);	   if (*data == '#' || strlen (data) == 0)	       continue;	   return (data);    } ;                    return (NULL);}

⌨️ 快捷键说明

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