public void RDS() /* Read Select*/ { if (f == null) { eof = true; } else { int r = f.ReadRecord(out bool binary, out byte[] mrecord); if (r < 1) { eof = true; if (cardwasread) { if (Io704.Config.LogIO != null) { Io704.LogIO.WriteLine("Card Reader empty"); } Io704.Flush(); Console.Error.WriteLine("Card Reader empty"); CPU704.halt = true; CPU704.repeat = true; cardwasread = false; } } else { if (Io704.Config.LogIO != null) { Io704.LogIO.WriteLine("Card {0} read", f.NumOfRecords()); } cardwasread = true; if (!binary || mrecord.Length != 160) { throw new InvalidDataException("invalid cbn record on Card Reader"); } CBNConverter.FromCBN(mrecord, out RRecord); eof = false; } } ReadActive = true; PosInRecord = 0; }
int PosInRecord; /* index in RRecord for next read word */ void EndRW() /* finish current reading or writing operation */ { if (ReadActive) { RRecord = null; ReadActive = false; if (Io704.Config.LogIO != null) { Io704.LogIO.WriteLine("Tape {0} end read", unit); } } if (WriteActive) { byte[] tr = new byte[WRecord.Count * 6]; int i = 0; foreach (long w in WRecord) { long wt = w; for (int j = i + 5; j >= i; j--) { tr[j] = (byte)(wt & 0x3F); wt >>= 6; } i += 6; } f.WriteRecord(wbin, tr); if (Io704.Config.LogIO != null) { Io704.LogIO.WriteLine("Tape {0}: {1} record {2} with length {3} written", unit, wbin ? "binary" : "BCD", f.NumOfRecords(), WRecord.Count); } WriteActive = false; WRecord.Clear(); } }