; + * * * * * * * * * * * * * * * * * * * * * * * * * * * +
; * *
; * program : VGA-kolor *
; * *
; * działanie: Rezydentne "podczepienie" się pod *
; * funkcję 1Ah, przerwania 10h *
; * *
; * odinstalowanie: Ponowne uruchomienie programu *
; * *
; * kompilacja : tasm kolor.asm *
; * tlink /t kolor.obj *
; * *
; * *
; * napisa’ : MIRos’aw TOTON (`98) *
; * *
; + * * * * * * * * * * * * * * * * * * * * * * * * * * * +
code segment
assume cs: code
org 100h
start:
jmp instaluj
id db 'MIR-Color' ; identyfikator
stary_wektor dd ? ; zmienna zawieraj†ca adres
; poprzedniej procedury
; obsługi przerwania 10h
obsluga_int_10h: ; tre¶ć nowej procedury
cmp ax, 1a00h ; obsługi przerwania 10h
jne old_10h
mov al, 1ah
mov bl, 8
iret
old_10h:
jmp stary_wektor
obsluga_int_10h_koniec:
napis db '* ------------------------------ *', 10, 13
db '| Emulator VGA-Kolor (MIR `98) |', 10, 13
db '* ------------------------------ *', 10, 13, '$'
ok db 'Emulator VGA-Kolor (MIR `98) odinstalowany '
db '... OK!', 10, 13, '$'
instaluj:
assume ds:code
mov ax, 3510h ; sprawdzam czy rezydent jest
int 21h ; zaistalowany
mov di, bx
sub di, 13
mov si, offset id
mov cx, 9
cld
repe cmpsb
jne niezainstalowany ; je¶li niezainstalowany to
; zainstaluj,
push ds ; w przeciwnym wypadku
mov ax, 2510h ; odinstaluj
lds dx, es:[bx-4] ; - ustaw poprzedni wektor
int 21h ; przerwań
pop ds
push es
mov es, es:[2ch] ; zwolnienie segmentu otoczenia
mov ah, 49h ; systemowego
int 21h
pop es ; zwolnienie segmentu naglowka
mov ah, 49h ; PSP
int 21h
mov ah, 9
mov dx, offset ok
int 21h
mov ah, 4ch ; zakończ program
int 21h
niezainstalowany:
mov ax, 3510h ; odczytaj i zapamiętaj
int 21h ; aktualny wektor przerw. 10h
mov word ptr stary_wektor, bx
mov word ptr stary_wektor+2, es
mov ax, 2510h ; ustaw nowy wektor przerwania
mov dx, offset obsluga_int_10h ; 10h
int 21h
mov ah, 9
mov dx, offset napis
int 21h
mov dx, offset obsluga_int_10h_koniec
int 27h ; uczyn program rezydentnym
code ends
end start
Stronę opracował Michał Szulowski