예제 #1
0
        private void DumpTrack(int cylinder, int head)
        {
            SA1000Drive drive = _system.HardDrive;

            int  sector    = 0;
            int  wordIndex = 0;
            uint data      = 0;

            List <uint> sectorData = new List <uint>();

            // Print lead-in to first sector
            while (wordIndex < drive.WordsPerTrack)
            {
                data = drive.DebugRead(cylinder, head, wordIndex);
                wordIndex++;

                if (data == 0x1a141)
                {
                    break;
                }
                else
                {
                    sectorData.Add(data);
                }
            }

            WriteLine("Lead-in to sector 0:");
            PrintSectorData(sectorData);

            sectorData.Clear();

            // Print sector data
            while (wordIndex < drive.WordsPerTrack)
            {
                data = drive.DebugRead(cylinder, head, wordIndex);
                wordIndex++;

                if (data == 0x1a141 || wordIndex == drive.WordsPerTrack - 1)
                {
                    WriteLine(String.Format("Sector {0}:", sector));
                    PrintSectorData(sectorData);
                    sectorData.Clear();

                    sector++;
                }
                else
                {
                    sectorData.Add(data);
                }
            }
        }
예제 #2
0
        public DSystem()
        {
            _scheduler = new Scheduler();

            _cp  = new CentralProcessor(this);
            _iop = new IOProcessor(this);
            _memoryController   = new MemoryController();
            _displayController  = new DisplayController(this);
            _hardDrive          = new SA1000Drive(this);
            _shugartController  = new ShugartController(this, _hardDrive);
            _ethernetController = new EthernetController(this);

            try
            {
                _frameTimer = new FrameTimer(38.7);
            }
            catch
            {
                // Not supported on this platform.
                _frameTimer = null;
            }
        }
예제 #3
0
        private void AnalyzeDisk()
        {
            SA1000Drive drive = _system.HardDrive;

            WriteLine(String.Format("Drive is type {0}", drive.Type));

            for (int cylinder = 0; cylinder < drive.Geometry.Cylinders; cylinder++)
            {
                for (int head = 0; head < drive.Geometry.Heads; head++)
                {
                    int sector = -1;
                    int field  = 0;

                    for (int word = 0; word < drive.WordsPerTrack; word++)
                    {
                        //
                        // Walk the track, looking for sector marks.
                        // There should be 16 sets of:
                        //  - Header mark
                        //  - Label mark
                        //  - Data mark
                        //  - CRC mark
                        // In exactly that order
                        //
                        // Verify the header data
                        //
                        uint data          = drive.DebugRead(cylinder, head, word);
                        bool isAddressMark = (data & 0x10000) != 0;
                        bool isCRC         = (data & 0x20000) != 0;

                        switch (field)
                        {
                        case 0:
                            if (data == 0x1a141)        // header
                            {
                                // This is the header mark, increment the sector count
                                // move to next field.
                                sector++;
                                field++;
                            }
                            else if (data == 0x1a143)       // label / data
                            {
                                // Unexpected here.
                                WriteLine(String.Format("Unexpected label/data mark before header mark at c/h/s (w) {0}/{1}/{2} ({3})",
                                                        cylinder,
                                                        head,
                                                        sector,
                                                        word));
                            }
                            else if (data == 0x2beef)
                            {
                                /*
                                 * // Unexpected here.
                                 * WriteLine(String.Format("Unexpected CRC before header mark at c/h/s (w) {0}/{1}/{2} ({3})",
                                 *  cylinder,
                                 *  head,
                                 *  sector,
                                 *  word)); */
                            }
                            break;

                        case 1:
                            if (data == 0x1a143)        // label / data
                            {
                                // This is the label mark, move to next field.
                                field++;
                            }
                            else if (data == 0x1a141)       // header
                            {
                                // Unexpected header mark here.
                                WriteLine(String.Format("Unexpected header mark after header mark at c/h/s (w) {0}/{1}/{2} ({3})",
                                                        cylinder,
                                                        head,
                                                        sector,
                                                        word));
                            }
                            else if (data == 0x2beef)
                            {
                                /*
                                 * // Unexpected here.
                                 * WriteLine(String.Format("Unexpected CRC after header mark at c/h/s (w) {0}/{1}/{2} ({3})",
                                 *  cylinder,
                                 *  head,
                                 *  sector,
                                 *  word)); */
                            }
                            break;

                        case 2:
                            if (data == 0x1a143)        // label / data
                            {
                                // This is the data mark, move to CRC.
                                field++;
                            }
                            else if (data == 0x1a141)       // header
                            {
                                // Unexpected header mark here.
                                WriteLine(String.Format("Unexpected header mark after label mark at c/h/s (w) {0}/{1}/{2} ({3})",
                                                        cylinder,
                                                        head,
                                                        sector,
                                                        word));
                            }
                            else if (data == 0x2beef)
                            {
                                /*
                                 * // Unexpected here.
                                 * WriteLine(String.Format("Unexpected CRC after label mark at c/h/s (w) {0}/{1}/{2} ({3})",
                                 *  cylinder,
                                 *  head,
                                 *  sector,
                                 *  word)); */
                            }
                            break;

                        case 3:
                            if (data == 0x2beef)        // CRC
                            {
                                // This is the CRC, move back to header state.
                                field = 0;
                            }
                            else if (isAddressMark)
                            {
                                // Unexpected header mark here.
                                WriteLine(String.Format("Unexpected address mark after data mark at c/h/s (w) {0}/{1}/{2} ({3})",
                                                        cylinder,
                                                        head,
                                                        sector,
                                                        word));
                            }
                            break;
                        }
                    }

                    // Check sector count.  Should be 15.
                    if (sector != 15)
                    {
                        WriteLine(String.Format("Unexpected sector count {0} at c/h {1}/{2}",
                                                sector,
                                                cylinder,
                                                head));
                    }
                }
            }
        }