590
回編集
-
差分
→作者
CC.CはHI-TECH社とPierre Gielenの成果物をベースにしています。Arnold Metselaarはサブプログラムを実行し、メインプログラムを続行する部分のコードを追加しました。
---------------
VSH 実行中サブプログラムのスタックとしてビデオメモリを使う
==VSH*.O概要==
vshrt.asはサブプログラムをスタートさせ、その後元のプログラムを続けるコードが含まれています。これは、Nを1,2,3としてvshN.oとした3つの変種にアセンブルされています。これらのオブジェクトファイルは標準のcrt.oの代わりに使われることを意図しています。
CCの -Nオプションを使って、
crt.oへのリンクを抑制し、コマンドラインで最初のファイルとしてvsh[123].oを指定してください。
vshN.oがプログラムから使える N*0x4000までの最高位アドレスをセットすることに注意してください。これはプログラムには十分なサイズです。リンク、もしくは開始するまで、チェックは行われません。
他のプログラムはCプログラムから、次の関数で呼び出すことが可能です。
int _mspawn(char * subprogram, char * args)
subprogramは、プログラムファイルのフルネームで、通常は".COM"で終わるものです。
このプログラムは最も高位のビデオメモリのブロックNのプログラムを呼び出せるように配慮されています?
通常のメモリよりも高位アドレスを使う拡張メモリが考慮されています?。
subprogramで渡されるファイルはそれがargsの関数とともにコマンドプロンプトから実行中されたかのように動きます。
このサブプログラムが終了すると、呼び出したプログラムが復元され、_mspawnがサブプログラムからexitコードを返します。
このコードはDOS2ファンクションの _TERM (0x62)か、アドレス0x80に保存されたものが与えられます。
0x80の値が与えられるのはサブプログラムによって、この値が変えられ、DOS2がexitコードを返した時のみです。
サブプログラムの開始に失敗すると_spawnは-1を返し、エラーがセットされます。
_spawnは環境変数PROGRAMとPARAMETERSを変更してしまうことに注意してください。_spawn()を呼ぶ前に保存することは可能です。
大きなサブプログラムを実行する際には気をつけてください。これらは部分的にのみ読み込まれる可能性があります。
==どうやって動いているか==
その他のことをする前に
vshN.oとリンクするプログラムはDOS2マッパーサポートルーチンを使って、スロットセレクトとマッパーレジスタを復元します。これはスタックがページ3になければいけないためで、その後にスタックポインタをN*0x4000にセットします。
_spawnが呼び出されると、まずサブプログラムと、環境変数PROGRAMに入っているそのフルパスを探し、引数が0x81と環境変数PARAMETERSにコピーされます。
次に、実行する/復元するコードがすでにTPAの初めにインストールされているかチェックし、もしなければ、インストールします。
これは_spawn()のネストを許可します。この実行する/復元するコードはTPAのアドレスを、256バイト消費します。
実行する/復元するコードがインストールされた時にvshはVSHTOP環境変数を見て、もし設定されているのであれば、VSHTOPは
使われることがないか、VSHによって保証されたビデオメモリの最初のページを指定します。
ページ0-7は普通のビデオメモリ、8-11は拡張ビデオメモリです。
有効な数値は2-12で、デフォルトは12です。他の値は静的に無視されます。
高位ページを保護するためにこれを使えます。現在のところエミュレーターはvshtop=8が必要です。
最後に_spawnはサブプロセスをforkし、サブプログラムのファイルをオープンします。これは復元コードの"ステージ2"へのポインタを扱うファイルハンドラとともに
数多くのページや、実行コードを呼び出します??
実行コードは十分なスペースが残っているかチェックし、最低い使用中のビデオメモリページへの内部"ポインタ"をアップデートします。
これは100h--(#pages*4000h)-1 の"ステージ2"の復元コード256バイトを内容をビデオメモリに蓄えます??
最後にプログラムを読み、コントロールを渡します。
ウォームブートエントリーはTPAの初めから"ステージ1"に偏っています??
"ステージ1"はビデオメモリから256バイトを読み込み、自分自身のすぐ後のエリアにコピーし、その後"ステージ2"をビデオメモリから読み込んで、コントロールを渡します。
"ステージ2"はプログラムの初めに保存されたマッパーとスロットセレクトの設定を復元し、TPAの初めにビデオメモリをコピーし続けます。
最後に親プロセスが結合され、上述したように、サブプログラムのexitコードを_spawn()が返します。
�スクリーンはコンパイルのステップの間にフラッシュします。これはビデオメモリとの読み書きの信頼性を高めるためで、悩む必要はありません。