mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2024-06-27 23:29:37 +00:00
Compare commits
No commits in common. "3f2f1bfbca5476ea0cbf87f1acc0dd4dfaabf4ab" and "6f943ae8c2f17342708270bc0bdc75084631c7a8" have entirely different histories.
3f2f1bfbca
...
6f943ae8c2
|
@ -5,9 +5,6 @@ import static com.bytezone.diskbrowser.prodos.ProdosConstants.SAPLING;
|
||||||
import static com.bytezone.diskbrowser.prodos.ProdosConstants.SEEDLING;
|
import static com.bytezone.diskbrowser.prodos.ProdosConstants.SEEDLING;
|
||||||
import static com.bytezone.diskbrowser.prodos.ProdosConstants.TREE;
|
import static com.bytezone.diskbrowser.prodos.ProdosConstants.TREE;
|
||||||
|
|
||||||
// Assumptions:
|
|
||||||
// - file does not already exist
|
|
||||||
// - disk has no interleave
|
|
||||||
// -----------------------------------------------------------------------------------//
|
// -----------------------------------------------------------------------------------//
|
||||||
public class FileWriter
|
public class FileWriter
|
||||||
// -----------------------------------------------------------------------------------//
|
// -----------------------------------------------------------------------------------//
|
||||||
|
@ -40,7 +37,8 @@ public class FileWriter
|
||||||
|
|
||||||
while (dataPtr < this.eof)
|
while (dataPtr < this.eof)
|
||||||
{
|
{
|
||||||
int actualBlockNo = register (dataPtr / BLOCK_SIZE);
|
int actualBlockNo = allocateNextBlock ();
|
||||||
|
map (dataPtr / BLOCK_SIZE, actualBlockNo);
|
||||||
|
|
||||||
int bufferPtr = actualBlockNo * BLOCK_SIZE;
|
int bufferPtr = actualBlockNo * BLOCK_SIZE;
|
||||||
int transfer = Math.min (remaining, BLOCK_SIZE);
|
int transfer = Math.min (remaining, BLOCK_SIZE);
|
||||||
|
@ -55,7 +53,8 @@ public class FileWriter
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------//
|
// ---------------------------------------------------------------------------------//
|
||||||
void writeRecord (int recordNo, byte[] dataBuffer, int recordLength) throws DiskFullException
|
void writeRecord (int recordNo, byte[] dataBuffer, int recordLength)
|
||||||
|
throws DiskFullException
|
||||||
// ---------------------------------------------------------------------------------//
|
// ---------------------------------------------------------------------------------//
|
||||||
{
|
{
|
||||||
assert recordLength > 0;
|
assert recordLength > 0;
|
||||||
|
@ -104,8 +103,8 @@ public class FileWriter
|
||||||
switch (storageType)
|
switch (storageType)
|
||||||
{
|
{
|
||||||
case TREE:
|
case TREE:
|
||||||
actualBlockNo =
|
actualBlockNo = masterIndexBlock.get (logicalBlockNo / 0x100)
|
||||||
masterIndexBlock.get (logicalBlockNo / 0x100).getPosition (logicalBlockNo % 0x100);
|
.getPosition (logicalBlockNo % 0x100);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SAPLING:
|
case SAPLING:
|
||||||
|
@ -120,7 +119,10 @@ public class FileWriter
|
||||||
}
|
}
|
||||||
|
|
||||||
if (actualBlockNo == 0)
|
if (actualBlockNo == 0)
|
||||||
actualBlockNo = register (logicalBlockNo);
|
{
|
||||||
|
actualBlockNo = allocateNextBlock ();
|
||||||
|
map (logicalBlockNo, actualBlockNo);
|
||||||
|
}
|
||||||
|
|
||||||
return actualBlockNo;
|
return actualBlockNo;
|
||||||
}
|
}
|
||||||
|
@ -136,17 +138,14 @@ public class FileWriter
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------//
|
// ---------------------------------------------------------------------------------//
|
||||||
private int register (int logicalBlockNo) throws DiskFullException
|
private void map (int logicalBlockNo, int actualBlockNo) throws DiskFullException
|
||||||
// ---------------------------------------------------------------------------------//
|
// ---------------------------------------------------------------------------------//
|
||||||
{
|
{
|
||||||
int nextBlockNo = allocateNextBlock ();
|
|
||||||
|
|
||||||
if (logicalBlockNo >= 0x100) // potential TREE
|
if (logicalBlockNo >= 0x100) // potential TREE
|
||||||
{
|
{
|
||||||
if (storageType != TREE)
|
if (storageType != TREE)
|
||||||
{
|
{
|
||||||
masterIndexBlock = new MasterIndexBlock (nextBlockNo);
|
masterIndexBlock = new MasterIndexBlock (allocateNextBlock ());
|
||||||
nextBlockNo = allocateNextBlock ();
|
|
||||||
|
|
||||||
if (storageType == SAPLING) // sapling -> tree
|
if (storageType == SAPLING) // sapling -> tree
|
||||||
{
|
{
|
||||||
|
@ -154,9 +153,7 @@ public class FileWriter
|
||||||
}
|
}
|
||||||
else if (storageType == SEEDLING) // seedling -> sapling -> tree
|
else if (storageType == SEEDLING) // seedling -> sapling -> tree
|
||||||
{
|
{
|
||||||
indexBlock = new IndexBlock (nextBlockNo);
|
indexBlock = new IndexBlock (allocateNextBlock ());
|
||||||
nextBlockNo = allocateNextBlock ();
|
|
||||||
|
|
||||||
indexBlock.setPosition (0, keyPointer);
|
indexBlock.setPosition (0, keyPointer);
|
||||||
masterIndexBlock.set (0, indexBlock);
|
masterIndexBlock.set (0, indexBlock);
|
||||||
}
|
}
|
||||||
|
@ -166,51 +163,48 @@ public class FileWriter
|
||||||
indexBlock = null;
|
indexBlock = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
getIndexBlock (logicalBlockNo / 0x100).setPosition (logicalBlockNo % 0x100, nextBlockNo);
|
getIndexBlock (logicalBlockNo / 0x100).setPosition (logicalBlockNo % 0x100,
|
||||||
|
actualBlockNo);
|
||||||
}
|
}
|
||||||
else if (logicalBlockNo > 0) // potential SAPLING
|
else if (logicalBlockNo > 0) // potential SAPLING
|
||||||
{
|
{
|
||||||
if (storageType == TREE) // already a tree
|
if (storageType == TREE) // already a tree
|
||||||
{
|
{
|
||||||
getIndexBlock (0).setPosition (logicalBlockNo, nextBlockNo);
|
getIndexBlock (0).setPosition (logicalBlockNo, actualBlockNo);
|
||||||
}
|
}
|
||||||
else if (storageType == SAPLING) // already a sapling
|
else if (storageType == SAPLING) // already a sapling
|
||||||
{
|
{
|
||||||
indexBlock.setPosition (logicalBlockNo, nextBlockNo);
|
indexBlock.setPosition (logicalBlockNo, actualBlockNo);
|
||||||
}
|
}
|
||||||
else // new file or already a seedling
|
else // new file or already a seedling
|
||||||
{
|
{
|
||||||
indexBlock = new IndexBlock (nextBlockNo);
|
indexBlock = new IndexBlock (allocateNextBlock ());
|
||||||
nextBlockNo = allocateNextBlock ();
|
|
||||||
|
|
||||||
if (storageType == SEEDLING) // seedling -> sapling
|
if (storageType == SEEDLING) // seedling -> sapling
|
||||||
indexBlock.setPosition (0, keyPointer);
|
indexBlock.setPosition (0, keyPointer);
|
||||||
|
|
||||||
keyPointer = indexBlock.blockNo;
|
keyPointer = indexBlock.blockNo;
|
||||||
storageType = SAPLING;
|
storageType = SAPLING;
|
||||||
indexBlock.setPosition (logicalBlockNo, nextBlockNo);
|
indexBlock.setPosition (logicalBlockNo, actualBlockNo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (logicalBlockNo == 0) // potential SEEDLING
|
else if (logicalBlockNo == 0) // potential SEEDLING
|
||||||
{
|
{
|
||||||
if (storageType == TREE) // already a tree
|
if (storageType == TREE) // already a tree
|
||||||
{
|
{
|
||||||
getIndexBlock (0).setPosition (0, nextBlockNo);
|
getIndexBlock (0).setPosition (0, actualBlockNo);
|
||||||
}
|
}
|
||||||
else if (storageType == SAPLING) // already a sapling
|
else if (storageType == SAPLING) // already a sapling
|
||||||
{
|
{
|
||||||
indexBlock.setPosition (0, nextBlockNo);
|
indexBlock.setPosition (0, actualBlockNo);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
keyPointer = nextBlockNo;
|
keyPointer = actualBlockNo;
|
||||||
storageType = SEEDLING;
|
storageType = SEEDLING;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
System.out.println ("Error: " + logicalBlockNo);
|
System.out.println ("Error: " + logicalBlockNo);
|
||||||
|
|
||||||
return nextBlockNo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------//
|
// ---------------------------------------------------------------------------------//
|
||||||
|
|
Loading…
Reference in New Issue
Block a user