コード例 #1
0
        public bool MoveFileDown(Types.FileInfo File)
        {
            _LastError = "";
            DirEntryLocation dirLocOrig = LocateDirEntry(File.DirEntryIndex);

            if (dirLocOrig == null)
            {
                return(false);
            }
            DirEntryLocation dirLocNext = LocateDirEntry(File.DirEntryIndex + 1);

            if (dirLocNext == null)
            {
                _LastError = "could not find next directory entry";
                return(false);
            }
            Sector secOrig = Tracks[dirLocOrig.Track - 1].Sectors[dirLocOrig.Sector];
            Sector secPrev = Tracks[dirLocNext.Track - 1].Sectors[dirLocNext.Sector];

            // exchange dir entry content
            GR.Memory.ByteBuffer tempData = secOrig.Data.SubBuffer(0x20 * dirLocOrig.DirEntry + 2, 30);
            secPrev.Data.CopyTo(secOrig.Data, 0x20 * dirLocNext.DirEntry + 2, 30, 0x20 * dirLocOrig.DirEntry + 2);
            tempData.CopyTo(secPrev.Data, 0, 30, 0x20 * dirLocNext.DirEntry + 2);
            return(true);
        }
コード例 #2
0
ファイル: T64.cs プロジェクト: GeorgRottensteiner/C64Studio
        public override Types.FileInfo LoadFile(GR.Memory.ByteBuffer Filename)
        {
            _LastError = "";
            int fileIndex = 0;
            var fileInfo  = new Types.FileInfo();

            foreach (FileRecord file in FileRecords)
            {
                if (file.EntryType == 1)
                {
                    if (file.Filename == Filename)
                    {
                        GR.Memory.ByteBuffer exportData = new GR.Memory.ByteBuffer();
                        exportData.AppendU16(file.StartAddress);
                        exportData.Append(FileDatas[fileIndex]);

                        fileInfo.Data     = exportData;
                        fileInfo.Filename = new GR.Memory.ByteBuffer(file.Filename);
                        fileInfo.Type     = Types.FileType.PRG;
                        return(fileInfo);
                    }
                }
                ++fileIndex;
            }
            _LastError = "file not found";
            return(null);
        }
コード例 #3
0
        public override List <RetroDevStudio.Types.FileInfo> Files()
        {
            _LastError = "";

            var files = new List <FileInfo>();

            int  curTrack      = TRACK_DIRECTORY;
            int  curSector     = SECTOR_DIRECTORY;
            bool endFound      = false;
            int  dirEntryIndex = 0;

            if (Tracks.Count < curTrack - 1)
            {
                return(files);
            }

            while (!endFound)
            {
                Sector sec = Tracks[curTrack - 1].Sectors[curSector];

                for (int i = 0; i < 8; ++i)
                {
                    int fileTrack  = sec.Data.ByteAt(0x20 * i + 3);
                    int fileSector = sec.Data.ByteAt(0x20 * i + 4);
                    if (sec.Data.ByteAt(0x20 * i + 2) != (byte)Types.FileType.SCRATCHED)
                    {
                        // valid entry?
                        Types.FileInfo info = new Types.FileInfo();

                        info.Filename      = sec.Data.SubBuffer(0x20 * i + 5, 16);
                        info.StartSector   = fileSector;
                        info.StartTrack    = fileTrack;
                        info.Type          = (Types.FileType)sec.Data.ByteAt(0x20 * i + 2);
                        info.Blocks        = sec.Data.ByteAt(0x20 * i + 30) + 256 * sec.Data.ByteAt(0x20 * i + 31);
                        info.DirEntryIndex = dirEntryIndex;
                        ++dirEntryIndex;
                        files.Add(info);
                    }
                }

                curTrack  = sec.Data.ByteAt(0);
                curSector = sec.Data.ByteAt(1);

                if (curTrack == 0)
                {
                    // track = 0 marks last directory entry
                    endFound = true;
                }
            }
            return(files);
        }
