90 lines
5.9 KiB
C++
90 lines
5.9 KiB
C++
/*
|
|
* 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);
|