From: keie Date: Fri, 1 Mar 1985 10:30:23 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: release-5-5~5591 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=9d9c9ae97b968e8313c2d9675fd16a926c831a73;p=ack.git *** empty log message *** --- diff --git a/mach/pmds/cv/cv.c b/mach/pmds/cv/cv.c new file mode 100644 index 000000000..8bfe40df8 --- /dev/null +++ b/mach/pmds/cv/cv.c @@ -0,0 +1,161 @@ +/* + * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. + * + * This product is part of the Amsterdam Compiler Kit. + * + * Permission to use, sell, duplicate or disclose this software must be + * obtained in writing. Requests for such permissions may be sent to + * + * Dr. Andrew S. Tanenbaum + * Wiskundig Seminarium + * Vrije Universiteit + * Postbox 7161 + * 1007 MC Amsterdam + * The Netherlands + * + */ + +/* + * The assumption is that this program is run on the same machine the + * assembler has run. So the assembler's idea of long fits cv's idea. + * The long's produced in the output file have the m68000 format. + * The idea's of the longs read in can be changed with the following + * flags: + * -v Vax longs + * -p Pdp 11 longs + * -m M68000 longs + */ + +#include + +char * prog ; + +char flag ; + +#define HDR_LENGTH 40 + +char hdr[HDR_LENGTH] ; + +main(argc,argv) char **argv; { + long addr,maxaddr; + short count; + + maxaddr=0; + if ( argc>1 && argv[1][0]=='-' ) { + flag=argv[1][1] ; + argc-- ; argv++ ; + } + if (argc != 3) { + fprintf(stderr,"Usage: %s [-[vpm]] VU-a.out pmds-a.out\n",argv[0]); + exit(-1); + } + prog=argv[0] ; + if (freopen(argv[1],"r",stdin)==NULL) { + fprintf(stderr,"%s: ",prog) ; + perror(argv[1]); + exit(-1); + } + if (freopen(argv[2],"w",stdout)==NULL) { + fprintf(stderr,"%s: ",prog) ; + perror(argv[2]); + exit(-1); + } + while ( getaddr(&addr) && getcnt(&count) ) { + fseek(stdout,addr+HDR_LENGTH,0); + while (count--) { + putchar(getchar()); + if ( ferror(stdout) ) { + fprintf(stderr,"%s: write error\n",prog) ; + unlink(argv[2]) ; /* remove the output */ + exit(2) ; + } + addr++; + } + if (addr>maxaddr) + maxaddr = addr; + } + sethdr(0,0410L) ; /* Magic */ + sethdr(8,maxaddr) ; + fseek(stdout,0L,0); + fwrite(hdr,sizeof(hdr),1,stdout); + if ( ferror(stdout) ) { + fprintf(stderr,"%s: write error\n",prog) ; + unlink(argv[2]) ; /* remove the output */ + exit(2) ; + } + chmod(argv[2],0755); + return 0; +} + +getaddr(p_addr) long *p_addr ; { + char in[4] ; + short out[4] ; + int i ; + + switch ( fread(in,1,4,stdin) ) { + case 0 : return 0 ; + case 4 : break ;; + default : fprintf(stderr,"%s: Illegal input format\n",prog) ; + return 0 ; + } + switch ( flag ) { + case 0 : *p_addr = *((long *)in) ; + return 1 ; + case 'v' : + out[0]=in[0] ; out[1]=in[1] ; + out[2]=in[2] ; out[3]=in[3] ; + break ; + case 'm' : + out[0]=in[3] ; out[1]=in[2] ; + out[2]=in[1] ; out[3]=in[0] ; + break ; + case 'p' : + out[0]=in[2] ; out[1]=in[3] ; + out[2]=in[0] ; out[3]=in[1] ; + break ; + default : + fprintf(stderr,"%s: Unknown conversion %c(%o)\n", + prog,flag,flag) ; + exit(-1) ; + } + for ( i=0 ; i<4 ; i++ ) out[i] &= 0xFF ; + *p_addr = 256 * ( 256 * ( 256 * out[3] + out[2] ) + out[1] ) + out[0]; + return 1 ; +} + +getcnt(p_cnt) unsigned *p_cnt ; { + char in[2] ; + short out[2] ; + int i ; + + switch ( fread(in,1,2,stdin) ) { + case 2 : break ;; + default : fprintf(stderr,"%s: Illegal input format\n",prog) ; + return 0 ; + } + switch ( flag ) { + case 0 : *p_cnt = *((short *)in) ; + return 1 ; + case 'v' : + case 'p' : + out[0]=in[0] ; out[1]=in[1] ; + break ; + case 'm' : + out[0]=in[1] ; out[1]=in[0] ; + break ; + default : + fprintf(stderr,"%s: Unknown conversion %c(%o)\n", + prog,flag,flag) ; + exit(-1) ; + } + for ( i=0 ; i<2 ; i++ ) out[i] &= 0xFF ; + *p_cnt = 256 * out[1] + out[0] ; + return 1 ; +} + +sethdr(off,val) long val ; { + hdr[off] = val>>24 ; + hdr[off+1] = val>>16 ; + hdr[off+2] = val>>8 ; + hdr[off+3] = val ; +}