if ximoji>$80{
if ximoji<$9e{
この部分を次のように変えてみましょう。
if imoji>$80{
if imoji<$9e{
問題が解決するはずです。
ところで、skyblue さんはプログラムを始めてまだ日が浅いのでしょうか?
16 進数とか文字列とか色々と誤解をしているようです。
2 進数・10 進数・16 進数は、数値の書き表し方の違いに過ぎません。すでに SYAM さんも説明されていますが。
例えば、16 という数値を表したい時、HSP では
2 進数: 0b10000 または %10000
10 進数: 16
16 進数: 0x10 または $10
以上のどの表記をしても良いのです。すべて 16 という数値の意味に解釈されます。
逆に言えば、以下の 2 つはどちらも同じ意味で全く同じ動作・処理をします。
if imoji>$80{
if imoji<$9e{
-------------------------------
if imoji>128{
if imoji<158{
skyblue さんのように
ximoji=strf("%x",imoji)
このようにして変換する必要はありません。そもそも、この変換は「数値」を「数字」列に変換しているので意味がちょっと違ってきます。
今回のエラーの原因を理解するには、もう少し話を掘り下げる必要があります。
HSP には整数型、実数型、文字列型があるのはご存知でしょうか?(他にもあります。)
加算や減算、あるいは、比較といった演算はデータ型の異なるもの同士では出来ません。
異なる物同士の演算をする場合、HSP は右項のデータ型を変換し、左項と揃えて演算を行います。
imoji=peek(moji,index)
ximoji=strf("%x",imoji)
if ximoji>$80{
この例において、imoji と $80 は整数型、ximoji は文字列型です。
条件式 ximoji > $80 において、文字列と数値を比較してますから、右側の $80 を文字列に変換します。つまり、ximoji > "128" となります。
しかし、> 演算は数値専用で、文字列に対しては適用出来ないため、そういう演算は出来ないとHSP が怒って error 21 が発生します。
なお、$80 < ximoji に修正すると、このエラーは発生しなくなります。その理由はもう分かるはずです。そして、最初に提示した方法とこの方法、どちらが効率が良いかも分かるはずです。