/***************************************************************************
 *									   *
 *			       FILEENCRYPT  				   *
 *									   *
 *     Encrypts & Decrypts any file, you like to hide from curiosity...    *
 *									   *
 *       Public Domain, by Lorenz Wiest during 30th Jul - 7th Aug '90	   *
 *									   *
 ***************************************************************************/

#define TOPY 11 
#define WIDTH 272
#define HEIGHT 155
#define ENCRYPT 0
#define DECRYPT 1

#include "exec/types.h"
#include "exec/memory.h"
#include "intuition/intuition.h"
#include "graphics/gfx.h"
#include "graphics/gfxmacros.h"
#include "libraries/dos.h"

struct IntuitionBase *IntuitionBase = NULL;
struct GfxBase       *GfxBase       = NULL;
struct IntuiMessage  *Nachricht     = NULL;
struct Window        *Window        = NULL;
struct Remember      *MyRememberKey = NULL;
struct RastPort      *WRast         = NULL;

struct NewWindow NewWindow = { 130,30,WIDTH,HEIGHT,0,1,CLOSEWINDOW|GADGETUP,
                               WINDOWDEPTH|WINDOWDRAG|WINDOWCLOSE|ACTIVATE,
                               0,0," FileEncrypt ",0,0,0,0,0,0,WBENCHSCREEN };
ULONG Copy2Chip();

#define INTRO 1
#define MODUS 2
#define READ  3
#define WRITE 4
#define KEYWD 5
#define ERROR 6

char ReadFile[50]="DF1:\0";
char WriteFile[50]="DF1:\0";
char KeyWord[40]="\0";
char UndoString[40];
int CurrentMode = ENCRYPT;
int Frame=INTRO;
int NextFrame;

struct Gadget *Adr;
struct Gadget *FirstGad = NULL;
int            GadgetNumber= 0;

UWORD SleepD[] = { 0x0000,0x0000,0x0600,0x0600,0x0f40,0x0f40,0x3fe0,0x3fe0,
                   0x7fe0,0x7fe0,0x61f0,0x7ff0,0x7bf8,0x7ff8,0xf7f8,0xfff8,
                   0x61fc,0x7ffc,0x7f0c,0x7ffc,0x3fde,0x3ffe,0x7fbc,0x7ffc,
                   0x3f0c,0x3ffc,0x1ff8,0x1ff8,0x07f0,0x07f0,0x01c0,0x01c0,
                   0x0700,0x0700,0x0fc0,0x0fc0,0x0680,0x0680,0x0000,0x0000,
                   0x00c0,0x00c0,0x00e0,0x00e0,0x0040,0x0040,0x0000,0x0000 };

UWORD Icon1D[] = { 0xE310,0x0001,0x0000,0x0000,0x0000,0x0000,0x003D,0x0017,
                   0x0005,0x0003,0x0001,0x00C0,0xBFC0,0x0000,0x0000,0x0000,
                   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
                   0x0400,0x00C4,0x5DC6,0x0001,0x8C88,0x8000,0x0000,0x8000,
                   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
                   0x0000,0x003D,0x0017,0x0002,0x0001,0x68E8,0x0300,0x0000,
                   0x0000,0x0000,0x0000,0x0000,0x0000,0x0007,0xFFFF,0xF980,
                   0x0000,0x0007,0xFFFF,0xF9E0,0x0000,0x0000,0x07FF,0xF9F8,
                   0x0000,0x003F,0xF07F,0xF9FE,0x0000,0x01D5,0x5E3F,0xF800,
                   0x0000,0x06BF,0xEB81,0xFFFF,0x8000,0x0FFF,0xFDDC,0x0000,
                   0x0000,0x181F,0xFEFF,0xFFFF,0xFF80,0x300F,0xFF60,0x0000,
                   0x03E0,0x300F,0xFF7F,0xFFFF,0xFFC0,0x300F,0xFF7F,0xFFFF,
                   0xFE00,0x181F,0xFEFF,0xCE47,0x3000,0x0FFF,0xFDDC,0x0000,
                   0x0000,0x06BF,0xEB81,0xFFFF,0x8000,0x01D5,0x5E3F,0xFFFF,
                   0x8000,0x003F,0xF0FF,0xC00F,0x8000,0x0000,0x07FF,0xFFFF,
                   0x8000,0x0007,0xFFFF,0xFFFF,0x8000,0x0000,0x0000,0x0000,
                   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
                   0x0000,0x0000,0x0000,0x0000,0x0000,0x001F,0xFFFF,0xFF80,
                   0x0000,0x0018,0x0000,0x0660,0x0000,0x0018,0x0000,0x0618,
                   0x0000,0x003F,0xF800,0x0606,0x0000,0x03FF,0xFF80,0x0601,
                   0x8000,0x0FFF,0xFFC0,0x07FF,0xE000,0x1FFF,0xFFFE,0x0000,
                   0x6000,0x3FFF,0xFFFF,0xFFFF,0xFFC0,0x7FFF,0xFFFF,0xFFFF,
                   0xFFF0,0xFF7F,0xFFFF,0xFFFF,0xFFF8,0xFE3F,0xFFFF,0xFFFF,
                   0xFFF0,0xFF7F,0xFFFF,0xFFFF,0xFFE0,0x7FFF,0xFFFF,0xFFFF,
                   0xFF00,0x3FFF,0xFFFF,0xFFFF,0xF800,0x1FFF,0xFFFE,0x0000,
                   0x6000,0x0FFF,0xFFC0,0x0000,0x6000,0x03FF,0xFF00,0x3FF0,
                   0x6000,0x007F,0xF800,0x0000,0x6000,0x0018,0x0000,0x0000,
                   0x6000,0x001F,0xFFFF,0xFFFF,0xE000,0x0000,0x0000,0x0000,
                   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
                   0x0000,0x0000,0x0001,0x0000,0x0000,0x0800,0x0000,0x0100 };

