ftp.nice.ch/pub/next/developer/languages/c/djgpp-NS.s.tar.gz#/djgpp/go32/xms.h

This is xms.h in view mode; [Download] [Up]

/*
** xms.h -- C bindings for xms API
** Author: Kent Williams william@umaxc.weeg.uiowa.edu
**
** This is an attempt to provide a complete C binding
** for the XMS calls.
**
** All calls will store the error code in xms_error.  I have
** tried to document how the calls work in this file where their
** prototypes are given.
*/
#ifndef __XMS_H
#define __XMS_H

/*
** extended memory block types
*/
typedef unsigned short emb_size_K_t;
typedef unsigned long  emb_off_t;
typedef short emb_handle_t;

/*
** upper memory block types.
*/
typedef unsigned short umb_segment_t;
typedef unsigned short umb_size_t;

/*
** structure defining information returned
** from xms_query_extended_memory
*/
typedef struct _xms_extended_info {
	emb_size_K_t max_free_block;
	emb_size_K_t total_extended_memory;
} xms_extended_info;

/*
** structure defining information returned
** from xms_get_version_info
*/
typedef struct _xms_version_info {
	unsigned xms_ver;
	unsigned xmm_ver;
	unsigned hma_present;
} xms_version_info;

/*
** structure defining information returned from
** xms_get_emb_handle_info
*/
typedef struct _emb_handle_info {
	unsigned char lock_count;
	unsigned char handles_available;
	emb_size_K_t block_size;
} emb_handle_info;

/*
** move parameter block for extended memory moves.
*/
typedef struct _xms_move_param {
	emb_off_t length;
	emb_handle_t source_handle;
	emb_off_t source_offset;
	emb_handle_t dest_handle;
	emb_off_t dest_offset;
} xms_move_param;

/*
** upper memory block info blockblock
*/
typedef struct _umb_info {
	umb_segment_t segment;
	umb_size_t block_size;
} umb_info;

extern char xms_error;
/*
** xms error codes
*/
#define XMS_NOT_IMPLEMENTED		0x80
#define XMS_VDISK_DETECTED		0x81
#define XMS_A20_ERROR			0x82
#define XMS_DRIVER_ERROR		0x8e
#define XMS_FATAL_DRIVER_ERROR	0x8f
#define XMS_NO_HMA				0x90
#define XMS_HMA_INUSE			0x91
#define XMS_HMA_DX_TOO_SMALL	0x92
#define XMS_HMA_NOT_ALLOCATED	0x93
#define XMS_A20_STILL_ENABLED	0x94
#define XMS_EXT_NO_MEM			0xa0
#define XMS_EXT_NO_HANDLES		0xa1
#define XMS_EXT_BAD_HANDLE		0xa2
#define XMS_EXT_BAD_SRC_HANDLE	0xa3
#define XMS_EXT_BAD_SRC_OFFSET	0xa4
#define XMS_EXT_BAD_DST_HANDLE	0xa5
#define XMS_EXT_BAD_DST_OFFSET	0xa6
#define XMS_EXT_BAD_LENGTH		0xa7
#define XMS_EXT_OVERLAP			0xa8
#define XMS_EXT_PARITY			0xa9
#define XMS_EXT_NOT_LOCKED		0xaa
#define XMS_EXT_LOCKED			0xab
#define XMS_EXT_NO_LOCKS		0xac
#define XMS_EXT_LOCK_FAILED		0xad
#define XMS_UMB_SMALLER_AVAIL	0xb0
#define XMS_UMB_NO_MEM			0xb1
#define XMS_UMB_BAD_SEG			0xb2

int xms_installed(void);

/* xms function 00H 
** returns pointer to static info block
*/
xms_version_info * xms_get_version_info(void);

/* xms function 01H
** returns 0 on success, non-zero on failure
** if it succeeds, the address of the hma is 0xffff:0010H
** the size parameter is screwy; it is documented to be 0xffff for an
** application,or the actual size needed for a driver.
*/
int xms_hma_allocate(unsigned size);

/* xms function 02H
** returns 0 on success, non-zero on failure
*/
int xms_hma_free(void);

/*
** The following functions diddle the A20 address line.  A20 has to
** be enabled in order to address memory > 1Mbyte, i.e. the HMA
** You are supposed to use the global functions if you are 'the owner'
** of the HMA, the local functions if you are not. You own the HMA
** if your call to xms_hma_allocate succeeded.
** The distinction between global and local aren't really explained
** in the stuff I have;  my inclination would be to try to get the hma
** with xms_hma_allocate and then just use the global functions.
*/
/* xms function 03H */
int xms_global_enable_a20(void);
/* xms function 04H */
int xms_global_disable_a20(void);
/* xms function 05H */
int xms_local_enable_a20(void);
/* xms function 06H */
int xms_local_disable_a20(void);

/* xms function 07H
** returns 1 if the line is enabled, 0 if it isn't.
** actually (!xms_a20_status && !xms_error) would indicate disabled
** status; if the error is non-zero, then the call failed for some screwy
** reason
*/
int xms_a20_status(void);

/* xms function 08H
** this call returns a pointer to a static info area
*/
xms_extended_info *xms_query_extended_memory(void);

/* xms function 09H
** returns an emb handle, or -1 if allocation fails
*/
int xms_emb_allocate(emb_size_K_t size);

/* xms function 0AH
** returns 0 on success non-zero on failure
*/
int xms_emb_free(emb_handle_t handle);

/* xms function 0BH
** returns 0 on success non-zero on failure
*/
int xms_move_emb(xms_move_param *x);

/* xms function 0CH
** returns 32 bit linear address of emb specified by handle,
** 0 otherwise.
*/
emb_off_t xms_lock_emb(emb_handle_t handle);

/* xms function 0DH
** returns 0 on success non-zero on failure
*/
int xms_unlock_emb(emb_handle_t handle);

/* xms function 0EH
** returns poitner to static information buffer, or null on failure
*/
emb_handle_info *xms_get_emb_handle_info(emb_handle_t handle);

/* xms function 0FH
** returns 0 on success, non-zero on failure
*/
int xms_emb_resize(emb_handle_t handle,emb_size_K_t size);

/* xms function 10H 
** returns pointer to static umb info block, or NULL
** if call fails
*/
umb_info * xms_umb_allocate(umb_size_t size);

/* xms function 11H 
** returns 0 on success, non-zero on failure
*/
int xms_umb_free(umb_segment_t segment);

#endif /* XMS_H */

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.