dosbox-0.74でコンパイルするためにdjgpp-2を使用して、保護モードでハードウェア割り込みハンドラーをセットアップしようとしています。これが可能な最小のコードです(タイマー割り込み)、私は推測します:
#include <dpmi.h>
#include <go32.h>
#include <stdio.h>
unsigned int counter = 0;
void handler(void) {
++counter;
}
void endHandler(void) {}
int main(void) {
_go32_dpmi_seginfo oldInfo, newInfo;
_go32_dpmi_lock_data(&counter, sizeof(counter));
_go32_dpmi_lock_code(handler, endHandler - handler);
_go32_dpmi_get_protected_mode_interrupt_vector(8, &oldInfo);
newInfo.pm_offset = (int) handler;
newInfo.pm_selector = _go32_my_cs();
_go32_dpmi_allocate_iret_wrapper(&newInfo);
_go32_dpmi_set_protected_mode_interrupt_vector(8, &newInfo);
while (counter < 3) {
printf("%u\n", counter);
}
_go32_dpmi_set_protected_mode_interrupt_vector(8, &oldInfo);
_go32_dpmi_free_iret_wrapper(&newInfo);
return 0;
}
ハンドラーをチェーンしているのではなく、置き換えていることに注意してください。カウンターはそれ以上増加しません1
(したがって、メイン ループを停止することはありません)。これにより、ハンドラーが正しく返されないか、1 回だけ呼び出されると推測されます。一方、チェーンは正常に機能します (ラッパー行を削除して に置き換えますset_protected_mode
) chain_protected_mode
。行がありませんか?