;--------------------------------
; Test4ems.Asm - James Vahn
; Displays the significant EMS driver data.
cseg segment
assume cs:cseg, ds:cseg
org 100h ;COM format
Begin:
call Detect ;Look for a driver.
jc Error ;No driver found.
mov dx,offset Msg ;Inform that it was found.
mov ah,09h
int 21h
call ShowVersion ;Show which version.
jc error2 ;function disabled.
call GetEMSdata ;Get EMS info data.
jc error2
call ShowData ;Display it onscreen.
call GetMEM ;Show memory available.
mov ax,4C00h ;Exit.
int 21h
Error:
mov dx,offset Msg2 ;No driver found, exit.
jmp E1
Error2:
mov dx,offset Msg1 ;Driver found, but not enabled.
E1: mov ah,09h ;Exit.
int 21h
mov ax,4C01h
int 21h
_EmsH struc
EmmRawPageSize dw ?
NumberAlternateRegisterSets dw ?
SizeMappingContextSaveArea dw ?
NumberDMARegisterSets dw ?
DMAOperationType dw ?
_EmsH ends
EmsH db size _EmsH dup (?)
CRLF db 13,10,36
Msg db 'EMS driver detected, version ',36
Msg1 db 'Function not enabled.',13,10,36
Msg2 db 'Error, Driver Not Found.',13,10,36
Msg3 db ' Emm Raw Page Size $'
Msg4 db 'Number Alternate Register Sets $'
Msg5 db 'Size Mapping Context Save Area $'
Msg6 db ' Number DMA Register Sets $'
Msg7 db ' DMA Operation Type $'
Msg8 db 13,10,'Total EMS memory $'
Msg9 db 'Total EMS memory available $'
Msg10 db 'k',13,10,36
;************************************************
Detect proc NEAR
; Tests if an EMS driver is present. Carry set on Error.
; Note: DR-DOS uses EMMQXXX0
mov ax,3567h ;Get driver address into ES:BX
int 21h
cld
mov si, offset driver1 ;Look for EMMXXXX0.
mov di,0Ah ;Offset into driver.
mov cx,8 ;Check 8 bytes.
repe cmpsb ;Compare DS:SI to ES:DI
jcxz Dp1 ;Found it, exit.
mov si,offset driver2 ;Look for DR-DOS driver.
mov di,0Ah
mov cx,8
repe cmpsb
jcxz Dp1
stc ;Set carry on fail.
Dp1: ret
driver1 db 'EMMXXXX0'
driver2 db 'EMMQXXX0'
ENDP
;*********************************************
ShowVersion proc NEAR
; Get version of Driver.
mov ah,46h
int 67h ;Call Get Version function.
or ah,ah
jne NoVersion ;AH=0 if enabled.
push ax ;Save it.
mov cl,4
shr ax,cl ;Version in BCD, shift right
xor ah,ah ;four places for high nibble.
call Bin2Dec
mov dl,'.'
mov ah,02h
int 21h ;Print '.'
pop ax
and ax,00001111b ;Mask off upper nibble.
call Bin2DEC
mov dx,offset CRLF
mov ah,09h
int 21h
int 21h ;Double line feed.
ret
NoVersion:
stc ;Set carry on error.
ret
ENDP
;*********************************************
GetEMSdata proc NEAR
; Put the EMS data info into the buffer.
mov di,offset EmsH
push ds
pop es
mov ax,5900h
int 67h
or ah,ah
ret
ENDP
;********************************************
ShowData proc NEAR
; This procedure prints out the EMS data info.
mov dx,offset Msg3
mov bx,offset EmsH
mov cx,5 ;5 data fields.
Show:
mov ah,09h
int 21h
mov ax,[bx]
call Bin2DEC
push dx
mov dx,offset CRLF
mov ah,09h
int 21h
pop dx
add dx,32 ;Get next line of text.
add bx,2 ;Get next word of data.
loop show
ret
ENDP
;*****************************************
GetMEM proc NEAR
; Show how much EMS memory, total and available.
mov ax,4200h ;Find EMS memory.
int 67h
push bx
push dx
mov dx,offset Msg8 ;Show Total EMS Memory.
mov ah,09h
int 21h
pop ax
mov bx,16
mul bx
call Bin2DEC
mov dx,offset Msg10
mov ah,09h
int 21h
mov dx,offset Msg9 ;Show Free EMS Memory.
mov ah,09h
int 21h
pop ax
mov bx,16
mul bx
call Bin2DEC
mov dx,offset Msg10
mov ah,09h
int 21h
ret
ENDP
;******************************************
Bin2DEC proc Near
; Convert AX to unsigned decimal ASCII output
push dx ;Save everything.
push cx
push bx
push ax
mov ax,0A30h ;Print a '0'
mov bh,0
mov cx,1
int 10h
pop ax
bin2as: mov cx,5 ;maximum of 5 decimal digits
mov bx,10d
bin2a1: xor dx,dx
div bx
add dl,'0' ;Convert remainder to ASCII.
push dx
loop bin2a1
mov cx,5
mov bl,'0' ;Suppress leading zeros.
bin2a2: pop ax
or bl,al
test bl,0Fh
jz bin2a4
mov dl,al ;Output ASCII digit in AL.
mov ah,02h
int 21h
bin2a4: loop bin2a2
pop bx ;Restore registers and return.
pop cx
pop dx
ret
ENDP
cseg ends
end Begin