Esempio n. 1
0
        private void SetFileRawData(byte[] buf, N88FileAtr atr)
        {
            int bufPtr = 0;

            byte cls    = atr.cluster;
            int  saf    = (cls % 4) / 2;     //サーフェス
            int  trkPtr = cls / 4 * 2 + saf; //d88はsafが0/1をくりかえす
            int  secPtr = (cls % 2) * 8;     //d88はsectorを0から数える
            int  ptr    = 0;

            do
            {
                d88.tracks[trkPtr].sectors[secPtr].data[ptr] = buf[bufPtr++];
                if (bufPtr == buf.Length)
                {
                    break;
                }

                ptr++;
                if (ptr < d88.tracks[trkPtr].sectors[secPtr].data.Length)
                {
                    continue;
                }
                secPtr++;
                ptr = 0;
                if ((secPtr % 8) == 0)
                {
                    byte emptyCluster = 0xff;
                    for (int i = 0; i < 0x9f; i++)
                    {
                        if (FAT[i] != 0xff)
                        {
                            continue;
                        }
                        emptyCluster = (byte)i;
                        FAT[i]       = 0xc1;
                        break;
                    }

                    if (emptyCluster == 0xff)
                    {
                        throw new FileNotFoundException("file over");
                    }

                    FAT[cls] = emptyCluster;
                    cls      = emptyCluster;

                    saf    = (cls % 4) / 2;     //サーフェス
                    trkPtr = cls / 4 * 2 + saf; //d88はsafが0/1をくりかえす
                    secPtr = (cls % 2) * 8;     //d88はsectorを0から数える
                    ptr    = 0;
                }
            } while (true);

            //FATに最後のセクター値をセット
            FAT[cls] = (byte)(0xc1 + secPtr);
            //FATの書き出し
            SetFAT();
        }
Esempio n. 2
0
        public byte[] SetFile(string fn, byte[] buf, int mode, int address)
        {
            //ファイルの存在チェック
            N88FileAtr atr = SearchDirectory(fn);

            //directoryにない時は新規ファイルとする
            if (atr == null)
            {
                atr = SetFile_NewFile(fn, mode);
            }

            // crlf -> lf 変換
            if (mode == 1) // 1: sa mode
            {
                //一度、stringに戻すorz
                string sbuf = Encoding.GetEncoding("shift_jis").GetString(buf);
                sbuf = sbuf.Replace("\r\n", "\r");
                buf  = Encoding.GetEncoding("shift_jis").GetBytes(sbuf);
            }
            else if (mode == 3) // 3: sb mode
            {
                //一度、stringに戻すorz
                string   sbuf  = Encoding.GetEncoding("shift_jis").GetString(buf);
                string[] lines = sbuf.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                //中間ファイルに変換
                buf = ConvertObjectBasic(lines);
            }

            //出力用バッファ
            List <byte> lBuf = new List <byte>();

            //バイナリの場合は先頭にアドレスをくっつける
            if (mode == 0) // 0: s mode
            {
                lBuf.Add((byte)address);
                lBuf.Add((byte)(address >> 8));
            }

            //取得したバッファを追加
            lBuf.AddRange(buf);

            //パディング
            while (lBuf.Count % 256 != 0)
            {
                lBuf.Add(0);
            }

            //DATAの書き出し
            SetFileRawData(lBuf.ToArray(), atr);

            return(d88.GetRaw());
        }