UWORD Icon2D[] = { 0xE310,0x0001,0x0000,0x0000,0x0000,0x0000,0x0028,0x0016,
                   0x0005,0x0003,0x0001,0x00C0,0xD5B8,0x0000,0x0000,0x0000,
                   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
                   0x0400,0x00C8,0x7B4E,0x0001,0x7D40,0x8000,0x0000,0x8000,
                   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
                   0x0000,0x0028,0x0016,0x0002,0x0001,0x6A58,0x0300,0x0000,
                   0x0000,0x0000,0x0000,0x0000,0x3FFF,0xFFCC,0x0000,0x3FFF,
                   0xFFCF,0x0000,0x3FFF,0xFFCF,0xC000,0x3803,0xFFCF,0xF000,
                   0x3FFF,0xFFC0,0x0000,0x3803,0xFFFF,0xFC00,0x3FFF,0xFFFF,
                   0xFC00,0x3FFF,0xFFFF,0xFC00,0x3F84,0x00C0,0x7C00,0x3FFF,
                   0xFFFF,0xFC00,0x3900,0x8000,0x7C00,0x3FFF,0xFFFF,0xFC00,
                   0x3800,0x0040,0x7C00,0x3FFF,0xFFFF,0xFC00,0x3FFF,0xFFFF,
                   0xFC00,0x3FFF,0xFE00,0x7C00,0x3FFF,0xFFFF,0xFC00,0x3FFF,
                   0xFFFF,0xFC00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
                   0x0000,0x0000,0x0000,0xFFFF,0xFFFC,0x0000,0xC000,0x0033,
                   0x0000,0xC000,0x0030,0xC000,0xC000,0x0030,0x3000,0xC7FC,
                   0x0030,0x0C00,0xC000,0x003F,0xFF00,0xC7FC,0x0000,0x0300,
                   0xC000,0x0000,0x0300,0xC000,0x0000,0x0300,0xC07B,0xFF3F,
                   0x8300,0xC000,0x0000,0x0300,0xC6FF,0x7FFF,0x8300,0xC000,
                   0x0000,0x0300,0xC7FF,0xFFBF,0x8300,0xC000,0x0000,0x0300,
                   0xC000,0x0000,0x0300,0xC000,0x01FF,0x8300,0xC000,0x0000,
                   0x0300,0xC000,0x0000,0x0300,0xFFFF,0xFFFF,0xFF00,0x0000,
                   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x0000,
                   0x0000,0x0800,0x0000,0x0100 };

UWORD CheckOnD[2][12][2] = {
    {   0xffff,0x0fff,0xf80c,0xf3ff,0xc3e3,0xe2ff,0x9dcf,0x057f,
        0x1ebc,0x2aff,0x2f72,0x55ff,0x37ee,0x2fff,0x9bdc,0x57ff,
        0xc1a0,0xafff,0xf805,0x5fff,0xfeaa,0xbfff,0xffd5,0xffff },
    {   0x0000,0xf000,0x07f3,0xfc00,0x3c1f,0xfd00,0x7e3f,0xfa80,
        0xff7f,0xd500,0xdffd,0xaa00,0xcff1,0xd000,0x67e3,0xa800,
        0x3fdf,0x5000,0x07fa,0xa000,0x0155,0x4000,0x002a,0x0000 }, };

UWORD CheckOffD[2][12][2] = {
    {   0xffff,0xffff,0xf80f,0xffff,0xc3e1,0xffff,0x9ffc,0xffff,
        0x3ffe,0x3fff,0x3ffe,0x5fff,0x3ffe,0x2fff,0x9ffc,0x57ff,
        0xc3e0,0xafff,0xf805,0x5fff,0xfeaa,0xbfff,0xffd5,0xffff },
    {   0x0000,0x0000,0x07f0,0x0000,0x3c1e,0x0000,0x6003,0x0000,
        0xc001,0xc000,0xc001,0xa000,0xc001,0xd000,0x6003,0xa800,
        0x3c1f,0x5000,0x07fa,0xa000,0x0155,0x4000,0x002a,0x0000 }, };

UWORD KeyDottedD[2][17][5] = {
    {   0xaabf,0xffaa,0xaaaa,0xaaaa,0x8000,0x55f0,0x01f5,0x5555,
        0x5555,0x0000,0xaf0f,0xfc3a,0xaaaa,0xaaaa,0x8000,0x5c75,
        0x578f,0xd555,0x5555,0x0000,0xb9af,0xfae0,0x7fff,0xfffa,
        0x8000,0x73ff,0xff77,0x0000,0x000f,0x0000,0xe607,0xffbf,
        0xffff,0xffe3,0x8000,0xcc73,0xffd8,0x0000,0x00f9,0x8000,
        0xccfb,0xffdf,0xffff,0xfff3,0x8000,0xcc73,0xffdf,0xffff,
        0xff87,0x0000,0xe607,0xffbf,0xf391,0xcc3e,0x8000,0x73ff,
        0xff77,0x0000,0x01f5,0x0000,0xb9af,0xfae0,0x7fff,0xffaa,
        0x8000,0x5c75,0x578f,0xd555,0x5555,0x0000,0xaf0f,0xfc3a,
        0xaaaa,0xaaaa,0x8000,0x55e0,0x01f5,0x5555,0x5555,0x0000,
        0xaabf,0xffaa,0xaaaa,0xaaaa,0x8000 },
    {   0x5540,0x0055,0x5555,0x5555,0x0000,0xaa0f,0xfe0a,0xaaaa,
        0xaaaa,0x8000,0x50ff,0xffc5,0x5555,0x5555,0x0000,0xa3ff,
        0xfff0,0x2aaa,0xaaaa,0x8000,0x47ff,0xffff,0x8000,0x0005,
        0x0000,0x8fff,0xffff,0xffff,0xfff0,0x8000,0x1fff,0xffff,
        0xffff,0xfffc,0x0000,0x3f8f,0xffff,0xffff,0xfffe,0x0000,
        0x3f07,0xffff,0xffff,0xfffc,0x0000,0x3f8f,0xffff,0xffff,
        0xfff8,0x8000,0x1fff,0xffff,0xffff,0xffc1,0x0000,0x8fff,
        0xffff,0xffff,0xfe0a,0x8000,0x47ff,0xffff,0x8000,0x0055,
        0x0000,0xa3ff,0xfff0,0x2aaa,0xaaaa,0x8000,0x50ff,0xffc5,
        0x5555,0x5555,0x0000,0xaa1f,0xfe0a,0xaaaa,0xaaaa,0x8000,
        0x5540,0x0055,0x5555,0x5555,0x0000 }, };

