PocketStation(ポケステ) 開発 2018年版

初代プレイステーションと連携して動く 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 だと動きませんでした)

クロック制御に 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

Shendo’s software

MemcardRex 1.8 released

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 と合わせて次の資料も大変参考になりました。(ありがとうございます!)

DEEPER THAN POCKETS

本ページはPocketStationの情報を後世に残すことを目的としています。

POCKETSTATION GENERATION

ポケットステーション対応ソフトの開発資料や関連資料を掲載したサイトを紹介します。

ポケステは 32×32 液晶と LED と IrDA と 10bit DAC がメモリマップドI/O でコントロールでき、プログラミングはアセンブラが必要な部分があったりちょっとプロフェッショナルですが、それも含めて楽しめるのではないかと思います。

お店で見かけましたら、1台ぜひ。 😀

Visual Studio Code extension for Arduino で電子工作

Visual Studio Code Advent Calendar 2017 の 13日目の記事です。 🙂

昨日の「Visual Studio Code の PHP 言語サポート vscode-php-intellisense 2017年版」に続きまして今日は VS Code と Arduino による電子工作です。

なんだか今年は趣味の電子工作をよくしていた年だったように思いますが、そんな中でも我らが VS Code が活躍してくれました。

Microsoft 謹製 “Visual Studio Code extension for Arduino” という思わぬ伏兵のリリースにびっくりしてしまいましたが、IntelliSense が使える快適なマイコンプログラミングができるようになりました。 🙂

この記事は Windows と Linux で動作することを確認しています。(シリアルポートドライバーの関係で電子工作では  macOS を使う機会がなかったのでした…)

準備

vscode-arduino は、VS Code 上で Arduino のマイコンプログラミングを可能にする拡張です。vscode-cpptools と依存関係があり、C++ の IntelliSense と Arduino 操作が協調して動作します。

Arduino のコンパイラや転送ソフトウェア自体は Arduino IDE に含まれるものが使われますので Arduino IDE の導入が必要です。導入された Adruino IDE は vscode-arduino により自動的に認識されます。

Arduino IDE と vscode-arduino 拡張の導入後、vscode-arduino の次の基本設定を “Default” から “Tag Parser” に変更してください。

{
    "C_Cpp.intelliSenseEngine": "Tag Parser"
}

Arduino の C like なソースコードは include することなく標準ライブラリが使えるようになっていますが、Default パーサーの場合は厳密にソースコードで #include <Arduino.h> などとしないとパースできず IntelliSense が効きません。

このことから “Fuzzy” な検索が出来る “Tag Parser” を使うことでこれを解決してあげます。

ここまでの準備ができたら、空のフォルダを vscode で開き、Arduino のソースファイルとなる空の hogehoge.ino ファイルを作成し開くと vscode-arduino が活動を開始します。(ステータスバーに Arudino の情報がでれば OK です)

Visual Studio Code extension for Arduino

空の hogehoge.ino ファイルができたらまずはターゲットとなる Arduino ボードの設定をします。

F1 キー押下後 “Arduino Board Config” を選択してください。

設定画面がでますので、ターゲットとなるボードを選択します。

選択後、プロジェクトフォルダに .vscode と 2つのファイルが作成されます。

  • arduino.json – Arduino の設定情報が入ります。
  • c_cpp_properties.json – C/C++ パーサーの設定情報が入ります。

c_cpp_properties.json を開き、Arduino IDE の位置を正しく自動認識して brows.path に設定されていることを確認してください。

"browse": {
    "limitSymbolsToIncludedHeaders": false,
    "path": [
        "C:\\Users\\hirom\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.19\\cores\\arduino"
    ]
}

先に設定した “C_Cpp.intelliSenseEngine”: “Tag Parser” では、解析の設定に brows.path が用いられます。外部ライブラリなどで IntelliSense が正しく働かない場合は、この部分にパスを追加してみてください。(なお Default パーサーでは “includePath” が使われるようです)

では早速ソースコードを書いてみましょう。

