л не буде знайдений, то запуститься процедура div_f, яка створить робочий файл і запише в нього рядок В«Skencode & Klav_flag fileВ». Надалі в цей файл будуть записуватися скан-коди і байт прапорів клавіатури. Якщо файл вже існує, буде викликана процедура div2_f, яка допише в кінець файлу поточну дату і час. p> Виведемо на екран рядок В«Program installedВ» підтверджує установку програми. Останніми рядками цієї частини ініціалізації викликається функція DOS 31h, яка виконує завершення програми із залишенням в пам'яті зазначеної її частини. Розмір резидентної частини програми (У параграфах) передається DOS в регістрі DX. Розмір резидентної секції визначається різницею зсувів end_res-main, яка дорівнює довжині резидентної частини програми в байтах, додається розмір PSP (l00h) і ще число 15 (Fh) для того, щоб після цілочисельного ділення на 16 результат був заокруглений в більшу сторону.
mov ax, 3100h
mov dx, (end_res-main +10 fh)/16
int 21h
З метою економії пам'яті секція ініціалізації розташовується я кінці програми і відкидається при її завершенні.
Функція 31h, закріпивши за резидентної програмою необхідну для її функціонування пам'ять, передає управління командному процесору і обчислювальна система переходить в початковий стан. Наявність програми, резидентної в пам'яті, ніяк не відбивається на ходу обчислювального процесу, за винятком того, що зменшується обсяг вільної пам'яті. Одночасно в пам'ять може бути завантажено будь-яке число резидентних програм.
Резидентна частина обробника.
Ця секція програми має дві точки входу:
1. Перехоплення переривання int09h (клавіатура). В результаті натискання або відпускання клавіші на клавіатурі запускається процедура new_09h. p> 2. Перехоплення мультиплексорного переривання int2Fh. У результаті перехоплення мультиплексорного переривання запускається процедура new_2fh.
Оброблювач переривання від клавіатури.
Після запуску процедури new_09h збережемо використовувані регістри. Потім отримаємо скан-код останньої натиснутою клавіші. В іншому випадку відновимо регістри і передамо управління наступному по ланцюжку оброблювачу клавіатури (швидше за все це буде BIOS-івський обробник В«int09hВ»).
in al, 60h
cmp al, 80h
ja exit
Потім запишемо цей скан-код у буфер, вважаємо байт прапорів клавіатури з області даних BIOS і також занесемо в буфер.
Наш буфер має об'єм 32 байта, тому після кожного шістнадцятого натискання необхідно зберігати буфер в робочому файлі. Для підрахунку натискань введена змінна-лічильник sch. p> Збільшимо лічильник на 2, потім перевіримо чи повний буфер, порівнявши лічильник з 32. Якщо буфер не повний, збережемо використовувалися регістри і передамо управління наступному по ланцюжку оброблювачу клавіатури. Якщо буфер забитий, передамо управління процедурі fil. p> Ця процедура відкриє наш ро...