private static void ExecuteNumericAssignment()
        {
            // todo must check numeric assignment flavors
            // todo must handle numeric buffers as targets and values
            long?targetPos    = null;
            long?targetSize   = null;
            bool?isTargetByte = null;

            targetPos = MemPos.GetPosByte(_tokens[_tokenNum]);
            if (targetPos.HasValue)
            {
                targetSize   = 1;
                isTargetByte = true;
            }
            else
            {
                targetPos = MemPos.GetPosNumeric(_tokens[_tokenNum]);
                if (targetPos.HasValue)
                {
                    targetSize   = MemPos.GetSizeNumeric(_tokens[_tokenNum]);
                    isTargetByte = false;
                }
            }
            if (!targetPos.HasValue || !targetSize.HasValue || !isTargetByte.HasValue)
            {
                throw new SystemException("Cannot parse numeric assignment: Target not found");
            }
            _tokenNum++;
            if (_tokens[_tokenNum] == "[")
            {
                _tokenNum++; // "["
                long offset = GetNumericExpression();
                if (_tokens[_tokenNum++] != "]")
                {
                    throw new SystemException("GetNumericAssignment: No closing \"]\"");
                }
                targetPos += offset;
            }
            if (_tokens[_tokenNum] == "(")
            {
                throw new SystemException("TODO: Cannot handle buffer lengths yet");
            }
            if (_tokens[_tokenNum] != "=")
            {
                throw new SystemException("Cannot parse numeric expression: Equals sign expected");
            }
            _tokenNum++;
            long result = GetNumericExpression();

            if (isTargetByte.Value)
            {
                Mem.SetByte(targetPos.Value, result);
            }
            else
            {
                Mem.SetNum(targetPos.Value, targetSize.Value, result);
            }
        }
Exemple #2
0
        private static void ExecuteAlphaAssignment()
        {
            long?targetPos = null;
            bool isBuffer  = false;

            targetPos = MemPos.GetPosAlpha(_tokens[_tokenNum]);
            if (!targetPos.HasValue)
            {
                targetPos = MemPos.GetPosBufferAlpha(_tokens[_tokenNum]);
                if (targetPos.HasValue)
                {
                    isBuffer = true;
                }
            }
            if (!targetPos.HasValue)
            {
                throw new SystemException("Cannot parse alpha assignment: Target not found");
            }
            _tokenNum++;
            if (_tokens[_tokenNum] == "[")
            {
                _tokenNum++; // "["
                long offset = GetNumericExpression();
                if (_tokens[_tokenNum++] != "]")
                {
                    throw new SystemException("ExecuteAlphaAssignment: No closing \"]\"");
                }
                targetPos += offset;
            }
            if (_tokens[_tokenNum] != "=")
            {
                throw new SystemException("Cannot parse alpha expression: Equals sign expected");
            }
            _tokenNum++;
            string result = GetAlphaExpression();

            if (isBuffer)
            {
                long bufferTargetPos = Mem.GetByte(targetPos.Value)
                                       + (256 * Mem.GetByte(targetPos.Value + 1));
                Mem.SetAlpha(bufferTargetPos, result);
                if (result == "")
                {
                    bufferTargetPos += 1;
                }
                else
                {
                    bufferTargetPos += result.Length;
                }
                Mem.SetByte(targetPos.Value + 1, bufferTargetPos / 256);
                Mem.SetByte(targetPos.Value, bufferTargetPos % 256);
            }
            else
            {
                Mem.SetAlpha(targetPos.Value, result);
            }
        }
Exemple #3
0
 private static bool IsAlphaTarget()
 {
     if (MemPos.GetPosAlpha(_tokens[_tokenNum]).HasValue ||
         MemPos.GetPosBufferAlpha(_tokens[_tokenNum]).HasValue)
     {
         if (_tokenNum < _tokenCount)
         {
             if (_tokens[_tokenNum + 1] == "=" ||
                 _tokens[_tokenNum + 1] == "[")
             {
                 return(true);
             }
         }
     }
     return(false);
 }
 private static bool IsNumericTarget()
 {
     if (MemPos.GetPosByte(_tokens[_tokenNum]).HasValue ||
         MemPos.GetPosNumeric(_tokens[_tokenNum]).HasValue)
     {
         if (_tokenNum < _tokenCount)
         {
             if (_tokens[_tokenNum + 1] == "=" ||
                 _tokens[_tokenNum + 1] == "[" ||
                 _tokens[_tokenNum + 1] == "(")
             {
                 return(true);
             }
         }
     }
     return(false);
 }
