-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathenigma.bas
executable file
·205 lines (205 loc) · 6.87 KB
/
enigma.bas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
10 M=0: REM M=0, MODELO K. M=1 MODELO M3
20 DIM RR$(5),TU(5): REM RUEDAS, TURNOVER
30 DIM WZ(8,26): REM CONFIGURACION MAQUINA (0/8=ENTRIT;1-3,5-7 RUEDAS; 4 UKW)
40 GR=4
50 GOSUB 1460: REM LEER DATA
60 RI$="AABC":RC$="123":PO$="AABC":DIM ST(25), PS(8),RS(8):CS=1
70 FOR I=0 TO 25:ST(I)=I:NEXT I
80 GOSUB 1600: REM CONFIGURAR MAQUINA
90 GOSUB 1720: REM CONFIGURAR RINGSTELLUNG
100 GOSUB 1780: REM COLOCAR POSICION INICIAL
110 KEY 5,"NO STECKER"
120 ON KEY GOSUB 660,700,760,820,990
130 KEY ON: KEY(1)ON: KEY(2)ON:KEY(3)ON:KEY(4)ON:KEY(5)ON
140 CLS
150 PRINT"LISTO":G1=0
160 A$=INKEY$:IF A$="" GOTO 160
170 IF A$=CHR$(27) THEN END
180 V=ASC(A$)
190 IF V=13 THEN PRINT:GOTO 150
200 IF V>27 AND V<32 THEN GOSUB 1200:GOTO 160
210 V=V-65
220 IF V>31 THEN V=V-32
230 IF V<0 OR V>25 THEN GOTO 160
240 REM CODIFICAR LETRA
250 GOSUB 400: REM MOVER RUEDAS
260 GOSUB 1860: REM ACTUALIZAR POSICION
270 V=ST(V)
280 FOR I=0 TO 8
290 P1=V+PS(I)-RS(I)
300 IF P1>25 THEN P1=P1-26:GOTO 300
310 IF P1<0 THEN P1=P1+26:GOTO 310
320 V=V+WZ(I,P1)
330 IF V>25 THEN V=V-26:GOTO 330
340 IF V<0 THEN V=V+26:GOTO 350
350 NEXT I
360 V=ST(V)
370 PRINT CHR$(V+65);
380 G1=G1+1:IF G1=GR THEN G1=0:PRINT " ";
390 GOTO 160
400 REM MOVER RUEDA RAPIDA
410 IF PS(2)=TU(R2) THEN GOSUB 540:GOTO 430: REM MOVER RUEDA LENTA Y MEDIA
420 IF PS(1)=TU(R3) THEN GOSUB 480: REM MOVER RUEDA MEDIA
430 Z=PS(1):Z=Z+1
440 IF Z>25 THEN Z=0
450 PS(1)=Z:PS(7)=Z
460 IF M=0 THEN MID$(PO$,4)=CHR$(Z+65) ELSE MID$(PO$,3)=CHR$(Z+65)
470 RETURN
480 REM MOVER RUEDA DEL MEDIO
490 Z=PS(2):Z=Z+1
500 IF Z>25 THEN Z=Z-26
510 PS(2)=Z:PS(6)=Z
520 IF M=0 THEN MID$(PO$,3)=CHR$(Z+65) ELSE MID$(PO$,2)=CHR$(Z+65)
530 RETURN
540 REM MOVER RUEDA LENTA
550 Z=PS(2):Z=Z+1
560 IF Z>25 THEN Z=0
570 PS(2)=Z:PS(6)=Z
580 IF M=0 THEN MID$(PO$,3)=CHR$(Z+65) ELSE MID$(PO$,2)=CHR$(Z+65)
590 Z=PS(3):Z=Z+1
600 IF Z>25 THEN Z=Z-26
610 PS(3)=Z:PS(5)=Z
620 IF Z>25 THEN Z=0
630 IF M=0 THEN MID$(PO$,2)=CHR$(Z+65) ELSE MID$(PO$,1)=CHR$(Z+65)
640 RETURN
650 GOTO 160
660 REM CONFIGURAR RUEDAS
670 PRINT:PRINT"Introducir configuracion de ruedas:";:INPUT RC$
680 GOSUB 1600
690 RETURN 150
700 REM CONFIGURAR RINGSTELLUNG
710 PRINT:PRINT"Introducir ringstellung:";:INPUT RI$
720 L=LEN(RI$)
730 IF M=0 AND L<4 THEN PRINT "ERROR:RINGSTELLUNG NECESITA 4 LETRAS PARA ENIGMA K":FORI=0TO1000:NEXTI:RETURN
740 GOSUB 1720
750 RETURN 150
760 REM CONFIGURAR INICIO
770 PRINT:PRINT"Introducir posicion de inicio:";:INPUT PO$
780 L=LEN(PO$)
790 IF M=0 AND L<4 THEN PRINT "ERROR:POSICION NECESITA 4 LETRAS PARA ENIGMA K":FORI=0TO1000:NEXTI:RETURN
800 GOSUB 1780
810 RETURN 150
820 REM SELECIONAR TIPO DE MAQUINA
830 IF M=0 THEN M=1:GOSUB 1460 ELSE GOTO 910
840 GOSUB 1600
850 RI$=RIGHT$(RI$,3):GOSUB 1720
860 PO$=RIGHT$(PO$,3):GOSUB 1780
870 GR=5
880 KEY 5,"STECKER":CS=CS-1
890 IF CS<1THEN CS=1
900 RETURN 150
910 M=0:GOSUB 1460:IF R1>3 OR R2>3 OR R3>3 THEN RC="123":GOSUB 1600
920 FOR I=0 TO 25:ST(I)=I:NEXT I
930 RI$="A"+RI$:GOSUB 1720
940 PO$="A"+PO$:GOSUB 1780
950 GR=4
960 KEY 5,"":CS=CS+1
970 IF CS>4 THEN CS=4
980 RETURN
990 REM CONFIGURAR STECKER
1000 IF M=0 THEN PRINT:PRINT "ERROR: ENIGMA K NO USA STECKER":RETURN 160
1010 GOSUB 1150: REM IMPRIME STECKER ACTUAL
1020 PRINT:PRINT "Introducir parejas de letras separadas por espacios (EJ; AB DE GJ OK)":INPUT QQ$
1030 FOR I=0 TO 25:ST(I)=I:NEXT I
1040 Z=LEN(QQ$):IF ((Z-2)MOD3)>0 THEN PRINT "ERROR: STECKER INTRODUCIDO NO ES CORRECTO": RETURN
1050 X=(Z-2)/3
1060 FOR I=0TO X
1070 S1$=MID$(QQ$,I*3+1,1):S2$=MID$(QQ$,I*3+2,1)
1080 V1=ASC(S1$)-65:V2=ASC(S2$)-65
1090 IF V1=V2 THEN GOTO 1110
1100 IF ST(V1)<>V1 AND ST(V2)<>V2 THEN GOTO1110
1110 ST(V1)=V2:ST(V2)=V1
1120 NEXT I
1130 GOSUB 1150
1140 RETURN 150
1150 PRINT:PRINT"STECKER ACTUAL:";
1160 FOR J=0 TO 25
1170 IF ST(J)>J THEN PRINT CHR$(J+65);CHR$(ST(J)+65);" ";
1180 NEXT J
1190 PRINT:RETURN
1200 REM CAMBIO POSICION INICIO USANDO CURSORES
1210 V1=V-27
1220 ON V1 GOSUB 1300, 1240, 1330, 1390
1230 RETURN
1240 REM PULSA IZQUIERDA
1250 IF M<>0 THEN GOTO 1280
1260 IF CS<4 THEN CS=CS+1
1270 RETURN
1280 IF CS<3 THEN CS=CS+1
1290 RETURN
1300 REM PULSA DERECHA
1310 IF CS>1 THEN CS=CS-1
1320 RETURN
1330 REM PULSA ARRIBA
1340 Z=PS(CS)
1350 Z=Z+1:IF Z>25 THEN Z=0
1360 PS(CS)=Z:PS(8-CS)=Z
1370 IF M=0 THEN MID$(PO$,5-CS)=CHR$(Z+65) ELSE MID$(PO$,4-CS)=CHR$(Z+65)
1380 GOSUB1780:RETURN
1390 REM PULSA ABAJO
1400 Z=PS(CS)
1410 Z=Z-1:IF Z<0 THEN Z=25
1420 PS(CS)=Z:PS(8-CS)=Z
1430 IF M=0 THEN MID$(PO$,5-CS)=CHR$(Z+65) ELSE MID$(PO$,4-CS)=CHR$(Z+65)
1440 GOSUB1780:RETURN
1450 END
1460 REM LEER RUEDAS ENIGMA K
1470 IF M=0 THEN RESTORE 1880 ELSE RESTORE 1940
1480 READ DI$: REM DIAGONAL
1490 FOR I=0 TO 25:V=ASC(MID$(DI$,I+1,1))-65-I:WZ(8,I)=V:B=I+V
1500 IF B>26 THEN B=B-26:GOTO 1500 ELSE IF B<0 THEN B=B+26:GOTO 1500
1510 WZ(0,B)=-V
1520 NEXT I
1530 IF M=0 THEN K=3 ELSE K=5
1540 FOR I=1 TO K: READ RR$(I),T$:TU(I)=ASC(T$)-65:NEXT I
1550 READ U$
1560 FOR I=0 TO 25:V=ASC(MID$(U$,I+1,1))-65-I
1570 WZ(4,I)=V:NEXT I
1580 IF M=0 THEN KEY 4,"K" ELSE KEY 4,"M3"
1590 RETURN
1600 REM CONFIGURAR RUEDAS
1610 V1=ASC(MID$(RC$,1,1))-ASC("0"):V2=ASC(MID$(RC$,2,1))-ASC("0"):V3=ASC(MID$(RC$,3,1))-ASC("0")
1620 IF V1=V2 OR V1=V3 OR V2=V3 THEN PRINT"ERROR: TODAS LAS RUEDAS SON IGUALES":RETURN
1630 R1=V1:R2=V2:R3=V3
1640 IF V1>5 OR V2>5 OR V3>5 THEN PRINT"ERROR: RUEDAS INEXISTENTES":FORI=0TO1000:NEXTI:RETURN
1650 FOR I=1 TO 3:V=ASC(MID$(RC$,4-I,1))-ASC("0")
1660 FOR J=0 TO 25: V2=ASC(MID$(RR$(V),J+1,1))-65-J:WZ(I,J)=V2:B=J+V2
1670 IF B>25 THEN B=B-26:GOTO 1670 ELSE IF B<0 THEN B=B+26:GOTO 1670
1680 WZ(8-I,B)=-V2
1690 NEXT J:NEXT I
1700 GOSUB 1840
1710 RETURN
1720 REM CONFIGURAR RINGSTELLUNG
1730 IF M=0 THEN K=4 ELSE K=3
1740 FOR I=1 TO K:V=ASC(MID$(RI$,K-I+1,1))-65:RS(I)=V:RS(8-I)=V:NEXT I
1750 IF M<>0 THEN RS(4)=0:PS(4)=0
1760 GOSUB 1850
1770 RETURN
1780 REM POSICION INCIAL
1790 IF M=0 THEN K=4 ELSE K=3
1800 FOR I=1 TO K:V=ASC(MID$(PO$,K-I+1,1))-65:PS(I)=V:PS(8-I)=V:NEXT I
1810 IF M<>0 THEN RS(4)=0:PS(4)=0
1820 GOSUB 1860
1830 RETURN
1840 KEY 1,RC$:RETURN
1850 KEY 2,"("+RI$+")":RETURN
1860 KEY 3,PO$:RETURN
1870 REM ENIGMA K
1880 DATA "QWERTZUIOASDFGHJKPYXCVBNML": REM DIAGONAL
1890 DATA "HFOTWPDURMCGXJLQEIVZSKBNAY","Y": REM RUEDA I
1900 DATA "MUHTASIPJYNCVKLOXFDZEGQBWR","E": REM RUEDA II
1910 DATA "DKWOJVUNGLFTZCSYIBEARHXQPM","N": REM RUEDA III
1920 DATA "IMETCGFRAYSQBZXWLHKDVUPOJN": REM REFLECTOR
1930 REM ENIGMA M3
1940 DATA "ABCDEFGHIJKLMNOPQRSTUVWXYZ": REM DIAGONAL
1950 DATA "EKMFLGDQVZNTOWYHXUSPAIBRCJ","Q": REM RUEDA I
1960 DATA "AJDKSIRUXBLHWTMCQGZNPYFVOE","E": REM RUEDA II
1970 DATA "BDFHJLCPRTXVZNYEIWGAKMUSQO","V": REM RUEDA III
1980 DATA "ESOVPZJAYQUIRHXLNFTGKDCMWB","J": REM RUEDA IV
1990 DATA "VZBRGITYUPSDNHLXAWMJQOFECK","Z": REM RUEDA V
2000 DATA "YRUHQSLDPXNGOKMIEBFZCWVJAT": REM REFLECTOR B
2010 A$=INKEY$
2020 IF A$="" THEN GOTO 2010
2030 PRINT ASC(A$)
2040 IF A$=CHR$(27) THEN END ELSE GOTO 2010