.model tiny .code .386 org 2Ch envseg dw ? org 80h cmd_len db ? ;довжина командного рядка cmd_line db ? ;командний рядок org 100h start: LOCALS JUMPS jmp initialize hw_reset9: retf int09h_handler proc far ;процедура оброник переривання від клавіатури jmp short actual_int09h_handler old_int09h dd ? dw 424Bh db 00h jmp short hw_reset9 db 7 dup (0) actual_int09h_handler: pushf call dword ptr cs:old_int09h pusha push ds push es push 0040h pop ds mov di,word ptr ds:001Ah cmp di,word ptr ds:001Ch je exit_09h_handler ;якщо буфер пустий - стрибок на вихід mov ax,word ptr [di] ;преревірка натиснутої клавіші cmp ah,02h jne proc_two call perevirka ;виклик процедури mov word ptr ds:001Ch,di pusha cli ;виведення повідомлення mov ah,03h int 10h mov ax, cs mov es, ax mov bp, offset msgOne mov cx, 23 mov ax, 1300h mov bl, 00000111b int 10h mov ax, 0200h mov bh, 0 mov dl, 0 inc dh int 10h sti popa jmp exit_09h_handler proc_two: mov ax,word ptr [di] cmp ah,03h jne proc_three call objednannya mov word ptr ds:001Ch,di pusha cli mov ah,03h int 10h mov ax, cs mov es, ax mov bp, offset msgTwo mov cx, 23 mov ax, 1300h mov bl, 00000111b int 10h mov ax, 0200h mov bh, 0 mov dl, 0 inc dh int 10h sti popa jmp exit_09h_handler proc_three: mov ax,word ptr [di] cmp ah,04h jne proc_four call peretyn mov word ptr ds:001Ch,di pusha cli mov ah,03h int 10h mov ax, cs mov es, ax mov bp, offset msgThree mov cx, 25 mov ax, 1300h mov bl, 00000111b int 10h mov ax, 0200h mov bh, 0 mov dl, 0 inc dh int 10h sti popa jmp exit_09h_handler proc_four: mov ax,word ptr [di] cmp ah,05h jne exit_09h_handler call riznucya mov word ptr ds:001Ch,di pusha cli mov ah,03h int 10h mov ax, cs mov es, ax mov bp, offset msgFour mov cx, 27 mov ax, 1300h mov bl, 00000111b int 10h mov ax, 0200h mov bh, 0 mov dl, 0 inc dh int 10h exit_09h_handler: pop es pop ds popa iret ; Дані які використовує процедура k dw 5 m1 db 3,4,5,8 m2 db 2,4,7 M db ? P db ? R db ? per db 0 msgOne db '1',13,10 msgTwo db '2',13,10 msgThree db '3',13,10 msgFour db '3',13,10 YesMessage DB 'element is in set',13,10,'$' NoMessage DB 'element is not in set',13,10,'$' perevirka proc near pusha mov ax,4 mov bh,8 div bh mov bl,al mov bh,0 mov al,m1[bx] mov cl,ah shl al,cl test al,80h jz no yes: mov ah,9 mov dx,OFFSET YesMessage int 21h ret no: mov ah,9 mov dx,OFFSET NoMessage int 21h popa ret perevirka endp objednannya proc near pusha mov cx,3 mov bx,0 mov di,0 ob1: push cx mov cx,4 mov al,m1[bx] mov M[bx],al inc bx loop ob1 pop cx ob2: push cx mov cx,4 ob3: mov al,m2[bx] cmp al,m1[di] jne ob4 mov per,1 ob4: loop ob3 cmp per,1 je ob5 mov al,m2[bx] mov M[bx],al inc bx ob5: pop cx loop ob2 popa ret objednannya endp peretyn proc near pusha mov cx,12 mov bx,0 mov di,0 z1: Z2: mov al,m1[bx] cmp al,m2[di] je z3 inc bx loop z1 inc di mov bx,0 loop z2 z3: mov P[bx],al inc bx cmp cx,0 jne z1 popa ret peretyn endp riznucya proc near pusha mov cx,12 mov bx,0 mov di,0 r1: r2: mov al,m1[bx] cmp al,m2[di] je r3 inc bx loop r1 inc di mov bx,0 loop r2 r3: mov P[bx],al inc bx cmp cx,0 jne r1 popa ret riznucya endp int09h_handler endp hw_reset2D: retf ;Процедура обробник мультиплексорного преривання int2Dh_handler proc far jmp short actual_int2Dh_handler old_int2Dh dd ? dw 424Bh db 00h jmp short hw_reset2D db 7 dup (0) actual_int2Dh_handler: db 80h,0FCh mux_id db ? je its_us jmp dword ptr cs:old_int2Dh its_us: cmp al,06 jae int2D_no cbw mov di,ax shl di,1 jmp word ptr cs:jumptable[di] ;Таблиця стрибків на функції мультиплексорного переривання jumptable dw offset int2D_00,offset int2D_no dw offset int2D_02,offset int2D_no dw offset int2D_04,offset int2D_05 ;Функція преревірки в наявності int2D_00: mov al,0FFh mov cx,0100h push cs pop dx mov di,offset amis_sign iret int2D_no: mov al,00h iret unload_failed: mov al, 01h iret ;Функція вивантаження з памяті int2D_02: cli push 0 pop ds mov ax,cs cmp ax,word ptr ds:[09h*4+2] jne unload_failed cmp ax,word ptr ds:[2Dh*4+2] jne unload_failed push bx push dx mov ax,2509h lds dx,dword ptr cs:old_int09h int 21h mov ax,252Dh lds dx,dword ptr cs:old_int2Dh int 21h mov ah,51h int 21h mov word ptr cs:[16h],bx pop dx pop bx mov word ptr cs:[0Ch],dx mov word ptr cs:[0Ah],bx push cs pop bx mov ah,50h int 21h mov ax,4CFFh int 21h ;отримати список переривань int2D_04: mov dx,cs mov bx,offset amis_hooklist iret ;Отримати список перехоплених клавіш int2D_05: mov al,0FFh mov dx,cs mov bx,offset amis_hotkeys iret int2Dh_handler endp ;сигнатура amis_sign db "Pankiv " db "Course " db "Course Project",0 ;переривання amis_hooklist db 09h dw offset int09h_handler db 2Dh dw offset int2Dh_handler ;Список клавіш amis_hotkeys db 01h db 5 db 02h,03h,04h,05h,06h dw 0 db 1 ;Процедура ініціалізації initialize proc near jmp short initialize_entry_point exit_with_message: mov ah,9 int 21h ret ;Прграма вже завантажена already_loaded: cmp byte ptr unloading,1 je do_unload mov dx,offset already_msg jmp short exit_with_message ;проблеми з завантаженням cant_unload1: mov dx,offset cant_unload1_msg jmp short exit_with_message ;вивантаження з памяті do_unload: inc ah mov al,02h mov dx,cs mov bx,offset exit_point int 2Dh push cs pop ds mov dx,offset cant_unload2_msg jmp short exit_with_message ;вихід з програми exit_point: push cs pop ds mov dx,offset unloaded_msg push 0 jmp short exit_with_message ;Перевірка командного рядка initialize_entry_point: cld cmp byte ptr cmd_line[1],'/' jne not_unload cmp byte ptr cmd_line[2],'u' jne not_unload mov byte ptr unloading,1 not_unload: mov ah,9 mov dx,offset usage int 21h mov ah,-1 more_mux: mov al,00h int 2Dh cmp al,00h jne not_free mov byte ptr mux_id,ah jmp short next_mux not_free: mov es,dx mov si,offset amis_sign mov cx,16 repe cmpsb jcxz already_loaded next_mux: dec ah jnz more_mux free_mux_found: cmp byte ptr mux_id,0 je no_more_mux mov ax,352Dh int 21h mov word ptr old_int2Dh,bx mov word ptr old_int2Dh+2,es mov ax,3509h int 21h mov word ptr old_int09h,bx mov word ptr old_int09h+2,es mov ax,252Dh mov dx,offset int2Dh_handler int 21h mov ax,2509h mov dx,offset int09h_handler int 21h mov ah,49h mov es,word ptr envseg int 21h mov ah,9 mov dx,offset installed_msg int 21h mov dx,offset initialize int 27h no_more_mux: mov ah,9 mov dx,offset no_more_mux_msg int 21h ret usage db 'Course project by Volodymyr Karplyuk (SI-31, TNTU)',13,10 db '[1] Perevirka',0Dh,0Ah db '[2] Objednannya',0Dh,0Ah db '[3] Peretyn',0Dh,0Ah db '[4] Riznucya',0Dh,0Ah db 'main.com /u - to unload program from memory',0Dh,0Ah db '',0Dh,0Ah db '$' already_msg db 'ERROR: Already loaded',0Dh,0Ah,'$' no_more_mux_msg db 'ERROR: Too many TSR programs' db ' loaded',0Dh,0Ah,'$' installed_msg db 'Installed successfully',0Dh,0Ah,'$' cant_unload1_msg db "ERROR: Can't unload: program not found in memory",0Dh,0Ah,'$' cant_unload2_msg db "ERROR: Can't unload: another TSR hooked interrupts",0Dh,0Ah,'$' unloaded_msg db 'Unloaded successfully',0Dh,0Ah,'$' unloading db 0 initialize endp ;_main endp end start