レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

ゲームボーイにテンキーをつないで電卓にしてみる

2019年04月04日 | ゲーム機

これまでゲームボーイにArduinoを使って色々つないできましたが、どうして接続してみたいものがもう一つあります。それは以前にも使ったこのPS/2テンキーです。前回使用したものと同じタイプのものがハードオフに置いてあったので再度購入してしまいました。
ゲームボーイを昔のパソコンとかポケコンみたいに使いたいと思ったときに、やっぱりキーボードの接続は必要だよねと考えていたので、まずその第一歩としてテンキー接続にチャレンジしてみることにしました。

ArduinoとPS/2テンキーやキーボードは過去にも接続してきたので問題ないのですが、ゲームボーイでアプリケーションの実行と同時にキー入力を行うようにするには、割り込みを活用する必要がありそうです。今回もシリアルによる接続なのでシリアル関連の割り込みが必要になってきます。以前のプログラムでもシリアルデータ送受信完了割り込みは利用していたので、この割り込みを使ってバックグラウンドでキー入力を行うようにすれば完璧でしょう。問題は常にバックグラウンドでシリアル通信を行っている状態でゲームボーイが正常に動作してくれるかどうかです。

そこでゲームボーイを常時シリアル通信している状態にしておき、シリアル送受信割り込みによってArduinoから受け取ったキーデータをバッファに収納するプログラムを作成してテストしてみたところ、なんの問題もなく動作してくれました。ホント、ゲームボーイはよく出来ていますね。

テンキー入力の方はなんとかなりそうなので、次にこれを利用するアプリケーションを考えます。最初なので比較的簡単なものがいいでしょう。そこでプログラム作成に便利な電卓アプリケーションを作ってみることにしました。
電卓と言っても普通の電卓ではありません。逆ポーランド記法(RPN)に準ずるRPN電卓を作ります。詳しくはwikiなどで調べてみて下さい。初めて利用する人にはとっつきにくい方式の電卓ですが、計算式にカッコを使わなくて済み、式の順番に数値を入力していけるので慣れるととっても使いやすいものです。

今回作成するものはプログラム作成に活用できるものを考えているので、小数点などは扱わず演算は整数のみで行います。ただし、割り算で割り切れないときは商と余りを表示するようにします。個人的にプログラムを作る際には実数演算が必要なことはほとんど無く、余りを表示した方が便利なことが多いからです。また、16進・2進への変換と四則演算、andやorなどのビット演算も行えるようにします。ただし16・2進数ではマイナスの値は扱いません。プログラミングで必要とする場面もあまりありませんし、画面表示もややこしくなるのでマイナス値をとるのは10進数の演算だけにします。

これらの目標を踏まえ、作成したゲームボーイプログラムは以下のようになりました。

number.h

RPNcalc.c

コンパイル済みのバイナリはこちらです。

rpncalc.gb

テンキーの方ですが、利用したArduinoはPro Miniでピンアサインは次のようになります。

ゲームボーイ端子 → Pro Miniピン
2 TXD → 5
3 RXD → 6
5 CLK → 7
6 GND → GND

PS/2端子 → Pro Miniピン
1 DATA → 4
3 GND  → GND
4 VCC  → 5V
5 CLOCK→ 2

スケッチはこちらです。

BufferClass.h

GBTenkeyPS2.ino



Pro Miniは当然USB端子などないので、使用するのに別途電源が必要です。残念ながらゲームボーイのシリアルケーブルは5Vの出力端子が結線されていなかったので、ゲームボーイから電源をもらうことが出来ませんでした。そこで5V2AのACアダプターをPro Miniの電源にしました。せっかくなのでこのACアダプターをゲームボーイにもつないで外部電源にしてみたところ、問題なく動作しました。

さて使用方法ですが、まずスケッチを書き込んだArduinoを起動し、電卓プログラムを書き込んだゲームボーイの電源を入れます。するとゲームボーイに0が6つ縦に並んだシンプルな画面が表示されます。ここでテンキーの数字を押すと一番上の行に数字を入力することが出来ます。数字を入力したらテンキーのEnterキーを押すと一番上の行の数字が3行目に移ります。ここがスタックの一番上になります。以後、数字入力してEnterキーを押していくと、3行目の数字が4行目に移り、一番上の行の数字が3行目に移るといった具合に数字がスタックに積まれていくのが分かると思います。画面に表示されているスタックは4個ですが、スタックは10個まであり、この数を超えて積むと一番下にある数字から消えていきます。



スタックに値が入っていて、一番上の行に数字を入力した状態でテンキーの'+'や'*'などの演算キーを押すと3行目の一番最後に積んだスタックから数値を取り出して、これに対して1行目の数字で演算を行います。演算結果は1行目に表示されます。割り算を行ったときに余りがあれば2行目に表示されます。

テンキーの'.'を押すと画面の数字が10進数から16進数へ変わり、もう一度押すと2進数に変わります。再度押すと元の10進数に戻ります。

テンキーのキー割り当ては以下のようになっています。

0〜9   数字入力
/* −+  四則演算
Enter スタック入力
.     10・16・2進数切り替え

また、Num Lockを押しながら以下のキーを押したときは次のようになります。

1〜6 16進数A〜Fの入力
7  −+入力数値のプラス・マイナス切り替え(10進数のみ)
8 入力した数値のクリア
9 スタックを含めた全ての数値のクリア
/ 排他的論理和(XOR)
* 論理積(AND)
− 否定(NOT)
+ 論理和(OR)

Num Lockは押すたびに機能が切り替わるトグル動作ではなく、シフトキーと同様に他のキーと一緒に押すことで機能するようになっています。

演算は32ビットで処理していますので扱える数値は10進数で−2,147,483,648〜2,147,483,647になっています。ただし、画面表示は8桁しかないので実際に入力・表示出来る数値は、10進数で-99999999〜99999999となります。16進数ではFFFFFFFFまで入力できますので、32ビット全てを表示できます。2進数は11111111までしか入力・表示できません。(10進数で255)
それから16進数と2進数では負の数は扱いません。

開発に使用したgbdkでは32ビットデータの演算に結構不具合がありました。まあz80とか8080に近い8ビットCPUですから、16ビットを超えるデータを扱うのはちょっと厳しい面もあるのでしょう。確認できたものに関しては問題を修正する為のルーチンを書いたのですが、もしかするとまだ未確認の不具合があるかもしれません。また、演算時のオーバーフローの処理も行っていないので、32ビットを超えるような演算を行うとおかしな結果が表示されることがあります。

電卓としてはかさばるサイズなのが残念ですが、まあ割と実用的なものが出来たと思います。

しかし、ゲームボーイの開発は楽しいですね。バンク切り替えを使えは大きなプログラムも組めるようなので、いずれ試してみたいところです。まだしばらくはゲームボーイで遊び続けることになるでしょう。



最新の画像もっと見る

コメントを投稿