неактивний)
mov active, AL
: AX ES
iret
; обробник мультиплексного переривання 2FhFHandler: AX, 0CDBAh; порівняти з магічним значеніемnextRetryAL, 0FFh; збігається - занести в AL сигнал 0FFh; і відразу повернення з переривання
: CS: old2F; перейти на збережений обробник
; процедура зсуву палаючої лампочки на 1
; код лампочки в light_light proc nearAL, lightAL, 1; shift to right AL, 70h; виділяємо біти лампочок - 01110000bnot_shifted; якщо якась лампочка горить - перехід
mov AL, 40h; інакше встановити 01000000b-CapsLock On
_shifted: light, AL_light endp
; процедура установки палаючої лампочки
; код лампочки зберігається в light
set_light proc nearAX, AXES, AXAL, ES: [0417h]
and AL, 8Fh; очищаємо біти лампочок, зберігаємо решта бітиAL, light; ставимо маску горищах лампочок
mov ES: [0417h], AL_light endp
end_resident:; мітка для визначення розміру резидентної частини програми
; ================================================== ==============================
; транзитна частина програми
:
; 1. перевірка встановленої програми
AX, 0CDBAh; магічне значеніе2Fh; виклик мультиплексного прериваніяAL, 0FFhinstalled; вже встановлена ??- на вихід
; 2. установка програми:
; перехоплення вектора 09h
AX, 3509h; отримання адреси старого обробника
Додаток Г
(обов'язковий) 21hword ptr old09, BX; збереження зміщення обработчікаword ptr old09 + 2, ES; збереження сегмента обработчікаAX, 2509h; установка адреси нашого обработчікаDX, offset int09Handler; вказівку зміщення нашого обработчіка21h
; перехоплення вектора 2Fh
AX, 352Fh; отримання адреси старого обработчіка21hword ptr old2F, BX; збереження зміщення обработчікаword ptr old2F + 2, ES; збереження сегмента обработчікаAX, 252Fh; установка адреси нашого обработчікаDX, offset int2FHandler; вказівку зміщення нашого обробника
int 21h
; включити лампочку NumLock
set_light
mov AH, 09h; вивід на екран успішного повідомлення
mov DX, offset DoneResident
int 21h
; установка резидентом
AX, 3100h; функція DOS завершення резидентної программиDX, (end_resident - start + 10Fh)/16; визначення розміру резидентної частини програми в параграфах21h
: AH, 09h; вивід на екран лайливого повідомлення
mov DX, offset JustInstalledMsg21h
mov AX, 4C01h; завершити нерезідентно21h
JustInstalledMsg db Programma uzhe ustanovlena! raquo ;, 13, 10, $ db Programma ostalas rezidentno. raquo ;, 13, 10, $
code ends; кінець кодового сегментаstart; кінець програми
Додаток Д
(обов'язковий)