|
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 |
}
|