*** empty log message ***
authorkeie <none@none>
Fri, 1 Mar 1985 10:30:23 +0000 (10:30 +0000)
committerkeie <none@none>
Fri, 1 Mar 1985 10:30:23 +0000 (10:30 +0000)
mach/pmds/cv/cv.c [new file with mode: 0644]

diff --git a/mach/pmds/cv/cv.c b/mach/pmds/cv/cv.c
new file mode 100644 (file)
index 0000000..8bfe40d
--- /dev/null
@@ -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 <stdio.h>
+
+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 ;
+}