あなたのポケコン、まだ生きています。

# あなたのポケコン、まだ生きています。

この記事は [MA ヒーローズ・リーグ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/heroesleague) 10 日目の記事です。

はじめましての方ははじめまして。ぺんた @plageoj と申します。

2019 年ヒーローズリーグに応募した [Twitter for PC-G850](https://protopedia.net/prototype/95192c98732387165bf8e396c0f2dad2) で学生リーグ・オレトクリーグ優勝＆ MA リーグ 3 位という結果を残した、そう、あのポケコン少年です。

![](https://protopedia.net/sites/default/files/prototype/2016/img/IMG_20191111_015521.jpg)

※ 写真は SHARP PC-G850S。奥に見えるのが最新機種の PC-G850VS。

VR、機械学習、その他諸々…… モダンな環境と圧倒的な計算機パワーを相手に、
いっちょまえに戦ってくれた愛すべき Z80 マシン。

ポケコンが旧世代のハードであることは間違いありませんが、
それでも、できることがあると証明してくれました。泣きそうでした。
そう、**あなたのポケコンも、まだ生きています**。

入手当時はベーマガも PJ も廃刊、ネットに接続できる環境もなく、
完全に手探りでここまでやってきました。長い道のりでした。

ポケコンに関する記事はもう多くは残っていません。マニュアルや有志による解析資料も入手しづらくなっています。
そこでここに、Twitter for PC-G850 を支える基礎技術をいくつか書いておこうと思います。
これを読んだ人が、押し入れに眠るポケコンを取り出して電源を入れることを願って。

## 対象機種

私が一番長くつきあってきたポケコンは SHARP PC-G850VS です。基本的に本機種で動作確認を行っています。
今年に入ってから PC-E500 を買ったのですが、まだ日が浅くイマイチ操作に慣れていません。

CASIO はじめ他社製のポケコン、SHARP の初期～中期のポケコンは、実機がないので守備範囲外です。

## モダンなマイコンと通信する

Z80 搭載の学校教育専用機である G シリーズには、画面左側の 11pin 端子に Z80 SIO が出ています。
また E500 には、画面右側の 15pin 端子でシリアル通信ができます。

実はこの入出力は最近のマイコンの UART の極性を反転しただけのものです。
参照: [PC-G850V(S) User Manual / Interface](https://www.manualslib.com/manual/1251415/Sharp-Pc-G850vs.html?page=6#manual)

ポケコンの出力電圧は 5V なので、5V 動作のマイコンで、かつシリアルの極性を反転できるのであれば、
ポケコンと直結して相互に通信することができます。

3V 動作のマイコンでも、適当にレベルコンバータをかませば問題ありません。
気になる人はデジタルアイソレータを使うとよいでしょう。

詳細はこちら: [ポケットコンピュータ PC-G850VS を最近のマイコンと接続する](https://qiita.com/plageoj/items/681f3331746871c5f2f8)

この方法であれば、`OPEN "COM1:` とするとマイコンがファイルとして見えますから、
普通の `PRINT #` `INPUT #` で通信ができます。

> E500 ではシリアルデバイスに #1 ～#255 の任意のファイル番号を割り当てられますが、
> G850 では必ず #1 になります。
> E500 でシリアルポートを開くには `OPEN "COM:9600,N,8,1,A,L,&H1A,X,N` などとすればよいです。
> 詳細: [OPEN コマンドの詳細が解らない - SHARP PC-E500 の使い方](https://ht-deko.com/pce500/#05_07)

ただし、受信バッファはあまり大きくないので、マイコンから大量のデータを一気に送らないようにしましょう。
G850 の場合 `ERROR 72` を吐いて、プログラム全体の実行が止まってしまいます。
G850 の BASIC には `ON ERROR GOTO` ないんですよね。
E500 をお持ちの方はエラーハンドリングをしてもいいでしょう。

また、`INPUT #` を実行すると、データ終端の `EOL` が送られてくるまで処理が中断します。
中断すると困る場合は、`INPUT #` の直前に `EOF` を見て、データがきているかどうか確認すればよいです。

なお、この EOL は [TEXT]→[Sio]→[Format] の End of line 項目で変更可能です。
E500 の場合は `OPEN` 文で指定します。

マイコンと通信できるなら………なんでもできますね！

## 印刷出力を引き出す

SHARP のポケコンには 11pin 拡張端子があり、プリンタ・カセットインタフェースの出力を
取り出せるようになっています。

ところが、現在対応するプリンタ・インタフェースは生産されておらず、
オークションでの入手も非常に難しい状態です。

そこで、純正プリンタの動作をマイコンでエミュレートすることを目指します。
出力を印刷するのではなく、シリアルに乗せて PC に送れるならじゅうぶんです。

この方法なら、BASIC プログラムを ASCII 形式に変換しなくても
書き出せるようになるので、ポケコンの容量を全部使うような巨大なプログラムでも
バックアップをとれるようになります。

普通に ASCII に変換してシリアル転送するとメモリの半分弱までしか使えないのですね。

バックアップを書き戻すにはカセットインタフェースの解析が必要なのですが、
これは必要にせまられたらやりたいと思います。

さて、プリンタとの通信には SSIO （同期シリアル入出力）というプロトコルを用います。
ポケコンのクロックに合わせてデータが送られてきます。

タイミングチャートは上記と同じマニュアルに載っています。
参照: [PC-G850V(S) User Manual / Interface](https://www.manualslib.com/manual/1251415/Sharp-Pc-G850vs.html?page=11#manual)

Arduino で動くソースコードはこちらにアップロードしてあります。
[Gist](https://gist.github.com/plageoj/7ee3254a429d384c1adb4d1b4601c33d)


## さいごに

…… ポケコンをお持ちのあなた。持ってないあなた。
ポケコンで賞を取れるのは、同じ苦労をした人がいる間だけです。
このままでは、あと 5 年もすれば理解者がいなくなってしまうでしょう。

BASIC でプログラミングを学び、電池交換のメモリ破壊に泣き、
授業中にこっそりゲームをつくっていた僕らが恩返しできるとすれば、
何かを作り続けること、ただそれだけなのです。

ないものは作る。X68000 が僕らに教えてくれたことです。
草の根を草の根のままにさせない。

さあ、ポケコンを取り出して電源を入れてみてください。
来年、再来年、ポケコンリーグが爆誕するかもしれません。
そのときあなたと一緒に切磋琢磨できることを待ち望んでいます。
**あなたのポケコン、まだ生きています。**

明日は、@hiro_matsuno2 さんです。