[Linked Image]



This code makes use of Localization files that contain each letter of the alphabet and certain special characters like punctuation.
Code
INIT Section

DB_SingleLetter("A", 1);
DB_SingleLetter("B", 2);
DB_SingleLetter("C", 3);
DB_SingleLetter("D", 4);
DB_SingleLetter("E", 5);
DB_SingleLetter("F", 6);
DB_SingleLetter("G", 7);
DB_SingleLetter("H", 8);
DB_SingleLetter("I", 9);
DB_SingleLetter("J", 10);
DB_SingleLetter("K", 11);
DB_SingleLetter("L", 12);
DB_SingleLetter("M", 13);
DB_SingleLetter("N", 14);
DB_SingleLetter("O", 15);
DB_SingleLetter("P", 16);
DB_SingleLetter("Q", 17);
DB_SingleLetter("R", 18);
DB_SingleLetter("S", 19);
DB_SingleLetter("T", 20);
DB_SingleLetter("U", 21);
DB_SingleLetter("V", 22);
DB_SingleLetter("W", 23);
DB_SingleLetter("X", 24);
DB_SingleLetter("Y", 25);
DB_SingleLetter("Z", 26);

DB_SingleLetter("a",27);
DB_SingleLetter("b",28);
DB_SingleLetter("c",29);
DB_SingleLetter("d",30);
DB_SingleLetter("e",31);
DB_SingleLetter("f",32);
DB_SingleLetter("g",33);
DB_SingleLetter("h",34);
DB_SingleLetter("i",35);
DB_SingleLetter("j",36);
DB_SingleLetter("k",37);
DB_SingleLetter("l",38);
DB_SingleLetter("m",39);
DB_SingleLetter("n",40);
DB_SingleLetter("o",41);
DB_SingleLetter("p",42);
DB_SingleLetter("q",43);
DB_SingleLetter("r",44);
DB_SingleLetter("s",45);
DB_SingleLetter("t",46);
DB_SingleLetter("u",47);
DB_SingleLetter("v",48);
DB_SingleLetter("w",49);
DB_SingleLetter("x",50);
DB_SingleLetter("y",51);
DB_SingleLetter("z",52);

DB_SingleLetter(" ",53);
DB_SingleLetter("1",54);
DB_SingleLetter("2",55);
DB_SingleLetter("3",56);
DB_SingleLetter("4",57);
DB_SingleLetter("5",58);
DB_SingleLetter("6",59);
DB_SingleLetter("7",60);
DB_SingleLetter("8",61);
DB_SingleLetter("9",62);
DB_SingleLetter("0",63);
DB_SingleLetter(".",64);
DB_SingleLetter(",",65);
DB_SingleLetter("?",66);
DB_SingleLetter("!",67);


Code
KB Section

PROC
StringSplit((STRING)_word)
AND
NOT DB_SplitProcessing(1)
THEN
DB_SplitProcessing(1);
StringSplitForward(_word, "", 1, 0);

PROC
StringSplitForward((STRING)_word, (STRING)_current, (INTEGER)_int, (INTEGER)_counter)
AND
NOT DB_SingleLetter(_, _int)
THEN
StringSplitBackward(_word, _current, 1, -1);

PROC
StringSplitBackward((STRING)_word, (STRING)_current, (INTEGER)_int, (INTEGER)_counter)
AND
NOT DB_SingleLetter(_, _int)
AND
IntegerSum(_counter, 1, _result)
THEN
DB_SplitMin(_result);
DisplaySplitResult();


PROC
StringSplitForward((STRING)_word, (STRING)_current, (INTEGER)_int, (INTEGER)_counter)
AND
DB_SingleLetter(_char, _int)
AND
StringConcatenate(_current, _char, _test)
AND
StringContains(_word, _test, _result)
AND
_result != 0
AND
IntegerSum(_counter, 1, _nextCounter)
THEN
DB_SplitResult(_char, _counter);
DB_SplitTempBreak(_word, _test, _nextCounter);
TimerLaunch("SplitForwardBreak", 200);

IF
TimerFinished("SplitForwardBreak")
AND
DB_SplitTempBreak(_word, _test, _nextCounter)
THEN
NOT DB_SplitTempBreak(_word, _test, _nextCounter);
StringSplitForward(_word, _test, 1, _nextCounter);

PROC
StringSplitForward((STRING)_word, (STRING)_current, (INTEGER)_int, (INTEGER)_counter)
AND
DB_SingleLetter(_char, _int)
AND
StringConcatenate(_current, _char, _test)
AND
StringContains(_word, _test, _result)
AND
_result == 0
AND
IntegerSum(_int, 1, _nextInt)
THEN
StringSplitForward(_word, _current, _nextInt, _counter);


PROC
ClearSplitResult()
AND
DB_SplitResult(_char, _counter)
THEN
NOT DB_SplitResult(_char, _counter);
ClearSplitResult();

PROC
ClearSplitMin()
AND
DB_SplitMin(_min)
THEN
NOT DB_SplitMin(_min);
ClearSplitMin();

PROC
StringSplitBackward((STRING)_word, (STRING)_current, (INTEGER)_int, (INTEGER)_counter)
AND
DB_SingleLetter(_char, _int)
AND
StringConcatenate(_char, _current, _test)
AND
StringContains(_word, _test, _result)
AND
_result != 0
AND
IntegerSubtract(_counter, 1, _nextCounter)
THEN
DB_SplitResult(_char, _counter);
DB_SplitTempBreak(_word, _test, _nextCounter);
TimerLaunch("SplitBackwardBreak", 200);

IF
TimerFinished("SplitBackwardBreak")
AND
DB_SplitTempBreak(_word, _test, _nextCounter)
THEN
NOT DB_SplitTempBreak(_word, _test, _nextCounter);
StringSplitBackward(_word, _test, 1, _nextCounter);

PROC
StringSplitBackward((STRING)_word, (STRING)_current, (INTEGER)_int, (INTEGER)_counter)
AND
DB_SingleLetter(_char, _int)
AND
StringConcatenate(_char, _current, _test)
AND
StringContains(_word, _test, _result)
AND
_result == 0
AND
IntegerSum(_int, 1, _nextInt)
THEN
StringSplitBackward(_word, _current, _nextInt, _counter);

PROC
DisplaySplitResult()
AND
DB_SplitMin(_start)
THEN
DisplaySplitResult(_start);

PROC
DisplaySplitResult((INTEGER)_counter)
AND
DB_SplitResult(_char, _counter)
AND
IntegerSum(_counter, 1, _nextCounter)
THEN
CharacterDisplayText(CHARACTER_FirstCharacter, _char);
DB_SplitDisplayBreak(_nextCounter);
TimerLaunch("SplitDisplayBreak", 200);

IF
TimerFinished("SplitDisplayBreak")
AND
DB_SplitDisplayBreak(_nextCounter)
THEN
NOT DB_SplitDisplayBreak(_nextCounter);
DisplaySplitResult(_nextCounter);

PROC
DisplaySplitResult((INTEGER)_counter)
AND
NOT DB_SplitResult(_, _counter)
THEN
ClearSplitResult();
ClearSplitMin();
NOT DB_SplitProcessing(1);



I fixed the memory issue by making the code use timers, such that there is 200 milliseconds between each letter being processed (and between each letter being displayed).