-
A4 - reiria
2016/01/02 (Sat) 12:08:21
LEMM v5.11c のスレにも書きましたが、従来の UCGW は FVIEW がハングすることが発覚しためため、
LEMM v5.12a は UCGW をかなり高速化しました。(UCGWIO と同じ)
この新しい UCGW ですが、WW v0.41b 以前は対応しておらず、WW v0.42a 以降対応しています。
また、Mirage についてですが、Mirage は様々な割り込みに介入するため、
なるべく遅い A4 UMB を通過しないように、A4 UMB を避けて常駐するようにしました。
Mirage v0.49a 以降、オプション A4UMB か UMBA4 を指定すれば Mirage v0.48a 以前と同様に常駐します。
あと、LEMM v5.12a に A4.com というプログラムを同梱しました。
この A4.com というのは、
・A4 UMB を無駄に確保して他のプログラムに使われないようにする
・A4 UMB を通過してる割り込みを調べる
といったことをするプログラムです。
Re: A4 - reiria
2016/01/02 (Sat) 12:10:04
■つまり
A4.com fill
↓
A4 UMB で実行させたくない常駐物等
↓
A4.com free
という感じに、A4 UMB で実行させたくない常駐物等の前後で実行します。
CONFIG.sys/コマンドラインどちらでも実行出来ます。
Re: A4 - reiria
2016/01/02 (Sat) 12:11:20
■とりあえず実行すると
A4 UMB のメモリマップ(MCB,サイズ,状態,名前)が表示されます。
A4 UMB が無いなら何も表示されません。
Re: A4 - reiria
2016/01/02 (Sat) 12:12:30
■オプション
fill A4 UMB の空き領域を無駄に確保 (※)
free A4 UMB の無駄に確保した領域を解放
map [c][u][x] A4 UMB 以外も表示
c conventional
u UMB
x XMS UMB
v verbose
"文字列" 文字列と一致したものを表示 (複数指定可)
'文字列' 〃
ASCII 大文字と小文字は区別しない
空白で区切らないと連結
例「"3.5"'"'" fdd" "hdd"」→「3.5" FDD」と「HDD」
esc リダイレクト時もエスケープシーケンスを出力
> リダイレクト (CONFIG.sys 可)
>> 〃
メモリマップの fill と free は水色で表示されます。
※A4 UMB を含む UMB の空き領域が一つだけの場合、
A4.com 実行前に何かを DEVICEHIGH すると DOS が A4 UMB を確保してしまうため、
その後の CONFIG.sys 実行中に A4 UMB に空きがあっても、
CONFIG.sys が終わるまで、A4.com は A4 UMB を確保出来ない場合があります。
Re: A4 - reiria
2016/01/02 (Sat) 12:14:11
■おまけオプション
int [番号] 割り込みハンドラのチェーンを表示(MCB,ベクタ,名前)
io 割り込みハンドラが使っている I/O port を表示
!out out を I/O port に出力せずにエミュレート
多重フックされたベクタのアドレスを確認出来ます。
A4 UMB は水色で表示されます。
表示されるベクタは 08~1F,21,25,26,28,29,2A,2F,DC だけです。
番号を指定すると、指定した割り込み番号だけ表示されます。
(16進正規表現)
MCB 範囲外は ? で名前は DOS,HMA,EMM,EMS,ROM-BIOS,Mirage 等と表示されます。
オプション int と map はどちらか一方のみ有効で、c u x の意味が異なります。
int での c は INT-0Ch の意味で、u x はエラーになります。
通常、オプション int は LEMM 専用です。
表示される内容は仮想 86 モード(リアルモード)の割り込みハンドラだけです。
メモリマネージャ等のプロテクトモードの処理はトレース出来ません。
システムマネージメントモードもトレース出来ません。
環境によって相性のよくない場合があるかも知れませんので、ご注意下さい。
Re: A4 - reiria
2016/01/02 (Sat) 12:15:51
■オプション int と相性のよくない場合って何?
ハードウェア割り込みハンドラをソフトウェア的に実行するため、
ハードウェア割り込みハンドラ側が想定していない状況の可能性があるためです。
安全対策として、ROMーBIOS は実行せずに iret するようにしています。
Mirage に到達しても iret します。
例えば、INT-09h をソフトウェア的に実行する場合、
>A4 int 9
↓↑
INT-09h をフックしている常駐物等は実行される
↓↑
(Mirage に到達したら iret する)
↓↑
INT-09h ROM-BIOS の入口で iret する
|
ここまで来ない
↓
INT-09h ROM-BIOS は実行されない
という流れになります。
Re: A4 - reiria
2016/01/02 (Sat) 12:17:25
■オプション int って LEMM 専用じゃないと駄目なの?
シングルステップ割り込みを割り込み元のスタックを使わずに処理するためです。
例えば、
cli
mov sp, NEW_SP
mov ss, NEW_SS
というシーケンスでシングルステップ割り込みが発生した場合、
mov sp, NEW_SP
↓
シングルステップ割り込み発生
↓
mov ss, NEW_SS
となるので、変な SS:SP に IP CS FLAGS が積まれるとまずいです。
SS SP の設定が、
mov ss, NEW_SS
mov sp, NEW_SP
や、
push NEW_SP
push NEW_SS
pop ss
pop sp
や、
lss sp, NEW_SSSP
というようなシーケンスであれば、
SS SP の設定中にシングルステップ割り込みは発生しませんが(たぶん(^^;)
割り込み禁止で SS や SP を汎用的に使う場合もあります。
よって、シングルステップ割り込みで割り込み元のスタックが使われないように、
(つまり、リアルモードのシングルステップ割り込みハンドラが起動しないように)
シングルステップ割り込みを LEMM 側の例外ハンドラで処理します。
Re: A4 - reiria
2016/01/02 (Sat) 12:18:46
■もう何でもいいから割り込み元のスタックを使ってもいいなら
>A4 int !LEMM
というようにオプション !LEMM を指定します。
他のメモリマネージャやリアルモードでも実行出来ます。
オプション !LEMM で実行した場合、最後に <!LEMM> が点滅で表示されます。
大概、何事もなくあっさり動きますが、不具合の有無は単純には判断出来ません。
暴走しないからといって不具合が無いかどうかはわかりません。
Re: A4 - reiria
2016/01/02 (Sat) 12:19:23
■デバッガで常駐物追うのに疲れた時に
unag を常駐させ、
>A4 int logall una
というようにオプション logall una を指定すると逆アセの内容も表示されます。
A4 にアクセスする命令は水色で表示されます。
in out 命令は黄色で表示されます。
※ ins outs 命令が A4 をアクセスする場合はオペランドが水色。
※ !out で出力しなかった out 命令は点滅。
※ !out の場合でも I/O port 063C 0704 0A08~0A0A 0CF8~0CFF は出力されます。
Re: A4 - reiria
2016/01/02 (Sat) 12:20:08
■いつの日か ROM-BIOS も実行してみたい時が来たら
>A4 int logallrombios una
Mirage で ROM-BIOS の実行ログが見えるのは Mirage v0.49a 以降です。
(Mirage の実行ログには * が点滅)
なお、INT-1Eh の ROM-BIOS は危ないので実行しません。
Re: A4 - reiria
2016/01/02 (Sat) 12:20:52
■エミュとオプション int
Virtual98 以外うまく動かないっぽいです。(2015.8.24 現在)
まだよく調べておらず、今のところエミュでの動作は考慮していません。
Re: A4 - reiria
2016/01/02 (Sat) 12:21:47
■割り込み呼び出し時のレジスタ値
<?pre>
INT AX BX CX DX SI DI BP DS ES
08-17 0000 0000 0000 0000 0000 0000 0000 A4CS A4CS
18 05FF 0000 0000 0000 0000 0000 0000 A4CS A4CS
19 7FFF 0000 0000 0000 0000 0000 0000 A4CS A4CS
1A B101 0000 0000 0000 0000 0000 0000 A4CS A4CS
1B 7FFF 0000 0000 0000 0000 0000 0000 A4CS A4CS
1C 7FFF 0000 0000 0000 0000 0000 0000 A4CS A4CS
1D 7FFF 0000 0000 0000 0000 0000 0000 A4CS A4CS
1E 7FFF 0000 0000 0000 0000 0000 0000 A4CS A4CS
1F CC01 0000 0000 0000 0000 0000 0000 A4CS A4CS
21 5100 0000 0000 0000 0000 0000 0000 A4CS A4CS
25 00FF 0000 0000 FFFF 0000 0000 0000 A4CS A4CS
26 00FF 0000 0000 FFFF 0000 0000 0000 A4CS A4CS
28 0000 0000 0000 0000 0000 0000 0000 A4CS A4CS
29 000D 0000 0000 0000 0000 0000 0000 A4CS A4CS
2A 0000 0000 0000 0000 0000 0000 0000 A4CS A4CS
2F 0500 0000 0000 0000 0000 0000 0000 A4CS A4CS
DC 0000 0000 0012 0000 0000 0000 0000 A4CS A4CS
<?/pre>
※ 386 以降では 32bit レジスタの上位ワードと FS GS は 0 です。
※ A4CS は A4.com 自身を実行している CS です。
※ 08 の呼び出し時は、念のため インターバル タイマ BIOS のハンドラを設定しています。
※ 0C の呼び出し時は、念のため RS-232C BIOS の受信バッファを設定しています。
Re: A4 - reiria
2016/01/02 (Sat) 12:44:11
A4 fill で無駄に確保した A4 UMB のメモリブロックの次のメモリブロックの MCB を A4 UMB 末端に残すか、
それとも A5 に入れるかでちょっと悩みましたが A4 UMB 末端に残しました。
なので、メモリマップ表示ツールで A4 fill のメモリマップを眺めると、
空きメモリブロックに A4FF が表示されると思いますが、そのメモリブロックの中身は A500:0 からになりますので、
そこに常駐しても、A4 UMB を通過することはないかと思います。
Re: A4 - reiria
2016/09/18 (Sun) 16:17:31
A4.com v0.02a v0.03a はオプション vme の INT clock に iret 命令のクロック数が含まれていたのですが、
v0.04a は含まないようにしました。
また、仮想 86 モードで実行した場合でも、リアルモードの計測もするようにしました。
なお、2016-9-7 にアップした LEMM v5.13a のアーカイブ lemm513a.lzh は、
2016-9-7 A4.com v0.02a
2016-9-8 A4.com v0.03a
2016-9-18 A4.com v0.04a
というように、同梱する A4.com を差し替えたため、異なる lemm513a.lzh が既に 3 種類存在します。
Re: A4 - reiria
2016/09/18 (Sun) 16:19:11
あと、リアルモード int と pushf cli callf のクロック数が同じ CPU もあるようです。
というか、いつも使ってる Ra266 PentiumIII はそのようです。
さすがに全く同じっていうのはちょっと妙な気もしますが、どうも同じようです(^^;
1000 回連続計測するうちに CPU がうまいこと処理するのかもですが、
若干遅いのは 1, 2 回目で、3, 4 回目から大差ないというか、1000 回も計測する必要ない気もします(^^;
(最初に wbinvd invd した場合、1 回目の遅さは若干程度ではなく元気よく遅い)
仮想 86 モード VME 有効 int のクロック数はリアルモードに近いですが、僅かに多いようです。
Re: A4 - reiria
2016/09/18 (Sun) 22:14:20
> 2016-9-18 A4.com v0.04a
オプション vme が Jack の遅延を掃き出さないままハングする致命的問題が発覚したため公開中止しました。
もし既に A4.com v0.04a をゲットした方がおられましたら捨てて下さい(;_;)
Re: A4 - reiria
2016/09/18 (Sun) 22:30:07
久しぶりに遅延の恐怖味わい中(T_T)
Re: A4 - reiria
2016/09/18 (Sun) 22:55:09
ハングの原因は、A4.com v0.04a のオプション vme で INT clock の計測時に、
仮想 86 モードからリアルモードに切り替わる際に Jack が自動的に遅延を掃き出そうとすると、
A4.com v0.04a がハードウェア割り込みを止めるせいで、書き込み失敗するためです。
Re: A4 - reiria
2016/09/19 (Mon) 17:52:15
オプション vme と Jack の遅延との不具合を修正した A4.com v0.05a をアップしました。
lemm513a.lzh も差し替えました。