このエントリーをはてなブックマークに追加
スポンサーリンク

ビデオBIOS

ビデオBIOS

東芝J-3100シリーズでは、BIOSを使ってドットを描画する事もできますが、J-3100シリーズのBIOSでのドットの描画が非常に低速なためまず行いません。画面への描画はV-RAMを直接書き換えます。BIOSを使うのは、ハードコピー時のドットの読み取りや、パレットレジスタの設定など、比較的速度が問題にならない場面のみです。

ビデオBIOSを使うには、AHレジスタ(場合によってはAXレジスタ)に機能番号を入れ、INT 10H割り込みをかけます。
AH=00H 画面モードの設定
入力 出力
AH:00H
AL:モード
なし
AL モード ドット テキスト 対応OS
04H 05H CGA 4色 320x200 英語DOS3.0
日英DOS5.0の英語モード
06H CGA モノクロ 640x200
0EH EGA 16色 640x200
10H EGA 16色 640x350
12H VGA 16色 640x480 東芝DOS/V
日英DOS5.0+VEM
13H VGA 256色 320x200
64H DCGA モノクロ 640x40 80x20 日本語DOS3.0
日英DOS5.0の日本語モード
東芝DOS/V+JDRIVER
74H DCGA モノクロ 640x40 80x25
65H DCGA 16色 640x40 80x20
75H DCGA 16色 640x40 80x25
画面モードを切り替えるには、ハードがそのモードに対応している必要があります。
・カラー表示能力のない機種(単色ガスプラズマディスプレイなど)ではカラーモードにはなりません。
・VGA表示能力のない機種(V386未満)ではVGAにはなりません。
・J-3100PV2以降(PV3000シリーズ等)、DCGAが搭載されなくなった機種ではDCGAにはなりません。

ハードが対応していても、OSやディスプレイドライバーが対応してないモードには切り替える事ができません。
・日本語DOS3.0や日英DOS5.0の日本語モードではECAやCGAにはなりません。
・日本語/英語の切替は通常、BIOSを直接呼ぶのではなく、CHEVコマンドで切り替えます。
・VGAとDCGAの切替は、通常はVEMやJDRIVERの組み込み/切り離しで行います。ドライバーの組み込み/切り離しなしで無理に切り替えると画面が真っ暗で操作不能になります。

ただし、これらの制約を緩和できるフリーソフト(CHEJ、じぇいさん等)もあります。
AH=01H カーソルの形状の設定 
入力 出力
AH 01H
CH スタートラスタ
CL エンドラスタ
なし
・スタートラスタ、エンドラスタはDCGAの時は0-15、VGAの時は0-7で指定します。
・カーソルは縦16ドットなのですが、VGAの時は2ドット単位での指定になります。
・DCGAの時はスタートラスタ>エンドラスタの時は非表示になります。
・VGAの時はCH(スタートラスタ)に20Hを入れると非表示になります。
AH=02H カーソル位置の設定
入力 出力
AH 02H
BH ページ番号(常に0)
DH ライン
DL カラム
なし
カーソル位置をライン/カラムに移動させます。

