Программа 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
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий