0

まず、ビンテージ コンピューター グループのプログラムを作成します。私が書いているのは特に MS-DOS 向けであり、Windows 向けではありません。私の現在のプログラムは、8086 ラインではなく、より新しいシステム用のものであるため、IRQ 8 を使用する予定でした。これにより、割り込みレートを 2/秒から 8192/秒 (2、4、8、16、等...)

何らかの理由で、新しい古いシステムでのみ (奇妙に聞こえますが)、動作していないようです。エミュレーションと私がアクセスできる 386 システムでは問題なく動作しますが、私が所有する P3 システム (GA-6BXC MB w/P3 800 CPU) では動作しません。

コード

割り込みの設定

disable();
oldrtc = getvect(0x70);    //Reads the vector for IRQ 8
settvect(0x70,countdown);  //Sets the vector for

outportb(0x70,0x8a);
y = inportb(0x71) & 0xf0;
outportb(0x70,0x8a);
outportb(0x71,y | _MRATE_); //Adjustable value, set for 64 interrupts per second

outportb(0x70,0x8b);
y = inportb(0x71);
outportb(0x70,0x8b);
outportb(0x71,y | 0x40);

enable();

割り込みの最後に

outportb(0x70,0x0c);
inportb(0x71);        //Reading the C register resets the interrupt
outportb(0xa0,0x20);  //Resets the PIC (turns interrupts back on)
outportb(0x20,0x20);  //There are 2 PICs on AT machines and later

プログラムを終了するとき

disable();

outportb(0x70,0x8b);
y = inportb(0x71);
outportb(0x70,0x8b);
outportb(0x71,y & 0xbf);
setvect(0x70,oldrtc);

enable();

コードに問題の原因となるものは何もありません。しかし、それは意味がないようです。私はその情報を完全に信頼しているわけではありませんが、MSD は IRQ 8 を RTC カウンターとして「報告」し、それが存在し、正常に動作していると述べています。後のシステムがベクトルを移動した可能性はありますか? IRQ 8 はベクトル 0x70 であることがわかりますが、私の Pentium III システムでは割り込みがトリガーされません。ベクトルが変更されたかどうかを確認する方法はありますか?

4

1 に答える 1

1

MS-DOS コードを実行してから長い時間が経ちましたが、この特定の割り込みを使用したことはないと思います (メモリの場所を読み取って時間を取得することもでき、IRQ0 を使用することもできます)。間隔であなたをトリガーするためにも使用されるので、多分その方が良い.

http://wiki.osdev.org/Real_Time_Clockそのページの下部には、一部のマシンでも問題が発生したという人がいます。RBIL は、BIOS の問題である可能性があることを示唆しています: http://www.ctyme.com/intr/rb-7797.htm

DOS がなければ、IRQ0 自体をキャプチャして、それらすべてを自分の割り込み番号に再マップし、必要に応じてタイミングを変更します。最近ちょっとやりました!DOS ではそれは悪い考えだと思います

とにかく、私はそれがBIOSのことと関係があるに違いない:

「メモ: 多くの BIOS は、イベント待ちでない限り、INT 70h ハンドラーで定期的な割り込みをオフにします (INT 15/AH=83h、INT 15/AH=86h を参照してください)。I/O ポートにビット 0 を設定することでマスクできます。 A1h "

于 2014-11-25T04:36:20.417 に答える