;;Przykład 8.14. Zakaz instalacji kopii rezydenta
.MODEL tiny
ASSUME CS:@CODE, DS:@CODE
.CODE
org 100h
Start:
 jmp Init
;;---część rezydentna
nowa_2F:
 cmp AH,0D0h
 jne kon2F
 cmp AL,00h
 jne kon2F
 mov AL,0FFh
 iret
kon2F:
 jmp DWORD PTR CS:stara2F
nowa_1C:
 push AX
 push ES
 inc CS:licznik
 test BYTE PTR CS:licznik,0Fh
 jnz kon1C
 cmp CS:tryb,07h
 je n7
 jg ng7
 mov AX,0B800h
 jmp nn
n7:
 mov AX,0B000h
 jmp nn
ng7:
 mov AX,0A000h
 jmp nn
nn:
 mov ES,AX
 mov AX,WORD PTR CS:symb1
 xchg AX,WORD PTR CS:symb2
 mov WORD PTR CS:symb1,AX
 mov ES:0000,AX
kon1C:
 pop ES
 pop AX
 jmp DWORD PTR CS:stara1C 
;; "iret" w starej 1C
symb1 DB 'A',0F0h
symb2 DB 'A',0Fh
licznik DB 0
stron  DB 0
tryb  DB 3
stara1C DD (?)
stara2F DD 0
Init:  ;; część inicjalizacji
 mov AX,0D000h ;;funkcja 0D0h przerwania 2Fh
 int 2Fh
 cmp AL,0FFh ;;sprawdzanie czy jest rezydent
 jne init1
 je kom_rezyd
init1:
 cmp AL,00h ;;sprawdzanie czy numer jest wolny
 je init2
 jmp kom_zajet
init2:
;;przygotowywanie i wywołanie INT21/35h dla przerwania 2Fh 
 mov AX,352Fh
 int 21h
 mov WORD PTR CS:stara2F,BX 
 mov WORD PTR CS:stara2F+2,ES 
;;przygotowywanie i wywołanie INT21/25h dla przerwania 2Fh 
 mov AX,252Fh
 mov DX,OFFSET nowa_2F 
 push DS
 push CS
 pop DS ;;DS=CS
 int 21h
 pop DS
;;odczytanie informacji o aktualnym trybie monitora i stronicy
 mov AX,0F00h
 int 10h
 mov CS:tryb,AL 
 mov CS:stron,BH 
;;przygotowywanie i wywołanie INT21/35h dla przerwania 1Ch 
 mov AX,351Ch
 int 21h
 mov WORD PTR CS:stara1C,BX
 mov WORD PTR CS:stara1C+2,ES
;;przygotowywanie i wywołanie INT21/25h dla przerwania 1Ch 
 mov AX,251Ch
 mov DX,OFFSET nowa_1C 
 push DS
 push CS
 pop DS ;;DS=CS
 int 21h
 pop DS
 mov AX,3100h ;;zakończenie programu bez usuwania go z pamięci
 mov DX,(Init-Start+10Fh) ;;0Fh=15
 SAR DX,4 ;;dzielenie na 16
 int 21h
;;;;
kom_rezyd:
 mov AH,09h
 mov DX, OFFSET komRez
 int 21h
 mov AX,4C01h
 int 21h
 ret
kom_zajet:
 mov AH,09h
 mov DX, OFFSET komZaj
 int 21h
 mov AX,4C02h
 int 21h
 ret
komRez DB 'Program już był załadowany',0Dh,0Ah,'$'
komZaj DB 'Numer 0D0h funkcji jest zajęty',0Dh,0Ah,'$'
END Start

	

	
