public bool isSimilairInRange(List <MemoryLeak> others, GraphicMode mode) { foreach (MemoryLeak memoryLeak in others) { if (this.isSimiliar(memoryLeak, mode)) { return(true); } } return(false); }
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); }
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); }
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; } }
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; }
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]; }
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(); }
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" ) ); } }
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" ) ); } }