예제 #1
0
 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;
 }
예제 #2
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();
            }
        }