この章の目次にもどる
前頁:第8章 電源管理(パワーマネージメント)にもどる
次頁:第10章 コンソールにすすむ

第9章 スクリーン(ディスプレイ)

9.1 対象デバイス

9.2 固有機能

9.3 起動パラメータ

システム立ち上げ時に以下の指定により起動される。

kerext  screen  [!優先度]       (優先度省略時は 50)

9.4 属性データ

以下の属性データをサポートする。

R 読み込みのみ可
W 書き込みのみ可
RW読み込み / 書き込み可
/* SCREEN データ番号 */
typedef enum {
    /* 共通属性 */
    DN_SCRSPEC    = DN_DISPSPEC,

    /* 個別属性 : -100〜-199 は汎用 */
    DN_SCRLIST    = -100,
    DN_SCRNO      = -101,
    DN_SCRCOLOR   = -102,
    DN_SCRBMP     = -103,
    DN_SCRBRIGHT  = -200,
    DN_SCRUPDFN   = -300,
    DN_SCRVFREQ   = -301,
    DN_SCRADJUST  = -302,
    DN_SCRDEVINFO = -303
} ScrDataNo;
DN_SCRSPEC :
デバイス仕様の取り出し (R)
data:   DEV_SPEC    devspec;

typedef struct {
    H   attr;       /* デバイス属性 */
    H   planes;     /* プレーン数 */
    H   pixbits;    /* ピクセルビット数 */
    H   hpixels;    /* 横のピクセル数 */
    H   vpixels;    /* 縦のピクセル数 */
    H   hres;       /* 横の解像度 */
    H   vres;       /* 縦の解像度 */
    H   color[4];   /* カラー情報 */
    H   resv[6];    /* 予約 */
} DEV_SPEC;
現在設定されている表示モードにおけるデバイス仕様を取り出す ( DEV_SPEC に関しては DP の仕様 gget_spc() を参照のこと)。
DN_SCRLIST :
サポートする表示モード一覧の取り出し (R)
data:   TC  list[];
サポートしている表示モード一覧を以下の形式で取り出す。
<区切り><表示モード><区切り><表示モード>.....<0>
<区切り> は、表示モード番号(1 〜 N < 256) で上位バイト = 0 ということで、表示モードを区切る。
<表示モード>は、解像度や色数などを表わす文字列で、 例えば "1024 × 768 256C" のような簡単な説明文とする。
表示モードは解像度や色数などにグループ化された整然とした順番 に並んでおり、基本的にそのままの順番で表示される。
サポートする表示モードの追加により、順番は変る可能性があるが、 表示モード番号は変らない。
DN_SCRNO :
表示モードの設定 / 取り出し (RW)
data:   W   scrno;
現在の表示モード番号を設定、または取り出す。
表示モード番号は DN_SCRLIST で取り出される表示モードに 付けられている番号である。
PC/AT 版では、表示モードの設定はサポートしていない。
DN_SCRCOLOR :
カラーマップの設定 / 取り出し (RW)
data:   COLOR   map[*]
現在の表示モードにおけるカラーマップを設定、または取り出す。 DEV_SPEC.attr.P = 0 のときは、カラーマップは適用されない。
カラーマップはピクセル値をインデックスとした、絶対 RGB カラー 値の配列となる ( COLOR に関しては BTRON3 仕様書「第2編 OS 仕様 2.2.3 カラー表現」を参照のこと)。 エントリの最大数は、DEV_SPEC のプレーン数×ピクセルビット数 で決まるが、実際にはそれより少ない場合もある。
DN_SCRBMP :
デバイス固有イメージ領域取り出し (R)
data:   BMP devbmp;
現在の表示モードにおける、デバイス固有イメージ領域 ( ビットマップ ) に関する情報を取り出す。
devbmp.baseaddr[*] がイメージ領域のメモリを指し、この領域に DP が直接アクセスすることができる(ただし、一般の アプリケーションから直接アクセスしてはいけない)。 デバイス固有イメージ領域は、DEV_SPEC.attr.M = 1 のときのみ存在する。
DN_SCRBRIGHT :
スクリーンの明るさの設定 / 取り出し (RW)
data:   W   brightness;
現在の表示モードにおける、スクリーンの明るさを設定、 または取り出す。
スクリーンの明るさは (暗) 0 〜 (明) 31 の範囲の値とする。
PC/AT 版では、この属性データはサポートしていない。
DN_SCRUPDFN :
スクリーンの更新関数の取り出し (R)
data    FP  updfn(W x, W y, W dx, W dy)
        x: X 座標値, y: Y 座標値, dx: X 幅, dy: Y 幅
