lemm519a_emuX.lzh

■これは

  LEMM.exe v5.19a をエミュレータで動くようにした特別版です。

  実機でも動きますが、おすすめはしません。

■エミュレータは

	Neko Project 21 ver.0.81a
	T98-Next 13.1th Beta
	Anex86 v2.78

  で動くようにしたつもりです。

  断言は出来ませんが、普通の XMS/EMS/VCPI としての機能は使えるようです。

  内蔵 DPMI は T98-Next では使えないようです。

■ロゴの E

  

  実機同様(水色点滅)なのは Neko Project 21 だけです。

  特に対策はしていません。

■通常版の LEMM.exe と何が違うの?

  機能に違いはありません。

  それぞれのエミュレータでうまく実行されないコードを変更しました。

  実機では無駄に思えるコードも加えました。

  その分サイズが増えています。

  実行速度も遅いです。

  実機では通常版をお使いいただければ幸いです。

- 追記 (2021.2.10) -
- 追記 (2021.2.12) -
- 追記 (2021.2.16) -

■ SL9821 beta Version 0.4.0.2 で組み込めない件

lemm517i_esl2.lzh (SL9821 用テスト版 r2)

■うまく実行されないコードって何なの? (SL9821 beta Version 0.4.0.2)

症状1:	SETALC は駄目っぽい。
対策1:	その手のコーディング廃止。

症状2:	VERR にヌルセレクタは駄目っぽい。
対策2:	その手のコーディング廃止。

症状3:	プロテクトモードの RETFD でスタック上の CS フィールドの上位ワードは 0 じゃないと駄目っぽい。
対策3:	0 にする。

症状4:	仮想86モードに移行する IRETD でスタック上の EIP フィールドの上位ワードは 0 じゃないと駄目っぽい。
対策4:	0 にする。

症状5:	16 ビットスタックの POPAD で ESP の上位ワードが ESP フィールドの値で破壊されるっぽい。
対策5:	諦めた。

症状6:	VCPI DPMI や LEMM 専用プログラムの挙動が色々変。
対策6:	諦めた。

症状7:	拡張メモリ 14MB 未満でもシステム共通域のメモリ量は常に 14MB っぽい。
対策7:	自力で減らす。(-!Z 指定時は減らさない)

症状8:	Mirage が組み込み時にハング。
対策8:	!traceint を指定する。

症状9:	TSS ジャンプで仮想86モードに移行すると、仮想86モードなのに USE32 になるっぽい。
対策9:	何とかして USE16 にする。

症状10:	コールゲートが何か変。
対策10:	コールゲート廃止。

- 追記 (2023.1.7) -

■ Anex86 v2.78 症状3の件

  症状3は、TF=1 で割り込みや例外が発生した場合、ハンドラ移行時も TF=1 っぽいという症状です。
  ここでいうハンドラとは、プロテクトモードで最初に実行されるハンドラのことです。
  要するに割り込みゲートで TF=0 になってないっぽいです。

  そのため、割り込みハンドラがシングルステップ状態で実行開始してしまうようです。

  ただし全てのハンドラが同様ではないようで、
  例えば、一般保護例外ハンドラは TF=1 で実行開始しているものの、シングルステップ状態にはなっておらず、
  pushf/popf や int/iret で TF の現在値(=1)が再ロードされるとシングルステップ状態になるようです。
 (つまりハンドラによっては実行開始時に TF=1 なのに運よく動いてしまって気がつかない)

  シングルステップ割り込みハンドラ自体も TF=1 で実行開始しているものの、
  シングルステップ状態になっている場合(再入して変になる)と、なっていない場合(運よく動く?)があるようです。

  この症状への対策で lemm_emu.exe v5.17i.X を r2 に更新しました。

- 追記 (2013.4.2) -
- 追記 (2023.1.7) -

■ Xnp21-20120618 で RELOAD 出来ない件

  前回の件と同様っぽい条件(※)で far call 命令が除算例外(?)になるようです。
 (※プロテクトモード USE16 特権0 SS リミット 4G)

  far call に相当する動きを far jmp で書くと大丈夫っぽいので、

		call	selector:offset ; 除算例外(?)

		↓

		push	cs
		push	offset @f
		jmp	selector:offset ; 大丈夫っぽい
	@@:

  という感じに、lemm_emu.exe v5.07a.X は far jmp に変更してあります。

  本家版 0.81a 0.83 だと通常版 LEMM.exe は動きませんが far call 命令は大丈夫っぽいです。

  本家版 0.84 0.86 は Xnp21 同様(?)に通常版 LEMM.exe が動くようですが、
  far call 命令が何か変で RELOAD 出来ないようです。

- 追記 (2012.5.27) -