UWORD NoKeyDottedD[2][29][4] = {
    {   0x5555,0x557f,0xff55,0x5555,0xaaaa,0xafc0,0x01fa,0xaaaa,
        0x5555,0x783f,0xfe0f,0x5555,0xaaab,0xc7ff,0xfff1,0xeaaa,
        0x5557,0x3fff,0xfffe,0x7555,0xaaac,0xffff,0xffff,0x9eaa,
        0x555b,0xfff8,0x03ff,0xe755,0xabf0,0x0ffd,0xfc3f,0xfbaa,
        0x570f,0xfffe,0xffc7,0xfdd5,0xac75,0x57ff,0x7ff9,0xfeea,
        0x59af,0xffff,0xbffe,0xff3d,0xb3ff,0xffff,0xc000,0x000e,
        0x6607,0xffff,0xefff,0xffe3,0xcc73,0xffff,0xf000,0x00f9,
        0xccfb,0xffff,0xfbff,0xfff3,0xcc73,0xffdf,0xfdff,0xff86,
        0x6607,0xffbf,0xfe11,0xcc3d,0xb3ff,0xff7d,0xff00,0x016a,
        0x59af,0xfae0,0xffbe,0xff75,0xac75,0x578f,0x7fd9,0xfeea,
        0x570f,0xfc3f,0xbfe7,0xfdd5,0xabe0,0x001f,0xdfff,0xfbaa,
        0x557b,0xffe0,0x07ff,0xe755,0xaaac,0xffff,0xffff,0x9eaa,
        0x5557,0x3fff,0xfffe,0x7555,0xaaab,0xc7ff,0xfff1,0xeaaa,
        0x5555,0x783f,0xfe0f,0x5555,0xaaaa,0xafc0,0x01fa,0xaaaa,
        0x5555,0x557f,0xff55,0x5555 },
    {   0xaaaa,0xaa80,0x00aa,0xaaaa,0x5555,0x503f,0xfe05,0x5555,
        0xaaaa,0x87ff,0xfff0,0xaaaa,0x5554,0x3fff,0xfffe,0x1555,
        0xaaa8,0xffff,0xffff,0x8aaa,0x5553,0xffff,0xffff,0xe155,
        0xaaa7,0xffff,0xffff,0xf8aa,0x540f,0xf7fe,0x03ff,0xfc55,
        0xa8f0,0x03ff,0x003f,0xfe2a,0x538a,0xa9ff,0x8007,0xff15,
        0xa650,0x00ff,0xc001,0xffc2,0x4c00,0x007f,0xffff,0xfff1,
        0x99f8,0x003f,0xf000,0x001c,0x33fc,0x001f,0xffff,0xff06,
        0x33fc,0x000f,0xfc00,0x000c,0x33fc,0x0027,0xfe00,0x0079,
        0x99f8,0x0043,0xffee,0x33c2,0x4c00,0x0083,0xffff,0xff95,
        0xa650,0x051f,0xffc1,0xff8a,0x538a,0xa870,0xffe7,0xff15,
        0xa8f0,0x03c0,0x7fff,0xfe2a,0x541f,0xffe0,0x3fff,0xfc55,
        0xaa87,0xffff,0xffff,0xf8aa,0x5553,0xffff,0xffff,0xe155,
        0xaaa8,0xffff,0xffff,0x8aaa,0x5554,0x3fff,0xfffe,0x1555,
        0xaaaa,0x87ff,0xfff0,0xaaaa,0x5555,0x503f,0xfe05,0x5555,
        0xaaaa,0xaa80,0x00aa,0xaaaa }, };

UWORD KeyBlankD[2][15][4] = {
    {   0xffc0,0x07ff,0xffff,0xfff8,0xfc3f,0xf0ff,0xffff,0xfff8,
        0xf1d5,0x5e3f,0xffff,0xfff8,0xe6bf,0xeb81,0xffff,0xfff8,
        0xcfff,0xfddc,0x0000,0x0038,0x981f,0xfeff,0xffff,0xff88,
        0x31cf,0xff60,0x0000,0x03e0,0x33ef,0xff7f,0xffff,0xffc8,
        0x31cf,0xff7f,0xffff,0xfe18,0x981f,0xfeff,0xce47,0x30f8,
        0xcfff,0xfddc,0x0000,0x07f8,0xe6bf,0xeb81,0xffff,0xfff8,
        0xf1d5,0x5e3f,0xffff,0xfff8,0xfc3f,0xf0ff,0xffff,0xfff8,
        0xff80,0x07ff,0xffff,0xfff8 },
    {   0x003f,0xf800,0x0000,0x0000,0x03ff,0xff00,0x0000,0x0000,
        0x0fff,0xffc0,0x0000,0x0000,0x1fff,0xfffe,0x0000,0x0000,
        0x3fff,0xffff,0xffff,0xffc0,0x7fff,0xffff,0xffff,0xfff0,
        0xfe3f,0xffff,0xffff,0xfff8,0xfc1f,0xffff,0xffff,0xfff0,
        0xfe3f,0xffff,0xffff,0xffe0,0x7fff,0xffff,0xffff,0xff00,
        0x3fff,0xffff,0xffff,0xf800,0x1fff,0xfffe,0x0000,0x0000,
        0x0fff,0xffc0,0x0000,0x0000,0x03ff,0xff00,0x0000,0x0000,
        0x007f,0xf800,0x0000,0x0000 }, };

