示例#1
0
        public bool MoveFileDown(C64Studio.Types.FileInfo File)
        {
            _LastError = "";
            DirEntryLocation dirLocOrig = LocateDirEntry(File.StartTrack, File.StartSector);

            if (dirLocOrig == null)
            {
                return(false);
            }
            DirEntryLocation dirLocNext = null;

            if (!FindNextDirEntry(dirLocOrig, out dirLocNext))
            {
                _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
        private void DeleteSelectedItems()
        {
            if (listFiles.SelectedItems.Count > 0)
            {
                if (System.Windows.Forms.MessageBox.Show("Do you really want to delete the selected files?", "Delete Files?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    bool deletedFile = false;
                    foreach (ListViewItem item in listFiles.SelectedItems)
                    {
                        C64Studio.Types.FileInfo fileToDelete = (C64Studio.Types.FileInfo)item.Tag;

                        if (m_Media != null)
                        {
                            if (m_Media.DeleteFile(fileToDelete.Filename))
                            {
                                deletedFile = true;
                            }
                        }
                    }
                    if (deletedFile)
                    {
                        RefreshFileView();
                        SetModified();
                        UpdateStatusInfo();
                    }
                }
            }
        }
示例#3
0
        public override Types.FileInfo LoadFile(GR.Memory.ByteBuffer Filename)
        {
            _LastError = "";
            int fileIndex = 0;

            Types.FileInfo fileInfo = new C64Studio.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     = C64Studio.Types.FileType.PRG;
                        return(fileInfo);
                    }
                }
                ++fileIndex;
            }
            _LastError = "file not found";
            return(null);
        }
示例#4
0
        void itemRename_Click(object sender, EventArgs e)
        {
            bool renamedFile = false;

            foreach (ListViewItem item in listFiles.SelectedItems)
            {
                C64Studio.Types.FileInfo fileToRename = (C64Studio.Types.FileInfo)item.Tag;

                FormRenameFile formRename = new FormRenameFile(Core, fileToRename.Filename);

                if (formRename.ShowDialog() == DialogResult.OK)
                {
                    if (m_Media.RenameFile(fileToRename.Filename, formRename.Filename))
                    {
                        renamedFile = true;
                    }
                }
            }
            if (renamedFile)
            {
                RefreshFileView();
                SetModified();
                UpdateStatusInfo();
            }
        }
示例#5
0
        private void toolStripBtnMoveFileDown_Click(object sender, EventArgs e)
        {
            if (m_Media is Formats.D64)
            {
                Formats.D64 disk = m_Media as Formats.D64;
                C64Studio.Types.FileInfo fileToMove = (C64Studio.Types.FileInfo)listFiles.SelectedItems[0].Tag;

                int oldIndex = listFiles.SelectedIndices[0];
                if (disk.MoveFileDown(fileToMove))
                {
                    RefreshFileView();
                    listFiles.SelectedIndices.Clear();
                    listFiles.SelectedIndices.Add(oldIndex + 1);
                    SetModified();
                    UpdateStatusInfo();
                }
            }
            else if (m_Media is Formats.D81)
            {
                Formats.D81 disk = m_Media as Formats.D81;
                C64Studio.Types.FileInfo fileToMove = (C64Studio.Types.FileInfo)listFiles.SelectedItems[0].Tag;

                int oldIndex = listFiles.SelectedIndices[0];
                if (disk.MoveFileDown(fileToMove))
                {
                    RefreshFileView();
                    listFiles.SelectedIndices.Clear();
                    listFiles.SelectedIndices.Add(oldIndex + 1);
                    SetModified();
                    UpdateStatusInfo();
                }
            }
        }
