カシオ FX-502P のシミュレーション(1)
藤田昭人
たいへんご無沙汰してました。
実は8月から生活パターンが激変しまして、
体力的辛さから毎日を過ごすのに
一杯いっぱいの日々を送ってました。
必然的にブログは放ったらかしに…
2ヵ月経てようやく慣れて来たので、
もろもろ溜まっている宿題も
少しずつ返していくつもりです。
カシオ FX-502P って覚えておられますか?
唐突感MAXですが… *1
カシオ FX-502P は1978年に発売された 往年のプログラム電卓です。 僕と同世代の方々なら覚えて いらっしゃるかもしれませんね。 1970年代の日本の熾烈な 電卓戦争を勝ちに抜いた2社、 シャープとカシオは、この時期 アメリカ市場を視野に入れてか、 アメリカのテキサス・インスツルメンツや ヒューレット・パッカードが製品化していた プログラム電卓をリリースし始めます。
「ポケコン」と銘打って 簡易BASICを搭載したシャープに対し、 次の写真でもわかるように (おそらくHPの製品を模倣した?) アセンブリ言語を各ボタンに割り付けて、 電卓なのに数字キーがかすむくらいにやたらボタンの多い むっちゃ硬派なプログラム電卓を出荷したカシオ。
製品の外見からも両社のアプローチが 対極的だった事を今もよく覚えています *2。 僕も、この硬派なルックスにやられて 当時としては大枚の1万数千円を叩いて 買ってしまったクチです😁
実は、これが僕が初めて自腹で買った 「プログラミングできるマシン」 だったのですが、結局のところ 当時のコンピュータ月刊誌に よく掲載されていたゲームなどを打ち込んで 遊ぶ以外の使い方はしていませんでした😁 *3
FX-502P のレジスタ構造
懐かしいゲーム本が見つかったところで FX-502P のゲームを実行してみたいと考えたものの、 かつて使っていた実機も付属のマニュアルも 最早手元には残っていなかったので、 FX-502P のシュミレータを作ること考えました。
残念なことにカシオのサイトでは FX-[567]02P は「無かった」ことになってまして、 散々ググってみたのですが、 結局日本語のマニュアルは見つかりませんでした。 ですが、英語のマニュアルは残ってるんですねぇ *4。 それも元は日本文だったものを 直訳しただけの素っ気ないマニュアルが。正直 「日本の製品なのに日本語のマニュアルが 残ってないのはどういうこと?」 って思ってしまいましたが…
マニュアルに記載されている FX-502P のレジスタ構造を次に転載します。
ついでに FX-602P のレジスタ構造も…
図に登場するメモリ・レジスタは 一般的な電卓にもある機能、 Minで書き込み、M+やM-で計算、 MRで計算結果を呼び出す…あの機能です。 FX-502P のメモリ・レジスタは 0〜9とFの11本が2セット (FX-501Pは1セットだけ) 用意されています*5。
FX-502Pのプログラムでは メモリ・レジスタは変数の領域と考えます。 つまりFX-502P は最大で 11個の変数が使えます。
FX-502P のオペコード
もちろん学生の頃にも FX-502Pのマニュアルは 読んだはずなのですが… その後、OSカーネルの プログラマとして経験を積んだ今、 改めてマニュアルを眺めてみると、 FX-502Pが 独自仕様の8ビットマイコン であったことがよく理解できました。
Wikipedia によれば…
FX-502Pシリーズは 7セグメント表示のみであるため、 それぞれのプログラムステップは、 0 - 9とC、E、F、Pを組み合わせた 2桁のコードで表示される。
とのこと。元は電卓ですから (キーに割り付けられている キーコード(の一部)が オペコードと等価な) 独自の命令セット が定義されているようです*6。 またまた FX-502P の情報は なかなか見つけられなかったのですが、 しつこく探してみると次のページを見つけました。
このページにあるオペコード表を しっかり追ってみると、 先の「0 - 9とC、E、F、Pを 組み合わせた 2桁のコード」 という記述の意味が概ねわかります。 (正直 "P" という文字が 割り振られた理由までは わかりかねますが、 単純に "D" と読み替えれば よくある8ビットのオペコードと 代わりありません)
8ビットマイコンのオペコードとしてみた場合、 FX-502P の命令セットは 上位4ビットが "C" 以上の領域に 押し込められたスパースで、 Z80 のような1〜4バイトの 可変バイト長の命令セットです。 なんだか歪な印象を持ちますが、 これも電卓のキー配置の物理的限界 (6つのキー列が5段+ 5つのキー列が4段=50キー) に起因しているのでしょう。 FX-502Pを使ったことのある方は ご存知のように、INV キー (invert、裏面って意味でしょうね) を使って全体では99個のキーを 物理的に確保してます。 もちろんエレガントな配置は言えませんが、 その反面、キー毎に命令が 割り当てられていて プログラムが入力が効率的 (GOTOであってもワンプッシュ) というメリットがあります。
バイトコードエンジンを書いてみる
レジスタ構造と命令セット (オペコード)がわかったところで、 FX-502P のバイトコードエンジンを (C言語で)書いてみました。 ソースコードは次に置いてあります。
このエンジンはオペコードのテーブルに 各命令のハンドラを貼り付けただけの 比較的単純な作りです。 今のところ Wikipedia の FX-502P のページにある 次のサンプルコードが実行できます (つまりサンプルコードで使ってる命令しか ハンドラを書いてないって意味ですからね)。
このプログラムはXレジスタにセットしている 数値の階乗計算をします。 参考までに等価なコードを(無理矢理) Cで書くと次のようになります。
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char *argv[]) { int m0; int x = 5; m0 = x; // Min 0 x = 1; // 1 printf("x: %d\n", x); for (; m0 > 0; m0--) { // INV DSZ GOTO 0 x *= m0; // * printf("x: %d\n", x); } printf("x = %d\n", x); // = exit(0); }
要点は INV DSZ (Decrement and Skip on Zero)命令で 続く GOTO 0 との組み合わせて、 C言語の for ループを実現しています。 なお、ループカウンターとして 暗黙的に M0 レジスタを使って いるので注意が必要です (これがFX-502Pの仕様なんですよ)。
さいごに
という訳で…
バイトコードエンジンの枠組だけはできました。 プログラムの挙動を確認するために、 トレース機能を付けたところデバックは随分楽になり、 学生の頃に感じた「頭がこんがらがる」印象は 無くなりました (その後、40年間あまりプログラマを 生業にして来たので、 ロジックを追っかけることに慣れた という意味合いもありますが)。
これ、納期が定まっていれば、 一気に畳みかけてひと通り動くところまで 持っていくのでしょうが…
他にも BookBot など 優先度の高い課題を 抱えているので、 今手元にある英文マニュアルで 紹介されている他の例題を皮切りに 今後も FX-502P のプログラムを見つけては ハンドラを追加・修正する作業を マイペースで進めていきたいと思っています。
最後に…
かつて FX-502P がカシオの 電卓ラインナップに登っていた頃、 パブリックドメインのプログラムのリストを 多数収録した プログラミング・ライブラリが書籍として 出回っていたようなのですが、 今となっては古過ぎて古書としても 入手ができないようです。 もし、お手持ちの方がいらっしゃれば、 プログラムリストの写真等を 送ってもらえると嬉しいです。
ともあれ…
僕的に FX-502P は日本が誇るべき 技術資産なんじゃないかと思うのですが、 今回関連情報の収集をしてみて 「日本語で解説したマニュアルやプログラムリストが 残っていない現状は由々しき事態」かと 考えるようになった次第です (カシオはあまり関心がないようです)。 今回紹介したバイトコードエンジンが ひと通り動くようになったら、 日本語でのドキュメントを書きたいなと 考えているところです。
以上
*1:今はコレしかネタがないとも言います😁
*2:そのFX-502P についてググってみると、 その後継機種である FX-602P に関する 英語のページが頻繁に登場します。
FX-502P が7セグメントの液晶表示 であったのに対し、FX-602P は ディスプレイがドットマトリクスに変更され ASCII テキストが表示できるようになっていました。 今回調べてみたところ カシオのプログラム電卓は 海外各国にも輸出されていたようで、 海外ではASCIIが使える FX-602Pの方が好まれたのでしょう。
FX-602P を紹介する次のホームページは 同機を支持する熱烈なメッセージから始まります。
Welcome to the FX-602P homepage - where the best programmable calculator ever (from the company who do not which to be named) found it's new home. True, many calculators do have more functions but when it comes to a small form factor, light weight usability and programmability without a manual by your side then the FX-602P is king.
FX-602Pのホームページへようこそ! 史上最強のプログラム電卓 (会社の名前は伏せておきますが) の新しいホームページを用意しました。 確かに、多くの電卓が より多くの機能を持っています。 が、しかし、小型で軽量な使い勝手と、 マニュアルなしでプログラムできるという点で、 FX-602Pは王者です。
カシオの海外法人の対応が 素っ気なかったのか 皮肉混じりではありますが、 製品には最大限の賛辞が送られてます。 「HPの電卓よりも?」 と感じられる方もいらっしゃるでしょう。 このホームページを読んでいくと、 「入力したプログラムを保存できない TIは間抜けな仕様だし、 バカ高い外部メモリカートリッジにしか プログラムを保存できないHP」 にも恨み言を並べてます。
そもそも1978年といえば、 1ドルが270〜240円だった訳で、 FX-502Pは「機能はほぼ等価なのにバカ安い」 プログラム電卓だったといえるでしょう (今に置き換えれば iPhone クローンの Xiaomi(シャオミ) の スマホみたいな感じでしょうか?)。
このあたり、当時の
「またまたアメリカの後追い」
と捉えていた僕ら日本人の
シニカルな印象との違いに
今となっては苦笑してしまいます。
*3:その後すっかり忘れてしまっていた FX-502P。 思い出したのは、長年開かずの段ボール箱を開いたところ、 中から次の本が出てきたからでした。
学生の頃、
物理の授業中に散々遊んだ
「ポケット・インベーダー」
を思い出してしまいまして…
*4:おそらく海外で人気のあったであろう
FX-602Pのマニュアル
は綺麗にスキャンされた PDF が見つかりました。
さらに、しぶとくFX-502Pのマニュアルを探したところ
"CASIO FX-502P CALCULATOR MANUAL"
も見つかりました。でもスキャンが雑で文字が判別しづらい。
*5:ちなみにこの2つの図を見比べると
FX-602P は FX-502P の上位互換のように見えます。
FX-602P のメモリ・レジスタは
0〜9とFの11本が8セット
内蔵されていたようです。
*6:後継機種の FX-602P については 脚注で紹介した FX-602P ホームページで 次のように丁寧に説明されてます。
前述のようにASCIIテキストを表示できるように
機能拡張されたため、FX-502Pを踏襲しつつも
命令セットの体系は大きく改変されてるようです。