// Copyright (C) 2002, Wayne Diamond ?>

SUB asmROT13(a$)
LOCAL ln AS LONG
ln = LEN(a$) ' get string's len into ln
! cmp ln, 0 ; does the string have a length?
! je Exit13Loop ; exit if zero
! mov eax, a$ ; eax = pointer to string handle
! mov eax, [eax] ; eax = pointer to string data
Bgn13Loop:
! mov edx, [eax] ; move current char into edx
! cmp ln, 0 ; exit when ln = zero
! jne Continue13Loop
! jmp Exit13Loop ; jump out on end of string
Continue13Loop:
! cmp dl, 65 ; CASE 65 TO 90
! jb NoRot ; if dl < 65 then get next character
! cmp dl, 90
! jbe Rot13Upper ; if dl <= 90
! cmp dl, 97 ; CASE 97 TO 122
! jb NoRot ; if dl < 97 then next character
! cmp dl, 122
! jbe Rot13Lower ; if dl <= 122
! jmp NoRot ; CASE ELSE - get next character
Rot13Lower:
! add dl, 13 ; Rotate 13 steps forward
! cmp dl, 122
! ja AdjChar ; if dl became > 122
! mov [eax], dl ; else write changed char back into a$
! jmp NoRot
Rot13Upper:
! add dl, 13 ; Rotate 13 steps forward
! cmp dl, 90
! ja AdjChar ; if dl became > 90
! mov [eax], dl ; else write changed char back into a$
! jmp NoRot
AdjChar:
! sub dl, 26
! mov [eax], dl ; else write changed char back into a$
! jmp NoRot
NoRot:
! inc eax
! dec ln ; decrease the ln (length) counter
! jmp bgn13Loop
Exit13Loop:
END SUB