示例#6
0
        private void UpdateStatusInfo()
        {
            if (m_Media == null)
            {
                saveToolStripMenuItem.Enabled           = false;
                saveasToolStripMenuItem.Enabled         = false;
                validateMediumToolStripMenuItem.Enabled = false;
            }
            else
            {
                saveToolStripMenuItem.Enabled           = Modified;
                saveasToolStripMenuItem.Enabled         = true;
                validateMediumToolStripMenuItem.Enabled = true;
            }

            if (listFiles.SelectedItems.Count == 0)
            {
                if ((m_Media is Formats.D64) ||
                    (m_Media is Formats.D81))
                {
                    statusFileManager.Text = m_Media.FreeSlots.ToString() + "/" + m_Media.Slots.ToString() + " blocks free";
                    return;
                }
                if (m_Media != null)
                {
                    statusFileManager.Text = m_Media.FreeSlots.ToString() + "/" + m_Media.Slots.ToString() + " files free";
                    return;
                }
                statusFileManager.Text = "No media opened";
                return;
            }
            C64Studio.Types.FileInfo file = (C64Studio.Types.FileInfo)listFiles.SelectedItems[0].Tag;

            statusFileManager.Text = Util.FilenameToUnicode(file.Filename) + " " + file.Blocks.ToString() + " blocks";
        }
示例#7
0
        void OpenSelectedItemsInHexEditor()
        {
            foreach (ListViewItem item in listFiles.SelectedItems)
            {
                C64Studio.Types.FileInfo fileToExport = (C64Studio.Types.FileInfo)item.Tag;

                OpenInHexEditor(fileToExport);
            }
        }
示例#8
0
        void ExportSelectedItemsToBASIC()
        {
            foreach (ListViewItem item in listFiles.SelectedItems)
            {
                C64Studio.Types.FileInfo fileToExport = (C64Studio.Types.FileInfo)item.Tag;

                ExportToBASIC(fileToExport);
            }
        }
示例#9
0
        private void listFiles_MouseClick(object sender, MouseEventArgs e)
        {
            if ((e.Button != MouseButtons.Right) ||
                (listFiles.SelectedItems.Count == 0))
            {
                return;
            }
            System.Windows.Forms.ContextMenuStrip contextMenu = new System.Windows.Forms.ContextMenuStrip();

            System.Windows.Forms.ToolStripMenuItem item = new System.Windows.Forms.ToolStripMenuItem("Export");
            item.Tag = 0;
            contextMenu.Items.Add(item);

            System.Windows.Forms.ToolStripMenuItem subItem = new System.Windows.Forms.ToolStripMenuItem("Export to file");
            subItem.Tag    = 0;
            subItem.Click += new EventHandler(itemExport_Click);
            item.DropDownItems.Add(subItem);

            bool exportToBasicPossible = true;

            foreach (ListViewItem listItem in listFiles.SelectedItems)
            {
                C64Studio.Types.FileInfo fileInfo = (C64Studio.Types.FileInfo)listItem.Tag;
                if (fileInfo.Type != C64Studio.Types.FileType.PRG)
                {
                    exportToBasicPossible = false;
                }
            }
            if (exportToBasicPossible)
            {
                subItem        = new System.Windows.Forms.ToolStripMenuItem("Export to Basic code");
                subItem.Tag    = 0;
                subItem.Click += new EventHandler(itemExportToBasic_Click);
                item.DropDownItems.Add(subItem);
            }

            // view in Hex display
            item        = new System.Windows.Forms.ToolStripMenuItem("View in Hex Editor");
            item.Tag    = 2;
            item.Click += new EventHandler(itemViewInHexEditor_Click);
            contextMenu.Items.Add(item);

            item        = new System.Windows.Forms.ToolStripMenuItem("Rename");
            item.Tag    = 2;
            item.Click += new EventHandler(itemRename_Click);
            contextMenu.Items.Add(item);

            item        = new System.Windows.Forms.ToolStripMenuItem("Delete");
            item.Tag    = 1;
            item.Click += new EventHandler(itemDelete_Click);
            contextMenu.Items.Add(item);

            contextMenu.Show(listFiles.PointToScreen(e.Location));
        }
