mirror of
https://github.com/NishiOwO/VZEditor.git
synced 2025-04-22 00:54:40 +00:00
444 lines
20 KiB
Plaintext
444 lines
20 KiB
Plaintext
|
||
30行BIOSテクニカルドキュメント 30TECH.DOC
|
||
|
||
Written by walker, lucifer
|
||
|
||
|
||
本ドキュメントは、アプリケーションが30行BIOSを活用する場合に必要
|
||
となる機能一覧を記したものです。30行対応アプリケーションを作ろう
|
||
と思っているプログラマの方達を対象に作成しました。
|
||
30行対応アプリケーションを作成する場合、30行BIOSを利用すればより
|
||
高度な30行環境を構築することができます。
|
||
アプリケーション内部で画面モードを移行したり、行間隔を空けたりす
|
||
ることができるわけです。
|
||
また、このような能動的なBIOS拡張だけでなく、画面分割などのファン
|
||
クションをフックし、そのときの状態に合致した処理をするような受動
|
||
的なBIOS拡張もしています。
|
||
なお、30BIOS.COMにオプションで指定できる動作のほとんどは本BIOSで
|
||
設定可能です。
|
||
|
||
|
||
=======================================================================
|
||
本ドキュメントにのみ存在するテクニカルタームを挙げておきます。
|
||
|
||
■拡張モード
|
||
30行BIOSがINT 18Hをフックし、30行環境のための処理を行う。
|
||
拡張モードでは、 テキストVRAMを拡張するためにテキスト画面をCRT画
|
||
面上方に移動させている。そのため、テキストとグラフィックの位置関
|
||
係がずれることになる。
|
||
30行BIOSでは、 このグラフィックの扱い方を以下の2通りに指定できる
|
||
ようになっており、ユーザーがコマンドラインから30行BIOSを実行させ
|
||
たり、アプリケーションが、以降に解説する"拡張CRT-BIOS"のファンク
|
||
ションを実行することで、自由に変更可能である。
|
||
|
||
Specialモード: G-VRAMの位置は標準位置(画面中央)のまま、テキスト
|
||
の位置だけが移動する。グラフィックとテキストの位
|
||
置関係はずれることになる。
|
||
VGAモード: G-VRAMをT-VRAMと連動させる。 400LINEを超える部分
|
||
は、G-VRAMの上部を表示させる。テキストとグラフィ
|
||
ックを重ねて描画するアプリケーションは、こちらの
|
||
モードを使用したほうがいいだろう。
|
||
|
||
■標準モード
|
||
いわゆる、通常の25/20行モードのことを指す。30行BIOSは、特に何も
|
||
せずにオリジナルのBIOSを呼び出す。
|
||
|
||
=======================================================================
|
||
30行BIOSが常駐時に行う各種の処理。
|
||
・画面分割テーブルにパッチ
|
||
FEPが無い場合、通常[CTRL]+[XFER]を押すと〔16進〕という表示が出
|
||
る。 この表示に関する画面分割テーブルの値(DOSワーク内)にパッチ
|
||
を当てる。これにより、[CTRL]+[XFER]で〔16進〕をOFFにした後も、
|
||
ファンクションキー表示がふたたび表示されないようになる。
|
||
・X,Y座標→VRAMアドレス変換ルーチンにパッチ(NEC-DOSのみ)
|
||
VRAMアドレス変換は、IO.SYS内でテーブル参照を行うことで処理して
|
||
いる。しかし、このテーブルはハイレゾの31行までしか対応していな
|
||
いため、掛け算による処理フローにコードを書き換える。31行超でも
|
||
問題が起きないようになっている。 EPSON-DOSはもともと掛け算ルー
|
||
チンのため、特に処理はしていない。
|
||
・CLS行数のコードにパッチ
|
||
拡張モード移行に伴い、画面クリアが行われるルーチンにパッチを当
|
||
てる。これにより、 30行BIOSが提供するいかなる行数でも正常にCLS
|
||
コマンドやESCシーケンスによる画面消去が動作する。 実際には-aオ
|
||
プションで指定した最大行数分を消去している。
|
||
・CTRL+[f・10]のパッチ(-pオプション指定時)
|
||
標準モード←→拡張モードの処理を実現するためにIO.SYSにパッチを
|
||
当てる。
|
||
※以上のパッチは、30行BIOS常駐開放時に復旧されない。常駐開放時には、標
|
||
準モードでの値を設定するだけである。
|
||
|
||
|
||
=======================================================================
|
||
拡張CRT-BIOS(INT 18H)
|
||
以下は、30行BIOSが提供する独自のファンクションである。
|
||
本ファンクションを使用するときは、かならずインストールチェックを
|
||
行うこと。30行BIOS非常駐時での本ファンクションの動作は保証されな
|
||
い。
|
||
本ファンクションを利用することで、常駐している30行BIOSをアプリケ
|
||
ーションが制御できる。
|
||
|
||
-----------------------------------------------------------------------
|
||
■CRTモード取得・インストールチェック
|
||
CALL: AH=0BH
|
||
BX='30'+'行' (C0A3H)
|
||
ES:DI='30BIOS_EXIST=0'を指すポインタ(なくてもよい)
|
||
RETURN: AL=画面モード
|
||
bit7:拡張モード状態取得
|
||
1=VGAモード
|
||
0=Specialモード
|
||
bit6:30行BIOS常駐状態取得
|
||
1=30行BIOSが常駐している
|
||
0=常駐していない
|
||
bit5:最下行状態取得
|
||
1=CW行を確保している
|
||
0=ファンクションキーを表示行を確保している
|
||
bit4:画面モード状態取得
|
||
1=拡張モード
|
||
0=標準モード
|
||
bit3~1:オリジナルBIOSと同じ
|
||
bit0:行間隔取得
|
||
1=行間ありモード(拡張モード時)/20行(標準モード時)
|
||
0=行間なしモード(拡張モード時)/25行(標準モード時)
|
||
ES:DI='30BIOS_EXIST=1'ならば常駐している
|
||
'30BIOS_EXIST=0'ならば常駐していない。
|
||
|
||
機能:30行BIOSの組み込み・状態を取得する。
|
||
BXレジスタが、他の値のときは動作しない。
|
||
bit4=0(標準モード)のときは、bit7の値はオリジナルBIOSと同じ意味を
|
||
持つ。
|
||
|
||
アプリケーション内に'30BIOS_EXIST=0'の文字列を置き、先頭文字のア
|
||
ドレスをES:DIに入れて本ファンクションを呼ぶことにより、より厳密
|
||
な常駐チェックが行える。 ES:DIに'30BIOS_EXIST=0'の文字列があった
|
||
場合、30行BIOS常駐ルーチンは、'30BIOS_EXIST=1'に書き換えてリター
|
||
ンする。もし、ES:DIの指すポインタがその他の文字列であった場合、
|
||
書き換えは行われない。また、ALのbit6の示す値は、文字列によるチェ
|
||
ックとは関係しない。
|
||
通常は、ALのbit6の示す値で判断すれば十分と思われる。ただし、30行
|
||
BIOSが常駐していないのに、他のソフトウェアを併用することによって、
|
||
bit6が1になってしまうことも無いわけではない。よって、 これだけで
|
||
信用できない場合は、文字列によるチェックを行うことで、より厳密に
|
||
インストールチェックができる。
|
||
|
||
オリジナルBIOS「CRTモードのセンス」では、 30行BIOSでのインストー
|
||
ルチェックフラグであるbit6は未使用(常に0)である。
|
||
|
||
(リターン値によるインストールチェックのサンプル [全バージョンで有効])
|
||
mov ah,0bh ;Function0Bh
|
||
mov bx,'30'+'行' ;(C0A3H)
|
||
int 18h
|
||
test al,01000000b ;(=40h)
|
||
jnz NotInstalled ;常駐していない
|
||
|
||
mov ah,09h ;常駐している
|
||
mov dx,offset Ins_Str
|
||
int 21h
|
||
:
|
||
:
|
||
|
||
NotInstalled: mov ah,09h ;常駐していない
|
||
mov dx,offset NotIns_Str
|
||
int 21h
|
||
:
|
||
:
|
||
|
||
NotIns_Str db '30行BIOSが常駐していません',0Dh,0Ah,'$'
|
||
Ins_Str db '30行BIOSが常駐しています',0Dh,0Ah,'$'
|
||
|
||
(文字列による厳密なインストールチェックのサンプル [Ver0.20以降])
|
||
mov ax,cs
|
||
mov es,ax
|
||
mov di,offset InsChkStr ;'30BIOS_EXIST=0'のポインタ
|
||
mov ah,0bh ;Function0Bh
|
||
mov bx,'30'+'行'
|
||
int 18h
|
||
cmp Byte Ptr[InsChkStrFlg],'1'
|
||
jne NotInstalled ;常駐していない
|
||
|
||
mov ah,09h ;常駐している
|
||
mov dx,offset Ins_Str
|
||
int 21h
|
||
:
|
||
:
|
||
|
||
NotInstalled: mov ah,09h ;常駐していない
|
||
mov dx,offset NotIns_Str
|
||
int 21h
|
||
:
|
||
:
|
||
|
||
NotIns_Str db '30行BIOSが常駐していません',0Dh,0Ah,'$'
|
||
Ins_Str db '30行BIOSが常駐しています',0Dh,0Ah,'$'
|
||
|
||
InsChkStr db '30BIOS_EXIST='
|
||
InsChkStrFlg db '0'
|
||
|
||
-----------------------------------------------------------------------
|
||
■CRTモード移行
|
||
CALL: AH=0AH
|
||
BX='30'+'行' (C0A3H)
|
||
AL=bit7:拡張モード状態設定
|
||
1=VGAモードに移行する
|
||
0=Specialモードに移行する
|
||
bit6:予約(0)
|
||
bit5:最下行状態設定
|
||
1=最下行をCWのために確保する
|
||
0=最下行をファンクションキー表示のために確保する
|
||
bit4:モード移行
|
||
1=拡張モードに移行する
|
||
0=標準モードに移行する
|
||
bit3~1:オリジナルBIOSと同じ
|
||
bit0:行間隔設定
|
||
1=行間ありモード(拡張モード時)/20行(標準モード時)
|
||
0=行間なしモード(拡張モード時)/25行(標準モード時)
|
||
|
||
機能: 画面モード等の設定を行う。
|
||
本ファンクションで拡張モードへ移行するとき、以下の処理を行う。
|
||
・IO.SYS内の20←→25行切り替えコードにパッチを当て、30行BIOSに都
|
||
合がいいように変更する。
|
||
・GDCのパラメータ再設定、DOSワークエリアの再設定を行う。
|
||
・CWモードのときは、テキストVRAMが連続になってはおらず、最下行に
|
||
51行目(オフセット1F40H)が表示されている。
|
||
|
||
-----------------------------------------------------------------------
|
||
■30行BIOSバージョン取得
|
||
CALL: AX=FF00H
|
||
RETURN: AH=バージョン番号の小数部
|
||
AL=バージョン番号の整数部
|
||
|
||
-----------------------------------------------------------------------
|
||
■現在の画面モード保存(スタックへPUSH)
|
||
CALL: AX=FF01H
|
||
RETURN: AX=0000H:保存できなかった。
|
||
FFFFH:保存できた。
|
||
|
||
機能: 現在の画面モード情報を30行BIOSが確保してあるスタック領域に保存す
|
||
る。スタックサイズは8段分である。
|
||
保存するデータは、「インストールチェック(AH=0BH)」で返されるALの
|
||
値と、現在の画面行数を合わせた2バイトである。 アプリケーション側
|
||
が、独自に管理することによって、AX=FF01H,FF02Hと同等の動作が実現
|
||
できる。
|
||
しかし、今後の30行BIOSのバージョンアップによって管理すべき情報量
|
||
が増加すする可能性はあるだろう。
|
||
|
||
-----------------------------------------------------------------------
|
||
■保存された画面モード復帰(スタックからPOP)
|
||
CALL: AX=FF02H
|
||
RETURN: AX=0000H:復帰できなかった。または保存されていない。
|
||
FFFFH:復帰できた。
|
||
|
||
機能: 画面モード保存(AX=FF01H)で、スタック領域に保存した画面モード情報
|
||
を取り出して、再設定する。
|
||
その他についてはファンクションFF01Hを参照。
|
||
|
||
-----------------------------------------------------------------------
|
||
■画面行数の変更・取得
|
||
CALL: AX=FF03H
|
||
BL=行間隔なしのときの行数に変更
|
||
=00:画面行数の取得のみ(行数の変更は行わない)
|
||
RETURN: AL=行間隔なしのときの行数 - 1
|
||
AH=行間隔ありのときの行数 - 1
|
||
|
||
機能: 本ファンクションで画面行数を変更した場合、即座にモード移行
|
||
(AH=0AH)を行わなければならない。モード移行を行うまで、30行BIOSの
|
||
動作は不安定になる(各種パラメータが再設定されないため)。
|
||
本ファンクション実行後、"(AL + 1) = BL"とならなかった場合、 オプ
|
||
ション-aで設定されている画面行数の上限を超えたか、下限を下回って
|
||
いると考えられる。これは、アプリケーションが無理な行数を設定しよ
|
||
うとした場合、CRTのダメージを防ぐための仕様である。
|
||
BL=00を入れてCALLすることで、 現在の行数を取得することができる。
|
||
このとき返される行数は、現在の画面モードに関らず、拡張モード時の
|
||
行数になる。すなわち、標準モードでも30行BIOSが常駐していれば、AL
|
||
には30が返されていることになるので注意。
|
||
アプリケーションが真の意味で現在の行数を取得したい場合は、本ファ
|
||
ンクションをCALLする前に、CRTモード状態取得(AH=0BH)で、標準モー
|
||
ドか拡張モードかを確認しなければならない。
|
||
|
||
-----------------------------------------------------------------------
|
||
■設定可能行数の取得(Ver0.20以降)
|
||
CALL: AX=FF04H
|
||
RETURN: AL=設定可能行数の上限
|
||
AH=設定可能行数の下限
|
||
|
||
機能: -aオプションで指定されている設定行数の上限/下限を取得する。
|
||
|
||
-----------------------------------------------------------------------
|
||
■行間空きモード時のラスタ数変更・ラスタ数取得(Ver1.10以降)
|
||
CALL: AX=FF05H
|
||
BH=行間空きモード時のラスタ数
|
||
BL=10H:ラスタ数を変更する
|
||
00H:ラスタ数を取得する
|
||
RETURN: AH=行間空きモード時のラスタ数
|
||
AL=行間なしモード時のラスタ数(=10H)
|
||
|
||
このファンクションでラスタ数を変更した場合、ファンクション0AHを
|
||
実行し、モード移行を行わなければならない。その間、30行BIOSやDOS
|
||
の動作は不安定である。これは30行BIOSとDOSの仮定している表示行数
|
||
が異なってしまうためである。
|
||
また、CALL時のBHレジスタの値は、特に範囲チェックをしていないが、
|
||
10H~14H(16~20)が有意義な値であり、30行BIOSもこの範囲の値で実行
|
||
されることを期待している。
|
||
|
||
-----------------------------------------------------------------------
|
||
■GDCパラメータの設定情報取得(Ver1.10以降)
|
||
CALL: AX=FF06H
|
||
BL=行間なしモード時の行数
|
||
RETURN: AL=GDCクロック5MHz時の HS+1 の値
|
||
AH=GDCクロック5MHz時の VS の値
|
||
CL=GDCクロック5MHz時の VBP の値
|
||
CH=GDCクロック5MHz時の VFP の値
|
||
DL=GDCクロック5MHz時の HBP+1 の値
|
||
DH=GDCクロック5MHz時の HFP+1 の値
|
||
注:BXは保存されるが、SI,DIは破壊される。
|
||
|
||
GDCクロックが2.5MHzのときは、AL, DL, DHレジスタのそれぞれ値を1/2
|
||
(小数以下切り捨て)し、さらに1を引いた値がGDCのパラメータである。
|
||
AH, CL, CHレジスタの値はRETURNされた値をそのまま利用してかまわない。
|
||
また、30行BIOSは、設定行数毎に任意のGDCパラメータを設定することが
|
||
できる。(デフォルトのモジュールやMKMODULE.COMで作成されたモジュー
|
||
ルの場合は最大5つの行数範囲内。) このため、本ファンクションを実行
|
||
する際は、「何行におけるGDCパラメータを取得したいのか」という情報
|
||
を30行BIOSに知らせなければならない(CALL時のBLレジスタの値)。このと
|
||
きの行数は必ず「行間なしモード時」の値でなければならない。
|
||
|
||
(GDCクロックにあったHS,VSを求めるサンプル [Ver1.10以降])
|
||
mov bl,30 ; 30行時のパラメータを取得
|
||
mov ax,0FF06h
|
||
int 18h
|
||
push ds
|
||
xor bx,bx
|
||
mov ds,bx
|
||
test byte ptr ds:[054Dh],04h ; bit2 = 1:5MHz, 0:2.5MHz
|
||
pop ds
|
||
jnz GDC5MHz
|
||
shl al,1 ; 2.5MHz時のみ 1/2
|
||
GDC5MHz:
|
||
dec al ; HSパラメータは -1 する
|
||
; VSパラメータはそのまま
|
||
|
||
=======================================================================
|
||
CRT-BIOSフックにより、値が変えられるファンクション
|
||
これより述べるファンクションは、98の持つCRT-BIOSと同じであり、30
|
||
行BIOSによってファンクションが追加されているわけではない。
|
||
しかし、画面モードに関するファンクションをフックし、適当な値を再
|
||
設定することで、拡張モード時の不具合のなくすことができるようにな
|
||
っている。
|
||
|
||
-----------------------------------------------------------------------
|
||
■CRTモードの設定(オリジナルファンクション拡張)
|
||
CALL: AH=0AH
|
||
AL=モード設定情報
|
||
bit 7~1:オリジナルのBIOSと同じ(TDB参照のこと)
|
||
bit 0:行間隔設定
|
||
1=行間ありモード(拡張モード時)/20行(標準モード時)
|
||
0=行間なしモード(拡張モード時)/25行(標準モード時)
|
||
BX=0000H('30'+'行'(C0A3H)以外ならよい)
|
||
機能: CRTモードを設定する。
|
||
AH=0AHでかつ、BXレジスタの値が'30'+'行'以外のときには、このファ
|
||
ンクションが実行される。
|
||
BXの値は0000Hが望ましい。
|
||
オリジナルBIOSの持つファンクションと同じなので、30行BIOSを前提と
|
||
してないアプリケーションでも動作するようになっている。
|
||
20←→25行の移行に本ファンクションを利用しているアプリケーション
|
||
が、拡張モード時に画面を崩さないように、整合性を取っている。
|
||
拡張モード←→標準モードの切り替えなどができない他は、上記のモー
|
||
ド移行ファンクションと同じ処理をする。
|
||
本ファンクションを実行すると、 CTRL+[f・6]やESCシーケンスによる行
|
||
間隔変更ができるようになる。
|
||
|
||
-----------------------------------------------------------------------
|
||
■1つの表示領域の設定(オリジナルファンクション拡張)
|
||
CALL: AH=0EH
|
||
DX=テキストVRAM先頭アドレス
|
||
RETURN: なし
|
||
|
||
機能: 拡張モードでFEPなどの操作を正常に動作させるために、 テキストVRAM
|
||
のオフセットアドレスを変更して、オリジナルCRT BIOSをCALLする。
|
||
標準モード時は、何もせずにオリジナルCRT BIOSに制御を渡す。
|
||
拡張モード時は、Ver1.00より前ではDXレジスタの値は無視され必ずオフ
|
||
セット0からになっていたが、Ver1.00以降ではオリジナルCRT BIOS同様
|
||
DXレジスタを評価するようになった。
|
||
|
||
-----------------------------------------------------------------------
|
||
■複数の表示領域の設定(オリジナルファンクション拡張)
|
||
CALL: AH=0FH
|
||
BX:CX=オリジナルのBIOSと同じ(TDB参照のこと)
|
||
DH,DL=オリジナルのBIOSと同じ(TDB参照のこと)
|
||
RETURN: なし
|
||
|
||
機能: ファンクション0EHと同様の処理を行っている。
|
||
DL=04のとき、もしくは標準モード時には、何もせずにそのままオリジナ
|
||
ルCRT BIOSに制御を渡している。
|
||
|
||
-----------------------------------------------------------------------
|
||
■表示領域の設定
|
||
CALL: AH=42H
|
||
CH=オリジナルのBIOSと同じ
|
||
RETURN: なし
|
||
|
||
機能: GDC 5.0MHz時、200LINEから400LINEに変更するとグラフィックが崩れる
|
||
ので、それを防ぐ。
|
||
標準モード時は、何もせずにオリジナルCRT BIOSに制御を渡す。
|
||
|
||
=======================================================================
|
||
30行BIOS対応アプリケーション作成時のヒント
|
||
基本的には、DOSのワークエリア(0060:0112)から画面行数を取得するだ
|
||
けで30行対応になります。
|
||
画面モード移行に伴い、30行BIOSがこのワークの値を適宜変更します。
|
||
よって、アプリケーション側でDOSのワークを書き換えないでください。
|
||
0060:0111 = ファンクション表示の状態
|
||
0:ファンクション表示なし
|
||
1:表ファンクション表示状態
|
||
2:裏ファンクション表示状態
|
||
0060:0112 = 現在の最大行数 - 1
|
||
(0060:0111=0のとき、1多くなります)
|
||
0060:0113 = 現在の行間の状態
|
||
0:20LINE(行間あり)
|
||
1:25LINE(行間なし)
|
||
|
||
以上より、使用できるテキストの最大行数は、
|
||
mov ax,0060H
|
||
mov ds,ax
|
||
mov al,ds:[0112h]
|
||
cmp byte ptr ds:[0111h],1
|
||
sbb al,-1
|
||
で得られることになります。
|
||
|
||
オリジナルの30行計画でも動作するようなアプリケーションを作るなら、
|
||
この手法を取ります。
|
||
現在「行間無しモード」だとすると、DOSワークからだけでは「行間空
|
||
きモード」 での行数を取得することはできません(もちろん自前で計算
|
||
すればいいのですが)。これは30行BIOSのファンクションFF03Hで取得で
|
||
きます。ただし、「インストールチェック」は、必ず行うようにしてく
|
||
ださい。オリジナルBIOSには、ファンクションFFHが存在しません。 た
|
||
だ単にリターンされるだけのようですが、すべての機種にあてはまるの
|
||
か保証できません(特にEPSON機)。よってインストールチェックは、十
|
||
分に行ってください。
|
||
TVRAMの連続領域の行数を取得するには以下の手法を取ります(CW行確保
|
||
時は、連続領域が1行少なくなります)。
|
||
mov bx,'30'+'行' ;(= 0C0A3h)
|
||
mov ah,00bh
|
||
int 018h
|
||
test al,010h ;拡張モード?
|
||
mov dx,20*256 + 25 ;標準モード時の行数
|
||
jz STD_Mode
|
||
xor bl,bl
|
||
test al,020h ;CW行を確保しているか?
|
||
mov ax,0ff03h
|
||
int 018h ;拡張モード時の行数を取得
|
||
jnz CW_Mode
|
||
inc ah
|
||
inc al
|
||
CW_Mode:
|
||
mov dx,ax
|
||
STD_Mode:
|
||
mov ax,0060H
|
||
mov ds,ax
|
||
mov ax,dx
|
||
cmp byte ptr ds:[0113h],0 ;現在行間あり?
|
||
jnz Done
|
||
mov al,ah
|
||
Done:
|
||
|
||
[END OF "30TECH.DOC"]
|