public void saveDisk() { if (!File.Exists(file + ".bak")) { File.Copy(file, file + ".bak", false); } for (int i = 0; i < 191; i++) { entries[i].save(diskData, 8 + 8 * i); } byte[] data = diskData; if (dskid == 0) { FileStream f = new FileStream(file, FileMode.Open); byte[] oldd = new byte[f.Length]; f.Read(oldd, 0, oldd.Length); f.Close(); int[] mods = new int[100]; int[] ofs = new int[100]; int cnt = 0; int b = 6; int cofs = 0; int nextofs = 0; while (oldd[b] != 0xFF) { mods[cnt] = oldd[b]; ofs[cnt] = (int)BinaryHelper.readU32_LE(oldd, b + 1); if (mods[cnt] == LANG_ID) { cofs = ofs[cnt]; } cnt++; b += 5; } int delta = 0; for (int i = 0; i < cnt; i++) { if (cofs < ofs[i] && cofs + data.Length > ofs[i]) { nextofs = ofs[i]; delta = cofs + data.Length - ofs[i]; } } if (delta != 0) { while (delta % 16 != 0) { delta++; } byte[] newd = new byte[oldd.Length + delta]; Array.Copy(oldd, newd, cofs); Array.Copy(oldd, nextofs, newd, nextofs + delta, oldd.Length - nextofs); for (int i = 0; i < cnt; i++) { if (ofs[i] > cofs) { ofs[i] += delta; BinaryHelper.write_LE(newd, 6 + i * 5 + 1, (uint)ofs[i]); } } oldd = newd; } Array.Copy(data, 0, oldd, cofs, data.Length); data = oldd; } FileStream fs = new FileStream(file, FileMode.Create); fs.Write(data, 0, data.Length); fs.Close(); }
public byte[] runVGA(byte[] data) { xdata = data; d1 = BinaryHelper.readU32_LE(data, 0x400); byte al = dssi(); r.Add(al); Int16 bp = (Int16)(al << 2); while (true) { int l = 0; bool nbp = true; if (nextBt()) { if (nextBt()) { if (nextBt()) { al = dssi(); r.Add(al); bp = (Int16)(al << 2); nbp = false; } else { l = 3; } } else if (nextBt()) { l = 2; } else { l = 1; } } else if (nextBt()) { al = (byte)(bp >> 2); byte ah = dssi(); if (ah == 0) { al = dssi(); if (al == 0) { return(r.ToArray()); } } else { setBytes(al, ah); } nbp = false; } if (nbp) { al = xdata[bp + l]; r.Add(al); bp = (Int16)(al << 2); } } }
public LureDisk(int id, string paths) { string file2 = ""; dskid = id; string[] pts = paths.Split(';'); file = "lure.dat"; if (id > 0) { file = "disk" + id.ToString() + ".vga"; file2 = "Disk" + id.ToString() + ".vga"; } if (!File.Exists(file)) { if (File.Exists(file2)) { file = file2; } else { foreach (string p in pts) { string s = p; if (s[s.Length - 1] != '/') { s += "/"; } if (File.Exists(s + file)) { file = s + file; break; } if (File.Exists(s + file2)) { file = s + file2; break; } } } } if (!File.Exists(file)) { throw new Exception("Disk not found " + file); } string xfile = file; if (File.Exists(xfile + ".bak")) { xfile += ".bak"; } FileStream fs = new FileStream(xfile, FileMode.Open); diskData = new byte[fs.Length]; fs.Read(diskData, 0, diskData.Length); fs.Close(); if (id == 0) { if (BinaryHelper.readString(diskData, 0, 4) != "lure") { throw new Exception("bad lure.dat"); } int b = 6; while (diskData[b] != LureConfig.get().lang_id) { b += 5; if (diskData[b] == 0xff) { throw new Exception("lure.dat language " + LureConfig.get().lang_id.ToString() + " not found"); } } int dofs = (int)BinaryHelper.readU32_LE(diskData, b + 1); b = 6; int dsz = int.MaxValue; while (diskData[b] != 0xFF) { int sofs = (int)BinaryHelper.readU32_LE(diskData, b + 1); b += 5; if (sofs > dofs) { if (sofs - dofs < dsz) { dsz = sofs - dofs; } } } byte[] newdisk = new byte[dsz]; Array.Copy(diskData, dofs, newdisk, 0, dsz); diskData = newdisk; } readEntries(); }