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

Read() public method

public Read ( int channel, byte &abyte ) : byte
channel int
abyte byte
return byte
        public override byte Read(int channel, ref byte abyte)
        {
            switch (chan_mode[channel])
            {
                case ChannelMode.CHMOD_COMMAND:
                    // TODO
                    //abyte = *error_ptr++;
                    //if (--error_len != 0)
                    //    return (byte)C64StatusCode.ST_OK;
                    //else
                    //{
                    //    set_error(ErrorCode1541.ERR_OK);
                    //    return (byte)C64StatusCode.ST_EOF;
                    //}

                case ChannelMode.CHMOD_FILE:
                    // Read next block if necessary
                    if (chan_buf[channel][0] != 0 && buf_len[channel] == 0)
                    {
                        if (!read_sector(chan_buf[channel][0], chan_buf[channel][1], chan_buf[channel]))
                            return (byte)C64StatusCode.ST_READ_TIMEOUT;

                        //buf_ptr[channel] = chan_buf[channel] + 2;
                        bufIndex[channel] = 2;

                        // Determine block length
                        buf_len[channel] = chan_buf[channel][0] != 0 ? 254 : (byte)chan_buf[channel][1] - 1;
                    }

                    if (buf_len[channel] > 0)
                    {
                        //abyte = *buf_ptr[channel]++;

                        abyte = chan_buf[channel][bufIndex[channel]];
                        bufIndex[channel] += 1;

                        //if (--buf_len[channel] == 0 && chan_buf[channel][0] == 0)
                        //    return (byte)C64StatusCode.ST_EOF;
                        //else
                        //    return (byte)C64StatusCode.ST_OK;

                        buf_len[channel] -= 1;
                        if (buf_len[channel] == 0 && chan_buf[channel][0] == 0)
                            return (byte)C64StatusCode.ST_EOF;
                        else
                            return (byte)C64StatusCode.ST_OK;
                    }
                    else
                        return (byte)C64StatusCode.ST_READ_TIMEOUT;

                case ChannelMode.CHMOD_DIRECTORY:
                case ChannelMode.CHMOD_DIRECT:
                    if (buf_len[channel] > 0)
                    {
                        //abyte = *buf_ptr[channel]++;
                        //if (--buf_len[channel] != 0)
                        //    return (byte)C64StatusCode.ST_OK;
                        //else
                        //    return (byte)C64StatusCode.ST_EOF;

                        abyte = chan_buf[channel][bufIndex[channel]];
                        bufIndex[channel] += 1;

                        buf_len[channel] -= 1;
                        if (buf_len[channel] != 0)
                            return (byte)C64StatusCode.ST_OK;
                        else
                            return (byte)C64StatusCode.ST_EOF;

                    }
                    else
                        return (byte)C64StatusCode.ST_READ_TIMEOUT;
            }

            return (byte)C64StatusCode.ST_READ_TIMEOUT;

            //// TEMP!
            //return (byte)1;
        }