BIOSでカーソル位置を指定すると、PC-9801、PASOPIA1600、FM-R等と互換性がなくなるので、DOS汎用にしたい時はエスケープシーケンスを使ってDOSコール(AH=09H INT21H)で、ESC[ライン;カラムH を出力させます。
AH=03H カーソルの形状の取得
入力 出力
AH 03H
BH ページ番号(常に0)
DH ライン
DL カラム
CH スタートラスタ
DL エンドラスタ
AH=06H アップスクロール
入力 出力
AH 06H
AL 行数
CH,CL 範囲の左上(ライン、カラム)
DH,DL 範囲の右下(ライン、カラム)
BH スクロールにより空いた場所の文字の属性
  モノクロモードの時:文字属性
  カラーモードの時:カラーコード
なし
DCGAの時に画面全体が指定された時はハードウェアスクロールになります。
AH=07H ダウンスクロール
入力 出力
AH 07H
AL 行数
CH,CL 範囲の左上(ライン、カラム)
DH,DL 範囲の右下(ライン、カラム)
BH スクロールにより空いた場所の文字の属性
  モノクロモードの時:文字属性
  カラーモードの時:カラーコード
なし
DCGAの時に画面全体が指定された時はハードウェアスクロールになります。
AH=08H カーソル位置の文字コードと属性の読取
入力 出力
AH 08H
BH ページ番号(常に0)
AH 属性
AL 文字コード
AH=09H カーソル位置へ属性・文字の書き込み
入力 出力
AH 09H
BH ページ番号(常に0)
AL 文字コード
BL 属性
CX 文字数
なし
文字を出力します。BIOSで文字を出力させると、PC-9801やPASOPIA1600やFM-Rと互換性がなくなるので、DOS汎用にしたいならこの機能ではなくDOSコール(AH=09H INT 21H)で文字を出力させてください。
AH=0AH カーソル位置へ文字の書き込み
入力 出力
AH 0AH
BH ページ番号(常に0)
AL 文字コード
CX 文字数
なし
AH 09Hと異なり、属性は変更しません。
AH=0CH ドットの書き込み
入力 出力
AH 0CH
BH ページ番号(常に0)
DX Y座標
CX X座標
AL カラーコード(0-15) 7ビット目を1にするとXORで書き込まれます。
なし
画面の指定座標に指定の色で1ドット書き込みます。1ドット単位で書き込むため、この機能を使って罫線や四角く塗りつぶしたエリアを描写すると非常に低速です。そのため、通常四角形を描く時は、BIOSを使わずにV-RAMに直接書き込みます。

カラー対応のダイナブックの初期に搭載されたダイナメニューはこのBIOSで枠を表示していたため、カラーモードにすると描画が遅すぎて使い物になりませんでした。のちに「ダイナスメニュー」という改良版ができましたが、こちらは非常に高速でした。
AH=0DH ドットの読取
入力 出力
AH 0DH
DX Y座標
CX X座標
AL カラーコード(0-15)
指定位置のドットの色を読み取ります。ドット単位のため、この機能を使ってマルチウィンドゥ機能を作ると非常に低速なので、通常はBIOSではなくV-RAMを直接読み取ります。

ただし、プリンターへのハードコピーなど速度が重視されない時は互換性を考えてなるべくBIOSを使うようにします。実際、私の作ったハードコピードライバーはBIOSでドットを読み取っていたおかげで、「じぇいさん」等のエミュレーターでも正しく動作させる事ができました。
AH=0EH テレタイプ式書き込み
入力 出力
AH 0EH
AL 文字コード
BL 属性
なし
ALで指定した文字を表示し、右端で自動的に折り返します。右下では自動的にスクロールアップした後に改行してから表示します。
AH=0FH 現在のディスプレイ状況
入力 出力
AH 0FH AL 画面モード
AH 画面上の文字桁の数
BH ページ番号(常に0)
AX=1000H パレットレジスタの設定
入力 出力
AX 1000H
BL カラーコード(0〜0FH)
BH パレットレジスタ(0〜3FH)
なし
カラーコードをパレットレジスタの何番に割り当てるかを設定します。これにより、64色中の16色を表示させる事ができます。モノクロモードでは使えません。

初期値は以下のようになっています。AH=00画面モード設定を行う事で初期値に戻す事ができます。
カラーコード プレーンI プレーンR プレーンG プレーンB パレットレジスタ
00H 0 0 0 0 00H
01H 0 0 0 1 01H 暗い青
02H 0 0 1 0 02H 暗い緑
03H 0 0 1 1 03H 暗いシアン
04H 0 1 0 0 04H 暗い赤
05H 0 1 0 1 05H 暗いマゼンダ
06H 0 1 1 0 14H 茶色
07H 0 1 1 1 07H 暗い白
08H 1 0 0 0 38H 明るい黒
09H 1 0 0 1 39H 明るい青
0AH 1 0 1 0 3AH 明るい緑
0BH 1 0 1 1 3BH 明るいシアン
0CH 1 1 0 0 3CH 明るい赤
0DH 1 1 0 1 3DH 明るいマゼンダ
0EH 1 1 1 0 3EH 明るい黄色
0FH 1 1 1 1 3FH 明るい白
※色は主観的なもので、公式マニュアルとは若干表記が異なります。
;-----------------------------------------------
;   カラーコード6を、茶色ではなく暗い黄色にする
;-----------------------------------------------
        MOV     AX,1000H
        MOV     BL,06H
        MOV     BH,06H
        INT     10H
AX=1001H オーバースキャンレジスタの設定  
入力 出力
AX 1001H
BH オーバースキャンレジスタにしたいカラーレジスター番号
なし
AX=1002H パレット一括設定
入力 出力
AX=1002H
ES:DX パレットレジスタとオーバースキャンレジスタのテーブルが置かれたアドレス
テーブルの内容
 0〜15バイト カラーコード0〜15に相当するパレットレジスターの値
 16バイト目 オーバースキャンレジスターの設定値
なし
AX=1007H パレット読み取り
入力 出力
AX=1007H
BL カラーコード(0-15)
BH カラーレジスタ番号(0-63)
AX=1008H オーバースキャンレジスター読み取り  
入力 出力
AX1008H BH オーバースキャンレジスターの値
AX=1009H パレット一括読み取り
入力 出力
AX 1009H
ES:DX 読み取りテーブルのアドレス
テーブルの内容
 パレット一括設定と同じ
なし
AX=1010H カラーレジスタの設定(VGA)
入力 出力
AX 1010H
BX カラーレジスタ番号(0〜3FH)
DH Rの明るさ(0〜3FH)
CH Gの明るさ(0〜3FH)
CL Bの明るさ(0〜3FH)
なし
RGBの明るさをそれぞれ64段階で指定します。つまり、26万色の中から1色を選ぶことができます。この機能はVGA専用です。
カラーレジスタ Rの明るさ Gの明るさ Bの明るさ デフォルトのカラーコード
00H 0 00H 00H 00H 00H
01H 1 00H 00H 2AH 01H
02H 2 00H 2AH 00H 02H
03H 3 00H 2AH 2AH シアン 03H
04H 4 2AH 00H 00H 04H
05H 5 2AH 00H 2AH マゼンダ 05H
06H 6 2AH 2AH 00H 黄色
07H 7 2AH 2AH 2AH 07H
08H 8 00H 00H 15H 暗い青
09H 9 00H 00H 3FH 明るい青
0AH 10 00H 2AH 15H
0BH 11 00H 2AH 3FH
0CH 12 2AH 00H 15H
0DH 13 2AH 00H 3FH
0EH 14 2AH 2AH 15H
0FH 15 2AH 2AH 3FH
10H 16 00H 15H 00H 暗い緑
11H 17 00H 15H 2AH
12H 18 00H 3FH 00H 明るい緑
13H 19 00H 3FH 2AH 空色
14H 20 2AH 15H 00H 茶色 06H
15H 21 2AH 15H 2AH
16H 22 2AH 3FH 00H
17H 23 2AH 3FH 2AH
18H 24 00H 15H 15H 暗いシアン
19H 25 00H 15H 3FH
1AH 26 00H 3FH 15H 青緑
1BH 27 00H 3FH 3FH 明るいシアン
1CH 28 2AH 15H 15H
1DH 29 2AH 15H 3FH
1EH 30 2AH 3FH 15H
1FH 31 2AH 3FH 3FH
20H 32 15H 00H 00H 暗い赤
21H 33 15H 00H 2AH
22H 34 15H 2AH 00H 黄緑
23H 35 15H 2AH 2AH
24H 36 3FH 00H 00H 明るい赤
25H 37 3FH 00H 2AH 濃いピンク
26H 38 3FH 2AH 00H 山吹色
27H 39 3FH 2AH 2AH
28H 40 15H 00H 15H 暗いマゼンダ
29H 41 15H 00H 3FH すみれ色
2AH 42 15H 2AH 15H
2BH 43 15H 2AH 3FH
2CH 44 3FH 00H 15H 紫赤
2DH 45 3FH 00H 3FH 明るいマゼンダ
2EH 46 3FH 2AH 15H
2FH 47 3FH 2AH 3FH
30H 48 15H 15H 00H 暗い黄色
31H 49 15H 15H 2AH
32H 50 15H 3FH 00H
33H 51 15H 3FH 2AH
34H 52 3FH 15H 00H
35H 53 3FH 15H 2AH
36H 54 3FH 3FH 00H 明るい黄色
37H 55 3FH 3FH 2AH
38H 56 15H 15H 15H 灰色 08H
39H 57 15H 15H 3FH 薄い青 09H
3AH 58 15H 3FH 15H 薄い緑 0AH
3BH 59 15H 3FH 3FH 薄いシアン 0BH
3CH 60 3FH 15H 15H 薄い赤 0CH
3DH 61 3FH 15H 3FH 薄いマゼンダ 0DH
3EH 62 3FH 3FH 15H 薄い黄色 0EH
3FH 63 3FH 3FH 3FH 明るい白 0FH
例)カラーレジスタ番号[PAREG]を、[RBRIGHT] [GBRIGHT] [BBRIGHT] にそれぞれ変更します
MOV     AX,1010H
MOV     BH,0
MOV     BL,[PAREG]
MOV     DH,[RBRIGHT]
MOV     CH,[GBRIGHT]
MOV     CL,[BBRIGHT]
INT     10H
AX=1012H カラーレジスター一括設定(VGA)
入力 出力
AX 1012H
BX 最初のカラーレジスター番号
CX 設定数
ES:DX 色テーブルのアドレス
テーブルの形式
  Rの明るさ Gの明るさ Bの明るさ Rの明るさ Gの明るさ Bの明るさ…