UWORD NoKeyBlankD[2][27][4] = {
    {   0xffff,0xff00,0x07ff,0xfff8,0xffff,0xe0ff,0xf83f,0xfff8,
        0xffff,0x1fff,0xffc7,0xfff8,0xfffc,0xffff,0xfff9,0xfff8,
        0xfff3,0xffff,0xfffe,0x7ff8,0xffef,0xffe0,0x0fff,0x9ff8,
        0xffc0,0x3ff7,0xf0ff,0xeff8,0xfc3f,0xfffb,0xff1f,0xf7f8,
        0xf1d5,0x5ffd,0xffe7,0xfbf8,0xe6bf,0xfffe,0xfffb,0xfcf8,
        0xcfff,0xffff,0x0000,0x0038,0x981f,0xffff,0xbfff,0xff88,
        0x31cf,0xffff,0xc000,0x03e0,0x33ef,0xffff,0xefff,0xffc8,
        0x31cf,0xff7f,0xf7ff,0xfe18,0x981f,0xfeff,0xf847,0x30f8,
        0xcfff,0xfdf7,0xfc00,0x05f8,0xe6bf,0xeb83,0xfefb,0xfdf8,
        0xf1d5,0x5e3d,0xff67,0xfbf8,0xfc3f,0xf0fe,0xff9f,0xf7f8,
        0xff80,0x007f,0x7fff,0xeff8,0xffef,0xff80,0x1fff,0x9ff8,
        0xfff3,0xffff,0xfffe,0x7ff8,0xfffc,0xffff,0xfff9,0xfff8,
        0xffff,0x1fff,0xffc7,0xfff8,0xffff,0xe0ff,0xf83f,0xfff8,
        0xffff,0xff00,0x07ff,0xfff8 },
    {   0x0000,0x00ff,0xf800,0x0000,0x0000,0x1fff,0xffc0,0x0000,
        0x0000,0xffff,0xfff8,0x0000,0x0003,0xffff,0xfffe,0x0000,
        0x000f,0xffff,0xffff,0x8000,0x001f,0xffff,0xffff,0xe000,
        0x003f,0xdff8,0x0fff,0xf000,0x03c0,0x0ffc,0x00ff,0xf800,
        0x0e2a,0xa7fe,0x001f,0xfc00,0x1940,0x03ff,0x0007,0xff00,
        0x3000,0x01ff,0xffff,0xffc0,0x67e0,0x00ff,0xc000,0x0070,
        0xcff0,0x007f,0xffff,0xfc18,0xcff0,0x003f,0xf000,0x0030,
        0xcff0,0x009f,0xf800,0x01e0,0x67e0,0x010f,0xffb8,0xcf00,
        0x3000,0x020f,0xffff,0xfe00,0x1940,0x147f,0xff07,0xfe00,
        0x0e2a,0xa1c3,0xff9f,0xfc00,0x03c0,0x0f01,0xffff,0xf800,
        0x007f,0xff80,0xffff,0xf000,0x001f,0xffff,0xffff,0xe000,
        0x000f,0xffff,0xffff,0x8000,0x0003,0xffff,0xfffe,0x0000,
        0x0000,0xffff,0xfff8,0x0000,0x0000,0x1fff,0xffc0,0x0000,
        0x0000,0x00ff,0xf800,0x0000 }, };

UWORD ObenRechtsD[2][4][1] = {
      { 0x2a00,0x0400,0xc200,0xf000 },{ 0xd400,0xfa00,0x3c00,0x0e00 }, };

UWORD ObenLinksD[2][4][1] = {
      { 0xa800,0x5000,0x8600,0x1e00 },{ 0x5600,0xae00,0x7800,0xe000 }, };

UWORD UntenLinksD[2][4][1] = {
      { 0x9e00,0x4600,0xa000,0x5400 }, { 0x6000,0xb800,0x5e00,0xaa00 }, };

UWORD UntenRechtsD[2][4][1] = {
      { 0xf200,0xc400,0x0a00,0x5400 }, { 0x0c00,0x3a00,0xf400,0xaa00 }, };

UWORD SprechZapfenD[2][9][2] = {
    {   0x0001,0xffc0,0xaaa9,0xffc0,0x5551,0xffc4,0xaaa9,0xff88,
        0x5553,0xfe14,0xaa87,0xf828,0x551f,0xc154,0xa878,0x0aa8,
        0x0000,0x5554 },
    {   0xfffe,0x003c,0x5556,0x003c,0xaaae,0x0038,0x5556,0x0074,
        0xaaac,0x01e8,0x5578,0x07d4,0xaae0,0x3ea8,0x5787,0xf554,
        0xffff,0xaaa8 }, };

