private static void showStorage (int indent, Rio500 rio, boolean external)
    throws IOException
    {
	Rio500.MemoryStatus	mem;
	int			temp;

	indentLine (indent, external ? "SmartMedia" : "Built-in Memory");
	indent += 2;

	temp = rio.getFreeMemory (external);
	indentLine (indent, "Available Memory in bytes:  "
		+ (temp / (1024 * 1024))
		+ "."
		+ ((10 * (temp % (1024 * 1024))) / (1024 * 1024))
		+ " MB, "
		);
	mem = rio.getMemoryStatus (external);
	temp = mem.getBlockCount ();
	if (temp != 0)
	    temp = ((temp - mem.getNumUnusedBlocks ()) * 100) / temp;
	else
	    temp = 1000;

	indentLine (indent, "Memory status: "
	    + mem.getBlockCount () + " Blocks, "
	    + mem.getBlockSize () + " bytes each, "
	    + mem.getNumUnusedBlocks () + " blocks unused "
	    + temp + "% full "
	    );
	indentLine (indent, "First free block at 0x"
		+ Integer.toHexString (mem.getFirstFreeBlock ())
		);

	// dump folders and their contents
	Rio500.FolderEntry	folders [] = rio.getFolders (external);

	for (int i = 0; i < folders.length; i++) {
	    Rio500.FolderEntry	f = folders [i];

	    indentLine (indent, "Folder # "
		    + i
		    + ", offset = 0x"
		    + Integer.toHexString (f.getOffset ())
		    + ", name1 = "
		    + f.getName1 ()
		    // + ", name2 = "
		    // + f.getName2 ()
		    + ", entries = "
		    + f.getSongCount ()
		    );
	    indent += 2;
	    try {
		Rio500.SongEntry	songs [] = f.getSongs ();

		for (int j = 0; j < songs.length; j++) {
		    Rio500.SongEntry	s = songs [j];
		    indentLine (indent, "Song # "
			+ j
			+ ", offset = 0x"
			+ Integer.toHexString (s.getOffset ())
			+ ", kbytes = "
			+ (s.getLength () / 1024)
			);
		    indentLine (indent + 4, "name1 = "
			+ s.getName1 ()
			// + ", name2 = "
			// + s.getName2 ()
			);
		}
	    } catch (Exception e) {
		e.printStackTrace ();
	    }
	    indent -= 2;
	}
    }