include sysp.inc

		  .MODEL  tiny
		  DOSSEG

		  .STACK  100h

		  .DATA

msg     DB 13,10,"Работа с драйвером HIMEM.SYS", 13, 10
		  DB       "Copyright (C)Frolov A.,1991",13,10,13,10
		  DB "$"

noHMM    DB 13,10,"Драйвер HIMEM.SYS не установлен", 13, 10, "$"
yesHMM   DB 13,10,"Драйвер HIMEM.SYS установлен, ", "$"
ver1     DB "версия: ", "$"
ver2     DB ", номер модификации: ", "$"
errmsg   DB 13,10,"Ошибка с кодом ", "$"
okmsg    DB 13,10,"Успех!!!", "$"
hmareq   DB 13,10,"Запрашиваем область HMA", "$"
hmarel   DB 13,10,"Освобождаем область HMA", "$"
enA20    DB 13,10,"Открываем линию A20", "$"
dsA20    DB 13,10,"Закрываем линию A20", "$"
loc_enA20 DB 13,10,"Локальный доступ к линии A20", "$"
loc_dsA20 DB 13,10,"Закрываем локальный доступ к линии A20", "$"
check_A20 DB 13,10,"Проверяем доступность линии A20", "$"
free_ext_mem DB 13,10,"Всего расширенной памяти, Кбайт: ", "$"
max_ext_block DB 13,10,"Максимальный участок свободной"
				  DB " расширенной памяти, Кбайт: ", "$"

HMMEntry dd ?

		  .CODE
		  .STARTUP

			mov     ah, 9h                ; Выводим заголовок
			mov     dx, OFFSET msg
			int     21h

; Проверяем, установлен ли драйвер HIMEM.SYS

			mov   ax, 4300h
			int   2fh
			cmp   al, 80h
			je    HMM_installed

; Если не установлен, выводим сообщение и завершаем
; работу программы

			mov   ah, 9h
			mov   dx, OFFSET noHMM
			int   21h

			jmp   terminate

HMM_installed:

			mov   ah, 9h
			mov   dx, OFFSET yesHMM
			int   21h

; Получаем адрес управляющей функции драйвера

			mov   ax, 4310h
			int   2fh
			mov   word ptr cs:[HMMEntry][0], bx
			mov   word ptr cs:[HMMEntry][2], es

; Получаем номер версии

			mov   ah, 9h
			mov   dx, OFFSET ver1
			int   21h

			mov   ax,0
			call  cs:[HMMEntry]

; Выводим номер версии на экран

			call  Print_word

			mov   ah, 9h
			mov   dx, OFFSET ver2
			int   21h

			mov   ax, bx
			call  Print_word

; Запрашиваем область HMA

			mov   ah, 9h
			mov   dx, OFFSET hmareq
			int   21h

			mov   ax,0100h
			mov   dx,0ffffh

			call  cs:[HMMEntry]
			or    ax, ax
			jnz   hmareq_ok
			jmp   error

hmareq_ok:
			mov   ah, 9h
			mov   dx, OFFSET okmsg
			int   21h

; Открываем линию A20

			mov   ah, 9h
			mov   dx, OFFSET enA20
			int   21h


			mov   ax,0300h

			call  cs:[HMMEntry]
			or    ax, ax
			jnz   enA20_ok
			jmp   error

enA20_ok:
			mov   ah, 9h
			mov   dx, OFFSET okmsg
			int   21h

; Закрываем линию A20

			mov   ah, 9h
			mov   dx, OFFSET dsA20
			int   21h

			mov   ax,0400h

			call  cs:[HMMEntry]
			or    ax, ax
			jnz   dsA20_ok
			jmp   error

dsA20_ok:

			mov   ah, 9h
			mov   dx, OFFSET okmsg
			int   21h

; Освобождаем область HMA

			mov   ah, 9h
			mov   dx, OFFSET hmarel
			int   21h

			mov   ax,0200h

			call  cs:[HMMEntry]
			or    ax, ax
			jz    error

			mov   ah, 9h
			mov   dx, OFFSET okmsg
			int   21h

; Получаем локальный доступ к линии A20

			mov   ah, 9h
			mov   dx, OFFSET loc_enA20
			int   21h

			mov   ax,0500h

			call  cs:[HMMEntry]
			or    ax, ax
			jz    error

			mov   ah, 9h
			mov   dx, OFFSET okmsg
			int   21h

; Проверяем линию A20

			mov   ah, 9h
			mov   dx, OFFSET check_A20
			int   21h

			mov   ax,0700h

			call  cs:[HMMEntry]
			or    ax, ax
			jz    error

			mov   ah, 9h
			mov   dx, OFFSET okmsg
			int   21h

; Определяем размер свободной рсширенной памяти

			mov   ah, 9h
			mov   dx, OFFSET free_ext_mem
			int   21h

			mov   ax,0800h

			call  cs:[HMMEntry]

			push  ax
			mov   ax, dx
			call  Print_word

			mov   ah, 9h
			mov   dx, OFFSET max_ext_block
			int   21h

			pop   ax
			call  Print_word


; Освобождаем линию A20

			mov   ah, 9h
			mov   dx, OFFSET loc_dsA20
			int   21h

			mov   ax,0600h

			call  cs:[HMMEntry]
			or    ax, ax
			jz    error

			mov   ah, 9h
			mov   dx, OFFSET okmsg
			int   21h




			jmp   terminate

error:
			push  bx

			mov   ah, 9h
			mov   dx, OFFSET errmsg
			int   21h

			pop   ax
			call  Print_word


terminate:

		  .EXIT   0



; Вывод на экран содержимого регистра AX

Print_word proc near
;--------------------
	  push ax
	  push bx
	  push dx
;
	  push ax
	  mov cl,8
	  rol ax,cl
	  call Byte_to_hex
	  mov bx,dx
	  @@out_ch bh
	  @@out_ch bl
;
	  pop ax
	  call Byte_to_hex
	  mov bx,dx
	  @@out_ch bh
	  @@out_ch bl
;
	  pop dx
	  pop bx
	  pop ax
	  ret
Print_word endp
;
Byte_to_hex proc near
;--------------------
; al - input byte
; dx - output hex
;--------------------
	  push ds
	  push cx
	  push bx
;
	  lea bx,tabl
	  mov dx,cs
	  mov ds,dx
;
	  push ax
	  and al,0fh
	  xlat
	  mov dl,al
;
	  pop ax
	  mov cl,4
	  shr al,cl
	  xlat
	  mov dh,al
;
	  pop bx
	  pop cx
	  pop ds
	  ret
;
tabl db '0123456789ABCDEF'
Byte_to_hex endp
;

		  END
