Потому, что STRPOS не различает регистр и программа не выходит из цикла. Тоже сначала так сделал и долго искал причину.
При этом STRREPLACE и STRFILTER различают (слава богу, а то бы ппц)
Вот как обошёл.
$filein = "input.txt"
$fileout = "out.txt"
SUB(REPL, $si, $so) //==========================================================
$letter_c = STRLEN(STRFILTER($str, $si, 1))
FOR($i=0, $i < $letter_c)
$str = STRREPLACE($str, $si, $so)
END_CYC
END_SUB
//==============================================================================
$count = TFCOUNT($filein)
FOR($line=1, $line < ($count+1))
$str = TFREAD($filein, $line)
//PRINT($line, " ", $str)
REPL("a", "а")
REPL("c", "с")
REPL("e", "е")
REPL("o", "о")
REPL("p", "р")
REPL("x", "х")
REPL("y", "у")
REPL("A", "А")
REPL("B", "В")
REPL("C", "С")
REPL("H", "Н")
REPL("K", "К")
REPL("M", "М")
REPL("O", "О")
REPL("P", "Р")
REPL("T", "Т")
REPL("X", "Х")
TFWRITE($fileout, $str)
END_CYC
HALT