Blame as10k1/as10k1.c

Packit Service b98cfc
/***************************************************************************
Packit Service b98cfc
                          as10k1.c  -  Main assembler routine
Packit Service b98cfc
                             -------------------
Packit Service b98cfc
    Date                 : May 22, 2000
Packit Service b98cfc
    Copyright            : (C) 2000 by Daniel Bertrand
Packit Service b98cfc
    Email                : d.bertrand@ieee.ca
Packit Service b98cfc
 ***************************************************************************/
Packit Service b98cfc
Packit Service b98cfc
/*
Packit Service b98cfc
 * This program was changed to conform the ALSA ideas. Please,
Packit Service b98cfc
 * bug reports and all other things should be discussed on the
Packit Service b98cfc
 * <alsa-devel@alsa-project.org> mailing list.
Packit Service b98cfc
 *                                   Jaroslav Kysela <perex@perex.cz>
Packit Service b98cfc
 */
Packit Service b98cfc
Packit Service b98cfc
/***************************************************************************
Packit Service b98cfc
 *                                                                         *
Packit Service b98cfc
 *   This program is free software; you can redistribute it and/or modify  *
Packit Service b98cfc
 *   it under the terms of the GNU General Public License as published by  *
Packit Service b98cfc
 *   the Free Software Foundation; either version 2 of the License, or     *
Packit Service b98cfc
 *   (at your option) any later version.                                   *
Packit Service b98cfc
 *                                                                         *
Packit Service b98cfc
 ***************************************************************************/