なし
カラーレジスタをテーブルから読んで一括変更します。この機能はVGA専用です。カラーレジスタを全て保存しておいて、いったんパレットを全て黒にしてから画面を描画して、描画が終わったカラーレジスタを戻す事により瞬間画面表示もどきを作ることができます。同様に、全てのカラーレジスタの輝度を徐々に下げていく事でフェードアウトを作る事もできます。

※一部機種(BREZZAの初期型、PV3000)ではこの機能を使うと画面にノイズがちらつく場合があるので多用は避けた方が無難です。実際、フェードアウトを効果作ったら画面がノイズだらけになって怒られた事があります。
AX=1015H カラーレジスターの読取(VGA)
入力 出力
AX 1015H
BX カラーレジスター番号
DH Rの明るさ(0-3FH)
CH Gの明るさ(0-3FH)
CL Bの明るさ(0-3FH)
設定されたカラーレジスタの値を取得します。この機能はVGA専用です。
AX=1017H カラーレジスター一括読取(VGA)
入力 出力
AX 1017H
BX 最初のカラーレジスター番号
CX 読取数
ES:DX 色テーブルのアドレス
テーブルの形式
 Rの明るさ Gの明るさ Bの明るさ Rの明るさ Gの明るさ Bの明るさ…
カラーレジスタを一括して読み取ります。この機能はVGA専用です。
;--------------------------------
;    パレットテーブルを読む
;--------------------------------
	MOV	AX,1017H
	MOV	BX,0
	MOV	CX,64
	MOV	DX,OFFSET BUFF
	INT	10H
