[comp.sys.amiga] "sign" program

deven@rpi.edu (Deven T. Corzine) (05/31/90)

This is a utility which simply converts between signed and unsigned
data by flipping the sign bit on each byte.  I specifically wrote it
when I noticed loading the binary data for the Simpsons (mac) sound
samples came out heavily distorted because unsigned data was
interpreted as signed.  When the sign bit is flipped and then the raw
data is read in, the sample sounds as it should.  [once you get the
sample playback rate right, of course.]  Clearly, this program is
intended to be run on raw sample data, not an IFF 8SVX sample; it
would scramble the IFF header information.

I'll offer credit to ronf@polya.stanford.edu (Ron Frederick) for the
idea of XORing with 0x80 instead of subtracting and truncating as the
prototype version originally did, although that was mainly because I
was too lazy to try to think through *p^=0x80 (which seemed right) at
the time, since I just wanted to try fixing the sample data.  But
whatever....  [Happy Ron? ;-)]

This is an incredibly trivial algorithm, but the implementation is
specific to the Amiga.  If someone wants to run it on Unix or a PC or
something, they can damn well write the code themselves.  After all,
you just read a buffer, XOR each byte with 0x80, and write the buffer
back out.  I wanted a small, efficient implementation for the Amiga,
and that's what this is.

Usage is simple: it reads from its standard input and writes to its
standard output.  Use shell I/O redirection to define files to read
from and write to, as in:

sign <sound.data >newsound.data

It is dynamic, using either half of total available memory or the
largest block of free memory.  After each Read() or Write(), it checks
for a Control-C break.  [Note if the buffer size is large, the single
Read() or Write() may take a noticable amount of time.]

These are the files in this posting:

-rw-r--r--  1 deven    wheel         304 May 31 12:01 sign
-rw-r--r--  1 deven    wheel        1095 May 31 12:01 sign.c

I'm not bothering to try to shar or zoo them; it's not hard to
extract.  Just uudecode the posting to get the sign binary
(executable) and edit the posting to save the source portion.

Here are the files:

-rw-r--r--  1 deven    wheel         304 May 31 12:01 sign

begin 644 sign
M   #\P         !              !#   #Z0   $-.5?_H2.<S,$/Z /9P
M "QX  1.KOW8*T#_Z&<  -I.KO]\<@!.KO\HXH N '("2$%.KO\H+ "^AF\"
M+@9*AV<  )8@!W( 3J[_.B9 ($L@"&<  (1.KO]V+&W_Z$ZN_\HB "0+)@=.
MKO_6+ !*AF]8<  B "QX  1.KO[."   #&9&)$(@0M'&*TC_]+7M__1D#G  
M$!(*0 " %(!2BF#L+&W_Z$ZN_\0B "0+)@9.KO_04H!G$G  (@ L>  $3J[^
MS@@   QGD")+( <L>  $3J[_+F *+'@ !$ZN_W9\_R)M_^A.KOYB</^\@&8$
B< I@!G  8 )P%$S?#,Q.74YU9&]S+FQI8G)A<GD    #\NA.
end

-rw-r--r--  1 deven    wheel        1095 May 31 12:01 sign.c

--------
/* sign.c - change data from unsigned to signed or vice versa */

/* by Deven Thomas Corzine 5/19/90 */

#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <proto/exec.h>
#include <proto/dos.h>

sign()
{
   register char *buf,*p,*end;
   register int bufsize,n;
   register struct DosLibrary *DOSBase;

   if (DOSBase=(struct DosLibrary *) OpenLibrary(DOSNAME,0)) {
      Forbid();
      bufsize=AvailMem(0)>>1;
      n=AvailMem(MEMF_LARGEST);
      if (bufsize>n) bufsize=n;
      if (bufsize && (buf=AllocMem(bufsize,0))) {
         Permit();
         while ((n=Read(Input(),buf,bufsize))>0) {
            if (SetSignal(0,0)&SIGBREAKF_CTRL_C) break;
            for (p=buf,end=buf+n;p<end;p++) *p^=0x80;
            if (Write(Output(),buf,n)==-1) break;
            if (SetSignal(0,0)&SIGBREAKF_CTRL_C) break;
         }
         FreeMem(buf,bufsize);
      } else {
         Permit();
         n= -1;
      }
      CloseLibrary((struct Library *) DOSBase);
      if (n==-1) return(10);
      return(0);
   }
   return(20);
}
--------

The source was compiled using Lattice C V5.04, using the following
command lines:

lc -cuist -v -ms sign.c
blink sign.o to sign sc sd nd

Final executable size was (as shown in the ls listing above) 304
bytes.  The executable is pure and reentrant, so it can safely be made
resident.  Operation speed is fairly decent.  [depends on your
processor and I/O speed, but it's not much slower than copying the
file...]

Have fun.

Deven


-- 
Deven T. Corzine        Internet:  deven@rpi.edu, shadow@pawl.rpi.edu
Snail:  2214 12th St. Apt. 2, Troy, NY 12180   Phone:  (518) 271-0750
Bitnet:  deven@rpitsmts, userfxb6@rpitsmts     UUCP:  uunet!rpi!deven
Simple things should be simple and complex things should be possible.