改修方針

性能の限界 (内部RAM不足)

最近の機能追加は CDDA で、そのためには大まかに Compact Disc の仕様調査とディスクイメージの仕様検討と外部音声機能のハードとしての追加が重要となります.

その過程で FPGA 内部の CPU(MCU) のソフトウェア量がどんどん増えていき、ユーザーの利便性より(あとで改善できるのでいまは重要ではないと判断した)も構造の簡素化を選んでそれを抑えておりました.
システムカード内蔵の CD Player と連携して動くところまできて、次はデータ転送かと思いきや、ソフトウェアの RAM 消費量を落ち着いて見たら限界に達していたというのが主な原因です. Cyclone II はあまり高性能ではないため内部RAMも対して大きいわけではありません.内部RAMは専用のデータをハードウェアで使う小回りが効く部品として使うべきであり、ソフトウェアが使うには容量がいまのパソコンのRAMに比べると笑っちゃうほど少ないのです.

ここでいう MCU は HuCard のみの対応では UperGrafx の周辺ICの初期化(I2C)や通信(USB-serial)という単純な役割だけでした. MCU は PCE にはできるだけ本来の動作に影響なく動作させることが目的のため、 PCE の CPU (6280) に MCU の役割をさせられませんし、 PCE が使う RAM を使うこと(6280を一時停止させる以外に)はできません.

frame buffer を MCU 兼用とする

RAM の代替先の選定は候補があまりないので、部品交換か基板作り直しが案になっておりました. ユーザーや販売の立場からはこれは受け入れられませんでした.
その中出てきたのが frame buffer です. これは現状 Video の目的だけで使っております. 容量はほぼ半分(0x40000byteぐらい)空いており、暇な時間も多いのはわかっておりました.

この暇な時間を MCU に割り当てると 0x1000 byte の容量で難儀している分野で 0x40000 byte も自由に使えるのは性能の限界をなくすことができます.
また Video のソースコードは試行錯誤の段階から徐々に直していったこともあり内部構造があまりきれいではありません. この部分の最初からの作り直しは優先度の低い作業でしたが、 MCU 兼用としながら作り直すというのはとても意義があることになりました.

両端の余白の作り直し

この部分は展示のみ文字列をだしておりましたが、内部RAMを使っていたのですが使えなくなりました. MCU が利用する分を抜いても frame buffer の空きがあるので好きな絵を載せることができるように検討しました.
ここの領域は 88x720 pixel が 2 つあり、色の深度は RGB 各5bit が利用できます(PCEは RGB 各3bitなので余っている部分は有効に使えてない). そうすると縦幅は狭いですけど写真も載せられそうと思ってました.

実際にソースを組み始めたところ転送時間の計算を忘れておりました... 720p での 3 scanline の表示時間の frame bufffer 占有率を概算すると下記になっておりました.

  • VCE data read (write も大体同じとする)
    • 15.5% 分周値4
    • 20.7% 分周値3
    • 31.0% 分周値2
  • 余白部 pixel data = 輝度値
    • 2.7% 1bit (モノクロ)
    • 8.0% 3bit (RGB各1Bit)
    • 16.0% 6bit (RGB各2Bit)
    • 24.0% 9bit (RGB各3Bit)
    • 32.0% 12bit(RGB各4Bit)
    • 40.0% 15bit(RGB各5Bit)
  • 余白部 pixel data = index
    • 3.0% 1bit (パレット2色)
    • 6.0% 2bit (パレット4色)
    • 9.3% 3bit (パレット8色)
    • 13.3% 4bit (パレット16色)
    • 18.5% 5bit (パレット32色)
MCUの利用時間占有率 = 100% - VCE data read+write 転送占有率 + 余白部占有率

上記は余裕を持った概算値ですがこの時点でRGB各5bitで1pixel単位描画は無理でした... RAM 容量の空きはきっちり計算した分がっかりしました...

パレット経由方式で8色や16色でそれなりに絵がでるかも確認したのですが、RGB各5bitとはいえ同時発色数が少ないので無理がありました. 占有率もできるだけ小さい方がいいと考えると index 2bit が現実的な値なようです. 結局用途は広告欄にしかならないようでした.

余白の実装はユーザーにとっては重要ではない機能なのでこれぐらいにいたします. (こういう場面は内部がソフトとしての性能が高いLinuxがうごく設計でエミュレータで動かすと簡単です,ただしエミュレータ特有の欠点がでます)