Во-первых, мне не нравится вот это:
Inline($9C);
OldKey;
У тебя начала IRET, потом старый обработчик. Не находишь, что это нелогично? И если мне не изменяет память, 9С - это RET, а не IRET. По-моему, должна быть разница.
Во-вторых, как сказано выше, DosBox - такой себе эмулятор, и ХЗ, позволяет ли он нормально работать с портами. Используй настоящую виртуальную машину.
Иван КПрофи (676)
4 месяца назад
Я часов 40 потратил на поиск ошибки, её просто нет.
Посоветуйте пожалуйста что-то вроде VirtualBox в количестве двух штук. В VirtualBox звук вообще не выводится, драйвер нужный стоит, звук включен, там всё необходимое есть.
Всё это время пытался добиться результата в DOSBox`е. С контроллером мундохался, без delay запускал, прерывания разрешал и запрещал для одной строки, пробовал вместо процедуры указатель использовать, чисто ассемблерный код запускал, игрался с инлайнами.
Короче, надеюсь просто дело в DOSBox`е.
Иван КПрофи (676)
4 месяца назад
Короче установил полную борландовскую версию паскаля (7.01), там есть возможность компиляции в защищённом режиме. Скомпилировал программку эту и запустил экзешник, всё работает (DOSBox справился со всем этим).
Если кто-то это читает и вам надо использовать SetIntVec, то скорее всего надо компилировать в защищённом режиме.
Подскажите пожалуйста, что не так?
Может быть в начале программы надо прописывать что-то, связанное со значениями флагов (на ассемблере немного писал).
Не понимаю как воспринимаются компилятором строчки кода в фигурных скобках (получается фигурные скобки не всегда означают комментарии).
Буду рад уже просто литературе какой-нибудь (не могу найти), где про прерывания и резидентные программы с потоками всё расписано для чайников.
Программа должна обрабатывать прерывание клавиатуры и каждое нажатие на клавишу сопровождать звуком. После нажатия на клавишу ESC программа начинает дополнительно выводить коды нажатых клавиш, причём код нажатия и код отжатия различаются на 128 и выводятся в одной строке. Коды следующей нажатой клавиши – на следующей строке и т.д. Для того чтобы проверить, является ли очередное прерывание клавиатуры сигналом отпускания клавиши, используется дополнительная переменная c1, в которую сохраняется предыдущее значение, считанное с порта клавиатуры. Если они различаются на 128 – клавиша отпущена.
Перед процедурой – обработчиком прерывания включается режим “дальней модели”, после него он выключается. В конце нового обработчика вызывается стандартный обработчик, который предварительно был сохранён под именем OldKey.