UWORD FileEncryptLabelD[2][15][10] = {
    {   0x060e,0x1e0f,0xfffc,0x183f,0xffff,0xffff,0xffff,0xffff,
        0xffc7,0xc000,0x878e,0x1f0f,0xfffe,0x1e3f,0xffff,0xffff,
        0xffff,0xffff,0xff87,0xc000,0x87cf,0xff0f,0xfffe,0x1f3f,
        0xffff,0xffff,0xffff,0xffff,0xff87,0xc000,0x87fc,0x1f0f,
        0xc61e,0x1ff0,0x61f8,0x6383,0x1c0e,0x060c,0x1e06,0x0000,
        0x873e,0x1f0f,0x8f0e,0x1cf8,0x70f0,0xe1c3,0x0e1f,0x0f0f,
        0x0f87,0xc000,0x863e,0x1f0f,0x0f0e,0x18f8,0x70e1,0xffc3,
        0xfe1f,0x0f0f,0x8787,0xc000,0x863e,0x1f0f,0x0f0e,0x18f8,
        0x70e1,0xffc3,0xff0f,0x0f0f,0x8787,0xc000,0x873e,0x1f0f,
        0x0e0e,0x1cf8,0x70e1,0xffc3,0xff8f,0x0f0f,0x8787,0xc000,
        0x87fe,0x1f0f,0x0ffe,0x1ff8,0x70e1,0xffc3,0xff87,0x1f0f,
        0x8787,0xc000,0x87fe,0x1f0f,0x0ffe,0x1f38,0x70e1,0xf1c3,
        0xffc3,0x1f0f,0x8787,0xc000,0x87fe,0x1f0f,0x8f0e,0x1e38,
        0x70f0,0xe1c3,0xffe6,0x1f0f,0x0f86,0x0000,0x03fc,0x0e07,
        0xc61c,0x1830,0x2078,0x6381,0xfffe,0x3f0c,0x1fc6,0x4000,
        0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xff8c,0x3f0f,
        0xffff,0xc000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
        0xff80,0x7f0f,0xffff,0xc000,0xffff,0xffff,0xffff,0xffff,
        0xffff,0xffff,0xffc0,0xfe03,0xffff,0xc000 },
    {   0xf9f1,0xe1f0,0x0003,0xe7c0,0x0000,0x0000,0x0000,0x0000,
        0x0038,0x0000,0x7871,0xe0f0,0x0001,0xe1c0,0x0000,0x0000,
        0x0000,0x0000,0x0078,0x0000,0x7830,0x00f0,0x0001,0xe0c0,
        0x0000,0x0000,0x0000,0x0000,0x0078,0x0000,0x7803,0xe0f0,
        0x39e1,0xe00f,0x9e07,0x9c7c,0xe3f1,0xf9f3,0xe1f9,0xc000,
        0x78c1,0xe0f0,0x70f1,0xe307,0x8f0f,0x1e3c,0xf1e0,0xf0f0,
        0xf078,0x0000,0x79c1,0xe0f0,0xf0f1,0xe707,0x8f1e,0x003c,
        0x01e0,0xf0f0,0x7878,0x0000,0x79c1,0xe0f0,0xf0f1,0xe707,
        0x8f1e,0x003c,0x00f0,0xf0f0,0x7878,0x0000,0x78c1,0xe0f0,
        0xf1f1,0xe307,0x8f1e,0x003c,0x0070,0xf0f0,0x7878,0x0000,
        0x7801,0xe0f0,0xf001,0xe007,0x8f1e,0x003c,0x0078,0xe0f0,
        0x7878,0x0000,0x7801,0xe0f0,0xf001,0xe0c7,0x8f1e,0x0e3c,
        0x003c,0xe0f0,0x7878,0x0000,0x7801,0xe0f0,0x70f1,0xe1c7,
        0x8f0f,0x1e3c,0x0019,0xe0f0,0xf079,0xc000,0xfc03,0xf1f8,
        0x39e3,0xe7cf,0xdf87,0x9c7e,0x0001,0xc0f3,0xe039,0x8000,
        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0073,0xc0f0,
        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
        0x007f,0x80f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
        0x0000,0x0000,0x003f,0x01fc,0x0000,0x0000 }, };

struct Image CheckOn      ={0,-1,25,12,2,NULL,3,0,NULL};
struct Image CheckOff     ={0,-1,25,12,2,NULL,3,0,NULL};
struct Image   KeyDotted  ={0,0,65,17,2,NULL,3,0,NULL};
struct Image NoKeyDotted  ={1,0,64,29,2,NULL,3,0,NULL};
struct Image   KeyBlank   ={9,10,61,15,2,NULL,3,0,NULL};
struct Image NoKeyBlank   ={11,4,61,27,2,NULL,3,0,NULL};
struct Image FileEncryptLabel={0,0,146,15,2,NULL,3,0,NULL};
struct Image SprechZapfen ={ 83,118,30,9,2,NULL,3,0,NULL};
struct Image UntenRechts  ={249,115, 7,4,2,NULL,3,0,&SprechZapfen};
struct Image UntenLinks   ={ 15,115, 7,4,2,NULL,3,0,&UntenRechts};
struct Image ObenRechts   ={249, 19, 7,4,2,NULL,3,0,&UntenLinks};
struct Image ObenLinks    ={ 15, 19, 7,4,2,NULL,3,0,&ObenRechts};

UWORD *SleepPointer;

OpenImages()
 {
  CheckOn.ImageData      =Copy2Chip(sizeof(CheckOnD)/2    ,&CheckOnD[0]);
  CheckOff.ImageData     =Copy2Chip(sizeof(CheckOffD)/2    ,&CheckOffD[0]);
  KeyDotted.ImageData    =Copy2Chip(sizeof(KeyDottedD)/2    ,&KeyDottedD[0]);
  NoKeyDotted.ImageData  =Copy2Chip(sizeof(NoKeyDottedD)/2  ,&NoKeyDottedD[0]);
  KeyBlank.ImageData     =Copy2Chip(sizeof(KeyBlankD)/2     ,&KeyBlankD[0]);
  NoKeyBlank.ImageData   =Copy2Chip(sizeof(NoKeyBlankD)/2   ,&NoKeyBlankD[0]);
  FileEncryptLabel.ImageData=Copy2Chip(sizeof(FileEncryptLabelD)/2,&FileEncryptLabelD[0]);
  SprechZapfen.ImageData =Copy2Chip(sizeof(SprechZapfenD)/2 ,&SprechZapfenD[0]);
  UntenRechts.ImageData  =Copy2Chip(sizeof(UntenRechtsD)/2  ,&UntenRechtsD[0]);
  UntenLinks.ImageData   =Copy2Chip(sizeof(UntenLinksD)/2   ,&UntenLinksD[0]);
  ObenLinks.ImageData    =Copy2Chip(sizeof(ObenLinksD)/2    ,&ObenLinksD[0]);
  ObenRechts.ImageData   =Copy2Chip(sizeof(ObenRechtsD)/2   ,&ObenRechtsD[0]);
  SleepPointer           =Copy2Chip(sizeof(SleepD)/2        ,&SleepD[0]);
 }

#define CANCELB  0
#define OKB      1
#define ENCRYPTB 2
#define DECRYPTB 3
#define TEXTB    4
#define CREATEB  5

#define ITEXT(x,y,text,n) {2,0,JAM1,(x),(y),NULL,(text),(n)}
#define DEFGADGET(x,y,w,h,text,id) {0,(x),(y),(w),(h),GADGHCOMP,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,0,0,(text),0,0,(id),0}

