예제 #1
0
        public static void Read(ushort unit, ushort address, short addressOffset, ushort len, ushort blockNo)
        {
            var offset = blockNo * 512u;
            var track  = blockNo / 8;
            var sector = (blockNo & 7) * 2;

            Debug.Assert(unit < DiskIO.MaxUnits);
            var u = DiskIO.unitTable[unit];

            if (u == null || u.Fd == null && u.Data == null)
            {
                PSystem.IOError(9);
                return;
            }
            if (offset + len > u.Size)
            {
                PSystem.IOError(64);
                return;
            }

            while (len != 0)
            {
                var size = 256;
                var sec  = sector;
                if (len < size)
                {
                    size = len;
                }
                //if (u.Translate != null)
                //    sec = u.Translate[sector];
                int i;
                if (u.Data != null)
                {
                    for (i = 0; i < size; i++)
                    {
                        Memory.WriteByte
                        (
                            address,
                            (short)(addressOffset + i),
                            u.Data[(track * 16 + sec) * 256 + i]
                        );
                    }
                }
                else if (u.Fd != null)
                {
                    var  buf = new byte[256];
                    bool failed;
                    try
                    {
                        u.Fd.Seek((track * 16 + sec) * 256, SeekOrigin.Begin);
                        failed = u.Fd.Read(buf, 0, size) < size;
                    }
                    catch
                    {
                        failed = true;
                    }

                    if (failed)
                    {
                        PSystem.IOError(64);
                        return;
                    }

                    for (i = 0; i < size; i++)
                    {
                        Memory.WriteByte(address, (short)(addressOffset + i), buf[i]);
                    }
                }

                addressOffset += (short)size;
                len           -= (ushort)size;
                sector++;
                if (sector < 16)
                {
                    continue;
                }
                track++;
                sector = 0;
            }
            PSystem.IOError(0);
        }