V9968 は開発中です。 ここに書いた V9968 の動き (測った値や、R800 での VRAM の読み出しなど) は 2026-10-09〜10-13 ごろの FPGA で確かめたもので、ここに書いたことも書いていないことも、今後の FPGA の更新で直ったり変わったりすることがあります。
| ファイル | 内容 |
|---|---|
V9968TST.COM | 機能の確認: VRAM 試験と全画面モードの表示 (MSX-DOS のファイル名は 8 文字までなので TEST を TST に縮めている) |
V9968TIM.COM | タイミングの確認: パレットのラスター / snow、ページ切り替えのタイミング、走査線割り込みでの分割、速さ (下の「V9968TIM」) |
V9968G3D.COM | Geo3D (Alex Moncks 氏の 3D 補助プロセッサ) が載っているかの確認 (下の「V9968G3D」) |
使い方
V9968TST [/8] [/9] [/R]
| オプション | 意味 |
|---|---|
| なし | 88h に VDP があれば 88h、なければ 98h |
/8 | 88h (V9968 カートリッジの既定の I/O) に固定 |
/9 | 98h (本体 VDP の位置) に固定 |
/R | turboR で R800 のまま実行する。既定は Z80 に切り替えて、終わったら戻す |
テスト画面でのキー操作:
| キー | 動作 |
|---|---|
| SPACE / → | 次の画面 (最後の次は VRAM 試験に戻る) |
| BS / ← | 前の画面 |
| RETURN | 今の画面をもう一度 (VRAM 試験なら試験をやり直す) |
| ESC | 終了 |
起動時と終了時に、MSX 本体の画面 (DOS) に VDP の種類・I/O・VRAM 容量・CPU と、VRAM 試験の結果を表示する。88h のときは本体の VDP には触らないので、テスト画面は V9968 側 (HDMI) にだけ出る。
画面
| # | モード | 内容 |
|---|---|---|
| 0 | SCREEN 0 W40 | VRAM 試験 (下記) |
| 1 | SCREEN 0 W40 | 桁の目盛り、外周の枠、256 文字、1 ドットの縦じま・市松・塗り |
| 2 | SCREEN 0 W80 | 同上 (80 桁) + ブリンク (R#12 = F8h, R#13 = 33h) |
| 3 | SCREEN 1 | 16 色 x (塗り / 市松 / 縦線 / 横線)、文字 |
| 4 | SCREEN 3 | 16 色の縦のバー、斜めの色の帯、白い外周 |
| 5 | SCREEN 2 | 格子、同心円、対角線、四隅の 1 ドットの模様、16 色のバー (8x1 の色で虹色) |
| 6 | SCREEN 4 | 同上 + スプライトモード 2 (1 ラインに 9 個並べて 8 個だけ見える。ライン毎の色) |
| 7, 9, 11, 15 | SCREEN 5 / 6 / 7 / 8 | テストカード: カラーバー (75%)、8 段の階調、解像度 (1-4 ドットの縦じま)、円、格子、四隅と下の 1 ドットの模様 |
| 8, 10, 12, 16 | SCREEN 5 / 6 / 7 / 8 | 幾何パターン: 格子、対角線、6 重の同心円、四隅と中心の模様 |
| 13 | SCREEN 7 インターレース | 512x424 (R#9 IL+EO、ページ 0 = 偶数ライン、ページ 1 = 奇数ライン): 格子、6 重の同心円、左上 1 ラインの横じま (片方のフィールドだけ白)、右上 2 ラインの横じま、左下 424 ラインの市松、右下 1 ドットの縦じま |
| 14 | SCREEN 7 フラットインターレース | 同じ絵を V9968 の R#20 FIL (VRAM の上から 424 ラインが順に並ぶ。VDP コマンドの DY = 0-423) で (V9968 のみ) |
| 17 | SCREEN 8 | 256 色の表 (16 x 16) |
| 18 | SCREEN 8 + EPAL | 32768 色から 256 色: 赤・緑・青・灰 各 32 段、色相 128 段 (V9968 のみ) |
| 19 | SCREEN 12 | YJK: J-K の平面 (Y = 16)、Y の 32 段の階調、カラーバー (V9958 以降) |
| 20 | SCREEN 10/11 | YJK + パレット: J-K の平面とパレット 16 色、Y の 16 段、カラーバーの上にパレットの文字 (V9958 以降) |
- インターレースの HDMI 出力 (FPGA のソース vdp_video_out.v より): V9968 は 2 つのフィールドを合成しない。MSX の 1 ラインを HDMI の 2 ラインに出すが、インターレースのときはフィールドに応じて片方だけを光らせ、もう片方を黒にする。CRT と同じく偶数・奇数フィールドが 60Hz で交互に出るので、片方のフィールドにしかない 1 ラインの横線は 30Hz でちらつく (格子の横線は 2 ラインにしてある)。
- 円は MSX の 256 ドットモードの画素の縦横比 8:7 で丸く見えるように描いている (512 ドットのモードは横 2 倍)。
- 1 ドットの模様は実際の画素単位 (SCREEN 6 / 7 は 512 ドットの 1 ドット)。
- SCREEN 5-8 の線・塗り・文字は VDP コマンド (HMMV / LMMV / LINE / LMMC、XOR と TIMP) で描くので、コマンドの確認にもなる。
- V9968 では SCREEN 5-8 を VRAM の上半分などのページに描いて表示する (SCREEN 5 = ページ 5 (28000h)、6 = ページ 6 (30000h)、7 = ページ 2 (20000h)、8 = ページ 3 (30000h)、256 色の表 = 10000h、EPAL = 20000h)。R#2 の A17 と、VDP コマンドの DY bit10 を使う。
VRAM 試験
VRAM 全体 (V9968 は 256KB = 16 バンク、V9938 / V9958 は 128KB = 8 バンク) を 16KB のバンク単位で調べる。
- データは「乱数の並べ替え表[(列 + K) & 255]」、K = 行 x 13 + バンク x 101 + 7 (行 = 256 バイト)。どのアドレス線がつながっていても・切れていても違う値になるようにしてある。
- 2 回: 乱数のパターンと、その反転 (全ビットで 0 と 1 の両方を確かめる)。
- 手順
- 文字の画面を 0 バンク (00000h-00FFFh) に置き、1 - 最後のバンクを「全部書いてから全部読む」。アドレス線の不良で別のバンクに重なっていると、読み出しで分かる。
- 文字の画面を最後のバンクの末尾 4KB (V9968 は 3F000h、128KB なら 1F000h) に移して 0 バンクを書いて読み、1 - 最後の 1 つ前のバンクが壊れていないか読み直す。
- 結果はバンクごとに
OKかNG BITS:xx CNT:xxxx(xx = 誤りのあったビットの OR、xxxx = 誤りの数)。最初の誤りのアドレス・書いた値・読んだ値も出す。 - 所要時間は Z80 (3.58MHz) で 256KB が約 11 秒、128KB が約 5 秒 (計算値)。
表示に使うだけでは、使わない領域やアドレス線の重なり (128KB 以降が 0 番地からの写しになっている等) が分からないので、試験は表示とは別にした。
V9968TIM (タイミング)
V9968TIM [/8] [/9] [/R]
オプションは V9968TST と同じ。キー: SPACE / → 次のテスト、BS / ← 前、RETURN モード切り替え、↑↓ 調整、ESC 終了。CPU の速さで結果が変わるので、Z80 (既定) と R800 (/R) の両方で見るとよい。
| # | テスト | 内容 |
|---|---|---|
| 1 | パレットのラスター (SCREEN5) | 毎ライン、水平帰線 (S#2 HR) の始まりでパレット 0 (左半分と周辺) を書き換える。色の変わり目がラインのどこに来るか、ゆれがないかを見る。RETURN でモード: ラスター / snow (表示中に、画面に出ていないパレット 15 を書き続ける。点が出たら表示中のパレット書き込みで乱れる) / V9968 は EPAL (3 バイト) のラスター / snow も |
| 2 | ページ切り替えのタイミング (SCREEN5) | ページ 0 = 色 1、ページ 1 = 色 2。毎フレーム、垂直帰線の始まり + N ラインで「これから出すページの色 = 灰色、今のページの色 = 赤」をパレットに書いてから R#2 を切り替える。灰色なら次のフレームから切り替わっている。赤やちらつきは 1 フレーム遅れ、上下で分かれるのは表示の途中で効いている。↑↓ で N、RETURN でパレットを 4 バイト / EPAL 768 バイト (V9968) |
| 3 | 走査線割り込みでの分割 (SCREEN5) | R#19 のラインで S#1 の FH を待ち、R#23 (縦スクロール) とパレット 0 を変える。帯の番号でスクロールが、周辺の色で変わる位置が分かる。↑↓ で分割位置、RETURN でスクロールあり / なし |
| 4 | 速さ | 1 フレームと垂直帰線のライン数、パレット 32 バイト、EPAL 768 バイト、VRAM 16KB の書き込み / 読み出し (OTIR / INIR)、SCREEN8 の HMMV / LMMV / HMMM / LMMM (256x212)。V9968 は VDP コマンドを通常 / 高速 (R#20 HS) の両方。垂直帰線の始まりからのライン数と ms (1 ライン = 64us として) を SCREEN0 に出す。RETURN で測り直す |
| 5 | CPU からの VRAM アクセス (turboR のみ) | VRAM 10000h-13FFFh (16KB) を「R800 で書いて Z80 で読む」(書き込みの誤り) と「Z80 で書いて R800 で読む」(読み出しの誤り) に分け、OTIR / INIR と、1 バイト毎に待ち (dec a / jr nz を 1-32 回) を入れた場合で誤りの数を数える。最初に Z80 だけの基準も測る |
- S#2 の HR / VR は V9938 と同じく帰線の間が 1。
- FH は IE1 に関係なく立つ (vdp_cpu_interface.v)。テスト 3 は念のため IE1 = 1 にするが、割り込みは禁止 (DI) のまま S#1 を読んで待つ。
- カートリッジの「強制高速モード」のスイッチが右だと、テスト 4 の VDP コマンドは通常の欄も高速になる。
- V9968 実機 (turboR、I/O 88h、2026-10-09) の値 (ライン数):
項目 Z80 R800 1 フレーム / 垂直帰線 262 / 51 262 / 51 パレット 32B 5 1 EPAL 768B 81 (帰線に入らない) 22 VRAM 書き込み / 読み出し 16KB 1715 / 1715 479 / 479 HMMV / LMMV / HMMM / LMMM 50 / 154 / 133 / 225 同じ 同 (HS) 44 / 153 / 133 / 225 50 / 154 / 133 / 225 V9968TST /R (R800) の VRAM 試験は全バンク NG (各バンク 16KB 中 55-110 個、ビットはまちまち。例: 04DA0h に 85h を書いて 87h)。アドレスはずれず、データのビットだけが化ける。turboR は 98h-9Bh の VDP には R800 でも待ちを入れるが、88h には入れないので、R800 の連続アクセスにカートリッジが追いつかないと考えられる。テスト 5 の結果 (R800): 書き込みは OTIR でも待ちを入れても誤り 0。読み出しは INIR で 7、1 バイト毎の待ち 1-32 で 29-52 と、間を空けても減らない。誤りはどれも 0 のビットが 1 になる (85h→87h、12h→1Bh、7Ah→FFh) ので、R800 の短い IN の間にカートリッジがデータを出し終えていない (データバスのプルアップで 1 が読める) と考えられる。FPGA のソースでも Port#0 の読み出しは VRAM のデータが届いてから出す作り (先読みのバッファがない)。つまり R800 では VRAM の書き込みとパレット・レジスタは使えるが、VRAM の読み出しは化ける (Z80 なら誤り 0)。R800 で動かすソフトで VRAM を読む必要があるときは、読む間だけ一時的に Z80 に切り替えるのがよい。上の表の R800 の書き込みの値 (16KB 479 ライン) は正しい。テスト 2: パレット 4 バイトなら +49 ラインまで灰色。EPAL 768 バイト (Z80) は +0 でも上の約 28 ラインが赤 = 768 バイトが帰線に入らず、R#2 は書いたときにすぐ (表示の途中からでも) 切り替わる。
V9968G3D (Geo3D の確認)
V9968G3D [/8] [/9] [/R]
Geo3D は HRA! 氏の FPGA に入っている 3D の補助プロセッサ (作者 Alex Moncks 氏。2026-10-05 の版にはすでに入っている)。ポートは先頭 + 5 (88h なら 8Dh: 番号 / 状態) と先頭 + 7 (8Fh: データ)。結果は DOS の画面に出す。
- 状態のポートを読む。FFh なら Geo3D なし (古い FPGA) で終わる
- レジスタ NVERT に 5Ah を書いて読み返す
- 頂点 1 つの計算を 10 通り (中心、右上、遠く、30° 回転、移動、512x424、手前すぎ (NEAR)、あふれ (OVF)、画面外、2 倍) 行い、前もって計算した答え (SX, SY, Z, FLAGS) と比べる。答えは作者の検証モデル (geo3d/sim/gen_vectors.py) とも一致を確認済み
- 全部合えば、キーを押すと V9968 の画面 (SCREEN5、ページ 0 / 1 を交互) に回転する立方体を Geo3D に描かせる (SPACE / ESC / RETURN で止める)。終わると最初のフレームの DRAWN / CULLED / SKIPPED (線なら 12 / 0 / 0 のはず)、描いたフレーム数、時間、平均フレームレートを出す。時間は turboR ならシステムタイマー (E6h/E7h)、それ以外は JIFFY で測る (88h なら割り込みを止めずに動かすので JIFFY を取りこぼさない。98h で turboR 以外だと、画面消去の待ちなどで取りこぼして短く出ることがある)
- Geo3D の読み出しも VDP と同じく後からデータを返す作りなので、既定の Z80 で動かす (/R は付けない)。
- V9968 実機 (turboR、88h) で、回転する立方体が描かれ、DRAWN / CULLED / SKIPPED = 12 / 0 / 0、平均 59.9fps を確認した。
V9968 について
- I/O は Port#0-3 が V9958 と同じ、Port#4 (= 先頭 + 4) が新設。カートリッジの既定は 88h-8Ch (スイッチで 98h-9Ch)。
- 見つけ方: S#1 の ID が 2 (V9958) なら、Port#4 に 0 を書いて拡張レジスタ (R#20, R#21) のロックを外し、R#21 = 0 (V58 = 0) にして ID を読み直す。3 なら V9968 (VRAM 256KB、新しいコマンド)。
- 終了時は R#20 = 0、R#21 = 1 (V58 = 1)、Port#4 = 80h (ロック) に戻す。
- R#20 = [S16][CEIE][FIL][EPAL][SP3][ILNS][SVNS][HS] (bit7-0。FPGA のソース vdp_cpu_interface.v より)。V9968TST は EPAL と FIL、V9968TIM は EPAL と HS を使う。
- 88h のときは IE0 / IE1 を 0 のまま (カートリッジの割り込みは使わない)。98h のときは BIOS の割り込みが止まらないよう IE0 = 1。
参考: HRA! 氏の V9968_Cartridge (fpga/V9968_Cartridge_TangNano20K/src/v9968/manual/)
確かめた環境
- openMSX (Panasonic FS-A1ST、本体の V9958 を 98h で): 全画面、VRAM 試験、V9968TIM のテスト 1-4
- 実機: MSX turboR + V9968 カートリッジ (I/O 88h)、MSX-DOS2: V9968 の機能 (256KB、EPAL、FIL、HS)、V9968TIM のテスト 5、V9968G3D
参考
- HRA! 氏の V9968_Cartridge: https://github.com/hra1129/V9968_Cartridge
- Geo3D (Alex Moncks 氏): https://github.com/alexmoncks/V9968_Cartridge/tree/main/geo3d
- 開発の報告: https://miyashu.github.io/johndoe/v9968test.html
非公式のテストプログラムです。使用は自己責任でお願いします。