#include "oakdsp.hpp" const instruc_t Instructions[] = { { "", 0 }, // Unknown Operation { "", 0 }, // cmd need further process // ALU-ALM subcodes { "or", CF_USE1|CF_USE2|CF_CHG2 }, //000 Logical Or { "and", CF_USE1|CF_USE2|CF_CHG2 }, //001 And { "xor", CF_USE1|CF_USE2|CF_CHG2 }, //010 Exclusive Or { "add", CF_USE1|CF_USE2|CF_CHG2 }, //011 Add { "tst0", CF_USE1|CF_USE2 }, //100 Test Bit-field for Zeros { "tst1", CF_USE1|CF_USE2 }, //101 Test Bit-field for Ones { "cmp", CF_USE1|CF_USE2 }, //110 Compare { "sub", CF_USE1|CF_USE2|CF_CHG2 }, //111 Subtract // ALM subcodes { "msu", CF_USE1|CF_USE2|CF_CHG2 }, //1000 Multiply and Subtract Previous Product { "addh", CF_USE1|CF_USE2|CF_CHG2 }, //1001 Add to High Accumulator { "addl", CF_USE1|CF_USE2|CF_CHG2 }, //1010 Add to Low Accumulator { "subh", CF_USE1|CF_USE2|CF_CHG2 }, //1011 Subtract from High Accumulator { "subl", CF_USE1|CF_USE2|CF_CHG2 }, //1100 Subtract from Low Accumulator { "sqr", CF_USE1|CF_USE2|CF_CHG2 }, //1101 Square { "sqra", CF_USE1|CF_USE2|CF_CHG2 }, //1110 Square and Accumulate Previous Product { "cmpu", CF_USE1|CF_USE2 }, //1111 Compare Unsigned // MODA-MODB subcodes conditional { "shr", CF_USE1|CF_CHG1 }, //000 Shift Accumulator Right { "shr4", CF_USE1|CF_CHG1 }, //001 Shift Accumulator Right by 4 Bits { "shl", CF_USE1|CF_CHG1 }, //010 Shift Accumulator Left { "shl4", CF_USE1|CF_CHG1 }, //011 Shift Accumulator Left by 4 Bits { "ror", CF_USE1|CF_CHG1 }, //100 Rotate Accumulator Right through Carry { "rol", CF_USE1|CF_CHG1 }, //101 Rotate Accumulator Left through Carry { "clr", CF_CHG1 }, //110 Clear Accumulator { "", 0 }, //111 Mod Reserved // MODA subcodes conditional { "not", CF_USE1|CF_CHG1 }, //1000 Logical Not { "neg", CF_USE1|CF_CHG1 }, //1001 2's Complement of aX-accumulator { "rnd", CF_USE1|CF_CHG1 }, //1010 Round Upper 20 Bits of aX-accumulator { "pacr", CF_USE1|CF_CHG1 }, //1011 Product Move and Round to aX-accumulator { "clrr", CF_USE1|CF_CHG1 }, //1100 Clear and Round aX-accumulator { "inc", CF_USE1|CF_CHG1 }, //1101 Increment Accumulator by One { "dec", CF_USE1|CF_CHG1 }, //1110 Decrement aX-accumulator by One { "copy", CF_USE1|CF_CHG1 }, //1111 Copy aX-accumulator // --- { "norm", CF_USE1|CF_CHG1|CF_USE2 }, //Normalize { "divs", CF_USE1|CF_USE2|CF_CHG2 }, //Division Step // ALB subcodes { "set", CF_USE1|CF_USE2|CF_CHG2 }, //000 Set Bit-field { "rst", CF_USE1|CF_USE2|CF_CHG2 }, //001 Reset Bit-field { "chng", CF_USE1|CF_USE2|CF_CHG2 }, //010 Change Bit-field { "addv", CF_USE1|CF_USE2|CF_CHG2 }, //011 Add Long Immediate Value or Data Memory Location { "tst0", CF_USE1|CF_USE2 }, //100 Test Bit-field for Zeros { "tst1", CF_USE1|CF_USE2 }, //101 Test Bit-field for Ones { "cmpv", CF_USE1|CF_USE2 }, //110 Compare Long Immediate Value to Register or Data Memory Location { "subv", CF_USE1|CF_USE2|CF_CHG2 }, //111 Subtract Long Immediate Value from a Register or a Data Memory Location // --- { "maxd", CF_USE1|CF_CHG1|CF_USE2 }, //Maximum between Data Memory Location and Accumulator { "max", CF_USE1|CF_CHG1|CF_USE2 }, //Maximum between Two Accumulators { "min", CF_USE1|CF_CHG1|CF_USE2 }, //Minimum between Two Accumulators { "lim", CF_USE1|CF_CHG1|CF_USE2 }, //Limit Accumulator (lim aX[, aX]) // MUL subcodes { "mpy", CF_USE1|CF_USE2 }, //000 Multiply { "mpysu", CF_USE1|CF_USE2 }, //001 Multiply Signed by Unsigned { "mac", CF_USE1|CF_USE2|CF_USE3|CF_CHG3 }, //010 Multiply and Accumulate Previous Product { "macus", CF_USE1|CF_USE2|CF_USE3|CF_CHG3 }, //011 Multiply Unsigned by Signed and Accumulate Previous Product { "maa", CF_USE1|CF_USE2|CF_USE3|CF_CHG3 }, //100 Multiply and Accumulate Aligned Previous Product { "macuu", CF_USE1|CF_USE2|CF_USE3|CF_CHG3 }, //101 Multiply Unsigned by Unsigned and Accumulate Previous Product { "macsu", CF_USE1|CF_USE2|CF_USE3|CF_CHG3 }, //110 Multiply Signed by Unsigned and Accumulate Previous Product { "maasu", CF_USE1|CF_USE2|CF_USE3|CF_CHG3 }, //111 Multiply Signed by Unsigned and Accumulate Aligned Previous Product //--- { "mpyi", CF_USE1|CF_USE2 }, //Multiply Signed Short Immediate { "msu", CF_USE1|CF_USE2|CF_USE3|CF_CHG3 }, //Multiply and Subtract Previous Product { "tstb", CF_USE1|CF_USE2 }, //Test Specific Bit { "shfc", CF_USE1|CF_USE2|CF_CHG2 }, //Shift Accumulators according to Shift Value Register { "shfi", CF_USE1|CF_USE2|CF_CHG2|CF_USE3 }, //Shift Accumulators by an Immediate Shift Value { "exp", CF_USE1|CF_USE2|CF_CHG2 }, //Evaluate the Exponent Value //--- { "mov", CF_USE1|CF_CHG2 }, //Move Data { "movp", CF_USE1|CF_CHG2 }, //Move from Program Memory into Data Memory { "movs", CF_USE1|CF_CHG2 }, //Move and Shift According to Shift Value Register { "movsi", CF_USE1|CF_USE2|CF_CHG2|CF_USE3 }, //Move and Shift According to an Immediate Shift Value { "movr", CF_USE1|CF_CHG2 }, //Move and Round { "movd", CF_USE1|CF_CHG2 }, //Move from Data Memory into Program Memory //--- { "push", CF_USE1 }, //Push Register or Long Immediate Value onto Stack { "pop", CF_USE1|CF_CHG1 }, //Pop from Stack into Register //--- { "swap", CF_USE1 }, //Swap aX- and bX-accumulators { "banke", CF_USE1 }, //Bank Exchange { "rep", CF_USE1 }, //Repeat Next Instruction { "bkrep", CF_USE1|CF_USE2 }, //Block-Repeat { "break", 0 }, //Break from Block-repeat //--- { "br", CF_USE1|CF_JUMP }, //Conditional Branch { "brr", CF_USE1|CF_JUMP }, //Relative Conditional Branch { "br", CF_USE1|CF_STOP|CF_JUMP }, //UnConditional Branch { "brr", CF_USE1|CF_STOP|CF_JUMP }, //Relative UnConditional Branch { "call", CF_USE1|CF_CALL }, //Conditional Call Subroutine { "callr", CF_USE1|CF_CALL }, //Relative Conditional Call Subroutine { "calla", CF_USE1 }, //Call Subroutine at Location Specified by Accumulator //--- { "ret", 0 }, //Return Conditionally { "ret", CF_STOP }, //Return UnConditionally { "retd", 0 }, //Delayed Return { "reti", 0 }, //Return from Interrupt Conditionally { "reti", CF_STOP }, //Return from Interrupt UnConditionally { "retid", 0 }, //Delayed Return from Interrupt { "rets", CF_USE1|CF_STOP }, //Return with Short Immediate Parameter //--- { "cntx", CF_USE1 }, //Context Switching Store or Restore { "nop", 0 }, //No operation { "modr", CF_USE1|CF_USE2 }, //Modify rN { "dint", 0 }, //Disable Interrupt { "eint", 0 }, //Enable Interrupt //--- { "trap", CF_STOP }, //Software Interrupt //--- { "lpg", CF_USE1 }, //Load the Page Bits { "load", CF_USE1|CF_CHG2 }, //Load Specific Fields into Registers { "mov", CF_USE1|CF_CHG2|CF_USE3 }, //Move Data, eu }; CASSERT(qnumber(Instructions) == OAK_Dsp_last);