示例#10
0
文件: PRG.cs 项目: wowjinxy/C64Studio
        public override List <C64Studio.Types.FileInfo> Files()
        {
            _LastError = "";
            List <C64Studio.Types.FileInfo> fileList = new List <C64Studio.Types.FileInfo>();

            C64Studio.Types.FileInfo info = new C64Studio.Types.FileInfo();
            info.Filename = Filename;
            info.Blocks   = (int)Data.Length / 254;
            info.Type     = C64Studio.Types.FileType.PRG;

            fileList.Add(info);
            return(fileList);
        }
示例#11
0
        void OpenInHexEditor(C64Studio.Types.FileInfo FileToImport)
        {
            C64Studio.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);
            }
        }
示例#12
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);
        }
示例#13
0
文件: PRG.cs 项目: sajmosia/C64Studio
        public override Types.FileInfo LoadFile(GR.Memory.ByteBuffer Filename)
        {
            _LastError = "";
            if (Filename.Compare(this.Filename) != 0)
            {
                _LastError = "file not found";
                return(null);
            }
            Types.FileInfo fileInfo = new C64Studio.Types.FileInfo();
            fileInfo.Type     = C64Studio.Types.FileType.PRG;
            fileInfo.Data     = new GR.Memory.ByteBuffer(Data);
            fileInfo.Filename = new GR.Memory.ByteBuffer(Filename);

            return(fileInfo);
        }
示例#14
0
        public override List <C64Studio.Types.FileInfo> Files()
        {
            _LastError = "";

            List <C64Studio.Types.FileInfo> files = new List <C64Studio.Types.FileInfo>();

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

            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)C64Studio.Types.FileType.SCRATCHED)
                    {
                        // valid entry?
                        C64Studio.Types.FileInfo info = new C64Studio.Types.FileInfo();

                        info.Filename    = sec.Data.SubBuffer(0x20 * i + 5, 16);
                        info.StartSector = fileSector;
                        info.StartTrack  = fileTrack;
                        info.Type        = (C64Studio.Types.FileType)sec.Data.ByteAt(0x20 * i + 2);
                        info.Blocks      = sec.Data.ByteAt(0x20 * i + 30) + 256 * sec.Data.ByteAt(0x20 * i + 31);
                        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);
        }
示例#15
0
文件: Tap.cs 项目: wowjinxy/C64Studio
        public override List <C64Studio.Types.FileInfo> Files()
        {
            _LastError = "";
            List <C64Studio.Types.FileInfo> files = new List <C64Studio.Types.FileInfo>();

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

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

                files.Add(info);
            }
            return(files);
        }
示例#16
0
文件: Tap.cs 项目: wowjinxy/C64Studio
 public override Types.FileInfo LoadFile(GR.Memory.ByteBuffer Filename)
 {
     _LastError = "";
     Types.FileInfo fileInfo = new C64Studio.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     = C64Studio.Types.FileType.PRG;
             return(fileInfo);
         }
     }
     _LastError = "file not found";
     return(null);
 }
示例#17
0
        public override List <C64Studio.Types.FileInfo> Files()
        {
            _LastError = "";

            List <C64Studio.Types.FileInfo> files = new List <C64Studio.Types.FileInfo>();

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

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

                    files.Add(info);
                }
            }
            return(files);
        }
示例#18
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)C64Studio.Types.FileType.SCRATCHED)
                    {
                        // valid entry?
                        C64Studio.Types.FileInfo info = new C64Studio.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);
        }
示例#19
0
        private void ExportToBASIC(Types.FileInfo fileToExport)
        {
            C64Studio.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
                        if (C64Studio.Parser.BasicFileParser.Disassemble(fileInfo.Data.SubBuffer(2), out lines))
                        {
                            BaseDocument document = new SourceBasicEx(Core);
                            document.ShowHint = DockState.Document;

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

                            StringBuilder sb = new StringBuilder();
                            foreach (string line in lines)
                            {
                                sb.AppendLine(line);
                            }
                            document.FillContent(sb.ToString());
                        }
                    }
                }
            }
        }
