ディスカッション
コメント欄では300文字の制限からコメントしにくい長文や、記録を残す必要の有る内容についてはこのページを利用してください。
- 津軽 : DOS6
- SCSIのPhaseのMESSAGE_INとSTATUSの順を入れ替えたら、とりあえずSCSIのエラーは出なくなりました。が、HIMEM.SYSインストール中に割り込みハンドラを破壊という現象が起きていて原因を調査中です。なお、デバッガで BRKON INT 21 AH=3D としておくとfile openで止まるので、pri cst するとどのファイルを開くとこかわかるようになってます。[山川機長]
-
多分原因究明しました。
1086:0000A6C2 F36766A5 REP MOVSD
リアルモードで 67 をつけると32-bitオフセット使えるっぽいですね。直前でどうみても物理アドレスを計算するルーチンがあったので、YSSCSICD.SYS書いたとき、リアルモードだとアドレシングは強制的に16ビットになるものと思っていたのですが、いろいろ新たな発見がありますね。CPUコア、どこかで矛盾出さずに簡単に直るかな?とりあえずやってみます。[山川機長] -
HIMEM.SYSやっぱ変ですね。Real ModeだとセグメントリミットがFFFFのはずなのに。直前で↓になっているので、
1086:0000A67A 0F01E0 SMSW AX
1086:0000A67D D1E8 SHR AX,1
1086:0000A67F 0F82C901 JB 0000A84C
Unreal Modeでも無さそうなのですが。しかし67Hプレフィックスはついているし。HIMEM.SYSがちょっと難航しそうですね。[山川機長] -
連続ですみません。https://wiki.osdev.org/Unreal_Mode これによるとセグメントリミットってリアルモードに戻ってもリセットされないんですね!本当なのだろうか。そんなことが可能ならDOS Extender無くても良さそうな。。。。Unreal ModeはリアルモードでCR0のビット0を立てて使うもんだと思ってました。これを実装すれば多分HIMEM.SYSも動くかも。とりあえず、やってみます。[山川機長]
-
リリース出しました!DOS6.2は動きますがEMM386.EXEがTask Registerを使っている影響で未対応です。Task Registerの扱いは改めて勉強しないとわかりません。Task Register対応は後回しということにさせてください。なお、DOS6.2のHIMEM.SYSに対応したらFractal Engine Demoの画面の乱れも直ってしまいました。(やっぱりCPUだった)[山川機長]
-
DOS6動きました、ありがとうございます。EMM386対応も期待してます(Free386のデバッグに使いたいらしい)。
うんづで言うところの windrv.sys みたいなのが欲しくなりますね。
幸いDOSプログラミングは多少慣れているので、DOSでネットワークドライブを作成するドライバ仕様と時間があればやりたいところですが、軽く検索してみても、今どきDOSの資料探すのは大変だった。
多分sysファイルだとブロックデバイスにするしかなくエミュレーションが大変そうなので、ネットワークドライブはMSCDEXよろしくEXEで作るんだと思いますが……。どなたか情報お持ちの方いませんか。 -
Free386のデバッグにお役に立てるのであれば、なんとかしたいと思います!知り合いのX68Kユーザ(カーネギーメロン大最強の卒業生)にXMODEM対応したと言ったら、X68KにはWINDRVというドライバがあって、と自慢されたので是非ほしいですね!一応、勝手に空けたI/Oで高速にファイルを流し込む機能は既に入ってるのですが、ファイル共有できるとデモプログラミングが楽になりますね。あとは、EthernetCardの仕様がわかれば実装したいとこなのですが。[山川機長]
-
keymapの実装ありがとうございます。嬉しいです。個人的にはNumLockは無反応(マップなし)で良いのではないかと思います(物理キー側のモードを切り替えるだけなので、何か入力したくて押すわけではない)。
仮想ドライブドライバですが、SHSUCDXというものを見つけたので昨日ずっとソースを読んでました。まだ完全に理解したわけではないですが、そんなに複雑なことはしなさそうですのでなんとかなるかも。
http://adoxa.altervista.org/shsucdx/index.htmlあと、DOS6の仮想86モードは、ほとんどすべての特権命令をEMM386がエミュレートするので、ユーザーランドからみるとリアルモードとほぼ変わりありません。ですので、V86として真面目に実装しなくても(I/O他特権命令を素通りさせても)、DOSは問題なく動く気がします。
-HIMEM.SYS 1MB超えメモリの管理。CPUのリアル←→プロテクトモード切り替え機能。
-EMM386.EXE CPUをV86モードに切り替えてEMM機能(バンクメモリシステム)のエミュレート。 [nabe@abk] -
ネットワークドライブの仕組みがなんとなく分かってきたので、MSCDEXを軽く解析してるのですが、デバッガ超絶便利で感動しています。そこで要望ばかりして大変申し訳ないのですが、将来的にメモリダンプコマンドをつけていただけると嬉しいです。
ひとまず「dbコマンド(dump byte)」があると嬉しいです。「db ds:bx」とかできると感動ですが即値のみでも十分。 [nabe@abk] -
とりあえずVM86に入ることはできてINTも出るようになったのですが、INT 97H(TimerBIOS)が出てる箇所があって、プロテクトモードのIDTに97Hが書いてなくて止まってます。ここは本来97Hのエントリが書かれてあるべきなのか、それともNP faultを出すのが正しいのかで止まってます。ごまかしてリアルモードのとび先に直接飛ばすという手でも動きそうな気がしますが一応正しく処理する方法を模索してます。[山川機長]
-
>INT 97H(TimerBIOS)
V86モードでもプロテクトモードで割り込みを発生させる場合は、DOS-Extenderの機能を使ってリアルモード側のベクタを書き換えるのが正しい処理になります。
よって、V86モードで発生した割り込みでしたら、EMM386の機能としてはリアルモードベクタに飛ばすのが正しい処理だと思われます。もしくは正しい例外処理をエミュレートできれば、EMM386がエミュレートしてリアルモード割り込みに引き継ぐと思われます。
※EMM386は、V86なDOS環境をリアルモードと極力同じにするよう動作します。 [nabe@abk] -
IDTが存在しないINTはGP例外を出すとEMM386が処理をフォワードしてくれるようです。が、次にDEVICEHIGH=SETVER.EXEで、なぜかヘッダを除いて最初の600Hバイトと最後の19BHバイトしかHIEH Memoryに転送しない現象が起きてます。(SETVER.EXEのファイルサイズは319BH) 600Hバイトはヘッダ200Hを足すと800HになるのでEMM386のページサイズが800Hなのではないかと思うのですが、どうして途中を飛ばすのやら。[山川機長]
-
DEVICEHIGHは、デバイスドライバを1MB以下のUMB領域(0C0000h-0FFFFFh)に読み込む指定になります。プロテクトメモリには転送しません。この領域はDOSのメモリ管理下(MCBによる16byte単位)です。また、UMB領域はEMS(EMM386)によって16KB単位のバンクメモリ領域としても使用されます。
ちなみにSETVERの常駐サイズを確認しましたが128byteのようです。またEXEは64KBの壁を超えるためセグメント分割されていて、ファイル内容がそのままメモリに展開されるわけではありません。参考までにDOSメモリ確認ツール https://www.vector.co.jp/soft/dos/hardware/se002492.html [nabe@abk] -
とりあえずここまで調べた点なのですが、DEVICEHIGH=SETVER.EXEで、SETVER.EXEはいったん E126 セグメントに展開されて実行されているようです。このとき、INT 21HはEMM386経由で FF10 セグメントにフォワードされるようになっていて、この中で、
FF10:00007B0B 8BC3 MOV AX,BX ; AX=BX=WholeSize-1stBatchSize,299BH for SETVER.EXE
FF10:00007B0D 33D2 XOR DX,DX
FF10:00007B0F 26F77602 DIV WORD PTR ES:[BP+02H] ; ES:[BP+02H]=800H
FF10:00007B13 A3D605 MOV [05D6H],AX ; [05D6H]=CopySize/800H
FF10:00007B16 8916D405 MOV [05D4H],DX ; [05D4H]=CopySize%800H
なんの単位かわからないですが2KB単位で処理しているようです。ページングが有効になっているのでページ単位かとも思ったのですがだったら4KB単位にしそうですし。ひょっとして80286のページングって2KB単位だったりしますか?その名残でしょうか?
なお、ES:[BP+02H]は起動の初期のうちにセットされていて、KEYSET.TBL読み込み前に既に0800Hと決まっていたようです。
他にわかっていることで現在重要と考えているポイントは、以下の通りです。
[032EH] コピー先セグメント (E126H)
[05B8H] コピー先オフセット
[05D2H] 最初総バイト数で、途中から一度のバッチでコピーされるバイト数。
[05D6H] 800Hバイトフルにコピーする単位数。
[05E2H] ソース情報(多分)
FF10:7B48 FF10:9080の転送ルーチンを複数回に分けて呼び出してバイナリを転送。なぜか最初と最後しか転送してくれない。
FF10:9080 転送ルーチン (MOVSWとMOVSB実行)
FF10:9044 転送ルーチンから呼び出されてコピー元、コピー先、バイト数を返すFF19:914E 転送先ポインタを 0600H から 2E00H に書き換えている。この中で中間部分の転送が発生するべき?
SETVER.EXE読み込み 9CB9:0014
SETVER.EXE転送元 9CB9:0214
SETVER.EXEファイル情報とか(多分) 9CB9:0000から14Hバイト
SETVER.EXE転送先 E126:0000
SETVER.EXE Strategy CS:IP E126:001E
SETVER.EXE Interrupt CS:IP E126:0029 -> E126:0038 E95208 JMP 088D で飛び先に何もない(全部ゼロ)
転送元の場合 9C9B:023D -> 9CB9:024C E95208 JMP 0AA1 とび先に意味のあるコードあり
多分、Virtual86モードの実装が不完全なため、なぜか途中をすっ飛ばしてしまっているのではないかと思います。FF10:7B48内で、[05D6H]コピーする単位数を参照している箇所も既にわかっているので、その付近で中間部分をE126セグメントに転送するべきだと思うのですが、というところで今止まってます。 -
80286はds等のセレクタによるリニアアドレス拡張(Max16MB)が主で、ページング機構はなかったはずです。よって2KB単位の意味はちょっとわからないです。お話を読む限りだと、転送ルーチンがうまく動いないように思えますが、あまりお役に立てなそう……。
ネットワークドライブ(windrv.sysもどき)関連ですが、DOS側の必要な仕組みは概ね分かりました。特定のI/Oを叩くとエミュ側に処理引き継ぐ(APIコール的な)形の実装を考えています。エミュ側のソースぜんぜん読めていないので、まだ先には長いですが。 [nabe@abk] -
EMM386をインストールすると、以後INT 21HはEMM386がTake overするようですね。それまで1456セグメントに飛んでいたのがプロテクトモード経由でFF10に飛ぶようになります。
また、SETVER.EXEコピー先のE126セグメントですが、Pagingによってプロテクトモードメモリが割り当てられているようです。(なおデバッガのADTRコマンドでリニアアドレス、物理アドレスが見れます)
ADTR E126:0000
0000E126:00000000
LINE:000E1260
PHYS:00149260
また、2KB単位のコピーですが、コピー先はE126:0000で、しかも、物理の149260Hなので、コピー先の2KB境界は気にしていないようで、しかもコピー元も、最初の14Hバイトは何かのEXEに関する情報が書いてあるようなので、元も先もページ境界をばっちりまたいでます。800Hバイト単位にする意味がますます謎ですね。
EMM386を使わなければDOS6も普通に動くみたいなんですけどね。
WINDRV.SYSもどきですが、I/Oを開ける必要があったら言っていただければなんとでもしますので。例えば、ドライバにする前でもディレクトリ情報を受け渡すI/Oのプロトコルを決めてEXEで実験とかできると思いますので。よろしくお願いします!
2KバイトREP MOVSWしている箇所を見つけたのですが、直前の条件分岐で回避されてしまいました。残念。
[山川機長]
コメント
最新を表示する
長文や後に残す必要の有る内容を書き込むページとしてdiscussionページを作成しました。
左メニューよりお入りください。なお、discussionページに関しては現状ではどなた様でも編集可能となっていますが、あらし等が確認された場合はメンバー登録された方のみが編集可能とする事も有ります。
NG表示方式
NGID一覧