Сначала я программирую для винтажных компьютерных групп. То, что я пишу, предназначено специально для MS-DOS, а не для Windows, потому что это то, что люди используют. Моя текущая программа предназначена для более поздних систем, а не для линейки 8086, поэтому планировалось использовать IRQ 8. Это позволяет мне устанавливать частоту прерываний в двоичных значениях от 2/сек до 8192/сек (2, 4, 8, 16, так далее...)
Только по какой-то причине в более новых старых системах (хорошо, это звучит странно) это не работает. В эмуляции и в системе 386, к которой у меня есть доступ, все работает отлично, но в моей системе P3 (GA-6BXC MB с процессором P3 800) это просто не работает.
Код
настройка прерывания
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. Есть ли способ узнать, были ли изменены векторы?