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

ビデオコントローラ

画面モード

J-3100はIBM PC/ATのCGA/EGAに独自のDCGAを追加した後、VGAに対応させた経緯から、さまざまな画面モードを持っています。ただし、機種によって使えるモードが異なります。V386シリーズ未満ではVGAが使えず、また、PV2以降ではDCGAが使えなくなっています。
・CGA
640×200 単色
320×200 4色
・EGA
640×350 64色中16色
英語DOS3.0と日英DOS5.0の英語モードのみ使う事ができました。「英語モードにすれば何万本もある海外IBM PCソフトが動作する」というのがJ-3100の宣伝文句でしたが、私にはほとんどメリットは感じられませんでした。(海外の英語モード専用ソフトなんて、テトリスぐらいしか持ってませんでしたし)

・DCGA
640×400 単色モード
単色で諧調なし。1ドットで表現できるのはついてるか消えてるかだけという画面モードでしたが、当初の主力機種(GT SGT GS)は単色のガスプラズマディスプレイもしくは単色の液晶だったので、このモードだけでも困ることはありませんでした。事実上J-3100標準の画面モードとなりました。

640×400 カラー(64色中16色)モード
デスクトップ機(ZS/ZX/ZD/PVもしくはJ-3300)や上位機種であるSGXで採用されたモードです。カラー表示ができる機種が低価格になって普及しだした頃にはもう主力はVGAに移っており、使われた時期は長くありません。実際、市販のJ-3100アプリのほとんどがモノクロ専用でした。

・VGA
640×480 フルカラー中16色
V386以降のノートやJ-3100PV以降のデスクトップで採用され、PV2以降のDCGAが廃止になった後は、DOS/Vではこの画面モードのみが使われました。しかし、DOS/Vアプリが主力だった期間は短く、すぐにアプリの主流はWindowsに移行したため、DOS/V環境で動作するアプリはJ-3100のカラー対応ほどではありませんが、あまり多くありませんでした。私の知る限りではビジネス用として一太郎(DASH、V4、V5)、Lotus1-2-3 R4J、ゲームではSuper大戦略、レミングス、プリンセスメーカーぐらいでした。

ただし、VGAモードはメーカー問わずDOS/V以降のPC/AT互換機に標準搭載で、Windows95/98/2000上で別途ディスプレイドライバーを入れなくとも動作することから、インストール画面やインストール直後、また、起動中画面で使われました。

開始アドレス

単色とはいえ当時のCPU(286や386)でV-RAM全体を移動させるのは相当な負担で、スクロールさせたとして波打つスクロールにしかなりませんでした。そこで、スクロールさせる時には、V-RAMの中身を移動させるのではなく、始点(左上にあたる番地)を動かす事で相対的に画面全体を動かす機能がありました。これがハードウェアスクロール機能です。

ハードウェアスクロールでは画面の全体が動いてしまうため、一部だけスクロールさせたい場合・・・例えば、GUIのOS(窓の中だけをスクロール)や、強制スクロールゲーム(スコアや自機以外をスクロールさせたい)には向かないのですが、DOSの単なるプロンプト画面のように画面全体をスクロールさせるような用途ではこれで十分でした。

J-3100モードではハードウェアスクロールを備えています。そのため、座標からV-RAM上のアドレスを計算する際には、開始アドレスを取得する必要があります。

1

V-RAM

V-RAM ビデオメモリの事で、ここにビットを立てることで画面にドットが表示されます。

DCGAモノクロモード

V-RAMは開始アドレス(セグメント:オフセット)がB800:0000から始まっています。640×400ドットで256,000ビット、つまり32,000バイトあります。81バイト目は1ドット下ではなく、4ドット下にズレていて、2列目には2000Hずれたアドレスがマッピングされているという、ねじれマッピングになっています。

初期状態ではB800:0000が左上ですが、ハードウェアスクロールにより左上のアドレスが変わるため、実際には開始アドレスの値を足さなければなりません。

アドレス= ((X座標/8)+(Y座標/4)*80 + 開始アドレス)%2000H + (Y座標%4)×2000H

