『動画再生カートリッジ』の妄想の話。
初代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)が限界っぽいです。描画サイズを小さくすると、もうちょっとフレーム数を稼げます。
ハードを作るのは気が向いたら、ですね...


相対的には 6) で変わりないと思いますが。
縦解像度だけ高いのは気に入らない→1ライン毎飛ばして160x100にする、
とかだともう少し伸びるかも。
動画再生には出来れば 10fps は欲しいですねえ。
vsyncがきっちりとれるなら初代(mode1/2)での多色環境も妄想
してみたいところですが。
ですので、mode1/2 での多色環境は出来ると思います。
例えば、スクリーン3(128×192)で、4色ではなく8色とかは可能です。
ただし、1バイトの中ではカラーセットは変えられませんが...
1バイトの制限はありますが、スクリーン3と4の混在も可能です。
ただし、こっちは初代機はいろいろと問題が出るかと思います。
初代機のスクリーン4カラーセット2には、色情報が乗らないので、この辺りで画面が汚くなります。