Exemple #1
0
        static string BranchTgt(Int64 instr, Int128 ip)
        {
            string str;
            Int64  tgt;

            tgt  = ((instr >> 4) & 3) | (((instr >> 4) & 3) << 2) | ((instr >> 22) << 4);
            tgt  = Int128.Add(ip, Int128.Convert(instr >> 22)).ToLong();
            tgt &= -16L;
            tgt |= ((instr >> 4) & 3) | (((instr >> 4) & 3) << 2);
            str  = "$" + Convert.ToString(tgt, 16).PadLeft(10, '0');
            return(str);
        }
Exemple #2
0
        public Int128 Read(Int128 adr)
        {
            ulong  nn;
            Int128 j, k;
            ulong  ad = adr.digits[0];

            if (ad < 0x20000000L)
            {
                nn = (ad >> 4) & 0xfffffL;
                j  = mainmem[nn].Clone();
                k  = mainmem[nn + 1].Clone();
                j  = j.ShrPair(k, j, (int)((adr.digits[0] & 15L) << 3));
                return(j);
            }
            else if ((ad & 0xffffffffL) >= 0xff400000L && ((ad & 0xffffffffL) < 0xff410000L))
            {
                nn = (ad >> 4) & 0xfffL;
                j  = scratchmem[nn].Clone();
                k  = scratchmem[(nn + 1) & 0xfffL].Clone();
                j  = j.ShrPair(k, j, (int)((adr.digits[0] & 15L) << 3));
                return(j);
            }
            else             // ROM
            {
                nn = ((ad - 0xFFFFFFFFFFC0000L) >> 4) & 0x3fff;
                j  = rom[nn].Clone();
                if (nn + 1 > 16383)
                {
                    k = Int128.Convert(0);
                }
                else
                {
                    k = rom[nn + 1].Clone();
                }
                j = j.ShrPair(k, j, (int)((ad & 15L) << 3));
                return(j);
            }
        }
Exemple #3
0
        public void Write(Int128 adr, Int128 val, int size)
        {
            ulong  ad = adr.digits[0] | (adr.digits[1] << 32);
            Int128 j, k;
            Int128 s;
            Int128 mask = new Int128();
            Int128 v = new Int128();
            Int128 m, mlo, mhi;
            Int128 vlo, vhi;

            vlo = new Int128();
            vhi = new Int128();
            mlo = new Int128();
            mhi = new Int128();
            switch (size)
            {
            case 1:
                mask.digits[0] = 0xffffff00L;
                mask.digits[1] = 0xffffffffL;
                mask.digits[2] = 0xffffffffL;
                mask.digits[3] = 0xffffffffL;
                break;

            case 2:
                mask.digits[0] = 0xffff0000L;
                mask.digits[1] = 0xffffffffL;
                mask.digits[2] = 0xffffffffL;
                mask.digits[3] = 0xffffffffL;
                break;

            case 4:
                mask.digits[0] = 0x00000000L;
                mask.digits[1] = 0xffffffffL;
                mask.digits[2] = 0xffffffffL;
                mask.digits[3] = 0xffffffffL;
                break;

            case 5:
                mask.digits[0] = 0x00000000L;
                mask.digits[1] = 0xffffff00L;
                mask.digits[2] = 0xffffffffL;
                mask.digits[3] = 0xffffffffL;
                break;

            case 8:
                mask.digits[0] = 0x00000000L;
                mask.digits[1] = 0x00000000L;
                mask.digits[2] = 0xffffffffL;
                mask.digits[3] = 0xffffffffL;
                break;

            case 10:
                mask.digits[0] = 0x00000000L;
                mask.digits[1] = 0x00000000L;
                mask.digits[2] = 0xffff0000L;
                mask.digits[3] = 0xffffffffL;
                break;
            }
            if (ad < 0x20000000L)
            {
                s = Int128.Add(adr, Int128.Convert(size));
                // Do we need to modify one or two memory bundles?
                if ((s.digits[0] & 0xfffffff0L) != (adr.digits[0] & 0xfffffff0L))
                {
                    s   = Int128.Shr(adr, 4);
                    j   = mainmem[s.digits[0]].Clone();
                    k   = mainmem[s.digits[0] + 1].Clone();
                    val = val.ZX80();
                    Int128.ShlPair(val, ref vlo, ref vhi, (int)((adr.digits[0] & 0xfL) * 8), 0);
                    mhi = Int128.Convert(-1);
                    Int128.ShlPair(mask, ref mlo, ref mhi, (int)((adr.digits[0] & 0xfL) * 8), 1);
                    j = Int128.And(j, mlo);
                    j = Int128.Or(j, vlo);
                    k = Int128.And(k, mhi);
                    k = Int128.Or(k, vhi);
                    mainmem[s.digits[0]]     = j;
                    mainmem[s.digits[0] + 1] = k;
                }
                else
                {
                    s   = Int128.Shr(adr, 4);
                    j   = mainmem[s.digits[0]].Clone();
                    val = val.ZX80();
                    Int128.ShlPair(val, ref vlo, ref vhi, (int)((adr.digits[0] & 0xfL) * 8));
                    j = Int128.And(j, mlo);
                    j = Int128.Or(j, vlo);
                    mainmem[s.digits[0]] = j;
                }
                return;
            }
            else if ((ad & 0xffffffffL) >= 0xff400000L && (ad & 0xffffffffL) < 0xff410000L)
            {
                s = Int128.Add(adr, Int128.Convert(size));
                // Do we need to modify one or two memory bundles?
                if ((s.digits[0] & 0xfffffff0L) != (adr.digits[0] & 0xfffffff0L))
                {
                    s   = Int128.Shr(adr, 4);
                    ad  = (ad >> 4) & 0xfffL;
                    j   = scratchmem[ad].Clone();
                    k   = scratchmem[(ad + 1) & 0xfffL].Clone();
                    val = val.ZX80();
                    Int128.ShlPair(val, ref vlo, ref vhi, (int)((adr.digits[0] & 0xfL) * 8), 0);
                    mhi = Int128.Convert(-1);
                    Int128.ShlPair(mask, ref mlo, ref mhi, (int)((adr.digits[0] & 0xfL) * 8), 1);
                    j = Int128.And(j, mlo);
                    j = Int128.Or(j, vlo);
                    k = Int128.And(k, mhi);
                    k = Int128.Or(k, vhi);
                    scratchmem[ad] = j;
                    scratchmem[(ad + 1) & 0xfffL] = k;
                }
                else
                {
                    s   = Int128.Shr(adr, 4);
                    ad  = (ad >> 4) & 0xfffL;
                    j   = scratchmem[ad].Clone();
                    val = val.ZX80();
                    Int128.ShlPair(val, ref vlo, ref vhi, (int)((adr.digits[0] & 0xfL) * 8));
                    j = Int128.And(j, mlo);
                    j = Int128.Or(j, vlo);
                    scratchmem[ad] = j;
                }
                return;
            }
            else if (ad >= 0xffffffffffd00000L && ad < 0xffffffffffd10000L)
            {
                textmem[(ad >> 3) & 0xffffL] = (long)(val.digits[0] | (val.digits[1] << 32));
            }
            else if (ad == 0xffffffffffdc0600L)
            {
                leds = (int)val.digits[0];
            }
        }