struct IntuiText OKText = ITEXT(21,2,"OK",NULL);
struct Gadget OKButton  = DEFGADGET(105,100,57,11,&OKText,OKB);

struct IntuiText CANCELText = ITEXT(6,2,"Cancel",NULL);
struct Gadget CANCELButton  = DEFGADGET(173,100,57,11,&CANCELText,CANCELB);

struct StringInfo TEXTInfo = {NULL, &UndoString[0], 4, 40,0, 0,0,0,0,0,0,0,0};
struct Gadget TEXTButton   = {NULL, 31, 58, 208, 8, GADGHCOMP, GADGIMMEDIATE|RELVERIFY,
                              STRGADGET, NULL, NULL, NULL, 0, &TEXTInfo, TEXTB, NULL};

struct IntuiText ENCRYPTText = ITEXT(11,33,"Encrypt",NULL),
                 DECRYPTText = ITEXT(11,33,"Decrypt",NULL);
struct Gadget DECRYPTButton  = {0,147,54,79,45,GADGIMAGE|GADGHCOMP,GADGIMMEDIATE|RELVERIFY,
                                BOOLGADGET,&NoKeyBlank,0,&DECRYPTText,0,0,DECRYPTB,0};
struct Gadget ENCRYPTButton  = {0, 41,54,79,45,GADGIMAGE|GADGHCOMP,GADGIMMEDIATE|RELVERIFY,
                                BOOLGADGET,&KeyBlank,0,&ENCRYPTText,0,0,ENCRYPTB,0};

struct IntuiText CREATEText  = ITEXT(31,1,"Create Icon",NULL);
struct Gadget CREATEButton   = {NULL, 77, 78, 16, 8, GADGHIMAGE|GADGIMAGE|SELECTED,
                                TOGGLESELECT|GADGIMMEDIATE|RELVERIFY,
                                BOOLGADGET, &CheckOff, &CheckOn, &CREATEText, 0, NULL, CREATEB, NULL};

Encrypt(Buffer, Length)
 UBYTE *Buffer;
 ULONG Length;
 {
  /*** TOP SECRET ***/
 }

Decrypt(Buffer, Length)
 UBYTE *Buffer;
 ULONG Length;
 {
  /*** TOP SECRET ***/
 }

#define ERROR_MEMORY_IS_LOW    71
#define ERROR_CANT_OPEN_FILE   72 
#define ERROR_CANT_CREATE_FILE 73 

struct IntuiText TextErr3 = ITEXT(38,71,NULL,NULL);
struct IntuiText TextErr2 = ITEXT(37,71,NULL,&TextErr3);
struct IntuiText TextErr  = ITEXT(37,43,"Sorry, an error happened:",&TextErr2);

Error(Number, Frame)
 int Number, Frame;
 { static char ErrMemory[] = "Not Enough Memory.\0",
               ErrNoOpen[] = "Can't Open File.\0",
               ErrNoCrea[] = "Can't Create File.\0",
               ErrNotFou[] = "File Not Found.\0";

  NextFrame=Frame;
  switch(Number)
   { case ERROR_MEMORY_IS_LOW   : TextErr2.IText=TextErr3.IText=&ErrMemory[0];  break;
     case ERROR_CANT_OPEN_FILE  : TextErr2.IText=TextErr3.IText=&ErrNoOpen[0];  break;
     case ERROR_CANT_CREATE_FILE: TextErr2.IText=TextErr3.IText=&ErrNoCrea[0];  break;
    break;
   }
  switch(IoErr())
   { case ERROR_OBJECT_NOT_FOUND: TextErr2.IText=TextErr3.IText=&ErrNotFou[0]; break;
     break;
   }
  SwitchToFrame(ERROR);
 }

FileLoadAndSave(Mode)
 int Mode;
 { struct FileLock *MyLock;
   struct FileInfoBlock *MyFIB;
   struct FileHandle *MyReadHandle;
   struct FileHandle *MyWriteHandle;
   char *MyBuffer;
   char IconFile[45];
   register int i;
   ULONG DataPtr, DataSize;

  SetPointer(Window, SleepPointer, 22, 15, 0,0);

  MyLock = Lock(&ReadFile[0], ACCESS_READ);
  if(MyLock==NULL)
    { Error(ERROR_OBJECT_NOT_FOUND, READ); goto LeaveIt3; }
   
  if((MyFIB=AllocMem(sizeof(struct FileInfoBlock), MEMF_CLEAR))==NULL)
    { Error(ERROR_MEMORY_IS_LOW, MODUS); goto LeaveIt2; }
  Examine(MyLock, MyFIB);

  if((MyReadHandle=Open(&ReadFile[0], MODE_OLDFILE))==NULL)
    { Error(ERROR_CANT_OPEN_FILE, READ); goto LeaveIt2; }

  if((MyBuffer=AllocMem(MyFIB->fib_Size, MEMF_CLEAR))==NULL)
    { Error(ERROR_MEMORY_IS_LOW, MODUS); goto LeaveIt2; } 
  if((Read(MyReadHandle, MyBuffer, MyFIB->fib_Size))==-1)
    { Close(MyReadHandle);
      Error(ERROR_CANT_OPEN_FILE, READ);
      goto LeaveIt; }
  Close(MyReadHandle);

  if(Mode==ENCRYPT) Encrypt(MyBuffer, MyFIB->fib_Size);
               else Decrypt(MyBuffer, MyFIB->fib_Size);

  if((MyWriteHandle=Open(&WriteFile[0], MODE_NEWFILE))==NULL)
    { Error(ERROR_CANT_CREATE_FILE, WRITE); goto LeaveIt; }
  if((Write(MyWriteHandle, MyBuffer, MyFIB->fib_Size))==-1)
    { Close(MyWriteHandle);
      DeleteFile(&WriteFile[0]);
      Error(ERROR_CANT_CREATE_FILE, WRITE);
      goto LeaveIt; }
  Close(MyWriteHandle);

  /**** Here we create the Icon - if desired - ****/

  if(CREATEButton.Flags & SELECTED)
   { for(i=0; WriteFile[i]!=0; i++) IconFile[i]=WriteFile[i];
     CopyMem(".info\0",&IconFile[i],5);

     if((MyWriteHandle=Open(&IconFile[0], MODE_NEWFILE))==NULL)
       { Error(ERROR_CANT_CREATE_FILE, WRITE); goto LeaveIt; }

                         DataPtr = &Icon1D[0]; DataSize = sizeof(Icon1D);
     if(Mode==DECRYPT) { DataPtr = &Icon2D[0]; DataSize = sizeof(Icon2D); }

     if((Write(MyWriteHandle, DataPtr, DataSize))==-1)
       { Close(MyWriteHandle);
         DeleteFile(&IconFile[0]);
         DeleteFile(&WriteFile[0]);
         Error(ERROR_CANT_CREATE_FILE, WRITE);
         goto LeaveIt; }
     Close(MyWriteHandle);
    }

  /**** Finish of Icon section ****/

  SwitchToFrame(MODUS);
LeaveIt:
  FreeMem(MyBuffer,MyFIB->fib_Size);
LeaveIt2:
  FreeMem(MyFIB,sizeof(struct FileInfoBlock));
LeaveIt3:
  UnLock(MyLock);
 }


