![]() |
Message Log 40 | Return to Parent Menu |
Last Updated by 07/01/05(Fri) |
| |||
この掲示板、愛されてるなぁ〜(感涙) |
| |||
| |||
: 力卜 [2003/10/27 Mon 22:11:54] [192.51.44.48] To: まつもとさん。 ご自身専用とか、特定ハード限定と割り切ることができるのなら 気にしないで済むことですがちょっとだけ参考情報を。 FDブートディスクというのが「ある時点でCPUをプロテクトモードに 変更し、それからFDを読む」ということをするのでしたら仕方ないですが、 FD読み込み時にCPUのモードを変更しないのなら、FDDのアクセスにBIOSを 使った方がよいかと思います。 最近のNotePCはUSBのフロッピーディスクドライブしか接続できないと いうマシンも多いと思います。こういうマシンでは、FDDへのアクセスを BIOSからにしておけば問題ありませんが、レガシーI/OからFDDに直接 アクセスすることはできません。 参考: http://lists.debian.or.jp/debian-users/200208/msg00144.html http://review.japan.cnet.com/pub/dir/other/maker/iodata/iodata-usb-fdx2/27RLHFJ9KW.html USBへのI/Oへのアクセスの仕方は不勉強にして知りませんが、TurboPASCALで実装している サブルーチンがあるようです。FDDへのアクセスの仕方は結局わかりませんが…。 http://members.tripod.com/cuzintone/Download/usb.htm まつもと [2003/10/26 Sun 19:39:35] [61.203.92.78] グリポンさん、ありがとうございます。 なるほどそういうことでしたか。 それにしてもFDD一つ動かすのも結構大変なんですね。今まで楽をしていましたが、ハード関連、ファーム関連の方々に頭が下がります。 ぐりぽん [2003/10/26 Sun 07:24:10] [210.249.5.211] >まつもとさん おはようございます。はじめまして。 おっしゃる通り、これはFDCからの割り込みを待っています。 FDCがコマンド実行を終了するときは、割り込みを発生させます。 その割り込みハンドラ内でALが変更されるのを利用した待ちルーチンが 以下にまつもとさんが示したコードです。 ところで、The Undocumented PCが置いてある図書館ですか。 うらやましうございます。私も一度は読んでみたいです。 それでは。 まつもと [2003/10/26 Sun 03:39:48] [61.203.92.78] こんばんは 松本です この間図書館でFD周りの資料をあさっていて役に立ちそうな本を見つけたので紹介します。 「THE UNDOCUMENTED PC」なる本で、なかなかボリュームのある米書です。I/Oについてサンプルコードつきでいろいろ紹介されてます。 澤口@一升金さん良いサイトを紹介ありがとうございました。教えていただいたサイトを見ながら、FDブートディスクを作るべくがんばってます。 いきなり質問で恐縮なのですが、FDブートディスクを逆アセンブルして解析していたところSEEKコマンドについて、質問があるのですが、 まつもと [2003/10/25 Sat 21:54:14] [61.203.92.78] 澤口@一升金さん 良いサイトを紹介ありがとうございました。 例題がほしくなったのでFDブートディスクを逆アセンブルしてみたところ、FDCのseekコマンドの処理で分からないところがあったので 質問させてもらいました。 下記修正 out 03f5,0000h out 03f5,00h ↓ Pacmon [2003/10/25 Sat 21:51:16] [218.142.56.1] >ぐりぽんさん なるほど。 では、資料を有効に使わせてもらいます。 ありがとうございました! まつもと [2003/10/25 Sat 21:46:35] [61.203.92.78] 松本です seekコマンドを入力後、なにやら一時的に割り込みを許可しているようなのですが、何をしているのでしょうか、割り込みを待っているのですか? 一応下にコード載せときます。 out 03f5,0000h ;seekコマンドの最後:0000セクターにセット mov al,66h sti A:cmp al,66h jz A ;cmp al,66h へ cli ret /* FDC割り込み処理 */ out 20,al ;EOI発行? inc ax iret ぐりぽん [2003/10/25 Sat 21:10:55] [210.249.5.171] >0x000A0000 当然、プロテクトモード移行前にグラフィックモードに変更していれば 使えます。グラフィックモードでの書き込み方法はさっきのVGA資料を 読めばだいたい分かると思います。 それでは。 Pacmon [2003/10/25 Sat 21:04:47] [218.142.56.1] ↓の修正です。。 何度もすみません。 先ほどの投稿に誤りがありました。 >・・・ということは、テキストモードではなくグラフィックモードのA000h(でしたっけ?)も同じように使えるのでしょうか。 0がひとつ足りませんでした。 A0000hですね。。 すみませんでした。 Pacmon [2003/10/25 Sat 20:58:37] [218.142.56.1] >ぐりぽんさん おお!すばやいレスありがとうございます!! なるほど。リアルモードとプロテクトモード、どちらも同じ場所にあるのですね。 初めて知りました。 ・・・ということは、テキストモードではなくグラフィックモードのA000h(でしたっけ?)も同じように使えるのでしょうか。 >http://community.osdev.info/ 早速アクセスしてみましたが、ものすごい量の資料が集まってますね。 ちゃんとVGAについてもありますね。 いろいろと勉強になりました。 ありがとうございます。 ぐりぽん [2003/10/25 Sat 20:39:30] [210.249.5.171] >Pacmonさん こんばんわ。さっそく回答いたします。 画面のバッファが0x000B8000に存在するので、そこに文字と 属性(背景色とか文字色とか)を書きこめば表示はできますよ。 試しにいろいろやってみてください。 他のあれこれは‥‥探してみてください(ぉぃ とかいうのもアレなので、これだけ投下すれば大丈夫でしょう。 http://community.osdev.info/ けんぼぉ [2003/10/25 Sat 20:24:22] [220.210.1.141] ども、けんぼぉです。 既にご存知かと思いますが、「いまどきのアセンブラプログラミング」 という本が、10/28に発売されるようです。 「いまどきのアセンブラプログラミング」 ・著者:橋本和明・山本洋介山・leye ・定価:本体3,000円+税 ・A5判 480ページ ・ISBN4-8399-1202-5 ・発売日:2003年10月28日 http://book.mycom.co.jp/book/4-8399-1202-5/4-8399-1202-5.shtml Pacmon [2003/10/25 Sat 19:28:37] [218.142.56.1] おひさしぶりです。 アセンブラで自作プログラムを作っていて、 プロテクトモードまで移行することができました。 その次なんですが、BIOSのファンクションコールを使用せずに、 ディスプレイへ文字列を表示したくなりました。 実際、プロテクトモードへ移行した後も確認ができず、困っています。 ということで、恐らくOUT命令などでハードウェアを直接叩くのだと思うのですが、 その文字列の表示やその他のディスプレイ系統の操作の資料などのあるところを教えてほしいのですが。 よろしくお願いします。 Rastiv [2003/10/25 Sat 09:46:42] [219.165.205.8] ラスティブです。 ここの掲示板の過去ログには貴重な情報が盛りだくさんだ ・・・と今更になって思いました。 カトさん、澤口@一升金さん、ありがとうございました(^^ 力卜 [2003/10/22 Wed 22:53:18] [192.51.44.40] To: Rastivさん。 こちらの過去ログ「Message Log 24」の「[2000/07/18 Tue 12:35:25] [192.51.44.19]」 に、3.5"FD 2DDの場合のトラック上のアドレスフィールド、データ領域などのフォーマット 形式について書いてあります(「もっといろいろな情報がくっついています。」の次の部分)。 このうち、アドレスフィールドは「IDAM + IDaddress + CRC」となります。 また、データ領域は「DAM + Data + CRC」となります。 アドレスフィールドに続いてデータ領域が並ぶのが、セクタ数ぶんだけ繰り返されます。 FDには、セクタのDAM(data address mark)上に、不良セクタか否かを示す DDM(deleted data mark)かDM(data mark)かの情報を持つ箇所があります。 FDCのセクタ書き込みコマンドに、セクタをDMとして書くものと、セクタをDDMとして 書くものがあったような気がしますが、現在DDMと言うものは使われていません。 FATでは代わりにFATエントリの不良クラスタ値を使っています。 IPLセクタでFAT上のファイルを読んで実行するサンプル(ただしFM-TOWNS用)なら、以下にあります。よかったら参考にしてください。 http://www2.wbs.ne.jp/~katou/towns/fdip0010.lzh Rastiv [2003/10/22 Wed 04:03:45] [218.47.250.38] ラスティブです。 夜分に失礼します。 憶測によって、少し進展がありました。 フロッピーディスクのトラックのフォーマットについてです。 アドレスフィールドというのは、それぞれのトラックの先頭に 記録されるもので、ディスクコントローラーはその情報を もとにしてトラック上のセクターを探すというわけですね? トラックは、アドレスフィールド、データ領域、というふうな 順で構成されているのですね? あ、っと、その、下の質問は、ハードディスクの シリンダーフォーマットに関することのようでした(汗 夜分に、失礼しました。 Rastiv [2003/10/22 Wed 00:39:25] [218.47.250.70] ラスティブです。 え?下の変な投稿は何かって?(笑 ヘマしました。ごめんなさい(^^;。 えっと。 事情を話しますと、趣味の一環として自分で何かを作ろうと 思いまして、そこでOSに興味があったので、お恥ずかしい 事ながら、覚悟を決めてちっさなものを作ろうとしています。 そこで、まずはブートからと思って・・・・・ 第1セクターに格納するブートコードを作っていて 容量オーバー(号泣)・・・それはいいとして、次は、 自分が作るであろうなんちゃってファイルシステムを 実際にディスク上に構築せねば始まらないと思い、 フォーマットのやり方を模索するや否や、 Int 0x13/AH=0x05 の意味不明な解説に倒れ・・・、そして、今度はフォーマットを 後回しにしようと決めて、ファイルシステムのことを 考える内に、そのいう仮想ファイルシステムの構造を 知りたい衝動に駆られたんです。 セクターのことをお聞きしたかった理由は、今作ってる なんちゃってファイルシステムは、フロッピーディスクと ハードディスクだけにしか通用しないのかと、えらそうな事を 考えていたからです。CDの物理的構造が違ってたら、 フロッピーやハードディスクで通用することが、そうでなく なると思ったからです。 CDにはCD専用のファイルシステムがあるとは聞いてましたが、 アクセス方法が分からない上、どんな媒体であるかさえ 分からない状況でした。 で、物理セクターと論理セクターの話を聞いて、その辺が スッキリしたということなんです。 そこで、話が変わるので、大変申し訳なく感じるのですが、 前にも質問して、分からないままだった Int 0x13/AH=0x05 のことなんです。 どこが分からないかというと・・・ テクニカルリファレンス(DOSV6.2)の中で、 セットする値として (ES:BX)バッファー・アドレス というのがあります。その下に解説として、 512バイト・バッファーを指定します。 最初の2×(シリンダー当たりのセクター数)バイトには、 セクター毎のFとNが含まれます。 F = 00H 良セクター = 80H 不良セクター N セクター番号 と書いてあります。 書いてることの意味はたぶん理解できるんですが、 わからないのは、良セクターと不良セクターは誰が 決めるのかということです。 根本的に分かってないようなので、 どなたか、よろしければよろしくお願いします(ペコリ)。 Rastv [2003/10/21 Tue 23:27:30] [218.47.250.70] 力卜 [2003/10/20 Mon 21:29:51] [192.51.44.43] To: Rastivさん。 DOSでCD-ROMドライバとMSCDEXを使うことによって、普通のHDD/FDD上のファイルと同じようにCD-ROMメディア上のファイルにアクセスできますが、「DOSではCD-ROM上のISO9660ファイルシステムを一旦内部的にFATとして解釈しなおしてアクセスしているか」への答えは No です。 DOSでは、DOS3.1からサポートされたネットワークリダイレクタという機能を使ってCD-ROMにアクセスしています。 最近某所から入手した「DOS Undocumented」という古い書籍によると、ネットワークリダイレクタを使えば、DOS上にFAT以外のファイルシステムを持ち込むことができるとありました。 ちなみにWindows2000から、CD-ROMドライブにint 25hを発行したら、「unknown command given to driver (03h)」が発生しました。pureなDOSが今手元にないのでどうなるかは確認できませんが。 ところで論理セクタと物理セクタについて、ちょっと書きます。 SCSI-HDDは、論理セクタ指定でアクセスするのが普通で(PC-9801は違うのかな?)、(ディスクBIOS上はさておき) SCSIコマンド上はLBAでアクセスしていると思います。(話が古いですが、FMR/FM-TOWNSはそうしています) EIDEとかではない昔のIDE + BIOSでは、ディスクBIOSから与えられたCHS値をそのまま物理セクタに使っていたかも知れません。 FDへのアクセスは、昔も今も物理セクタ指定で行っていると思います。FDCチップへの命令に、トラック番号/サイド番号/セクタ番号なんかが出現しますし。USB-FDDドライブへの命令がどうなっているかは知りませんが、昔とあまり変わらないのではないでしょうか(ちょっと不安)。 近頃(?)はディスクBIOSへもLBAでアクセスできるようですし、今日では物理セクタを意識するのはFDぐらいかと思いますが。 澤口@一升金 [2003/10/19 Sun 20:57:31] [221.184.145.225] 澤口@一升金です。 to Rastiv さん: BIOSに入っているのはファイルシステムではありません。 HDDとかFDDのコントローラ管理ルーチンです。 ですから、ファイルシステムに必須のディレクトリ管理とか ファイル名管理とかそういうことはBIOSではできません。 何らかの初期化は必要なので、デフォルトパラメータとして もっとも使用頻度の多そうなDOS相当の初期値ががBPBとして 入っているのです。 かつてのPC9801などは 1024bytes/sector が標準でしたか ら、IBM機とはBPBが全然違っていました。 昔のフロッピーですと、128bytes/sector とか 256bytes/ sector というのもありました。 また、640MB MO は 2048bytes/sector です。 一見直結されているように見えても、コントローラ自体はセ クタという概念はありません。フォーマットはあくまで1トラ ック単位で、その中に埋め込まれたビットパターンでセクタの 開始、終了位置が決まります。 昔はトラックフォーマット中にコントローラをリセットして、 1トラックの中にセクタ長の異なるセクタを混在させるという プロテクト用の荒技がありました。 1024bytes/sector の場合、例えば論理番号0と1の論理セク タは物理セクタ0 の前半部と後半部にそれぞれ対応していると ということになります。 また、256bytes/sectorの物理セクタを持つデバイスの場合は 論理セクタの0が指定されれば、物理セクタの 0,1 を読んでく ることになります。 (実際にはFATは論理セクタをいくつか集めたクラスタという単 位でアドレスを指定するのですが) Rastiv [2003/10/19 Sun 15:53:29] [218.47.249.7] ラスティブです。 ふむふむ・・・・(レス読解中)。 たしかに、僕はセクターというモノをどう捉えればよいか 分からなかった面があります。論理セクターと物理セクターの ご説明を承って、なんか輪郭が見えてきました。 ご回答を、ありがとうございます。m(__)m 内心、セクター以外の概念でデータ管理している装置には、 FATファイルシステムを適応できないんじゃ、などと考えて いました(汗。また、FATファイルシステムのBIOS パラメタ・ブロックで 扱われている内容に、ハードディスクやフロッピーディスクの 物理的構造に直結するようなものも含まれていることから、この ファイルシステムは、専業なのかな、とも。 でもお話によれば、 「FATファイルシステムは要するに1論理アドレスに対して 1論理ブロックのデータの読み書きができれば成立するので、 物理的にどのように格納されているかは基本的に関係在りません。」 とのことでした。 考えてみると、計算によってシリンダーやヘッド等を持たない ディスクドライブも、仮想的にそれらしく見せかけることは 出来ないことはなさそうだ、と判明。 また、デジタルデータを管理する装置で、セクター、というか ブロック区切りがないものは存在しない、と聞き(?)、 胸をなでおろしました。理由は、読み取り開始ポイントと読み 取り終了ポイントが不明になるから、とか。 納得です。 ただ、ここでいう論理と物理の言葉の違いに、頭を悩まされ ます。これまた、ある意味ではどうでもいい話ですが(^^; 「通販で品物を買うときに、『A-12345の商品をください』と 言えば済むのと同じで、ユーザーはそれがどこの倉庫のどこの 棚にあるか知っている必要はないのです。」 この例えから考えるに、論理セクターというのは、装置側で 物理セクターを元に生成されるものなのなのですね。たぶん。 ・・・どなたかフォローを願いします(ペコリ)。 澤口@一升金 [2003/10/18 Sat 11:08:21] [221.184.145.225] 澤口@一升金です。 to Rastivさん: Rastivさんは物理セクタと論理セクタを混同されているのではあり ませんか? FATファイルシステムは要するに1論理アドレスに対して1論理ブロ ックのデータの読み書きができれば成立するので、物理的にどのよう に格納されているかは基本的に関係在りません。 RAMディスクなどは1byte単位で読み書きできますが、FATにみせか けることはドライバでできます。CD-ROMも同じ。 極端な話、ドライバが巨大なバッファを持って、CD-ROMを丸ごと読み 込んで、あとはOSから要求があるたびに1セクタ長のデータをバッフ ァから返すようにすればCD-ROMはランダムアクセスできるFATドライ ブに見えますね。 セクタ、というか、ブロッ区切りを持たないドライブというのはアク セス方法がありません。(どこがデータヘッドかデータエンドかわか らなければ、読み取り開始も読み取り終了できない) 従って、セクタを持たないデジタル記録装置という考え方は成立しよ うがないでしょう。 強いて言えば、磁気テープではそれができますが、それでも機械的に ヘッドとエンドは決まっているので、ものすごく長い単一セクタと解 釈できます。 ですから、仮想ファイルシステムは何もかもわかっている必要はあり ません。論理セクタ長だけわかっていれば、あとは論理アドレスを指 定してドライバなりBIOSなりに読み書き要求を出すだけです。 物理的にどこから持ってくるかを知っている必要はないのです。 通販で品物を買うときに、「A-12345の商品をください」と言えば済 むのと同じで、ユーザーはそれがどこの倉庫のどこの棚にあるか知っ ている必要はないのです。 Rastiv [2003/10/18 Sat 10:14:49] [220.108.164.241] 訂正です(汗 誤) 今でも 512bytes/sector のディスクドライブにFATが使われて いるのかな、などなど、いろいろ思い巡らせていたことです。 正) 今でも 512bytes/sector のディスクドライブ以外にFATが使われて いるのかな、などなど、いろいろ思い巡らせていたところです。 Rastiv [2003/10/18 Sat 10:09:44] [220.108.164.241] Rastivです。 あの、質問らしい質問ではないかもしれないのですが・・・、 確認ということでお聞きしたいことがありまして参上しました^^; FATファイルシステムの対象となるディスクドライブというのは、 まさか、CD-ROMドライブまでもがそうである、なんていうことは 無いですよね(汗 うん、ないない。ですよね? また、こちらは質問ということになるんですが、 FATファイルシステムは、セクター単位のアクセスを基本に してるようなんですが、セクター単位で構成されるディスクドライブのほかには、 どんな種類のディスクドライブがあるんですか? って、人に聞くようなことでもなさそうですが(滝汗 質問の動機は、仮想ファイルシステムの仕組みを知りたいと 思ったこと(?)です。 あれって、あらゆるディスクドライブの物理的構造が 分かってないと、出来ないことじゃないかと思いまして。 あと、FATファイルシステムと関連するBPBの要素の中に セクターサイズの値を入れるところがあって、そのことから 今でも 512bytes/sector のディスクドライブにFATが使われて いるのかな、などなど、いろいろ思い巡らせていたことです。 どなたか、よろしくお願いします(ペコリ) Pacmon [2003/10/12 Sun 09:34:30] [218.142.56.1] 澤口@一升金さん。 はい。すみません。よく考えればできるものでした・・・。 質問ばかりしていてはよくないですね。。 澤口@一升金 [2003/10/12 Sun 02:32:11] [221.184.157.31] 澤口@一升金です。 to Pacmon さん: ぐりぽんさんがせっかく ror 命令を教えてくれたのですから、 それに沿って、 ror ah,4 or al,ah mov bl,al を思いつけませんか? ror は shl の方がこの場合素直ですが。 Pacmon [2003/10/11 Sat 20:56:23] [218.142.56.1] 何度も何度もすみません。 また質問です。一気に書き込みたいのですが、なかなかまとまらなくて。 さっきと同じような質問なんですが、AHとALの下位4bitをBLの上位4bitと下位4bitに分けて代入したい。 AH = 00001010b AL = 00001111b から BL = 10101111b と代入。 よろしくお願いします。 Pacmon [2003/10/11 Sat 19:59:24] [218.142.56.1] ぐりぽんさん、レスありがとうございます。 シフト命令のことを忘れていました。。 今までいちいちand命令をループさせて1bitづつ処理していました・・・。 ぐりぽん [2003/10/11 Sat 17:33:28] [210.249.5.140] >Pacmonさん いま考えられる答えは ror al,4 mov bl,al これぐらいしか思いつきませんでした。他にいい方法あるのかな? Pacmon [2003/10/11 Sat 12:08:48] [218.142.56.1] こんにちは。 また質問させていただきます。 すぐに解決できそうな問題なのですが、シンプルにやる方法がわからないので・・・。 ALの値の下位4bitと上位4bitそれぞれを、BLの上位4bit、下位4bitと、ALの4bitづつを反対にしてBLに代入したいんです。 AL = 00101101bの状態から BL = 11010010bにしたい 説明がわかりにくいかもしれませんが、よろしくお願いします。 まつもと [2003/10/09 Thu 02:04:28] [61.203.92.78] 澤口@一升金さん 早々と返事ありがとうございます まさに探していたものずばりでした。 澤口@一升金 [2003/10/08 Wed 23:45:01] [220.111.170.217] 澤口@一升金です。 to 松本さん ここに解説がありました。 ↓ http://debs.future.easyspace.com/Programming/Hardware/FDC/floppy.html fat12/16/32 の解説はここにあります。 ↓ http://www.microsoft.com/hwdev/download/hardware/fatgen103.pdf まつもと [2003/10/08 Wed 21:48:54] [61.203.92.78] 皆さんはじめまして 松本といいます FD直接アクセスがしたくて、周辺のコントローラの資料を 探しているのですが、自分では結構探したつもりだった のですがいまいち集まりません。 なぜか手元には、古本がたまっていくのですが・・ 最近アセンブラを始めたのでよく分からないのですが、 この手の資料って最近は出ていないのでしょうか? bon [2003/10/06 Mon 02:02:19] [218.222.84.177] しろさん、回答有り難う御座います。 早速やってみたところ、問題無く、展開できました。 う〜ん、マクロをかますかぁ。。。言われてみれば、確かにマニュアルには、そのように書かれていますね。僕はどうも読解力が足らないようです。(^^; ------------------------------------------ 話は、変わって、、最近、昔のソースをいじってるんですが、当時から直そうと思っていた個所が無事脱稿いたしました。 玄人向きのグーに小物ツールです。。。。ほんとか? http://www.h2.dion.ne.jp/~object/Dos_Asm/xpecho05.cab しろ [2003/10/05 Sun 22:59:42] [221.188.38.253] bonさん、はじめまして >定義済みシンボルに @FileName がありますが、これを以下のように使用できない >のでしょうか? マクロを使えば何とかなります。(MASM 6.11dで確認済み) _DB macro v db '&v' endm _DB %@FileName db '(c)...',0Dh,0Ah 「%」はマクロにパラメータを渡す前に式を評価する演算子 「&」は文字列中でもマクロパラメータを展開するための記号 だったと思うのですが、すでに半分忘れかけています。 もっとシンプルな方法があるかも知れません。 Pacmon [2003/10/04 Sat 08:33:04] [218.142.56.1] カトさん、ぐりぽんさん、本当にありがとうございました。 なるほど。本当に勉強になりました。 これからもちょくちょく顔を出すかもしれませんが、よろしくお願いします。 ぐりぽん [2003/10/03 Fri 22:13:57] [210.249.5.4] >Pacmonさん はじめまして。私が回答していいものか悩みましたが書きます。 プロテクトモード移行後、グローバルディスクリプタの0x0010の ベースアドレスをとりあえず0にして、セグメントレジスタに 渡しておきます。 mov ax,0x0010 mov ds,ax mov es,ax mov ss,ax mov esp,0x00060000 あとは普通にmovとかも、こんな風に使えるのではないかと。 mov eax,dword [point] mov esi,0x000a0000 参考となるコードなら自作OS界隈に落ちてそうですがねえ(^^; 健闘を祈ります。 力卜 [2003/10/03 Fri 21:42:24] [192.51.44.40] Pacmonさん、こんばんは。 flat real modeは、プロテクトモードに入ってオフセットリミットを解除したら(それを解除したまま)一瞬のうちにリアルモードに戻るものです。以下が使用例です(検証してませんので、バグがあるかも)。 本当のプロテクトモードを使いたいのなら、ちょっとやり方として外れているとは思います。でも本物のプロテクトモードを使いたいのなら、「はじめて読む486」でも買ってひととおり読む必要があると思います。 32ビットアドレッシングの書き方についてはご自分で調べてください。 ; ; align 8 dw 0x0000 ; パディング LGDTR: GDTLAST dw GDTEND - GDT - 1 ;「GDT」内の終端のオフセット値(16bit) GDTFLAT dd GDT ;「GDT」の先頭へのオフセット値(32bit) GDT db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; GDTエントリ 0x0000 db 0xFF,0xFF,0x00,0x00,0x00,0x92,0x8F,0x00 ; GDTエントリ 0x0008 ;; db 0xFF,0xFF,0x00,0x00,0x00,0x92,0x00,0x00 ; GDTエントリ 0x0010 GDTEND: ; ; ENTRY: xor ecx,ecx ; ECXの上位16ビットをクリア mov cx,cs mov ds,cx ; DS = CS shl ecx,4 ;; [GDTFLAT] に「GDT」のリニアアドレスを代入 add [GDTFLAT],ecx ;; [GDTFLAT] = [GDTFLAT] + (DWORD)(CS) * 16; cli ; 割り込み禁止 lgdt [LGDTR] ; GDTRレジスタを更新 push ds ; 各セグメントレジスタ値を退避 push es push fs push gs mov eax,cr0 ;; or al,0x01 ;; プロテクトモードに移行 mov cr0,eax ;; jmp short $+2 ; 命令キャッシュをクリア mov bx,0x0008 ; GDTエントリ #8 mov ds,bx ; DSのオフセットリミットを変更 mov es,bx ; ES 〃 mov fs,bx ; FS 〃 mov gs,bx ; GS 〃 and al,0xFE ;; mov cr0,eax ;; すぐにリアルモードに復帰!! jmp short $+2 ; 命令キャッシュをクリア pop gs ; 各セグメントレジスタ値を復元 pop fs pop es pop ds sti ; 割り込み許可 ;; メモリアクセス例 xor cx,cx mov es,cx ; ES=0 mov ecx,0x00FFFFFF ; ECX=0x00FFFFFF mov [es:ecx],dx ; [(DWORD)ES * 16) + ECX] = DX Pacmon [2003/10/03 Fri 20:20:41] [218.142.56.1] 何度もすみません。 どなたかプロテクトモードに移行した後の、メモリアドレスの指定方法をお教えいただけないでしょうか。 移行した後にmovなどが使えるのかもわかりません。 もしよろしければ、サンプルコードなどを書いていただけるとありがたいんですが。。。 Pacmon [2003/10/03 Fri 19:03:39] [218.142.56.1] bonさん、こんにちは。 ええと、ディスクのIPLからコーディングしています。ブートプログラムは既に作れたので、あとはプロテクトモードに移行した後、実際のプログラムを実行したいんです(ブートプログラムのみ16bitなのでディスクBIOSを使用しています)。 ハードウェアの資料等も大体集まっているので、ディスクの割り込みなども大丈夫です。 環境ですけどMASM中心に、時にはNASMも。使い分けてます。 VMWareでテストしています。実際にPCで実行することも。 bon [2003/10/03 Fri 18:25:58] [218.222.187.26] MASM6の @FileNameの展開に関して質問です。 定義済みシンボルに @FileName がありますが、これを以下のように使用できないのでょうか? ;ソースファイル名 = BobTool.asm strInfo db @FileName , ' (c)bon 2003-10-3',0dh,0ah ↑をアセンブルすると以下のエラーがでます。 undefined symbol : BONTOOL あれこれやってみましたが、展開できません。 bon [2003/10/03 Fri 15:52:21] [218.222.187.26] こんにちは、Pacmonさん Pacmonさんは、OS起動前にプロテクト・コード走らせるんですよね。 そしたら、そのコードは何処に置かれるのですか? ディスクのIPLからコーディングする事になるのでしょうか? OSの無い状態でプロテクト・モードとなると、BIOSは16bitリアルモードなので使えないですよね、そしたらDISK関係の割り込み処理はもちろん、その他諸々のハード割り込みも自前で用意する事になるのでしょうか? どんな環境でプロテクト・コードのテスト(デバック)されているのか興味あります。 宜しかったら、開発環境の概略をかいつまんで教え願えないでしょうか? Yuki [2003/10/03 Fri 03:09:52] [203.141.210.165] はじめまして。ハッカー(とうぶん見習い)のYukiです ここのページは皆さん技術力が高いので長い間お世話になると思います ヨロシク。 で、本題なのですが WinXP上で、SegmentDiscriptorやPageテーブルを参照したいのです 論理アドレスからリニアアドレス、物理アドレスへと 変換したり 逆も。 GDTレジスタをストアしたんですが、 ここに書かれてるGDTテーブルのアドレスがリニアっぽい リニアアドレスでメモリにアクセスする方法がわからないです なにぶん初心者なもんでお願いします。 Pacmon [2003/10/02 Thu 21:51:21] [218.142.56.1] カトさんへ。 プロテクトモードに移るためのNASMのコードあるんですよね? 例としてFFFFFFhにDXの内容を書き込むコードを書いていただけないでしょうか。 よろしくお願いします。 何度もすみません。 bon [2003/10/02 Thu 21:44:49] [218.222.186.52] X.P.R.さん、こんにちわー 最近レス癖が付きそうになってます(^^; T-VRAMってのは、NECのPC98x1の事ですよね? DosVにはGVRAMしかなかったですよね。 PC98x1なら少し答えられます。。。(それしか知らんのですが) 以下サンプル(スペースは全て全角なので変換しないとアセンブルできないです) ---[TOP]----------------- ;--- アトリビュート定数 ---- ; GRB BlackAttrib = 00000001b ;黒 BlueAttrib = 00100001b ;青 RedAttrib = 01000001b ;赤 PurplAttrib = 01100001b ;紫 GreenAttrib = 10000001b ;緑 LiBlueAttrib = 10100001b ;水 YellowAttrib = 11000001b ;黄 WhiteAttrib = 11100001b ;白 code segment assume cs:code,ds:code,es:code,ss:code org 100h start: mov ax,0a000h mov es,ax mov ax,'ロ' mov cx,80 mov di,160*1 ;二行目 mov bx,01000001b ;赤 l2: mov es:[di+2000h],bx stosw loop l2 mov cx,80 mov di,160*5 ;六行目 or bx,100b ;Revase l6: mov es:[di+2000h],bx stosw loop l6B mov ax,4c00h int 21h code ends end start ---[END]----------------- Pacmon [2003/10/02 Thu 20:35:24] [218.142.56.1] おお! カトさん、bonさんすばやいレスありがとうございます。 こんなに早くレスしてもらえるとは思ってもいませんでした。 ええと、OS未起動状態の時です。説明が悪かったかもしれません。。FLAT REAL MODEですか。調べてみます。 本当に先は長いと思いますが、がんばってみます。 これからもよろしくおねがいします。 bon [2003/10/02 Thu 12:23:30] [218.222.187.229] おっおー、カトさんから、一足先に、的を射た回答があがってますね。。。。お〜ぉ、はずかしぃぃ(^^; bon [2003/10/02 Thu 12:19:09] [218.222.187.229] こんにちは、Pacmonさん またまたレスしてしまいます。 尚、今回は回答ではありません。何故ならば、私は、16bitモードでプロテクト領域にアクセスしたことありませんので。。。(^^; という事で、以下は、私が過去に見聞きした情報からの眉唾的回想録です。 ----------------------------------------------- まず、1200:6400等のアクセスできる状態、つまり16bitモードからは、プロテクト領域にアクセスできる手立てはありません。CPUの構造上いたしかたないのです。16bitモードではFFFF:FFFF以上のアドレス線がないのですから。 が、WINDOWSのDOS窓では、プロテクト領域で動作するソフト(Windows自身)が、アクセス手段を設ければ、できる理屈になります。DOS窓自体もプロテクト上の1タスクだからです。 で、そのアクセス手段つーのが、XMSファンクションとして用意されています。自分はこれを使ったことがありません。何故ならば、自分の知っているXMSファンクションでは、プロテクトメモリ(EMB)と1M以下の間のメモリ転送しかないからです。これでは、EMBが使用の度にメモリ転送が発生、オーバーヘッドが馬鹿になりません。メモリ転送するくらいならば、EMBを利用したEMSの方がずっとスマートです。EMSのページ切り替えもCPUのページング使えば一瞬ですし、EMS自体が1M以下なので、コードの16bit<->32bit切り替えなんてのも不要です。 プロテクト領域を真に使いこなすのであれば、V86からの利用でなく、プロテクト領域で動作する32bitコードを書かれるのを推奨します。 ----------------------------------------------- とか、なんとか偉そうに書いてみましたが、多分違っている気がします。 諸先輩方、添削をお願いします。 力卜 [2003/10/02 Thu 12:11:42] [192.51.44.46] Pacmonさん、こんにちは。 Windowsアプリからではなく、x86の16ビットのプログラムから1MB以上のメモリを使用したいのですね。それにはCPUのプロテクトモードを使用して実現する必要があります。 ターゲットとなる環境によって実現方法が違うのですが、環境は何でしょうか? マシンのboot/IPL後(OS未起動状態/リアルモード)? pureなDOS(リアルモード)? EMM386仕込み(v86モード)のDOS? Windowsのコマンドライン(v86モード)? 前者2つは、自分でGDTの設定、プロテクトモードへの移行をしてから32ビットアドレス指定でメモリアクセスする必要があります。プロテクトモードに一瞬だけ移行する簡単な方法には「flat real mode」というのがあります。webで検索してみてください。 後者2つは、VCPIやDPMIなど、DOSエクステンダの機能を使ってv86モードからプロテクトモードに移行してメモリアクセスすることができると思います。こっちは私は使ったことがありません。 CPUのプロテクトモード自体についてはASCIIから出ている「はじめて読む486」を読んでみるのがよいと思います。 DOSエクステンダ+プロテクトモードについては、入手が困難でしょうがそれが載っている書籍(以下など)をあたってみるのがよいと思います。 「実践的プロテクト・モード研究―286/386CPUからDOSエクステンダそしてプログラミング技術」IFセレクション flat real modeは、利用範囲が限られますが、あまり考えなくても使えるのがよいです。手元にnasmでのsampleソースがあります。 多分、先は長いと思います。大変でしょうが頑張ってください。 X.P.R. [2003/10/01 Wed 21:59:31] [218.142.56.1] はじめましてー。 XPRといいます。早速質問なんですけどー。 T-VRAMに色付き(赤とか)の文字を出力したいんです。 まず、T-VRAMがメモリのどのあたりにあるのかも分かりません。 とんだ初心者ですが、どうかご伝授ください。 Pacmon [2003/10/01 Wed 20:34:49] [218.142.56.1] bonさん。詳しい説明、いろいろな例を挙げていただきありがとうございます。 また質問なんですが・・・。 セグメント・オフセットの形でメモリのアドレスを示すと、[FFFF:FFFF]が最高になりますよね?でも、これだと1Mbyteのメモリにしかアクセスできません。 100000h以上のメモリにアクセスするにはどうしたらいいんでしょうか・・・。 またまたよろしくお願いします。 bon [2003/10/01 Wed 20:15:43] [218.222.44.181] こんにちは、Pacmonさん 何時までたっても初心者の私がレスするのは、ためらいを感じるのですが、、、 >MASMで[1200:6400]のメモリにAXの値を書き込みたいんです これは、16bitモードのセグメント:オフセット形式ですよね。 とすれば、「MASMで」というよりも、x86のアドレッシングの話になりますね。 コードとしては色々ありますが一例として、 mov ax,1200h mov ds,ax mov si,6400h mov ax,入れたいデータ mov [si],ax 他には、 DataAddress label dowrd DataOFF dw 6400h DataSEG dw 1200h lds si,[DataAddress] mov [si],ax さらに、 les di,[DataAddress] stosw 後、以下も同じアドレスを指すんですよね x86は(^^; DataAddress label dowrd DataOFF dw 6300h DataSEG dw 2200h lds si,[DataAddress] ---------------------- 各命令の詳細はマニュアル見てください。 あっ、MASM特有のアドレッシング表記ってあったのかな?(^^; bon [2003/10/01 Wed 19:41:12] [218.222.44.181] カトさん、やすさん、御返事有り難う御座います。 to カトさん 御提示のURLに、嬉々とアクセスしてみました。 が!、ガ〜ン(TT)。 全ページ英文であります。 中学生レベルの英語力しか無い、しがないアマチュアは、無念の涙を飲みました。 to やすさん 解説有り難う御座います。 やはり、言語はそれ自体の機能内で、やりくりするのが良いのかもしれませんね。 でも解説のおかげで、Vc5(未だにこれです)からの利用方法のとっかかりが出来たような気がします。 私はVc5が初めてのC++なのですが、Vcでの最初のプログラムがALLインラインアセンブラで記述した Short Name to Long Name のコンバーターでした。もちろんクラスもつくりOO指向です。32Bitコード自体も初めてでしたし、とても面白かったです。 (不思議な事にShortName2LongNameのAPIは無いんですね) あと、やすさんのHPのヘルプデータ類は、とても助かります。コーディング時の参照だけにとどまらず、私のような時流がチトずれている人間にとっては、とても新鮮で興味津々なデータです。特に最近のCPU命令などは、「おっすっげ、こんなんあるのかぁ〜」ってな感じで(^_~) ----------------------------- p.s. ちなみに、今、MASMでやってるのは、DOS時代の小物ツールの見なおしです。(笑) 今となっては、全くの無駄な作業ですが、懐古的感情のみで楽しんでます(^^; てっいうか、それ以上のスキルが無いだけの話なのですが。。。 ゴミHPです-> http://www.h2.dion.ne.jp/~object/ 鈴木 正義 [2003/10/01 Wed 12:48:59] [219.126.19.167] : |
e-mail: mist@e-net.or.jp | Structured Anchor Tree Return to Menu Return to Parent Menu |
Powered by Unit Missing Link. |