Exemple #4
0
        private void timer1_Tick(object sender, EventArgs e)
        {
            string str;
            int    nn;
            Int128 ad = new Int128(textBox1.Text);
            Int128 dat;

            trackIP = checkBox1.Checked;
            if (trackIP)
            {
                ad = Int128.Sub(soc.cpu.ip, Int128.Convert(0x20));
            }
            //dumpBox.Clear();
            str = "";
            nn  = 0;
            for (nn = 0; nn < 50; nn++)
            {
                dat = soc.Read(ad);
                switch (dumpType)
                {
                case 0:
                    switch (dumpStride)
                    {
                    case 1:
                        str = str + Convert.ToString((long)ad.digits[0], 16).PadLeft(6, '0') + ": " + dat.ToString80().Substring(18, 2) + "\r\n";
                        break;

                    case 2:
                        str = str + Convert.ToString((long)ad.digits[0], 16).PadLeft(6, '0') + ": " + dat.ToString80().Substring(16, 4) + "\r\n";
                        break;

                    case 4:
                        str = str + Convert.ToString((long)ad.digits[0], 16).PadLeft(6, '0') + ": " + dat.ToString80().Substring(12, 8) + "\r\n";
                        break;

                    case 5:
                        str = str + Convert.ToString((long)ad.digits[0], 16).PadLeft(6, '0') + ": " + dat.ToString80().Substring(10, 10) + "\r\n";
                        break;

                    case 8:
                        str = str + Convert.ToString((long)ad.digits[0], 16).PadLeft(6, '0') + ": " + dat.ToString80().Substring(4, 16) + "\r\n";
                        break;

                    case 10:
                        str = str + Convert.ToString((long)ad.digits[0], 16).PadLeft(6, '0') + ": " + dat.ToString80() + "\r\n";
                        break;

                    case 16:
                        str = str + Convert.ToString((long)ad.digits[0], 16).PadLeft(6, '0') + ": " + dat.ToString128() + "\r\n";
                        break;
                    }
                    break;

                case 1:
                    if (Int128.EQ(ad, soc.cpu.ip))
                    {
                        str = str + "h";
                    }
                    else
                    {
                        str = str + " ";
                    }
                    str = str + nvioCpu.Disassemble(soc.cpu.ibundle, GetUnit(ad), (Int64)GetInstr(ad), ad) + "\n";
                    break;
                }
                if (trackIP)
                {
                    ad = nvioCpu.IncAd(ad, 5);
                }
                else
                {
                    ad = Int128.Add(ad, Int128.Convert(dumpStride));
                }
            }
            dmp.SetText(str);
            dmp.Invalidate();
            ad  = Int128.Sub(soc.cpu.regfile[(soc.cpu.regset << 6) | 63], Int128.Convert(40));
            str = "";
            for (nn = 0; nn < 25; nn++)
            {
                dat = soc.Read(ad);
                if (Int128.EQ(ad, soc.cpu.regfile[(soc.cpu.regset << 6) | 63]))
                {
                    str = str + "h";
                }
                else
                {
                    str = str + " ";
                }
                str = str + Convert.ToString((long)ad.digits[0], 16).PadLeft(6, '0') + ": " + dat.ToString80() + "\r\n";
                ad  = Int128.Add(ad, Int128.Convert(10));
            }
            stk.SetText(str);
            stk.Invalidate();
            if (trackIP)
            {
                timer1.Interval = 10;
            }
            else
            {
                timer1.Interval = 100;
            }
            timer1.Enabled = trackIP;
        }