FX-502Pの隠れキャラクタ
FX-502Pについて検索していると、下のような画像を見かけることがあります。では、右端の"P"の文字はどうやって表示しているのでしょうか? 本日はそれについて書きたいと思います。

FX-502Pは7セグメントのLCDを使用していますが、プログラムの"P", 60進数の"°", 符号の"-"などの記号も表示されることがあり、このような記号にも内部的にコードが割り当てられています。Casio FX-502P Geekによると、コードの割り当ては下記のようになっているようです。
0~9 (数字):0~9
°(60進記号):10
P (プログラム):11
C (演算スタックエラー):12
E (エラー):13
- (マイナス):14
␣ (空白):15
これらのコードをおそらく内部的には4bitの16進数で表現しているものと思われます。ちなみにFメモリの"F"は"°"と同じコード10を利用しているようですが、表示の切り替えはモード(RUNモードなら"°"、WRTモードなら"F")に依存しているようです。これらのコードは通常の演算には用いられることはないのですが、ファームウェアのバグを利用してXレジスタ(表示内容)に呼び出すことができます。いったん呼び出されたものは演算を繰り返すことにより通常の数値(たとえば"P"なら11として扱われる)に戻ってしまうこともありますが、上手に扱えばバグった状態のまま演算を行うこともできます。このバグを誘発させるためには、メモリを間接指定するIND命令を用いて、実際には存在しないM32にアクセスを行います。バッファーオーバーランエラーでセキュリティーホールを突くのとと似たようなやり方なのではないかと思われます。
では、Casio FX-502P Geekに書かれている手順をもとに、"502P"を表示させてみることにします。まずは"P"を作らなければいけません。このためにはIND命令を利用して元となるバグった数値を作り出す必要があります。以下の操作はすべてRUNモードで行ってください。
32 [Min] 0 [AC] [INV] [IND] [MR] 0
以上の操作でバグが誘発され、Xレジスタに異常なデータがセットされます。おそらくは本来のMメモリのアドレスではない無関係なアドレスのデータ(つまり、BCDではなくランダムな16進数のデータ)を読み込んでXレジスタに転送しているのではないかと思われます。
これに対して演算を行います。
[×] [=] [÷] [=]
これで以下のような表示になると思います。
0.°06876873
これをM2に記憶させてさらに演算を続け、"°"の一桁を取り出してみます。
[÷] 0.1 [=] [INV] [RND] 1
これで"°"のみの表示になったと思います。試しにこの数値に1をかけてみてください。内部コードがまともな数値に戻ってしまい、10という答えが表示されるはずです。次に、"P"を作ってみます。以下のように操作します。
[MR] 2 [+] [+] [=] [=] [=] [=] [=] [=] [=] [=] [=] [=] [=] [=] [=] [=]
結果は以下のようになると思います。
14.P031531
ここから"P"を取り出してM1に記憶させておきます。
[INV] [FRAC] [÷] 0.1 [=] [INV] [RND] 1 [Min] 1
さて、ここからがいよいよ本番です。ここまでの話から、"502P"を表示するには5020にM1を足せばいいように思われるかもしれません。ところが実際にこれを行うと"P"は11と解釈され、答は5031となってしまいます。そこでいろいろ考えたのですが、上記の方法を見ていて定数計算を利用しているところに目をつけました。どうやら定数計算はエラーチェックが甘いのか、あまり普通の数値に戻ることがないようです。これを利用して下記のようにしてみました。
[MR] 1 [+] [+] 5009 [=] [=]
これで見事に"502P"の表示になったと思います。このほかの文字の表示方法についてもCasio FX-502P Geekにいろいろと説明がありますので、興味のある方は試されてみてはいかがでしょうか。

FX-502Pは7セグメントのLCDを使用していますが、プログラムの"P", 60進数の"°", 符号の"-"などの記号も表示されることがあり、このような記号にも内部的にコードが割り当てられています。Casio FX-502P Geekによると、コードの割り当ては下記のようになっているようです。
0~9 (数字):0~9
°(60進記号):10
P (プログラム):11
C (演算スタックエラー):12
E (エラー):13
- (マイナス):14
␣ (空白):15
これらのコードをおそらく内部的には4bitの16進数で表現しているものと思われます。ちなみにFメモリの"F"は"°"と同じコード10を利用しているようですが、表示の切り替えはモード(RUNモードなら"°"、WRTモードなら"F")に依存しているようです。これらのコードは通常の演算には用いられることはないのですが、ファームウェアのバグを利用してXレジスタ(表示内容)に呼び出すことができます。いったん呼び出されたものは演算を繰り返すことにより通常の数値(たとえば"P"なら11として扱われる)に戻ってしまうこともありますが、上手に扱えばバグった状態のまま演算を行うこともできます。このバグを誘発させるためには、メモリを間接指定するIND命令を用いて、実際には存在しないM32にアクセスを行います。バッファーオーバーランエラーでセキュリティーホールを突くのとと似たようなやり方なのではないかと思われます。
では、Casio FX-502P Geekに書かれている手順をもとに、"502P"を表示させてみることにします。まずは"P"を作らなければいけません。このためにはIND命令を利用して元となるバグった数値を作り出す必要があります。以下の操作はすべてRUNモードで行ってください。
32 [Min] 0 [AC] [INV] [IND] [MR] 0
以上の操作でバグが誘発され、Xレジスタに異常なデータがセットされます。おそらくは本来のMメモリのアドレスではない無関係なアドレスのデータ(つまり、BCDではなくランダムな16進数のデータ)を読み込んでXレジスタに転送しているのではないかと思われます。
これに対して演算を行います。
[×] [=] [÷] [=]
これで以下のような表示になると思います。
0.°06876873
これをM2に記憶させてさらに演算を続け、"°"の一桁を取り出してみます。
[÷] 0.1 [=] [INV] [RND] 1
これで"°"のみの表示になったと思います。試しにこの数値に1をかけてみてください。内部コードがまともな数値に戻ってしまい、10という答えが表示されるはずです。次に、"P"を作ってみます。以下のように操作します。
[MR] 2 [+] [+] [=] [=] [=] [=] [=] [=] [=] [=] [=] [=] [=] [=] [=] [=]
結果は以下のようになると思います。
14.P031531
ここから"P"を取り出してM1に記憶させておきます。
[INV] [FRAC] [÷] 0.1 [=] [INV] [RND] 1 [Min] 1
さて、ここからがいよいよ本番です。ここまでの話から、"502P"を表示するには5020にM1を足せばいいように思われるかもしれません。ところが実際にこれを行うと"P"は11と解釈され、答は5031となってしまいます。そこでいろいろ考えたのですが、上記の方法を見ていて定数計算を利用しているところに目をつけました。どうやら定数計算はエラーチェックが甘いのか、あまり普通の数値に戻ることがないようです。これを利用して下記のようにしてみました。
[MR] 1 [+] [+] 5009 [=] [=]
これで見事に"502P"の表示になったと思います。このほかの文字の表示方法についてもCasio FX-502P Geekにいろいろと説明がありますので、興味のある方は試されてみてはいかがでしょうか。
スポンサーサイト