;-------------------------------------------------
; Dieses Programm wird an Ihre bestehende
; TSR-Routine angefgt und mit einem JMP-Befehl
; an erster Stelle in Ihrer TSR-Routine aktiviert.
;
; Datum : 03.06.89
; Autor : J”rg Matthaei
;-------------------------------------------------

himem   proc    near

begin:   call   hmada                   ; Teste ob Himem-Driver aktiv ist
         jnz    fin
         mov    cx,pgende-pganf         ; pgende ist die End-Adresse Ihrer
         mov    dx,-1                   ; TSR-Routine bzw.
         mov    ah,01                   ; pganf ist die Start-Adresse
                                        ; cx enth„lt somit die Anzahl der
                                        ; Bytes die in die HMA zu kopieren
                                        ; sind

         call   dword ptr hmaofs        ; reserviere HMA
         dec    ax
         jz     him1
         ret                            ; Reservierung nicht m”glich
him1:    mov    ah,03
         call   dword ptr hmaofs        ; A20 global erm”glichen
         dec    ax
         jnz    him2
                                        ; kopiere PSP ab 10h in
         push   cx                      ; den HMA Bereich
         mov    ax,0FFFFh
         mov    es,ax
         mov    di,10h
         mov    si,10h
         mov    cx,0F0h
         rep    movsb
         pop    cx
         mov    di,offset pganf        ; verschiebe TSR Routine
         mov    si,di                  ; in den HMA Bereich
         rep    movsb
         cli
         mov    ds,ax                  ; ds=0FFFFh
         db     0EAh
         dw     103h,0FFFFh            ; JMP FAR auf TSR Routine
         sti                           ; die sich nun selbst im
         ret                           ; HMA Bereich installiert !

him2:    mov    ah,04                  ; A20 sperren
         call   dword ptr hmaofs
         mov    ah,02                  ; HMA Bereich wieder freigeben
         call   dword ptr hmaofs
         ret

hmada:   mov    ax,4300H               ; Teste ob Himem.sys aktiv ist
         int    2Fh
         cmp    al,80H
         jz     alloc
         mov    dx,offset msgins       ; Himem.sys nicht aktiv
         mov    ah,09
         int    21h
         ret

alloc:   push   es
         mov    ax,4310H               ; hole HMA Einsprungadresse
         int    2Fh
         mov    hmaofs,bx
         mov    hmaseg,es
         pop    es
         and    al,0
         ret

fin:     mov    ah,4Ch
         int    21h

msgins   db     10,13,9,'XMS - Driver nicht installiert !',10,13,'$'

hmaofs   dw     0                      ; HMA-Driver Offset
hmaseg   dw     0                      ; HMA-Driver Segment

himem   endp
