static void init( void ) /**********************/ { __lfn_rm_tb_selector = __alloc_dos_tb( TOTAL_RM_TB_SIZE_PARA, (unsigned short *)&__lfn_rm_tb_segment ); if( __lfn_rm_tb_selector == 0 ) { __fatal_runtime_error( "Unable to allocate LFN real mode transfer buffer", -1 ); } *(long *)&__lfn_rm_tb_linear = TinyDPMIBase( __lfn_rm_tb_selector ); }
static void *RationalAlloc( size_t size ) { dpmi_hdr *dpmi; mheapptr mhp; tiny_ret_t save_DOS_block; tiny_ret_t DOS_block; __FreeDPMIBlocks(); /* size is a multiple of 4k */ dpmi = TinyDPMIAlloc( size ); if( dpmi != NULL ) { mhp = (mheapptr)( dpmi + 1 ); mhp->len = size - sizeof( dpmi_hdr ); dpmi->dos_seg_value = 0; // indicate DPMI block return( (void *)mhp ); } if( __minreal & 0xfff00000 ) { /* checks for users that want >1M real memory saved */ __minreal = 0xfffff; } if( size > 0x00010000 ) { /* cannot allocate more than 64k from DOS real memory */ return( NULL ); } save_DOS_block = TinyAllocBlock( __ROUND_DOWN_SIZE_TO_PARA( __minreal ) | 1 ); if( TINY_OK( save_DOS_block ) ) { DOS_block = TinyAllocBlock( __ROUND_DOWN_SIZE_TO_PARA( size ) ); TinyFreeBlock( save_DOS_block ); if( TINY_OK( DOS_block ) ) { dpmi = (dpmi_hdr *)TinyDPMIBase( DOS_block ); dpmi->dos_seg_value = DOS_block; mhp = (mheapptr)( dpmi + 1 ); mhp->len = size - sizeof( dpmi_hdr ); return( (void *)mhp ); } } return( NULL ); }