1 #ifndef AVR_DECODERHELP_H
2 #define AVR_DECODERHELP_H
6 enum decoder_operand_masks
{
7 /** 2 bit register id ( R24, R26, R28, R30 ) */
9 /** 3 bit register id ( R16 - R23 ) */
11 /** 4 bit register id ( R16 - R31 ) */
13 /** 5 bit register id ( R00 - R31 ) */
16 /** 3 bit register id ( R16 - R23 ) */
18 /** 4 bit register id ( R16 - R31 ) */
20 /** 5 bit register id ( R00 - R31 ) */
23 /** for 8 bit constant */
25 /** for 6 bit constant */
28 /** for 7 bit relative address */
30 /** for 12 bit relative address */
32 /** for 22 bit absolute address */
35 /** register bit select */
36 mask_reg_bit
= 0x0007,
37 /** status register bit select */
38 mask_sreg_bit
= 0x0070,
39 /** address displacement (q) */
40 mask_q_displ
= 0x2C07,
42 /** 5 bit register id ( R00 - R31 ) */
44 /** 6 bit IO port id */
48 inline int get_rd_2( word opcode
) {
49 int reg
= ((opcode
& mask_Rd_2
) >> 4) & 0x3;
50 return (reg
* 2) + 24;
53 inline int get_rd_3( word opcode
) {
54 int reg
= opcode
& mask_Rd_3
;
55 return ((reg
>> 4) & 0x7) + 16;
58 inline int get_rd_4( word opcode
) {
59 int reg
= opcode
& mask_Rd_4
;
60 return ((reg
>> 4) & 0xf) + 16;
63 inline int get_rd_5( word opcode
) {
64 int reg
= opcode
& mask_Rd_5
;
65 return ((reg
>> 4) & 0x1f);
68 inline int get_rr_3( word opcode
) {
69 return (opcode
& mask_Rr_3
) + 16;
72 inline int get_rr_4( word opcode
) {
73 return (opcode
& mask_Rr_4
) + 16;
76 inline int get_rr_5( word opcode
) {
77 int reg
= opcode
& mask_Rr_5
;
78 return (reg
& 0xf) + ((reg
>> 5) & 0x10);
81 inline byte
get_K_8( word opcode
) {
82 int K
= opcode
& mask_K_8
;
83 return ((K
>> 4) & 0xf0) + (K
& 0xf);
86 inline byte
get_K_6( word opcode
) {
87 int K
= opcode
& mask_K_6
;
88 return ((K
>> 2) & 0x0030) + (K
& 0xf);
91 inline int get_k_7( word opcode
) {
92 return (((opcode
& mask_k_7
) >> 3) & 0x7f);
95 inline int get_k_12( word opcode
) {
96 return (opcode
& mask_k_12
);
99 inline int get_k_22( word opcode
) {
100 /* Masks only the upper 6 bits of the address, the other 16 bits
102 int k
= opcode
& mask_k_22
;
103 return ((k
>> 3) & 0x003e) + (k
& 0x1);
106 inline int get_reg_bit( word opcode
) {
107 return opcode
& mask_reg_bit
;
110 inline int get_sreg_bit( word opcode
) {
111 return (opcode
& mask_sreg_bit
) >> 4;
114 inline int get_q( word opcode
) {
115 /* 00q0 qq00 0000 0qqq : Yuck! */
116 int q
= opcode
& mask_q_displ
;
117 int qq
= ( ((q
>> 1) & 0x1000) + (q
& 0x0c00) ) >> 7;
118 return (qq
& 0x0038) + (q
& 0x7);
121 inline int get_A_5( word opcode
) {
122 return (opcode
& mask_A_5
) >> 3;
125 inline int get_A_6( word opcode
) {
126 int A
= opcode
& mask_A_6
;
127 return ((A
>> 5) & 0x0030) + (A
& 0xf);
132 #endif /*AVR_DECODERHELP_H*/