MANIMANIAのレトロエロゲーカウントダウン

人生の残り時間が半分を切ったというのに若き日に目にしたエロゲーに魂を引かれ続けるイタいおっさんがこなしたゲームを紹介。

ご無沙汰しております

2010-12-22 18:22:06 | レトロパソコンのお作法
今年は赤字決算の自営業者です。

さて,何とかIPLを解析した「晴れのちおおさわぎ」でしたが,IPLによって飛ばされた先のADVSHELL.COMの解析に手間取ってしまいました,ってまだ終わってないし。

IPLの解析同様,実機上でWizardV5を使って逆アセンブルした結果をテキスト化し,コメントを付けてプログラムの流れを理解するという作業をしていたのですが,MS-DOS上のEXEあるいはCOMファイルの逆アセンブラであるSDASM(こだまさん開発)を使ってみると,こりゃすごい。
今まで逆アセンブル結果からちまちま拾っていたCALL命令の飛び先,戻り先まで含めて,プログラムの流れを楽々追える。

と,喜んだのも束の間,逆アセンブルリストには謎の命令が。

2305:06BD 0FBE cts 0BEh

CTSって何?
コール元に戻る直前にこの命令があったので,すごく気になる。

ネットで検索してもニーモニックでCTSと書かれている記事はほとんどない。
解説のありそうな本を何冊か入手しても書かれていない。

万策尽きたかと思われた中,ようやくCTSの解説された書籍を入手。
「80x86 80x87―ファミリー・テクニカルハンドブック」
Robert L. Hummel (著), 槌田 浩一 (翻訳) ,技術評論社 (1993/11)刊。

答はあっけなかった。
「CTS
タスク・スイッチ・フラグ(TS)のクリア :Clear Task Switch Flag
CTSはCLTSの別ニーモニックである。命令の内容はCLTSの項目を参照。」
とある(337ページ)。

で,
「CLTS
タスク・スイッチ・フラグ(TS)のクリア :Clear Task Switch Flag in CR0/MSW
CLTSは,CR0制御レジスタ(80386と80486の場合)やマシン・ステータス・ワード(MSW)(80286の場合)のタスク・スイッチ(TS)フラグをクリアする。
タスク・スイッチ・フラグは,タスク・スイッチが起こるたびにプロセッサによってセットされるが,クリアするには,この命令を使わなければならない。オペレーティング・システムは,このフラグを利用して,新しいタスクがシステム資源にアクセスする前に,(数値演算コプロセッサの状態などの)必要な情報を保存することができる。」とのこと(329ページ)。

意味が分かりません(T_T)

最新のインテルの仕様書
IA-32 インテル ® アーキテクチャソフトウェア・デベロッパーズ・マニュアル中巻 A:命令セット・リファレンス A-Mの129ページによると,

「CLTS―Clear Task-Switched Flag in CR0
オペコード 0F 06
命令 CLTS
説明 CR0 の TS フラグをクリアする。

説明
CR0 レジスタ内のタスクスイッチ(TS)フラグをクリアする。この命令は、オペレーティング・システム内で使用することを目的としている。これは CPL = 0 でのみ実行できる特権命令である。この命令は、保護モード向けの初期化を可能にするため、実アドレスモードで実行できるようになっている。
プロセッサはタスクスイッチが行われるたびに TS フラグをセットする。このフラグは、マルチタスキング・アプリケーションでの FPU コンテキストのセーブを同期させるために使用される。このフラグの詳細については、『IA-32 インテル ® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、下巻』の第 2 章の「制御レジスタ」の TS フラグに関する説明を参照のこと。」
とある。
マルチタスク処理をするときに必要なフラグのようです。

IA-32 インテル® アーキテクチャソフトウェア・デベロッパーズ・マニュアル下巻:システム・プログラミング・ガイドの54ページ以下を読んだけど,制御レジスタなんて初めて聞いたからわけ分かんね。8086CPUにもあるんだろうか。

PC-9801VM以降という範囲でいえば,CPUは8086互換どまりで,80286以上は予定してないだろうから,結局,8086CPUにおけるCTS命令の詳細は分からず終い。
何とも不完全燃焼ですが,まあとりあえず逆アセンブルリストからまったく知らないマシン語が消えたのは何より。
年内に「晴れのちおおさわぎ」を終わらせないと,今年はレビューできるゲームがなくなってしまう・・・。


最新の画像もっと見る

4 コメント

コメント日が  古い順  |   新しい順
CLTS (Unknown)
2010-12-23 16:37:21
>2305:06BD 0FBE cts 0BEh
0FBEはCLTS(CTS)でなくてMOVSXじゃないかな?CLTSは0F06のような

あと、CR0のTSビットはFPU命令実行でINT 7(割り込みというより例外)を発生させるフラグですね。
TSビットとEMビットは似てるけど、TSビットはタスクスイッチ(TSS切り替えによるタスクスイッチ)時にCPUが自動セット。

タスクスイッチ後、そのタスクがFPU命令(つまりx87不動小数点演算)を実行しようとしたらINT 7が発生してOSに処理が移行し、OSはFPUの状態をそのタスクの前回実行中断時の状態に復元。
んで、復元し終えたらもうINT 7の発生は必要ないのでCLTSしときましょう、と。

8086の場合はCLTS命令なんて無い(CR0自体無い)、というか0Fで始まる拡張命令も無いのでハングするのでは・・・試してませんが。
無効命令例外(INT 6)も80186以降で8086には無いようですし。

あやふやで違ってたらすいません。
返信する
そんな不動で大丈夫か (Unknown)
2010-12-23 16:45:04
浮動だ
返信する
コメントありがとうございます (MANIMANIA)
2010-12-25 15:20:34
初めまして。
マシン語本をろくに読んだことのない素人なのでとてもありがたいです。

8086CPUには浮動小数点演算機能がないので,FPU命令を処理できるわけがなく,「FPU コンテキストのセーブ」の余地もないですよね。

>8086の場合はCLTS命令なんて無い(CR0自体無い)、というか0Fで始まる拡張命令も無いのでハングするのでは・・・試してませんが。

明確なご指摘ありがとうございます。
このへんも自信なかったんです。

PC-9801シリーズ16ビットアセンブラ入門 新装版
吉川敏則著,秋葉出版('86/02)刊
の付録によっても,0Fのオブジェクトコードは(not used)と記されています。

ご指摘のとおり,CLTSは0F06ですので追記しておきました。

ADVSHELL.COMの解析結果をそのうちアップしますので,またご意見いただけると幸いです。
ありがとうございました。
返信する
ずれてたっぽい (MANIMANIA)
2011-09-17 00:11:45
今回,逆アセンブラ Sourcerで,ADVSHELL.COMを逆アセンブルしたところ,どうもSDASMで逆アセンブルできなかった部分を逆ハンドアセンブルする過程で,アドレスの転記ずれをしていたようです。

そんなわけで,CTS,CLTSともにADVSHELL.COMには用いられていませんでした。

お騒がせしてすみませんでした。
返信する

コメントを投稿