public override string Print() { return(address.ToString()); }
/// <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); }