MSX Datapack wiki化計画

10章 V9958の画面モード

 MSX-BASIC 3.0では、YJKモードおよびYJK/RGB混在モード(以下、YJKモードとYJK/RGB混在モードを総称して、自然画モードと呼ぶ)として、SCREEN 10〜12を設けていますが、V9958ではそれに相当するGRAPHICモードはありません。
 V9958を自然画モードにするためには、表示モードをGRAPHIC 7にした上で、R#25のbit 3、4を操作します。詳しくは、10.4のサンプルプログラムをご参照ください。

 10.1 SCREEN 9

 SCREEN 9 は韓国バージョンのMSXでハングル文字を表示するために使われています。したがって、日本製のMSXでは使用しません。

 10.2 SCREEN 10、11

10.2.1 特徴

■解像度 横256×縦212ドット(または縦192ドット)のYJK・RGB混在モード
■表示色 12,499色同時(全画面)
■スプライト モード2(パレットが使用可能)
■1画面に必要なVRAM容量128Kバイト(2画面)

10.2.2 関係するレジスタとVRAMの領域

 GRAPHIC 7 (SCREEN 8) と同じです。BASICではSCREEN 10またはSCREEN 11として扱います。

10.2.3 初期設定

 R#25以外は、GRAPHIC 7 (SCREEN 8)と同じです。

 は表示モード設定用のビットをYJK・RGB混在モードにセットした例です。この表示モードでは、LN=1のとき縦212ドット、LN=0のとき縦192ドット(BASICではサポートしない)に設定されます。その他のビットは任意に設定します。

1)パターンネームテーブルの設定

図4.68 SCREEN 10、11モードのパターンネームテーブル

10.2.4 SCREEN 10、11モードのVRAMマップ

 GRAPHIC 7 (SCREEN 8)と同じです。

10.2.5 SCREEN 10とSCREEN 11の違い

 VDP上ではSCREEN 10と11は何の違いもありません。アトリビュートが「0」の画素はYJK方式で表示され、アトリビュートが「1」の画素はYの4ビットが色コードとして扱われます。MSX-BASIC 3.0ではこのYJK/RGB混在モードをさらに2つのスクリーンモードとして扱います。
 SCREEN 10では、

  • LINE、PSETなどの描画コマンド
  • PRINT#文による文字表示
  • 漢字モードにおけるグラフィック画面へのPRINT文

などで色指定を行うときは、SCREEN 0から7までで使用する通常の色コードである0〜15だけが使用できます。これ以外の値はIllegal function callとなります。この色指定でRGB以外の部分、すなわちJKの成分(下位3ビット)はそのままにして、描画されない画素の表示が影響されることを防ぎます。
 例えば、色コード15のドットはこの画面ではY成分の部分(上位4ビット)及びアトリビュートビットを1にすることになり、VRAM上では&HF8となりますが、SCREEN 10のときは描画に際して、このような変換を意識する必要はありません。
 一方、SCREEN 11では、色コードの扱いはVRAM上の値そのものとなり、色コードは0〜255を指定できます。

 10.3 SCREEN 12

10.3.1 特徴

■解像度 横256×縦212ドット(または縦192ドット)のYJKモード
■表示色 19,268色同時(全画面)
■スプライト モード2(パレットが使用可能)
■1画面に必要なVRAM容量128Kバイト(2画面)

10.3.2 関係するレジスタとVRAMの領域

 GRAPHIC 7 (SCREEN 8) と同じです。BASICではSCREEN 12として扱います。

10.3.3 初期設定

 R#25以外は、GRAPHIC 7 (SCREEN 8)と同じです。

 は表示モード設定用のビットをYJKモードにセットした例です。この表示モードでは、LN=1のとき縦212ドット、LN=0のとき縦192ドット(BASICではサポートしない)に設定されます。その他のビットは任意に設定します。

1)パターンネームテーブルの設定

'''図4.69 SCREEN 12モードのパターンネームテーブル

10.3.4 SCREEN 12モードのVRAMマップ

 GRAPHIC 7 (SCREEN 8)と同じです。

 10.4 SCREEN 10、11、12の設定方法

 SCREEN 0〜8の切り替えは、モードレジスタに値を設定することによって行いますが、自然画モード(SCREEN 10〜12)については、別の方法を使います。なぜならば、自然画モードとはV9958にとって、GRAPHIC 7モードでR#25のYEAビットとYJKビットを設定した状態だからです。
 したがって、GRAPHICモードが7の状態で以下のプログラムを実行すれば、SCREENモードを10、11、12に設定することができます。
 MODE変数のbit 5のSET、RESETはROM内のルーチン(GRPPRT、NVBXLNなど)を使用する可能性がある場合にのみ必要で、アプリケーションがVDPを直接操作する場合には必要ありません。もちろん、そのような場合には、アトリビュートの操作はアプリケーションプログラムから行わなければなりません。
 また、BASICで行っているようなサービス(SCREEN 12からSCREEN 10に切り替えた時アトリビュートを落としている)は、以下の中には含まれていません。

リスト4.1 SCREEN 10、11、12の設定方法

mode     equ    0fafch
rg25sa   equ    0fffah             ;register #25 save area
wrtvdp   equ    47h

screen10:
         ld     hl,mode
         res    5,(hl)
         ld     a,(rg25sa)
         or     00011000b
         ld     b,a
         ld     c,25
         jp     wrtvdp

screen11:
         ld     hl,mode
         set    5,(hl)
         ld     a,(rg25sa)
         or     00011000b
         ld     b,a
         ld     c,25
         jp     wrtvdp

screen12:
         ld     a,(rg25sa)
         and    11100111b
         or     00010000b
         ld     b,a
         ld     c,25
         jp     wrtvdp

         end