Exemple #5
0
        private static string GetAlphaExpression()
        {
            if (_tokenNum >= _tokenCount)
            {
                throw new SystemException("Cannot parse alpha expression: Unexpected end of line");
            }
            string result = null;

            if (_tokens[_tokenNum].StartsWith("\"") ||
                _tokens[_tokenNum].StartsWith("'") ||
                _tokens[_tokenNum].StartsWith("$") ||
                _tokens[_tokenNum].StartsWith("%"))
            {
                //if (_tokenNum != _tokenCount - 1)
                //{
                //    throw new SystemException("Cannot parse alpha expression: Tokens after string literal");
                //}
                result = _tokens[_tokenNum].Substring(1, _tokens[_tokenNum].Length - 2);
            }
            else
            {
                long?targetPos = null;
                targetPos = MemPos.GetPosAlpha(_tokens[_tokenNum++]);
                if (!targetPos.HasValue)
                {
                    throw new SystemException("Cannot parse alpha assignment: Target not found");
                }
                if (_tokenNum < _tokenCount && _tokens[_tokenNum] == "[")
                {
                    _tokenNum++; // "["
                    long offset = GetNumericExpression();
                    if (_tokens[_tokenNum++] != "]")
                    {
                        throw new SystemException("GetAlphaExpression: No closing \"]\"");
                    }
                    targetPos += offset;
                }
                result = Mem.GetAlpha(targetPos.Value);
            }
            if (result == null)
            {
                throw new SystemException("Cannot parse alpha expression: No result");
            }
            return(result);
        }
