Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 2nd, 2012  |  syntax: None  |  size: 22.19 KB  |  hits: 20  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. /*
  2.  *  Interactive disassembler (IDA).
  3.  *  SPU Processor Module.
  4.  *
  5.  *  (c) 2010 Niraj Khadka
  6.  */
  7.  
  8.  
  9.  /*
  10.  // from here..
  11. #define dt_byte         0       // 8 bit
  12. #define dt_word         1       // 16 bit
  13. #define dt_dword        2       // 32 bit
  14. #define dt_float        3       // 4 byte
  15. #define dt_double       4       // 8 byte
  16. #define dt_tbyte        5       // variable size (ph.tbyte_size)
  17. #define dt_packreal     6       // packed real format for mc68040
  18. // ...to here the order should not be changed, see mc68000
  19. #define dt_qword        7       // 64 bit
  20. #define dt_byte16       8       // 128 bit
  21. #define dt_code         9       // ptr to code (not used?)
  22. #define dt_void         10      // none
  23. #define dt_fword        11      // 48 bit
  24. #define dt_bitfild      12      // bit field (mc680x0)
  25. #define dt_string       13      // pointer to asciiz string
  26. #define dt_unicode      14      // pointer to unicode string
  27. #define dt_3byte        15      // 3-byte data
  28. #define dt_ldbl         16      // long double (which may be different from tbyte)
  29. */
  30.  
  31.  
  32. #include "ins.hpp"
  33. #include "SPU.hpp"
  34. #include "ana.hpp"
  35.  
  36. #define LNOP 0X1        //opcode for lnop
  37. #define NOP  0X201      //opcode for nop
  38. #define SYNC 0X2        //opcode for sync
  39. #define DSYNC 0X3       //opcodefor dsync
  40. #define TOTAL_NO_OF_OPCODES 198                 //total no of opcodes.
  41.  
  42. //function prototypes declared in ana.hpp
  43.  
  44. unsigned long select_hbr_p_field(unsigned long)
  45. {
  46.         unsigned long i,j,k;
  47.        
  48.         i = data<<11;
  49.         j = i>>31;                      //for selecting single bit..
  50.         k = j&0X1;                      //masking by 0b1 ie in hex 0X1
  51.        
  52.         return k;
  53. }
  54.  
  55. unsigned long select_ROH_hbr(unsigned long)
  56. {
  57.         unsigned long i,j,k;
  58.        
  59.         i = data<<16;
  60.         j = i>>30;                      //for selecting two bits..
  61.         k = j&0X3;                      //masking by 0b11 ie in hex 0X3
  62.        
  63.         return k;
  64. }
  65.  
  66. unsigned long select_ROH(unsigned long data)
  67. {
  68.         unsigned long i,j,k;
  69.        
  70.         i = data<<7;
  71.         j = i>>30;                      //for selecting two bits..
  72.         k = j&0X3;                      //masking by 0b11 ie in hex 0X3
  73.        
  74.         return k;
  75. }      
  76.  
  77. unsigned long select_bit_13(unsigned long data);                        //for interrupt enable boolean check..
  78. {
  79.         unsigned long i,j,k;
  80.        
  81.         i = data<<13;
  82.         j = i>>31;                      //only need single bit.
  83.         k = j&0X1;
  84.        
  85.         return k;
  86. }
  87.  
  88. unsigned long select_bit_12(unsigned long data)                         //for interrupt disable boolean check.
  89. {
  90.         unsigned long i,j,k;
  91.        
  92.         i = data<<12;
  93.         j = i>>31;                      //only need single bit.
  94.         k = j&0X1;
  95.         return k;
  96. }
  97.  
  98. unsigned long select_i18(unsigned long data)                            //for selecting immediate 18 (i18) field
  99. {
  100.         unsigned long i,j,k;
  101.        
  102.         i = data<<7;
  103.         j = i>>14;
  104.         k = j&0X3FFFF;
  105.         return k;
  106. }
  107.  
  108. unsigned long select_i16(unsigned long data)
  109. {
  110.         unsigned long i,j,k;
  111.        
  112.         i = data<<9;
  113.         j = i>>16;
  114.         k = j&0XFFFF;
  115.         return k;
  116. }
  117.  
  118. unsigned long select_i10(unsigned long data)
  119. {
  120.         unsigned long i,j,k;
  121.        
  122.         i = data<<8;
  123.         j = i>>22;
  124.         k = j&0X3FF;
  125.         return k;
  126. }
  127.  
  128. unsigned long select_i7(unsigned long data)
  129. {
  130.         unsigned long i,j,k;
  131.        
  132.         i = data<<11;
  133.         j = i>>25;
  134.         k = j&0X7F;
  135.         return k;
  136. }
  137.  
  138.  
  139. //rc selection for inst.
  140. unsigned long select_rc(unsigned long data)
  141. {
  142.         unsigned long i,j,k;
  143.        
  144.         i = data<<25;
  145.         j = i>>25;
  146.         k = j&0X7F;
  147.         return k;
  148.  
  149. }
  150.  
  151.  
  152. //rb selection for inst.
  153. unsigned long select_rb(unsigned long data)
  154. {
  155.         unsigned long i,j,k;
  156.        
  157.         i = data<<11;
  158.         j = i>>25;
  159.         k = j&0X7F;
  160.         return k;
  161.  
  162. }
  163.  
  164.  
  165.  
  166. //ra selection for inst.
  167. unsigned long select_ra(unsigned long data)
  168. {
  169.         unsigned long i,j,k;
  170.        
  171.         i = data<<18;
  172.         j = i>>25;
  173.         k = j&0X7F;
  174.         return k;
  175.  
  176. }
  177.  
  178.  
  179.  
  180.  
  181. //rt selection for inst.
  182. unsigned long select_rt(unsigned long data)
  183. {
  184.         unsigned long i,j,k;
  185.        
  186.         i = data<<25;
  187.         j = i>>25;
  188.         k = j&0X7F;
  189.         return k;
  190. }
  191.        
  192. //rt selection for inst type rrr
  193. unsigned long select_rt_rrr(unsigned long data)
  194. {
  195.         unsigned long i,j,k;
  196.        
  197.         i = data<<4;
  198.         j = i>>25;
  199.         k = j&0X7F;
  200.         return k;
  201. }      
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208. //array containing all opcodes
  209. unsigned long opcodes_hex[]={
  210. 0X34,
  211. 0X1C4,
  212. 0X61,
  213. 0X67,
  214. 0X24,
  215. 0X144,
  216. 0X41,
  217. 0X47,
  218. 0X1F4,
  219. 0X1D4,
  220. 0X1F5,
  221. 0X1D5,
  222. 0X1F6,
  223. 0X1D6,
  224. 0X1F7,
  225. 0X1D7,
  226. 0X83,
  227. 0X82,
  228. 0X81,
  229. 0X21,
  230. 0XC1,
  231. 0X65,
  232. 0XC8,
  233. 0X1D,
  234. 0XC0,
  235. 0X1C,
  236. 0X48,
  237. 0XD,
  238. 0X40,
  239. 0XC,
  240. 0X340,
  241. 0XC2,
  242. 0X342,
  243. 0X341,
  244. 0X42,
  245. 0X343,
  246. 0X3C4,
  247. 0X3CC,
  248. 0X74,
  249. 0X75,
  250. 0XC,
  251. 0X3C5,
  252. 0X3C7,
  253. 0X3C6,
  254. 0X346,
  255. 0X3CE,
  256. 0X34E,
  257. 0X2A5,
  258. 0X2B4,
  259. 0X1B6,
  260. 0X1B5,
  261. 0X1B4,
  262. 0X1B2,
  263. 0X1B1,
  264. 0X1B0,
  265. 0XD3,
  266. 0X53,
  267. 0X253,
  268. 0X2B6,
  269. 0X2AE,
  270. 0X2A6,
  271. 0XC1,
  272. 0X2C1,
  273. 0X16,
  274. 0X15,
  275. 0X14,
  276. 0X41,
  277. 0X2C9,
  278. 0X6,
  279. 0X5,
  280. 0X4,
  281. 0X1F0,
  282. 0X241,
  283. 0X46,
  284. 0X45,
  285. 0X44,
  286. 0XC9,
  287. 0X49,
  288. 0X249,
  289. 0X8,
  290. 0XB,
  291. 0X5F,
  292. 0X7F,
  293. 0X5B,
  294. 0X7B,
  295. 0X1DB,
  296. 0X1FB,
  297. 0X1DF,
  298. 0X1FF,
  299. 0X1CF,
  300. 0X5C,
  301. 0X7C,
  302. 0X58,
  303. 0X78,
  304. 0X1DC,
  305. 0X1FC,
  306. 0X1CC,
  307. 0X1D8,
  308. 0X1F8,
  309. 0X5D,
  310. 0X7D,
  311. 0X59,
  312. 0X79,
  313. 0X1DD,
  314. 0X1FD,
  315. 0X1D9,
  316. 0X1F9,
  317. 0X5E,
  318. 0X7E,
  319. 0X5A,
  320. 0X7A,
  321. 0X3D8,
  322. 0X7F,
  323. 0X258,
  324. 0X4F,
  325. 0X2D8,
  326. 0X5F,
  327. 0X3D0,
  328. 0X7E,
  329. 0X3C8,
  330. 0X7D,
  331. 0X3C0,
  332. 0X7C,
  333. 0X250,
  334. 0X4E,
  335. 0X248,
  336. 0X4D,
  337. 0X240,
  338. 0X4C,
  339. 0X2D0,
  340. 0X5E,
  341. 0X2C8,
  342. 0X5D,
  343. 0X2C0,
  344. 0X5C,
  345. 0X64,
  346. 0X60,
  347. 0X66,
  348. 0X62,
  349. 0X1A8,
  350. 0X1AA,
  351. 0X1AB,
  352. 0X1A9,
  353. 0X42,
  354. 0X40,
  355. 0X46,
  356. 0X44,
  357. 0X128,
  358. 0X129,
  359. 0X12A,
  360. 0X12B,
  361. 0X1AC,
  362. 0X8,
  363. 0X9,
  364. 0X2C4,
  365. 0X2CC,
  366. 0X2C5,
  367. 0X2CD,
  368. 0X2C6,
  369. 0X2CE,
  370. 0XE,
  371. 0X35C,
  372. 0XD,
  373. 0X35E,
  374. 0XF,
  375. 0X35D,
  376. 0X35F,
  377. 0X1B8,
  378. 0X1B9,
  379. 0X3D4,
  380. 0X1DA,
  381. 0X1D8,
  382. 0X1DB,
  383. 0X1D9,
  384. 0X3B9,
  385. 0X3B8,
  386. 0X3C3,
  387. 0X3CB,
  388. 0X2C3,
  389. 0X2CB,
  390. 0X3BF,
  391. 0X3C2,
  392. 0X3CA,
  393. 0X2C2,
  394. 0X2CA,
  395. 0X3BA,
  396. 0X398,
  397. 0X0,
  398. 0X140,
  399. 0X1,
  400. 0X201,
  401. 0X2,
  402. 0X3,
  403. 0XC,
  404. 0X10C,
  405. 0XD,
  406. 0XF,
  407. 0x10D
  408. };
  409.  
  410.  
  411.        
  412.         //check for opcode  style.
  413. unsigned long check_opcode(unsigned long data)
  414. {
  415.         unsigned long i;
  416.        
  417.         unsigned long opcode_8bit, opcode_11bit, opcode_4bit, opcode_9bit, opcode_7bit;
  418.         opcode_8bit = (data>>24)&0XFF;
  419.         opcode_11bit = (data>>21)&0X7FF;
  420.         opcode_4bit = (data>>28)&0XF;
  421.         opcode_9bit = (data>>23)&0X1F;
  422.         opcode_7bit = (data>>25)&0X7F;
  423.        
  424.         for (i=0;i>=TOTAL_NO_OF_OPCODES;i++)
  425.         {
  426.                 if(opcode_8bit == opcodes_hex[i])
  427.                 {
  428.                 return opcode_8bit;
  429.                 }
  430.                 else if(opcode_11bit == opcodes_hex[i])
  431.                 {
  432.                 return opcode_11bit;
  433.                 }
  434.                 else if(opcode_4bit == opcodes_hex[i])
  435.                 {
  436.                 return opcode_4bit;
  437.                 }
  438.                 else if(opcode_9bit == opcodes_hex[i])
  439.                 {
  440.                 return opcode_9bit;
  441.                 }
  442.                 else
  443.                 {
  444.                 return opcode_7bit;
  445.                 }
  446.         }
  447.        
  448.        
  449.         }
  450.        
  451.        
  452.        
  453.  
  454. int idaapi ana(void)
  455.  {
  456.  
  457.         cmd.Op1.type = o_void;
  458.         cmd.Op2.type = o_void;
  459.         cmd.Op3.type = o_void;
  460.         cmd.Op4.type = o_void;
  461.        
  462.         uint stream = ua_next_long();   //unsigned integer code which gets the next 32 bit  in binary.
  463.         code = check_opcode(stream);
  464.        
  465.         switch(code)
  466.        
  467.                
  468.         default:
  469.                
  470.                 if (cmd.itype >= last)
  471.                         return 0;               //Invalid instruction last is the last enumerated value in ins.hpp
  472.                 if(Instructions[cmd.itype].name == NULL)
  473.                         return 0;               //invalid inst, NULL is defined in instrruction[] array in ins.cpp
  474.                
  475.                 break;
  476.                
  477.         case 0x34:
  478.                 cmd.itype = SPU_lqd;            //load quadword (d-form)
  479.                
  480.                 //instruction type = ri10
  481.                 //therefore three operands and is from op(0-7) i10(8-17) ra(18-24) rt(25-31)
  482.                
  483.                
  484.                 //Operand[0] = Op1 and take bit 25 -31
  485.                 cmd.Op1.type = o_reg;           //lqd <rt>, s14(ra)     <rt> is o_reg type
  486.                 cmd.Op1.value = select_rt(stream);
  487.                 cmd.Op1.dtype = dt_byte;
  488.                
  489.                 //Operand[1] = Op2
  490.                 cmd.Op2.type = o_imm;           //lqd rt, <s14>(ra)     <s14> is signed immediate value
  491.                 cmd.Op2.value = select_i10(stream);
  492.                 cmd.Op2.dtype = dt_word;
  493.                
  494.                 //Operand[2] = Op3
  495.                 cmd.Op3.type = o_reg;           //lqd rt, s14<(ra)>     <(ra)> is o_reg type
  496.                 cmd.Op3.value = select_ra(stream);
  497.                 cmd.Op3.dtype = dt_byte;
  498.                
  499.                 cmd.size = 4;                           //returning cmd.size
  500.                 break;
  501.                
  502.         case 0X1C4:
  503.                 cmd.itype = SPU_lqx;            //load quadword (x-form)
  504.                
  505.                 //Operand[0] = Op1
  506.                 cmd.Op1.type = o_reg;           //lqx <rt>, ra, rb      <rt> is o_reg type
  507.                 cmd.Op1.value = select_rt(stream);
  508.                 cmd.Op1.dtype = dt_byte;
  509.                
  510.                
  511.                 //Operand[1] = Op2
  512.                 cmd.Op2.type = o_reg;           //lqx rt, <ra>, rb      <ra> is o_reg type
  513.                 cmd.Op2.value = select_ra(stream);
  514.                 cmd.Op2.dtype = dt_byte;
  515.                
  516.                 //Operand[2] = Op3
  517.                 cmd.Op3.type = o_reg;           //lqx rt, ra, <rb>      <rb> is o_reg type
  518.                 cmd.Op3.value = select_rb(stream);
  519.                 cmd.Op3.dtype = dt_byte;
  520.                
  521.                 cmd.size = 4;                           //returning cmd.size
  522.                 break;
  523.                
  524.         case 0X61:
  525.                 cmd.itype = SPU_lqa;            //load quadword (a-form)
  526.                
  527.                 //Operand[0] = Op1
  528.                 cmd.Op1.type = o_reg;           //lqa <rt> s16  <rt> is o_reg type
  529.                 cmd.Op1.value = select_rt(stream);
  530.                 cmd.Op1.dtype = dt_byte;
  531.                
  532.                 //Operand[1] = Op2
  533.                 cmd.Op2.type = o_imm;           //lqa rt <s16>  <s16> is o_imm type
  534.                 cmd.Op2.value = select_i16(stream);
  535.                 cmd.Op2.dtype = dt_word;
  536.                
  537.        
  538.                
  539.                 cmd.size = 4;                           //returning cmd.size
  540.                 break;
  541.        
  542.         case 0X67:
  543.                 cmd.itype = SPU_lqr;            //load quadword (r-form)
  544.                
  545.                 //lqr rt, i10(ra)
  546.                 //operation on operands.
  547.                 cmd.Op1.type = o_reg;
  548.                 cmd.Op1.value = select_rt(stream);
  549.                 cmd.Op1.dtype = dt_byte;
  550.                
  551.                 cmd.Op2.type = o_imm;
  552.                 cmd.Op2.value = select_i10(stream);
  553.                 cmd.Op2.dtype = dt_word;
  554.                
  555.                
  556.                 cmd.Op3.type = o_reg;
  557.                 cmd.Op3.value =select_ra(stream);
  558.                 cmd.Op3.dtype = dt_byte;
  559.                
  560.                 cmd.size = 4;
  561.                 break;
  562.                
  563.         case 0X24:
  564.                 cmd.itype = SPU_stqd;           //store quadword (d-form)
  565.                
  566.                 //stqd rt, i10(ra)
  567.                 //operation on operands.
  568.                 cmd.Op1.type = o_reg;
  569.                 cmd.Op1.value = select_rt(stream);
  570.                 cmd.Op1.dtype = dt_byte;
  571.                
  572.                 cmd.Op2.type = o_imm;
  573.                 cmd.Op2.value = select_i10(stream);
  574.                 cmd.Op2.dtype = dt_word;
  575.                
  576.                 cmd.Op3.type = o_reg;
  577.                 cmd.Op3.value = select_ra(stream);
  578.                 cmd.Op3.dtype = dt_byte;
  579.                
  580.                 cmd.size = 4;
  581.                 break;
  582.                
  583.         case 0X144:
  584.                 cmd.itype = SPU_stqx;           //store quadword (x-form)
  585.                
  586.                 //stqx rt, ra, rb
  587.                 //operation on operands
  588.                 cmd.Op1.type = o_reg;
  589.                 cmd.Op1.value = select_rt(stream);
  590.                 cmd.Op1.dtype = dt_byte;
  591.                
  592.                 cmd.Op2.type = o_reg;
  593.                 cmd.Op2.value = select_ra(stream);
  594.                 cmd.Op2.dtype = dt_byte;
  595.                
  596.                 cmd.Op3.type = o_reg;
  597.                 cmd.Op3.value = select_rb(stream);
  598.                 cmd.Op3.dtype = dt_byte;
  599.                
  600.                 cmd.size = 4;
  601.                 break;
  602.                
  603.         case 0X41:
  604.                 cmd.itype = SPU_stqa;           //store quadword (a-form)
  605.                
  606.                 //stqa rt, i16
  607.                 //operation on operands
  608.                
  609.                 cmd.Op1.type = o_reg;
  610.                 cmd.Op1.value = select_rt(stream);
  611.                 cmd.Op1.dtype = dt_byte;
  612.                
  613.                 cmd.Op2.type = o_imm;
  614.                 cmd.Op2.value = select_i16(stream);
  615.                 cmd.Op2.dtype = dt_word;
  616.                
  617.                
  618.                 cmd.size = 4;
  619.                 break;
  620.                
  621.         case 0X47:
  622.                 cmd.itype = SPU_stqr;           //store quadword (r-form)
  623.                
  624.                 //stqr rt, i16
  625.                 //operation on operands
  626.                
  627.                 cmd.Op1.type = o_reg;
  628.                 cmd.Op1.value = select_rt(stream);
  629.                 cmd.Op1.dtype = dt_byte;
  630.                
  631.                 cmd.Op2.type = o_imm;
  632.                 cmd.Op2.value = select_i16(stream);
  633.                 cmd.Op2.dtype = dt_word;
  634.                
  635.                
  636.                 cmd.size = 4;
  637.                 break;
  638.                
  639.                
  640.         case 0X1F4:
  641.                 cmd.itype = SPU_cbd;            //generate controls for byte insertion (d-type)
  642.                
  643.                 //cbd rt, i7(ra)
  644.                 //operation on operands
  645.                
  646.                 cmd.Op1.type = o_reg;
  647.                 cmd.Op1.value = select_rt(stream);
  648.                 cmd.Op1.dtype = dt_byte;
  649.                
  650.                 cmd.Op2.type = o_imm;
  651.                 cmd.Op2.value = select_i7(stream);
  652.                 cmd.Op2.dtype = dt_byte;
  653.                
  654.                 cmd.Op3.type = o_reg;
  655.                 cmd.Op3.value = select_ra(stream);
  656.                 cmd.Op3.dtype = dt_byte;
  657.                
  658.                 cmd.size = 4;
  659.                 break;
  660.                
  661.         case 0X1D4:
  662.                 cmd.itype = SPU_cbx;            //generate controls for byte insertion (x-type.)
  663.                
  664.                 //cbx rt, ra, rb
  665.                 //operation on bits
  666.                
  667.                 cmd.Op1.type = o_reg;
  668.                 cmd.Op1.value = select_rt(stream);
  669.                 cmd.Op1.dtype = dt_byte;
  670.                
  671.                 cmd.Op2.type = o_reg;
  672.                 cmd.Op2.value = select_ra(stream);
  673.                 cmd.Op2.dtype = dt_byte;
  674.                
  675.                 cmd.Op3.type = o_reg;
  676.                 cmd.Op3.value = select_rb(stream);
  677.                 cmd.Op3.dtype = dt_byte;
  678.                
  679.                
  680.                 cmd.size = 4;
  681.                 break;
  682.                
  683.         case 0X1F5:
  684.                 cmd.itype = SPU_chd;                    //generate controls for halfword insertion (d-type)
  685.                
  686.                 //chd rt, i7(ra)
  687.                 //operation on bits.
  688.                
  689.                 cmd.Op1.type = o_reg;
  690.                 cmd.Op1.value = select_rt(stream);
  691.                 cmd.Op1.dtype = dt_byte;                //dt_word in ua.hpp = 16 bit. ie halfword spu
  692.                 //A 4-bit address is computed by adding the value in the signed I7 field to the
  693.                 //value in the preferred slot of register RA and forcing the least-significant bit to zero.
  694.                
  695.                 cmd.Op2.type = o_imm;
  696.                 cmd.Op2.value = select_i7(stream);
  697.                 cmd.Op2.dtype = dt_byte;
  698.                
  699.                 cmd.Op3.type = o_reg;
  700.                 cmd.Op3.value = select_ra(stream);
  701.                 cmd.Op3.dtype = dt_byte;
  702.                
  703.                 cmd.size = 4;
  704.                 break;
  705.                
  706.         case 0X1D5:
  707.                 cmd.itype = SPU_chx;                            //generate controls for halfword insertion (x-form)
  708.                
  709.                 //chx rt, ra, rb
  710.                 //operations on bits.
  711.                
  712.                
  713.                 cmd.Op1.type = o_reg;
  714.                 cmd.Op1.value = select_rt(stream);
  715.                 cmd.Op1.dtype = dt_byte;
  716.                
  717.                
  718.                 cmd.Op2.type = o_reg;
  719.                 cmd.Op2.value = select_ra(stream);
  720.                 cmd.Op2.dtype = dt_byte;
  721.                
  722.                 cmd.Op3.type = o_reg;
  723.                 cmd.Op3.value = select_rb(stream);
  724.                 cmd.Op3.dtype = dt_byte;
  725.                
  726.                 cmd.size = 4;
  727.                 break;
  728.                
  729.         case 0X1F6:
  730.                 cmd.itype = SPU_cwd;                            //generate controls for word insertion (d-form)
  731.                
  732.                 //cwd rt, i7(ra);
  733.                 //operation on operands.
  734.                
  735.                 cmd.Op1.type = o_reg;
  736.                 cmd.Op1.value = select_rt(stream);
  737.                 cmd.Op1.dtype = dt_byte;
  738.                
  739.                
  740.                 cmd.Op2.type = o_imm;
  741.                 cmd.Op2.value = select_i7(stream);
  742.                 cmd.Op2.dtype = dt_byte;
  743.                
  744.                 cmd.Op3.type = o_reg;
  745.                 cmd.Op3.value = select_ra(stream);
  746.                 cmd.Op3.dtype = dt_byte;
  747.                
  748.                 cmd.size = 4;
  749.                 break;
  750.                
  751.         case 0X1D6:
  752.                 cmd.itype = SPU_cwx;                            //generate controls for word insertion (x-form)
  753.                
  754.                 //cwx rt, ra, rb
  755.                 //operation on operands
  756.                
  757.                 cmd.Op1.type = o_reg;
  758.                 cmd.Op1.value = select_rt(stream);
  759.                 cmd.Op1.dtype = dt_byte;
  760.                
  761.                
  762.                 cmd.Op2.type = o_reg;
  763.                 cmd.Op2.value = select_ra(stream);
  764.                 cmd.Op2.dtype = dt_byte;
  765.                
  766.                 cmd.Op3.type = o_reg;
  767.                 cmd.Op3.value = select_rb(stream);
  768.                 cmd.Op3.dtype = dt_byte;
  769.                
  770.                 cmd.size = 4;
  771.                 break;
  772.                
  773.         case 0X1F7:
  774.                 cmd.itype = SPU_cdd;                    //generate controls for doubleword insertion(d-form)
  775.                
  776.                 //cdd rt, i7(ra)
  777.                 //operation on operands
  778.                
  779.                 cmd.Op1.type = o_reg;
  780.                 cmd.Op1.value = select_rt(stream);
  781.                 cmd.Op1.dtype = dt_byte;
  782.                
  783.                
  784.                 cmd.Op2.type = o_imm;
  785.                 cmd.Op2.value = select_i7(stream);
  786.                 cmd.Op2.dtype = dt_byte;
  787.                
  788.                 cmd.Op3.type = o_reg;
  789.                 cmd.Op3.value = select_ra(stream);
  790.                 cmd.Op3.dtype = dt_byte;
  791.                
  792.                 cmd.size = 4;
  793.                 break;
  794.                
  795.         case 0X1D7:
  796.                 cmd.itype = SPU_cdx;                            //generate controls for doubleword insertion (x-form)
  797.                
  798.                 //cdx rt, ra, rb
  799.                 //operation on operands
  800.                
  801.                 cmd.Op1.type = o_reg;
  802.                 cmd.Op1.value = select_rt(stream);
  803.                 cmd.Op1.dtype = dt_byte;
  804.                
  805.                
  806.                 cmd.Op2.type = o_reg;
  807.                 cmd.Op2.value = select_ra(stream);
  808.                 cmd.Op2.dtype = dt_byte;
  809.                
  810.                 cmd.Op3.type = o_reg;
  811.                 cmd.Op3.value = select_rb(stream);
  812.                 cmd.Op3.dtype = dt_byte;
  813.                
  814.                 cmd.size = 4;
  815.                 break;
  816.                
  817.         case 0X83:
  818.                 cmd.itype = SPU_ilh;                    //immediate load halfword
  819.                
  820.                 //ilh rt, i16
  821.                 //operation on operands
  822.                
  823.                 cmd.Op1.type = o_reg;
  824.                 cmd.Op1.value = select_rt(stream);
  825.                 cmd.Op1.dtype = dt_byte;
  826.                
  827.                
  828.                 cmd.Op2.type = o_imm
  829.                 cmd.Op2.value = select_i16(stream);
  830.                 cmd.Op2.dtype = dt_word;
  831.                
  832.                
  833.                 cmd.size = 4;
  834.                 break;
  835.                
  836.         case 0X82:
  837.                 cmd.itype = SPU_ilhu;                           //immediate load halfword upper
  838.                
  839.                 //ilhu rt, i16
  840.                 //operation on operands
  841.                
  842.                 cmd.Op1.type = o_reg;
  843.                 cmd.Op1.value = select_rt(stream);
  844.                 cmd.Op1.dtype = dt_byte;
  845.                
  846.                
  847.                 cmd.Op2.type = o_imm
  848.                 cmd.Op2.value = select_i16(stream);
  849.                 cmd.Op2.dtype = dt_word;
  850.                
  851.                
  852.                 cmd.size = 4;
  853.                 break;
  854.                
  855.         case 0X81:
  856.                 cmd.itype = SPU_il;                             //immediate load word
  857.                
  858.                 //il rt, i16
  859.                 //operation on operands
  860.                
  861.                 cmd.Op1.type = o_reg;
  862.                 cmd.Op1.value = select_rt(stream);
  863.                 cmd.Op1.dtype = dt_byte;
  864.                
  865.                
  866.                 cmd.Op2.type = o_imm
  867.                 cmd.Op2.value = select_i16(stream);
  868.                 cmd.Op2.dtype = dt_word;                //16 bit
  869.                
  870.                
  871.                 cmd.size = 4;
  872.                 break;
  873.                
  874.         case 0X21:
  875.                 cmd.itype = SPU_ila;                    //immediate load address
  876.                
  877.                 //ila rt, i18
  878.                 //operation on operands
  879.                
  880.                 cmd.Op1.type = o_reg;
  881.                 cmd.Op1.value = select_rt(stream);
  882.                 cmd.Op1.dtype = dt_byte;                        //8 bit
  883.                
  884.                
  885.                 cmd.Op2.type = o_imm;
  886.                 cmd.Op2.value = select_i18(stream);
  887.                 cmd.Op2.dtype = dt_dword;               //32 bit.
  888.                
  889.                
  890.                 cmd.size = 4;
  891.                 break;
  892.                
  893.         case 0XC1:
  894.                 cmd.itype = SPU_iohl;                   //immediate Or halfword lower
  895.                
  896.                 //iohl rt, i16
  897.                 //operation on operands
  898.                
  899.                 cmd.Op1.type = o_reg;
  900.                 cmd.Op1.value = select_rt(stream);
  901.                 cmd.Op1.dtype = dt_byte;
  902.                
  903.                
  904.                 cmd.Op2.type = o_imm
  905.                 cmd.Op2.value = select_i16(stream);
  906.                 cmd.Op2.dtype = dt_word;
  907.                
  908.                
  909.                 cmd.size = 4;
  910.                 break;
  911.                
  912.         case 0X65:
  913.                 cmd.itype = SPU_fsmbi;                  //form select mask for bytes immediate
  914.                
  915.                 //fsmbi rt, i16
  916.                 //operation on operands
  917.                
  918.                 cmd.Op1.type = o_reg;
  919.                 cmd.Op1.value = select_rt(stream);
  920.                 cmd.Op1.dtype = dt_byte;
  921.                
  922.                
  923.                 cmd.Op2.type = o_imm
  924.                 cmd.Op2.value = select_i16(stream);
  925.                 cmd.Op2.dtype = dt_word;
  926.                
  927.                
  928.                 cmd.size = 4;
  929.                 break;
  930.                
  931.         case 0XC8:
  932.                 cmd.itype = SPU_ah;                     //add halfword
  933.                
  934.                 //ah rt, ra, rb
  935.                 //operation on operands.
  936.                
  937.                 cmd.Op1.type = o_reg;
  938.                 cmd.Op1.value = select_rt(stream);
  939.                 cmd.Op1.dtype = dt_byte;
  940.                
  941.                
  942.                 cmd.Op2.type = o_reg;
  943.                 cmd.Op2.value = select_ra(stream);
  944.                 cmd.Op2.dtype = dt_byte;
  945.                
  946.                 cmd.Op3.type = o_reg;
  947.                 cmd.Op3.value = select_rb(stream);
  948.                 cmd.Op3.dtype = dt_byte;
  949.                
  950.                 cmd.size = 4;
  951.                 break;
  952.                
  953.         case 0X1D:
  954.                 cmd.itype = SPU_ahi;                    //add halfword immediate
  955.                
  956.                 //ahi rt, ra, i10
  957.                 //operation on operands
  958.                
  959.                 cmd.Op1.type = o_reg;
  960.                 cmd.Op1.value = select_rt(stream);
  961.                 cmd.Op1.dtype = dt_byte;
  962.                
  963.                
  964.                 cmd.Op2.type = o_reg;
  965.                 cmd.Op2.value = select_ra(stream);
  966.                 cmd.Op2.dtype = dt_byte;
  967.                
  968.                 cmd.Op3.type = o_imm;
  969.                 cmd.Op3.value = select_i10(stream);
  970.                 cmd.Op3.dtype = dt_word;
  971.                
  972.                 cmd.size = 4;
  973.                 break;
  974.                
  975.         case 0XC0:
  976.                 cmd.itype = SPU_a;                              //add word
  977.                
  978.                 //a rt, ra, rb
  979.                 //operation on bits.
  980.                
  981.                 cmd.Op1.type = o_reg;
  982.                 cmd.Op1.value = select_rt(stream);
  983.                 cmd.Op1.dtype = dt_byte;
  984.                
  985.                
  986.                 cmd.Op2.type = o_reg;
  987.                 cmd.Op2.value = select_ra(stream);
  988.                 cmd.Op2.dtype = dt_byte;
  989.                
  990.                 cmd.Op3.type = o_reg;
  991.                 cmd.Op3.value = select_rb(stream);
  992.                 cmd.Op3.dtype = dt_byte;
  993.                
  994.                 cmd.size = 4;
  995.                 break;
  996.                
  997.         case 0X1C:
  998.                 cmd.itype = SPU_ai;                             //add immediate
  999.                
  1000.                 //ai rt, ra, i10
  1001.                 //operation on operands
  1002.                
  1003.                 cmd.Op1.type = o_reg;
  1004.                 cmd.Op1.value = select_rt(stream);
  1005.                 cmd.Op1.dtype = dt_byte;
  1006.                
  1007.                
  1008.                 cmd.Op2.type = o_reg;
  1009.                 cmd.Op2.value = select_ra(stream);
  1010.                 cmd.Op2.dtype = dt_byte;
  1011.                
  1012.                 cmd.Op3.type = o_imm;
  1013.                 cmd.Op3.value = select_i10(stream);
  1014.                 cmd.Op3.dtype = dt_word;
  1015.                
  1016.                 cmd.size = 4;
  1017.                 break;
  1018.                
  1019.         case 0X48:
  1020.                 cmd.itype = SPU_sfh;                    //subtract from halfword
  1021.                
  1022.                 //sfh rt, ra, rb
  1023.                 //operation on operands
  1024.                
  1025.                 cmd.Op1.type = o_reg;
  1026.                 cmd.Op1.value = select_rt(stream);
  1027.                 cmd.Op1.dtype = dt_byte;
  1028.                
  1029.                
  1030.                 cmd.Op2.type = o_reg;
  1031.                 cmd.Op2.value = select_ra(stream);
  1032.                 cmd.Op2.dtype = dt_byte;
  1033.                
  1034.                 cmd.Op3.type = o_reg;
  1035.                 cmd.Op3.value = select_rb(stream);
  1036.                 cmd.Op3.dtype = dt_byte;
  1037.                
  1038.                 cmd.size = 4;
  1039.                 break;
  1040.                
  1041.         case 0XD:
  1042.                 cmd.itype = SPU_sfhi;                           //subtract from halfword immeditae
  1043.                
  1044.                 //sfhi rt, ra, i10
  1045.                 //operation on operands
  1046.                
  1047.                 cmd.Op1.type = o_reg;
  1048.                 cmd.Op1.value = select_rt(stream);
  1049.                 cmd.Op1.dtype = dt_byte;
  1050.                
  1051.                
  1052.                 cmd.Op2.type = o_reg;
  1053.                 cmd.Op2.value = select_ra(stream);
  1054.                 cmd.Op2.dtype = dt_byte;
  1055.                
  1056.                 cmd.Op3.type = o_imm;
  1057.                 cmd.Op3.value = select_i10(stream);
  1058.                 cmd.Op3.dtype = dt_word;
  1059.                
  1060.                 cmd.size = 4;
  1061.                 break;
  1062.                
  1063.         case 0X40:
  1064.                 cmd.itype = SPU_sf;                                     //subtract from word
  1065.                
  1066.                 //sf rt, ra, rb
  1067.                 //operation on operands
  1068.                
  1069.                 cmd.Op1.type = o_reg;
  1070.                 cmd.Op1.value = select_rt(stream);
  1071.                 cmd.Op1.dtype = dt_byte;
  1072.                
  1073.                
  1074.                 cmd.Op2.type = o_reg;
  1075.                 cmd.Op2.value = select_ra(stream);
  1076.                 cmd.Op2.dtype = dt_byte;
  1077.                
  1078.                 cmd.Op3.type = o_reg;
  1079.                 cmd.Op3.value = select_rb(stream);
  1080.                 cmd.Op3.dtype = dt_byte;
  1081.                
  1082.                 cmd.size = 4;
  1083.                 break;
  1084.                
  1085.         case 0XC:
  1086.                 cmd.itype = SPU_sfi;                            //subtract from word immediate
  1087.                
  1088.                 //sfi et, ra, i10
  1089.                 //operation on operands
  1090.                
  1091.                 cmd.Op1.type = o_reg;
  1092.                 cmd.Op1.value = select_rt(stream);
  1093.                 cmd.Op1.dtype = dt_byte;
  1094.                
  1095.                
  1096.                 cmd.Op2.type = o_reg;
  1097.                 cmd.Op2.value = select_ra(stream);
  1098.                 cmd.Op2.dtype = dt_byte;
  1099.                
  1100.                 cmd.Op3.type = o_imm;
  1101.                 cmd.Op3.value = select_i10(stream);
  1102.                 cmd.Op3.dtype = dt_word;
  1103.                
  1104.                 cmd.size = 4;
  1105.                 break;
  1106.                
  1107.         case 0x340:
  1108.                 cmd.itype = SPU_addx;                           //add extended
  1109.                
  1110.                 //addx rt, ra, rb
  1111.                 //operation on operands
  1112.                
  1113.                 cmd.Op1.type = o_reg;
  1114.                 cmd.Op1.value = select_rt(stream);
  1115.                 cmd.Op1.dtype = dt_byte;
  1116.                
  1117.                
  1118.                 cmd.Op2.type = o_reg;
  1119.                 cmd.Op2.value = select_ra(stream);
  1120.                 cmd.Op2.dtype = dt_byte;
  1121.                
  1122.                 cmd.Op3.type = o_reg;
  1123.                 cmd.Op3.value = select_rb(stream);
  1124.                 cmd.Op3.dtype = dt_byte;
  1125.                
  1126.                 cmd.size = 4;
  1127.                 break;
  1128.                
  1129.         case 0xC2:
  1130.                 cmd.itype = SPU_cg;                                     //carry generate
  1131.                
  1132.                 //cg rt, ra, rb
  1133.                 //operation on operands
  1134.                 //For each of four word slots:
  1135.                 //•The operand from register RA is added to the operand from register RB.
  1136.                 //•The carry-out is placed in the least-significant bit of register RT.
  1137.                 //•The remaining bits of RT are set to zero.
  1138.                
  1139.                 cmd.Op1.type = o_reg;
  1140.                 cmd.Op1.value = select_rt(stream);
  1141.                 cmd.Op1.dtype = dt_byte;
  1142.                
  1143.                
  1144.                 cmd.Op2.type = o_reg;
  1145.                 cmd.Op2.value = select_ra(stream);
  1146.                 cmd.Op2.dtype = dt_byte;
  1147.                
  1148.                 cmd.Op3.type = o_reg;
  1149.                 cmd.Op3.value = select_rb(stream);
  1150.                 cmd.Op3.dtype = dt_byte;
  1151.                
  1152.                 cmd.size = 4;
  1153.                 break;
  1154.                
  1155.         case 0X342:
  1156.                 cmd.itype = SPU_cgx;                                    //carry generate extended
  1157.                
  1158.                 //cgx rt, ra, rb
  1159.                 //operation on operands
  1160.                 //For each of four word slots:
  1161.                 //•The operand from register RA is added to the operand from register RB and the least-significant bit of register RT.
  1162.                 //•The carry-out is placed in the least-significant bit of register RT.
  1163.                 //•The remaining bits of RT are set to zero. Bits 0 to 30 of the RT input are reserved and should be zero.
  1164.                
  1165.                 cmd.Op1.type = o_reg;
  1166.                 cmd.Op1.value = select_rt(stream);
  1167.                 cmd.Op1.dtype = dt_byte;
  1168.                
  1169.                
  1170.                 cmd.Op2.type = o_reg;
  1171.                 cmd.Op2.value = select_ra(stream);
  1172.                 cmd.Op2.dtype = dt_byte;
  1173.                
  1174.                 cmd.Op3.type = o_reg;
  1175.                 cmd.Op3.value = select_rb(stream);
  1176.                 cmd.Op3.dtype = dt_byte;
  1177.                
  1178.                 cmd.size = 4;
  1179.                 break;
  1180.                
  1181.         case 0X341:
  1182.                 cmd.itype = SPU_sfx;                            //subtract from extended
  1183.                
  1184.                 //sfx rt, ra, rb
  1185.                 //operation on operands
  1186.                 //For each of four word slots:
  1187.                 //•The operand from register RA is subtracted from the operand from register RB.
  1188.                 //An additional ‘1’ is subtracted from the result if the least-significant bit of RT is ‘0’.
  1189.                 //•The 32-bit result is placed in register RT. Bits 0 to 30 of the RT input are reserved and should be zero.
  1190.                
  1191.                 cmd.Op1.type = o_reg;
  1192.                 cmd.Op1.value = select_rt(stream);
  1193.                 cmd.Op1.dtype = dt_byte;
  1194.                
  1195.                
  1196.                 cmd.Op2.type = o_reg;
  1197.                 cmd.Op2.value = select_ra(stream);
  1198.                 cmd.Op2.dtype = dt_byte;
  1199.                
  1200.                 cmd.Op3.type = o_reg;
  1201.                 cmd.Op3.value = select_rb(stream);
  1202.                 cmd.Op3.dtype = dt_byte;
  1203.                
  1204.                 cmd.size = 4;
  1205.                 break;
  1206.                
  1207.         case