78 lines
1.4 KiB
C
78 lines
1.4 KiB
C
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
trackbuf.c
|
|
|
|
Abstract:
|
|
|
|
Routine to allocate a buffer suitable for i/o a track
|
|
at a time.
|
|
|
|
Author:
|
|
|
|
Ted Miller (tedm) 29-May-1997
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <mytypes.h>
|
|
#include <misclib.h>
|
|
|
|
#include <malloc.h>
|
|
|
|
|
|
BOOL
|
|
_far
|
|
AllocTrackBuffer(
|
|
IN BYTE SectorsPerTrack,
|
|
OUT FPVOID _far *AlignedBuffer,
|
|
OUT FPVOID _far *Buffer
|
|
)
|
|
{
|
|
FPVOID p;
|
|
ULONG u;
|
|
|
|
//
|
|
//
|
|
// We allocate twice the size we need because we will need to ensure
|
|
// that the buffer doesn't cross a 64K physical boundary.
|
|
// NOTE: sectors per track is assumed to be max 63!
|
|
//
|
|
if(SectorsPerTrack > 63) {
|
|
return(FALSE);
|
|
}
|
|
|
|
p = malloc(SectorsPerTrack * 512 * 2);
|
|
if(!p) {
|
|
return(FALSE);
|
|
}
|
|
|
|
//
|
|
// Calculate physical address of buffer.
|
|
//
|
|
u = ((ULONG)p & 0xffffL) + (((ULONG)p >> 16) << 4);
|
|
|
|
//
|
|
// Figure out whether the buffer crosses a 64k boundary.
|
|
// If it does, we allocated enough to relocate it
|
|
// to the next 64k boundary.
|
|
//
|
|
if((u & 0xf0000L) != ((u + (512*SectorsPerTrack)) & 0xf0000L)) {
|
|
|
|
u = (u & 0xf0000L) + 0x10000;
|
|
}
|
|
|
|
//
|
|
// Convert back to seg:offset. The conversion guarantees that
|
|
// the offset will be in the range 0-f.
|
|
//
|
|
*AlignedBuffer = (FPVOID)(((u >> 4) << 16) + (u & 0xf));
|
|
*Buffer = p;
|
|
|
|
return(TRUE);
|
|
}
|