Do_Gadget(FrameNr, Button)
int FrameNr, Button;
 { static struct IntuiText Text4e={2,1,JAM2,24,35,0,"  What about your Keyword ? " ,NULL};
   register int i;

  switch(FrameNr)
   { case INTRO : SwitchToFrame(MODUS); break;
     case MODUS : CurrentMode=ENCRYPT;
                  if(Button==DECRYPTB) CurrentMode=DECRYPT;
                  SwitchToFrame(READ); break;
     case READ  : if(Button==OKB) { for(i=0; ReadFile[i]!=0; i++)
                                      WriteFile[i]=ReadFile[i];
                                    CopyMem(".ENCRYPT\0",&WriteFile[i],9);
                                    if(CurrentMode==DECRYPT)
                                      CopyMem("DE",&WriteFile[i+1],2);
                                    SwitchToFrame(KEYWD);
                                  };
                  if(Button==CANCELB) SwitchToFrame(MODUS);
                  break;
     case KEYWD : if(Button==OKB) { if(TEXTInfo.NumChars<1)
                                      { PrintIText(WRast, &Text4e, 0, 0);
                                        ActivateGadget(&TEXTButton, Window, NULL);
                                      }
                                     else SwitchToFrame(WRITE);
                                  };
                  if(Button==CANCELB) SwitchToFrame(READ);
                  break;
     case WRITE : if(Button==CANCELB) SwitchToFrame(KEYWD);
                  if(Button==OKB) FileLoadAndSave(CurrentMode);
                  break;
     case ERROR : if(Button==OKB) SwitchToFrame(NextFrame);
                  break;
     break;
    }
 }

LinkGadgets(Nr, Gad1, Gad2, Gad3, Gad4)
 int Nr;
 struct Gadget *Gad1, *Gad2, *Gad3, *Gad4;
 {
  if(Nr>=1) AddGadget(Window, Gad1, 1);
  if(Nr>=2) AddGadget(Window, Gad2, 2);
  if(Nr>=3) AddGadget(Window, Gad3, 3);
  if(Nr>=4) AddGadget(Window, Gad4, 4);
  FirstGad=Gad1;
  GadgetNumber=Nr;
 }

SwitchToFrame(NewFrame)
int NewFrame;
 { static struct IntuiText
      Text15  = {3,0,JAM1,35,82,0,"Copy me, I want to travel!",NULL},
      Text14  = ITEXT(37,82,"Copy me, I want to travel!"      ,&Text15),
      Text13  = ITEXT(77,67,"D-7958 Laupheim"                 ,&Text14),
      Text12  = ITEXT(85,57,"R\366ntgenweg 12"                ,&Text13),
      Text11  = ITEXT(87,47,"Lorenz Wiest"                    ,&Text12),
      Text22  = {3,0,JAM1,186,36,0,"YOU"                      ,NULL},
      Text21  = ITEXT(44,36,"What can I do for YOU ?"         ,&Text22),
      Text31b = ITEXT(24,35,"Which file shall I decrypt ?"    ,0),
      Text31a = ITEXT(24,35,"Which file shall I encrypt ?"    ,0),
      Text41  = ITEXT(24,35,"Tell me your secret KeyWord."    ,0),
      Text52b = ITEXT(24,40,"the decrypted file ?"            ,0),
      Text52a = ITEXT(24,40,"the encrypted File ?"            ,0),
      Text51  = ITEXT(24,29,"To which fille shall I write"    ,0);

  ClearPointer(Window);
  Frame=NewFrame;
  FillBox( 1,22,23,248,114);
  FillBox(-1,20,120,83,148);
  if(FirstGad!=NULL) RemoveGList(Window, FirstGad, GadgetNumber);
  switch(Frame)
   { case INTRO : DrawImage(WRast,&FileEncryptLabel,59+8,26);
                  PrintIText(WRast,&Text11,0,0);
                  SetUpButton(&OKButton, 1, 3);       
                  LinkGadgets(1, &OKButton, 0, 0, 0);
                  break;
     case MODUS : CurrentMode=ENCRYPT;
                  PrintIText(WRast,&Text21,0,0);
                  SetUpButton(&ENCRYPTButton, 1, 2);
                  SetUpButton(&DECRYPTButton, 1, 2);
                  LinkGadgets(2, &ENCRYPTButton, &DECRYPTButton, 0, 0);
                  break;
     case READ :  if(CurrentMode==ENCRYPT) PrintIText(WRast,&Text31a,0,0);
                                      else PrintIText(WRast,&Text31b,0,0);
                  SetUpButton(&TEXTButton, 0, 2);
                  SetUpButton(&OKButton, 1, 3);
                  SetUpButton(&CANCELButton, 1, 2);
                  TEXTInfo.Buffer=&ReadFile[0];
                  LinkGadgets(3, &TEXTButton, &OKButton, &CANCELButton, 0);
                  break;
     case KEYWD : PrintIText(WRast,&Text41,0,0);
                  SetUpButton(&TEXTButton, 0, 2);
                  SetUpButton(&OKButton, 1, 3);
                  SetUpButton(&CANCELButton, 1, 2);
                  TEXTInfo.Buffer=&KeyWord[0];
                  LinkGadgets(3, &TEXTButton, &OKButton, &CANCELButton, 0);
                  break;
     case WRITE : PrintIText(WRast, &Text51, 0, 0);
                  if(CurrentMode==ENCRYPT) PrintIText(WRast,&Text52a,0,0);
                                      else PrintIText(WRast,&Text52b,0,0);
                  SetUpButton(&TEXTButton, 0, 2);
                  SetUpButton(&OKButton, 1, 3);
                  SetUpButton(&CANCELButton, 1, 2);
                  TEXTInfo.Buffer=&WriteFile[0];
                  LinkGadgets(4, &TEXTButton, &OKButton, &CANCELButton, &CREATEButton);
                  break;
     case ERROR : PrintIText(WRast,&TextErr,0,0);
                  SetUpButton(&OKButton, 1, 3);
                  LinkGadgets(1, &OKButton, 0, 0, 0);
                  break;
   break;
   } /* end of switch */

  if(CurrentMode==ENCRYPT) DrawImage(WRast,&KeyDotted,20,126);
                      else DrawImage(WRast,&NoKeyDotted,20,120);

  RefreshGadgets(FirstGad,Window,NULL);
  if(FirstGad->GadgetType==STRGADGET) ActivateGadget(FirstGad,Window,NULL);
 }

