C64Lib.Core.D64Drive.OpenDirectory C# (CSharp) Method

OpenDirectory() private method

private OpenDirectory ( byte pattern ) : byte
pattern byte
return byte
        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;
        }