Packit Service b98cfc
#include<stdio.h>
Packit Service b98cfc
#include<stdlib.h>
Packit Service b98cfc
#include<fcntl.h>
Packit Service b98cfc
#include <sys/stat.h>
Packit Service b98cfc
#include <unistd.h>
Packit Service b98cfc
#include<string.h>
Packit Service b98cfc
#include "types.h"
Packit Service b98cfc
Packit Service b98cfc
#include "as10k1.h"
Packit Service b98cfc
Packit Service b98cfc
char *ptralloc[MAXINCLUDES];
Packit Service b98cfc
static int num_alloc;
Packit Service b98cfc
int source_line_num=0,file_num=0;
Packit Service b98cfc
int macro_line_num=0;
Packit Service b98cfc
FILE *fp=NULL,*listfile;
Packit Service b98cfc
char *input=NULL,*output=NULL,*listing=NULL,*current_line=NULL,listtemp[60];
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
int dbg_opt=0;
Packit Service b98cfc
Packit Service b98cfc
char version[]="As10k1 assembler version " VERSION;
Packit Service b98cfc
Packit Service b98cfc
char help[]="\n"
Packit Service b98cfc
"Usage: as10k1 [option...] asmfile\n"
Packit Service b98cfc
"\n"
Packit Service b98cfc
"The as10k1 assembler is for the emu10k1 dsp processor\n"
Packit Service b98cfc
"found in Creative Lab's sblive series of sound cards.\n"
Packit Service b98cfc
"\n"
Packit Service b98cfc
"Author: Daniel Bertrand <d.bertrand@ieee.ca>\n"
Packit Service b98cfc
"\n"
Packit Service b98cfc
"Options:\n\n"
Packit Service b98cfc
"     -l [listfile]         Specify a listing file, default is none.\n"
Packit Service b98cfc
"     -o [emu10k1 file]     Specify an output file, default is based input,\n"
Packit Service b98cfc
"                           Substituting .asm to .emu10k1\n"
Packit Service b98cfc
"     -d [dbg_options...]   Turn on debug messages.\n"
Packit Service b98cfc
"            s              prints all symbols                \n"
Packit Service b98cfc
"            g              prints defined gprs\n"
Packit Service b98cfc
"            t              prints tram usage\n"
Packit Service b98cfc
"            i              prints instructions\n"
Packit Service b98cfc
"     -h                    Prints this message  \n"
Packit Service b98cfc
"     -v                    Prints version number. \n"
Packit Service b98cfc
"\n"
Packit Service b98cfc
"This program is distributed under the GPL.\n"
Packit Service b98cfc
"\n";
Packit Service b98cfc
Packit Service b98cfc
//  cli==Command-Line Interface && !Creative Labs Inc.
Packit Service b98cfc
Packit Service b98cfc
void parse_cli_args(int argc, char *argv[])
Packit Service b98cfc
{
Packit Service b98cfc
	int i,j;
Packit Service b98cfc
	for(i=1;i
Packit Service b98cfc
		
Packit Service b98cfc
		if(argv[i][0]=='-'){
Packit Service b98cfc
			switch(argv[i][1]){
Packit Service b98cfc
Packit Service b98cfc
			case 'o'://specify an output file name
Packit Service b98cfc
				i++;
Packit Service b98cfc
				if((i==argc)||(argv[i][0]=='-')){
Packit Service b98cfc
					printf("Error -o option requires a destination file name\n");
Packit Service b98cfc
					exit(-1);
Packit Service b98cfc
				}
Packit Service b98cfc
				output=argv[i];
Packit Service b98cfc
				break;
Packit Service b98cfc
			case 'd': //turn on debugging messages
Packit Service b98cfc
				j=0;
Packit Service b98cfc
				i++;
Packit Service b98cfc
				printf("Debug on, Displaying:");
Packit Service b98cfc
				
Packit Service b98cfc
				if((i==argc)||(argv[i][0]=='-')){
Packit Service b98cfc
					dbg_opt=dbg_opt|DBG_INSTR;//default
Packit Service b98cfc
					i--;
Packit Service b98cfc
					printf(" instructions by default\n");
Packit Service b98cfc
					goto next_cli_arg;
Packit Service b98cfc
				}
Packit Service b98cfc
				
Packit Service b98cfc
				while(argv[i][j]!='\0'){
Packit Service b98cfc
						
Packit Service b98cfc
					switch(argv[i][j]){
Packit Service b98cfc
					case 's':
Packit Service b98cfc
						dbg_opt=dbg_opt|DBG_SYM;
Packit Service b98cfc
						printf(" Symbols,");
Packit Service b98cfc
						break;
Packit Service b98cfc
					case 'g':
Packit Service b98cfc
						dbg_opt=dbg_opt|DBG_GPR;
Packit Service b98cfc
						printf(" GPRs,");
Packit Service b98cfc
						break;
Packit Service b98cfc
					case 't':
Packit Service b98cfc
						dbg_opt=dbg_opt|DBG_TRAM;
Packit Service b98cfc
						printf(" TRAM,");
Packit Service b98cfc
						break;
Packit Service b98cfc
					case 'i':
Packit Service b98cfc
						dbg_opt=dbg_opt|DBG_INSTR;
Packit Service b98cfc
						printf(" Instructions,");
Packit Service b98cfc
						break;
Packit Service b98cfc
						
Packit Service b98cfc
					default:
Packit Service b98cfc
						printf("\b \n**Bad debug option.  ");
Packit Service b98cfc
						exit(-1);
Packit Service b98cfc
					}
Packit Service b98cfc
					j++;
Packit Service b98cfc
				}
Packit Service b98cfc
				printf("\b \n");
Packit Service b98cfc
				break;
Packit Service b98cfc
						
Packit Service b98cfc
			case 'l'://produce a listing file
Packit Service b98cfc
				//printf("Will save list file to %s\n",  );
Packit Service b98cfc
				i++;
Packit Service b98cfc
				if((i==argc)||(argv[i][0]=='-')){
Packit Service b98cfc
					printf("Error -l option requires a destination file name\n");
Packit Service b98cfc
					exit(-1);
Packit Service b98cfc
				}
Packit Service b98cfc
				listing=argv[i];
Packit Service b98cfc
				
Packit Service b98cfc
				
Packit Service b98cfc
				break;
Packit Service b98cfc
				
Packit Service b98cfc
			case 'h'://printf help message
Packit Service b98cfc
Packit Service b98cfc
			default:
Packit Service b98cfc
				printf("%s",help);
Packit Service b98cfc
					
Packit Service b98cfc
			case 'v':
Packit Service b98cfc
				printf("%s\n",version);
Packit Service b98cfc
				exit(0);
Packit Service b98cfc
			}
Packit Service b98cfc
			
Packit Service b98cfc
				
Packit Service b98cfc
		}else{
Packit Service b98cfc
			if(input==NULL)
Packit Service b98cfc
				input=argv[i];
Packit Service b98cfc
			else{
Packit Service b98cfc
				printf("Error, only one input file can be specified");	
Packit Service b98cfc
				as_exit("");
Packit Service b98cfc
				
Packit Service b98cfc
			}
Packit Service b98cfc
Packit Service b98cfc
		}
Packit Service b98cfc
next_cli_arg:
Packit Service b98cfc
	;
Packit Service b98cfc
	}
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
int main( int argc, char *argv[] )
Packit Service b98cfc
{
Packit Service b98cfc
 
Packit Service b98cfc
        int i;
Packit Service b98cfc
        char filename[FILENAME_MAX];
Packit Service b98cfc
        extern int ip;
Packit Service b98cfc
        u32 val;
Packit Service b98cfc
	
Packit Service b98cfc
        parse_cli_args(argc,argv);
Packit Service b98cfc
	if(input==NULL){
Packit Service b98cfc
		printf("Error, an input file must be specified\n");
Packit Service b98cfc
		exit(-1);
Packit Service b98cfc
	}
Packit Service b98cfc
Packit Service b98cfc
        //init symbol list:
Packit Service b98cfc
        
Packit Service b98cfc
        INIT_LIST_HEAD(&sym_head);
Packit Service b98cfc
       
Packit Service b98cfc
	if(listing!=NULL)
Packit Service b98cfc
		if((listfile = fopen(listing, "w"))==NULL){
Packit Service b98cfc
			printf("\nError writing to file %s\n",argv[1]);	
Packit Service b98cfc
			as_exit("error");       
Packit Service b98cfc
		}
Packit Service b98cfc
	asm_open(input); //opens the source file and starts parsing it.
Packit Service b98cfc
	
Packit Service b98cfc
	if(output==NULL){
Packit Service b98cfc
		strcpy(filename, input);
Packit Service b98cfc
		strtok(filename,".\0");
Packit Service b98cfc
		strcat(filename, ".emu10k1");
Packit Service b98cfc
		output = filename;
Packit Service b98cfc
	}
Packit Service b98cfc
	
Packit Service b98cfc
	if((fp = fopen(output, "w"))==NULL){
Packit Service b98cfc
		printf("\nError writing to file %s\n",argv[1]);	
Packit Service b98cfc
		as_exit("error");       
Packit Service b98cfc
	}
Packit Service b98cfc
	
Packit Service b98cfc
	if(listing)
Packit Service b98cfc
		fprintf(listfile,"Summary:\n");
Packit Service b98cfc
        /*create header*/
Packit Service b98cfc
        header();
Packit Service b98cfc
Packit Service b98cfc
        /*output number of instructions*/
Packit Service b98cfc
       
Packit Service b98cfc
        val = __cpu_to_le32(ip);
Packit Service b98cfc
        fwrite(&val,sizeof(u16),1,fp);
Packit Service b98cfc
        
Packit Service b98cfc
        /* write binary code */
Packit Service b98cfc
        
Packit Service b98cfc
Packit Service b98cfc
        for (i = 0; i < ip * 2; i++) {
Packit Service b98cfc
        	val = __cpu_to_le32(dsp_code[i]);
Packit Service b98cfc
                fwrite(&val,sizeof(u32),1,fp);
Packit Service b98cfc
		//for (j = 3; j >= 0; j--)
Packit Service b98cfc
                //fprintf(fp, "%c", ((u8 *) dsp_code)[i * 4 + j]);
Packit Service b98cfc
	}
Packit Service b98cfc
       
Packit Service b98cfc
  	
Packit Service b98cfc
	if(listing)
Packit Service b98cfc
		fclose(listfile);
Packit Service b98cfc
	fclose(fp);
Packit Service b98cfc
        for(i=0;i
Packit Service b98cfc
                free(ptralloc[i]);
Packit Service b98cfc
              
Packit Service b98cfc
  	return 0;  //that's it were done
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
/*this function is called to open a asm file and parse it using the parse function.
Packit Service b98cfc
this function is called by the main function and also by the parse function
Packit Service b98cfc
when it encounters an "INCLUDE" directive.
Packit Service b98cfc
*/
Packit Service b98cfc
Packit Service b98cfc
void asm_open(char *name)
Packit Service b98cfc
{
Packit Service b98cfc
        
Packit Service b98cfc
        int fd,i;
Packit Service b98cfc
        int done=0;
Packit Service b98cfc
        char string[MAX_LINE_LENGTH];
Packit Service b98cfc
        struct stat st;
Packit Service b98cfc
        char *next;
Packit Service b98cfc
        int backup_line_num,backup_file_num;
Packit Service b98cfc
Packit Service b98cfc
    
Packit Service b98cfc
                
Packit Service b98cfc
        
Packit Service b98cfc
        
Packit Service b98cfc
        backup_line_num=source_line_num;
Packit Service b98cfc
        backup_file_num=file_num;
Packit Service b98cfc
        
Packit Service b98cfc
        if( (include_depth++) > max_depth){
Packit Service b98cfc
		printf("Error: maximum recursive include depth(%d) exceeded\n",max_depth);
Packit Service b98cfc
		as_exit("");
Packit Service b98cfc
	}	 		
Packit Service b98cfc
        buff[num_alloc].name=name;
Packit Service b98cfc
        source_line_num=0;
Packit Service b98cfc
        file_num=num_alloc;
Packit Service b98cfc
        //open the file
Packit Service b98cfc
        
Packit Service b98cfc
        if ((unsigned) (fd = open(name, O_RDONLY)) > 255){
Packit Service b98cfc
                as_exit("error opening input file\n");
Packit Service b98cfc
        } 
Packit Service b98cfc
        //get it's stats
Packit Service b98cfc
        if ( -1 ==  fstat( fd, &st)){
Packit Service b98cfc
                printf("Error occured attempting to stat %s\n", name);
Packit Service b98cfc
                as_exit("");
Packit Service b98cfc
        }
Packit Service b98cfc
        
Packit Service b98cfc
        if(( ptralloc[num_alloc]=(char *) malloc(st.st_size+2) )== 0){
Packit Service b98cfc
                printf("error allocating memory for file %s\n",name);
Packit Service b98cfc
                close(fd);
Packit Service b98cfc
                as_exit("");
Packit Service b98cfc
        }else{
Packit Service b98cfc
                buff[num_alloc].mem_start=ptralloc[num_alloc]; 
Packit Service b98cfc
Packit Service b98cfc
        }
Packit Service b98cfc
        
Packit Service b98cfc
        i=num_alloc;
Packit Service b98cfc
        num_alloc++;
Packit Service b98cfc
        
Packit Service b98cfc
        buff[i].mem_end = buff[i].mem_start+st.st_size;
Packit Service b98cfc
        
Packit Service b98cfc
        read(fd, buff[i].mem_start, st.st_size);
Packit Service b98cfc
        close(fd);
Packit Service b98cfc
         
Packit Service b98cfc
#ifdef DEBUG        
Packit Service b98cfc
  	printf("File %s opened:\n",name);
Packit Service b98cfc
#endif
Packit Service b98cfc
Packit Service b98cfc
        //
Packit Service b98cfc
        //get each line and parse it:
Packit Service b98cfc
        //
Packit Service b98cfc
        current_line=buff[i].mem_start;
Packit Service b98cfc
        source_line_num=1;
Packit Service b98cfc
        next=current_line;
Packit Service b98cfc
        while(next!=buff[i].mem_end){
Packit Service b98cfc
                while((*next!= '\n') && (next!=buff[i].mem_end) )
Packit Service b98cfc
                        next++;
Packit Service b98cfc
                listtemp[0]='\0';
Packit Service b98cfc
                *next='\0';
Packit Service b98cfc
Packit Service b98cfc
#ifdef DEBUG        
Packit Service b98cfc
                printf("%s\n",current_line);
Packit Service b98cfc
#endif                
Packit Service b98cfc
                if(strlen(current_line)>MAX_LINE_LENGTH)
Packit Service b98cfc
                        as_exit("Parse error: Line exceeds allowable limit");
Packit Service b98cfc
                strcpy(&string[0],current_line);
Packit Service b98cfc
Packit Service b98cfc
                done = parse(string,current_line);
Packit Service b98cfc
		if(listing){
Packit Service b98cfc
			if(done==1 &&include_depth!=1)
Packit Service b98cfc
				sprintf(listtemp,"Exiting included file");
Packit Service b98cfc
			if(done!=-3)
Packit Service b98cfc
				fprintf(listfile,"%-50s ||   %s\n",listtemp,current_line);
Packit Service b98cfc
			}
Packit Service b98cfc
			
Packit Service b98cfc
		*next='\n';
Packit Service b98cfc
		
Packit Service b98cfc
                if(done==1)
Packit Service b98cfc
			goto done;
Packit Service b98cfc
		
Packit Service b98cfc
                if(next!=buff[i].mem_end){
Packit Service b98cfc
                        source_line_num++;
Packit Service b98cfc
                        next++;
Packit Service b98cfc
                }
Packit Service b98cfc
                
Packit Service b98cfc
                current_line=next;
Packit Service b98cfc
        }
Packit Service b98cfc
        
Packit Service b98cfc
        if(done==0)
Packit Service b98cfc
                printf("warning no END directive at end of file %s\n",name);
Packit Service b98cfc
done:        
Packit Service b98cfc
        source_line_num=backup_line_num;
Packit Service b98cfc
        file_num=backup_file_num;
Packit Service b98cfc
Packit Service b98cfc
        include_depth--;
Packit Service b98cfc
       
Packit Service b98cfc
        
Packit Service b98cfc
#ifdef DEBUG	
Packit Service b98cfc
  	printf("File %s closed:\n",name);
Packit Service b98cfc
#endif
Packit Service b98cfc
        return;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
void as_exit(const char *message)
Packit Service b98cfc
{
Packit Service b98cfc
        int i;
Packit Service b98cfc
        
Packit Service b98cfc
        if(macro_line_num!=0)
Packit Service b98cfc
                fprintf(stderr, "** Error while expanding macro at line %d\n",macro_line_num);
Packit Service b98cfc
                
Packit Service b98cfc
        if(source_line_num!=0)
Packit Service b98cfc
                fprintf(stderr, "** %s.\n** line number %d:\n %s\nIn file: %s\n", message, source_line_num,current_line,buff[file_num].name);
Packit Service b98cfc
        else
Packit Service b98cfc
                fprintf(stderr, "** Error with file:%s\n",buff[file_num].name);
Packit Service b98cfc
        for(i=num_alloc-1;i>=0;i--)
Packit Service b98cfc
                free(ptralloc[i]);
Packit Service b98cfc
        
Packit Service b98cfc
	exit(1);
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void output_tram_line(struct list_head *line_head, int type)
Packit Service b98cfc
{
Packit Service b98cfc
        struct tram *tram_sym;
Packit Service b98cfc
        struct list_head *entry;
Packit Service b98cfc
Packit Service b98cfc
        list_for_each(entry, line_head ){
Packit Service b98cfc
        
Packit Service b98cfc
                tram_sym=list_entry(entry,struct tram,tram);
Packit Service b98cfc
        
Packit Service b98cfc
                if(tram_sym->type==type){
Packit Service b98cfc
                	u32 val;
Packit Service b98cfc
                        //printf("table read:%s,%x\n",tram_sym->data.name,tram_sym->data.address);
Packit Service b98cfc
                        tram_sym->data.address-=TRAM_ADDR_BASE;
Packit Service b98cfc
                        fwrite(&(tram_sym->data.address),sizeof(u8),1,fp);
Packit Service b98cfc
                        val = __cpu_to_le32(tram_sym->data.value);
Packit Service b98cfc
                        fwrite(&val,sizeof(u32),1,fp);
Packit Service b98cfc
			if(listing){
Packit Service b98cfc
				if(type==TYPE_TRAM_ADDR_READ)
Packit Service b98cfc
					fprintf(listfile,"\tRead");
Packit Service b98cfc
				else
Packit Service b98cfc
					fprintf(listfile,"\tWrite");
Packit Service b98cfc
			
Packit Service b98cfc
					fprintf(listfile,": 0x3%02x/0x2%02x (%s), offset 0x%07x\n",tram_sym->data.address,tram_sym->data.address,
Packit Service b98cfc
						(prev_sym((&tram_sym->list)))->data.name,tram_sym->data.value);
Packit Service b98cfc
			}
Packit Service b98cfc
			
Packit Service b98cfc
                }
Packit Service b98cfc
        }
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
//creates output header
Packit Service b98cfc
void header(void)
Packit Service b98cfc
{
Packit Service b98cfc
        int i;
Packit Service b98cfc
        struct sym *sym;
Packit Service b98cfc
       
Packit Service b98cfc
        extern struct list_head sym_head;
Packit Service b98cfc
	struct list_head *entry;
Packit Service b98cfc
	if(listing)
Packit Service b98cfc
		fprintf(listfile,"Patch name: \"%s\"\n\n",patch_name);
Packit Service b98cfc
	
Packit Service b98cfc
	//patch signature
Packit Service b98cfc
		   //1234567890123456
Packit Service b98cfc
	fprintf(fp, "EMU10K1 FX8010 1");
Packit Service b98cfc
	
Packit Service b98cfc
	//patchname
Packit Service b98cfc
        fwrite(patch_name,sizeof(char), PATCH_NAME_SIZE,fp);
Packit Service b98cfc
Packit Service b98cfc
        
Packit Service b98cfc
        fwrite(&gpr_input_count,sizeof(u8),1,fp);
Packit Service b98cfc
        //write ins/outs
Packit Service b98cfc
Packit Service b98cfc
	if(listing)
Packit Service b98cfc
		fprintf(listfile,"*****************************GPR******************************\n");
Packit Service b98cfc
        list_for_each(entry,&sym_head){
Packit Service b98cfc
                sym=list_entry(entry,struct sym,list);
Packit Service b98cfc
                if(sym->type==GPR_TYPE_INPUT){
Packit Service b98cfc
                        sym->data.address-=GPR_BASE;
Packit Service b98cfc
                        fwrite(&(sym->data.address),sizeof(u8),1,fp);
Packit Service b98cfc
			if(listing)
Packit Service b98cfc
				fprintf(listfile,"%s IN: 0x%03x, OUT: 0x%03x\n",sym->data.name,sym->data.address+GPR_BASE,sym->data.address+GPR_BASE+1);
Packit Service b98cfc
                        sym->data.address++;
Packit Service b98cfc
                        fwrite(&(sym->data.address),sizeof(u8),1,fp);
Packit Service b98cfc
		}
Packit Service b98cfc
         }
Packit Service b98cfc
               
Packit Service b98cfc
                
Packit Service b98cfc
	/* dynamic gprs */      
Packit Service b98cfc
        fwrite(&gpr_dynamic_count,sizeof(u8),1,fp);
Packit Service b98cfc
        list_for_each(entry,&sym_head){
Packit Service b98cfc
                sym=list_entry(entry,struct sym,list);
Packit Service b98cfc
                if(sym->type==GPR_TYPE_DYNAMIC) {
Packit Service b98cfc
                        sym->data.address-=GPR_BASE;
Packit Service b98cfc
                        fwrite(&(sym->data.address),sizeof(u8),1,fp);
Packit Service b98cfc
			if(listing)
Packit Service b98cfc
				fprintf(listfile,"GPR Dynamic:  0x%03x(%s)\n",sym->data.address+GPR_BASE,sym->data.name);
Packit Service b98cfc
                }
Packit Service b98cfc
        }
Packit Service b98cfc
     
Packit Service b98cfc
        
Packit Service b98cfc
        /* static gprs */
Packit Service b98cfc
	fwrite(&gpr_static_count,sizeof(u8),1,fp);
Packit Service b98cfc
       
Packit Service b98cfc
        list_for_each(entry,&sym_head){
Packit Service b98cfc
                sym=list_entry(entry,struct sym,list);
Packit Service b98cfc
                if(sym->type==GPR_TYPE_STATIC){
Packit Service b98cfc
                	u32 value;
Packit Service b98cfc
                        sym->data.address-=GPR_BASE;
Packit Service b98cfc
                        fwrite(&(sym->data.address),sizeof(u8),1,fp);
Packit Service b98cfc
                        value = __cpu_to_le32(sym->data.value);
Packit Service b98cfc
                        fwrite(&value,sizeof(u32),1,fp);
Packit Service b98cfc
			if(listing)
Packit Service b98cfc
				fprintf(listfile,"GPR Static:  0x%03x(%s), Value:0x%08x\n",sym->data.address+GPR_BASE
Packit Service b98cfc
					,sym->data.name,sym->data.value);
Packit Service b98cfc
                }
Packit Service b98cfc
Packit Service b98cfc
        }
Packit Service b98cfc
        
Packit Service b98cfc
        /* control gprs */
Packit Service b98cfc
        fwrite(&gpr_control_count,sizeof(u8),1,fp);
Packit Service b98cfc
         
Packit Service b98cfc
      
Packit Service b98cfc
        list_for_each(entry,&sym_head){
Packit Service b98cfc
                sym=list_entry(entry,struct sym,list);
Packit Service b98cfc
                if(sym->type==GPR_TYPE_CONTROL){
Packit Service b98cfc
                	u32 value;
Packit Service b98cfc
                        sym->data.address-=GPR_BASE;
Packit Service b98cfc
                        fwrite(&(sym->data.address),sizeof(u8),1,fp);
Packit Service b98cfc
                        value = __cpu_to_le32(sym->data.value);			
Packit Service b98cfc
                        fwrite(&value,sizeof(u32),1,fp);
Packit Service b98cfc
                        value = __cpu_to_le32(((struct control *)sym)->min);
Packit Service b98cfc
                        fwrite(&value,sizeof(u32),1,fp);
Packit Service b98cfc
                        value = __cpu_to_le32(((struct control *)sym)->max);
Packit Service b98cfc
                        fwrite(&value,sizeof(u32),1,fp);
Packit Service b98cfc
                       
Packit Service b98cfc
                        fwrite(&(sym->data.name), sizeof(char), MAX_SYM_LEN, fp);
Packit Service b98cfc
			if(listing)
Packit Service b98cfc
				fprintf(listfile,"GPR Control: 0x%03x(%s), value:0x%08x, Min:0x%08x, Max:0x%08x\n",sym->data.address+GPR_BASE,sym->data.name,
Packit Service b98cfc
					sym->data.value,((struct control *)sym)->min,((struct control *)sym)->max);
Packit Service b98cfc
				
Packit Service b98cfc
Packit Service b98cfc
                }                
Packit Service b98cfc
        }
Packit Service b98cfc
	
Packit Service b98cfc
        /*constant GPRs*/
Packit Service b98cfc
	fwrite(&gpr_constant_count,sizeof(u8),1,fp);
Packit Service b98cfc
Packit Service b98cfc
	list_for_each(entry,&sym_head){
Packit Service b98cfc
		sym=list_entry(entry,struct sym,list);
Packit Service b98cfc
		if(sym->type==GPR_TYPE_CONSTANT){
Packit Service b98cfc
			sym->data.address-=GPR_BASE;
Packit Service b98cfc
			fwrite(&(sym->data.address),sizeof(u8),1,fp);
Packit Service b98cfc
			fwrite(&(sym->data.value),sizeof(u32),1,fp);
Packit Service b98cfc
			if(listing)
Packit Service b98cfc
				fprintf(listfile,"GPR Constant: 0x%03x(%s), Value:0x%08x\n",sym->data.address+0x100
Packit Service b98cfc
					,sym->data.name,sym->data.value);
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
	if(listing)
Packit Service b98cfc
		fprintf(listfile,"*****************************TRAM*****************************\n");
Packit Service b98cfc
Packit Service b98cfc
	/*lookup-tables*/
Packit Service b98cfc
        fwrite(&tram_table_count,sizeof(u8),1,fp);
Packit Service b98cfc
	
Packit Service b98cfc
	for(i=0;i
Packit Service b98cfc
		u32 value;
Packit Service b98cfc
		value = __cpu_to_le32(tram_lookup[i].size);
Packit Service b98cfc
                fwrite(&value,sizeof(u32),1,fp);
Packit Service b98cfc
		if(listing)
Packit Service b98cfc
			fprintf(listfile,"Lookup-table block:%s, size:0x%08x\n",(&tram_lookup[i])->name,tram_lookup[i].size);
Packit Service b98cfc
		// read lines
Packit Service b98cfc
                fwrite(&(tram_lookup[i].read),sizeof(u8),1,fp);
Packit Service b98cfc
                output_tram_line(&(tram_lookup[i].tram),TYPE_TRAM_ADDR_READ);
Packit Service b98cfc
                //write lines
Packit Service b98cfc
                fwrite(&(tram_lookup[i].write),sizeof(u8),1,fp);
Packit Service b98cfc
                output_tram_line(&(tram_lookup[i].tram),TYPE_TRAM_ADDR_WRITE);
Packit Service b98cfc
	}
Packit Service b98cfc
               
Packit Service b98cfc
	/*Delay Lines*/
Packit Service b98cfc
        fwrite(&tram_delay_count,sizeof(u8),1,fp);
Packit Service b98cfc
        for(i=0;i
Packit Service b98cfc
                
Packit Service b98cfc
                fwrite(&(tram_delay[i].size),sizeof(u32),1,fp);
Packit Service b98cfc
		if(listing)
Packit Service b98cfc
			fprintf(listfile,"Delay-line block:%s, size:0x%08x\n",tram_delay[i].name,tram_delay[i].size);
Packit Service b98cfc
                // read lines
Packit Service b98cfc
                fwrite(&(tram_delay[i].read),sizeof(u8),1,fp);
Packit Service b98cfc
                output_tram_line(&(tram_delay[i].tram),TYPE_TRAM_ADDR_READ);
Packit Service b98cfc
             
Packit Service b98cfc
                //write lines
Packit Service b98cfc
                fwrite(&(tram_delay[i].write),sizeof(u8),1,fp);
Packit Service b98cfc
                output_tram_line(&(tram_delay[i].tram),TYPE_TRAM_ADDR_WRITE);
Packit Service b98cfc
        }
Packit Service b98cfc
}