質問 |
||
| 質問者:yasu182 | アセンブラ、ビデオモード al 13h でマウスのポインタを表示 | |
|---|---|---|
困り度:
|
mov ah, 0 mov al, 13h int 10h のモードでマウスのポインタを表示することは可能でしょうか? 以下のコードを書いてみまして、ビデオモードを設定しない場合は Alt + Enter でフルスクリーンにすればポインタが表示されます。 環境は masm32、interrupt のリストはこちらです ↓ http://www.ctyme.com/intr/int.htm ---------------------------------- .model small .stack 100h .data .code start: mov ax, @data mov ds, ax mov ah, 0 ; set video mode mov al, 13h int 10h ; mov ax, 0 ; reset ; int 33h ; mov ax, 20h ; int 33h mov ax, 1 ; show mouse pointer int 33h mov ah, 1 ; wait for key int 21h mov ah, 0 ; restore video mode mov al, 3h int 10h mov ax, 4c00h ; exit int 21h end start |
|
質問投稿日時:08/03/30 18:30 質問番号:3907812 |
||
回答良回答20pt |
|
| 回答者:ralf124c | お待たせしております。 以下のソースはFASSTというヨーロッパ製のアセンブラ処理系用に書き直して確認しました(ご質問のソースと同じものです)。 ------------------------------------------------ここから org $100 mov ax,$0013 int $10 mov ax,$0001 int $33 mov ah,$01 int $21 mov ax,$0003 int $10 mov ah,$4c int $21 -------------------------------------------------ここまで アセンブルでき、実行ファイル(COMファイル)も生成され、英語モード(WinXPならUSコマンド<−>JPコマンド)では実行するとちゃんと大きなカーソルが表示されます。 ただ、日本語モードではINT10の割り込みがフック(呼び出し先のアドレスが書き換えられる)されるているため日本語モードでは動作しないです。 モードの切り替えもプログラムでできたと記憶していますが(CHEVコマンドを逆アセンブルしてLSI-C試食版でその部分を作り直した記憶があります)当時のソースが見当たらず申し訳ありません。 資料の入手に関しては単純に年のせいです。リアルタイムにかかわってきた上に貧乏性で捨てられないためです。 いま、オンラインで手に入る資料としては参考URLの「OADGテクニカル・リファレンス」が一番ではないかと思います。SOFTBANKからも「DOS/Vテクニカルリファレンスマニュアル」(1993)という本がDOS/V時代の終盤に出版されて古本屋でたまに見かけます。 DOSには非公開の機能が多くそれについて書かれたものは上記の本以外で網羅したものは少なくほとんど洋書になってしまい現在入手は不可能かと思います。 あと、Simtelという有名なDOS時代のオンラインソフトサイト(ftp.simtel.net)に当時の蓄積がかなり残ってます(消えたものもあります)。 BIOSやシステムコール、割り込みを制するとDOSが見えてきます。割り込みベクターテーブル、ソフト割り込み、ハード割り込み、タイマ割り込み、なんかの言葉を調べていじってみると面白い発見があるかと思います。 |
|---|---|
| 種類:アドバイス どんな人:経験者 自信:参考意見 |
|
| |
回答日時:08/04/04 11:55 回答番号:No.2 |
|
| 参考URL: | http://www.oadg.or.jp/techref/download.cgi |
| この回答への補足 | あらためて質問を投稿しました いろいろなアドバイスありがとうございました ^^ |
| この回答へのお礼 | 回答ありがとうございます。 英語モードで試してポインタの表示を確認できました。 何時間か調べてみたのですが、こんな落とし穴があったんですね そういえばデバッガの code view を使ってみた時も やはり日本語環境で文字化けしたのを覚えてます。 勉強になりました 参考資料もとても詳しいですね ありがとうございます よろしければもう一つだけお伺いしたいのですが、 x dw 20 のように宣言した後、 x の値、20 を表示するには どうすれば良いのでしょうか? Java で言う System.out.println(x); をしたいのですが... これが出来ると offset x など調べるのに便利だと思いまして。 |
回答 |
|
| 回答者:ralf124c | 懐かしいです。 いまどきBIOSコールを使われる方がいらっしゃるとは驚きです。 いま手元に当時の資料が無いのであとで自宅で調べてみますが、たしかでかいカーソルが表示されたような記憶があります。 ただ、ビデオモードやアセンブラのコードが英語(オリジナル)環境が前提になってますので、DOS/Vだと終了時に元の画面に戻らない気がします。仮想VRAMを事前に取得してうんぬんだったかと・・・。 ちょっと、家の資料をひっくり返して見ますのでお待ちください。 追伸: レジスタを0クリアするときは「MOV」より「XOR」を使うのが定番です。 例: xor al,al ハンドアセンブルしてみるとニーモニック長がぜんぜん違うのがわかると思います。 |
|---|---|
| 種類:アドバイス どんな人:経験者 自信:参考意見 |
|
| |
回答日時:08/04/02 12:30 回答番号:No.1 |
|
| この回答へのお礼 | 回答ありがとうございます プログラミング言語の先祖ってどんなものだろう、と思いまして ^^ オンラインで資料を探してもあまり多くないですね ユーザーが少ないので仕方ないと思いますが。 ralf124c さんはどこで資料を手に入れたのでしょうか? また、Intel のドキュメンテーションを探そうと思ったのですが みつけることが出来ませんでした。 どこかに役に立つものは存在するのでしょうか?? |