/* * Interactive disassembler (IDA). * Intel 80196 module * */ #include "i196.hpp" const instruc_t Instructions[] = { { "", 0 }, // Unknown Operation { "add", CF_USE2|CF_USE1|CF_CHG1 }, // Add words (2 operands) { "add", CF_USE3|CF_USE2|CF_CHG1 }, // Add words (3 operands) { "addb", CF_USE2|CF_USE1|CF_CHG1 }, // Add bytes (2 operands) { "addb", CF_USE3|CF_USE2|CF_CHG1 }, // Add bytes (3 operands) { "addc", CF_USE2|CF_USE1|CF_CHG1 }, // Add words with carry { "addcb", CF_USE2|CF_USE1|CF_CHG1 }, // Add bytes with carry { "and", CF_USE2|CF_USE1|CF_CHG1 }, // Logical AND words (2 operands) { "and", CF_USE3|CF_USE2|CF_CHG1 }, // Logical AND words (3 operands) { "andb", CF_USE2|CF_USE1|CF_CHG1 }, // Logical AND bytes (2 operands) { "andb", CF_USE3|CF_USE2|CF_CHG1 }, // Logical AND bytes (3 operands) { "bmov", CF_USE2|CF_USE1 }, // Block move { "bmovi", CF_USE2|CF_USE1 }, // Interruptable block move { "br", CF_JUMP|CF_USE1|CF_STOP }, // Branch indirect { "clr", CF_CHG1 }, // Clear word { "clrb", CF_CHG1 }, // Clear byte { "clrc", 0 }, // Clear carry flag { "clrvt", 0 }, // Clear overflow-trap flag { "cmp", CF_USE2|CF_USE1 }, // Compare words { "cmpb", CF_USE2|CF_USE1 }, // Compare bytes { "cmpl", CF_USE2|CF_USE1 }, // Compare long { "dec", CF_USE1|CF_CHG1 }, // Decrement word { "decb", CF_USE1|CF_CHG1 }, // Decrement byte { "di", 0 }, // Disable interrupts { "div", CF_USE2|CF_USE1|CF_CHG1 }, // Divide integers { "divb", CF_USE2|CF_USE1|CF_CHG1 }, // Divide short-integers { "divu", CF_USE2|CF_USE1|CF_CHG1 }, // Divide words, unsigned { "divub", CF_USE2|CF_USE1|CF_CHG1 }, // Divide bytes, unsigned { "djnz", CF_USE2|CF_USE1|CF_CHG1 }, // Decrement and jump if not zero { "djnzw", CF_USE2|CF_USE1|CF_CHG1 }, // Decrement and jump if not zero word { "dpts", 0 }, // Disable peripheral transaction server { "ei", 0 }, // Enable interrupts { "epts", 0 }, // Enable peripheral transaction server { "ext", CF_USE1|CF_CHG1 }, // Sign-extend integer into long-integer { "extb", CF_USE1|CF_CHG1 }, // Sign-extend short-integer into integer { "idlpd", CF_USE1 }, // Idle/powerdown { "inc", CF_USE1|CF_CHG1 }, // Increment word { "incb", CF_USE1|CF_CHG1 }, // Increment byte { "jbc", CF_USE3|CF_USE2|CF_USE1 }, // Jump if bit is clear { "jbs", CF_USE3|CF_USE2|CF_USE1 }, // Jump if bit is set { "jc", CF_USE1 }, // Jump if carry flag is set { "je", CF_USE1 }, // Jump if equal { "jge", CF_USE1 }, // Jump if signed greater than or equal { "jgt", CF_USE1 }, // Jump if signed greater than { "jh", CF_USE1 }, // Jump if higher (unsigned) { "jle", CF_USE1 }, // Jump if signed less than or equal { "jlt", CF_USE1 }, // Jump if signed less than { "jnc", CF_USE1 }, // Jump if carry flag is clear { "jne", CF_USE1 }, // Jump if not equal { "jnh", CF_USE1 }, // Jump if not higher (unsigned) { "jnst", CF_USE1 }, // Jump if sticky bit flag is clear { "jnv", CF_USE1 }, // Jump if overflow flag is clear { "jnvt", CF_USE1 }, // Jump if overflow-trap flag is clear { "jst", CF_USE1 }, // Jump if sticky bit flag is set { "jv", CF_USE1 }, // Jump if overflow flag is set { "jvt", CF_USE1 }, // Jump if overflow-trap flag is set { "lcall", CF_USE1|CF_CALL }, // Long call { "ld", CF_USE2|CF_CHG1 }, // Load word { "ldb", CF_USE2|CF_CHG1 }, // Load byte { "ldbse", CF_USE2|CF_CHG1 }, // Load byte sign-extended { "ldbze", CF_USE2|CF_CHG1 }, // Load byte zero-extended { "ljmp", CF_USE1|CF_STOP }, // Long jump { "mul", CF_USE2|CF_USE1|CF_CHG1 }, // Multiply integers (2 operands) { "mul", CF_USE3|CF_USE2|CF_CHG1 }, // Multiply integers (3 operands) { "mulb", CF_USE2|CF_USE1|CF_CHG1 }, // Multiply short-integers (2 operands) { "mulb", CF_USE3|CF_USE2|CF_CHG1 }, // Multiply short-integers (3 operands) { "mulu", CF_USE2|CF_USE1|CF_CHG1 }, // Multiply words, unsigned (2 operands) { "mulu", CF_USE3|CF_USE2|CF_CHG1 }, // Multiply words, unsigned (3 operands) { "mulub", CF_USE2|CF_USE1|CF_CHG1 }, // Multiply bytes, unsigned (2 operands) { "mulub", CF_USE3|CF_USE2|CF_CHG1 }, // Multiply bytes, unsigned (3 operands) { "neg", CF_USE1|CF_CHG1 }, // Negate integer { "negb", CF_USE1|CF_CHG1 }, // Negate short-integer { "nop", 0 }, // No operation { "norml", CF_USE1|CF_CHG2|CF_CHG1 }, // Normalize long-integer { "not", CF_USE1|CF_CHG1 }, // Complement word { "notb", CF_USE1|CF_CHG1 }, // Complement byte { "or", CF_USE2|CF_USE1|CF_CHG1 }, // Logical OR words { "orb", CF_USE2|CF_USE1|CF_CHG1 }, // Logical OR bytes { "pop", CF_CHG1 }, // Pop word { "popa", 0 }, // Pop all { "popf", 0 }, // Pop flags { "push", CF_USE1 }, // Push word { "pusha", 0 }, // Push all { "pushf", 0 }, // Push flags { "ret", CF_STOP }, // Return from subroutine { "rst", CF_STOP }, // Reset system { "scall", CF_USE1|CF_CALL }, // Short call { "setc", 0 }, // Set carry flag { "shl", CF_SHFT|CF_USE2|CF_USE1|CF_CHG1 }, // Shift word left { "shlb", CF_SHFT|CF_USE2|CF_USE1|CF_CHG1 }, // Shift byte left { "shll", CF_SHFT|CF_USE2|CF_USE1|CF_CHG1 }, // Shift double-word left { "shr", CF_SHFT|CF_USE2|CF_USE1|CF_CHG1 }, // Logical right shift word { "shra", CF_SHFT|CF_USE2|CF_USE1|CF_CHG1 }, // Arithmetic right shift word { "shrab", CF_SHFT|CF_USE2|CF_USE1|CF_CHG1 }, // Arithmetic right shift byte { "shral", CF_SHFT|CF_USE2|CF_USE1|CF_CHG1 }, // Arithmetic right shift double-word { "shrb", CF_SHFT|CF_USE2|CF_USE1|CF_CHG1 }, // Logical right shift byte { "shrl", CF_SHFT|CF_USE2|CF_USE1|CF_CHG1 }, // Logical right shift double-word { "sjmp", CF_USE1|CF_STOP }, // Short jump { "skip", CF_USE1 }, // Two byte no-operation { "st", CF_USE1|CF_CHG2 }, // Store word { "stb", CF_USE1|CF_CHG2 }, // Store byte { "sub", CF_USE2|CF_USE1|CF_CHG1 }, // Subtract words (2 operands) { "sub", CF_USE3|CF_USE2|CF_CHG1 }, // Subtract words (3 operands) { "subb", CF_USE2|CF_USE1|CF_CHG1 }, // Subtract bytes (2 operands) { "subb", CF_USE3|CF_USE2|CF_CHG1 }, // subtract bytes (3 operands) { "subc", CF_USE2|CF_USE1|CF_CHG1 }, // Subtract words with borrow { "subcb", CF_USE2|CF_USE1|CF_CHG1 }, // Subtract bytes with borrow { "tijmp", CF_JUMP|CF_USE3|CF_USE2|CF_USE1|CF_STOP }, // Table indirect jump { "trap", 0 }, // Software trap { "xch", CF_USE2|CF_USE1|CF_CHG2|CF_CHG1 }, // Exchange word { "xchb", CF_USE2|CF_USE1|CF_CHG2|CF_CHG1 }, // Exchange byte { "xor", CF_USE2|CF_USE1|CF_CHG1 }, // Logical exclusive-or words { "xorb", CF_USE2|CF_USE1|CF_CHG1 }, // Logical exclusive-or bytes // 8x196NU, NP instructions { "ebmovi", CF_USE1|CF_USE2 }, // Extended interruptable block move { "ebr", CF_USE1|CF_STOP }, // Extended branch indirect { "ecall", CF_USE1|CF_CALL }, // Extended call { "ejmp", CF_USE1|CF_STOP }, // Extended jump { "eld", CF_CHG1|CF_USE2 }, // Extended load word { "eldb", CF_CHG1|CF_USE2 }, // Extended load byte { "est", CF_USE1|CF_CHG2 }, // Extended store word { "estb", CF_USE1|CF_CHG2 }, // Extended store byte }; CASSERT(qnumber(Instructions) == I196_last);