Exemplo n.º 1
0
 public bool isSimilairInRange(List <MemoryLeak> others, GraphicMode mode)
 {
     foreach (MemoryLeak memoryLeak in others)
     {
         if (this.isSimiliar(memoryLeak, mode))
         {
             return(true);
         }
     }
     return(false);
 }
Exemplo n.º 2
0
 public bool isSimilairInRange(Dictionary <String, List <MemoryLeak> > dumps, GraphicMode mode)
 {
     foreach (String key in dumps.Keys)
     {
         if (this.isSimilairInRange(dumps[key], mode))
         {
             return(true);
         }
     }
     return(false);
 }
Exemplo n.º 3
0
        private bool isSimiliar(MemoryLeak other, GraphicMode mode)
        {
            String identifier1, identifier2;

            if (mode == GraphicMode.OGL)
            {
                identifier1 = Regex.Replace(this.identifier, @"ig\d+icd64", "igXicd64");
                identifier2 = Regex.Replace(other.identifier, @"ig\d+icd64", "igXicd64");

                if (identifier1 == identifier2)
                {
                    return(true);
                }
            }

            return(false);
        }
Exemplo n.º 4
0
        private void RenderGraphicModeSlice(Display Display, Memory Memory, GraphicMode Mode)
        {
            // TODO !
            switch (CurrentMode)
            {
            case GraphicMode.CHAR_HIRES:
            {
                byte charData;
                byte color;
                int  shift   = 0;
                int  xscroll = 0;
                int  x       = CycleInLinePos * 8 + xscroll;

                ReadVideoMatrix(out charData, out color);
                //Debug.Log( "Read cached byte " + VMLIRead + " in line " + RasterLinePos + "/cycle " + CycleInLinePos );

                byte bgColor = Registers[(int)Register.BACKGROUND_COLOR];
                uint bits    = (uint)(Memory.ReadByteDirectAsVIC(GetCharsetAddress((ushort)((charData * 8) + RowCounter))) << shift);

                uint pos = (uint)(RasterLinePos * 504 + x);
                for (uint lim = pos + 8; pos < lim; pos++)
                {
                    bits <<= 1;
                    uint pixel = bits & 0x100;

                    Display.SetPixel(x + 8 - (int)(lim - pos), RasterLinePos, pixel == 0 ? bgColor : color);
                    //collision[pos] = (ushort)pixel;
                }
            }
            break;

            default:
                for (int i = 0; i < 8; ++i)
                {
                    Display.SetPixel(CycleInLinePos * 8 + i, RasterLinePos, Registers[(int)Register.BACKGROUND_COLOR]);
                }
                break;
            }
        }
Exemplo n.º 5
0
        public override void Write(ushort address, byte value)
        {
            bool write = true;

            address &= 0x3f;

            switch (address)
            {
                case (ushort)Registers.RASTER:

                    _rasterComparison = (byte)((_rasterComparison & 0xff00) | value);
                    break;

                case (ushort)Registers.CR_1:

                    _rasterComparison = (ushort)((_rasterComparison & 0xff) | ((value & (byte)CR1.RST8) << 1));

                    _graphicMode = _graphicModes[((_registers[(ushort)Registers.CR_2] & (byte)CR2.MCM) | (value & (byte)(CR1.ECM | CR1.BMM))) >> 4];

                    _rasterLine.SetReplacableOperations(_auxBorderFlip, (value & (byte)CR1.DEN) != 0);

                    _topBorder = AUX_BORDER[(value & (byte)CR1.RSEL) >> 3, 0];
                    _bottomBorder = AUX_BORDER[(value & (byte)CR1.RSEL) >> 3, 1];
                    break;

                case (ushort)Registers.CR_2:

                    _graphicMode = _graphicModes[((value & (byte)CR2.MCM) | (_registers[(ushort)Registers.CR_1] & (byte)(CR1.ECM | CR1.BMM))) >> 4];

                    _leftBorder = MAIN_BORDER[(value & (byte)CR2.CSEL) >> 3, 0];
                    _rightBorder = MAIN_BORDER[(value & (byte)CR2.CSEL) >> 3, 1];
                    break;

                case (ushort)Registers.IN_R:

                    _registers[address] &= (byte)((~value) | (byte)IR.IRQ);

                    if ((_registers[address] & _registers[(byte)Registers.IN_E]) == 0 && (_registers[address] & (byte)IR.IRQ) != 0)
                    {
                        byte clear = (byte)IR.IRQ;
                        _registers[address] &= (byte)~clear;
                        _irqLine.Lower();
                    }

                    write = false;
                    break;

                case (ushort)Registers.IN_E:

                    if ((value & _registers[(byte)Registers.IN_R]) != 0 && (_registers[(byte)Registers.IN_R] & (byte)IR.IRQ) == 0)
                    {
                        _registers[(byte)Registers.IN_R] |= (byte)IR.IRQ;
                        _irqLine.Raise();
                    }
                    else if ((value & _registers[(byte)Registers.IN_R]) == 0 && (_registers[(byte)Registers.IN_R] & (byte)IR.IRQ) != 0)
                    {
                        byte clear = (byte)IR.IRQ;
                        _registers[(byte)Registers.IN_R] &= (byte)~clear;
                        _irqLine.Lower();
                    }
                    break;

                case (ushort)Registers.ME_P:
                    _videoMemoryBase = (ushort)((value & (byte)MP.VM) << 6);
                    _charGenMemoryBase = (ushort)((value & (byte)MP.CB) << 10);
                    _bitmapMemoryBase = (ushort)((value & (byte)MP.BB) << 10);
                    break;

                case (ushort)Registers.EC:
                    _borderColor = Pallete.CvtColors[value & 0x0f];
                    break;

                case (ushort)Registers.BC_0:
                    _backGroundColor[0] = Pallete.CvtColors[value & 0x0f];
                    break;

                case (ushort)Registers.BC_1:
                    _backGroundColor[1] = Pallete.CvtColors[value & 0x0f];
                    break;

                case (ushort)Registers.BC_2:
                    _backGroundColor[2] = Pallete.CvtColors[value & 0x0f];
                    break;

                case (ushort)Registers.BC_3:
                    _backGroundColor[3] = Pallete.CvtColors[value & 0x0f];
                    break;

                default:

                    if (address >= 0x20)
                        value &= 0x0f;

                    break;
            }

            if (write)
                _registers[address] = value;
        }
