#include #include int __doalloc( unsigned size ); #pragma aux __doalloc = \ "mov ah, 0x48" \ "int 0x21" \ "jnc finish" \ "sbb ax, ax" \ "finish:" \ parm [bx] \ value [ax] \ modify [ax bx]; unsigned _dos_allocmem( unsigned size, unsigned *seg ) { register int retval = __doalloc( size ); if( retval < 0 ) { errno = ENOMEM; return( ( _doserrno = -retval ) ); } *seg = retval; return( 0 ); } @@ end of dallcmem.c #include #include static unsigned __malloc_ds = 0; void *malloc( size_t bytes ) { unsigned segm; if( __malloc_ds == 0 ) { char *p; __malloc_ds = FP_SEG( ( char far * )p ); /* DS will be the segment of a char * cast to a char far * */ } if( _dos_allocmem( bytes, &segm ) != 0 ) return( NULL ); segm = ( segm - __malloc_ds ) * 16; if( segm > ( 0xFFFF - segm ) ) { /* Can't be a near pointer */ free( ( void * )segm ); return( NULL ); } return( ( void * )segm ); } void free( void *buf ) { _dos_freemem( ( ( unsigned )buf / 16 ) + __malloc_ds ); }