■ Xnp21-20120302 で組み込めない件

  INT-67h AX=0DE8Ch のセレクタは仮想86モードのベースを継承、リミットは 4G になりますが、
  USE16 で SS リミット 4G における割り込みが ia32_panic になるようです。

  とりあえず、SS 属性ビット G=0 にしてリミット 1M にしたら ia32_panic にならず組み込めました。

  lemm_emu.exe v5.06a.9 の先頭から 34FFh バイト目の 8Fh を、

	8Fh → 0Fh にすると SS リミット 1M
	8Fh → 00h にすると SS リミット 64K

  という感じにパッチすると、Xnp21-20120302 で組み込めるようになるかと思います。

- 追記 (2008.1.13) -
- 改訂 (2008.1.19) -
- 追記 (2009.4.21) -
- 追記 (2009.5.31) -
- 追記 (2023.1.7) -
- 追記 (2023.4.1) -

■うまく実行されないコードって何なの?

	Neko Project 21 ver.0.81a
	T98-Next 13.1th Beta
	Anex86 v2.78

  にて試行錯誤した当時の記憶です。

  あくまで当方の推測なので信用しないで下さい。
  各エミュレータの最新版でどうなのか検証していません。
  根本的に当方のコーディングが変態的なのが元凶でありましょう。
  まあ、どうでもいいです。
  いや、そこを何とか。

■ Neko Project 21 ver.0.81a

症状1:	リミットが 0 の LDT セレクタを LLDT は駄目っぽい。
	TSS ジャンプも駄目っぽい。
対策1:	リミットが 0 の LDT セレクタの代わりにヌルセレクタを LLDT。
	同様に TSS の LDT フィールド変更してジャンプ。

症状2:	32 ビットコードセグメントにおいて、
	16 ビット near 相対ジャンプの相対飛距離が 7FFFh を越えると駄目っぽい。
	(もちろんオフセットは 64KB 以内ですよ)
対策2:	32 ビットコードセグメントにおいて、
	32 ビット near 相対ジャンプを 16 ビットに縮める最適化を全て廃止。
	(7FFFh 以内でも廃止)

	例えば、

	(JZ)	0F 84 xx xx 00 00
		↓
		66 0F 84 yy yy

	(JMP)	E9 xx xx 00 00
		↓
		66 E9 yy yy

	(CALL)	E8 xx xx FF FF
		↓
		66 E8 yy yy

	というような最適化を廃止。

症状3:	仮想86モードで SP=0 → PUSHA/ENTER 等 → スタックフォルトっぽい。
対策3:	諦めた。

症状4:	IDE 対応版だと何か変。
対策4:	I/O ポート 07EFh (PPMM の名残) のトラップ廃止。
	(Neko Project 2/21 の場合のみ)

■ T98-Next 13.1th Beta

症状1:	メモリ書き込み可否による拡張メモリ量チェックは駄目っぽい。
	4GB 認識してしまう。
対策1:	システム共通域の値を使う。

症状2:	割り込みや例外で仮想86モード→プロテクトモード移行時、
	SS の特権レベルが常に 3 っぽい。
対策2:	自前で 0 にする。

症状3:	割り込みや例外で仮想86モード→プロテクトモード移行時、
	スタック上の EIP の上位ワードが不定っぽい。
対策3:	自前で 0 にする。

症状4:	「MOV reg32,sreg」(「MOV EAX,DS」等)で reg32 の上位ワードが不変っぽい。
対策4:	自前で 0 にする。

症状5:	内蔵 DPMI 全く駄目っぽい。
対策5:	諦めた。

症状6:	「SGDT [ BP - 6 ]」「SIDT [ EBP - 6 ]」みたいな
	(E)BP を使ったアドレッシングが何か変。
対策6:	その手のコーディング廃止。

症状7:	「POP [ ESP - 8 ]」「PUSH [ ESP - 8 ]」みたいな
	ESP 自体の変化を伴う ESP を使ったアドレッシングが何か変。
対策7:	その手のコーディング廃止。

症状8:	FDD 起動だと組み込めない。
対策8:	0000:0500h bit0 の機種判別廃止。

症状9:	16 ビットの BT(「BT AX,CX」「BT AX,0」「BT [SI],CX」「BT [SI],0」等)が何か変。
	キャリーフラグがまともに変化しない。BTC/BTR/BTS は大丈夫っぽい。
対策9:	その手のコーディング廃止。

■ Anex86 v2.78

症状1:	無効命令例外を使った CPU 判別は駄目っぽい。
対策1:	その手のコーディング廃止。

症状2:	「AAM 16」「AAD 16」といった変態コードも駄目っぽい。
対策2:	その手のコーディング廃止。

症状3:	TF=1 が割り込みゲートで TF=0 になってないっぽい。
対策3:	自前で TF=0 にする。

症状4:	リセット時の DX が 0 っぽい。
対策4:	CPUID で代用。