byte OpenDirectory(byte[] pattern)
{
int i, j, n, m;
//byte* p, q;
int pIndex;
Directory dir;
DirEntry de;
byte c;
//byte* tmppat;
// Special treatment for "$0"
if (pattern[0] == '0' && pattern[1] == 0)
{
// TODO!
//pattern += 1;
}
// Skip everything before the ':' in the pattern
// TODO
//if ((tmppat = CharFunctions.strchr(pattern, ':')) != null)
// pattern = tmppat + 1;
int channelBuffer = 0;
AllocateChannelBuffer(channelBuffer, 8192);
//p = buf_ptr[0] = chan_buf[0];
pIndex = 0;
chan_mode[0] = ChannelMode.CHMOD_DIRECTORY;
// Create directory title
chan_buf[channelBuffer][pIndex++] = 0x01; // Load address $0401 (from PET days :-)
chan_buf[channelBuffer][pIndex++] = 0x04;
chan_buf[channelBuffer][pIndex++] = 0x01; // Dummy line link
chan_buf[channelBuffer][pIndex++] = 0x01;
chan_buf[channelBuffer][pIndex++] = 0; // Drive number (0) as line number
chan_buf[channelBuffer][pIndex++] = 0;
chan_buf[channelBuffer][pIndex++] = 0x12; // RVS ON (reverse text)
chan_buf[channelBuffer][pIndex++] = (byte)'\"';
for (i = 0; i < 16; i++)
{
chan_buf[channelBuffer][pIndex++] = ReplaceSpace(bam.disk_name[i]);
//if ((c = bam.disk_name[i]) == 0xa0)
// chan_buf[channelBuffer][pIndex++] = (byte)' '; // Replace 0xa0 by space
//else
// chan_buf[channelBuffer][pIndex++] = c;
}
chan_buf[channelBuffer][pIndex++] = ReplaceSpace(bam.pad_name[0]);
chan_buf[channelBuffer][pIndex++] = ReplaceSpace(bam.pad_name[1]);
chan_buf[channelBuffer][pIndex++] = ReplaceSpace(bam.id[0]);
chan_buf[channelBuffer][pIndex++] = ReplaceSpace(bam.id[1]);
chan_buf[channelBuffer][pIndex++] = ReplaceSpace(bam.pad1);
chan_buf[channelBuffer][pIndex++] = ReplaceSpace(bam.fmt_char[0]);
chan_buf[channelBuffer][pIndex++] = ReplaceSpace(bam.fmt_char[1]);
//*(p - 7) = (byte)'\"';
chan_buf[channelBuffer][pIndex - 7] = (byte)'\"';
//*p++ = 0;
chan_buf[channelBuffer][pIndex++] = 0;
// Scan all directory blocks
byte[] buffer = Directory.AllocateBuffer();
byte nextTrack = bam.dir_track;
byte nextSector = bam.dir_sector;
// Scan all directory blocks
while (nextTrack != 0)
{
if (!read_sector(nextTrack, nextSector, buffer))
return (byte)C64StatusCode.ST_OK;
dir = new Directory(buffer);
nextTrack = dir.next_track;
nextSector = dir.next_sector;
// Scan all 8 entries of a block
for (i = 0; i < 8; i++)
{
de = dir.Entries[i];
//string debugString = string.Format("Entry {0} : ", i);
if (de.type != 0 && match(pattern, de.name))
{
chan_buf[channelBuffer][pIndex++] = 0x01; // Dummy line link
chan_buf[channelBuffer][pIndex++] = 0x01;
chan_buf[channelBuffer][pIndex++] = de.num_blocks_l; // Line number
chan_buf[channelBuffer][pIndex++] = de.num_blocks_h;
chan_buf[channelBuffer][pIndex++] = (byte)' ';
n = (de.num_blocks_h << 8) + de.num_blocks_l;
if (n < 10) chan_buf[channelBuffer][pIndex++] = (byte)' ';
if (n < 100) chan_buf[channelBuffer][pIndex++] = (byte)' ';
chan_buf[channelBuffer][pIndex++] = (byte)'\"';
//q = de->name;
m = 0;
for (j = 0; j < 16; j++)
{
if ((c = de.name[j]) == 0xa0)
{
if (m != 0)
chan_buf[channelBuffer][pIndex++] = (byte)' '; // Replace all 0xa0 by spaces
else
m = chan_buf[channelBuffer][pIndex++] = (byte)'\"'; // But the first by a '"'
}
else
chan_buf[channelBuffer][pIndex++] = c;
//debugString += (char)chan_buf[channelBuffer][pIndex - 1];
}
if (m != 0)
chan_buf[channelBuffer][pIndex++] = (byte)' ';
else
chan_buf[channelBuffer][pIndex++] = (byte)'\"'; // No 0xa0, then append a space
if ((de.type & 0x80) != 0)
chan_buf[channelBuffer][pIndex++] = (byte)' ';
else
chan_buf[channelBuffer][pIndex++] = (byte)'*';
chan_buf[channelBuffer][pIndex++] = type_char_1[de.type & 0x0f];
chan_buf[channelBuffer][pIndex++] = type_char_2[de.type & 0x0f];
chan_buf[channelBuffer][pIndex++] = type_char_3[de.type & 0x0f];
if ((de.type & 0x40) != 0)
chan_buf[channelBuffer][pIndex++] = (byte)'<';
else
chan_buf[channelBuffer][pIndex++] = (byte)' ';
chan_buf[channelBuffer][pIndex++] = (byte)' ';
if (n >= 10) chan_buf[channelBuffer][pIndex++] = (byte)' ';
if (n >= 100) chan_buf[channelBuffer][pIndex++] = (byte)' ';
chan_buf[channelBuffer][pIndex++] = 0;
}
//System.Diagnostics.Debug.WriteLine(debugString);
}
}
// Final line
//q = p;
int q = pIndex;
for (i = 0; i < 29; i++)
chan_buf[channelBuffer][q++] = (byte)' ';
n = 0;
for (i = 0; i < 35; i++)
n += bam.bitmap[i * 4];
chan_buf[channelBuffer][pIndex++] = 0x01; // Dummy line link
chan_buf[channelBuffer][pIndex++] = 0x01;
chan_buf[channelBuffer][pIndex++] = (byte)(n & 0xff); // Number of free blocks as line number
chan_buf[channelBuffer][pIndex++] = (byte)((n >> 8) & 0xff);
chan_buf[channelBuffer][pIndex++] = (byte)'B';
chan_buf[channelBuffer][pIndex++] = (byte)'L';
chan_buf[channelBuffer][pIndex++] = (byte)'O';
chan_buf[channelBuffer][pIndex++] = (byte)'C';
chan_buf[channelBuffer][pIndex++] = (byte)'K';
chan_buf[channelBuffer][pIndex++] = (byte)'S';
chan_buf[channelBuffer][pIndex++] = (byte)' ';
chan_buf[channelBuffer][pIndex++] = (byte)'F';
chan_buf[channelBuffer][pIndex++] = (byte)'R';
chan_buf[channelBuffer][pIndex++] = (byte)'E';
chan_buf[channelBuffer][pIndex++] = (byte)'E';
chan_buf[channelBuffer][pIndex++] = (byte)'.';
//p = q;
//*p++ = 0;
//*p++ = 0;
//*p++ = 0;
pIndex = q;
chan_buf[channelBuffer][pIndex++] = 0;
chan_buf[channelBuffer][pIndex++] = 0;
chan_buf[channelBuffer][pIndex++] = 0;
//buf_len[0] = (int)(p - chan_buf[0]);
buf_len[0] = pIndex;
return (byte)C64StatusCode.ST_OK;
}