; + * * * * * * * * * * * * * * * * * * * * * * * * * * * +
; *                                                       *
; *  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