📄 ds_load.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, §hdr ); 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 + -