124 lines
8.6 KiB
C++
124 lines
8.6 KiB
C++
|
|
#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);
|