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(); }
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()); }
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()); } }
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); }
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); }
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); }