示例#20
0
        private void listFiles_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listFiles.SelectedIndices.Count == 0)
            {
                toolStripBtnOpenHex.Enabled      = false;
                toolStripBtnOpenBASIC.Enabled    = false;
                toolStripBtnExportToFile.Enabled = false;
            }
            else
            {
                toolStripBtnOpenHex.Enabled      = true;
                toolStripBtnExportToFile.Enabled = true;

                bool exportToBasicPossible = true;
                foreach (ListViewItem listItem in listFiles.SelectedItems)
                {
                    C64Studio.Types.FileInfo fileInfo = (C64Studio.Types.FileInfo)listItem.Tag;
                    if (fileInfo.Type != C64Studio.Types.FileType.PRG)
                    {
                        exportToBasicPossible = false;
                        break;
                    }
                }
                toolStripBtnOpenBASIC.Enabled = exportToBasicPossible;
            }

            if ((listFiles.Items.Count <= 1) ||
                (listFiles.SelectedIndices.Count == 0))
            {
                toolStripBtnMoveFileDown.Enabled = false;
                toolStripBtnMoveFileUp.Enabled   = false;

                return;
            }
            toolStripBtnMoveFileUp.Enabled   = (listFiles.SelectedIndices[0] > 0);
            toolStripBtnMoveFileDown.Enabled = (listFiles.SelectedIndices[0] + 1 < listFiles.Items.Count);
        }
示例#21
0
        private void ExportSelectedItems()
        {
            foreach (ListViewItem item in listFiles.SelectedItems)
            {
                C64Studio.Types.FileInfo fileToExport = (C64Studio.Types.FileInfo)item.Tag;
                C64Studio.Types.FileInfo fileInfo     = null;

                if (m_Media != null)
                {
                    fileInfo = m_Media.LoadFile(fileToExport.Filename);
                }
                if (fileInfo != null)
                {
                    System.Windows.Forms.SaveFileDialog saveDlg = new System.Windows.Forms.SaveFileDialog();

                    string readableFilename = Util.FilenameToReadableUnicode(fileToExport.Filename).TrimEnd();

                    char[] invalidChars = System.IO.Path.GetInvalidFileNameChars();
                    foreach (char invChar in invalidChars)
                    {
                        readableFilename = readableFilename.Replace(invChar, '_');
                    }

                    saveDlg.Title    = "Select target file name for " + readableFilename;
                    saveDlg.Filter   = "All Files|*.*";
                    saveDlg.FileName = readableFilename;
                    if (fileToExport.Type == C64Studio.Types.FileType.PRG)
                    {
                        saveDlg.FileName += ".prg";
                    }
                    if (saveDlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        GR.IO.File.WriteAllBytes(saveDlg.FileName, fileInfo.Data);
                    }
                }
            }
        }