main()
 { ULONG  NachArt;
   USHORT Code;

  if ((IntuitionBase=(struct IntuitionBase *)
              OpenLibrary("intuition.library",0))==NULL) Schluss();
  if ((GfxBase=(struct GfxBase *)
              OpenLibrary("graphics.library",0))==NULL)  Schluss();

  if ((Window=(struct Window *)OpenWindow(&NewWindow))==NULL) Schluss();
  WRast=Window->RPort;

  OpenImages();
  SketchWindow();
  SwitchToFrame(INTRO);

  for (;;)
   { WaitPort(Window->UserPort);
     while(Nachricht=(struct IntuiMessage *)GetMsg(Window->UserPort))
      { NachArt=Nachricht->Class;
        Code   =Nachricht->Code;
        Adr    =Nachricht->IAddress;
        ReplyMsg(Nachricht);
        switch(NachArt)
         { case CLOSEWINDOW  : Schluss(); break;
           case GADGETUP     : Do_Gadget(Frame,Adr->GadgetID);
         } /* end of switch */
      }  /* end of if */
   }   /* end of for */
 }    /* end of main */

SketchWindow()
 {
  FillBox( 1, 0, TOPY, WIDTH, HEIGHT-1);
  FillBox( 2, 2, TOPY+1, WIDTH-3, HEIGHT-2);
  FillBox(-1, 4, TOPY+2, WIDTH-5, HEIGHT-3);
  FillBox( 2,15,     19,  256-1,118);
  FillBox( 1,17,     20,  256-1-2,118-1); 
  DrawImage(WRast,&ObenLinks,0,0);
 }

SetUpButton(Gadget, AreaCol, BorderCol)
struct Gadget *Gadget;
int BorderCol, AreaCol;
 { register int X1, Y1, X2, Y2;

  X1 = Gadget->LeftEdge;
  Y1 = Gadget->TopEdge;
  X2 = Gadget->LeftEdge+Gadget->Width-1;
  Y2 = Gadget->TopEdge+Gadget->Height-1;
  if(Gadget->GadgetType==STRGADGET) {X1-=2; Y1-=1; X2+=2; Y2+=1; };
  FillBox(-1, X1+4-2, Y1+2-1, X2+4+2, Y2+2+1);   /* RasterFill as Shadow */
  FillBox(AreaCol, X1, Y1, X2, Y2);              /* FrontArea is cleared */
  SetAPen(WRast, BorderCol);
   Move(WRast, X1+1-2, Y1-1);                    /* Draw a Button Border */
   Draw(WRast, X2-1+2, Y1-1);
   Draw(WRast, X2-1+2, Y2+1);
   Draw(WRast, X1+1-2, Y2+1);
   Draw(WRast, X1+1-2, Y1-1);
   Move(WRast, X1-2,   Y1+1-1);
   Draw(WRast, X1-2,   Y2-1+1);
   Move(WRast, X2+2,   Y1+1-1);
   Draw(WRast, X2+2,   Y2-1+1);
 }

FillBox(Color, X1, Y1, X2, Y2)
int Color, X1, Y1, X2, Y2;
 { static UWORD Pattern[]={0xaaaa,0x5555,0x5555,0xaaaa};

  if(Color>=0)
   { SetAPen(WRast, Color);
     SetBPen(WRast, Color);
     SetAfPt(WRast, NULL, 0); }
  else
   { SetAPen(WRast, 3);
     SetBPen(WRast, 0);
     SetAfPt(WRast, &Pattern, -1); }
  RectFill(WRast, X1, Y1, X2, Y2);
 }

ULONG Copy2Chip(WordCount, ArrayPnt)
 int    WordCount;
 UWORD *ArrayPnt;
 { UWORD *Zeiger;

  Zeiger=AllocRemember(&MyRememberKey,WordCount<<1,MEMF_CHIP|MEMF_CLEAR);
  CopyMem(ArrayPnt,Zeiger,WordCount<<1);
  return(Zeiger);
 }

Schluss()
 {
  FreeRemember(&MyRememberKey, TRUE);
  if(Window!=NULL)        CloseWindow(Window);
  if(GfxBase!=NULL)       CloseLibrary(GfxBase);
  if(IntuitionBase!=NULL) CloseLibrary(IntuitionBase);
  exit(0);
 }
