From d51c07097514a60bd2862699b85471770e726101 Mon Sep 17 00:00:00 2001 From: Luxferre Date: Tue, 8 Apr 2025 10:39:13 +0300 Subject: [PATCH] added a TI-74 port --- README.md | 20 ++++++++++++++ dracondi.b74 | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 dracondi.b74 diff --git a/README.md b/README.md index 39a0cfe..d24da81 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,26 @@ implementation to be considered correct: 4. The decryption part shall sanitize the ciphertext before processing, removing any whitespace and non-letter characters from the input. +TI-74 BASIC port +---------------- +The [dracondi.b74](dracondi.b74) file in this repository contains a port of the +cipher to the Texas Instruments TI-74 handheld computer in its native BASIC +language dialect. This port has been developed and tested on the TI-74S model +and contains the following limitations: + +1. The message length is restricted by the device's line limit. +2. No message prefiltering is done: enter the plaintext strictly in lowercase, +without any spaces and non-alphabetical characters. +3. The resulting ciphertext is divided with spaces every five characters but +the last group is not autofilled. +4. When decrypting, you can enter the ciphertext with spaces but no other non- +alphabetical characters are allowed. +5. No explicit exit command provided, use the BREAK key to exit the program. + +For field operation, this port requires your keyphrases to be hardcoded in the +line 100 and 110 `DATA` statements. You can change the line numbers as long as +they remain the first `DATA` statements in the device's program memory. + Credits ------- Created by Luxferre in 2025, released into the public domain with no warranties. diff --git a/dracondi.b74 b/dracondi.b74 new file mode 100644 index 0000000..a18de82 --- /dev/null +++ b/dracondi.b74 @@ -0,0 +1,73 @@ +100 DATA firstkeyphrase +110 DATA secondkeyphrase +120 PRINT "Initializing keys..." +130 RANDOMIZE +140 READ P1$,P2$ +150 CALL KEYGEN(P1$,KA1$) +160 CALL KEYGEN(P2$,KA2$) +170 LINPUT "Operation (k/e/d): ";OP$ +180 IF OP$="k" THEN 190 ELSE 220 +190 PRINT "KA1: ";KA1$:PAUSE +200 PRINT "KA2: ";KA2$:PAUSE +210 GOTO 170 +220 IF OP$="e" THEN 230 ELSE 270 +230 LINPUT "Msg: ";MSG$:IF MSG$="" THEN 170 +240 CALL DRENC(MSG$,KA1$,KA2$,RES$) +250 PRINT "Enc: ";RES$:PAUSE +260 GOTO 230 +270 IF OP$="d" THEN 280 ELSE 170 +280 LINPUT "Msg: ";MSG$:IF MSG$="" THEN 170 +290 CALL DRDEC(MSG$,KA1$,KA2$,RES$) +300 PRINT "Dec: ";RES$:PAUSE +310 GOTO 280 +320 SUB DRENC(M$,KA1$,KA2$,RES$) +330 OFFS=INT(26*RND) +340 RES$=SEG$(KA1$,OFFS+1,1) +350 L=LEN(M$):SK=1 +360 FOR I=1 TO L +370 C$=SEG$(M$,I,1) +380 CI=POS(KA1$,C$,1)+OFFS +390 IF CI>26 THEN CI=CI-26 +400 CT$=SEG$(KA1$,CI,1):RES$=RES$&CT$ +410 SK=SK+1 +420 IF SK=5 THEN 430 ELSE 440 +430 SK=0:RES$=RES$&" " +440 OFFS=POS(KA2$,CT$,1)+I-1 +450 IF OFFS>25 THEN OFFS=OFFS-26*INT(OFFS/26) +460 NEXT I +470 SUBEND +480 SUB DRDEC(M$,KA1$,KA2$,RES$) +490 OFFS=POS(KA1$,SEG$(M$,1,1),1)-1 +500 M$=SEG$(M$,2,1024) +510 RES$="":L=LEN(M$):RI=0 +520 FOR I=1 TO L +530 C$=SEG$(M$,I,1):IF C$=" " THEN 600 +540 RI=RI+1 +550 CI=POS(KA1$,C$,1)-OFFS +560 IF CI<1 THEN CI=CI+26 +570 RES$=RES$&SEG$(KA1$,CI,1) +580 OFFS=POS(KA2$,C$,1)+RI-1 +590 IF OFFS>25 THEN OFFS=OFFS-26*INT(OFFS/26) +600 NEXT I +610 SUBEND +620 SUB KEYGEN(P$,KA$) +630 KA$="" +640 L=LEN(P$) +650 FOR I=1 TO L +660 C$=SEG$(P$,I,1) +670 IF POS(KA$,C$,1)>0 THEN 680 ELSE 710 +680 CK=ASC(C$)-72:IF CK>25 THEN CK=CK-26 +690 C$=CHR$(97+CK) +700 GOTO 670 +710 KA$=KA$&C$ +720 NEXT I +730 KA$=KA$&"abcdefghijklmnopqrstuvwxyz" +740 KR$="":L2=LEN(KA$) +750 FOR I=1 TO L2 +760 C$=SEG$(KA$,I,1) +770 IF POS(KR$,C$,1)=0 THEN KR$=KR$&C$ +780 NEXT I +790 L=L-INT(L/26)*26 +800 KA$=SEG$(KR$,L+1,26)&SEG$(KR$,1,L) +810 SUBEND +820 END