private void MovePixels(byte i_mode) //0 => move left; 1 => move right { if (comboDisplayType.SelectedIndex == 1) //Sprite view only for now { //move pixels left int bytesToMoveLeft = (this.bitmapGridSpriteView.getGridWidth() / 8) * this.bitmapGridSpriteView.getGridHeight(); ushort screenPointer = (ushort)numericUpDownActualAddress.Value; //moving right to left int maxScreenByteToMove = (this.bitmapGridSpriteView.getGridWidth() / 8) * this.bitmapGridSpriteView.getGridHeight(); int spriteViewWidthInTokens = this.bitmapGridSpriteView.getGridWidth() / 8; bool isLastTokenInLine = false; for (int pixelPointer = 0; pixelPointer < maxScreenByteToMove; pixelPointer++) { bool setZeroBit; if (screenPointer <= 0xFFFF && this.bitmapGridSpriteView.getGridWidth() > 8) { setZeroBit = GraphicsTools.IsBitSet(_spectrum.ReadMemory((ushort)(screenPointer + 1)), 7); } else { setZeroBit = false; } isLastTokenInLine = ((pixelPointer + 1) % spriteViewWidthInTokens == 0); isLastTokenInLine = isLastTokenInLine && spriteViewWidthInTokens != 1 && pixelPointer != 0 && pixelPointer != maxScreenByteToMove; if (i_mode == 0) { byte actByte = (byte)(_spectrum.ReadMemory(screenPointer) << 1); //set bit 0(most right) if there is a sprite view bitmap size more than 8 pixels(continous scrolling) if (isLastTokenInLine == false && screenPointer + 1 <= 0xFFFF) { if (setZeroBit) { actByte |= 0x01; } } //move left _spectrum.WriteMemory(screenPointer, actByte); } else { //move right _spectrum.WriteMemory(screenPointer, (byte)(_spectrum.ReadMemory(screenPointer) >> 1)); } screenPointer++; //move to next byte } } else { Locator.Resolve <IUserMessage>().Info("This feature implemented only for Sprite view...Todo!"); } //Refresh setZXImage(); }