'===========================================================================
' Subject: CHECK FOR EMS                      Date: Unknown Date           
'  Author: James Vahn                         Code: QB, PDS                
'  Origin: FidoNet QUIK_BAS Echo            Packet: MEMORY.ABC
'===========================================================================
'test4ems.bas  -  James Vahn 1:30854/20@fidonet
'written for QB 4.5  Load QB/L - does not work with Qbasic.
'$INCLUDE: 'qb.bi'
 
'This checks out your EMS driver & hardware.
 
TYPE EmsHardware
        EmmRawPageSize                  AS INTEGER
        NumberAlternateRegisterSets     AS INTEGER
        SizeMappingContextSaveArea      AS INTEGER
        NumberDMARegisterSets           AS INTEGER
        DMAOperationType                AS INTEGER
END TYPE
 
DIM Regs AS RegTypeX
DIM EmsH AS EmsHardware
 
Regs.ax = &H3567                 ' locate code for INT 67, EMS driver.
CALL INTERRUPTX(&H21, Regs, Regs)
DEF SEG = Regs.es
    FOR t = &HA TO &H11          ' search the driver header for text
    EMS$ = EMS$ + CHR$(PEEK(t))
    NEXT
IF EMS$ = "EMMQXXX0" THEN
    EMS$ = "EMMXXXX0"
    PRINT "DR DOS EMM386 detected."
    PRINT "Would you like it fixed (y/n)?"
          WHILE A$ = ""
          A$ = INKEY$
          WEND
          IF A$ = "y" THEN
          POKE &HA + 3, ASC("X")    ' fix(?) the driver handle.
          END IF
END IF
DEF SEG
IF EMS$ <> "EMMXXXX0" THEN PRINT "No EMS installed": END
 
PRINT "EMS Driver found at "; HEX$(Regs.es); ":"; HEX$(Regs.bx)
Regs.ax = &H5900        ' subfunction 59h
Regs.es = VARSEG(EmsH)  ' point ES:DI to the array EmsH
Regs.di = VARPTR(EmsH)  '
CALL INTERRUPTX(&H67, Regs, Regs)
 
PRINT "Emm Raw Page Size"; EmsH.EmmRawPageSize
PRINT "Number Alternate Register Sets"; EmsH.NumberAlternateRegisterSets
PRINT "Size Mapping Context Save Area"; EmsH.SizeMappingContextSaveArea
PRINT "Number DMA Register Sets"; EmsH.NumberDMARegisterSets
PRINT "DMA Operation Type"; EmsH.DMAOperationType
 
Regs.ax = &H4200
CALL INTERRUPTX(&H67, Regs, Regs)
 
PRINT "Total EMS memory"; Regs.dx * 16; CHR$(29) + "k"
PRINT "Total EMS memory available"; Regs.bx * 16; CHR$(29) + "k"
PRINT
 IF EmsH.NumberAlternateRegisterSets = 0 THEN
        PRINT "Hardware alternate page mapping not supported."
        PRINT " Bad news for multitasking."
 ELSE
        PRINT "Suitable for multitasking."
 END IF