Exemplo n.º 6
0
        public void ReadDeviceState(IFile stateFile)
        {
            stateFile.ReadBytes(_registers);
            _colorRam.ReadDeviceState(stateFile);
            _rasterLine.ReadDeviceState(stateFile);
            stateFile.ReadWords(_collisionMatrix);
            stateFile.ReadWords(_spritePointers);

            for (int i = 0; i < _sDataBuffer.Length; i++)
                _sDataBuffer[i].ReadDeviceState(stateFile);

            stateFile.ReadBytes(_videoMatrix);
            _xCoord = stateFile.ReadWord();
            _vmliRead = stateFile.ReadByte();
            _vmliWrite = stateFile.ReadByte();
            _vc = stateFile.ReadWord();
            _vcBase = stateFile.ReadWord();
            _rc = stateFile.ReadByte();
            stateFile.ReadBytes(_mc);
            stateFile.ReadBytes(_mcBase);

            stateFile.ReadBools(_yExpandFlip);
            stateFile.ReadBools(_spriteDMA);
            stateFile.ReadBools(_spriteDisplay);

            _auxBorderFlip = stateFile.ReadBool();
            _displayState = stateFile.ReadBool();
            _badLine = stateFile.ReadBool();
            _rasterComparison = stateFile.ReadWord();
            _raster = stateFile.ReadWord();

            _borderColor = stateFile.ReadDWord();
            stateFile.ReadDWords(_backGroundColor);

            _topBorder = stateFile.ReadWord();
            _bottomBorder = stateFile.ReadWord();
            _leftBorder = stateFile.ReadWord();
            _rightBorder = stateFile.ReadWord();

            _memoryBank = stateFile.ReadWord();
            _videoMemoryBase = stateFile.ReadWord();
            _charGenMemoryBase = stateFile.ReadWord();
            _bitmapMemoryBase = stateFile.ReadWord();

            _graphicMode = _graphicModes[((_registers[(ushort)Registers.CR_2] & (byte)CR2.MCM) | (_registers[(ushort)Registers.CR_1] & (byte)(CR1.ECM | CR1.BMM))) >> 4];
        }
Exemplo n.º 7
0
        public VIC(ushort vicAddress, ushort vicSize, ushort cRamAddress, ushort cRamSize, IO.Irq irqLine, C64Interfaces.IVideoOutput outputDevice)
            : base(vicAddress, vicSize)
        {
            _irqLine = irqLine;
            _outputDevice = outputDevice;

            _colorRam = new Memory.ColorRAM(cRamAddress, cRamSize);

            _rasterLine = new RasterLine(this);
            _graphicMode = _graphicModes[0];

            for (int i = _sDataBuffer.Length - 1; i >= 0; i--)
                _sDataBuffer[i] = new DataBuffer();
        }