IntelliSense やコードレンズが効いて良い感じです。標準の Arduino IDE は補完がサポートされておらず、また Java / Swing でできていることもありフォントなども綺麗にでませんでしたが、vscode-arduino なら全て解決で嬉しくなってしまいます 🙂

最後に Arduino へのプログラムの転送ですが、 “Arduino Board Config” と同様に F1 キーから “Arduino Select Serial Port” で接続先の COM (/dev/ttyUSB) を指定した後、”Arduino Upload” をすれば OK です。

シリアルモニターも同じ操作から “Arduino Open Serial Monitor” で起動可能です。

hexdump for VS Code

vscode-arduino とは直接関係ありませんが、hexdump for VS Code 拡張が便利でしたので合わせて紹介します。

マイコンプログラミングをしているとバイナリデーターと格闘しなくてはいけないことがありますが、hexdump for VS Code は VS Code 内でバイナリ表示・編集を可能にする拡張です。

VS Code エクスプローラーのファイル右クリックコンテキストメニューが拡張され、”Show Hexdump” できるようになります。表示されたバイナリではカーソル選択による “Hex Inspector” が使え、選択値の各種長さの 10進数表現を見たり、右クリックメニューから 1byte 単位の編集が行えます。(便利!)

VS Code で電子工作

今年は実際に Visual Studio Code extension for Arduino を活用して、数台の電子工作を行ってみましたが、トラブルもなく非常に快適でした。

では最後にそんな中の 1台の “未来ガジェット” の紹介をして今年の VS Code Advent Calendar 2017 の担当分を終わろうと思います。 3日間に渡りすいませんでした。

また来年。

# 動画中 vscode-arduino のコンソールが文字化けしているのは半年ほど前の古いバージョンの不具合で、現在は修正されています。:)

未来ガジェット 3号 “古の電子オルゴール”

何十年前ものPC ゲーム少年達を魅了したYAMAHA のシンセサイザー LSI YM2151 で、今再び楽曲を奏でるという、未来ガジェットと呼ぶにふさわしい趣味の一品。

YM2151 は YAMAHA 自身が iOS でエミュレーターをつくるなど、今なお多くの人を魅了する FM 音源と呼ばれるシンセサイザーで、暖かみのあるエレピやゲーム向きのエッジの効いた音が発声できることを特徴としています。

発売から数十年経過し、当然生産終了しているこの LSI を海外ルートから取り寄せ、先人が残した情報を元に回路を再現。オルゴールの盤面ともいえる ROM に格納した楽曲データーをマイコンから LSI に送信することで発声させています。

特にマイコン側の制御ソフトウェアが難しかったですが、小中学校時代に毎夜毎晩打ち込んでいた MML を思い出しながら、ついに楽曲が奏でられた時は泣きそうになったのでした。

この作品は基板が小さく、自分の腕前ではデジタル側とアナログ側の GND をうまく分離できず、よく聴くとチリチリと裏でデジタルノイズが鳴ってしまっているのですが、小学生の頃 PC から奏でられていた楽曲にも同じノイズが乗っていたことがフラッシュバックしタイムリープ寸前に。

いつか僕らが未来振り返る時には。骨董品を極めた作品となりました。

 

Visual Studio Code の PHP 言語サポート vscode-php-intellisense

本記事の 2017 年版を記載しましたのでご参照ください。

https://another.maple4ever.net/archives/2321/


Visual Studio Code Advent Calendar 2016 の 12日目です!

ここのところずっとウォッチしていました、Visual Studio Code(vscode)で利用可能な PHP サポート拡張になります “vscode-php-intellisense” が完成度をあげ、かなり良い感じになっています。 🙂

https://github.com/felixfbecker/vscode-php-intellisense

Advanced PHP IntelliSense for Visual Studio Code. In opposite to the included PHP IntelliSense and other PHP extensions, this uses an AST to parse the source code instead of relying on naive regular expression parsing.

少し前まで PHP をかくときは、Eclipse の PHP Developer Tools を使っていましたが、vscode-php-intellisense がほぼ同様の機能を実装しましたので、検証しながら乗り換えをしております。

以下、vscode-php-intellisense で WordPress を読ませて動作させている様子です。(サイトの横幅の関係でスクリーンキャストがつぶれてしまいましたので、見づらい場合は画像をクリックしてフルサイズでご覧ください)

