;;Przykład 8.10. Zamiana programu obsługi przerwania
.MODEL tiny
.CODE
ASSUME CS:@CODE,DS:@CODE
Start:
;;odczytanie informacji o aktu-alnym trybie monitora i stroni-cy
 mov AX,0F00h ;odczytanie in-formacji o aktualnym trybie mo-nitora i stronicy
 int 10h
 mov CS:tryb,AL 
 mov CS:stron,BH 
;;przygotowywanie i wywołanie INT21/35h 
 mov AH,35h
 mov AL,1Ch
 int 21h
 mov WORD PTR CS:stara1C,BX
 mov WORD PTR CS:stara1C+2,ES
;;przygotowywanie INT21/25h 
 mov AH,25h
 mov AL,1Ch
 mov DX,OFFSET Nowa1C 
 push DS
 push CS
 pop DS ;;DS=CS
 int 21h
 pop DS
;;wyświetlenie
;;czekanie na spację
czek:
 mov AH,07h ;czekanie na znak
 int 21h
 cmp AL,20h ;;spacja
 jne czek
;;zapisywanie adresu dawnej procedury 1C
 lds DX,CS:stara1C 
 mov AH,25h
 mov AL,1Ch
 int 21h
mov AX,4C00h ;;zakończenie 
 int 21h
Nowa1C  PROC
 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 (?)
Nowa1C  ENDP
END Start    
	
	