計算の例)
以下、[K3]のメモリーには開始アドレスがセットされているものとします。
;==============================================================================
;       モノクロ画面のアドレスを計算する
;            In:GX1 GY1    Out:SADDR
;==============================================================================
SSET:           MOV     AX,[GX1]
                SHR     AX,1
                SHR     AX,1
                SHR     AX,1
                MOV     [K1],AX
                MOV     AX,[GY1]
                SHR     AX,1
                SHR     AX,1
                MOV     BX,80
                MUL     BX
                MOV     [K2],AX
                MOV     AX,[GY1]
                AND     AX,3
                MOV     BX,2000H
                MUL     BX
                MOV     [K4],AX
                MOV     AX,[K1]
                ADD     AX,[K2]
                ADD     AX,[K3]
                MOV     DX,0000H
                MOV     BX,2000H
                DIV     BX
                MOV     [K5],DX
                MOV     AX,[K5]
                ADD     AX,[K4]
                MOV     [SADDR],AX
                RET
DCGAカラーモード、VGAモード

カラー画面は開始アドレス(セグメント:オフセット)がA000:0000で、モノクロのようにねじれていないので、素直に上から順に計算します。

DCGAモードの時は、ハードウェアスクロールを考慮して、あらかじめ開始アドレスを取得して[K3]にセットしておく必要があります。VGAモードの時は 1行の幅をオフセットレジスタをI/Oポートから取得します。DCGAモードの時は1行は80バイト固定ですので、[OFSET]には40(40ワード=80バイト)をセットしておきます。 同一メモリーにRGBIの4プレーンがマッピングされていて、どのプレーンに対して読み書きを行うかはI/Oポートで指定します。(後述)

計算の例)以下、[K3]には開始アドレス、[OFREG]にはオフセットレジスタ(40)がセットされているものとします。
;==============================================================================
;    カラー画面の開始アドレスセット
;         In:GX1 GY1    Out:SADDR
;==============================================================================
CSET:           MOV     AX,[GX1]
                SHR     AX,1
                SHR     AX,1
                SHR     AX,1
                MOV     [K1],AX
                MOV     AX,[GY1]

                MOV     BH,0
                MOV     BL,[OFREG]
                SHL     BX,1
                MUL     BX
                MOV     [K2],AX

                MOV     AX,[K1]
                ADD     AX,[K2]
                ADD     AX,[K3]
                AND     AX,0FFFFH
                MOV     [SADDR],AX
                RET

ビデオI/O

互換性を考えると、I/Oポートの直接操作はできる限り避けるべきですが、J-3100の場合ビデオBIOSが低速なため、V-RAM直接アクセス時にプレーンやビットの制御のためにやむなくI/Oポートを操作する必要があります。

ビデオ関係のI/Oポートを制御するために、インデックスレジスタに機能番号をセットした後、データーレジスタに値を書き込みます。



マップマスクレジスタ
インデックスレジスタ 03C4H:02
データーレジスタ 03C5H:値
書き込むプレーンを4ビットの2進数で指定します。複数プレーンに同時に書き込む事ができます。
例)
0001:プレーン0のみ書き込み
0010:プレーン1のみ書き込み
0100:プレーン2のみ書き込み
1000:プレーン3のみ書き込み

データーローテートレジスタ
インデックスレジスタ 03CEH:03
データーレジスタ 03CFH:値
ビット0〜ビット2
どれだけ右シフトするか
ビット3〜ビット4
00:論理演算なし
10:AND
01:OR
11:XOR
例)
00111なら1回右シフトしてXORして書き込む

リードマップセレクトレジスタ
インデックスレジスタ 03CEH:04
データーレジスタ 03CFH:値
読取は1プレーンごとにしかできないため、書き込みマスクのような4ビットではなく、2ビットで指定します。
00:プレーン0の読み込み
01:プレーン1の読み込み
10:プレーン2の読み込み
11:プレーン3の読み込み

ビットマスクレジスタ

インデックスレジスタ 03CEH:08
データーレジスタ 03CFH:値
書き込む際にマスクするビットを指定します。
00000001ならビット1のみ書き込まれ、他のビットは今までの値が保持されます。
オフセットレジスタ
インデックスレジスタ 03D4H:13
データーレジスタ 03D5H:値
V-RAMの1行が何ワードあるかを取得します。バイトに換算するためには、これを2倍(1回左シフト)します。DOS/Vアプリでは1行80バイト固定とみなしても問題はなかったようです。

例)
MOV	AL,13H
MOV	DX,03D4H
OUT	DX,AL
MOV	DX,03D5H
IN	AL,DX
MOV	[OFREG],AL

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