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); }