An EMS tester/information viewer

comment <----------------------------------------------------
 This is an EMS memory tester
 Type EMSINFO at the prompt

    Version:  1.00
     Author:  Ben Lunt
   Modified:  11 Jan 2001
  Assembler:  NBASM 00.24.42

   -= I cleaned it up a bit, and made it assemble with NBASM =-

<------------------------------------------------------------

.model tiny
.386
.code
           mov  ah,01h                  ; turn off cursor
           mov  ch,20h                  ; bit number 5
           int  10h                     ;
           mov  si,offset StartIt       ; print start string
           call prtstring               ;
           call ChkEMS                  ; see if EMS is present
           jnc  short ItsThere
           mov  si,offset NoneMsg
           call prtstring
           jmp  AllDone

ItsThere:  mov  si,offset InMsg
           call prtstring

           mov  ah,46h                  ; get EMS version
           int  67h
           mov  ah,al
           and  ah,00001111b            ; minor version
           shr  al,04h                  ; major version
           or   ax,3030h                ; make ascii
           mov  Major,al
           mov  Minor,ah
           mov  si,offset Version
           call prtstring

           mov  si,offset PageMsg       ; page frame message
           call prtstring
           mov  ah,41h                  ; get page frame address
           int  67h
           mov  ax,bx                   ; This is the page frame base
           call prthex

           mov  si,offset TotalMsg      ; Total memory message
           call prtstring
           mov  ah,42h
           int  67h
           xor  eax,eax
           mov  ax,dx
           xor  edx,edx
           mov  ecx,4000h
           mul  ecx
           call prtdec

           mov  si,offset FreeMsg       ; available memory message
           call prtstring
           xor  eax,eax
           mov  ax,bx
           mov  ebx,4000h
           mul  ebx
           call prtdec

           mov  ah,43h                  ; allocate pages
           mov  bx,02h                  ; get 2 pages (32K)
           int  67h
           or   ah,ah                   ; was there an error?
           jne  short Error1            ;
           mov  EMPhandle,dx            ; no, save handle

           mov  ax,4400h                ; map memory - first EMS page
           xor  bx,bx                   ; want this part of my memory
           mov  dx,EMPhandle            ; assigned to this handle
           int  67h
           or   ah,ah                   ; was there an error?
           jnz  short Error2            ;
           mov  ax,4401h                ; map memory
           mov  bx,01h
           int  67h
           or   ah,ah                   ; was there an error?
           jnz  short Error2            ; yes, so handle

           mov  ah,41h                  ; get page frame address
           int  67h
           or   ah,ah                   ; was there an error?
           jnz  short Error3            ; yes, so handle
           mov  es,bx                   ; make page frame addressable

           mov  si,offset FillMsg
           call prtstring
           mov  cx,910                  ; 36-character message fits this
           cld                          ;   many times in 32K (32768 bytes)
           xor  di,di                   ; start of page buffer
InLoop:    push cx
           mov  si,offset TestMsg
           mov  cx,09                   ; length of message (36/4)
           rep
           movsd
           call IncIt                   ; inc the counter in the 
           pop  cx                      ;   test message
           loop InLoop
           mov  al,0FFh                 ; put ending flag
           stosb                        ;

           mov  si,offset ReadMsg       ;
           call prtstring               ;
           xor  si,si                   ;
           push ds                      ; set up addressing
           push es                      ;
           pop  ds                      ;
OutLoop:   call prtstring               ; print back the test message
           cmp  byte [si],0FFh          ;  that was stuffed in to
           jne  short OutLoop           ;   the memory
           pop  ds                      ;

           mov  ah,45h                  ; release EMS handle
           mov  dx,EMPhandle            ; this handle
           int  67h                     ;
           or   ah,ah                   ; was there an error
           je   short AllDone
           mov  si,offset EMsg4
           jmp  short PrntErr
Error1:    mov  si,offset EMsg1
           jmp  short PrntErr
Error2:    mov  si,offset EMsg2
           jmp  short PrntErr
Error3:    mov  si,offset EMsg3
PrntErr:   call prtstring
AllDone:   mov  ah,01h                  ; turn on cursor
           mov  cx,0607h                ; start = 6   finish = 7
           int  10h                     ;
           mov  si,offset crlf
           call prtstring
           .exit