示例#22
0
        public int Handle(string[] args)
        {
            if (args.Length == 0)
            {
                System.Console.WriteLine("MediaManager V" + System.Windows.Forms.Application.ProductVersion);
                System.Console.WriteLine("");
                System.Console.WriteLine("Call with mediamanager");
                System.Console.WriteLine("  [-d64 <disk image>]");
                System.Console.WriteLine("  [-t64 <tape file>]");
                System.Console.WriteLine("  [-import <file name>[,load address]]");
                System.Console.WriteLine("  [-export <file name>]");
                System.Console.WriteLine("  [-rename <file name>]");
                System.Console.WriteLine("  [-renameto <file name>]");
                System.Console.WriteLine("  [-delete <file name>]");
                System.Console.WriteLine("  [-listfiles]");
                System.Console.WriteLine("");
                System.Console.WriteLine("load address can be given as decimal, hexadecimal (prefix $ or 0x). If load address is given it is prepended to the import file data.");
                System.Console.WriteLine("The filename given to -renameto is used for the actually written file when exporting");
                System.Console.WriteLine("The filename given to -renameto is used for the file info entry when importing");
                return(1);
            }

            bool   expectingParameter     = false;
            string expectingParameterName = "";
            string methodToUse            = "";

            GR.Collections.Map <string, string> paramMap = new GR.Collections.Map <string, string>();

            for (int i = 0; i < args.Length; ++i)
            {
                if (expectingParameter)
                {
                    paramMap[expectingParameterName] = args[i];
                    expectingParameter = false;
                }
                else if ((args[i].ToUpper() == "-D64") ||
                         (args[i].ToUpper() == "-T64") ||
                         (args[i].ToUpper() == "-IMPORT") ||
                         (args[i].ToUpper() == "-DELETE") ||
                         (args[i].ToUpper() == "-RENAME") ||
                         (args[i].ToUpper() == "-RENAMETO") ||
                         (args[i].ToUpper() == "-EXPORT"))
                {
                    expectingParameter     = true;
                    expectingParameterName = args[i].ToUpper();

                    if ((expectingParameterName == "-IMPORT") ||
                        (expectingParameterName == "-EXPORT") ||
                        (expectingParameterName == "-DELETE") ||
                        (expectingParameterName == "-RENAME"))
                    {
                        methodToUse = expectingParameterName;
                    }
                }
                else if (args[i].ToUpper() == "-LISTFILES")
                {
                    paramMap[args[i].ToUpper()] = "";
                    methodToUse = args[i].ToUpper();
                }
                else
                {
                    System.Console.Error.WriteLine("Unsupported option " + args[i]);
                    return(1);
                }
            }
            if (expectingParameter)
            {
                System.Console.Error.WriteLine("Missing value for " + expectingParameterName);
                return(1);
            }
            // do we have a container?
            if ((!paramMap.ContainsKey("-D64")) &&
                (!paramMap.ContainsKey("-T64")))
            {
                System.Console.Error.WriteLine("Missing medium");
                return(1);
            }

            // load
            C64Studio.Formats.MediaFormat medium = null;
            string mediumFilename = "";

            if (paramMap.ContainsKey("-D64"))
            {
                medium         = new C64Studio.Formats.D64();
                mediumFilename = paramMap["-D64"];
            }
            else if (paramMap.ContainsKey("-T64"))
            {
                medium         = new C64Studio.Formats.T64();
                mediumFilename = paramMap["-T64"];
            }

            if (!medium.Load(mediumFilename))
            {
                System.Console.WriteLine("No image found, start empty");
                medium.CreateEmptyMedia();
            }

            // handle command
            if (methodToUse == "-LISTFILES")
            {
                List <C64Studio.Types.FileInfo> files = medium.Files();

                foreach (C64Studio.Types.FileInfo file in files)
                {
                    string filename = C64Studio.Util.FilenameToReadableUnicode(file.Filename);
                    filename = filename.PadRight(16);
                    System.Console.WriteLine("\"" + filename + "\"  " + file.Blocks + " blocks  " + file.Type.ToString() + "  " + file.Filename);
                }
                System.Console.WriteLine(files.Count + " files");
            }
            else if (methodToUse == "-EXPORT")
            {
                C64Studio.Types.FileInfo fileInfo = medium.LoadFile(C64Studio.Util.ToFilename(paramMap["-EXPORT"]));
                if (fileInfo != null)
                {
                    string outputFilename = paramMap["-EXPORT"];
                    if (paramMap.ContainsKey("-RENAMETO"))
                    {
                        outputFilename = paramMap["-RENAMETO"];
                    }
                    GR.IO.File.WriteAllBytes(outputFilename, fileInfo.Data);
                    System.Console.WriteLine("File " + paramMap["-EXPORT"] + " exported");
                }
                else
                {
                    System.Console.Error.WriteLine("File " + paramMap["-EXPORT"] + " not found in medium");
                }
            }
            else if (methodToUse == "-DELETE")
            {
                C64Studio.Types.FileInfo fileInfo = medium.LoadFile(C64Studio.Util.ToFilename(paramMap["-DELETE"]));
                if (fileInfo != null)
                {
                    if (!medium.DeleteFile(C64Studio.Util.ToFilename(paramMap["-DELETE"])))
                    {
                        System.Console.Error.WriteLine("File could not be deleted: " + medium.LastError);
                    }
                    else
                    {
                        System.Console.WriteLine("File deleted");
                        medium.Save(mediumFilename);
                    }
                }
                else
                {
                    System.Console.Error.WriteLine("File " + paramMap["-DELETE"] + " not found in medium");
                }
            }
            else if (methodToUse == "-IMPORT")
            {
                bool   addAddress   = false;
                ushort startAddress = 0x0801;

                string filenameImport = paramMap["-IMPORT"];

                string[] paramList = filenameImport.Split(',');

                if ((paramList.Length == 0) ||
                    (paramList.Length > 2))
                {
                    System.Console.Error.WriteLine("Invalid parameter value for -IMPORT");
                    return(1);
                }

                filenameImport = paramList[0];

                if (paramList.Length >= 2)
                {
                    addAddress = true;
                    string loadAdressPart = paramList[1];
                    if (loadAdressPart.StartsWith("0x"))
                    {
                        ushort.TryParse(loadAdressPart.Substring(2), System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out startAddress);
                    }
                    else if (loadAdressPart.StartsWith("$"))
                    {
                        ushort.TryParse(loadAdressPart.Substring(1), System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out startAddress);
                    }
                    else
                    {
                        ushort.TryParse(loadAdressPart, out startAddress);
                    }
                }

                GR.Memory.ByteBuffer data = GR.IO.File.ReadAllBytes(filenameImport);
                if (data == null)
                {
                    System.Console.Error.WriteLine("Could not read file " + paramMap["-IMPORT"]);
                    return(1);
                }

                // insert load address
                if (addAddress)
                {
                    GR.Memory.ByteBuffer newData = new GR.Memory.ByteBuffer(2 + data.Length);

                    newData.SetU16At(0, startAddress);
                    data.CopyTo(newData, 0, (int)data.Length, 2);
                    data = newData;
                }

                if (paramMap.ContainsKey("-RENAMETO"))
                {
                    filenameImport = paramMap["-RENAMETO"];
                }
                if (!medium.WriteFile(C64Studio.Util.ToFilename(filenameImport), data, C64Studio.Types.FileType.PRG))
                {
                    System.Console.Error.WriteLine("Could not write file to medium: " + medium.LastError);
                    return(1);
                }
                System.Console.WriteLine("File imported");
                medium.Save(mediumFilename);
            }
            else if (methodToUse == "-RENAME")
            {
                if (!paramMap.ContainsKey("-RENAMETO"))
                {
                    System.Console.Error.WriteLine("Missing -renameto directive");
                    return(1);
                }
                string origFilename = paramMap["-RENAME"];
                GR.Memory.ByteBuffer origFilenameBuffer = C64Studio.Util.ToFilename(origFilename);
                string targetFilename = paramMap["-RENAMETO"];
                GR.Memory.ByteBuffer targetFilenameBuffer = C64Studio.Util.ToFilename(targetFilename);

                if (!medium.RenameFile(origFilenameBuffer, targetFilenameBuffer))
                {
                    System.Console.Error.WriteLine("Failed to rename file");
                    return(1);
                }
                System.Console.WriteLine("File renamed");
                medium.Save(mediumFilename);
            }
            else
            {
                System.Console.Error.WriteLine("Unsupported method " + methodToUse);
            }
            return(0);
        }