メモリ増設
40pinシステムバスに拡張メモリを追加します。今回は外部拡張ROMのアドレスにSRAMを配置し、 64kバイトのRAMを増設して、その上に動画データを配置して動画再生するまでを説明しています。
関連するファイルはすべてこちらに置いてあります。
ハードウェア
コネクタ
1.27mmピッチカードバス、20ピンずつ裏表で合計40pinのものが適合します。
- https://www.amazon.co.jp/gp/product/B01E3GL78K/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1
- http://www.aitendo.com/product/17716
なかなか適合するコネクタを探すのが大変でしたが、上記2つは申し分ないです。とくにaitendoに至ってはPC-G850Vの型名を出してますし、変換基板も販売しています。そのうち在庫がなくなるでしょうけど。
ピン配置はこちらを参照してください。システムバスの解析・確認はこちらのように行いました。
SRAM
外付けROM領域は0x8000-0xc000の16kBを4バンクで合計64kBが確保されています。
マシンサイクルが8MHzなので122nsec以下のアクセスタイムに対応しているRAM/ROMであればOkということで、 秋月の1Mbit SRAMを選定しました。 1Mbit=128KB、55nsecなのでちょっと容量が余りますがまあいいでしょう。
基板
アドレス線だけでも16本と本数が多く面倒ですので、基板を起こすことにします。 ほぼコネクタとSRAMだけの基板で、周辺部品はSRAMのパスコンのみです。
基板はKiCadで作成しました。こんなかんじです。ただバス線をSRAMにつなぐだけですが、テストピンを出したら配線数が増えてえらく大変でした。
デバッグ用のテストピンの配置はこんなかんじです。
デバッグをしたところ、配線にミスがありました。RAMのE1ピンはLイネーブルですが、E2ピンはHイネーブルでした。E2がGNDにつながっているとチップが有効になりません。E2の接続先をGNDから5Vに変更することで動作確認できました。
ソフトウェア(動画準備)
メモリを膨大に使うアプリといえばマルチメディアと相場は決まっているわけですが、せっかくなので動画をやってみましょう。液晶が1bit階調なので、1フレームあたり144x48=864ビット消費します。64kBytesあれば、75枚絵が入ります。30fpsだとすれば、2.5秒という計算。
ひとまず32kBytes上限ということで30フレーム分の動画を確認してみると下記のようになります。
ちなみに動画をどう作るかもいろいろと模索があって、こちらにメモっておいたので興味のある方はどうぞ。
さて、この動画、短いですねー。これが3倍になったところでけっこう厳しい。正直ちょっとこの長さでは微妙なので、圧縮を考えます。とはいえ階調がないので、普通のランレングス符号で十分に思えます。
ワイヤーフレームであるがゆえに0データが連続しがちで、実際データを眺めたところ0x00のデータの連続が多いことがわかりました。 そのため、0x00のみ特殊扱いして、0x00の後に連続する0x00の数を書く、という仕様にしました。0x00は最大255個以上 続くことがありますが、その際は再度カウントを開始します。
圧縮前: 00 00 00 00 00 AA 23 ..
圧縮後: 00 05 AA 23 ..
圧縮前: 00 ..(258個0が続く)............00 AA 23 ..
圧縮後: 00 FF 00 03 AA 23 ..
これで倍ぐらいは入るようになりました。60フレームぐらい。もともとの動画にはフレーム間の時間を調整するウェイトを入れていたのですが、 圧縮の展開でその時間は食いつぶしました。
ソフトウェア(RAMへの書き込み)
さて、ではこれを外付けRAMに書き込むわけですが、ポケコン側では、
- 受信OkをPC側に伝える。0x01をスタートコードとする。
- UARTで圧縮データを1フレームぶん受信する。0x00が3つ続いたらフレーム終了とする。
- フレーム情報(保存先のバンク、開始アドレス、サイズ)をヘッダに書いておく。バンクが0xFFなら転送終了とする。
- フレーム情報をテーブルに記録する
- フレームデータを外付けRAMに書き込む。
という処理をフレーム分繰り返します。すべてのフレームを転送した後に、
- テーブルを参照しながら圧縮フレームデータを展開
- 展開したデータを画面に出力
をフレーム分繰り返すことになります。
UARTの受信はまるひろさんのページなどを参考に実装します。 なお、64KBytesをすべて9600bpsで転送すると1分ぐらいかかります。これの高速化はいずれ考えます。
増設RAMだけではなく、内蔵RAMも使い切らないともったいないので、バンク0x10と指定されたら内蔵RAMに書くことにしました。
メモリマップは下記のようになります。合計約85.5KBytesが画像データに当てられます。
実行例
メインプログラムの使い方
こちら をダウンロードしてmain.ihxをビルドして転送します。
ポケコンで0x100から実行すると、
push 1 to start
と表示されます。
この状態で、PC側の送信ソフトウェアtransfer.pyを実行します。画像のPCメモリへのロードと変換が終わると
done. start pocket-computer now
と表示されます。この状態でポケコンで1キーを押すと、PCからポケコンへのデータ転送が始まります。
すべてのフレームの転送が終了するとポケコン側に下記が表示されます。
push 5 to go
5キーを押すと動画の再生が始まります。終了後は0を押すと再開、9を押すとプログラムが終了します。