デバイス固有イメージ領域の内容を更新した場合に、 どの領域を更新したかを通知する関数ポインタを取り出す。
DP はこの関数ポインタを取り出し、NULL でないときは、デバイス固有イメージ領域の内容を更新した時点で、 この関数を直接呼び出す。 したがって、この関数は、DP から直接呼び出せなくてはいけない。
指定された領域が、devbmp.bounds をはみ出す場合は、 はみ出した部分は無視される。
DN_SCRVFREQ :
モニタの垂直周波数の設定 / 取り出し (RW)
data:   W   vfreq;
現在の表示モードにおけるモニタの垂直周波数(リフレッシュレート)を設定、 または取り出す。
取り出し :
vfreq <= 0 は不明を意味する。
取り出した値が正確に現在適用されている値であるかどうかは保証されない。
設定 :
vfreq <= 0 は無視される。
設定する値によっては、画面の表示は保証されないので、注意が必要である。また、正確に設定した値になるかどうかも保証されない。
通常は 60 (Hz) 〜 90 (Hz) 前後の値となる。
DN_SCRADJUST :
モニタのタイミング調整の設定 / 取り出し RW
data:   ScrAdjust   adj;

typedef struct {
    UH  left;   /* 左ブランクドット数(8 の倍数) */
    UH  hsync;  /* 水平シンクドット数(8 の倍数) */
    UH  right;  /* 右ブランクドット数(8 の倍数) */
    UH  top;    /* 上ブランクドット数 */
    UH  vsync;  /* 垂直シンクドット数 */
    UH  bottom; /* 下ブランクドット数 */
} ScrAdjust;
現在設定されている表示モードにおける、モニタのタイミング 調整パラメータを設定、または取り出す。
モニタ
図 14 : モニタ
left + right + hsync を大きくすると表示領域の幅は小
left + right + hsync を小さくすると表示領域の幅は大
top + bottom + vsync を大きくすると表示領域の高さは小
top + bottom + vsync を小さくすると表示領域の高さは大
left, right の値の調整で表示領域は左右に移動
top, bottom の値の調整で表示領域は上下に移動
設定する値によっては、画面の表示は保証されないので注意が必要である。
PC/AT 版では、この属性データはサポートしていない。
DN_SCRDEVINFO :
デバイス情報の取り出し (R)
data:   ScrDevInfo  info;

typedef struct {
    UB  name1[32];      /* 名称-1 (ASCII) */
    UB  name2[32];      /* 名称-2 (ASCII) */
    UB  name3[32];      /* 名称-3 (ASCII) */
    VP  framebuf_addr;  /* フレームバッファアドレス */
    W   framebuf_size;  /* フレームバッファサイズ */
    W   mainmem_size;   /* 主メモリサイズ */
    UB  reserved[28];   /* 予約 */
} ScrDevInfo;
ディスプレイのハードウェアに関する情報を取り出す。
name1, name2, name3 はハードウェアに関する情報を ASCII コードで示したもので、32 文字に満たない部分は 0 パッドされる。
framebuf_addr は ( リニア ) フレームバッファの物理アドレスを示し、 ( リニア ) フレームバッファが使用されていないときは NULL となる。 表示モードによりアドレスは異なる場合がある。
framebuf_size はハードウェアで実装されているフレームバッファのバイトサイズを示す。 実際に使用されるフレームバッファのサイズではなく、全体のサイズである。
mainmem_size は、フレームバッファとして使用されている主メモリサイズを示す。

