I find bit operations a "bit" confusing so I made a BASIC program that follows a more intuitive approach 
If you want to try it out on modern computers I would suggest QB64 (www.qb64.net), but this should work in most forms of BASIC.
Next step will be a BASIC encoder, after that we'll see what it develops into.

If you want to try it out on modern computers I would suggest QB64 (www.qb64.net), but this should work in most forms of BASIC.
Next step will be a BASIC encoder, after that we'll see what it develops into.
Code:
c$ = "nallenap" a$ = "apzlgity" b$ = "eoxuksvn" DIM addr AS INTEGER compused = 0 addr = &H8000 'base address IF LEN(c$) > 6 THEN len8 = 1 FOR a = 1 TO LEN(c$) cur$ = MID$(c$, a, 1) v = INSTR(1, a$, cur$) - 1 k = -1 IF v = -1 THEN k = INSTR(1, b$, cur$) - 1 IF k = -1 AND v = -1 THEN EXIT FOR IF a = 1 THEN IF v = -1 THEN value = value + k: value = value + &H80 IF v >= 0 THEN value = value + v END IF IF a = 2 THEN IF v = -1 THEN value = value + &H10 * k: addr = addr + &H80 IF v >= 0 THEN value = value + &H10 * v END IF IF a = 3 THEN IF v = -1 THEN addr = addr + &H10 * k: l8 = 1 IF v >= 0 THEN addr = addr + &H10 * v: l8 = 0 END IF IF a = 4 THEN IF v = -1 THEN addr = addr + 8: addr = addr + (&H1000 * k) IF v >= 0 THEN addr = addr + (&H1000 * v) END IF IF a = 5 THEN IF v = -1 THEN addr = addr + &H800: addr = addr + k IF v >= 0 THEN addr = addr + v END IF IF a = 6 THEN IF v = -1 THEN addr = addr + &H100 * k: IF len8 = 0 THEN value = value + 8: ELSE comp = comp + 8 IF v >= 0 THEN addr = addr + &H100 * v END IF IF a = 7 THEN IF v = -1 THEN comp = comp + k: comp = comp + &H80 IF v >= 0 THEN comp = comp + v compused = 1 END IF IF a = 8 THEN IF v = -1 THEN value = value + 8: comp = comp + (&H10 * k) IF v >= 0 THEN comp = comp + (&H10 * v) END IF NEXT PRINT c$ IF compused = 1 THEN PRINT HEX$(addr); ":"; HEX$(comp); ":"; HEX$(value) IF compused = 0 THEN PRINT HEX$(addr); ":"; HEX$(value)
Comment