ChkEMS     proc near uses ax bx dx es

           mov  dx,offset EMSName       ; device driver name
           mov  ax,3D00h                ; open device-access/file sharing mode
           int  21h
           jc   short NotThere2
           mov  bx,ax                   ; put handle in proper place
           mov  ax,4407h                ; IOCTL  -  get output status
           int  21h
           jc   short NotThere1
           cmp  al,0FFh
           jne  short NotThere1
           mov  ah,3Eh                  ; close device
           int  21h
           clc                          ; set for no error
           jnc  short Done
NotThere1: mov  ah,3Eh                  ; close device
           int  21h
NotThere2: stc
Done:      ret
ChkEMS     endp

IncIt      proc near uses si
           mov  si,offset Count
           add  si,03h
IncIt1:    inc  byte [si]
           cmp  byte [si],58        ; out of number range?
           jne  short IncIt2        ; no, so continue
           mov  byte [si],48        ; reset to zero
           dec  si
           cmp  byte [si],32        ; filled in yet?
           jne  short IncIt1
           mov  byte [si],48        ; reset to zero
           jmp  short IncIt1
IncIt2:    ret
IncIt      endp

prtstring  proc near uses ax
Ps1:       mov  dl,[si]                 ; Get character
           inc  si                      ; Point to next one
           or   dl,dl                   ; End of string?
           jz   short ps2               ; Yes, so exit
           mov  ah,02h                  ; Output a character
           int  21h
           jmp  short Ps1               ; Keep doing it
Ps2:       ret
prtstring  endp

prtdec     proc near uses eax ecx edx bx di
           xor  bx,bx                   ; number of chars to print
           mov  cx,0FFFFh               ; Ending flag
           push cx
           mov  ecx,10
PD1:       xor  edx,edx
           div  ecx                     ; Divide by 10
           add  dl,30h                  ; Convert to ASCII
           push dx                      ; Store remainder
           or   eax,eax                 ; Are we done?
           jnz  short PD1               ; No, so continue
PD2:       pop  dx                      ; Character is now in DL
           cmp  dx,0FFFFh               ; Is it the ending flag?
           je   short PD3               ; Yes, so continue
           mov  ah,02
           int  21h
           inc  bx
           jmp  short PD2               ; Keep doing it
PD3:       ret
prtdec     endp

PrtHex     proc near uses ax cx dx
           mov  cx,04
PLoop:     rol  ax,04          ;
           push ax             ;
           and  al,0Fh         ;
           daa                 ;
           add  al,0F0h        ;
           adc  al,40h         ;
           mov  ah,02          ;
           mov  dl,al          ;
           int  21h            ;
           pop  ax             ;
           loop PLoop          ;
           mov  ah,02
           mov  dl,'h'
           int  21h
           ret
PrtHex     endp


StartIt     db  13,10,'EMS Info              Version 1.00'
            db  13,10,' Forever Young Software  1990-1997'
crlf        db  13,10,0
InMsg       db  13,10,'The expanded memory manager is installed.',0
NoneMsg     db  13,10,'No expanded memory manager detected!',0
Version     db  13,10,'EMS version '
Major       db  00,'.'
Minor       db  00,'.',00h
PageMsg     db  13,10,'   The page frame address:  ',0
TotalMsg    db  13,10,'    Total expanded memory:  ',0
FreeMsg     db  13,10,'Expanded memory available:  ',0

EMSName     db  'EMMXXXX0',0
EMPhandle   dw  0000h
FillMsg     db  13,10,10,'-------Performing the test---------'
            db  13,10,'  Filling expanded memory pages',0
ReadMsg     db  13,10,'  Reading expanded memory pages',13,10,0
TestMsg     db  'This is a test message   blk#:'
Count       db  '   1',13,0
EMsg1       db  13,10,'Could not allocate memory requested',0
EMsg2       db  13,10,'Error mapping memory',0
EMsg3       db  13,10,'Could not determine page frame',0
EMsg4       db  13,10,'Error releasing EMS handle',0

.end


All rights reserved
Legal Notice
Copyright © 1984-2010 Forever Young Software
Forever Young Software for Hire
Return to My Home Page