Blame as10k1/as10k1.c

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