Compare commits

..

No commits in common. "3f2f1bfbca5476ea0cbf87f1acc0dd4dfaabf4ab" and "6f943ae8c2f17342708270bc0bdc75084631c7a8" have entirely different histories.

View File

@ -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;
} }
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//