public override string Print()
 {
     return(address.ToString());
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Returns a human-readable  description of the instruction and operand value located
        /// at Address. The string has two parts, delimited by a |
        /// mnemonic target address | complete description of instruction and result
        /// </summary>
        /// <param name="Address">Absolute address of 3-byte instruction</param>
        /// <returns>String with description</returns>
        public String GetInstructionDescription(int Address)
        {
            string Result  = string.Empty;
            string Details = string.Empty;
            string Effect  = string.Empty;
            int    Word;

            Word = this.FetchWord(Address); // Fetch the Word at Address
            int  TargetAddress;
            int  OpCode;
            bool INDEXED = false;
            int  XBit    = 0;

            XBit    = (Word & 0x8000);
            INDEXED = (XBit > 0);

            TargetAddress = Word & 0x7FFF;
            OpCode        = Word & 0xFF0000;
            OpCode        = OpCode >> 16;


            switch (OpCode)
            {
            case 0x18:     //   ADD
                Result  = "ADD";
                Details = "Add Value in Target Address to Register A";
                Effect  = "A <- (A) + (TA)";
                break;

            case 0x40:     //   AND
                Result  = "AND";
                Details = "Perform Bitwise AND on Value in Target Address and Register A, store result in A";
                Effect  = "A <- (A) && (TA)";
                break;

            case 0x28:      // CMP   (Compare and set Status Word SW)
                Result = "CMP";
                break;

            case 0x24:     // DIV
                Result  = "DIV";
                Details = "Divide Register A by Value in Target Address ";
                Effect  = "A <- (A) / (TA)";
                break;

            case 0x3C:     //   J
                Result  = "J";
                Details = "Perform Unconditional Jump to Target Address";
                Effect  = "PC <- (TA)";
                break;

            case 0x30:     //   JEQ
                Result  = "JEQ";
                Details = "Perform Conditional Jump to Target Address when CC = 00";
                Effect  = "PC <- (TA) if CC = 00";
                break;

            case 0x34:     //   JGT
                Result  = "JGT";
                Details = "Perform Conditional Jump to Target Address when CC = 10";
                Effect  = "PC <- (TA) if CC = 10";
                break;

            case 0x38:     //   JLT
                Result  = "JLT";
                Details = "Perform Conditional Jump to Target Address when CC = 01";
                Effect  = "PC <- (TA) if CC = 01";
                break;

            case 0x48:     // JSUB      (Jump to subroutine starting at TA. Preserve PC by storing in L)
                Result  = "JSUB";
                Details = "Jump to Subroutine at Target Address. Preserve PC By Storing in L";
                Effect  = "L <- PC; PC <- (TA)";
                break;

            case 0x00:     // LDA
                Result  = "LDA";
                Details = "Load Value in Target Address to Register A";
                Effect  = "A <- (TA)";
                break;

            case 0x50:     //  LDCH
                Result  = "LDCH";
                Details = "Load Character from Device Specified in Target Address to Rightmost Byte in A";
                Effect  = "A[rightmost byte] <- Device(TA)";
                break;

            case 0x08:     //  LDL
                Result  = "LDL";
                Details = "Load Value in Target Address to Register L";
                Effect  = "L <- (TA)";
                break;

            case 0x04:     //  LDX
                Result  = "LDX";
                Details = "Load Value in Target Address to Register X";
                Effect  = "X <- (TA)";
                break;

            case 0x20:      // MUL
                Result  = "MUL";
                Details = "Multiple Value in Target Address by Register A Store in A";
                Effect  = "A <- (A) * (TA)";
                break;

            case 0x44:     //   OR
                Result  = "OR";
                Details = "Perform Bitwise OR on Value in Target Address and Register A, store result in A";
                Effect  = "A <- (A) || (TA)";
                break;

            case 0x4C:     //    RSUB
                Result  = "RSUB";
                Details = "Return from Subroutine. ";
                Effect  = "PC <- (L)";
                break;

            case 0x0C:     //   STA         (Stores contents of A in Target Address)
                Result  = "STA";
                Details = "Store Value in Register A to Target Address";
                Effect  = "(TA) <- A";
                break;

            case 0x54:     //   STCH
                Result = "STCH";
                break;

            case 0x14:     //   STL
                Result  = "STL";
                Details = "Store Value in Register L to Target Address";
                Effect  = "(TA) <- L";
                break;

            case 0x10:     //   STX         (Stores contents of X in Target Address)
                Result  = "STX";
                Details = "Store Value in Register X to Target Address";
                Effect  = "(TA) <- X";
                break;

            case 0x1C:     // SUB
                Result  = "SUB";
                Details = "Sub Value in Target Address to Register A";
                Effect  = "A <- (A) - (TA)";
                break;

            case 0xE0:     //   TD          (Tests to see if a device is busy).
                Result  = "TD";
                Details = "Test Device Number Specified in Target Address";
                Effect  = "Set SW";
                break;

            case 0x2C:     //   TIX
                Result  = "TIX";
                Details = "Increment value in X Register. Compare to value in Target Address";
                Effect  = "X <- X + 1; COMP X to M set CC";
                break;

            case 0xDC:     //   WD          (Write to Device)
                Result  = "WD";
                Details = "Write rightmost byte in A to Device Number in Target Address";
                Effect  = " Device(TA) <- A[rightmost byte]";
                break;

            default:
                Result = "";
                break;
            }
            Result += " ";
            if (INDEXED == true)
            {
                Result        += "TA = TA + X ->" + TargetAddress.ToString(("X6")) + '+' + X.ToString(("X6")) + "->" + (TargetAddress + TargetAddress + X).ToString(("X6"));
                TargetAddress += this.X;   // Add contents of X register to address for indexed Mode
            }
            else
            {
                Result += "TA = " + TargetAddress.ToString("X6");
            }
            Result = Result + "|" + Details + "|" + Effect;
            return(Result);
        }