9.5 固有データ

なし

9.6 基本操作

OPEN特に何もしない。
ハードウェアの初期化はドライバ起動時に行われる。
CLOSE, CLOSEALL特に何もしない。
ABORT特に何もしない(待ちに入ることはないため)
READ / WRITE(上記参照)
SUSPEND / RESUME特に何もしない。
または、ハードウェアに依存した処理。

9.7 事象通知

なし

9.8 エラーコード

デバイスドライバ共通仕様を参照のこと。

ハードウェアや表示モードによってサポートされていない属性データに関しては、ER_NOSPT を戻す。

9.9 インプリメント依存事項 ( PC/AT 版 )

サポートしていない機能

以下の機能はサポートしていない。

以下の機能は、ディスプレイのハードウェアや表示モードによってはサポートしていない。( VESA BIOS 3.0 の場合は基本的にサポートされる。)

サポートしている表示モード

Hsize 64080010241152128016008001024
Vsize 480600 768 86410241200480480
16 3336(*1)------
256 1471013161922
65536[5-6-5] 2581114172023
16777K[8-8-8] 3691215182124

表示モードの設定

表示モードの設定は (VESA) BIOS を利用しており、 システム起動時にのみ可能なため、属性データとして動的に設定する機能はサポートしていない。

表示モードは、DEVCONF ファイルに設定され、 システム起動時のブート処理とスクリーンドライバが協調して、 (VESA) BIOS を使用して行っている。

ブート時に取り出した表示モードに関連する情報は、 システムの BIOS データ 領域に保存され、 スクリーンドライバではそれを参照している。

仮想 VRAM 方式

ディスプレイのハードウェアで用意しているフレームバッファ ( VRAM ) を 直接利用することができない場合、主メモリ上に仮想的にフレームバッファ 領域を獲得して、そこに描画を行い、描画が行われた部分を実際にハード ウェアのフレームバッファ ( 実 VRAM ) に転送する方式。 この転送を行うために DN_SCRUPDFN の機能が使用される。

以下のケースのときは自動的に仮想 VRAM 方式が取られ、DN_SCRDEVINFOframebuf_addrNULL となり、mainmem_size に使用される主メモリのサイズが設定される。なお、以下のケース以外でも仮想 VRAM 方式とすることができ、VRAM のアクセスが遅い場合などでは、画面のスクロール速度を向上することができる。

DEVCONF ファイル

DEVCONF ファイルには、以下の情報が設定され、システム起動時に有効となる。

表示モード
VIDEOMODE   mode [pmode] [w] [h] [pw] [ph]

mode により使用する表示モード番号を指定する。
w と h はそれぞれ有効な横と縦の画面サイズを指定する。
pmode, pw, ph は変更前の設定を示すが、スクリーンドライバでは使用しない。

CRT モニタ垂直同期周波数
VIDEOVFREQ    vfreq [p_vfreq]

vfreq により使用するモニタ垂直同期周波数(リフレッシュレート)を指定する。
p_vfreq は変更前の設定を示すが、スクリーンドライバでは使用しない。

DN_SCRVFREQ ( モニタの垂直周波数 ) がサポートされている条件下 でのみ有効となる。

ビデオ動作属性
VIDEOATTR    attr

attr のビットにより以下の属性を指定する。

    0x1  仮想 VRAM 方式を強制的に使用する。
    0x8  VESA BIOS のみを強制的に使用する。


この章の目次にもどる
前頁:第8章 電源管理(パワーマネージメント)にもどる
次頁:第10章 コンソールにすすむ