0 CLS:SCREEN 0:CLEAR:PRINT:PRINT" CFRJMK M2.0  by James Main Kenney 1997":PRINT:PRINT"     Distribute exact copies freely":PRINT:PRINT:PRINT"At (letter) prompts press only ENTER for default; ESC to rerun or exit":PRINT:DEFSTR A-I:DEFINT J-Z:GOTO 40
1 IF A>""THEN IF EOF(1)OR IK=CHR$(27)THEN RETURN ELSE P=ASC(INPUT$(1,1))ELSE IF P=13 THEN P=10 ELSE P=ASC(INPUT$(1)):IF P=27 THEN RETURN
2 N=(P+224)AND 255:IF T THEN T=1+(N-1)\90:N=N-(T-1)*90 ELSE IF N>94 THEN 1
3 M=N:IF T THEN IF T<>U THEN M=90+T
4 FOR JL=0 TO K MOD SL:GOSUB 20:NEXT:Z!=Z!+1:M=(L+K-M)MOD L:Q=M+32:IF T=0 THEN IF M>90 THEN U=M-90:GOTO 1 ELSE Q=(Q+(U-1)*90)AND 255:P=Q
5 IF C>""THEN PRINT#3,CHR$(Q);
6 IF T THEN IF T<>U THEN U=T:GOTO 3
7 IF SC THEN W!=W!+1:M!=M!+M:N!=N!+N:Q!=Q!+M^2:R!=R!+N^2:P!=P!+M*N
8 Y!=Y!+1:SP=(SP+P)MOD L:IK=INKEY$:IF IK=""THEN IF S=1 THEN 1 ELSE IF S=0 THEN PRINT CHR$(P);:GOTO 1 ELSE IF S<5 THEN LOCATE 21,23:PRINT Y!
9 IF S=2 THEN LOCATE 3,1:PRINT G:LOCATE 15,1:PRINT F ELSE IF S=4 THEN PSET(K MOD L,K\L):PSET(109+(K AND 127),K\128):PSET(251+(K AND 63),K\64)
10 IF S=3 THEN PSET(N+1,M+1):IF W!>1 AND (KC OR IK>""OR EOF(1))THEN U!=SQR((W!*Q!-M!^2)*(W!*R!-N!^2)):IF U!THEN LOCATE 15,22:PRINT CSNG((W!*P!-M!*N!)/U!);SPACE$(6):LOCATE 17,13:PRINT W!
11 IF S=5 THEN TL=(TL+1)MOD L:PSET(TL,K MOD L):TA=(TA+1)MOD 81:PSET(99+TA,K MOD L):TB=(TB+1)MOD 69:PSET(184+TB,K MOD L):TC=(TC+1)MOD 59:PSET(257+TC,K MOD L):TV=TV+1:OV=OV+TV\(SW-SB):TV=TV MOD (SW-SB):PSET(TV,96+K MOD L)
12 IF IK=""OR IK=CHR$(27)THEN 1 ELSE IF IK<>" "THEN J=INSTR("CPBSOKT=cpbsokt",IK)MOD 8:IF J=1 AND S=3 THEN KC=KC+1 AND 1:GOTO 14 ELSE IF J>1 THEN S=J-2 ELSE IF S=3 THEN 1 ELSE IF S=5 THEN IF SB THEN SB=0 ELSE SB=(SW-TV)MOD SW:IF OV=0 THEN 1
13 TL=0:TA=0:TB=0:TC=0:TV=0:OV=0:CLS:IF SC=0 AND S>2 THEN SCREEN 1:SW=320:SC=1
14 IF S=2 THEN LOCATE 1,1:PRINT"Keystring:":LOCATE 13,1:PRINT"Fontstring:"ELSE IF S=3 THEN LOCATE 15,1:PRINT"Correlation coeff. = ":PRINT:PRINT"Data pairs: ":PRINT"Key C toggles auto/manual":IF KC THEN PRINT SPACE$(26)ELSE PRINT"ENTER updates correlation
15 IF S>1 AND S<5 THEN LOCATE 21,1:PRINT"Plaintext characters: ":PRINT"Spacebar clears screen":PRINT"Keys P,B,S,O,K,T change display
16 GOTO 1
20 IF UA THEN K=K+SP
21 IF RG THEN K=K+INT(L*RND(1))
22 IF X THEN IF EOF(2)THEN GOSUB 30
23 IF X THEN K=K+ASC(INPUT$(1,2)):X!=X!+1
24 IF W THEN K=K+ASC(MID$(G,Z MOD W+1,1)):K=K+ASC(MID$(G,K MOD W+1,1)):MID$(G,Z MOD W+1)=CHR$(K MOD L+32)
25 IF F>""THEN K=K+ASC(MID$(F,K MOD L+1,1)):J=K MOD(L-Z MOD L)+1:I=MID$(F,J,1):F=LEFT$(F,J-1)+RIGHT$(F,L-J)+I:K=K+ASC(I)+J
26 K=K AND 8191:Z=(Z AND 16383)+1:RETURN
30 CLOSE 2:OPEN B FOR INPUT AS 2:X=X+1:XM!=X!:X!=0:RETURN
40 ON ERROR GOTO 100:L=95:D="Plaintext file":E="Ciphertext file":PRINT:PRINT"(E)ncrypt or (D)ecrypt";:I="DdEe":GOSUB 80:IF J THEN CLS:IF J>2 THEN T=1:H=" encrypt"ELSE F=D:D=E:E=F:H=" decrypt"ELSE BEEP:GOTO 40
41 FILES:PRINT D" to"H"? ";:LINE INPUT A:IF A>""THEN OPEN A FOR INPUT AS 1 ELSE IF T=0 THEN ERROR 49
42 G="To change, edit line 42 in the ASCII version of this program and replace this statement with random  characters (247 max; no double quotes), or replace temporarily (or add to) from a file.  Do not alter length if editing after program is compiled.
43 CLS:PRINT"Resident keytext:  "G:PRINT"   Use as is or:":PRINT"   (C)ut length":PRINT"   (A)dd to from file":PRINT"   (S)ubstitute from file":PRINT"   (N)o resident keytext";:I="CASN=casn":GOSUB 80:J=J MOD 5
44 IF J=1 THEN PRINT"   Cut from"LEN(G)"characters to";:INPUT W:IF W>0 THEN G=LEFT$(G,W):GOTO 43 ELSE 43 ELSE CLS:IF J>2 THEN G="
45 IF J=2 OR J=3 THEN FILES:LINE INPUT"Resident keytext file? ";B:IF B=""THEN 42 ELSE OPEN B FOR INPUT AS 2:WHILE EOF(2)=0 AND LEN(G)<255:G=G+INPUT$(1,2):WEND:CLOSE 2:GOTO 43
46 FILES:LINE INPUT"Keyfile? ";B:IF B=""THEN CLS:GOTO 49 ELSE INPUT"   Skip 0 characters";SK!:PRINT"   (F)or fontstring only";:I="FfYy":GOSUB 80:O=J:IF T THEN INPUT"   Add 0 random characters to keyfile";M:IF M THEN OPEN B FOR APPEND AS 2
47 IF M THEN PRINT"   Tap keys randomly; (ESC) ends":F=INPUT$(1):WHILE N<M AND I<>CHR$(27):I="":WHILE I="":J=(J+INT(L*RND))MOD L:PRINT CHR$(J+32);:I=INKEY$:WEND:N=N+1:W=(W+J+ASC(I))MOD L:F=CHR$(W+32):PRINT#2,F;:COLOR 0,7:PRINT" "F;N;:COLOR 7,0:WEND
48 GOSUB 30:GOSUB 90:CLS
49 FILES:PRINT E"? ";:LINE INPUT C:IF C>""THEN OPEN C FOR OUTPUT AS 3 ELSE IF T THEN ERROR 49
50 CLS:PRINT"(N)o autokey";:I="Nn":GOSUB 80:UA=J:PRINT"(U)se pseudorandom generator";:I="UuYy":GOSUB 80:RG=J:INPUT"Security level 1";SL:IF SL<1 THEN SL=1
51 IF A>""THEN PRINT:PRINT"Display plaintext or:":PRINT"(B)lank screen":PRINT"(S)trings":PRINT"(O)ut-in":PRINT"(K)ey":PRINT"(T)ime-key";:I="BSOKT=bsokt":GOSUB 80:S=J MOD 6:IF S=3 THEN PRINT"   (C)ontinuous correlation";:I="CcYy":GOSUB 80:IF J THEN KC=1
52 IF S>2 THEN SW=320:INPUT"   Screen 1 for pixel plot";SC:IF SC=0 THEN SC=1 ELSE IF SC=2 OR SC=4 OR (SC>7 AND SC<13)THEN SW=640
53 N=0:K=0:PRINT:LINE INPUT"Passwords? ";F:V=LEN(F):IF V THEN FOR J=1 TO V:M=ASC(MID$(F,J,1)):N=M+N AND 16383:K=M*(1+(J AND 63))+K AND 16383:NEXT:PRINT V"chrs; chk:"N;K;CHR$(N MOD L+32);CHR$(K MOD L+32)" (R)edo";:I="RrYy":GOSUB 80:IF J THEN 53
54 IF G=""THEN G=F
55 W=LEN(G):M=W:IF V=0 THEN F=G:V=W ELSE IF V>W THEN M=V
56 IF M THEN PRINT:PRINT"Keystring:":FOR J=1 TO M:K=K+ASC(MID$(G,J MOD W+1,1))+ASC(MID$(F,J MOD V+1,1)):K=K+ASC(MID$(F,K MOD V+1,1)):K=K+ASC(MID$(G,K MOD W+1,1)):I=CHR$(K MOD L+32):GF=GF+I:PRINT I;:K=(K+ASC(MID$(GF,K MOD J+1,1)))AND 8191:NEXT
57 IF M THEN W=M:G=GF:GF="":F="":PRINT:PRINT"   (F)or fontstring only";:I="FfYy":GOSUB 80:IF J THEN 59 ELSE UF=1
58 IF O=0 THEN PRINT"(N)o fontstring";:I="Nn":GOSUB 80:IF J THEN 63
59 FOR J=32 TO 126:F=F+CHR$(J):NEXT:CLS:PRINT"Fontstring:  "F:INPUT"   3 permutations";P:IF P=0 THEN P=3
60 FOR N=1 TO P:PRINT"Pmt"N"of"STR$(P)":  ";:PA=0:PS=0:Q=0:FOR V=1 TO L:GOSUB 20:PRINT I;:U=SGN(ASC(I)-PA):PA=ASC(I):IF V>1 AND U<>PS THEN Q=Q+1:PS=U
61 NEXT:PRINT:PRINT Q"runs";:T!=T!+Q:IF N>1 THEN M!=T!/N:S!=S!+(Q-M!)^2:PRINT"; mean:"M!" ssd:"CSNG(SQR(S!/(N-1)))ELSE PRINT
62 NEXT
63 IF X THEN X=0:IF O=0 THEN GOSUB 30:GOSUB 90
64 U=1:W=W*UF:Z=0:IF S THEN CLS ELSE PRINT:PRINT"Plaintext";:IF A=""THEN BEEP:PRINT"?  (ESC) ends"ELSE PRINT":
65 IF S>2 THEN SCREEN SC:IF S=3 THEN FOR N=0 TO 1:FOR J=0 TO 77:PSET(J+J\4,N*96):NEXT:FOR J=0 TO 76:PSET(N*96,J+(J+1)\4+1):NEXT:NEXT
66 PRINT:BE=TIME$:GOSUB 14:EE=TIME$:BEEP:CLOSE:E!=3600*(VAL(EE)-VAL(BE))+60*(VAL(MID$(EE,4,2))-VAL(MID$(BE,4,2)))+VAL(RIGHT$(EE,2))-VAL(RIGHT$(BE,2)):IF S OR C=""THEN I=INPUT$(1)
67 CLS:PRINT"Began"H"ion "BE:PRINT"Ended"H"ion "EE:PRINT"Run time:";:IF E!>0 THEN PRINT E!"seconds"ELSE PRINT 86400+E!"seconds
68 PRINT:PRINT Y!"plaintext chrs; check:"SP+32;CHR$(SP+32):PRINT Z!"ciphertext chrs":IF X THEN PRINT:PRINT"Keyfile "B" used to chr"X!"on cycle"X:IF X>1 THEN PRINT"Keyfile size:"XM!"chrs"ELSE XM!=X!:PRINT"Keyfile not reused
69 IF A=""THEN 71 ELSE PRINT:PRINT"(O)verwrite "D" "A;:I="OoYy":GOSUB 80:IF J=0 THEN 71
70 PRINT"   Wait":OPEN A FOR OUTPUT AS 1:FOR J!=1 TO Z!:PRINT#1," ";:NEXT:CLOSE:KILL A:IF C>""THEN PRINT"   (R)ename "E;C" as "A;:I="RrYy":GOSUB 80:IF J THEN NAME C AS A
71 IF X THEN PRINT:PRINT"(O)verwrite keyfile "B;:I="OoYy":GOSUB 80:IF J THEN PRINT:PRINT"Wait":OPEN B FOR OUTPUT AS 2:FOR J!=1 TO XM!:PRINT#2," ";:NEXT:CLOSE:KILL B
72 PRINT:PRINT"(R)erun";:I="RrYy":GOSUB 80:IF J THEN 0 ELSE SYSTEM
80 PRINT"? ";:CH=INPUT$(1):PRINT CH:J=INSTR(I,CH):IF CH=CHR$(27)THEN 72 ELSE RETURN
90 IF SK!=0 THEN RETURN ELSE PRINT:PRINT"Wait":PRINT:FOR J!=1 TO SK!:IF EOF(2)THEN GOSUB 30
91 I=INPUT$(1,2):X!=X!+1:NEXT:RETURN
100 BEEP:IF ERR=6 THEN PRINT"Overflow":RESUME ELSE IF ERR=7 THEN PRINT"Out of memory":RESUME 67 ELSE IF ERR=49 THEN PRINT"Need ciphertext file"ELSE IF ERR=53 OR ERR=55 OR ERR=58 OR ERR=64 THEN PRINT"Name error"ERR
101 IF ERL=30 OR ERL=47 THEN RESUME 46 ELSE IF ERL=41 THEN RESUME 41 ELSE IF ERL=45 THEN RESUME 45 ELSE IF ERL=49 THEN RESUME 49 ELSE IF ERL=65 THEN SC=1:SW=320:RESUME 65 ELSE PRINT"Error"ERR"in line"ERL:RESUME NEXT
