/* * Interactive disassembler (IDA). * Copyright (c) 1990-98 by Ilfak Guilfanov. * ALL RIGHTS RESERVED. * E-mail: ig@estar.msk.su, ig@datarescue.com * FIDO: 2:5020/209 * */ #include "i51.hpp" const instruc_t Instructions[] = { { "", 0 }, // Unknown Operation { "acall", CF_USE1|CF_CALL }, // Absolute Call { "add", CF_USE1|CF_USE2|CF_CHG1 }, // Add Second Operand to Acc { "addc", CF_USE1|CF_USE2|CF_CHG1 }, // Add Second Operand to Acc with carry { "ajmp", CF_USE1|CF_STOP }, // Absolute Jump { "anl", CF_USE1|CF_USE2|CF_CHG1 }, // Logical AND (op1 &= op2) { "cjne", CF_USE1|CF_USE2|CF_USE3 }, // Compare Operands and JNE { "clr", CF_CHG1 }, // Clear Operand (0) { "cpl", CF_USE1|CF_CHG1 }, // Complement Operand { "da", CF_USE1|CF_CHG1 }, // Decimal Adjust Accumulator { "dec", CF_USE1|CF_CHG1 }, // Decrement Operand { "div", CF_USE1|CF_CHG1 }, // Divide Acc by B { "djnz", CF_USE1|CF_CHG1|CF_USE2 }, // Decrement Operand and JNZ { "inc", CF_USE1|CF_CHG1 }, // Increment Operand { "jb", CF_USE1|CF_USE2 }, // Jump if Bit is set { "jbc", CF_USE1|CF_USE2 }, // Jump if Bit is set & clear Bit { "jc", CF_USE1 }, // Jump if Carry is set { "jmp", CF_USE1|CF_STOP|CF_JUMP }, // Jump indirect relative to Data Pointer { "jnb", CF_USE1|CF_USE2 }, // Jump if Bit is clear { "jnc", CF_USE1 }, // Jump if Carry is clear { "jnz", CF_USE1 }, // Jump if Acc is not zero { "jz", CF_USE1 }, // Jump if Acc is zero { "lcall", CF_USE1|CF_CALL }, // Long Subroutine Call { "ljmp", CF_USE1|CF_STOP }, // Long Jump { "mov", CF_CHG1|CF_USE2 }, // Move (Op1 <- Op2) { "movc", CF_CHG1|CF_USE2 }, // Move code byte relative to second op to Acc { "movx", CF_CHG1|CF_USE2 }, // Move from/to external RAM { "mul", CF_USE1|CF_CHG1 }, // Multiply Acc by B { "nop", 0 }, // No operation { "orl", CF_USE1|CF_USE2|CF_CHG1 }, // Logical OR (op1 |= op2) { "pop", CF_CHG1 }, // Pop from Stack and put in Direct RAM { "push", CF_USE1 }, // Push from Direct RAM to Stack { "ret", CF_STOP }, // Return from subroutine { "reti", CF_STOP }, // Return from Interrupt { "rl", CF_USE1|CF_CHG1 }, // Rotate Acc left { "rlc", CF_USE1|CF_CHG1 }, // Rotate Acc left through Carry { "rr", CF_USE1|CF_CHG1 }, // Rotate Acc right { "rrc", CF_USE1|CF_CHG1 }, // Rotate Acc right through Carry { "setb", CF_CHG1 }, // Set Direct Bit { "sjmp", CF_USE1|CF_STOP }, // Short jump { "subb", CF_USE1|CF_USE2|CF_CHG1 }, // Subtract Second Operand from Acc with Borrow { "swap", CF_USE1|CF_CHG1 }, // Swap nibbles of Acc { "xch", CF_USE1|CF_CHG1|CF_USE2|CF_CHG2 }, // Exchange Operands { "xchd", CF_USE1|CF_CHG1|CF_USE2|CF_CHG2 }, // Exchange Digit in Acc with Indirect RAM { "xrl", CF_USE1|CF_USE2|CF_CHG1 }, // Exclusive OR (op1 ^= op2) // 80251 instructions { "jsle", CF_USE1 }, // Jump if less than or equal (signed) { "jsg", CF_USE1 }, // Jump if greater than (signed) { "jle", CF_USE1 }, // Jump if less than or equal { "jg", CF_USE1 }, // Jump if greater than { "jsl", CF_USE1 }, // Jump if less than (signed) { "jsge", CF_USE1 }, // Jump if greater than or equal (signed) { "je", CF_USE1 }, // Jump if equal { "jne", CF_USE1 }, // Jump if not equal { "trap", 0 }, // Trap { "ejmp", CF_USE1|CF_STOP }, // Extended jump { "ecall", CF_USE1|CF_CALL }, // Extended call { "eret", CF_STOP }, // Extended return { "movh", CF_CHG1|CF_USE2 }, // Move immediate 16-bit data to the high word of a dword (double-word) register { "movz", CF_CHG1|CF_USE2 }, // Move 8-bit register to 16-bit register with zero extension { "movs", CF_CHG1|CF_USE2 }, // Move 8-bit register to 16-bit register with sign extension { "srl", CF_CHG1 }, // Shift logical right by 1 bit { "sra", CF_CHG1 }, // Shift arithmetic right by 1 bit { "sll", CF_CHG1 }, // Shift logical left by 1 bit { "sub", CF_CHG1|CF_USE2 }, // Subtract { "cmp", CF_USE1|CF_USE2 }, // Compare // 51mx instructions { "emov", CF_CHG1|CF_USE2 }, // Move (Op1 <- Op2) }; CASSERT(qnumber(Instructions) == I51_last);