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

📄 ds_load.c

📁 speech signal process tools
💻 C
字号:
#ifndef IBM_RS6000/*	this is the old routine (sgs 5.0), but I claim it will work as well as *	the new stuff - alog*/static char *sccs_id = "@(#)ds_load.c	1.2 9/11/91 ESI, ATT";#include	<stdio.h>#include	"dsp32.h"#include	"ar.h"#include	<filehdr.h>#include	<scnhdr.h>#include	<ldfcn.h>#include	<syms.h>#include	<storclas.h>#define	MEMSIZE	(1<<16)/****************************************************************//*   loadfile() loads the COFF file into memory.  Each section	*//* is loaded into memory starting at the physical address	*//* designated in the section header.				*//*   In addition, it gets rid of any (assembler source) labels	*//* currently in the hashed symbol table of symbols.c and scans	*//* the symbol table of the COFF	file for labels, adding them	*//* to symbols.c's table.  These labels, in the command language,*//* are treated as constants, their value equaling the DSP3	*//* address they represent.					*//****************************************************************/dspld( DSP, filename )char *filename;{	return dsplds( DSP, filename, (SYMBOL**)0 );}dsplds( DSP, filename, syms )int DSP;char *filename;SYMBOL syms[];{	register LDFILE		*ldptr;	FILHDR			filhdr;	SCNHDR			secthdr;	register unsigned	sec_no;	register long		addr,				sect_end;	register long		size = 0L;	register int		i;	SYMENT			se;	char			lbl_buf[10];	if( (ldptr=ldopen(filename,NULL)) == NULL ) {		fprintf(stderr,"Can't open %s as object file\n", filename);		return( -1 );	}	ldfhread( ldptr, &filhdr );	if (HEADER(ldptr).f_magic != DSP32MAGICNEW) {		fprintf(stderr,"%s doesn't look like object file; magic=%#o\n",			filename, HEADER(ldptr).f_magic);		ldclose(ldptr);		return (-1);	}	dsprg(DSP,C_WRITE|C_PCR,0x1a);		/* DMA, auto increment */	dsprg(DSP,C_PIR);			/* put it into halted state */for( sec_no=1; sec_no <= HEADER(ldptr).f_nscns; sec_no++ ) {	ldshread( ldptr, sec_no, &secthdr );	sect_end = secthdr.s_paddr + secthdr.s_size;	if( sect_end > MEMSIZE ) {	    fprintf(stderr, "Object section %d outside address range",sec_no);	    ldclose(ldptr);	    return( -1 );	}	size += secthdr.s_size;	if (size > MEMSIZE) {	    fprintf(stderr,"Sum of section sizes too large (%ld) to section number %d",size,sec_no);	    ldclose(ldptr);	    return(-1);	}	if(secthdr.s_name[0] == '\0')		continue; /* <== <== */	if( secthdr.s_scnptr > 0 ) {		ldsseek( ldptr, sec_no );		{		  extern int dsp_fp;			short buf[512];			register int cnt = secthdr.s_size;			register int addr = secthdr.s_paddr;			register int i,n;			while ( cnt!=0 ) {				if ( (n=cnt) > 1024 )					n = 1024;				FREAD(buf,2,n>>1,ldptr);				swab(buf,buf,n);				if ( dspwr(DSP,addr,buf,n) != n ) {					ldclose(ldptr);					return(-1) ;				}				cnt -= n;				addr += n;			}		  }	} else {		/* HANDLES ".BSS"-type SEGMENTS */			short buf[512];			register int n, cnt = secthdr.s_size;			register int addr = secthdr.s_paddr;			for(n=0; n<512; buf[n++]=0 );			while ( cnt!= 0 ) {				if ( (n=cnt) > 1024 )					n = 1024;				if ( dspwr(DSP,addr,buf,n) != n ) {					ldclose(ldptr);					return(-1);				}				cnt -= n;				addr += n;			}		  }	}	/********************************************************/	/* READ IN SYMBOL TABLE:				*/	/********************************************************/	if ( syms ) {	ldtbseek(ldptr);	for(i=0 ; i < (int) HEADER(ldptr).f_nsyms ; ++i) {		SYMBOL *ptr;		if(FREAD( (char *)&se, SYMESZ, 1, ldptr) != 1) {			fprintf(stderr,"Can't read sym tab entry %d\n", i);			return 0;		}		if( se.n_type == 0 || se.n_sclass != C_EXT)			continue;		if(se.n_scnum == 0) {			fprintf(stderr,"Undefined label:\"%.8s\"\n",se.n_name);			continue;		}		for ( ptr = syms; *(ptr->name); ptr++ )			if ( strcmp( se.n_name, ptr->name ) == 0 ) {				ptr->value = se.n_value;				break;			}	}	}	ldaclose( ldptr );	return 0;}#endif

⌨️ 快捷键说明

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