AX=1800H 文字フォント読み出し(VGA)
入力 出力
AX 1800H
BH ページ番号(常に0)
BL フォント(常に0)
CH シフトJISの第1バイト(半角なら00H)
CL シフトJISの第2バイト(半角なら文字コード)
DH 幅
DL 高さ
DH DLの設定可能範囲
  8×16 半角
  8×19 半角
  16×16 全角
  24×24 全角
ES:SI 文字コードを読み出すバッファ
AL 00H正常 00H以外エラー
この機能が使えるのはVGAの時だけです。DCGAの時は漢字ROM割り込み(INT 60H)を使います。
AX=1801H 文字フォント書き込み(VGA)
入力 出力
AX 1801H
以下1800Hと同じ
なし
この機能が使えるのはVGAの時だけです。DCGAの時は漢字ROMを使うので、フォントの書き換えはできません。
AX=8300H 開始アドレスの読み込み (DCGA)
入力 出力
AX 8300H AX 開始アドレス
ハードウェアスクロールさせた時に変化するV-RAMの開始位置を取得します。この機能はDCGAモードのみです。
;-----------------------------------------------------
;           開始アドレス取得
;-----------------------------------------------------
                MOV     AX,8300H
                INT     10H
                MOV     [K3],AX

参考文献
『J-3100解析ハンドブック』 1989年 土屋勝著 ナツメ社
『DOS/Vテクニカル・リファレンス・マニュアル』 1993年 芦達剛著 ソフトバンク
『J-3100シリーズ・テクニカルマニュアル』 1994年 南部武彦著 ソフトバンク
『ATOK読本』 1994年 山田祥平 ジャストシステム
『東芝パソコンハンドブック94年版』 平成6年3月1日
スポンサーリンク