add: TRACE(("BIOS reads %lu bytes from %Ld (offset = %lu), drive %ld\n", blocksLeft * fBlockSize, pos * fBlockSize, offset, fDriveID));
context: BIOSDrive::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize){	//printf("read %lu bytes from %Ld\n", bufferSize, pos);	int32 totalBytesRead = 0;	// ToDo: convert query to blocks correctly	uint32 offset = pos % fBlockSize;	pos /= fBlockSize;	uint32 blocksLeft = (bufferSize + offset + fBlockSize - 1) / fBlockSize;	//printf("   really reads %lu bytes from %Ld (offset = %lu)\n",	//	blocksLeft * fBlockSize, pos * fBlockSize, offset);	uint32 scratchSize = 24 * 1024 / fBlockSize;		// maximum value allowed by Phoenix BIOS is 0x7f	while (blocksLeft > 0) {		uint32 blocksRead;		if (fLBA) {			struct disk_address_packet *packet = (disk_address_packet *)kDataSegmentScratch;			memset(packet, 0, sizeof(disk_address_packet));			blocksRead = blocksLeft;			if (blocksRead > scratchSize)				blocksRead = scratchSize;			packet->size = sizeof(disk_address_packet);			packet->number_of_blocks = blocksRead;			packet->buffer = kExtraSegmentScratch;			packet->lba = pos;			struct bios_regs regs;			regs.eax = BIOS_EXT_READ;			regs.edx = fDriveID;			regs.esi = (addr_t)packet - kDataSegmentBase;			call_bios(0x13, &regs);			if (regs.flags & CARRY_FLAG)				goto chs_read;		} else {	chs_read:			// ToDo: Left to be done!			return B_ERROR;		}		uint32 bytesRead = fBlockSize * blocksRead;		// copy no more than bufferSize bytes		if (bytesRead > bufferSize)			bytesRead = bufferSize;		memcpy(buffer, (void *)(kExtraSegmentScratch + offset), bytesRead);		pos += blocksRead;		blocksLeft -= blocksRead;		bufferSize -= bytesRead;		buffer = (void *)((addr_t)buffer + bytesRead);		totalBytesRead += bytesRead;	}	return totalBytesRead;}