まずはエラーチェック。構文間違えなどをリアルタイムに指摘してくれます。

error

定義ジャンプ。PHPDoc が表示でき、関数・メソッドの定義位置に F12 でジャンプします。これがないと困ります 🙂

jump

「定義をここに表示」と「参照先検索」機能。「ここに表示」はインラインで関数定義の内容をぱらっとみるとき便利です。また、PHP は動的型付け言語なので完全ではありませんが、呼び出し元検索があるのは嬉しい部分です。

ref

最後は入力補完。 PHP の標準関数を補完しています。 PHPDoc を表示しながら、引数が入力できます。

comp

ユーザ定義関数の補完も現在 master ブランチでは可能になっています。 コメントアノテーションもみて、参照を解決しているのが分かります。

https://github.com/felixfbecker/php-language-server/pull/165

comp2

Ecipse PDT や PHPStorm 並の機能です。すごい。

このペースでいきますと、おそらく年内にはユーザ定義関数の補完も実装が完了し使える形になると思います。つまりは、WordPress や baserCMS のテンプレートタグの補完が可能になります。 😀

ユーザ定義関数補完以外は既に動作するものが Marketplase にリリースされていますので、まずは導入してアップデートを楽しみに待ちましょう。 🙂

https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-intellisense

Advanced PHP IntelliSense for Visual Studio Code.
In opposite to the included PHP IntelliSense and other PHP extensions, this uses an AST to parse the source code
instead of relying on naive regular expression parsing.

その他の機能のスクリーンキャストは以下で見ることができます。(ぼくのへたなアニメよりずっと分かりやすいのでぜひご覧ください…)

https://github.com/felixfbecker/vscode-php-intellisense

さて、この拡張は同じ作者の方がかかれている PHP 7 で実装された php-language-server を利用して動作しています。(このため、拡張を動作させるには vscode を動かすマシンに PHP 7 が導入され、パスが通っている必要があります)

この親となっている php-language-server ですが、これは Microsoft Language Server Protocol の実装です。

Language Server Protocol は、エディタ(IDE)と言語解析器をつなぐための共通プロトコルですので、今後 php-language-server は vscode 以外のテキストエディタと接続できる可能性があります。 (既に Eclipse Che が PHP サポートの実装に php-language-server を使っています)

逆に Visual Studio Code から見た場合、新しく追加された言語サーバーに接続することで、どんどん対応言語を増やすことができる仕組みです。(現在 vscode は Language Server Protocol クライアントのリファレンス実装のような形になっています)

vscode と Language Server Protocol を使って対応されている言語の一覧は以下で見ることができます。

https://github.com/Microsoft/language-server-protocol/wiki/Protocol-Implementations

Language Maintainer Repository
PowerShell MS VS Code PowerShell extension
C++ MS VS Code C++ extension
C# OmniSharp Many integrations, repository
JSON MS Bundled with VS Code
CSS/LESS/SASS MS Bundled with VS Code
Xtext language framework Eclipse Eclipse Xtext
Crane PHP HvyIndustries VS Code Extension
PHP Felix Becker php-language-server
Haxe Dan Korostelev (@nadako) VS Code Haxe extension
Java (javac) @georgewfraser Javac based Java support
RAML RAML Workgroup raml-language-server Work in Progress
API Elements Vincenzo Chianese(@XVincentX) vscode-apielements
groovy Palantir groovy-language-server
Java (Eclipse) Eclipse, RedHat java-language-server, becoming Eclipse JDTLS
OCaml/Reason freebroccolo ocaml-language-server
Go Sourcegraph sourcegraph-go
Rust Jonathan Turner rustls
Scala Iulian Dragos dragos-vscode-scala
Polymer Polymer Team polymer-editor-service

まだまだ未完成のものもありますが、PowerShell などは完成形になっていてかなり使いやすいです。 標準の PowerShell ISE より良いかも?

というわけで、このような言語サポートも手伝って Visual Studio Code は愛用のエディタになりました。開発も活発なので今後も楽しみです。 😀