PROGRAM RandomCode;
USES cs65;

CONST
	MessMax = 255;
	KeySize = 10;
	CharRange = 95;
	TopCharCode = 126;

TYPE
	Message = ARRAY[1..MessMax] OF CHAR;
	KeyType = ARRAY[1..KeySize] OF INTEGER;
	
{----------------------------- Encrypt ------------------------}
PROCEDURE Encrypt(Shift : INTEGER; VAR Code: CHAR);
VAR NumCode: INTEGER;
BEGIN
NumCode := ORD(Code) + Shift;
IF NumCode > TopCharCode THEN
	NumCode := NumCode - CharRange;
Code := CHR(NumCode);
END;

{----------------------------- EncodeMessage -------------------}
PROCEDURE EncodeMessage(VAR Key   : KeyType;
                        VAR Chars : Message;
                            N     : INTEGER;
                            NKN   : INTEGER);
VAR
	Index : INTEGER;
BEGIN
FOR Index := 1 TO N DO
	Encrypt(Key[((Index-1) MOD NKN)+1], Chars[Index]);
END;

{------------------------------ Main Program -------------------}

VAR
	i, count, NumKeysNeeded  : INTEGER;
	Mess    : Message;
	Key     : KeyType;
	Letter  : CHAR;
	FileName : STRING;
	OutFile  : TEXT;
	
BEGIN
RANDOMIZE;

{Get Size of Key from User}
WRITE('Enter the number of keys to use for this encryption (max of ', KeySize:1, ') : ');
READLN(NumKeysNeeded);
WRITELN;

{Generate Random Key}
FOR i := 1 TO NumKeysNeeded DO
	Key[i] := RandomInt(CharRange-2)+1;

{Get a  Message}
WRITELN;
WRITELN('Enter your message on one line and terminate with a tilde(~).');
Count := 0;
READ(Letter);
WHILE Letter <> '~' DO
	BEGIN
		Count := Count + 1;
		Mess[Count] := Letter;
		READ(Letter)
	END;
READLN;

EncodeMessage(Key, Mess, Count, NumKeysNeeded);

{Open output file}
WRITE('Enter filename for encoded message: ');
READLN(FileName);
REWRITE(OutFile, FileName);

{Write result to the file}
FOR i := 1 TO Count DO
	WRITE(OutFile, mess[i]);
CLOSE(OutFile);

WRITELN('Coded message has been written to the file.');

END.