Example #1
0
        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();
        }
Example #2
0
        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);
                }
            }
        }
Example #3
0
        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();
        }