dmolony-DiskBrowser/src/com/bytezone/diskbrowser/prodos/ProdosBitMapSector.java

75 lines
2.6 KiB
Java
Executable File

package com.bytezone.diskbrowser.prodos;
import java.awt.Dimension;
import com.bytezone.diskbrowser.disk.AbstractSector;
import com.bytezone.diskbrowser.disk.Disk;
import com.bytezone.diskbrowser.disk.DiskAddress;
// -----------------------------------------------------------------------------------//
class ProdosBitMapSector extends AbstractSector
// -----------------------------------------------------------------------------------//
{
private final ProdosDisk parent;
// ---------------------------------------------------------------------------------//
ProdosBitMapSector (ProdosDisk parent, Disk disk, byte[] buffer, DiskAddress da)
// ---------------------------------------------------------------------------------//
{
super (disk, buffer, da);
this.parent = parent;
}
// ---------------------------------------------------------------------------------//
@Override
public String createText ()
// ---------------------------------------------------------------------------------//
{
Dimension grid = parent.getGridLayout ();
// check range of bits for current block - so far I don't have a disk that needs
// more than a single block
int relativeBlock =
diskAddress.getBlockNo () - parent.getVolumeDirectoryHeader ().bitMapBlock;
int startBit = relativeBlock * 4096;
// int endBit = startBit + 4096;
if (startBit >= grid.width * grid.height)
return "This sector is not used - the physical file size makes it unnecessary";
int width = (grid.width - 1) / 8 + 1; // must be 1-4
StringBuilder text = getHeader ("Volume Bit Map Block");
if (false)
{
int block = 0;
for (int row = 0; row < grid.height; row++)
{
int offset = block / 8;
StringBuilder details = new StringBuilder ();
for (int col = 0; col < grid.width; col++)
details.append (parent.isSectorFree (block++) ? ". " : "X ");
addText (text, buffer, offset, width, details.toString ());
}
}
else
{
int startRow = relativeBlock * 512 / width;
int endRow = startRow + (512 / width);
int block = startBit;
int byteNo = 0;
// System.out.printf ("Start %d, end %d%n", startRow, endRow);
for (int row = startRow; row < endRow; row++)
{
StringBuilder details = new StringBuilder ();
for (int col = 0; col < grid.width; col++)
details.append (parent.isSectorFree (block++) ? ". " : "X ");
addText (text, buffer, byteNo, width, details.toString ());
byteNo += width;
}
}
text.deleteCharAt (text.length () - 1);
return text.toString ();
}
}