コード例 #4
0
        bool LocateFile(GR.Memory.ByteBuffer Filename, out Location FileLocation, out Types.FileInfo FileInfo)
        {
            _LastError   = "";
            FileLocation = null;
            FileInfo     = null;

            Location curLoc = new Location(TRACK_DIRECTORY, SECTOR_DIRECTORY);

            bool endFound = false;

            while (!endFound)
            {
                Sector sec = Tracks[curLoc.Track - 1].Sectors[curLoc.Sector];

                for (int i = 0; i < 8; ++i)
                {
                    int fileTrack  = sec.Data.ByteAt(0x20 * i + 3);
                    int fileSector = sec.Data.ByteAt(0x20 * i + 4);
                    if (fileTrack != 0)
                    {
                        // valid entry?
                        if (sec.Data.ByteAt(0x20 * i + 2) != (byte)C64Studio.Types.FileType.SCRATCHED)
                        {
                            GR.Memory.ByteBuffer filename = sec.Data.SubBuffer(0x20 * i + 5, 16);
                            if (Filename.Compare(filename) == 0)
                            {
                                FileLocation = new Location(fileTrack, fileSector);

                                FileInfo             = new C64Studio.Types.FileInfo();
                                FileInfo.Filename    = new GR.Memory.ByteBuffer(filename);
                                FileInfo.StartSector = fileSector;
                                FileInfo.StartTrack  = fileTrack;
                                FileInfo.Type        = (C64Studio.Types.FileType)sec.Data.ByteAt(0x20 * i + 2);
                                FileInfo.Blocks      = 0;
                                return(true);
                            }
                        }
                    }
                }

                curLoc = sec.NextLocation;
                if (curLoc == null)
                {
                    // track = 0 marks last directory entry
                    break;
                }
            }
            _LastError = "Could not locate directory entry for file";
            return(false);
        }
コード例 #5
0
        void OpenInHexEditor(Types.FileInfo FileToImport)
        {
            Types.FileInfo fileInfo = null;

            if (m_Media != null)
            {
                fileInfo = m_Media.LoadFile(FileToImport.Filename);
            }
            if (fileInfo != null)
            {
                BinaryDisplay display = new BinaryDisplay(Core, fileInfo.Data, false, true);
                display.Show(Core.MainForm.panelMain, DockState.Float);
            }
        }
コード例 #6
0
        public override Types.FileInfo LoadFile(GR.Memory.ByteBuffer Filename)
        {
            _LastError = "";
            if (Filename.Compare(this.Filename) != 0)
            {
                _LastError = "file not found";
                return(null);
            }
            var fileInfo = new Types.FileInfo();

            fileInfo.Type     = Types.FileType.PRG;
            fileInfo.Data     = new GR.Memory.ByteBuffer(Data);
            fileInfo.Filename = new GR.Memory.ByteBuffer(Filename);

            return(fileInfo);
        }
コード例 #7
0
ファイル: Tap.cs プロジェクト: GeorgRottensteiner/C64Studio
        public override Types.FileInfo LoadFile(GR.Memory.ByteBuffer Filename)
        {
            _LastError = "";
            var fileInfo = new Types.FileInfo();

            foreach (FileEntry file in TapFiles)
            {
                if (file.Filename.Compare(Filename) == 0)
                {
                    fileInfo.Filename = new GR.Memory.ByteBuffer(file.Filename);
                    fileInfo.Data     = file.Data;
                    fileInfo.Type     = Types.FileType.PRG;
                    return(fileInfo);
                }
            }
            _LastError = "file not found";
            return(null);
        }
コード例 #8
0
ファイル: Tap.cs プロジェクト: GeorgRottensteiner/C64Studio
        public override List <Types.FileInfo> Files()
        {
            _LastError = "";
            var files         = new List <Types.FileInfo>();
            int dirEntryIndex = 0;

            foreach (FileEntry file in TapFiles)
            {
                var info = new Types.FileInfo();

                info.Filename      = new GR.Memory.ByteBuffer(file.Filename);
                info.Blocks        = (int)(file.Data.Length + 253) / 254;
                info.Type          = Types.FileType.PRG;
                info.DirEntryIndex = dirEntryIndex;
                ++dirEntryIndex;

                files.Add(info);
            }
            return(files);
        }
コード例 #9
0
        private void ExportToBASIC(Types.FileInfo fileToExport, C64Models.BASIC.Dialect Dialect)
        {
            RetroDevStudio.Types.FileInfo fileInfo = null;

            if (m_Media != null)
            {
                fileInfo = m_Media.LoadFile(fileToExport.Filename);
            }
            if (fileInfo != null)
            {
                if (fileInfo.Data.Length >= 2)
                {
                    //if ( startAddress == 0x0801 )
                    {
                        // can only load from that address

                        List <string> lines;

                        // trunc load address
                        var parser = new Parser.BasicFileParser(new Parser.BasicFileParser.ParserSettings());
                        parser.SetBasicDialect(Dialect);
                        if (parser.Disassemble(fileInfo.Data.SubBuffer(2), out lines))
                        {
                            var document = new SourceBasicEx(Core);
                            document.ShowHint = DockState.Document;

                            document.Core = Core;
                            document.Show(Core.MainForm.panelMain);
                            document.SetBASICDialect(Dialect);

                            StringBuilder sb = new StringBuilder();
                            foreach (string line in lines)
                            {
                                sb.AppendLine(line);
                            }
                            document.FillContent(sb.ToString(), false);
                        }
                    }
                }
            }
        }