Exemplo n.º 8
0
        public void WriteByte(byte Address, byte Value)
        {
            if (Address >= 0x40)
            {
                throw new NotImplementedException("VIC only supports 0x40 registers!");
            }

            if (Address >= 47)
            {
                // unused addresses can not be set
                return;
            }

            var register = (Register)Address;

            if (register == Register.RASTER)
            {
                // raster pos for IRQ (lower 8 bits)
                IRQRasterLinePos = (IRQRasterLinePos & 0x100) | Value;
            }
            else
            {
                Registers[Address] = Value;
                switch (register)
                {
                case Register.CONTROL_1:
                    // msb is msb of IRQ raster pos
                    IRQRasterLinePos = (IRQRasterLinePos & 0xff);
                    if ((Value & 0x80) != 0)
                    {
                        IRQRasterLinePos |= 0x100;
                    }

                    //       |   CSEL=0   |   CSEL=1
                    // ------+------------+-----------
                    // Left  |  31 ($1f)  |  24 ($18)
                    // Right | 335 ($14f) | 344 ($158)
                    //
                    //        |   RSEL=0  |  RSEL=1
                    // -------+-----------+----------
                    // Top    |  55 ($37) |  51 ($33)
                    // Bottom | 247 ($f7) | 251 ($fb)
                    Registers[Address] = Value;
                    if (RSEL)
                    {
                        TopBorder    = 51;
                        BottomBorder = 251;
                    }
                    else
                    {
                        TopBorder    = 55;
                        BottomBorder = 247;
                    }
                    if (CSEL)
                    {
                        LeftBorder  = 24;
                        RightBorder = 344;
                    }
                    else
                    {
                        LeftBorder  = 31;
                        RightBorder = 335;
                    }
                    CurrentMode = DetermineGraphicMode();
                    break;

                case Register.CONTROL_2:
                    CurrentMode = DetermineGraphicMode();
                    break;

                case Register.MEMORY_CONTROL:
                    break;
                }
                //Debug.Log( "VIC 0xd0" + Address.ToString( "X2" ) + "=" + Value.ToString( "X2" ) );
            }
        }
Exemplo n.º 9
0
        public void WriteByte(byte Address, byte Value)
        {
            if (Address >= 0x40)
            {
                throw new NotImplementedException("VIC only supports 0x40 registers!");
            }

            if (Address >= 47)
            {
                // unused addresses can not be set
                return;
            }

            var register = (Register)Address;

            if (register == Register.RASTER)
            {
                // raster pos for IRQ (lower 8 bits)
                IRQRasterLinePos = (IRQRasterLinePos & 0x100) | Value;
            }
            else
            {
                Registers[Address] = Value;
                switch (register)
                {
                case Register.CONTROL_1:
                    // msb is msb of IRQ raster pos
                    IRQRasterLinePos = (IRQRasterLinePos & 0xff);
                    if ((Value & 0x80) != 0)
                    {
                        IRQRasterLinePos |= 0x100;
                    }

                    //       |   CSEL=0   |   CSEL=1
                    // ------+------------+-----------
                    // Left  |  31 ($1f)  |  24 ($18)
                    // Right | 335 ($14f) | 344 ($158)
                    //
                    //        |   RSEL=0  |  RSEL=1
                    // -------+-----------+----------
                    // Top    |  55 ($37) |  51 ($33)
                    // Bottom | 247 ($f7) | 251 ($fb)
                    Registers[Address] = Value;
                    if (RSEL)
                    {
                        TopBorder    = 51;
                        BottomBorder = 251;
                    }
                    else
                    {
                        TopBorder    = 55;
                        BottomBorder = 247;
                    }
                    if (CSEL)
                    {
                        LeftBorder  = 24;
                        RightBorder = 344;
                    }
                    else
                    {
                        LeftBorder  = 31;
                        RightBorder = 335;
                    }
                    CurrentMode = DetermineGraphicMode();
                    break;

                case Register.CONTROL_2:
                    CurrentMode = DetermineGraphicMode();
                    break;

                case Register.MEMORY_CONTROL:
                    break;

                case Register.RASTER:
                {
                    // Raster counter
                    ushort newIRQRasterPos = (ushort)((IRQRasterLinePos & 0xff00) | Value);
                    if ((IRQRasterLinePos != newIRQRasterPos) &&
                        (RasterLinePos == newIRQRasterPos))
                    {
                        TriggerRasterIRQ();
                    }
                    IRQRasterLinePos = newIRQRasterPos;
                }
                break;

                case Register.IRQ_MASK:
                    IRQMask = (byte)(Value & 0x0f);
                    if ((IRQFlag & IRQMask) != 0)
                    {
                        // Trigger interrupt if pending and now allowed
                        IRQFlag |= 0x80;
                        Machine.RaiseIRQ(Machine.IRQSource.VIC);
                    }
                    else
                    {
                        IRQFlag &= 0x7f;
                        Machine.LowerIRQ(Machine.IRQSource.VIC);
                    }
                    break;

                case Register.IRQ_FLAGS:
                    IRQFlag = (byte)(IRQFlag & (~Value & 0x0f));
                    if ((IRQFlag & IRQMask) != 0)
                    {
                        // Set master bit if allowed interrupt still pending
                        IRQFlag |= 0x80;
                    }
                    else
                    {
                        // Else clear interrupt
                        Machine.LowerIRQ(Machine.IRQSource.VIC);
                    }
                    break;
                }
                //Debug.Log( "VIC 0xd0" + Address.ToString( "X2" ) + "=" + Value.ToString( "X2" ) );
            }
        }