[comp.binaries.apple2] Artworx Strip Poker II

gwyn@smoke.BRL.MIL (Doug Gwyn) (07/16/90)

/*
        strypt -- encrypts/decrypts an Artworx "Strip Poker II" image file
                for Apple IIGS

        Last edit:      08-Jul-1990     Douglas A. Gwyn <Gwyn@BRL.MIL>

        Usage:  strypt [-z] old new

        This program copies an Apple IIGS Strip Poker Data Disk image file,
        decoding the pixel data in scan lines 0 through 146.  If the -z
        option is used, it will also set all scan-line control bytes and the
        pixels in scan lines 147 through 199 to 0 in the output file; this
        is useful when decrypting a file preparatory to translating it to
        some other image file format such as GIF.  The encryption scheme is
        self-inverse; i.e., the same program can be used (without the -z
        option) for either encryption or decryption of Artworx image files;
        presumably Artworx uses a similar program to encrypt their files
        before putting them on their Data Disks.

        These files contain uncompressed SHR images, normally assigned Apple
        File Type $C1, Auxiliary Type $0000; however, for maximum
        portability this program does not set the file type of its output
        file, which (depending on the C implementation) will probably be
        created with file type "BIN".  Hence, you may need to use a file-
        type changing utility in order to make these output files acceptable
        as input to Apple IIGS display utilities that depend too much on
        Apple's File Type scheme.  (SHRConvert 2.1 and ShowPic 4.6 do not
        require this.)

        Please note that Artworx images are NOT in the public domain and
        should therefore NOT be posted to public bulletin boards or
        information services.  I am providing this program (which itself IS
        in the public domain) as a service to Apple IIGS owners, for their
        personal use only!  There aren't many software publishers currently
        supporting the Apple IIGS; for our own self interest, we MUST
        respect the property rights of those who do support our machines.
        If somebody asks for a copy of Artworx images, give him this program
        instead and tell him to buy the Artworx Data Disks; they're cheap.

        As of this writing, the following Program and Data Disks have been
        released for the Apple IIGS:
                Strip Poker II: Suzi & Melissa
                Data Disk #1:   Morgan & Kathy
                Data Disk #2:   Samantha & Jack
                Data Disk #3:   Gina & Holly

        Artworx Strip Poker II and Strip Poker Data Disks are available from
        enlightened software distributors; if you cannot find one, try
        writing to:
                Artworx Software Company, Inc.
                1844 Penfield Road
                Penfield, New York 14526
        Be sure to commend them for supporting the Apple IIGS!
*/

#ifdef __STDC__
#include        <stdlib.h>              /* for EXIT_*, exit() */
#define RB_MODE         "rb"
#define WB_MODE         "wb"
#else
extern void     exit();
#define RB_MODE         "r"
#define WB_MODE         "w"
#endif

#include        <stdio.h>

#ifndef EXIT_SUCCESS
#define EXIT_SUCCESS    0
#endif
#ifndef EXIT_FAILURE
#define EXIT_FAILURE    (-1)            /* Suitable for APW C */
#endif

/*
        The following parameters specify IIGS Super Hi-Res addresses;
        a $C1/$0000 file is simply an exact copy of SHR address space.
*/
#define PIXELS  ((unsigned)0x2000)      /* start of pixel data (and file) */
#define TRAILER ((unsigned)0x7BE0)      /* end of Artworx encipherment */
#define PALETS  ((unsigned)0x9E00)      /* start of color palettes */

main( argc, argv )
        int     argc;
        char    *argv[];
        {
        register unsigned short w;              /* word being *crypted */
        register int            c;              /* input character */
        register unsigned short key = 0x1F2B;   /* *cryption key */
        register FILE           *ifp;           /* input stream */
        register FILE           *ofp;           /* output stream */
        unsigned                p = PIXELS;     /* -> next image byte */
        int                     zero;           /* set iff -z option */

        if ( (zero = argc > 1 && argv[1][0] == '-' && argv[1][1] == 'z') )
                ++argv, --argc;

        if ( argc != 3 )
                {
                (void)fprintf( stderr, "Usage: strypt [-z] old new\n" );
                exit( EXIT_FAILURE );
                }

        if ( (ifp = fopen( argv[1], "rb" )) == NULL )
                {
                (void)fprintf( stderr, "strypt: can't open input\n" );
                exit( EXIT_FAILURE );
                }

        if ( (ofp = fopen( argv[2], "wb" )) == NULL )
                {
                (void)fprintf( stderr, "strypt: can't open output\n" );
                exit( EXIT_FAILURE );
                }

        while ( (c = getc( ifp )) != EOF )
                {
                w = c;                  /* low byte */
                w |= getc( ifp ) << 8;  /* high byte */

                if ( (p += 2) <= TRAILER )
                        w ^= key++;
                else if ( zero && p <= PALETS )
                        w = 0;

                if ( putc( (int)w & 0xFF, ofp ) == EOF
                  || putc( (int)w >> 8, ofp ) == EOF
                   )    {
                        (void)fprintf( stderr, "strypt: write error\n" );
                        exit( EXIT_FAILURE );
                        }
                }

        (void)fflush( ofp );            /* just in case */
        return EXIT_SUCCESS;
        }