2020-02-09 13:13:33 +00:00
|
|
|
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 =
|
2020-04-10 23:47:52 +00:00
|
|
|
diskAddress.getBlockNo () - parent.getVolumeDirectoryHeader ().bitMapBlock;
|
2020-02-09 13:13:33 +00:00
|
|
|
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 ();
|
|
|
|
}
|
2015-06-01 09:35:51 +00:00
|
|
|
}
|