Esempio n. 3
0
        public byte[] GetFile(string fn, int mode)
        {
            //ファイル名存在チェック
            N88FileAtr atr = SearchDirectory(fn);

            if (atr == null)
            {
                throw new FileNotFoundException();
            }
            //ファイルのデータをディスク(.d88)から読み込む
            List <byte> buf = GetFileRawData(atr);

            if ((atr.atr & 1) != 0)
            {
                //バイナリファイル
                //先頭の2byteを切り出すだけ
                int loadAddress = buf[0] + buf[1] * 0x100;
                buf.RemoveAt(0); buf.RemoveAt(0);
                //Console.WriteLine("load address = &H{0:X}", loadAddress);
                return(buf.ToArray());
            }
            else if ((atr.atr & 0x80) != 0)
            {
                //非アスキーモード = 中間コードベーシックファイル
                //中間コードからBASICのプログラムソースを生成する
                while (buf[buf.Count - 1] == 0x00)
                {
                    buf.RemoveAt(buf.Count - 1);                               //尻を削る
                }
                buf = ConvertPlaneBasic(buf);
                return(buf.ToArray());
            }
            else
            {
                //アスキーモード ベーシックファイル
                while (buf[buf.Count - 1] == 0x00)
                {
                    buf.RemoveAt(buf.Count - 1);                               //尻を削る
                }
                if (mode == 0)
                {
                    //一旦文字列に直して改行コードを変換し更にbyte配列に戻す...
                    string sbuf = Encoding.GetEncoding("shift_jis").GetString(buf.ToArray());
                    sbuf = sbuf.Replace("\r", "\r\n");
                    return(Encoding.GetEncoding("shift_jis").GetBytes(sbuf));
                }
                return(buf.ToArray());
            }
        }
Esempio n. 4
0
        private List <byte> GetFileRawData(N88FileAtr atr)
        {
            //ファイル属性に記される先頭のクラスター
            byte        cls = atr.cluster;
            int         saf = (cls % 4) / 2;     //サーフェス
            int         trk = cls / 4 * 2 + saf; //d88はsafが0/1をくりかえす
            int         sec = (cls % 2) * 8;     //d88はsectorを0から数える
            List <byte> buf = new List <byte>();
            //残りのセクター数(0の場合は次のトラックを読む必要がある)
            int zanSector = (FAT[cls] >= 0xc1 && FAT[cls] <= 0xc8) ? (FAT[cls] & 0xf) : 0;

            int limit = 0xa0;

            do
            {
                //セクターのデータ全て取得
                buf.AddRange(d88.tracks[trk].sectors[sec].data);
                sec++;
                zanSector--;
                if (zanSector == 0)
                {
                    break;
                }
                if (zanSector < 0)
                {
                    zanSector = -1;               //念のため
                }
                //セクターが8の倍数値になった時は次のクラスターをFATから読み出す
                if (sec % 8 == 0)
                {
                    cls       = (byte)(FAT[cls]);
                    saf       = (cls % 4) / 2;     //サーフェス
                    trk       = cls / 4 * 2 + saf; //d88はsafが0/1をくりかえす
                    sec       = (cls % 2) * 8;     //d88はsectorを0から数える
                    zanSector = (FAT[cls] >= 0xc1 && FAT[cls] <= 0xc8) ? (FAT[cls] & 0xf) : 0;
                }

                //FATが壊れている時向け処理
                limit--;
                if (limit == 0)
                {
                    throw new FileNotFoundException("FAT error");
                }
            } while (true);
            return(buf);
        }
Esempio n. 5
0
        private N88FileAtr SearchDirectory(string fn)
        {
            N88FileAtr atr = null;
            string     da;

            da = getFn(fn);
            foreach (N88FileAtr a in directory)
            {
                string sa = getFn(a.fn);
                if (sa == da)
                {
                    atr = a;
                    break;
                }
            }

            return(atr);
        }
Esempio n. 6
0
        private N88FileAtr SetDirectories(byte[] atrb)
        {
            N88FileAtr atr = new N88FileAtr(atrb);

            directory.Add(atr);

            int trkPtr = Directorytrack;
            int secPtr = DirectorySector;
            int ptr    = 0;

            foreach (N88FileAtr a in directory)
            {
                for (int rPtr = 0; rPtr < DirectoryInfo; rPtr++)
                {
                    d88.tracks[trkPtr].sectors[secPtr].data[ptr++] = a.raw[rPtr];
                    if (ptr < d88.tracks[trkPtr].sectors[secPtr].data.Length)
                    {
                        continue;
                    }
                    secPtr++;
                    ptr = 0;
                    if (secPtr < d88.tracks[trkPtr].sectors.Length)
                    {
                        continue;
                    }
                    trkPtr++;
                    secPtr = 0;
                    if (trkPtr < d88.tracks.Length)
                    {
                        continue;
                    }
                    throw new ArgumentOutOfRangeException();
                }
            }

            return(atr);
        }