; Відновимо вектор 2fh
mov ax, 252fh; Функція установки вектора
lds dx, cs: old_2fh; Заповнимо DS: DX
int 21h
; Отримаємо з PSP адресу власного оточення і вивантажимо його
mov es, cs: 2ch; ES В® оточення
mov ah, 49h; Функція звільнення блоку пам'яті
int 21h
; Вивантажимо тепер саму програму
push cs; Завантажимо в ES вміст CS, тобто сегментна адреса PSP
pop es
mov ah, 49h; Функція звільнення блоку пам'яті
int 21h
; Відновимо використовувалися регістри
pop dx
pop es
pop ds
iret; Повернення в викликала програму
new_2fh endp; Кінець процедури обробки переривання 2Fh
end_res = $; Зсув кінця резидентної частини програми
main endp
tail db 'off'; Очікуваний хвіст команди
flag db 0; Прапор вимоги вивантаження
tabl db '0123456789 '; Таблиця для перекладу BCD коду в ASCII
time db 25 dup (?); Осередок для збереження поточної дати і часу
; Процедура створення файлу
div_f proc
mov ah, 3ch; Функція створення файлу
mov cx, 0; Без атрибутів
lea dx, filename; DS: DX В¬ ASCIIZ імені файлу
int 21h
mov bx, ax; Дескриптор у ВХ
mov ah, 40h; Функція запису в файл
mov cx, buflen; CХ В¬ кількість байт
lea dx, buf; DS: DX В¬ адреса рядка
int 21h
mov ah, 3eh; Функція закриття файлу
int 21h
ret; Вихід з процедури
div_f endp; Кінець процедури створення файлу
; Процедура відкриття файлу і запису в нього поточної дати і часу
div2_f proc
mov [time], 0ah; Запис в змінну time маркерів
mov [time +1], 0dh; переходу на наступний рядок
mov ah, 3dh; Функція відкриття файлу
mov al, 1; для запису
mov dx, offset filename; DS: DX В¬ ASCIIZ імені файлу
int 21h
mov bx, ax; Дескриптор у ВХ
push bx; Збережемо дескриптор
xor cx, cx; відчистити СХ
xor dx, dx; і DX
mov ax, 4202h; Функція установки покажчика в кінець файлу
int 21h
mov ah, 02h; Функція читання часу з В«ПостійнихВ» В«CMOSВ» годин реального часу
int 1ah; Переривання введення - виведення для часу
mov bx, offset tabl; DS: DX В¬ адреса таблиці
mov si, 2; Встановимо зміщення для змінної time
mov ax, cx; Години і хвилини збережемо в AX
mov cx, 12; Встановимо лічильник зсуву
next: push ax; Збережемо AX
shr ax, cl; Зрушимо AX на CL
and al, 0fh; Отримаємо номер осередки в таблиці додавши маску
xlat; Отримаємо ASCII код числа
mov [time + si], al; Занесемо його в змінну time
inc si; Збільшимо на 1 зсув
cmp si, 4; Зсув = 4? p> je ras; Так, перехід на мітку ras
vw: sub cl, 4; Ні, зменшимо CL на 4
pop ax; Відновимо AX <...