2012年12月04日

動画再生(3)

 『動画再生カートリッジ』の妄想の話。

  初代P6 では、外部からVRAMデータを流し込む事が可能なので、かなりの事が出来そう。音声に関しても、外部で同期を取ればいいので、実現は出来そうです。

  ただ、初代P6 のグラフィック能力での画像再生はイマイチっぽいので、出来ればmk2以降で再生するのがいいかと思います。


  ですので、CPUでVRAMに書き込む方法で、どの程度のグラフィックが描けるかを考えてみました。

0)前提条件
 ・本体の改造はしない。
 ・グラフィックは、MODE5 の320×200×2色か、160×200×4色。つまり16Kバイト分の書き込みが必要。
 ・当然、バスリクエストはOFFにしない。CPUの実質のクロックは、4MHz ×(62×912+200×176) / (262×912) = 1.536MHz
 ・外付けのハードウエアは、とりあえずどんな物でも可能とする。



1)単純なメモリ間のブロック転送方法
  外付けハードから画面データを読み込み(メモリマップドI/O)、そのデータをVRAMに書き込む。

  LD HL,画面データアドレス
  LD DE,VRAMアドレス
  LD BC,0x4000
  LDIR  ; 21+2

  1バイト当たり23クロック。
  1ページ描画(16Kバイト書き込み)には 245ms 。
  1秒のフレーム数は、4.08 枚。

  プログラムを外付けにすれば、No WAIT に出来る。その場合は、

  1バイト当たり21クロック。
  1ページ描画(16Kバイト書き込み)には 224ms 。
  1秒のフレーム数は、4.46 枚。



2)単純なI/O→メモリ間の転送方法

  外付けハードから画面データを読み込み(通常のI/O)、そのデータをVRAMに書き込む。

  LD HL,VRAMアドレス
  LD C,読み込みポート
  LD B,0x00
  LD E,0x40
LOOP:
  INIR     ; 21+2 / 16+2
  DEC E     ; 4+1
  JP NZ,LOOP  ; 10+1

  1バイト当たり23クロック。ただし、256バイト置きに 11クロック増える。
  1ページ描画、フレーム数は、1)とほぼ同様。



3)1)、2)のループを止める転送方法

  1)の場合だと、

  LD HL,画面データアドレス
  LD DE,VRAMアドレス
  LDI  ; 16+2
  LDI  ; 16+2

    :
    : ×0x4000回実行
    :

  1バイト当たり18クロック。
  1ページ描画(16Kバイト書き込み)には 192ms 。
  1秒のフレーム数は、5.21 枚。

  No WAIT 時は、

  1バイト当たり16クロック。
  1ページ描画(16Kバイト書き込み)には 171ms 。
  1秒のフレーム数は、5.86 枚。



4)画面データをプログラムに直書きする

  LD HL,VRAMアドレス

  LD (HL),画面データ#0  ; 10+1
  INC L          ; 4+1
  LD (HL),画面データ#1  ; 10+1
  INC L          ; 4+1

    :
    : ×0x4000回実行
    :

  INC L は、256回ごとに、INC HL とする。この際、クロック数は、6+1

  1バイト当たり16クロック。ただし、256バイト置きに 2クロック増える。
  1ページ描画(16Kバイト書き込み)には 171ms 。
  1秒のフレーム数は、5.86 枚。

  No WAIT 時は、

  1バイト当たり14クロック。
  1ページ描画(16Kバイト書き込み)には 149ms 。
  1秒のフレーム数は、6.69 枚。



5)直書きその2

  LD HL,画面データ#0,1  ; 10+1
  LD (VRAMアドレス+0),HL ; 16+1
  LD HL,画面データ#2,3  ; 10+1
  LD (VRAMアドレス+2),HL ; 16+1

    :
    : ×0x2000回実行
    :

  1バイト当たり14クロック。
  1ページ描画(16Kバイト書き込み)には 149ms 。
  1秒のフレーム数は、6.70 枚。

  No WAIT 時は、

  1バイト当たり13クロック。
  1ページ描画(16Kバイト書き込み)には 139ms 。
  1秒のフレーム数は、7.21 枚。



6)プログラム直書き+PUSH

  LD (SP待避),SP
  LD SP,VRAM最終アドレス+1

  LD HL,画面データ#-1,-2 ; 10+1
  PUSH HL         ; 11+1

    :
    : ×0x2000回実行
    :

  1バイト当たり11.5クロック。
  1ページ描画(16Kバイト書き込み)には 123ms 。
  1秒のフレーム数は、8.15 枚。

  No WAIT 時は、

  1バイト当たり10.5クロック。
  1ページ描画(16Kバイト書き込み)には 112ms 。
  1秒のフレーム数は、8.93 枚。


 6)が限界っぽいです。描画サイズを小さくすると、もうちょっとフレーム数を稼げます。

 ハードを作るのは気が向いたら、ですね...



posted by えすび at 20:53| Comment(2) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
転送量は 8000 バイトなので 192 バイト分浮きませんかね。
相対的には 6) で変わりないと思いますが。

縦解像度だけ高いのは気に入らない→1ライン毎飛ばして160x100にする、
とかだともう少し伸びるかも。

動画再生には出来れば 10fps は欲しいですねえ。
vsyncがきっちりとれるなら初代(mode1/2)での多色環境も妄想
してみたいところですが。
Posted by bookworm at 2012年12月04日 22:33
 外付けハードなら、VSYNCは確実に取れます。

 ですので、mode1/2 での多色環境は出来ると思います。

 例えば、スクリーン3(128×192)で、4色ではなく8色とかは可能です。
 ただし、1バイトの中ではカラーセットは変えられませんが...


 1バイトの制限はありますが、スクリーン3と4の混在も可能です。
 ただし、こっちは初代機はいろいろと問題が出るかと思います。

 初代機のスクリーン4カラーセット2には、色情報が乗らないので、この辺りで画面が汚くなります。


Posted by えすび at 2012年12月05日 19:13
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。