;;Przykład 8.13. Program rezydentny

.MODEL tiny
ASSUME CS:@CODE, DS:@CODE
.CODE
org 100h
Start:
 jmp Init
;;--- część rezydentna
Nowa_1C:
 push AX
 push ES
 inc CS:licznik
 test BYTE PTR CS:licznik,0Fh
 jnz et1
 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
et1: 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 ?
;;--- część inicjalizacji
Init:
;;odczytanie informacji o aktualnym trybie monitora i stronice
 mov AX,0F00h
 int 10h
 mov CS:tryb,AL 
 mov CS:stron,BH 
;;przygotowywanie i wywołanie INT21/35h 
 mov AX,351Ch
 int 21h
 mov WORD PTR CS:stara1C,BX
 mov WORD PTR CS:stara1C+2,ES
;;przygotowywanie i wywołanie INT21/25h 
 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 + 100h +15)
 SAR DX,4 ;;dzielenie na 16
 int 21h
END Start
	
