Beispiel #1
0
        public override void ProcessReceivedCharacter(char c)
        {
            if (!inCmd)
            {
                switch (c)
                {
                case CONTROL_E:
                    SendString("CRTerm");
                    break;

                case '\x09':
                    int x = FrameBuffer.X % 8;
                    x            += 8 - x;
                    FrameBuffer.X = x;
                    break;

                case '\x0C':
                    FrameBuffer.Clear();
                    FrameBuffer.Locate(0, 0);
                    break;

                case ESCAPE:
                    inCmd     = true;
                    inOperand = 0;
                    operands.Clear();
                    operands.Add(0);
                    break;

                default:
                    base.ProcessReceivedCharacter(c);
                    break;
                }
            }
            else
            {
                if (inCmd && c >= '0' && c <= '9')
                {
                    operands[inOperand] *= 10;
                    operands[inOperand] += (int)(c - '0');
                }
                else
                {
                    switch (c)
                    {
                    case '[':
                        inOperand = 0;
                        break;

                    case ';':
                        inOperand += 1;
                        operands.Add(0);
                        break;

                    case 'A':
                        inCmd = false;
                        for (int i = 0; i < Math.Max(operands[0], 1); i++)
                        {
                            FrameBuffer.Y -= 1;
                        }
                        break;

                    case 'B':
                        inCmd = false;
                        for (int i = 0; i < Math.Max(operands[0], 1); i++)
                        {
                            FrameBuffer.Y += 1;
                        }
                        break;

                    case 'C':
                        for (int i = 0; i < Math.Max(operands[0], 1); i++)
                        {
                            FrameBuffer.X += 1;
                        }
                        inCmd = false;
                        break;

                    case 'D':
                        inCmd = false;
                        for (int i = 0; i < Math.Max(operands[0], 1); i++)
                        {
                            FrameBuffer.X -= 1;
                        }
                        break;

                    case 'c':
                        FrameBuffer.Clear();
                        FrameBuffer.Locate(0, 0);
                        inCmd = false;
                        break;

                    case 'H':
                        inCmd = false;
                        if (operands.Count > 0)
                        {
                            FrameBuffer.Y = Math.Max(operands[0] - 1, 0);
                        }
                        else
                        {
                            FrameBuffer.Y = 0;
                        }

                        if (operands.Count > 1)
                        {
                            FrameBuffer.X = Math.Max(operands[1] - 1, 0);
                        }
                        else
                        {
                            FrameBuffer.X = 0;
                        }
                        break;

                    case 'J':
                        inCmd = false;
                        if (operands[0] == 1)
                        {
                            FrameBuffer.ClearTopToCursor();
                        }
                        else if (operands[0] == 2)
                        {
                            FrameBuffer.Clear();
                        }
                        else
                        {
                            FrameBuffer.ClearCursorToEnd();
                        }
                        break;

                    case 'n':
                        if (operands[0] == 6)
                        {
                            SendString(ESCAPE + "[" + (FrameBuffer.Y + 1).ToString() + ";" + (FrameBuffer.X + 1).ToString() + "R");
                        }
                        break;

                    default:
                        inCmd = false;
                        break;
                    }
                }
            }
        }