-
「UTILITIES PUBLIC DOCUMENT CC」の版間の差分
細 |
(→作者) |
||
91行目: | 91行目: | ||
CC.CはHI-TECH社とPierre Gielenの成果物をベースにしています。Arnold Metselaarはサブプログラムを実行し、メインプログラムを続行する部分のコードを追加しました。 | 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()が返します。 | ||
+ | |||
+ | �スクリーンはコンパイルのステップの間にフラッシュします。これはビデオメモリとの読み書きの信頼性を高めるためで、悩む必要はありません。 |
2017年8月26日 (土) 19:59時点における版
CC - HiTech-C及びmsx-dos2用改良型コントロールプログラム
About
cc.comはHI-TECH CでCプログラムをコンパイルする際のパスを自動実行します。HI-TECH社製のc.comは同じ動作をしますが、cc.comは次のようなアドバンテージがあります。
- cc.comはバッチファイルを使わず、またパスでエラーがあった場合に停止します。
- cc.comは追加を変数を設定しますので、ソースファイルをコンパイラのあるディレクトリ以外にも置けます。
インストール方法
初めにMSX-DOS2をインストールする必要があります。それからHI-TECH Z80 CP/M C Compilerをftp://ftp.funet.fi/pub/msx/programming/c/hitech-?.pmaからダウンロードして、pmextで解凍してください。
HI-TECH社は親切にも、このCコンパイラを無料で使用する許可をしてくれています。詳しくは
http://www.htsoft.com/products/CPM.php を見てください引用エラー: 無効な <ref>
タグです。
名前 (name 属性) がない場合は引用句の内容が必要です
cc.lzhをCコンパイラがあるディレクトリに解凍します。
以下のファイルが得られます。
- cc.com
- c.comの代替物
- libdos2.lib
- MSX-DOS2を使用するIOライブラリで、ソースはlibdos.lzhにあります。
- vsh1.o,vsh2.o ,vsh3.o
- CRT.Oの変種で他のプログラムを実行するためのプログラムです。詳細はvsh.txtをご覧ください。
- vsh.txt
- vsh?.oに関するテキストです。
- redir.obj
- link.comの-Uバグに対して使うものです。
- cc.txt
- このテキストです。
- cc.c
- cc.comのソースです。
- vshrt.as
- vsh?.oのソースです。
- redir.as
- redir.objのソースです。
- makefile
- pack.bat
ccを使う
CCを以下のようにして起動できます。
cc <options> <files>
次のオプションが認識されます。
- -C
- オブジェクトファイルをキープし、リンクしない
- -CR[file]
- クロスリファレンスファイルを生成する
- -O
- OPTIMを使って、CGENに生成されたアセンブリコードを最適化する
- -O<file>
- <file>にアウトプットを出力
- -I<dir>
- インクルードファイルの追加検索パスとしてしてCPPに渡されます。ドライブに対してのみ働き??cc.comが格納されているディレクトリは常にAPPEND環境変数を介して検索されます。
- -V
- 冗長モードです。サブプロセスのコマンドを表示します。
- -F<file>
- シンボルファイルに書き込みます
- -U<sym>
- CPPのシンボル定義を取り消します
- -D<sym>[=<def>]
- CPPのシンボルを定義します
- -S
- アセンブリファイルをキープします。アセンブリもリンクもしません。
- -X
- ローカルシンボルを抜き出し、LINKに渡します。
- -P<pspec>
- psectの順を定義します(通常は必要ありません)
- -M<file>
- マップファイルを書き出します
- -W<n>
- マップファイルの幅です
- -l<xx>
- LINKにlib<xx>.libを渡します。順番が重要です。
全てのオプションは大文字、小文字を区別しません。
ファイル
拡張子のないファイルは、".c"の拡張子を取ります。".c"の拡張子がついたファイルはC言語のソースファイルとして扱われます。".as"の拡張子がついたファイルはアセンブラのソースファイルとして扱われます。 他のファイルはリンカに直接渡されます。
環境変数
CCでは使われず、また検証もされないビデオメモリの最初のページをVSHTOPで指定します。
- VSHTOP
- ページ0-7は普通のビデオメモリ、8-11は拡張ビデオメモリです。有効な数値は2-12で、デフォルト値は12です。
他の数値は静的に無視されます。:VSHTOPが2の場合、CCは動きません。より高位アドレスで、データを保存することができます。あるエミュレータではvshtop=8が必要かもしれません。
注記
CC.COMは一時的な保存にビデオメモリを使用します?そのため、同じくビデオメモリを使うRAMDISKは内容が壊れてしまう可能性があります。 スクリーンはコンパイルのステップの間にフラッシュします。これはビデオメモリとの読み書きの信頼性を高めるためで、悩む必要はありません。 HI-TECH Cは大きなC言語のファイルを扱えません。これは本当のところ問題ではありません。プログラムを6-7kのC言語のファイルに分けるだけです。 Arnold metselaar によるMAKEプログラムはCC.comと一緒に使え、 リコンパイルする必要があるモジュールだけをコンパイルするのに使えます。
以下も参照してください
- HI-TECH C同梱のドキュメント
- 一般的なC言語に関するドキュメント
- vsh.txt
作者
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()が返します。
�スクリーンはコンパイルのステップの間にフラッシュします。これはビデオメモリとの読み書きの信頼性を高めるためで、悩む必要はありません。