;;Przykład 8.15. Oczyszczenie pamięci z rezydenta
.MODEL tiny
ASSUME CS:@CODE, DS:@CODE
.CODE
org 100h
Start:
 jmp Init
;;---część rezydentna
nowa_2F:
 cmp AH,0D0h
 jne kon2F ;;funkcja jest inna niż 0D0h
 cmp AL,00h
 je nowa1 
 cmp AL,01h ;; 01 - numer pod-funkcji deinstalacji
 jne kon2F
 jmp deinst 
nowa1: 
 mov AL,0FFh
 iret
kon2F:
 jmp DWORD PTR CS:stara2F
;;deinstalacja rezydenta
deinst:
 push DS
 push ES
 push DX
;;zapisywanie adresu dawnej procedury 1C
 lds DX,CS:stara1C 
 mov AX,251Ch
 int 21h
;;zapisywanie adresu dawnej procedury 2F
 lds DX,CS:stara2F 
 mov AX,252Fh
 int 21h
;;zwolnienie środowiska
 mov ES,CS:002Ch ;;segmentowy adres środowiska
 mov AH,49h ;;funkcja zwolnie-nia pamięci
 int 21h
;;zwolnienie pamięci z rezyden-tem
 push CS
 pop ES
 mov AH,49h ;;funkcja zwolnie-nia pamięci
 int 21h
;;
 pop DX
 pop ES
 pop DS
 iret
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: ;; inicjalizacja
 mov AX,0D000h ;;funkcja 0D0h przerwania 2Fh
 int 2Fh
 cmp AL,0FFh ;;jest rezydent?
 jne init1
 je kom_rezyd
init1:
 cmp AL,00h ;;numer jest wolny?
 je init2
 jmp kom_zajet
init2:
;; INT21/35h dla przerwania 2Fh 
 mov AX,352Fh
 int 21h
 mov WORD PTR CS:stara2F,BX 
 mov WORD PTR CS:stara2F+2,ES 
;;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
;;tryb monitora i stronica
 mov AX,0F00h
 int 10h
 mov tryb,AL 
 mov stron,BH 
;;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 z pamięci
 mov DX,(Init-Start+10Fh) 
 SAR DX,4 ;;dzielenie na 16
 int 21h
kom_rezyd:  mov CH,0
 mov CL,ES:005Dh ;;5Dh=5Ch(adres FCB1) + 1 bajt (numer dysku)
 cmp CL,20h ;;spacja
 je et_rezyd
 cmp CL,'-' ;; deinstalacja
 jne et_rezyd
 jmp et_deinst 
et_rezyd:  mov AH,09h
 mov DX, OFFSET komRez
 int 21h
 mov AX,4C01h
 int 21h
et_deinst:  mov AH,09h
 mov DX, OFFSET komDei
 int 21h
 mov AX,0D001h ;;AL=1 - polecenie do deinstalacji
 int 2Fh
 mov AX,4C03h
 int 21h
kom_zajet:  mov AH,09h
 mov DX, OFFSET komZaj
 int 21h
 mov AX,4C02h
 int 21h
komRez DB 'Program już był załadowany',0Dh,0Ah,'$'
komZaj DB 'Numer 0D0h funkcji jest zajęty',0Dh,0Ah,'$'
komDei DB 'Polecenie deinstalacji',0Dh,0Ah,'$'
END Start 
	

	