コード例 #10
0
        public List <string> CheckForErrors()
        {
            List <string> errors = new List <string>();

            GR.Collections.Map <GR.Generic.Tupel <int, int>, GR.Memory.ByteBuffer> usedSectors = new GR.Collections.Map <GR.Generic.Tupel <int, int>, GR.Memory.ByteBuffer>();

            int  curTrack  = TRACK_DIRECTORY;
            int  curSector = SECTOR_DIRECTORY;
            bool endFound  = false;

            while (!endFound)
            {
                Sector sec = Tracks[curTrack - 1].Sectors[curSector];

                for (int i = 0; i < 8; ++i)
                {
                    int fileTrack  = sec.Data.ByteAt(0x20 * i + 3);
                    int fileSector = sec.Data.ByteAt(0x20 * i + 4);
                    if (sec.Data.ByteAt(0x20 * i + 2) != (byte)Types.FileType.SCRATCHED)
                    {
                        // valid entry?
                        var info = new Types.FileInfo();

                        FollowChain(fileTrack, fileSector, usedSectors, info.Filename, errors);
                    }
                }

                curTrack  = sec.Data.ByteAt(0);
                curSector = sec.Data.ByteAt(1);

                if (curTrack == 0)
                {
                    // track = 0 marks last directory entry
                    endFound = true;
                }
            }

            return(errors);
        }
コード例 #11
0
        public bool MoveFileUp(Types.FileInfo File)
        {
            _LastError = "";
            if (File.DirEntryIndex == 0)
            {
                return(false);
            }
            DirEntryLocation dirLocOrig = LocateDirEntry(File.DirEntryIndex);

            if (dirLocOrig == null)
            {
                return(false);
            }
            DirEntryLocation dirLocPrev = LocateDirEntry(File.DirEntryIndex - 1);
            Sector           secOrig    = Tracks[dirLocOrig.Track - 1].Sectors[dirLocOrig.Sector];
            Sector           secPrev    = Tracks[dirLocPrev.Track - 1].Sectors[dirLocPrev.Sector];

            // exchange dir entry content
            GR.Memory.ByteBuffer tempData = secOrig.Data.SubBuffer(0x20 * dirLocOrig.DirEntry + 2, 30);
            secPrev.Data.CopyTo(secOrig.Data, 0x20 * dirLocPrev.DirEntry + 2, 30, 0x20 * dirLocOrig.DirEntry + 2);
            tempData.CopyTo(secPrev.Data, 0, 30, 0x20 * dirLocPrev.DirEntry + 2);
            return(true);
        }
コード例 #12
0
ファイル: T64.cs プロジェクト: GeorgRottensteiner/C64Studio
        public override List <RetroDevStudio.Types.FileInfo> Files()
        {
            _LastError = "";

            var files         = new List <RetroDevStudio.Types.FileInfo>();
            int dirEntryIndex = 0;

            foreach (FileRecord file in FileRecords)
            {
                if (file.EntryType == 1)
                {
                    var info = new Types.FileInfo();

                    info.Filename      = file.Filename;
                    info.Blocks        = (file.EndAddress - file.StartAddress) / 254 + 1;
                    info.Type          = file.C64FileType;
                    info.DirEntryIndex = dirEntryIndex;
                    ++dirEntryIndex;

                    files.Add(info);
                }
            }
            return(files);
        }
コード例 #13
0
        private void listFiles_DragDrop(object sender, DragEventArgs e)
        {
            DragData dragData = null;

            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                // insert file(s)
                string[] files       = (string[])e.Data.GetData(DataFormats.FileDrop, false);
                bool     changedFile = false;
                foreach (string file in files)
                {
                    if (!ImportFile(file))
                    {
                        MessageBox.Show($"The file {file} could not be imported, too big or invalid filename", "Error importing file");
                        return;
                    }
                    else
                    {
                        changedFile = true;
                    }
                }
                if (changedFile)
                {
                    RefreshFileView();
                    SetModified();
                    UpdateStatusInfo();
                }
                return;
            }
            else if (!e.Data.GetDataPresent("RetroDevStudio.FileManager+DragData"))
            {
                return;
            }
            else
            {
                dragData = (DragData)e.Data.GetData("RetroDevStudio.FileManager+DragData");
                if (dragData.Parent == this)
                {
                    return;
                }
            }

            // insert file
            bool changed = false;

            foreach (RetroDevStudio.Types.FileInfo file in dragData.Files)
            {
                Types.FileInfo fileInfo = null;
                if (dragData.Media != null)
                {
                    fileInfo = dragData.Media.LoadFile(file.Filename);
                }

                if (fileInfo != null)
                {
                    if (m_Media != null)
                    {
                        if (!m_Media.WriteFile(file.Filename, fileInfo.Data, file.Type))
                        {
                            MessageBox.Show($"The file {file.Filename} could not be imported, too big or invalid filename", "Error importing file");
                            return;
                        }
                        else
                        {
                            changed = true;
                        }
                    }
                }
            }
            if (changed)
            {
                RefreshFileView();
                SetModified();
                UpdateStatusInfo();
            }
        }