home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD2.mdf
/
doc
/
xms
/
test
/
test.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-02-06
|
9KB
|
343 lines
/*
* HITEST.C - Test Routines for HIMEM.SYS
*
* Copyright (c) 1988, Microsoft Corporation
*/
#include "xmm.h"
int quiet = 0;
#define MAXHANDLES (32*2)
#define BUFLEN 1024
struct HandleInfo {
short Handle;
short Length;
short Filler;
unsigned long RealAddress;
};
struct HandleInfo HandleTable[MAXHANDLES];
struct XMM_Move MoveS;
short BufferLow[BUFLEN];
short BufferExt[BUFLEN];
short BufferHi[BUFLEN];
main(argc, argv)
char *argv[];
{
long XMM_Ret;
int Request_Amount;
int Handle, hi;
long Alloc_Ret;
short TotalAllocated = 0;
short Handles;
short MemPerHandle;
if ( argc > 1 && argv[1][0] == 'q' )
quiet = 1;
if ( XMM_Installed() ) {
printf("Extended Memory Manager Found\n\n");
XMM_Ret = XMM_Version();
printf("XMM Version %4X, Internal Version %4x\n\n",
(short)XMM_Ret, (short)(XMM_Ret >> 16));
} else {
printf("No Extended Memory Manager Present\n\n");
Exit_Test();
}
Request_Amount = 0;
do {
XMM_Ret = XMM_RequestHMA(Request_Amount);
if ( XMM_Ret == 0 )
break;
Request_Amount++;
} while ( Request_Amount );
if ( XMM_Ret == 0 ) {
printf("Got HMA with Request of %d Kb\n", Request_Amount);
if ( XMM_RequestHMA(Request_Amount) == 0 ) {
printf("Unexpected success requesting HMA again\n");
}
XMM_Ret = XMM_ReleaseHMA();
if ( XMM_Ret )
Error("Could not release HMA", XMM_Ret);
else
printq("Released HMA\n");
} else {
Error("Could not Get HMA", XMM_Ret);
}
EnableA20();
EnableA20();
DisableA20();
EnableA20();
DisableA20();
EnableA20();
DisableA20();
DisableA20();
/* Soak up all extended memory and handles */
hi = 0;
while ( hi < MAXHANDLES ) {
long FreeExtended;
FreeExtended = XMM_QueryLargestFree();
if ( FreeExtended < 0 ) {
if ( XMSERROR(FreeExtended) == (char)0xA0 )
FreeExtended = 0L;
else {
Error("Query Free Extended Failed", FreeExtended);
break;
}
}
if ( hi < MAXHANDLES -1 && FreeExtended > 1 )
FreeExtended /= 2;
if ( !quiet )
printf("Attempt to Allocate %d Kb\n", FreeExtended);
Alloc_Ret = XMM_AllocateExtended(FreeExtended);
if ( Alloc_Ret < 0 ) {
if ( XMSERROR(Alloc_Ret) == (char)0xA1 )
break;
Error("Allocate Failed", Alloc_Ret);
} else {
TotalAllocated += FreeExtended;
HandleTable[hi].Handle = (short)Alloc_Ret;
}
hi++;
}
Handles = hi;
printf("%d Kb Free Found and Allocated \n", TotalAllocated);
printf("%d handle(s) allocated\n", Handles);
printq("Freeing first handle\n");
XMM_Ret = XMM_FreeExtended(HandleTable[0].Handle);
if ( XMM_Ret )
Error("Free Extended Memory Block", XMM_Ret);
printq("Reallocate first handle with 0 length\n");
Alloc_Ret = XMM_AllocateExtended(0);
if ( Alloc_Ret < 0 )
Error("Zero Length Allocate failed", Alloc_Ret);
else
HandleTable[0].Handle = (short)Alloc_Ret;
hi = 0;
while ( hi < Handles ) {
if ( HandleTable[hi].Handle == 0 )
break;
if ( !quiet )
printf("Freeing Handle #%d (%x)\n", hi,
HandleTable[hi].Handle);
XMM_Ret = XMM_FreeExtended(HandleTable[hi].Handle);
if ( XMM_Ret )
Error("Free Extended Memory Block", XMM_Ret);
hi++;
}
if ( Handles == 0 )
Exit_Test();
MemPerHandle = TotalAllocated / Handles + 1;
if ( (long)BUFLEN < MemPerHandle * 512L )
MemPerHandle = BUFLEN/512;
if ( !quiet )
printf("Allocating in %d Kb chunks\n", MemPerHandle);
hi = 0;
while ( hi < Handles ) {
XMM_Ret = XMM_AllocateExtended(MemPerHandle);
if ( XMM_Ret < 0 ) {
if ( XMSERROR(XMM_Ret) != 0xA0 )
Error("Allocate", XMM_Ret);
break;
}
HandleTable[hi].Handle = (short)XMM_Ret;
HandleTable[hi].Length = MemPerHandle;
XMM_Ret = XMM_LockExtended((short)XMM_Ret);
if ( XMM_Ret < 0 ) {
printf("Handle %4x: ", HandleTable[hi].Handle);
Error("Lock Failed", XMM_Ret);
}
if ( !quiet )
printf("Handle %4x: Real Address %lx\n", HandleTable[hi].Handle,XMM_Ret);
HandleTable[hi].RealAddress = XMM_Ret;
XMM_Ret = XMM_FreeExtended(HandleTable[hi].Handle);
if ( XMM_Ret >= 0 ) {
printf("Unexpected success freeing locked Handle\n");
break;
} else if ( XMSERROR(XMM_Ret) != (char)0xAB ) {
Error("Freeing Locked Handle", XMM_Ret);
}
Fill(BufferExt, HandleTable[hi].Handle ^ 0xAAAA, BUFLEN);
MoveS.Length = MemPerHandle*1024L;
MoveS.SourceHandle = 0;
(char far *)MoveS.SourceOffset = (char far *)BufferExt;
MoveS.DestHandle = HandleTable[hi].Handle;
MoveS.DestOffset = 0L;
XMM_Ret = XMM_MoveExtended(&MoveS);
if ( XMM_Ret < 0 )
Error("Move to Extended Memory Failed", XMM_Ret);
hi++;
}
Handles = hi; /* How many we got this time */
if ( hi == 0 )
Exit_Test();
while ( --hi >= 0 ) {
if ( !quiet )
printf("Checking Handle %x\n", HandleTable[hi].Handle);
Fill(BufferLow, HandleTable[hi].Handle ^ 0xAAAA, BUFLEN);
MoveS.Length = MemPerHandle*1024L;
MoveS.SourceHandle = HandleTable[hi].Handle;
MoveS.SourceOffset = 0L;
MoveS.DestHandle = 0;
(char far *)MoveS.DestOffset = (char far *)BufferHi;
XMM_Ret = XMM_MoveExtended(&MoveS);
if ( XMM_Ret < 0 )
Error("Move from Extended Memory Failed", XMM_Ret);
if ( Cmp(BufferLow, BufferHi, BUFLEN) )
printf("Comparison Failed, Handle %x\n",
HandleTable[hi].Handle);
XMM_Ret = XMM_UnlockExtended(HandleTable[hi].Handle);
if ( XMM_Ret < 0 )
Error("Unlock of Extended Memory Failed", XMM_Ret);
}
hi = 0;
while ( hi < Handles ) {
Fill(BufferLow, HandleTable[hi].Handle ^ 0xAAAA, BUFLEN);
MoveS.Length = MemPerHandle*1024L;
MoveS.SourceHandle = HandleTable[hi].Handle;
MoveS.SourceOffset = 0L;
MoveS.DestHandle = 0;
(char far *)MoveS.DestOffset = (char far *)BufferHi;
XMM_Ret = XMM_MoveExtended(&MoveS);
if ( XMM_Ret < 0 )
Error("Move from Unlocked Extended Memory Failed", XMM_Ret);
if ( Cmp(BufferLow, BufferHi, MemPerHandle*512) )
printf("Comparison Failed, Unlocked Handle %x\n",
HandleTable[hi].Handle);
/* Check weird cases */
MoveS.Length = 1;
XMM_Ret = XMM_MoveExtended(&MoveS);
if ( XMSERROR(XMM_Ret) != (char)0xA7 )
Error("Move Extended with Odd Length", XMM_Ret);
MoveS.Length = MemPerHandle*1024L + 2;
XMM_Ret = XMM_MoveExtended(&MoveS);
if ( XMSERROR(XMM_Ret) != (char)0xA7 )
Error("Move Extended with Length too long", XMM_Ret);
MoveS.Length = MemPerHandle*1024L -2;
MoveS.SourceOffset = 4L;
XMM_Ret = XMM_MoveExtended(&MoveS);
if ( XMM_Ret >= 0 )
Error("Move Extended Base+Length too large", XMM_Ret);
XMM_Ret = XMM_FreeExtended(HandleTable[hi].Handle);
if ( XMM_Ret < 0 )
Error("Free of Extended Memory Failed", XMM_Ret);
XMM_Ret = XMM_MoveExtended(&MoveS);
if ( XMSERROR(XMM_Ret) != (char)0xA3 )
Error("Move Extended from Invalid Handle", XMM_Ret);
hi++;
}
TestWrap();
Exit_Test();
}
TestWrap()
{
long XMM_Ret;
printq("Try Moves from Wrap Area\n");
MoveS.Length = BUFLEN*2;
MoveS.SourceHandle = 0;
MoveS.SourceOffset = 0xFFFFF800L;
XMM_Ret = XMM_MoveExtended(&MoveS);
if ( XMM_Ret < 0 )
Error("Move Extended at end of Conventional", XMM_Ret);
MoveS.Length += 2;
XMM_Ret = XMM_MoveExtended(&MoveS);
if ( XMSERROR(XMM_Ret) != (char)0xA7 )
Error("Move Extended overflowing end of Conventional", XMM_Ret);
}
EnableA20()
{
long XMM_Ret;
printq("Enable A20: ");
XMM_Ret = XMM_EnableA20();
if ( XMM_Ret < 0 )
Error("A20 not enabled", XMM_Ret);
QueryA20();
}
DisableA20()
{
long XMM_Ret;
printq("Disable A20: ");
XMM_Ret = XMM_DisableA20();
if ( XMM_Ret < 0 )
Error("A20 not disabled", XMM_Ret);
QueryA20();
}
QueryA20()
{
long XMM_Ret;
printq("Query A20: ");
XMM_Ret = XMM_QueryA20();
if ( XMM_Ret == 1 )
printq("A20 Enabled\n");
else if ( XMM_Ret == 0 )
printq("A20 Disabled\n");
else
Error("Failed", XMM_Ret);
}
Fill(ptr, pattern, count)
int *ptr;
{
while ( count-- )
*ptr++ = pattern++;
}
Cmp(ptr1, ptr2, count)
int *ptr1, *ptr2;
{
while ( count-- )
if ( *ptr1++ != *ptr2++ )
return(1);
return(0);
}
printq(arg)
{
if ( !quiet )
printf(arg);
}
Error(string, code)
char *string;
long code;
{
if ( code < 0 ) {
code = XMSERROR(code);
printf("%s, Error Code %2x\n", string, (unsigned)code);
} else if ( !quiet )
printf("%s\n", string);
}
Exit_Test()
{
printf("\nXMM Test Completed\n");
exit(0);
}