Exemple #6
0
        private static void ExecuteCommand()
        {
            long   tempNum;
            string tempAlpha;

            switch (_tokens[_tokenNum++])
            {
            case "ATT":
                long att = GetNumericValue();
                Screen.SetAttrib(att);
                break;

            case "BACK":
                Screen.Back();
                break;

            case "CAN":
            case "CANCEL":
                // todo check for cancel event
                Mem.SetNum(MemPos.progline, 2, 0);
                break;

            case "CLEAR":
                Screen.Clear();
                break;

            case "CLOSETFA":
                Console.WriteLine("### closetfa");     // todo
                break;

            case "CLOSEVOLUME":
                Console.WriteLine("### closevolume");     // todo
                break;

            case "CONVERT":
                Console.WriteLine("### convert");     // todo
                break;

            case "CR":
                Screen.CursorAt(-1, 0);
                break;

            case "CURSORAT":
                long y = GetNumericValue();
                CheckToken(",");
                long x = GetNumericValue();
                Screen.CursorAt(y, x);
                break;

            case "DCH":
                Console.WriteLine("### dch");
                break;

            case "DISPLAY":
                tempAlpha = GetAlphaExpression();
                Screen.Display(tempAlpha);
                break;

            case "ENTERALPHA":
                CheckToken("(");
                //if (_tokens[_tokenNum++] != "(")
                //{
                //    Console.WriteLine("invalid ENTERALPHA format");
                //    break;
                //}
                tempNum = GetNumericExpression();
                CheckToken(")");
                //if (_tokens[_tokenNum++] != ")")
                //{
                //    Console.WriteLine("invalid ENTERALPHA format");
                //    break;
                //}
                tempAlpha = Keyboard.GetEnteredString(tempNum);
                //todo handle entered alpha string
                break;

            case "ESC":
            case "ESCAPE":
                // todo check for esc event
                Mem.SetByte(MemPos.prog, 0);
                Mem.SetNum(MemPos.progline, 2, 0);
                break;

            case "GOS":
                tempNum = GetNumericExpression();
                GosubStack.Push();
                Mem.SetNum(MemPos.progline, 2, tempNum);
                break;

            case "GOSUB":
                tempNum = GetNumericExpression();
                GosubStack.Push();
                Mem.SetByte(MemPos.prog, tempNum);
                Mem.SetNum(MemPos.progline, 2, 0);
                break;

            case "GOTO":
                tempNum = GetNumericExpression();
                Mem.SetNum(MemPos.progline, 2, tempNum);
                break;

            case "GRAPHOFF":
                Screen.SetGraphics(false);
                break;

            case "GRAPHON":
                Screen.SetGraphics(true);
                break;

            case "HOME":
                Screen.CursorAt(0, 0);
                break;

            case "INIT":
                long?ptrPos  = MemPos.GetPosBufferPtr(_tokens[_tokenNum]);
                long?ptrPage = MemPos.GetPosBufferPage(_tokens[_tokenNum]);
                if (!ptrPos.HasValue || !ptrPage.HasValue)
                {
                    throw new SystemException("INIT error");
                }
                Mem.SetByte(ptrPos.Value + 1, ptrPage.Value);
                Mem.SetByte(ptrPos.Value, 0);
                break;

            case "INITFETCH":
                Console.WriteLine("### initfetch");     // todo
                break;

            case "KLOCK":
                Keyboard.KeyLock(true);
                break;

            case "KFREE":
                Keyboard.KeyLock(false);
                break;

            case "LOAD":
                tempNum = GetNumericExpression();
                Mem.SetByte(MemPos.prog, tempNum);
                Mem.SetNum(MemPos.progline, 2, 0);
                break;

            case "LOCK":
                Data.LockFlag(true);
                break;

            case "MERGE":
                Console.WriteLine("### merge");     // todo
                break;

            case "MOVE":
                Console.WriteLine("### move");     // todo
                break;

            case "NL":
                if (_tokenNum >= _tokenCount)
                {
                    tempNum = 1;
                }
                else
                {
                    tempNum = GetNumericExpression();
                }
                Screen.NL(tempNum);
                break;

            case "NOP":
                break;

            case "PACK":
                Console.WriteLine("### pack");     // todo
                break;

            case "PRINTOFF":
                Mem.SetBool(MemPos.printon, false);
                break;

            case "PRINTON":
                Mem.SetBool(MemPos.printon, true);
                break;

            case "REJECT":
                Screen.Reject();
                break;

            case "RESETSCREEN":
                Screen.Reset();
                break;

            case "RELEASEDEVICE":
                Console.WriteLine("### releasedevice");     // todo
                break;

            case "RETURN":
                GosubStack.Pop();
                break;

            case "SPOOL":
                Console.WriteLine("### spool");     // todo
                break;

            case "STAY":
                Screen.SetStay(true);
                break;

            case "UNLOCK":
                Data.LockFlag(false);
                break;

            case "TAB":
                if (_tokenNum >= _tokenCount)
                {
                    tempNum = 1;
                }
                else
                {
                    tempNum = GetNumericExpression();
                }
                Screen.Tab(tempNum);
                break;

            case "TABCANCEL":
                Console.WriteLine("### tabcancel");     // todo
                break;

            case "TABCLEAR":
                Console.WriteLine("### tabclear");     // todo
                break;

            case "TABSET":
                Console.WriteLine("### tabset");     // todo
                break;

            case "WHENCANCEL":
                Console.WriteLine("### whencancel");     // todo
                break;

            case "WHENERROR":
                Console.WriteLine("### whenerror");     // todo
                break;

            case "WHENESCAPE":
                Console.WriteLine("### whenescape");     // todo
                break;

            case "WRITEBACK":
                Data.WriteBack();
                break;

            case "ZERO":
                for (int i = 0; i <= 20; i++)
                {
                    Mem.SetNum(MemPos.nx(i), MemPos.numslotsize, 0);
                }
                break;

            default:
                Console.WriteLine($"Error: Unknown command {_tokens[_tokenNum - 1]}");
                break;
            }
        }
        private static long GetNumericValue()
        {
            string currToken = _tokens[_tokenNum++];

            if (Functions.IsNumber(currToken))
            {
                return(long.Parse(currToken));
            }
            if (currToken == "FALSE")
            {
                return(0);
            }
            if (currToken == "TRUE")
            {
                return(1);
            }
            long?targetPos    = null;
            long?targetSize   = null;
            bool?isTargetByte = null;
            bool?isBuffer     = null;

            targetPos = MemPos.GetPosByte(currToken);
            if (targetPos.HasValue)
            {
                targetSize   = 1;
                isTargetByte = true;
                isBuffer     = false;
            }
            else
            {
                targetPos = MemPos.GetPosNumeric(currToken);
                if (targetPos.HasValue)
                {
                    targetSize   = MemPos.GetSizeNumeric(currToken);
                    isTargetByte = false;
                    isBuffer     = false;
                }
                else
                {
                    targetPos = MemPos.GetPosBufferPtr(currToken);
                    if (targetPos.HasValue)
                    {
                        if (_tokens[_tokenNum] == "(")
                        {
                            _tokenNum++;
                            targetSize = GetNumericValue();
                            _tokenNum++;
                            isTargetByte = false;
                            isBuffer     = true;
                        }
                    }
                }
            }
            if (!targetPos.HasValue || !targetSize.HasValue || !isTargetByte.HasValue || !isBuffer.HasValue)
            {
                throw new SystemException("GetNumericValue error");
            }
            if (_tokenNum < _tokenCount && _tokens[_tokenNum] == "[")
            {
                _tokenNum++; // "["
                long offset = GetNumericExpression();
                if (_tokens[_tokenNum++] != "]")
                {
                    throw new SystemException("GetNumericValue: No closing \"]\"");
                }
                targetPos += offset;
            }
            if (isTargetByte.Value)
            {
                return(Mem.GetByte(targetPos.Value));
            }
            if (isBuffer.Value)
            {
                return(Mem.GetNumBuffer(targetPos.Value, targetSize.Value));
            }
            return(Mem.GetNum(targetPos.Value, targetSize.Value));
        }