VZEditor/VZ-PC98/30BIOS/30TECH.DOC
Yoshihiko Hyodo 6f06b9514a first commit
2024-11-18 22:21:26 +09:00

444 lines
20 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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=標準モード
bit31:オリジナル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=標準モードに移行する
bit31:オリジナル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レジスタの値は、特に範囲チェックをしていないが、
10H14H(1620)が有意義な値であり、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 71:オリジナルの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"]