int cmd_ls(char dir[])
{

kol_struct70	k70;
unsigned	*n;
unsigned	num_of_file; // number of files in directory
unsigned	*t;
unsigned	type_of_file; // check is this a file or a folder
int		i, result;

bool single_column_mode = FALSE;


k70.p00 = 1;
k70.p04 = 0;
//k70.p08 = 0;
k70.p12 = 2;  // just for test exist & read number of entries
k70.p16 =  (unsigned) malloc(32+k70.p12*560);
k70.p20 = 0;


if (!strnicmp(dir,"-1",1)) 
	{
	single_column_mode = TRUE;
	dir += 3;
	}

if ( !strlen(dir) )
	k70.p21 = cur_dir;
else
	k70.p21 = dir;

result = kol_file_70(&k70);
if ( !((result==0) || (result==6)) ) // check does the directory exists
	{
	free( (void*) k70.p16);
	return FALSE;
	}

n =  (unsigned*) (k70.p16+8);
num_of_file = *n;

// now read full directory
k70.p12 = num_of_file;  
free( (void*) k70.p16);
k70.p16 =  (unsigned) malloc(32+k70.p12*560);
if ( !k70.p16 )
	return FALSE;
	
result = kol_file_70(&k70);
if ( !((result==0) || (result==6)) ) 
	{
	free( (void*) k70.p16);
	return FALSE;
	}

// if there was '-1' param, then show single column mode
// otherwise show files in several columns
if (single_column_mode == TRUE)
{
_SINGLE_COLUMN_MODE:
	for (i = 0; i < num_of_file; i++)
	{
	printf ("  %s", k70.p16+32+40+(264+40)*i);
	t =  (unsigned*) (k70.p16+32+(264+40)*i);
	type_of_file = *t;
	if ( (0x10 == (type_of_file&0x10)) || (8 == (type_of_file&8)) )
		printf ("/");
	printf ("\n\r");
	}
}
else
{
	int longest_name_len = 0;
	int console_window_width = 78; //need to get this value from console.obj if it's possible
	for (i = 0; i < num_of_file; i++)
		{
		int current_name_len;
		current_name_len = strlen( (char*)k70.p16+32+40+(264+40)*i);
		if (current_name_len > longest_name_len) longest_name_len = current_name_len;
		}

	longest_name_len+=2; //consider space separator and '/' symbol for folders
	int columns_max = console_window_width / longest_name_len;

	if (longest_name_len >= console_window_width) goto _SINGLE_COLUMN_MODE; //there was too long filename

	for (i = 0; i < num_of_file; i++)
		{
		char cur_file[2048];
		strncpy(cur_file, (char*)k70.p16+32+40+(304)*i, sizeof(cur_file)-2);

		t =  (unsigned*) (k70.p16+32+(304)*i);
		type_of_file = *t;

		if ( (0x10 == (type_of_file&0x10)) || (8 == (type_of_file&8)) ) strcat(cur_file, "/");

		printf ("%*s", -longest_name_len, cur_file);

		if ((i>0) && ((i+1)%columns_max == 0)) printf ("\n\r");
		}	
	if ((i)%columns_max != 0) printf("\n\r");
}

free((void*)k70.p16);
return TRUE;
}