logo
несколько программ / bsp33

ПрограммаTesthma

Первая программа с названием TESTHMA(листинг 11.1) демонстрирует проверку подключения драйвера и использование его основных функций.

Листинг 11.1. Файлtesthma\testhma.asm

; =====================================================

; Вызов основных функций API драйвера HIMEM.SYS

;

; (C) A. Frolov, 1997

;

; E-mail: frolov@glas.apc.org

; WWW: http://www.glasnet.ru/~frolov

; or

; http://www.dials.ccas.ru/frolov

; =====================================================

@@out_ch MACRO c1,c2,c3,c4,c5,c6,c7,c8,c9,c10

mov ah,02h

IRP chr,<c1,c2,c3,c4,c5,c6,c7,c8,c9,c10>

IFB <chr>

EXITM

ENDIF

mov dl,chr

int 21h

ENDM

ENDM

@@out_str MACRO

mov ah,9

int 21h

ENDM

BEEP MACRO

mov bx,0

mov ax, 0E07h

int 10h

ENDM

.model small

.STACK 100h

.DATA

msg DB 13,10,"HIMEM.SYS API Demo", 13, 10

DB "(C) Frolov A., 1997",13,10,13,10

DB "$"

noHMM DB 13,10

DB "HIMEM.SYS not installed",13,10,"$"

yesHMM DB 13,10,"HIMEM.SYS istalled, ", "$"

ver1 DB "version: ", "$"

ver2 DB ", modification: ", "$"

errmsg DB 13,10,"Error code ", "$"

okmsg DB 13,10,"Success!", "$"

hmareq DB 13,10,"Request HMA", "$"

hmarel DB 13,10,"Release HMA", "$"

enA20 DB 13,10,"Open A20", "$"

dsA20 DB 13,10,"Close A20", "$"

loc_enA20 DB 13,10,"Local open A20","$"

loc_dsA20 DB 13,10,"Local close A20", "$"

check_A20 DB 13,10,"Check A20", "$"

free_ext_mem DB 13,10,"Extended memory, Kbyte: ", "$"

max_ext_block DB 13,10,"Max free Extended memory block, Kbyte: ", "$"

HMMEntry dd ?

.CODE

begin:

mov ax, DGROUP

mov ds, ax

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:

; Завершаем работу программы и

; возвращаем управление операционной системе

mov ax, 4C00h

int 21h

; Вывод на экран содержимого регистра 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 begin