初代プレイステーションと連携して動く 1999年発売の携帯ゲーム機 PocketStation(ポケステ) をお友達が発掘してお借りすることができたので、当時流行っていた、ポケステをゲーム機として使わずに ARM マイコンとして遊ぶプレイを蘇らせてみました。 😛
さすがにこれだけ年数が経過すると解説しているサイトさんも消え始めていていますので、2018 年版ポケステ・Hello World の手順を書いてみたいと思います。
ポケステメモリの読み書き
ポケステはプレイステーションのメモリーカードとしても動作し、ポケステ用として目印がついているメモリー領域が、ポケステ上でプログラムとして動作する構造になっています。
ということで、まずはプレステ用のメモリーカードリーダーを Arduino マイコンで製作しました。
ポケステが刺さるカードエッジコネクターの入手が難関ですが、昔使っていたパラレル接続のプレステメモリーカードリーダーが宝箱入れから発掘されたので、基板からコネクターだけ拝借しました。(コネクターがない方で Arduino を使いたい方は、8本ですのでなんとか足を引っ張りだしてください)
発掘されたもの(オリジナルの商品名は失念…)
分解してはんだ吸いですっぽんしたら割と簡単に抜けました。この機械は、セントロニクスパラレルポートで SPI を制御、PS/2 の端子から 5V を取っていたようです。
外からは見えませんでしたが、密かにコントローラーの端子もついていました。
カードエッジコネクターが入手できたら、これを Arduino に接続していきます。
資料と Arduino のファームは MemCARDuino を使わせていただきました。
https://github.com/ShendoXT/memcarduino
Arduino PlayStation 1 Memory Card reader
Looking at the Memory Card: _________________ |_ _|_ _ _|_ _ _| 1 2 3 4 5 6 7 8 1. DATA - Pin 12 on Arduino 2. CMND - Pin 11 on Arduino 3. 7.6V - External 7.6V power (only required for 3rd party cards and knockoffs) 4. GND - GND Pin on Arduino 5. 3.6V - 5V pin with a voltage divider to 3.6V 6. ATT - Pin 10 on Arduino 7. CLK - Pin 13 on Arduino 8. ACK - Pin 2 on Arduino
ポケステに関しては、3pin は結線不要。 5pin は 5V を入れても動作するようです。(3.3V だと動きませんでした。自分は 5V でも壊れませんでしたが、念の為分圧して 3.6V にしたほうがいいと思います)
クロック制御に Arduino の SPI を使っているため、Arduino “UNO” 以外の方は接続するピンが違いますので注意してください。 Arduino “MEGA” だと SPI は 50pin あたりからです。Arduino “Nano” は Arduino language が SPI 非対応のため使えません。
シールドに乗る大きさだったので、Arduino UNO の上に載せました。 🙂
配線できたら、PC に接続し MemCARDuino.ino をコンパイルして Arduino に転送します。
次に MemCARDuino のファームに対応した memcardrex クライアントを使わせていただき、メモリー吸い出しをして動作確認してみます。(一番下のリンクにコンパイル済みのバイナリがあります)
https://github.com/ShendoXT/memcardrex
Advanced PlayStation 1 Memory Card editor
MemcardRex は Windows 用 C#.NET のデスクトップクライアントですので、他の OS をお使いの方は MemCARDuino に付属の Python2 スクリプトを使うと良いと思います。( Linux で動作することを確認しました。機械の動作がおかしい場合のデバッグにも使えます)
MemcardRex を起動し Option から接続した Arduino の COM ポートを選択、Hardware から read -> MemCARDuino あたりで吸い出しが開始されます。もし進捗メーターが進まなければ、配線がおかしいので確認してみてください。
読み出したら内容をバックアップしておきましょう。
MemcardRex は .mcs のメモリーカード形式をインポートして書き込むことができます。というわけで次からは、ポケステ用のソースをコンパイルしてバイナリを作成し、 .mcs に変換して書き込んであげるという手順になります。
ポケステ用開発環境とひな形のダウンロード
ポケステの CPU は ARM7 だということで、本家 ARM さんのページから GNU Arm Toolchain をダウンロードします。 今回は Windows を使っていたので、 gcc-arm-none-eabi-7-2017-q4-major-win32.zip をダウンロードして展開します。
https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
The GNU Embedded Toolchain for Arm is a ready-to-use, open source suite of tools for C, C++ and Assembly programming targeting Arm Cortex-M and Cortex-R family of processors.
次に、ポケステ開発のひな形とライブラリ、ビットマップや bin2mcs などの周辺ツールを公開されている方がいらっしゃいますので、ありがたくダウンロードさせていただきます。(左フレーム PocketStation です)
http://onorisoft.free.fr/retro.htm
PocketStation DevKit, Lib & Tools v3.4
This is my complete devkit for the PocketStation, I used it to make PKBIOSTool and the NyanCat.
Full source and tools included !
Please give credits if you use it ! and drop me a mail if you make PocketStation stuff 🙂
psdevkit.zip を展開すると tools と Example がありますので、この手順では Example の中のプログラムをコンパイルして動作させてみたいと思います。
psdevkit Example のコンパイル
Example のコンパイルでは make コマンドを使っていますので、OS に導入されていない場合はインストールします。今回は Windows を使いましたので Windows 10 の bash on Windows(WLS)上の Ubuntu の make を使いました。(Cygwin でも良いと思います)
bash を起動し、試しに make と入力し “コマンドが見つかりません” なら表示された apt の手順で導入します。
次に、Makefile から呼び出される GNU Arm Toolchain の arm-none-eabi-gcc.exe などが入っている bin ディレクトリと、psdevkit 同梱の tools の mcpad.exe への PATH を bash に次のような感じで設定します。(相対パスで指定した例)
export PATH=../../gcc-arm-none-eabi/bin:../tools/mcpad/:$PATH
bash on Windows は bash 内から .exe ファイルを実行することができますが、.exe 拡張子がついていないと Linux のコマンドと混乱するため Makefile を次のように変更してコマンド名に .exe をつけてあげます。
CC = arm-none-eabi-gcc.exe LD = arm-none-eabi-ld.exe AS = arm-none-eabi-as.exe OBJCOPY = arm-none-eabi-objcopy.exe OBJDUMP = arm-none-eabi-objdump.exe ...(略) ${PROG}.bin: ${PROG} ${OBJCOPY} -O binary ${PROG} ${PROG}.bin mcpad.exe ${PROG}.bin
これにて make を実行してあげると ARM バイナリの test.bin ができるハズです。
なお、tools に入っている mcpad.exe や次で使う bin2mcs.exe などはソースファイルが同梱されていますので、Windows 以外の方は事前にコンパイルして実行可能な状態にしておいてください。
バイナリをポケステに転送する
最後に出来上がった .bin バイナリを tools に入っている bin2msc.exe で memcardrex で import できる .mcs に変換します。
../tools/bin2mcs.exe BESNESP00000GAMETEST test.bin test.mcs
第一引数の文字列指定の詳細は bin2msc.exe のヘルプから参照できます。
test.mcs が出来上がったら MemcardRex を起動し、メモリーを読み込み後、未使用スロットの上で右クリックし test.mcs を import して Hardware -> Write してあげれば…
めでたい 😀
Example で使われている pocketlib.h (& header.S) はポケステ用のライブラリです。初期化・終了処理、スプライト、vsync 割り込み、オーディオ用の割込み処理などなど大変便利なものです。
また pocketlib.h と合わせて次の資料も大変参考になりました。(ありがとうございます!)
本ページはPocketStationの情報を後世に残すことを目的としています。
ポケットステーション対応ソフトの開発資料や関連資料を掲載したサイトを紹介します。
32 x 32 の @ampersand_xyz さんが描かれたドット絵アニメーションを、ポケステ上で動作させてみた様子。
ポケステは 32×32 液晶と LED と IrDA と 10bit DAC がメモリマップドI/O でコントロールでき、プログラミングはアセンブラが必要な部分があったりちょっとプロフェッショナルですが、それも含めて楽しめるのではないかと思います。
お店で見かけましたら、1台ぜひ。 😀