示例#1
0
        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();
        }